# Drukowanie w Linux-ie

## Autor: Grant Taylor, gtaylor+pht@picante.com
v3.14, 23 Września 1997
Wersja polska: Bartosz Maruszewski B.Maruszewski@jtz.org.pl
v1.3, 12 Lutego 1998

Jest to dokument zawierający informacje na takie tematy jak: generowanie wydruku, podglądnięcie go przed drukowaniem, wydrukowanie go oraz przefaxowanie czegoś pod Linux-em (i innymi Unix-ami w ogólności). Dokument ten został napisany w standardzie ISO-8859-2. Oryginał można znaleźć pod adresem ftp.icm.edu.pl w katalogu /pub/Linux/sunsite/docs/HOWTO.

## 1. Wprowadzenie.

Printing HOWTO powinno zawierać wszystko co powinieneś wiedzieć, aby ustawić drukarkę na swoim Linux-ie. Jest to trochę bardziej skomplikowane niż w świecie pokaż-i-kliknij Microsoft-u i Apple'a, ale za to bardziej elastyczne i z pewnością prostsze jeśli chodzi o administrowanie w dużych sieciach lokalnych.

Dokument ten jest tak ułożony, że większość będzie musiała przeczytać tylko pierwszą połowę czy coś koło tego. Większość nieciekawych informacji i takich, które są zależne od sytuacji znajduje się w drugiej połowie i łatwo je znaleźć w spisie treści, podczas gdy informacje zawarte w sekcjach 9 i 10 będą potrzebne większości.

Większość informacji z poprzedniej wersji zostało usuniętych, ponieważ zdecydowałem się na napisanie tego dokumentu całkowicie od nowa. Zrobiłem tak, bo poprzednie wersje były takie wielkie - około 60 stron A4, i narracja była do kitu. Jeśli nie znalazłeś tutaj odpowiedzi to powinieneś a) przeszukać poprzednią wersję na stronie domowej tego HOWTO, b) podrzucić mi informację co powinno tu być, a nie ma tego.

Strona domowa tego HOWTO jest dobrym miejscem na szukanie nowszych wersji tego dokumentu; jest ona oczywiście także dystrybuowana przez Projekt Dokumentacji Linux-a; archiwum zawierające dokumenty HOWTO możesz znaleźć w Polsce pod adresem ftp.icm.edu.pl w katalogu `/pub/Linux/sunsite/docs/HOWTO`.

## 1.1 Historia

To jest trzecia generacja, a szczerze mówiąc, to trzecia edycja zrobiona od nowa, dokumentu Printing-HOWTO. Historia PHT może w ujęciu chronologicznym wyglądać tak:

1. Napisałem Printing-HOWTO w 1992 w odpowiedzi na wiele pytań pojawiających się na grupie comp.os.linux dotyczących drukowania napisałem PHT i wysłałem go tam. Dokument ten wyprzedził Projekt Dokumentacji Linux-a o kilka miesięcy i był pierwszym dokumentem a'la FAQ zwanym HOWTO. Edycja ta była w czystym ASCII.
2. Po dołączeniu do PDL, PHT zostało wcielone do tegoż projektu przez Briana McCauley <B.A.McCauley@bham.ac.uk>; przez kolejne dwa lata współtworzyliśmy PHT. Po jakimś czasie dołączyliśmy pracę Karla Auera<Karl.Auer@anu.edu.au>. Ta generacja PHT była w TeXinfo oraz także w PS, HTML, ASCII i Info.
3. Po tym jak pozwoliliśmy PHT żeby trochę "podgniło" przez rok i po nieskutecznych poszukiwaniach jakiejś osoby, która zajęłaby się PHT, miało miejsce powstanie tej wersji. Ta generacja PHT jest w Linuxdoc-SGML.

## 1.2 Prawa autorskie.

Prawa autorskie należą do Granta Taylora (c) 1997. Proszę kopiować i dystrybuować ten dokument do woli, ale nie modyfikoewać ani nie zapomnieć mojego nazwiska.

## 2. Jak drukować.

Jeśli masz już zainstalowany program lpd i jest on ustawiony dla twojej drukarki przez kogokolwiek, to wszystko czego potrzebujesz, to nauczyć się posługiwać poleceniem lpr. Dokument Printing-Usage-HOWTO zawiera opis tego polecenia i kilku innych używanych do manipulowania kolejką wydruku.

Jednak jeśli masz nowy system albo nową drukarkę, to będziesz musiał ustawić serwis drukowania w ten lub inny sposób zanim będziesz mógł drukować. Czytaj dalej!

## 3. Urządzenia dotyczące drukarki w jądrze.

## 3.1 Urządzenie lp.

Jądro Linux-a (<=2.1.32), zakładając, że wkompilowałeś lub załadowałeś urządzenie lp (polecenie `cat /proc/devices` powinno pokazać urządzenie lp), dostarcza jedno lub więcej urządzeń /dev/lp0, /dev/lp1 i /dev/lp2. Nie są one kojarzone dynamicznie, ale są one na stałe przypisane konkretnym adresom I/O. Oznacza to, że twoja pierwsza drukarka może być na lp0, albo lp1 w zależności od sprzętu. Spróbuj obu. ;)

Kilku użytkowników zgłosiło, że ich dwukierunkowe porty lp nie zostają wykryte jeśli używają starszego, jednokierunkowego kabla. Sprawdź czy masz przyzwoity kabel.

Na danym porcie nie można mieć na raz sterowników plip oraz lp. Ale można załadować jeden albo drugi sterownik w każdej chwili; ręcznie albo przez kerneld przy jądrze w wersji 2.x.x (lub późniejsze 1.3.x). Jeśli dokładnie ustawisz przerwania itp., to możesz przypuszczalnie mieć plip na jednym porcie, a lp na drugim. Jedna osoba zrobiła tak, przez edycję sterowników; z niecierpliwością oczekuję osoby, która zrobiłaby to tylko przy użyciu argumentów z linii poleceń.

Jest takie narzędzie zwane tunelp, przy pomocy którego "root" może ustawiać przerwania i inne opcje na urządzeniu lp.

Jeśli urządzenie lp jest wbudowane w jądro w wersji 1.3.x lub wyższej, to możesz przekazać parametr `lp=` do jądra, w którym możesz ustawić przerwanie, adres itp.

    Jeśli sterownik lp jest wbudowany w jądro, to możesz użyć parametru
    LILO/LOADLIN, aby ustawić adres portu i przerwanie, których sterownik
    będzie używał.

    Składnia:        lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]]

    Na przykład:     lp=0x378,0   lub   lp=0x278,5,0x378,7 **

    Zauważ, że jeśli używasz tego parametru, to musisz podać *wszystkie*
    porty, których będziesz używać - nie ma wartości domyślnych. Możesz
    wyłączyć wbudowany sterownik parametrem lp=0.

Jeśli ładujesz sterownik drukarki jako moduł w wersji jądra 2.x.x lub późnej 1.3.x, to możesz podać przerwanie i port jako parametr w linii poleceń przy insmod (albo w pliku `/etc/conf.modules`, żeby działało także dla kerneld). Parametry to: io=port0,port1,port2 i irq=irq0,irq1,irq2. Więcej informacji znajdziesz w podręczniku systemowym man na stronie dotyczącej insmod.

**Dla tych, którzy (jak ja) nigdy nie mogą znaleźć standardowego portu kiedy go potrzeba, to są one takie jak w podanym wyżej drugim przykładzie. Drugi port (lp0) jest pod adresem 0x3bc. Nie mam pojęcia jakiego przerwania zwykle używa.

Kod źródłowy linux-owego sterownika portu równoległego jest w pliku /usr/src/linux/drivers/char/lp.c

## 3.2 Urządzenie parport (jądra >= 2.1.33)

Począwszy od jądra w wersji 2.1.33 (dostępne także jako łata dla jądra 2.0.30), urządzenie lp jest po prostu klientem nowego urządzenia parport. Dodanie urządzenia parport naprawia pewną ilość błędów, które dręczyły poprzedni sterownik urządzenia lp - może ono wpółdzielić port z innym urządzeniem, przypisuje dynamicznie dostępne porty równoległe numerom urządzeń zamiast wymuszać z góry narzuconą komunikację pomiędzy adresami I/O a numerami portów i tak dalej.

Więcej szczegółów na temat parport podam kiedy sam znajdę się w sytuacji kiedy będę tego używał. A w międzyczasie możesz przeczytać plik Documentation/parport.txt w drzewie ze źródłami jądra albo zajrzyj na stronę parport.

## 3.3 Urządzenia szeregowe.

Urządzenia szeregowe pod Linux-em zwykle nazywają się `/dev/ttyS1` lub podobnie. Narzędzie stty pozwala na interaktywne przeglądanie lub określanie ustawień dla portu szeregowego; setserial pozwoli ci na kontrolowanie kilku rozszerzonych właściwości oraz na skonfigurowanie IRQ i adresów I/O dla niestandardowych portów. Więcej na temat portów szeregowych znajdziesz w Serial-HOWTO dostępnym także w języku polskim.

Jeśli używasz wolnej drukarki szeregowej z kontrolą przepływu (flow control), może się okazać, że niektóre z twoich wydruków są obcinane. Może być to spowodowane zachowaniem portu szeregowego, który wyrzuca wszystkie znaki ze swojego bufora po 30 sekundach od momentu zamknięcia portu. W buforze może się znajdować do 4096 znaków a jeśli twoja drukarka używa kontroli przepływu i jest wystarczająco wolna, tak że nie może przyjąć wszystkich 4096 znaków z portu w ciągu 30 sekund, po tym jak oprogramowanie drukujące zakmnęło port, to końcowa zawartość bufora zostanie utracona. Jeśli w wyniku polecenia cat plik > /dev/ttyS2 pojawia się cały wydruk dla krótkich plików, a dłuższe są obcinane, to to może być twój problem.

Okres 30 sekund może zostać zmieniony poprzez opcję "closing_wait" programu setserial (wersja 2.12 i późniejsze). Porty szeregowe maszyny są z reguły inicjowane poprzez odwołanie do setserial w pliku startowym rc.serial. Odwołanie do portu szeregowego drukarki może być zmodyfikowane, tak aby ustawić closing_wait w tym samym czasie kiedy ustawia inne parametry tego portu.

## 4. Obsługiwane drukarki.

Jądro Linux-a obsługuje raczej każdą drukarkę, którą możesz podłączyć do szeregowego albo równoległego portu, ale są rzeczy na które trzeba spojrzeć oraz drukarki których nie będziesz w stanie użyć nawet pomimo, że (elektrycznie mówiąc) mogą one komunikować się z Linux-em. W grupie tych niekompatybilnych drukarek przeważają te, które polegają na "Windows Printing System". (Często są one oznaczone "for Windows".) Te drukarki nie współpracują z Linux-em. Nie mają żadnych inteligentnych części i polegają na procesorze komputera, który musi zrobić większość tego co kiedyś robiły procesory w drukarce. Niestety te zadania mogą być wykonane tylko przez sterowniki dostarczone przez producenta, które działają tylko pod Windows. Więc nie kupuj takiej drukarki do Linux-a.

Jeśli chodzi o drukarki, które działają z Linux-em, to najlepszym wyborem jest kupienie drukarki z interpreterem PostScript-u. Prawie każde oprogramowanie pod Unix-a, które tworzy jakiś drukowalny wynik tworzy go w PostScripcie, więc oczywistym jest, że najlepiej kupić drukarkę obsługującą PostScript. Niestety, ale obsługa tego języka poza drukarkami laserowymi jest bardzo rzadko spotykana.

Jeśli nie uda ci się wydobyć (raczej większego) budżetu potrzebnego na kupno drukarki PostScript-owej, możesz użyć jakiejkolwiek drukarki obsługiwanej przez Ghostcript, darmowy interpreter PostScript-u używanego do druku PostScript-owego. Na domowej stronie Ghostscript-u znajdziesz obsługiwane drukarki i informacje na temat nowych i ekpserymentalnych sterowników. Pomóż proszę w ulepszaniu Ghostscript-u poprzez zgłaszanie sukcesów bądź porażek jak o to proszą.

## 5. Jakie oprogramowanie do kolejkowania ?

Do niedawna wybór dla użytkowników Linux-a był prosty - wszyscy używali tego samego, starego lpd wziętego bezpośrdnio z kodu Net-2 BSD. Nawet dzisiaj większość sprzedawców dostarcza ten właśnie program. Ale to się zaczyna zmieniać. Systemy SVR4 włączając w to Solaris Sun-a dostarczają całkiem inny pakiet do kolejkowania oparty na lpsched. Pojawiają się także oznaki, iż niektórzy sprzedawcy Linux-a przejdą na dostarczanie LPRng, o wiele mniej zabytkowej implementacji, która jest dostępna za darmo. LPRng jest o wiele prostszy w administrowaniu dla większych instalacji i ma o wiele przyjaźniejszą bazę danych aniżeli lpd.

Na dzień dzisiejszym nawet w świetle nowych opcji, lpd jest przypuszczalnie dobry dla większości użytkowników Linux-a. Raz ustawiony działa dobrze i jest łatwy w zrozumieniu oraz szeroko udokumentowany w książkach o Unix-ie.

Jeśli chcesz więcej informacji na temat LPRng to zobacz LPRng - An Enhanced Printer Spooler. Przyszłe wersje tego dokumentu będą zawierały informacje o zwykłym lpd oraz o LPRng.

## 6. Jak to działa - podstawy.

Żeby drukowanie działało, musisz zrozumieć jak działa system lpd.

LPD to skrót od Line Printer Daemon i odnosi się w różnych kontekstach do demona i do całej kolekcji programów, które drukują. Są to:

`lpd`

  Demon kolejkowania. Jeden z nich jest uruchomiony, aby kontrolować wszystko na maszynie, I jeden jest uruchamiany dla drukarki podczas drukowania.

`lpr`

  Polecenie dla użytkowników do kolejkowania wydruków. Lpr kontaktuje się z lpd i umieszcza nowe zadanie w katalogu kolejkowania.

`lpq`

  Wyświetla wydruki umieszczone w kolejce.

`lpc`

  Polecenie do kontrolowania systemu lpd. Poleceniem tym możesz wystartować, zatrzymać, zmienić porządek w kolejce drukowania.

`lprm`

  Usuwa wydruk z kolejki.

To jak to wszystko działa ? No... kiedy system startuje, uruchamiany jest lpd. Czyta on plik `/etc/printcap`, aby się dowiedzieć dla jakich drukarek będzie obsługiwał kolejki. Za każdym razem kiedy ktoś uruchomi lpr, lpr kontaktuje się z lpd poprzez gniazdko `/dev/printer` i podaje mu wydruk oraz kilka informacji o tym kto drukuje i jak ma to być wydrukowane. Potem lpd drukuje otrzymany plik na odpowiedniej drukarce.

System lp powstał w czasach kiedy większość drukarek była drukarkami liniowymi - tzn. ludzie drukowali w większośći teksty w ASCII. Jak się okazało, nie trzeba dużo pracy, aby lpd działał dobrze dla dzisiejszych wydruków takich jak PostScript, czy text, czy dvi, czy ...

## 7. Jak poustawiać to wszystko - podstawy.

## 7.1 Tradycyjna konfiguracja lpd.

Minimalne ustawienia objawiają się tym, że system może kolejkować pliki i je drukować. Nie będzie zwracał uwagi na to, czy twoja drukarka je zrozumie czy nie i przypuszczalnie nie pozwoli ci na zrobienie atrakcyjnego wydruku. Jednak jest to pierwszy krok do zrozumienia, więc czytaj dalej !

Ogólnie mówiąc, żeby dodać kolejkę dla drukarki musisz dodać pozycję do `/etc/printcap` i utworzyć katalog do kolejkowania w `/var/spool/lpd/`.

Pojedyncza pozycja w `/etc/printcap` wygląda tak:

    # LOCAL djet500
    lp|dj|deskjet:\
            :sd=/var/spool/lpd/dj:\
            :mx#0:\
            :lp=/dev/lp0:\
            :sh:

Definiuje ona drukarkę o nazwach lp, dj i deskjet, z katalogiem kolejkowania `/var/spool/lpd/dj/`, bez limitu na każdy wydruk, która drukuje na urządzeniu `/dev/lp0` i która nie ma strony tytułowej (z danymi o osobie, która drukowała itp.) na początku wydruku.

Teraz poczytaj stronę w podręczniku systemowym na temat printcap.

Powyższy przykład wygląda bardzo prosto, ale jest tam jeden kruczek - drukarka będzie tak długo dobrze drukowała, dopóki będę wysyłał pliki, które ona rozumie. Na przykład wysłanie na drukarkę zwykłego unix-owego pliku tekstowego spowoduje, że na papierze pojawi się coś takiego:

    To jest pierwsza linia.
                           To jest druga linia.
                                               To jest trzecia linia.

Wysłanie na tę drukarkę pliku w PostScripcie spowodowałoby wydrukowanie pięknej listy poleceń PostScript z dodatkowym efektem schodków :) - beż żadnego pożytecznego efektu.

Wynika z tego jasno, że czegoś tu jeszcze brakuje - i to jest właśnie celem filtrowania. Ci, którzy czytali stronę podręcznika systemowego o pliku "printcap" mogli zuważyć atrybuty kolejki - if i of. if - czyli input filter - to właśnie to czego potrzebujemy.

Jeśli napiszemy krótki skrypt o nazwie "filter", który doda przed końcem linii znak CR (cariage return - powrót karetki), to efekt schodów może być wyeliminowany. Tak więc musimy dodać do naszej pozycji w `/etc/printcap` jeszcze jedną linię informującą o istniejącym filtrze:

    lp|dj|deskjet:\
            :sd=/var/spool/lpd/dj:\
            :mx#0:\
            :lp=/dev/lp0:\
            :if=/var/spool/lpd/dj/filter:\
            :sh:

Przykładem prostego skryptu może być:

    #!perl
    # Powyższa linia tak na prawdę powinna zawierać pełną ścieżkę do perl-a
    # Skrypt ten musi być wykonywalny: chmod 755 filter
    while(<STDIN>){chop $_; print "$_\r\n";};
    # Możesz też zakończyć znacznikiem "form feed": print "\f";

Jeśli zrobimy powyższe, to otrzymamy drukarkę, na którą będziemy mogli wysyłać pliki tekstowe z Unix-a i otrzymamy sensowny wydruk. (Tak, są 4 miliony lepszych sposobów na napisanie tego skryptu, ale tylko kilka jest tak bardzo ilustracyjnych. Ty masz to napisać bardziej wydajnie.)

Jedynym problemem jest to, że drukowanie plików tekstowych nie jest takie znowu fajne - byłoby o wiele lepiej, jeśli moglibysmy drukować pliki PostScriptowe czy graficzne. No... tak, byłoby i jest to łatwe do zrobienia. Metoda jest rozszerzeniem tego co zrobiliśmy, żeby się pozbyć schodków. Jeśli napiszesz program, który może przyjmować różne formaty i tłumaczyć je na język zrozumiały dla drukarki, to masz naprawdę dobry filtr.

Taki filtr nazywany jest filtrem magicznym. Nie męcz się nad pisaniem własnego - o ile nie drukujesz jakichs cudów - na sieci jest już pełno filtrów, które możesz śmiało używać.

## 7.2 Prawa dostępu do plików.

Ponieważ otrzymałem wiele próśb, załączam listę plików wraz z prawami dostępu jakie mają one w moim systemie. Jest wiele lepszych sposobów na zrobienie tego - idealnym sposobem jest używanie programów tylko z atrybutami SGID, a nie robienie wszystkiego SUID dla "root-a", ale mój system tak już miał i dla mnie to działa.

    -r-sr-sr-x   1 root     lp    /usr/bin/lpr*
    -r-sr-sr-x   1 root     lp    /usr/bin/lprm*
    -rwxr--r--   1 root     root  /usr/sbin/lpd*
    -r-xr-sr-x   1 root     lp    /usr/sbin/lpc*
    drwxrwxr-x   4 root     lp    /var/spool/lpd/
    drwxr-xr-x   2 root     lp    /var/spool/lpd/lp/

W chwili obecnej lpd musi być uruchamiany z prawami "root-a", ponieważ używa on numerów portów zastrzeżonych dla systemu (poniżej 1024). Po tym jak już się podczepi pod ten port powinien się zmienić na lp.lp, ale raczej tego nie robi...

## 8. Zdobywanie oprogramowania do drukowania.

Wiele napisanych pakietów filtrujących (i innych programów związanych z drukowaniem) dostępnych jest na SunSite Polska. Można tam znaleźć takie programy jak: psutils, a2ps, mpage, dvitodvi, flpr.

## 8.1 Magicfilter.

"Magic filter" jest jednym z najlepszych pakietów filtrujących; zaprojektowany jest do instalacji w 10 minut. Powiedziano mi też, że zawiera specjalną obsługę LPRng.

    Title:          magicfilter
    Version:        1.1b
    Entered-date:   04APR95
    Description:    A customizable, extensible automatic printer filter.
                    Lets you automatically detect and print just about any
                    data type you can find a conversion utility for.  This
                    filter is written in C and is controlled completely
                    from an external printer configuration file.
                    This version adds automagic creation of configuration
                    files based on the installed software on your system,
                    courtesy of GNU Autoconf.
                    This version is a bug fix from 1.1/1.1a; filters for
                    non-ASCII capable PostScript printers have been added.
    Author:         H. Peter Anvin <hpa@zytor.com>
    Primary-site:   sunsite.unc.edu
                    53000 /pub/Linux/system/printing/magicfilter-1.1b.tar.gz
    Copying-policy: GPL

## 8.2 Filtr APS.

Innym z wielu magicznych filtrów jest APS zrobiony przez Andreasa Klemma. Linux Software Map wygląda tak:

    Begin3
    Title:          apsfilter
    Version:        4.9.1
    Entered-date:   Montag, 10. Juli 1995, 21:22:35 Uhr MET DST
    Description:    magicfilter for lpd with auto filetype detection
    Keywords:       lpd magicfilter aps apsfilter
    Original-site:  ftp-i2.informatik.rwth-aachen.de
                    /pub/Linux/pak/APSfilter/aps-491.tgz
                    211KB aps-491.tgz
    Platforms:      C-Compiler, gs Postscript emulator, pbmutils
    Copying-policy: GPL
    End

Filtr APS instaluje się jako filtr if dla kolejki drukowania, i tłumaczy z wielu popularnych typów plików na polecenia twojej drukarki.. Rozumie np. tekst, PostScript, dvi, gif i inne.

## 8.3 EZ-Magic.

EZ-Magic to kolejny pakiet filtrujący, napisany w bash-u, dostepny na sunsite.

    Title:          ez-magic printer filter
    Version:        1.0.5
    Entered-date:   January 26, 1997
    Description:    ez-magic is a printer filter that supports 8 common file
                    formats (txt,ps,gif,bmp,pcx,png,jpg,tif) for printing.
                    It can print over a network (SMB), or to a local printer.
                    Reads from a file, STDIN, or lpd. Simple to use and
                    configure. Just one script file, no huge manuals and
                    multibillion drivers. The only catch is that you need a
                    few common helper programs like netpbm and ghostscript.
                    Written in bash. Easy to add formats and code. Still more
                    bugs than I have appendages, but less than the number of
                    grams of fat in a hot dog. Pre-configured for HP DeskJet
                    870Cse over network. Comparable to apsfilter and others.
    Keywords:       magic filter, print, graphics, samba, network, smb,
                    ghostscript, postscript, gif, jpg, simple
    Author:         toby@eskimo.com (Toby Reed)
    Maintained-by:  toby@eskimo.com (Toby Reed)
    Primary-site:   http://www.eskimo.com/~toby/ez-magic-1.0.5.tar.gz
                             38 kb ez-magic-1.0.5.tar.gz
    Alternate-site: sunsite.unc.edu /pub/Linux/system/printing
                             38 kb ez-magic-1.0.5.tar.gz
    Copying-policy: Copyrighted, full manipulation rights, with one or two
                    restrictions.

## 9. Rozwiązania sprzedawców.

[ Sekcja ta, jest z definicji niekompletna. Przysyłaj szczegóły twojej ulubionej dystrybucji. ]

## 9.1 RedHat.

W RedHacie znajduje się graficzne narzędzie do admiistracji, przy pomocy którego można dodawać drukarki odległe oraz lokalne. Pozwala ono na wybór drukarki z obsługą "ghostscript" oraz pliku urządzenia, do którego kierowany jest wydruk; potem dana drukarka instalowana jest w `/etc/printcap`. Następnie tworzony jest krótki filtr magiczny PostScript-ASCII na podstawie gs i nenscript. Rozwiązanie to działa całkiem dobrze i jest łatwe do ustawienia dla popularnych przypadków.

## 9.2 Inne dystrybucje.

Proszę o informacje jakie są rozwiązania w innych dystrybucjach.

## 10. Ghostscript.

Ghostscript jest najbardziej znaczącym programem do drukowania dla Linux-a. Większość oprogramowania do drukowania pod Unix-a generuje PostScript, który jest opcją dla drukarki wartą ok. $100. Jednak ghostscript jest za darmo i wygeneruje język dla twojej drukarki z PostScriptu. Jeśli jest on podczepiony pod filtr wejściowy dla lpd, to daje wirtualną drukarkę PostScriptową i bardzo ułatwia życie.

Ghostscript jest dostępny w dwóch postaciach. Komercyjna wersja Ghostscript-u pod nazwą Alladin Ghostscript może być używana dla celów osobistych, ale nie może być rozprowadzana w komercyjnych dystrybucjach Linux-a. Jest on z reguły o jakiś rok do przodu względem darmowej wersji; w tym momencie na przykład, obsługuje on Adobe Acrobat's Portable Document Format, podczas gdy starsze wersje tego nie mają.

Wersja darmowa to GNU Ghostscript i jest starszą wersją Aladdina uprzejmie użyczoną dla GNU. (Cześć i chwała dla Aladdina za to; więcej sprzedawców oprogramowania powinna wspomagać darmowe oprogramowanie w ten sposób)

Cokolwiek robisz w gs, upewnij się, że uruchomiłeś go z opcją wyłączającą dostęp do plików (`-dSAFER`). PostScript jest językiem w pełni funkcjonalnym i zły program w PostScripcie mógłby cię przyprawić o ból głowy.

Mówiąc o PDF-ie (Adobe's Portable Document Format), właściwie jest to trochę bardziej zorganizowany PostScript w skompresowanym pliku. Ghostscript umie obsłużyć PDF tak samo jak PostScript, więc możesz być pierwszym w swoim otoczeniu z drukarką umiejącą wydrukować PDF.

## 10.1 Wywoływanie Ghosscript-u.

Zwykle ghostscript jest uruchamiany przez filtr, który założyłeś, ale w celach śledzenia błędó÷ dobrze jest go uruchamiać ręcznie.

`gs -help` pokaże krótką listę opcji i dotępnych sterowników (lista ta pokazuje tylko sterowniki wkompilowane, a nie wszystkie dostępne sterowniki).

Możesz uruchomić gs w celach testowych np. tak:

    gs <opcje> -q -dSAFER -sOutputFile=/dev/lp1 test.ps

## 10.2 Dostrajanie wyników w Ghostscripcie.

Jest wiele rzeczy, które można zrobić jeśli wynik powstały przy opracowywaniu tekstu nie jest zadowalający (właściwie, to możesz zrobić co ci się tylko zamarzy, jeśli masz źródła).

### Umiejscowienie i rozmiar wyniku.

Umiejscowienie, rozmiar i wspolczynik ksztaltu obrazu na stronie jest kontrolowane przez specyficzny dla danej drukarki sterownik w ghostscripcie. Jeśli na przykład zauważysz, że strony wychodzą za krótkie, albo za długie, albo za duże o dwa razy, możesz zajrzeć do źródeł twojego sterownika i dopasować jakiekolwiek parametry, które ci nie pasują. Niestety, każdy sterownik jest inny, tak więc nie mogę ci powiedzieć co tak na prawdę trzeba zmienić, ale większość z nich jest dobrze skomentowana.

### Gamma, rozmiar pikseli itp.

Większość nielaserowych drukarek ma tę wadę, że rozmiar ich punktu jest raczej duży. Rezultatem tego są zbyt ciemne obrazy. Jeśli masz ten problem, to powinieneś użyć swojej własnej funkcji do transferu. Po prostu stwórz następujący plik w katalogu bibliotecznym ghostscripta i dodaj jego nazwę do wywołania gs zaraz przed właściwym plikiem. Może będziesz musiał zmienić wartości, żeby pasowały do twojej drukarki. Mniejsze wartości dają jaśniejszy obraz. Mniejsze wartości (0.2 - 0.15) są dobrym pomysłem, szczególnie jeśli twój sterownik używa algorytmu Floyda-Steinberga do rasteryzacji kolorów.

    ---8<---- gamma.ps ----8<---
    %!
    %transfer functions for cyan magenta yellow black
    {0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer
    ---8<------------------8<---

Przez dopasowanie tych wartości możliwe jest też naprawienie drukarki, która ma jakąś wadę związaną z kolorami. Jeśli będziesz robił coś takiego, to radzę użyć pliku colorcir.ps, który dostarczany jest wraz z ghostscriptem (w podkatalogu `examples`) jako przykładowa strona.

## 11. Jak drukować poprzez sieć.

Jedną z zalet lpd jest to, że można przy jego pomocy drukować na drukarkach przyłączonych fizycznie do innych komputerów. Jeśli dobrze dobierzesz kombinację skryptów i narzędzi, to możesz drukować przy pomocy lpr na wszelkiego rodzaju sieciach.

## 11.1 Na hoście unix/lpd.

Aby pozwolić odległym maszynom drukować na twojej drukarce, musisz je umieścić w `/etc/hosts.equiv` lub `/etc/hosts.lpd`. (Zauważ, że `hosts.equiv` ma kilka innych efektów; upewnij się, że wiesz co robisz jeśli umieszczasz tam jakąś maszynę). Używając opcji rs możesz pozwolić tylko wybranym użytkownikom na drukowanie; informacje na ten temat znajdziesz na stronie podręcznika systemowego na temat lpd.

### Przy pomocy lpd.

Aby wydrukować coś na innej maszynie, musisz zrobić pozycję w `/etc/printcap` podobną do tej:

    # REMOTE djet500
    lp|dj|deskjet:\
            :sd=/var/spool/lpd/dj:\
            :rm=jakaś.odległa.maszyna.pl:\
            :rp=nazwa_drukarki:\
            :lp=/dev/null:\
            :sh:

Zauważ, że lokalnie nadal znajduje się katalog zadań obsługiwany przez lpd. Jeśli odległa maszyna jest zajętą albo wyłączona, to zadania do drukowania czekają lokalnie aż będą mogły zostać wysłane.

### Przy pomocy rlpr.

Żeby ominąć konfigurowanie lokalnego lpd, możesz użyć rlpr, aby wysłać coś bezpośrednio do kolejki na odległej maszynie. Jest to bardzo użyteczne jeśli drukujesz na różnych drukarkach tylko okazyjnie. Z ogłoszenia o rlpr:

Rlpr używa protokołu TCP/IP, aby wysłać zadania do drukowania do serwera lpd gdziekolwiek w sieci.

W przeciwieństwie do lpr, ten *nie* wymaga, żeby drukarki, na których chcesz drukować były znane dla lokalnej maszyny (np. w `/etc/printcap`) i przez to jest bardziej elastyczny i wymaga mniejszego nakładu pracy administratora.

rlpr może zostać użyty gdziekolwiek, gdzie mógłby zostać użyty zwykły lpr, i jest kompatybilny w dół z tradycyjnym lpr z BSD.

Najważniejszą zaletą rlpr jest, to że można drukować *skądkolwiek dokądkolwiek*, niezależnie od tego jak jest skonfigurowany system, z którego chcesz drukować. Może też być użyty jako serwer, tak że klienci uruchomieni na innych maszynach jak np.: netscape, xemacs, itp. mogą drukować na twojej drukarce małym nakładem wysiłku.

Rlpr dostępny jest na SUNSite Polska.

## 11.2 Na Win95, WinNT, LanManager lub Sambie.

Jest dostępne mini-HOWTO "Printing to Windows", które zawiera więcej inormacji niż ta sekcja.

Możliwe jest przekierowanie kolejki lpd poprzez program smbclient (część pakietu Samba) do serwisu drukowania Samby opartego na TCP/IP. Samba zawiera odpowiedni skrypt pod nazwą smbprint. Krótko mówiąc umieszczasz plik konfiguracyjny dla konkretnej drukarki w katalogu zadań i instalujesz skrypt smbprint jako if.

Odpowiednia pozycja w `/etc/printcap` powinna wyglądać tak:

    lp|remote-smbprinter:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/lp:\
        :if=/usr/local/sbin/smbprint:

Aby uzyskać więcej informacji na temat konfigurowania takich przypadków przeczytaj dokumentację zawartą w skrypcie smbprint.

Możesz także użyć smbclient, aby wysłać zadanie drukowania bezpośrednio do serwisu drukowania SMB bez włączania w to lpd. Zobacz informacje w podręczniku systemowym.

## 11.3 Na drukarce NetWare.

Pakiet ncpfs zawiera narzędzie zwane nprint, które udostępnia te same funkcje co smbprint, ale dla NetWare. Pakiet ten można zdobyć z SunSITE Polska. Z informacji LSM dla wersji 0.16:

> Przy pomocy pakietu ncpfs możesz montować wolumeny z serwera netware pod Linux-em. Możesz także drukować na drukarkach podłączonych pod netware oraz kolejkować zadania z netware dla drukarek podłączonych do Linux-a. Potrzebujesz jądra w wersji 1.2.x lub 1.3.54 i nowsze. ncpfs nie będzie działał z jądrem w wersji 1.3 poniżej 1.3.54.

Aby nprint działał poprzez lpd, musisz napisać mały skrypt, aby drukować "stdin" na drukarkach NetWare i zainstalować go jako if dla kolejki lpd. Otrzymasz coś takiego:

    sub2|remote-NWprinter:\
            :lp=/dev/null:sh:\
            :sd=/var/spool/lpd/sub2:\
            :if=/var/spool/lpd/nprint-script:

Skrypt "nprint-script" może wyglądać tak:

    #! /bin/sh
    # Powinieneś najpierw sprawdzić konto guest bez hasła!
    /usr/local/bin/nprint -S sieć -U nazwa -P hasło -q nazwa-kolejki -

## 11.4 Na drukarce EtherTalk (Apple).

Pakiet netatalk zawiera coś podobnego do nprint i smbclient. Werner Eugster udokumentował procedurę dla drukowania do i z sieci Apple o wiele lepiej niż ja kiedykolwiek; zobacz to w Netatalk-HOWTO.

Netatalk nie działa z kartą SMC Etherpower PCI z chip-em DEC tulip.

## 11.5 Na drukarce HP i innych ethernetowych drukarkach.

Drukarki HP i niektóre inne mają ethernetowy interfejs, do którego możesz drukować bezpośrednio używając lpd. Powinieneś postępować zgodnie z instrukcją, którą dostałeś do drukarki albo jej sterownika, ale ogólnie takie drukarki "mają uruchomionego" lpd i dostarczają jedną lub więcej kolejek, do których możesz drukować. HP może pracować np. z takim `/etc/printcap`:

    lj-5|remote-hplj:\
            :lp=/dev/null:sh:\
            :sd=/var/spool/lpd/lj-5:\
            :rm=nazwa.drukarki.pl:rp=raw:

Drukarki HP LaserJet z interfejsami Jet Direct obsługują generalnie dwie wbudowane kolejki - "surową" (raw), która akceptuje PCL (i możliwe, że PostScript) oraz "tekstową", która akceptuje zwykłe ASCII i radzi sobie od razu z "efektem schodków".

W środowisku wielkoskalowym, szczególnie w dużych środowiskach, gdzie niektóre drukarki nie obsługują PostScript-u, może być pożyteczne ustawienie specjalnego serwera drukowania, do którego drukują wszystkie maszyny i na którym uruchamiane są wszystkie zadania ghostscript-a.

Pozwala to twojemu Linux-owi działać jako serwer wydruków dla drukarki, i użtykownicy mogą robić swoje wydruki szybko i zajmować się swoimi rzeczami zamiast czekać aż drukarka skończy drukować pracę kogoś innego.

Aby to zrobić, ustaw na swoim Linux-ie kolejkę, która wskazuje na HP LJ wyposażoną w ethernet. Teraz ustaw kolejkę u wszystkich swoich klientów na tego Linux-a.

Niektóre drukarki sieciowe HP wyraźnie nie akceptują ustawień strony tytułowej (banner page) wysłanej przez klienta; można wyłączyć ich wewnętrznie generowaną taką stronę przez połączenie się z drukarką telnet-em, wciśnięcie dwa razy <<ENTER>>, wpisanie "banner: 0" i następnie "quit". Są inne ustawienia, które możesz także w taki sposób zmienić - wpisz "?", żeby wyświetlić ich listę.

### Na starszych drukarkach HP.

Niektóre drukarki (oraz "czarne pudełka" z sieciowym drukowaniem) obsługują tylko prościutkie nie-protokołowane czyste połączenia TCP. Zauważalne w tej kategorii są wczesne modele kart JetDirect (właczając niektóre JetDirectEx). Ogólnie, aby drukować na takiej drukarce, musisz otworzyć połączenie TCP na danym porcie (z reguły 9100) i umieścić tam swoje zadanie do wydrukowania. Można to zaimplementować m.in. w Perl-u:

    #!/usr/bin/perl
    # Thanks to Dan McLaughlin for writing the original version of this
    # script (And to Jim W. Jones for sitting next to Dan when writing me
    # for help ;)

    $fileName = @ARGV[0];

    open(IN,"$fileName") || die "Can't open file $fileName";

    $dpi300     = "\x1B*t300R";
    $dosCr      = "\x1B&k3G";
    $ends = "\x0A";

    $port =  9100 unless $port;
    $them = "bach.sr.hp.com" unless $them;

    $AF_INET = 2;
    $SOCK_STREAM = 1;
    $SIG{'INT'} = 'dokill';
    $sockaddr = 'S n a4 x8';

    chop($hostname = `hostname`);
    ($name,$aliases,$proto) = getprotobyname('tcp');
    ($name,$aliases,$port) = getservbyname($port,'tcp')
        unless $port =~ /^\d+$/;;
    ($name,$aliases,$type,$len,$thisaddr) =
            gethostbyname($hostname);
    ($name,$aliases,$type,$len,$thataddr) = gethostbyname($them);
    $this = pack($sockaddr, $AF_INET, 0, $thisaddr);
    $that = pack($sockaddr, $AF_INET, $port, $thataddr);

    if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) {
    #    print "socket ok\n";
    }
    else {
        die $!;
    }
    # Give the socket an address.
    if (bind(S, $this)) {
    #    print "bind ok\n";
    }
    else {
        die $!;
    }

    # Call up the server.

    if (connect(S,$that)) {
    #    print "connect ok\n";
    }
    else {
        die $!;
    }

    # Set socket to be command buffered.

    select(S); $| = 1; select(STDOUT);

    #    print S "@PJL ECHO Hi $hostname! $ends";
    #    print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends";
    #    print S $dpi300;

    # Avoid deadlock by forking.

    if($child = fork) {
        print S $dosCr;
        print S $TimesNewR;

        while (<IN>) {
            print S;
        }
        sleep 3;
        do dokill();
    } else {
        while(<S>) {
            print;
        }
    }

    sub dokill {
        kill 9,$child if $child;
    }

## 11.6 Uruchamianie if dla odległych drukarek.

Jedną wadą lpd jest to, że if nie są uruchamiane dla drukarek odległych. Jeśli okaże się, że potrzebujesz if, możesz ustawić podwójną kolejkę i ponownie zkolejkować dany wydruk. Weź ten printcap jako przykład:

    lj-5:remote-hplj:\
            :lp=/dev/null:sh:\
            :sd=/var/spool/lpd/lj-5:\
            :if=/usr/lib/lpd/filter-lj-5:
    lj-5-remote:lp=/dev/null:sh:rm=nazwa.drukarki.pl:\
            :rp=raw:sd=/var/spool/lpd/lj-5-raw:

w świetle tego, skrypt filter-lj-5 to:

    #!/bin/sh
    gs <opcje> -q -dSAFER -sOutputFile=- - | \
            lpr -Plj-5-remote -U$5

Opcja -U dla lpr działa tylko wtedy jeśli lpr jest uruchomiony jako demon i ustawia ona poprawnie zleceniodawcę kolejki w ponownie zainicjowanej kolejce. Powinieneś raczej użyć bardziej pewnej metody na zdobycie identyfikatora użytkownika, ponieważ niezawsze jest to argument 5. Zobacz w podręcznik systemowym na temat printcap.

## 11.7 Z Windows.

Drukowanie z Windows (czy OS/2) na Linux-ie jest obsługiwane poprzez SMB w pakiecie SAMBA, który także umożliwia współdzielenie plików dla Windows.

Samba zawiera całkiem pokaźną dokumentację. Możesz albo skonfigurować magic-filter na Linux-ie i drukować tam PostScript, albo zainstalować sterowniki dla konkretnej drukarki na wszystkich komputerach z Winndows i mieć kolejkę dla nich bez żadnych filtrów. Poleganie na tych sterownikach może czasami dawać lepsze efekty, ale jest to uciążliwe ze strony administratora jeśli jest dużo komputerów z Windows. Więc spróbuj najpierw PostScript-u.

## 11.8 Z Apple.

Netatalk obsługuje drukowanie z Apple poprzez EtherTalk. Na stronie Netatalk HOWTO znajdziesz więcej informacji.

## 11.9 Z Netware.

Jest jakaś obsługa drukowania z Netware przez Linux-a oferowana przez czy z powodu Calder-y, ale nie mam pojęcia czy Linux może oferować drukarki dla klientów Netware.

## 12. Jak drukować na fax-ie.

## 12.1 Używanie faxmodemu.

Jest wiele programów, które pozwolą ci na odbieranie i wysyłanie faxów. Jednym z bardziej złożonych jest program Sama Lefflera pod nazwą HylaFax. Jest on dostępny na `ftp.sgi.com`. Obsługuje on wiele rzeczy od większej ilości modemów do rozgłaszania (broadcasting).

Dostępny jest także efax, prosty program wysyłający fax-y - jest on lepszym wyborem dla Linux-owców. Program mgetty może odbierać faxy (a nawet wysyłać pocztę głosową na niektórych modemach!).

## 12.2 Używanie Zdalnego Serwisu Drukowania.

Dostępny jest eksperymentalny serwis, który pozwala ci na wysłanie poczty elektronicznej z dołączonym fragmentem, który ma być wydrukowany na faxie gdzieś indziej. Obsługiwane są takie formaty jak PostScript, tak więc pomimo, iż nie obejmuje swym zasięgiem wszystkiego, może być on bardzo przydatnym serwisem. Więcej informacji na temat drukowania poprzez Zdalny Serwis Drukowania znajdziesz na stronie o zdalnym drukowaniu.

## 13. Jak wygenerować coś wartego drukowania.

Tutaj wchodzimy w prawdziwą sieć oprogramowania. Ogólnie, Linux może uruchamiać cztery typy binariów z różnym sukcesem: Linux, iBCS, Win16/Win32s (za pomocą dosemu i kiedyś Wine) oraz Mac/68k (przy pomocy Executora). Ja omówię tylko czysto-Linux-owe i popularne Unix-owe oprogramowanie, poza tym WordPerfect dla SCO i przypuszczalnie inne komercyjne procesory tekstu także dobrze działają na Linux-owej emulacji iBCS.

Dla Linux-a wybór jest przeważnie ograniczony do oprogramowania dostępnego ogólnie dla Unix-a.

## 13.1 Języki "Markup".

Większość języków "markup" jest bardziej elastyczna dla większych albo powtarzalnych projektów, gdzie chcesz, aby komputer kontrolował wygląd rezultatu/wydruku, aby utworzyć ogólny wzór. Próba zrobienia jakiegoś ładnego znaczka w języku "markup" przypuszczalnie by "bolała"...

`nroff`

  To był jeden z pierwszych języków "markup" dla Unix-a. Strony z podręcznika systemowego są najpopularniejszym przykładem tekstów sformatowanych przy pomocy makr *roff-a. Wiele ludzi przeklina ten język, ale nroff ma, przynajmniej dla mnie, bardziej złożoną składnię niż to jest konieczne i przypuszczalnie jest złym wyborem dla nowych prac. Jednak warto jest wiedzieć, że możesz zamienić napisaną w groff-ie stronę bezpośrednio na PostScript. Większość poleceń "man" zrobi to za ciebie np. man -t coś| lpr.

`TeX`

  oraz język makr - LaTeX, są jednym z najczęściej używanych języków "markup" na Unix-ie. Techniczne prace są często napisane w LaTeX-u ponieważ bardzo upraszcza określenie wyglądu tekstu i jest wciąż jednym z niewielu systemów obróbki tekstu, który obsługuje zapisy matematyczne dokładnie i dobrze na raz. Formatem wyjściowym TeX-a jest dvi (DeVice Independent - czyli niezależny od urządzenia [przyp. tłum.]) i można go zamienić na PostScript lub Hewlett Packard PCL przy pomocy dvips lub dvilj. [TeX czyta się "tech" - przyp. tłum.].

SGML

  Dostępny jest przynajmniej jeden program do obróbki tego języka na Unix-a; formuuje on podstawy systemu dokumentów Linuxdoc-SGML. Może on także obsługiwać inne DTD.

HTML

  Ktoś zasugerował, że dla prostych projektów, wystarczy napisanie w HTML-u i drukować przy pomocy Netscape-a. Ja się z tym jednak nie zgadzam.

## 13.2 WYSIWYG.

[ Jest to skrót od What You See Is What You Get - czyli to co widzisz to dostaniesz, a oznacza, iż wydrukowane zostanie DOKŁADNIE to co jest widoczne na ekranie i DOKŁADNIE w taki sam sposób - przyp. tłum.]

W tej chwili jest niedobór oprogramownia do obróbki tekstu WYSIWYG. Nie bój się napisać jakiegoś i daj mi znać jeśli ominąłem coś tutaj.

LyX

  Jest to zakończenie dla LaTeX-a, które wygląda bardzo obiecująco. Odwiedź stronę domową LyX-a jeśli chcesz więcej informacji.

Andrew User Interface System

  AUIS zawiera ez - edytor w stylu WYSIWYG z większością cech podstawowego procesora tekstu, możliwościami HTML oraz pełną obsługą poczty elektronicznej MIME i grup dyskusyjnych (news-ow).

Oferty komercyjne

  Przynajmniej Caldera i Red Hat dostarczają pakiety zawierające zwykłe aplikacje biurowe jak edytor w stylu WYSIWYG i arkusz kalkulacyjny. Powiedziałbym, że robią dobrą robotę, ale nigdy nie używałem takich pakietów. Sądze, że Caldera dostarcza także WABI firmy Sun, tak więc mógłbyś przypuszczalnie uruchomić jakiś MS Office pod tym jeśli musiałbyś zintegrować się z plikami innych.

  Jeff Phillips <jeff@I_RATUS.org> używa WordPerfect-a dla Linux-a z Caldery (w Slackware różnego rodzaju) i twierdzi, że działa mu to dobrze. Wygląda na to, że zawiera on wbudowaną obsługę drukarek, jak to można by się spodziewać. Caldera powinna mieć jakieś informacje na swojej stronie WWW.

  RedHat dostarcza pakiet o nazwie Applixware; Ich stronę można znaleźć pod adresem www.redhat.com.

  Inni sprzedawcy niech mi dadzą znać jakie mają oferty.

## 14. Podgląd przed wydrukiem.

Prawie wszystko co możesz wydrukować, możesz też zobaczyć na ekranie.

## 14.1 PostScript.

Ghostscript posiada sterownik do X11; najlepiej jeśli jest on użyty pod kontrolą podglądarki PostScript o nazwie Ghostview. Najnowsza wersja tego programu powinna być także w stanie wyświetlić pliki PDF.

## 14.2 TeX dvi.

Niezależne od urządzenia (DeVice Independant) pliki TeX-a mogą być wyświetlane w X11 używając xdvi. Nowsze wersje xdvi wywołują ghostscript, aby wykonać polecenia typowo PostScriptowe.

Jest także sterownik na VT100. Nazywa się dgvt. Tmview działa z Linux-em i svgalib jeśli to wszystko na co cię stać.

## 15. Drukarki szeregowe pod lpd.

## 15.1 Ustawianie w printcap-ie.

Lpd udostepnia pięć atrybutów, które możesz ustawić w pliku `/etc/printcap`, aby kontrolować wszystkie ustawienia portu szeregowego, do którego dołączona jest drukarka. Przeczytaj stronę podręcznika systemowego na temat printcap i zapamiętaj znaczenia: br#, fc#, xc#, fs# i xs#. Ostatnie cztery z tych atrybutów to mapy bitowe oznaczające ustawienia portu. Atrybut br# jest prędkością: np. br#9600.

Tłumaczenie z postaci stty na printcap jest bardzo proste. Jeśli musisz, to zobacz stronę podręcznika systemowego na temat stty.

Użyj stty, aby ustawić port drukarki, tak żebyś mógł wysłać plik do tego portu (poleceniem cat) i otrzymał poprawny wydruk. Oto co wyświetla polecenie stty -a dla mojego portu drukarki:

    dina:/usr/users/andy/work/lpd/lpd# stty -a < /dev/ttyS2
    speed 9600 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
    eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
    lnext = ^V; min = 1; time = 0;
    -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
    -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel
    -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0
    bs0 vt0 ff0
    -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase
    -tostop -echoprt -echoctl -echoke

Jedynymi zmianami między tym, i stanem w jakim port jest inicjowany podczas startu są `-clocal`, `-crtscts` i `ixon`. Twój port może mieć inne ustawienia w zaleźności od tego jak twoja drukarka kontroluje przepływ (flow control).

stty używa się właściwie w dziwny sposób. Ponieważ polecenie stty operuje na terminalu podłączonym do jego standardowego wejścia, ty używasz je, aby manipulować danym portem szeregowym przez użycie znaku `<` jak powyżej.

Jak już masz dobre ustawienia, tak że cat plik > /dev/ttyS2 (w moim przypadku) działa, zajrzyj do pliku `/usr/src/linux/include/linux/termios.h`. Zawiera on wiele #define (definicji) i kilka struktur - możesz go sobie wydrukować (przecież drukarka działa, nie ?) i używać jako pomocy. Idź do sekcji, która zaczyna się tak:

    /* c_cflag bit meaning */
    #define CBAUD   0000017

Sekcja ta zawiera znaczenia bitów fc# i fs#. Zauważysz, że nazwy (po ilości bodów) są identyczne z tymi z polecenie stty. A nie mówiłem, że to będzie proste ?

Zobacz, które z tych ustawień mają znak "-" na początku przy poleceniu stty. Zsumuj te wszystkie liczby (są one zapisane w systemie ósemkowym). To będą te bity, które będziesz chciał wyzerować, tak więc wynik jest tym, co masz wpisać do fc#. Pamiętaj oczywiście, że będziesz ustawiał bity zaraz po tym jak je wyzerujesz, tak więc możesz użyć "fc#0177777" (ja tak robię).

Teraz zrób to samo dla tych ustawień, które nie mają znaku "-" na początku w poleceniu stty. W moim przykładzie ważne są CS8 (0000060), HUPCL (0002000) i CREAD (0000200). Zapamiętaj też ustawienie dla swojej prędkości (u mnie jest to 0000015). Zsumuj to wszystko - w moim przykładzie będzie to 0002275. To będzie to, co masz wpisać do fs#. ("fs#02275 działa u mnie.)

Zrób to samo z ustawieniem i zerowaniem dla następnej sekcji pliku nagłówkowego. "c_lflag bits". W moim przypadku nie musiałem niczego ustawiać, tak więc użyłem tylko "xc#0157777" i "xs#0".

## 15.2 Starsze drukarki szeregowe, które gubią znaki.

Jon Luckey pisze, że u niektórych starszych szeregowych drukarek z interfejsem za 10 centów i małym buforem, stop w kontroli przepływu oznacza rzeczywiste stop dla drukowania. Potem odkrył, że żeby naprawić tę niedogodność wystarczy wyłączyć FIFO w układzie 16550 poleceniem setserial (żeby to zrobić po prostu podajesz typ ukladu uart jako 8250).

## 16. Wyrazy uznania.

Informacje na temat smbprint zostały zaczerpnięte z artykułu Marcela Roelofsa `<marcel@paragon.nl>`.

Informacje na temat nprint i używania drukarek NetWare zostały dostarczone przez Michaela Smitha `<mikes@bioch.ox.ac.uk>`.

Sekcja na temat drukarek szeregowych pod lpd została napisana przez Andrew Teffta `<teffta@engr.dnet.ge.com>`.

Te wszystkie gammy i inne takie dla "gs" zostały dostarczone przez Andreasa `<quasi@hub-fue.franken.de>`.

Dwa paragrafy na temat 30 sekundowego "closing_wait" przy sterownikach szeregowych zostały dostarczone przez Chrisa Johnsona `<cdj@netcom.com>`.

Robert Hart przysłał kilka doskonałych paragrafów na temat ustawiania serwera drukarek dla połączonych HP, któych ja używam w niezmienionej wersji.

I specjalne podziękowania dla tuzinów nad tuzinami tych, którzy wskazywali literówki, złe adresy i błędy w tym dokumencie przez lata.

## 16.1 Od tłumacza.

Wersja ta jest wersją ostateczną. Dodany został odnośnik do właśnie powstałego tłumaczenia dokumentu Printing-Usage-HOWTO.

Tłumaczenie to jest chronione prawami autorskimi © Bartosza Maruszewskiego. Dozwolone jest rozprowadzanie i dystrybucja na prawach takich samych jak dokument oryginalny.

Jeśli znalazłeś jakieś rażące błędy ortograficzne, gramatyczne, składniowe, techniczne (a może ich tu trochę być, bo nie znam się tak bardzo na poligrafii) to pisz do mnie:

B.Maruszewski@jtz.org.pl

Oficjalną stroną tłumaczeń HOWTO jest http://www.jtz.org.pl/

Aktualne wersje przetłumaczonych dokumentów znajdują się na tejże stronie. Dostępne są także poprzez anonimowe ftp pod adresem ftp.jtz.org.pl w katalogu `/JTZ`.

Przetłumaczone przeze mnie dokumenty znajdują się także na mojej stronie WWW. Są tam też odwołania do Polskiej Strony Tłumaczeniowej.

Kontakt z naszą grupą, grupą tłumaczy możesz uzyskać poprzez listę dyskusyjną jtz@jtz.org.pl. Jeśli chcesz sie na nią zapisać, to wyślij list o treści `subscribe jtz Imię Nazwisko` na adres `majordomo@ippt.gov.pl`