Linux Drucker HOWTO <author>Grant Taylor (<tt><htmlurl name="gtaylor@picante.com" url="mailto:gtaylor@picante.com"></tt>) und Jens Vonderheide (<tt><htmlurl name="Jens_Vonderheide@wharfrat.fido.de" url="mailto:Jens_Vonderheide@wharfrat.fido.de"></tt>) <date>v3.9, 25. Juli 1996, Übersetzung 8. August 1996 <abstract> Dies ist die Linux Drucker HOWTO, eine Übersetzung der Linux Printing-HOWTO. Es ist eine Zusammenfassung von Informationen, wie man unter Linux (und anderen UNIX-Derivaten) Dokumente generiert, ansieht, druckt oder faxt. </abstract> <toc> <sect>Einleitung <p> <bf>Anm. d. Üb.:</bf> Da dies eine Übersetzung ist, werden die Versionsnummern beibehalten, d.h. die deutsche Übersetzung beginnt mit Version 3.9. <p> Diese HOWTO ist komplett neu geschrieben worden, deshalb sind viele Informationen aus früheren Versionen verloren gegangen. Das ist Absicht, da die früheren HOWTOs 60 Seiten und mehr umfaßten, und den Erzählfluß einer toten Schildkröte hatten. Wer hier keine passende Antwort finden, sollte a) die vorhergehende Version auf der Printing HOWTO Home Page (<tt><htmlurl url="http://www.picante.com/~gtaylor/pht/" name="http://www.picante.com/~gtaylor/pht/"></tt>) durchsuchen und b) dem Autor einen Nachricht hinterlassen, was in der HOWTO noch stehen sollte. <p> <bf/Anm. d. Üb./: Die alten Versionen stehen nur in englischer Sprache zur Verfügung. <p> Die <htmlurl url="http://www.picante.com/~gtaylor/pht/" name="Printing HOWTO Home Page"> ist ein guter Platz, um die aktuelle (englische) Version dieser HOWTO zu bekommen, sie ist auch bei <tt><htmlurl url="ftp://sunsite.unc.edu" name="sunsite.unc.edu"></tt> erhältlich. <p> <bf/Anm. d. Üb./: Die deutsche Version ist auf <tt><htmlurl url="ftp//ftp.heise.de/pub" name="ftp.heise.de:/pub"></tt> und auf <tt><htmlurl url="ftp://ftp.uni-stuttgart.de/pub/systems/linux/local/doc" name="ftp.uni-stuttgart.de:/pub/systems/linux/local/doc"></tt> zu bekommen. Hier werden auch weitere deutsche Übersetzungen zu haben sein. Fertig ist zur Zeit der Übersetzung die <em>Linux Installation HOWTO</em>, in Entwicklung befinden sich <em/Bootdisk HOWTO/, <em/GCC HOWTO/, <em/Kernel HOWTO/, <em/Keyboard HOWTO/, <em/NET2-HOWTO/, <em/PPP HOWTO/, <em/Serial HOWTO/, <em/UUCP HOWTO/. Für die Koordination des deutschen HOWTO-Projekts ist Marco Budde (<tt><htmlurl url="mailto:Budde@tu-harburg.d400.de" name="Budde@tu-harburg.d400.de"></tt>) verantwortlich. <p> <bf/Anm. d. Üb./: Um die Verständlichkeit zu erhalten, habe ich einige Fachbegriffe, die im Englischen selbst-erklärend sind, unübersetzt gelassen: <descrip> <tag/Spool/ Warteschlange. Hier "warten" Druckaufträge, bis der Drucker bereit ist. <tag/Device/ Wörtlich Gerät. Kann sich auf ein physikalisches Gerät wie den Drucker beziehen, bezeichnet aber meistens ein logisches Gerät für Linux, z.B. <tt/lp1/. <tag/Man-page/ Anleitungsseite. Beschreibt einen Befehl o.ä. Wird durch <tt/man/ "Befehl" angezeigt. </descrip> <sect1>Geschichte <p> Dies ist die dritte Generation, d.h. die dritte komplette Neufassung der <em>Printing-HOWTO</em>. Die Geschichte der PHT ist diese: <enum> <item>Der Autor schrieb die <em>Printing-HOWTO</em> als Antwort auf zu viele Fragen zum Drucken in <tt>comp.os.linux</tt>, und postete sie. Dieses Posting war einige Monate vor dem HOWTO-Projekt und war damit die erste FAQ, die eine `HOWTO' genannt wurde. Diese Ausgabe war in reinem ASCII. <item>Nachdem der Autor dem HOWTO-Projekt beitrat, wurde die <em>Printing-HOWTO</em> mit einem Lpd FAQ von Brian McCauley (<tt><htmlurl url="mailto:B.A.McCauley@bham.ac.uk" name="B.A.McCauley@bham.ac.uk"></tt>) verschmolzen, die beiden arbeiteten als Co-Autoren an der PHT etwa 2 Jahre lang weiter zusammen. In dieser Zeit wurde auch die Arbeit von Karl Auer (<tt><htmlurl url="mailto:Karl.Auer@anu.edu.au" name="Karl.Auer@anu.edu.au"></tt>) eingebaut. Diese Generation der PHT war in TeXinfo, und erhältlich in PS, HTML, Ascii und Info. <item>Nachdem die PHT für über ein Jahr vor sich hin gerottet war, und ein Versuch, jemand anders für die Weiterführung zu gewinnen, scheiterte, entstand diese Neufassung. Diese Generation der PHT ist in Linuxdoc-SGML. </enum> <bf/Anm. d. Üb./: Dieser Text ist die erste deutsch-sprachige Übersetzung der <em>Printing-HOWTO</em>. <sect1>Copyright <p> Dieses Dokument ist urheberrechtlich geschützt. Das Copyright für die englische <em>Printing-HOWTO</em>, auf der dieses Dokument basiert, liegt bei Grant Taylor. Das Copyright für die deutsche Übersetzung liegt bei Jens Vonderheide. Das Dokument darf gemäß der GNU GPL kostenlos verbreitet werden. Das bedeutet, daß der Text sowohl über elektronische wie auch physikalische Medien ohne die Zahlung von Lizenzgebühren verbreitet werden darf, solange dieser Copyright Hinweis nicht entfernt wird. Eine kommerzielle Verbreitung ist erlaubt und sogar erwünscht. Bei einer Verbreitung in Papierform ist das deutsche HOWTO-Projekt hierüber zu informieren. <sect>Wie druckt man? <p> Wenn lpd bereits so eingerichtet ist, daß es druckt, oder der System-Betreuer es bereits eingerichtet hat, dann muß nur der Gebrauch des lpr-Kommandos erlernt werden. Die <em><htmlurl name="Printing Usage HOWTO" url="http://sunsite.unc.edu/mdw/HOWTO/Printing-Usage-HOWTO.html"></em> bezieht sich darauf, und auf einige weitere Kommandos, die man kennen sollte. <p> <bf/Anm. d. Üb./: Diese HOWTO liegt z.Z. noch nicht in deutscher Sprache vor, eine Übersetzung ist geplant. <sect>Kernel-Drucker-Devices <sect1> Das lp-Device <p> Das Linux-Kernel, falls das lp-Device eincompiliert oder geladen wurde (die Ausgabe von <tt>cat /proc/devices</tt> sollte das Device lp einschließen), stellt ein oder mehr von <tt>/dev/lp0</tt>, <tt>/dev/lp1</tt> und <tt>/dev/lp2</tt> zur Verfügung. Diese werden NICHT dynamisch zugeordnet, sondern korrespondieren vielmehr mit einer bestimmten I/O-Adresse der Hardware. Das heißt, das der erste Drucker entweder <tt/lp0/ oder <tt/lp1/ sein kann, abhängig von der verwendeten Hardware. Testen Sie beides ;) <p> Man kann nicht die plip- und lp-Treiber gleichzeitig auf einem Port laufen lassen. Man kann aber einen der beiden Treiber entweder manuell oder mit kerneld (mit Version 2 oder späten 1.3.x) laden. Wenn man die Interrupts u. ä. sinnvoll setzt, kann man lp auf dem einen und plip auf dem anderen Port laufen lassen. Jemand hat das gemacht, indem er die Treiber geändert hat, es bleibt abzuwarten, ob es auch eine einfache Kommandozeilen-Methode gibt. <p> Es gibt eine kleine Utility namens tunelp (<tt><htmlurl url="http://www.picante.com/~gtaylor/pht/man/tunelp.html" name="http://www.picante.com/~gtaylor/pht/man/tunelp.html"></tt>), mit dem man als root Interrupts, Geschwindigkeit und anderes am lp-Device einstellen kann. <p> Wenn die Option in Kernel 2 oder einigen 1.3.x-Kernels compiliert wurde, kann eine <tt>lp=</tt>-Option gewählt werden, um die Portadressen und Interrupts einzustellen: <p> Wenn der lp-Treiber in der Kernel eingebaut wurde, kann ein LILO/LOADLIN-Kommando benutzt werden, um die Portadresse und Interrupts einzustellen. <tscreen><verb> Syntax: lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]] Beispiel: lp=0x378,0 oder lp=0x278,5,0x378,7 ** ** Standard Port-Einstellungen, der andere Port (<tt/lp0/) liegt bei 0x3bc. </verb></tscreen> <p> Hinweis: Wenn diese Funktion benutzt wird, müssen <bf/alle/ Ports angegeben werden, die berücksichtigt werden sollen, es gibt keine Voreinstellungen. Man kann einen eingebauten Treiber mit lp=0 deaktivieren. <p> Wenn das Device als Modul geladen wird (<bf>nur</bf> in 2.0 und späten 1.3.x Kernels), können die Adressen und Interrupts in der üblichen Syntax im insmod-Kommando angegeben werden. Die Parameter sind <tt/io=x,y,z/ und <tt/irq=x,y,z/, wobei <tt/x/, <tt/y/ und <tt/z/ genau das sind, was man annimmt. Auf der Man-page zu <tt/insmod/ gibt es weitere Informationen. <sect1>Serielle Devices <p> Serielle Devices werden üblicherweise unter Linux als etwas wie <tt>/dev/ttyS1</tt> bezeichnet. Das Programm stty (<tt><htmlurl url="http://www.picante.com/~gtaylor/pht/man/stty.html" name="http://www.picante.com/~gtaylor/pht/man/stty.html"></tt>) erlaubt es, interaktiv die Einstellungen für die seriellen Schnittstellen anzusehen oder zu verändern; mit setserial (<tt><htmlurl url="http://www.picante.com/~gtaylor/pht/man/setserial.html" name="http://www.picante.com/~gtaylor/pht/man/setserial.html"></tt>) können einige erweiterte Attribute eingestellt werden und IRQs und I/O-Adressen für nicht-standardmäßige Schnittstellen eingestellt werden. Weitere Informationen über serielle Schnittstellen können in der <em>Serial-HOWTO</em> (<tt><htmlurl url="http://sunsite.unc.edu/mdw/HOWTO/Serial-HOWTO.html" name="http://sunsite.unc.edu/mdw/HOWTO/Serial-HOWTO.html"></tt>) nachgelesen werden. <p> <bf/Anm. d. Üb./: Die deutsche Übersetzung der <em>Serial-HOWTO</em> befindet sich z.Z. in Entwicklung. <sect>Grundlagen <p> Damit das Drucken gut funktioniert, ist es wichtig, die Funktionsweise des lpd-Systems zu verstehen. <p> Lpd steht für <tt/Line Printer Daemon/ und bezieht sich je nach Zusammenhang entweder auf den Daemon oder auf die gesamten Programme, die für das Druck-Spooling zuständig sind. Das sind: <p> <descrip> <tag><tt><htmlurl name="lpd" url="http://www.picante.com/~gtaylor/pht/man/lpd.html"></tt></tag>Der Spooling-Daemon. Einer von diesen kontrolliert alles auf einer Maschine, UND einer läuft pro Drucker solange der Drucker druckt. <tag><tt><htmlurl name="lpr" url="http://www.picante.com/~gtaylor/pht/man/lpr.html"></tt></tag>Der Spooling-Befehl für den Anwender. Lpr ruft lpd auf und setzt einen neuen Druckauftrag (Job) in den Spool. <tag><tt><htmlurl name="lpq" url="http://www.picante.com/~gtaylor/pht/man/lpq.html"></tt></tag>Listet die Jobs in einer Drucker-Warteschlange auf. <tag><tt><htmlurl name="lpc" url="http://www.picante.com/~gtaylor/pht/man/lpc.html"></tt></tag>Der Lpd Systemkontrollbefehl. Mit lpc können die Warteschlangen gestoppt, gestartet, umsortiert, etc. werden. <tag><tt><htmlurl name="lprm" url="http://www.picante.com/~gtaylor/pht/man/lprm.html"></tt></tag><tt/lprm/ entfernt einen Auftrag aus der Warteschlange. </descrip> <p> Und wie paßt das alles zusammen? Nun ja, wenn der Computer bootet wird lpd gestartet. Es durchsucht die Datei <tt>/etc/printcap</tt>, um festzustellen, für welche Drucker es die Spools verwaltet. Jedes mal, wenn man lpr aufruft, nimmt lpr mit lpd durch einen Socket namens <tt>/dev/printer</tt> Verbindung auf und übergibt lpd die zu druckende Datei und einige Informationen, wer druckt und wie zu drucken ist. Lpd druckt dann die Datei auf dem passenden Drucker aus. <p> Das lp-System wurde ursprünglich entwickelt, als die meisten Drucker Zeilendrucker waren - das heißt, die meisten Anwender benutzten reine Ascii-Drucker. Es hat sich herausgestellt, daß nur etwas mehr Aufwand nötig ist, damit lpd mit heutigen Druckaufträgen zusammenarbeitet, die häufig in PostScript oder Text oder dvi oder ... sind. <sect>Grundeinstellungen <sect1>Traditionelle lpd-Konfiguration <p> Die Minimaleinstellungen für lpd liefern ein System, das Dateien in Warteschlangen verwalten und sie drucken kann. Es kümmert sich nicht darum, ob der Drucker die Dateien überhaupt versteht und wird vermutlich keine ansehnlichen Ausgaben produzieren. Trotzdem ist es der erste Schritt zum Verständnis, also weiterlesen! <p> Um eine Warteschlange zu lpd hinzuzufügen, muß man einen Eintrag in <tt>/etc/printcap</tt> hinzufügen und ein neues Spool-Verzeichnis unter <tt>/var/spool/lpd</tt> erzeugen. <p> Ein Eintrag in <tt>/etc/printcap</tt> sieht wie folgt aus: <tscreen><verb> # LOKALER djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :sh: </verb></tscreen> Das definiert einen Spool namens <tt/lp/, <tt/dj/ oder <tt/deskjet/, im Verzeichnis <tt>/var/spool/lpd/dj</tt>, ohne maximale Auftragsgröße, der an ein Device <tt>/dev/lp0</tt> druckt und am Anfang des Druckauftrags keine Trennseite hinzufügt (mit dem Namen der Person, die gedruckt hat, etc.). <p> Jetzt wäre der richtige Augenblick, um die man-page für <tt><htmlurl name="printcap" url="http://www.picante.com/~gtaylor/pht/man/printcap.html"></tt> zu lesen. <p> Das obige Beispiel sieht sehr einfach aus, hat aber ein Problem. Wenn man keine Files sendet, die ein DeskJet 500 verstehen kann, wird dieser Deskjet seltsame Sachen drucken. Wenn man z.B. eine gewöhnlichen UNIX-Textdatei an den Deskjet schickt, interpretiert er die Newlines wörtlich und gibt aus: <tscreen><verb> Dies ist Zeile Eins. Dies ist Zeile Zwei. Dies ist Zeile Drei. </verb></tscreen> und so weiter. Der Ausdruck einer PostScript-Datei würde eine schöne Liste der PostScript-Befehle geben, mit diesem "Treppenstufeneffekt" ausgedruckt, aber keine sinnvolle Ausgabe. <p> Also wird mehr benötigt, und genau das ist die Aufgabe des Filters. Dem aufmerksame Leser werden bei der printcap man-page die Spool-Attribute <tt/if/ und <tt/of/ aufgefallen sein. <tt/if/ oder der Inputfilter ist genau das, was man jetzt braucht. <p> Wenn man ein kleines Shellscript namens <tt/filter/ schreibt, daß Zeilenumbrüche (CR) vor die Newlines setzt, wird der "Treppenstufeneffekt" verhindert. Also muß in den printcap-Eintrag eine <tt/if/-Zeile eingefügt werden: <tscreen><verb> lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :if=/var/spool/lpd/dj/filter:\ :sh: </verb></tscreen> Ein simples Filterscript könnte sein: <tscreen><verb> #!perl while(<STDIN>){printf "$_\r";}; </verb></tscreen> Wenn man das machen würde, hätte man einen Spool, in den man gewöhnliche UNIX-Textdateien drucken kann und sinnvolle Ergebnisse bekäme. (Ja, es gibt vier Millionen bessere Möglichkeiten diesen Filter zu schreiben, aber wenige so anschauliche. Der Leser möge dies effizienter gestalten.) <p> Das einzige verbleibende Problem besteht darin, daß gewöhnlicher Text nichts Besonderes ist - es wäre sicherlich besser, wenn man PostScript und andere formatierte Texte oder Grafik-Ausgaben drucken könnte. Ja, gut, das wäre es, und es ist einfach. Dazu muß einfach der obige Zeilenumbruch-Filter erweitert werden. Wenn man einen Filter schreibt, der beliebige Dateitypen akzeptiert und diese in Deskjet-verständliche Ausgaben umwandelt, hat man wirklich einen cleveren Druck-Spooler! <p> So ein Filter wird <em/Magic/-Filter genannt. Man sollte sich nicht die Mühe machen und selber einen schreiben, solange man keine wirklich ungewöhnlichen Sachen drucken will. Es gibt einige wirklich gute im Netz. <sect1>File Permissions <p> Auf Grund von häufigen Nachfragen ist hier eine Liste der Permissions der wichtigen Dateien, wie sie auf dem System des Autors gesetzt sind. Es gibt bessere Möglichkeiten, im Idealfall ohne SUID root, sondern mit SGID Binärdateien, aber so wurde das System installiert und es funktioniert. (Ehrlich gesagt, wenn ein Verkäufer noch nicht einmal ein funktionierendes lpd liefern kann...) <tscreen><verb> -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/ </verb></tscreen> <p> Lpd muß momentan als root aufgerufen werden, damit es die lp Service-Ports mit niedrigen Nummern ansprechen kann. Es sollte vielleicht UID lp.lp oder so etwas nach der Bindung werden, aber das tut es wohl nicht. <sect>Wie man einen passenden Magic-Filter bekommt <sect1>APS Filter <p> Einer der schönsten Magic-Filter ist APS Filter, von Andreas Klemm. Der Eintrag in der Linux Software Map ist in etwa dieser: <tscreen><verb> 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 (Magic-Filter fuer lpd mit automatischer Dateityp- Erkennung) Keywords: lpd magicfilter aps apsfilter Author: andreas@knobel.GUN.de (Andreas Klemm) Maintained-by: sledge@hammer.oche.de (Thomas Bueschgens) andreas@knobel.GUN.de (Andreas Klemm) Primary-site: sunsite.unc.edu /pub/Linux/system/Printing/ 211KB aps-491.tgz Original-site: ftp-i2.informatik.rwth-aachen.de /pub/Linux/pak/APSfilter/aps-491.tgz Platforms: C-Compiler, gs Postscript emulator, pbmutils Copying-policy: GPL End </verb></tscreen> APS Filter wird als ein <tt/if/-Filter für eine Warteschlange installiert und übersetzt viele häufige Dateitypen in die entsprechende Druckersprache. Es versteht z.B. Text, PostScript, dvi, gif und andere. <sect1>Magic-Filter <p> Der Magic-Filter, geschrieben von B.A.McCawley, arbeitet in etwa wie der APS Filter. Er ist aber in bash geschrieben und könnte deshalb besser angepaßt werden. Der LSM-Eintrag: <tscreen><verb> Version: 0.4 Description: Bash scripts to simplify the task of configuring lpd to auto-detect file types using /etc/magic. (As advertised in the printing-HOWTO). This package uses existing filters so it only prints file types for which one already has filters (or compressed versions thereof). Alterative magic filter approches are described in the printing-HOWTO. (Bashscripte, um die Konfiguration von lpd zur Autoerkennung von Dateitypen mit /etc/magic zu erleichtern (wie in der Printing-HOWTO angekuendigt). Dieses Paket verwendet existierende Filter, es druckt also nur Dateitypen, fuer die bereits Filter vorhanden sind (oder komprimierte Versionen). Andere Ansaetze fuer Magic-Filter sind in der Printing-HOWTO beschrieben.) Keywords: lpd, /etc/magic, printing, filter Author: B.A.McCauley@bham.ac.uk (Brian McCauley) Maintained-by: B.A.McCauley@bham.ac.uk Primary-site: tsx-11.mit.edu pub/linux/sources/usr.bin magic-filter-0.4.tar.gz 5709 Copying-policy: GNU GPL </verb></tscreen> <sect1>Die anderen Magic-Filter <p> Zur maximalen Verwirrung gibt es zwei weitere Magic-Filter, die einfach nur magic filter heißen (oder sind es die gleichen?) <tscreen><verb> 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. (Ein anpassungsfaehiger, erweiterbarer automatischer Druckerfilter. Erkennt und druckt automatisch so ziemlich jeden Datentyp, fuer den es eine Umwandlungs- routine gibt. Dieser Filter ist in C geschrieben und wird komplett durch eine externe Drucker- Konfigurationsdatei gesteuert. ...) Author: H. Peter Anvin <Peter.Anvin@linux.org> Primary-site: sunsite.unc.edu 53000 /pub/Linux/system/Printing/magicfilter-1.1b.tar.gz Copying-policy: GPL </verb></tscreen> <sect>Serielle Drucker unter lpd <sect1>Einstellungen der printcap <p> Lpd besitzt 5 Attribute, die in der <tt>/etc/printcap</tt> eingestellt werden können, um die Einstellungen des seriellen Ports zu kontrollieren. Man lese dazu die <tt><htmlurl name="printcap" url="http://www.picante.com/~gtaylor/pht/man/printcap.html"></tt> man page und beachte die Bedeutungen von <tt/br#/, <tt/fc#/, <tt/xc#/, <tt/fs#/ und <tt/xs#/. Die letzten vier dieser Attribute sind Bitmaps, die für die Einstellungen dieses Ports stehen. Das <tt/br#/-Attribut ist einfach die Baudrate, z.B. `<tt/br#9600/'. <p> Es ist sehr einfach, die <htmlurl name="stty" url="http://www.picante.com/~gtaylor/pht/man/stty.html">-Einstellungen in printcap Flags zu übersetzen. Wenn nötig, möge man nun die man page für stty betrachten. <p> Man benutzt stty um den Druckerport einzustellen, so daß man ein File an ihn `catten' kann. So kann `<tt/stty -a/' aussehen: <tscreen><verb> 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 </verb></tscreen> Die einzigen Unterschiede zwischen diesem und der Initialisierung beim Booten sind <tt/-clocal/, <tt/-crtscts/ und <tt/ixon/. Die benötigten Einstellungen können auch anders sein, abhängig von der Flußkontrolle des Druckers. <p> Man kann stty auf eine etwas ungewöhnliche Weise verwenden. Weil stty auf dem Terminal, das mit seinen Standardinput verbunden ist, arbeitet, kann man damit einen seriellen Port manipulieren, indem man `<tt/</' wie oben verwendet. <p> Sobald die stty-Einstellungen richtig sind, wenn also `<tt>cat file > /dev/ttyS2</tt>' (in meinem Fall) die Datei an den Drucker schickt, sollte man die Datei <tt>/usr/src/linux/include/linux/termios.h</tt> betrachten. Diese Datei enthält viele #defines und einige structs (man sollte diese Datei auf den Drucker catten (das funktioniert ja jetzt) und als Notizpapier verwenden). Man betrachte den Abschnitt, der mit <tscreen><verb> /* c_cflag bit meaning */ #define CBAUD 0000017 </verb></tscreen> anfängt. Dieses Abschnitt listet die Bedeutungen der <tt/fc#/- und <tt/fs#/- Teile auf. Es fällt auf, daß die Namen (nach den Baudraten) mit einer der stty-Ausgabeleitungen übereinstimmen. Es wird wirklich leicht... <p> Einige dieser Einstellungen fangen mit einem - in der stty-Ausgabe an. Wenn man alle diese Nummern aufsummiert (sie sind oktal), erhält man die Bits, die man löschen will. Also ist das die <tt/fc&num/-Einstellung. Natürlich setzt man diese Bits direkt nach dem Löschen, also kann man einfach `<tt/fc#0177777/' verwenden. <p> Jetzt macht man das gleiche für die Einstellungen, die kein - vor sich haben. In dem Beispiel sind die wichtigen CS8 (0000060), HUPCL (0002000), und CREAD (0000200). Man beachte auch die Flags für die Baudrate (z.B. 0000015). Man addiert alle zusammen und bekommt im Beispiel 0002275 heraus. Das kommt in die <tt/fs#/- Einstellung (`<tt/fs#02275/' funktioniert gut beim Autor). <p> Man macht das gleiche mit "set" und "clear" für den nächsten Anschnitt der Includedatei, <tt/"c_lflag bits"/. Der Autor mußte nichts einstellen und verwendet deshalb `<tt/xc#0157777/' und `<tt/xs#0/'. <sect1>Ältere serielle Drucker die Zeichen verschlucken <p> Jon Luckey hat festgestellt, daß einige ältere serielle Drucker mit 10-cent seriellen Interfaces und kleinen Buffern <em/wirklich/ Stopp meinen, wenn sie das mit ihrer Flußkontrolle sagen. Er fand heraus, daß man das abstellen kann, indem man an einer 16550er seriellen Schnittstelle mit <tt><htmlurl name="setserial" url="http://www.picante.com/~gtaylor/pht/man/setserial.html"></tt> den FIFO ausschalten (man muß scheinbar nur den UART-Typ als 8250 einstellen). <sect>Distributionsabhängige Lösungen <p> Dieser Abschnitt ist per Definition unvollständig. Details zu spezifischen Distributionen sind willkommen. <sect1>RedHat 2.x <p> RedHat hat ein GUI-Druckerverwaltungsprogramm, das Netzwerkdrucker und Drucker an lokalen Devices hinzufügen kann. Es erlaubt es, einen von PostScript unterstützten Druckertyp und eine UNIX-Device-Datei zu wählen und installiert dann eine Warteschlange in <tt>/etc/printcap</tt> und schreibt einen kleinen PostScript-und-ASCII Magic-Filter basierend auf <tt/gs/ und <tt>nenscript</tt> (<tt><htmlurl name="http://www.picante.com/~gtaylor/pht/man/nenscript.html" url="http://www.picante.com/~gtaylor/pht/man/nenscript.html"></tt>). Diese Lösung funktioniert ziemlich gut und ist für gewöhnliche Anforderungen leicht einzustellen. <sect1>Sonstige Distributionen <p> Der Autor bittet um Details, was andere Distributionen machen. <sect>Wie man einen Drucker über ein Netzwerk benutzt <p> Eine der Fähigkeiten von lpd liegt darin, daß man über ein Netzwerk auf Druckern drucken kann, die physikalisch an einen anderen Rechner angeschlossen sind. Mit einer vorsichtigen Kombination von Filterscripts und anderen Utilities kann man mit lpr transparent auf allen möglichen Druckern über alle möglichen Netzwerke drucken. <sect1>Auf einem UNIX/lpd Host <p> Um es anderen Rechnern zu ermöglichen, auf dem eigenen Drucker zu drucken, müssen diese in <tt>/etc/hosts.equiv</tt> oder <tt>/etc/hosts.ldp</tt> aufgelistet werden. Achtung: <tt/hosts.equiv/ hat viele weitere Effekte; man sollte sich sicher sein, was man tut, wenn man hier einen Rechner auflistet. Man kann auch nur bestimmten Benutzern des anderen Rechners erlauben, zu drucken. Dazu nutzt man das <tt/rs/-Attribut; siehe dazu <tt><htmlurl name="lpd" url="http://www.picante.com/~gtaylor/pht/man/lpd.html"></tt> man page. <sect1>Mit <tt>lpd</tt> <p> Um auf einem anderen Rechner zu drucken, erstelle man einen <tt>/etc/printcap</tt>-Eintrag wie diesen: <tscreen><verb> # NETZWERK djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :rm=geraet.da.draussen.com:\ :rp=printername:\ :lp=/dev/null:\ :sh: </verb></tscreen> Es gibt weiterhin ein Spool-Verzeichnis auf dem lokalen Rechner, das von <tt/lpd/ verwaltet wird. Wenn der Netzwerkrechner beschäftigt oder nicht erreichbar ist, bleiben Druckaufträge des lokalen Rechners in dem Spoolverzeichnis, bis sie gesendet werden können. <sect1>Mit <tt>rlpr</tt> <p> Man kann auch <tt>rlpr</tt> benutzen, um einen Druckauftrag direkt in eine Warteschlange auf einem Netzwerkrechner zu schicken, ohne sich die Mühe zu machen, lpd entsprechend einzurichten. Das ist besonders sinnvoll, wenn man nur selten auf vielen verschiedenen Druckern druckt. Aus der Ankündigung von <tt>rlpr</tt>: <p> Rlpr verwendet TCP/IP, um Druckaufträge an lpd-Server in einem Netzwerk zu schicken. <p> Anders als lpr müssen die Netzwerkdrucker dem lokalen Rechner nicht bekannt sein (z.B. durch <tt>/etc/printcap</tt>). Deshalb ist rlpr wesentlich flexibler und benötigt weniger Verwaltung. <p> rlpr kann überall da verwendet werden, wo ein traditionelles lpr verwendet werden kann und ist rückwärts-kompatibel zum traditionellen BSD lpr. <p> Der Hauptvorteil von lprl ist die Möglichkeit, *von überall nach überall* zu drucken, ohne Rücksicht darauf, wie das System, von dem aus man drucken will, konfiguriert ist. Es kann genau wie das traditionelle lpr wie ein Filter funktionieren, so daß Clients, die auf einem Netzwerkrechner laufen (z.B. Netscape, XEmacs, etc) ohne größere Probleme auf dem lokalen Rechner drucken können. <p> Rlpr ist erhältlich von <tt><htmlurl name="sunsite.unc.edu:/pub/Linux/system/Printing/" url="ftp://sunsite.unc.edu/pub/Linux/system/Printing/"></tt>. <sect1>Auf einem Win95, WinNT, LanManager oder Samba-Drucker <p> Es ist möglich, eine lpd-Warteschlange mit dem <tt><htmlurl name="smbclient" url="http://www.picante.com/~gtaylor/pht/man/smbclient.html"></tt>-Programm (ein Teil des Samba-Pakets) zu einem TCP/IP-basierenden SMB-Druckservice zu schicken. Dafür kommt mit Samba ein Script namens <tt/smbprint/. Kurz gesagt legt man eine Konfigurationsdatei für den gewünschten Drucker im Spoolverzeichnis an und installiert das <tt/smbprint/-Script als <tt/if/. <p> Der <tt>/etc/printcap</tt>-Eintrag sieht wie folgt aus: <tscreen><verb> lp|remote-smbprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lp:\ :if=/usr/local/sbin/smbprint: </verb></tscreen> <p> Man sollte die Dokumentation im <tt/smbprint/-Skript lesen, um weitere Informationen zu erhalten. <p> Man kann auch den <tt>smbclient</tt> verwenden, um eine Datei direkt an einen SMB-Druckservice zu schicken ohne <tt>lpd</tt> zu benutzen. Siehe Man-page. <sect1>Auf einem Netware-Drucker <p> Im ncpfs-Paket ist ein Programm namens <tt/nprint/, daß die gleichen Funktionen wie <tt/smbprint/ für NetWare hat. ncpfs ist erhältlich bei <htmlurl url="ftp://linux01.gwdg.de/pub/ncpfs/" name="linux01.gwdg.de:/pub/ncpfs/">. Aus dem LSM-Eintrag zur Version 0.16: <quote> With ncpfs you can mount volumes of your netware server under Linux. You can also print to netware print queues and spool netware print queues to the Linux printing system. You need kernel 1.2.x or 1.3.54 and above. ncpfs does NOT work with any 1.3.x kernel below 1.3.54. (Mit ncpfs kann man Laufwerke auf dem Netzwerk-Server unter Linux mounten. Man kann auch in Netware-Warteschlangen druchen und Netware-Warteschlangen in das Linux Drucksystem spoolen. Man benötigt Kernel 1.2.x oder 1.3.54 oder hoeher. ncpfs funktioniert NICHT mit 1.3.x-Kernels unter 1.3.54.) </quote> <p> Damit <tt/nprint/ über lpd arbeitet, schreibt man ein kleines Shellscript um stdin auf dem Netware-Drucker zu drucken und installiert es als <tt/if/ für eine lpd Warteschlange. Man erhält so etwas wie: <tscreen><verb> sub2|remote-NWprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/sub2:\ :if=/var/spool/lpd/nprint-script: </verb></tscreen> Das <tt>nprint-script</tt> könnte ungefähr so aussehen: <tscreen><verb> #! /bin/sh /usr/local/bin/nprint -S net -U name -P passwd -q printq-q - </verb></tscreen> <sect1> Auf einem EtherTalk- (Apple-) Drucker <p> Im netatalk-Paket ist etwas wie <tt/nprint/ und <tt/smbclient/ enthalten. Werner Eugster hat die Einstellungen, um auf einem Apple-Netzwerk zu drucken, besser beschrieben, als es der Autor je könnte, siehe seine Webseite (<tt> <htmlurl name="http://garnet.berkeley.edu/~weugster/appleprint.html" url="http://garnet.berkeley.edu/~weugster/appleprint.html"></tt>). <p> Obskure Warnung der Woche: Netatalk funktioniert nicht mit einer SMC Etherpower PCI-Karte mit einem DEC Tulip-Chip. <sect1>Auf einem HP oder anderem Ethernet-Drucker <p> HPs und einige andere Drucker haben ein Ethernet-Interface, auf dem man direkt mit lpd drucken kann. Man sollte den Anweisungen folgen, die mit dem Drucker oder Netzwerkadapter geliefert wurden, aber generell lassen solche Drucker lpd "laufen" und stellen eine oder mehrere Warteschlangen zur Verfügung. Ein HP zum Beispiel könnte mit einem solchem Printcap-Eintrag arbeiten: <tscreen><verb> lj-5|remote-hplj:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :rm=printer.name.com:rp=raw: </verb></tscreen> <p> In einem großen Netz, besonders einem großen Netz, in dem einige Drucker kein PostScript unterstützen, ist ein sinnvoll, einen Print-Server zu nutzen, auf dem alle Rechner drucken und auf dem alle Ghostscript-Jobs laufen. <sect2>Auf alten HPs <p> Einige Drucker unterstützen nur ein kleines "Nicht-Protokoll" mit reinen TCP-Verbindungen. Erwähnenswert in dieser Kategorie sind frühe JetDirect (und einige JetDirectEx) Karten. Grundsätzlich muß man zum Drucken auf diesen Drucker eine TCP-Verbindung zu dem Drucker auf einem bestimmten Port (typischerweise 9100) öffnen und den Druckauftrag hierdurch schicken. Das kann in Perl implementiert werden: <tscreen><verb> #!/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 "Kann Datei $fileName nicht oeffnen"; $dpi300 = "\x1B*t300R"; $dosCr = "\x1B&ero;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 $!; } # Gibt dem Socket eine Adresse if (bind(S, $this)) { # print "bind ok\n"; } else { die $!; } # Ruft den Server auf. if (connect(S,$that)) { # print "connect ok\n"; } else { die $!; } # Setzt Befehlspuffer fuer den Socket. select(S); $| = 1; select(STDOUT); # print S "@PJL ECHO Hi $hostname! $ends"; # print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends"; # print S $dpi300; # Durch Aufteilung Deadlock verhindern. 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; } </verb></tscreen> <sect1>Ein <em/if/ für Netzwerkdrucker <p> Eine Besonderheit von lpd ist, daß <tt/if/ für Netzwerkdrucker nicht aufgerufen wird. Wenn das nötig sein sollte, kann man eine doppelte Warteschlange einstellen und den Job an die zweite Warteschlange weitergeben: Beispiel für eine passende <tt/printcap/: <tscreen><verb> 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=printer.name.com:\ :rp=raw:sd=/var/spool/lpd/lj-5-raw: </verb></tscreen> mit diesem <tt/filter-lj-5/-Script: <tscreen><verb> #!/bin/sh gs <options> -q -dSAFER -sOutputFile=- - | \ lpr -Plj-5-remote -U$5 </verb></tscreen> <p> Die <tt/-U/-Option bei lpr funktioniert nur, wenn lpr als ein Daemon gestartet wurde und setzt den Namen des Auftraggebers in der weitergegebenen Warteschlange. Man sollte eventuell eine robustere Methode verwenden, um den Usernamen zu ermitteln, denn manchmal ist es nicht Argument 5. Siehe auch die Man-page zu <tt><htmlurl name="printcap" url="http://www.picante.com/~gtaylor/pht/man/printcap.html"></tt>. <sect>Wie man auf einem Faxgerät druckt <sect1>Mit einem Faxmodem <p> Es gibt einige Faxprogramme, mit denen man faxen und Dokumente empfangen kann. Eines der komplexesten ist Sam Lefflers <em/HylaFax/, erhältlich von <tt><htmlurl url="ftp://ftp.sgi.com" name="ftp.sgi.com"></tt>. Es unterstützt alle möglichen Funktionen von mehreren Modems bis Ausstrahlung. <p> Es gibt auch eine bessere Wahl für die meisten Linuxboxen: <tt><htmlurl name="efax" url="http://www.picante.com/~gtaylor/pht/man/efax.html"></tt>. Das ist ein einfaches Programm, das Faxe sendet. Das getty-Programm <tt/mgetty/ kann Faxe empfangen (und sogar Sprache mit einigen Modems!). <sect1>Mit dem Remote Printing Service <p> Es gibt einen experimentellen Dienst, an den man eine eMail senden kann, die dann irgendwo anders auf einem Faxgerät erscheint. Es werden Formate wie PostScript unterstützt, so daß es ein sehr sinnvoller Dienst ist, obwohl die globale Unterstützung sehr lückenhaft ist. Für weitere Informationen siehe die FAX-FAQ (<tt><htmlurl url="http://www.town.hall.org/fax/faq.html" name="http://www.town.hall.org/fax/faq.html"></tt>). <sect>Wie man etwas Druckbares herstellt. <p> Hier kommt man in ein wahres Rattennest an Software. Grundsätzlich kann man vier Typen von Binärdateien mit unterschiedlichem Erfolg laufen lassen: Linux, iBCS, Win16/Win32s (mit dosemu und irgendwann mit Wine) und Mac/68k (mit Executor). Hier werden nur reine Linux und UNIX-Programme behandelt, aber man sollte erwähnen, daß WordPerfect für SCO und sehr wahrscheinlich weitere kommerzielle Textverarbeitungsprogramme gut unter Linux iBCS-Emulation laufen. <p> Für Linux selbst ist man auf die für UNIX generell erhältlichen Programme beschränkt: <sect1>Formatierungssprachen <p> Die meisten Formatierungssprachen sind am besten für große oder sich wiederholende Projekte geeignet, in denen man dem Computer die Kontrolle über das Layout überlassen möchte, damit alles einheitlich aussieht. Ein schönes Zeichen in einer Formatierungssprache könnte schmerzhaft sein... <p> <descrip> <tag><tt>nroff</tt></tag> Diese war eine der ersten Formatierungssprachen für UNIX. Man-pages sind das häufigste Beispiel für Texte, die mit *roff-Makros formatiert wurden; einige Leute schwören darauf, aber nroff hat für den Autor die geheimnisvollste Syntax und ist deshalb wohl die schlechteste Wahl für neue Texte. Man sollte aber trotzdem wissen, daß man eine Man-page mit groff direkt nach PostScript konvertieren kann. Die meisten man-Befehle machen das mit <tt/man -t foo | lpr/. <tag/TeX/ TeX und das Makropaket LaTeX gehören zu den am häufigsten verwendeten Formatierungssprachen auf UNIX. Technische Werke werden häufig in LaTeX geschrieben, denn es vereinfacht die Layoutfragen stark und ist <em/weiterhin/ eines der wenigen Textverarbeitungssystemen, daß mathematische Aspekte komplett und gut unterstützt. Die Ausgabe von TeX ist <tt/dvi/ und kann mit <tt/dvips/ oder <tt/dvilj/ nach PostScript oder Hewlett Packards PCL konvertiert werden. <tag/SGML/ Es gibt mindestens einen freien sgml-Parser für Unix und Linux; es bildet die Basis von Linuxdoc-SGMLs selbst entwickelten Dokumentensystem. Es kann auch andere DTDs unterstützen. <tag/HTML/ Jemand hat vorgeschlagen, einfache Projekte in HTML zu schreiben und mit Netscape auszudrucken. Der Autor widerspricht dem. </descrip> <sect1>WYSIWYG <p> Es gibt sehr wenige WYSIWYG-Textverarbeitungsprogramme. Weitere Programme sind immer gefragt, und man möge den Autor auf jegliche Auslassungen hinweisen. <descrip> <tag/Lyrix/ Lyrix ist ein Frontend für LaTeX, das vielversprechend aussieht. <tag/Das Andrew User Interface System/ AUIS beinhaltet <tt/ez/, ein WYSIWYG-artiges Editor mit sehr grundlegenden Textverarnbeitungsfähigkeiten, HTML und vollem MIME eMail und Newsgroup-Unterstützung. <tag/Kommerzielle Angebote/ Zumindest Caldera und Red Hat beeinhalten Pakete mit den üblichen Office-Anwendungen wie eine WYSIWYG-Textverarbeitung und eine Tabellenkalkulation. Der Autor nimmt an, daß sie sehr gut funktionieren, hat sie aber noch nie benutzt. Er nimmt an, daß Caldera auch Sun's WABI vertreibt, so daß man vielleicht etwas wie MS Office laufen lassen kann, wenn man mit den Dateien anderer Leute arbeiten muß. Jeff Phillips (<tt><htmlurl name="jeff@I_RATUS.org" url="mailto:jeff@I_RATUS.org"></tt>) verwendet Caldera's WordPerfect für Linux (auf Slackware) und sagt, daß es gut funktioniert. Es besitzt anscheinend eingebaute Druckerunterstützung, wie zu erwarten war. Caldera sollte mehr Informationen unter <tt><htmlurl url="http://www.caldera.com/" name="http://www.caldera.com/"></tt> haben. <p> RedHat vertreibt ein Paket namens <em/Applixware/; ihre Website ist unter <tt><htmlurl url="http://www.redhat.com/" name="http://www.redhat.com"></tt> zu erreichen. <p> Sonstige Verkäufer werden gebeten, den Autor über ihre Produkte zu unterrichten. </descrip> <sect>Ghostscript. <p> Ghostscript ist ein unheimlich wichtiges Programm für das Drucken unter Linux. Die meisten Druckprogramme unter Linux erzeugen PostScript, was normalerweise eine 150-450-DM-Option für Drucker ist. Ghostscript ist allerdings kostenlos und kann aus PostScript die jeweilige Druckersprache erzeugen. Wenn es mit dem <tt/lpd/-Inputfilter zusammengebracht wird, erzeugt es einen virtuellen PostScript-Drucker und vereinfacht das Leben immens. <p> Es gibt zwei Arten von Ghostscript. Die kommerzielle Version, Aladdin Ghostscript, darf kostenlos für den privaten Gebrauch verwendet werden, aber nicht in kommerziellen Linux-Distributionen vertrieben werden. Es ist normalerweise dem freien Ghostscript etwa ein Jahr voraus; im Moment unterstützt Aladdin Ghostscript zum Beispiel das Portable Document Format vom Adobe Acrobat, was die älteren Ghostscripts nicht machen. <p> Die freie Version von Ghostscript ist GNU Ghostscript, einfach eine ältere Version von Aladdin Ghostscript, freundlicherweise GNU überlassen. (Ehre an Aladdin für dieses Verfahren; mehr Softwareverkäufer sollten freie Software so unterstützen). <p> Ghostscripts Hauptnachteil sind seine Schriftarten, die aus Bitmap-Scans der Zeichen erstellt wurden. Bessere, aber kommerziell lizensierte Schriftarten können aus mehreren Quellen erhalten werden, da Ghostscript Type 1 Adobe Fonts lesen kann. Adobe vertreibt lesbare Schriftarten mit ihren Acrobat PDF-Leser, oder man kann die Schriftarten von Adobes ATM oder einem Fontpack nutzen. <p> Was auch immer man mit <tt><htmlurl name="gs" url="http://www.picante.com/~gtaylor/pht/man/gs.html"></tt> macht, man sollte es immer mit der Option zum Verhindern von Dateizugriffen (<tt/-dSAFER/) starten. PostScript ist eine komplett funktionale Sprache und ein schlechtes PostScript-Programm kann ziemliche Kopfschmerzen verursachen. <sect1>Die Ausgabe von Ghostscript verbessern <p> Man kann einige Sachen machen, wenn gs' Ausgabe nicht zufriedenstellend ist (man kann wirklich alles machen, was man will, man hat ja den Quelltext). <sect2>Position der Ausgabe und Größe <p> Die Position, Größe und Vergrößerung einer Seite wird durch die drucker-spezifischen Treiber in Ghostscript kontrolliert. Wenn die Seiten zu kurz oder zu lang, oder um den Faktor Zwei zu groß sind, könnte man in das Quellmodul des Treibers schauen und alle Parameter, die einem auffallen, anpassen. Leider ist jeder Treiber anders, deswegen gibt es keine Anleitung, was einzustellen ist, aber die meisten sind vernünftig kommentiert. <sect2>Gamma, Punktgrößen, etc. <p> Die meisten nicht-Laserdrucker leiden darunter, daß ihre Punkte ziemlich groß sind. Dadurch erscheinen die Bilder zu dunkel. Wenn man das feststellt, sollte man seine eigene Übertragungsfunktion nutzen. Man erstellt einfach die folgende Datei im Ghostscript-lib-Verzeichnis und fügt den Namen zum gs-Aufruf direkt vor der eigentlichen Datei ein. Die eigentlichem Werte müssen dem eigenen Drucker angepaßt werden. Niedrigere Werte erzeugen einen helleren Druck. Besonders wenn der Treiber einen Floyd-Steinberg-Algorithmus verwenden, um Farben zu rastern, sollten niedrige Werte (0.2 - 0.15) verwendet werden. <tscreen><verb> ---8<---- gamma.ps ----8<--- %! %Uebersetzungsfunktionen fuer Cyan Magenta Gelb Schwarz {0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer ---8<------------------8<--- </verb></tscreen> <p> Es ist auch möglich, Drucker, die einen Farbfehler haben, zu reparieren, indem diese Werte verändert werden. Wenn man etwas derartiges versucht, sollte man die Datei <tt>colorcir.ps</tt>, die mit Ghostscript kommt (im examples-Verzeichnis) als Testseite verwenden. <sect>Voransicht von druckbaren Sachen auf dem Bildschirm <p> Fast alles Druckbare kann auch auf dem Bildschirm betrachtet werden. <sect1>PostScript <p> Ghostscript besitzt einen X11-Treiber, der am besten unter der Verwaltung des PostScript-Vorbetrachters <htmlurl name="Ghostview" url="http://www.picante.com/~gtaylor/pht/man/ghostview.html"> verwendet wird. Die neuesten Versionen dieser Programme sollten auch PDF-Dateien betrachten können. <sect1>TeX dvi <p> TeX DeVice-Independant-files (geräteunabhängige Dateien) können unter X11 mit <htmlurl name="xdvi" url="http://www.picante.com/~gtaylor/pht/man/xdvi.html"> betrachtet werden. Moderne Versionen von xdvi rufen Ghostscript auf, um PostScript-Spezialitäten zu verarbeiten. <p> Es gibt ebenfalls einen VT100-Treiber. Er wird <tt/dgvt/ genannt. <tt/Tmview/ arbeitet mit Linux und svgalib, falls das alles ist, was funktioniert. <sect>Credits <p> Die Informationen über <tt/smbprint/ sind aus einem Artikel von Marcel Roelofs (<tt><htmlurl name="marcel@paragon.nl" url="mailto:marcel@paragon.nl"></tt>). <p> Die Informationen über <tt/nprint/, um NetWare-Drucker zu verwenden, wurde von Michael Smith (<tt><htmlurl name="mikes@bioch.ox.ac.uk" url="mailto:mikes@bioch.ox.ac.uk"></tt>) zur Verfügung gestellt. <p> Der Abschnitt "Serielle Drucker und lpd" ist von Andrew Tefft (<tt><htmlurl name="teffta@engr.dnet.ge.com" url="mailto:teffta@engr.dnet.ge.com"></tt>). <p> Der Teil über gammas und soweiter für gs wurde eingeschickt von Andreas (<tt><htmlurl name="quasi@hub-fue.franken.de" url="mailto:quasi@hub-fue.franken.de"></tt>). </article>