statusdict begin /manualfeed true def endDieser Befehl galt bereits 1985, als Apple den ersten LaserWriter auf den Markt brachte.
Die statusdict-Operatoren sind in EPS-Files verboten, da sie geräteabhängig und somit nur beschränkt austauschbar sind. Adobe Systems schreibt auf Seite 743 des Reference-Manuals:
%!PS-Adobe-2.0
%%Pages: 1
%%Title: fontlist.ps
%%EndComments
% FontList.ps : list all defined fonts onto printer
% Send this file to Laser with lpr program
% in order to print listing
/left 36 def % links oben fuer Ausdruck
/top 700 def
/psize 12 def % Schriftgroesse und...
/spacing psize 2 add def % ...Abstand
/s { show } def
/nl { currentpoint exch pop left exch
spacing sub moveto } def
/s40 40 string def
/lsfonts {
FontDirectory % Dictionary
{ pop
s40 cvs s nl
} forall
} def
/Helvetica findfont psize scalefont setfont
left top moveto
lsfonts
nl
(Total memory: ) s
vmstatus s40 cvs s nl % 1.Wert von vmstatus
(Memory used: ) s
s40 cvs s nl % 2.Wert
pop % 3.Wert
(Free memory: ) s
vmstatus exch sub s40 cvs s nl % total - used
pop
showpage % Seite drucken
Das Dictionary FontDirectory enthält für alle Fonts, die sich im VM-Speicher befinden, die beiden Einträge Fontname und Font-Dictionary. Der Operator cvs wandelt den Namen in eine Zeichenkette um. Das Programm druckt alle Fontnamen des Font-Verzeichnisses aus, ausser Namen von Fonts, die eventuell auf dem Drucker-Harddisk abgelegt sind. Demgegenüber findet der Operator findfont einen Font auch auf dem Plattenspeicher. Der Befehl vmstatus liefert drei Objekte auf den Stack, wovon uns nur der maximale Speicherplatz (total memory) und der verbrauchte Speicherplatz (used) interessieren. Das dritte Objekt wird mit pop vernichtet. Die Differenz zwischen maximum und used ergibt den freien Speicherplatz.
Viele Laserdrucker bieten mindestens die 35 Standard-Fonts des Apple LaserWriter an:
%!PS-Adobe-2.0 Query
%%Title: sample query job
%%?BeginFontQuery: Palatino-Roman
/Palatino-Roman
dup FontDirectory exch known {
1 % ja
}{
0 % nein
} ifelse
== % Resultat an Host senden
flush pop
%%?EndFontQuery
%%?BeginVMStatus
vmstatus exch sub == % Resultat an Host senden
flush pop
%%?EndVMStatus
In diesem Beispiel erwarten wir zwei Antworten des Druckers:
Die Vorgaben für die Dokumentstruktur von Adobe Systems (DSC 3.0) enthalten besondere Kommentare, die mit "%%?" beginnen. Diese Kommentare, die von einem Druckmanager ausgewertet werden könnten, besagen, dass der Drucker an den Host eine Rückmeldung liefert. Wünschbar ist, dass ein Kommando wie
fontloader Universerst mal kontrolliert, ob der Font nicht schon im Drucker ist. Bei der Operation Download Fonts to Non-NeXT PostScript Printers tut dies der FontInstaller von Adobe Systems leider nicht.
%!PS-Adobe-2.0 %%BeginFeature: statusdict begin true setduplexmode end %%EndFeatureDieser statusdict-Befehl sorgt dafür, dass alle Seiten des Jobs zweiseitig bedruckt werden. Die Erfahrung zeigt, dass dadurch auch die Wahrscheinlichkeit eines Papierstaus steigen kann.
%!PS-Adobe-2.0 %%BeginFeature: *PaperSize A3 statusdict begin 2 setpapertray end %%EndFeatureDieser Spezialbefehl kann als Vorspann an einen QMS-Drucker oder an andere Seitendrucker mit A3-Kassette gesandt werden. Wie gesagt, ist dieser Befehl nur für einen einzelnen Job wirksam. Vorzuziehen -- da Device-independent -- ist allerdings:
%!PS-Adobe-2.0 %%BeginFeature: *PaperSize A3 statusdict a3 end %%EndFeatureMerken Sie sich, dass die druckerabhängigen Befehle immer von "statusdict begin" "end" geklammert sind. Zusätzlich enthalten die Beispiele die Kommentare "%%BeginFeature:" und "%%EndFeature".
%!PS Passwort serverdict begin 0 exitserver statusdict begin 0 9 setpassword % Passwort alt neu endDer PostScript-Interpreter bestätigt das richtige Passwort mit der Meldung
"[exitserver: permanent state may be changed]".
Darauf kann ein statusdict-Befehl abgesetzt werden, z.B. setpassword, setdefaulttimeouts, usw. Das obige Beispiel setzt das neue Passwort auf 9.
Das nächste Beispiel ruft den Operator setdefaulttimeouts auf:
%!PS Timeouts in Sekunden serverdict begin 9 exitserver % Passwort statusdict begin 0 60 60 setdefaulttimeouts %job manualfeed timeout endDer Befehl setdefaulttimeouts gibt die Anzahl Sekunden für den Jobtimeout an, d.h. wie lang ein Druckjob höchstens dauern darf. Dieser Operator hat drei Parameter.
Die erste Zahl ist der Jobtimeout-Parameter, der in Sekunden angibt, wie lang ein Druckjob höchstens dauern darf. Die zweite Zahl ist der Manualfeed-Timeout, der in Sekunden angibt, wie lang der Drucker höchstens auf die manuelle Papiereingabe durch den Benutzer warten soll. Die dritte Zahl ist der Wait-Timeout, der in Sekunden angibt, wie lang der Drucker höchstens auf die Fortsetzung eines unterbrochenen PostScript-Datenstroms wartet, bevor er den Druckjob abbricht.
Im Laserdrucker festgesetzte Default-Werte: 0 60 30 -- also beliebig lang, Manualfeed 60 Sekunden, Wait 30 Sekunden. Im Beispiel haben wir den Jobtimeout auf 0 gesetzt; keine Angst, Null hat eine besondere Bedeutung! Es bedeutet nicht 0 Sek., sondern beliebig lang.
Einige weitere statusdict-Befehle, die permanente Parameter setzen:
Sehen Sie hier noch ein Beispiel für das Einstellen der Uebertragungsparameter für einen seriell angeschlossenen Laserdrucker:
%!PS serieller Anschluss serverdict begin 0 exitserver % Passwort statusdict begin % Achtung: 19200 baud, parity none, DTR 25 19200 7 setsccbatch endDieser Drucker kommuniziert mit einer Baudrate von 19200 Bits/sek., ohne Parität, Flusskontrolle mit "Data-Terminal-Ready".
Wenn Sie wollen, können Sie die handleerror-Prozedur umdefinieren:
%!PS Fehlerbehandlung
serverdict begin
9 exitserver % Passwort
errordict begin % Dictionary
/handleerror {
.... Ihre Definition, z.B. Meldung ausdrucken ....
(siehe error.ps)
} def
end % Ende Dictionary
Da wir die Server-Schleife mit exitserver verlassen haben, bleiben unsere Definitionen bis zum Ausschalten des Druckers erhalten. Das Fehler-Dictionary enthält einige Einträge: der Eintrag errorname gibt die Art des Fehlers an, der Eintrag command den Ort des Fehlers. Die Variable "errorname" gibt somit z.B. "nocurrentpoint" oder "stackunderflow" an.Rückmeldung, falls falsches Passwort angegeben:
"[Error: PasswordIncorrect; OffendingCommand: exitserver]".
Die Default-Version von handleerror liefert die Fehlermeldung an den Host zurück, druckt jedoch nichts aus. In einem Stapelbetrieb ist es meist wünschenswert, die Fehlermeldungen auf Papier auszudrucken.
Tip:
Was tun, wenn der Drucker weder Fehlermeldung noch Ausdruck liefert? Neben dem fehlenden showpage-Operator gibt es noch andere Ursachen. Häufig liegt der Fehler darin, dass eine Grafik ausserhalb des Druckbereichs liegt, z.B. im negativen Bereich, sodass der Drucker lediglich ein weisses Blatt ausspuckt. In diesem Fall können Sie versuchen, die Abbildung mittels translate wieder in den Druckbereich zu verschieben ("x y translate" vor der Seitenbeschreibung einfügen).
%!Achtung: PostScript job onto disk
/StartTempFile (/usr/myjob)(w) file def
/buffer 1024 string def
/storefile {
{currentfile buffer readstring
pop dup length 0 eq
{pop StartTempFile closefile exit}
{StartTempFile exch writestring}
ifelse
} loop % Schleife
} def
storefile
... Ihr PS-Job ...
Das PostScript-Programm verwendet für die Ablaufkontrolle den Operator loop. Während readstring von currentfile liest, schreibt writestring auf das Disk-File. Die Eingabe/Ausgabe erfolgt in Blöcken von 1024 Zeichen. Auf einem eingebauten Harddisk legt man/frau mit Vorliebe sogenannte Bootjobs ab, d.h. PostScript-Jobs, die beim Aufstarten des Druckers ausgeführt werden. Das nächste PostScript-Utility dient dazu, alle Font-Cache-Dateien zu löschen. Der Drucker-Kontroller legt diese Dateien auf dem Plattenspeicher ab, um die Druckausgabe zu beschleunigen. Es ist empfehlenswert, das Fontcache bei sehr langer Wartezeit beim Booten sowie vor dem Installieren eines neuen Fonts zu löschen.
%!Achtung: Loeschen des Fontcache
serverdict begin
9 exitserver % Passwort
(FC/*)
{dup print flush deletefile
} 100 string
filenameforall % fuer alle Files
Der neue Operator filenameforall ruft für alle Files im Verzeichnis "FC" den Operator deletefile auf. Dieses Dienstprogramm ist nicht für jedermann, sondern für den Administrator gedacht. Um ein Verzeichnis aller auf der Festplatte abgelegten Files zu erhalten, kann ebenfalls der Operator filenameforall aufgerufen werden. Beispiel:
...
(*)
{show newline
} 100 string
filenameforall % fuer alle Files
Das Wildcard-Zeichen Stern (*) steht für "alle Filenamen". << /PageSize [792 1224] >> setpagedeviceDie Grössenangaben erfolgen in typografischen Punkten. Die Kennung "<< ... >>" ist eine neue Syntax in PostScript Level 2, d.h. generiert bei Level 1 eine Fehlermeldung. Und hier DIN A4:
%%BeginFeature: *PageSize A3 << /PageSize [842 1191] >> setpagedevice %%EndFeatureDer Operator setpagedevice dient bei PS Level 2 und 3 generell dazu, Hersteller-abhängige Parameter festzulegen.