Warning: virtual() [function.virtual]: Unable to include '/includes/header1.html' - request execution failed in /usr/local/info-sys/www/id/publications/ps/PSeinfach.php on line 18
Uni Zürich  

PostScript | Abfrage Operatoren (cgi) | Abfrage Operatoren (php)

Ein paar einfache PostScript-Beispiele

PostScript examples (in German)

Der PostScript-Programmierer muss unbedingt mit dem Operanden-Stack, dem Koordinatensystem, dem grafischen Status und dem Dictionary vertraut sein. Haben Sie die Einführung Die PostScript-Sprache (13 Seiten, pdf, fünf Abbildungen) schon gelesen?

  1. Die deutsche Flagge
  2. Text drucken
  3. Firmensignete und Logos
  4. Der Operator forall
  5. Rechteck-Operatoren
  6. Die Strichstärke
  7. Weitere Themen

1. Die deutsche Flagge

FLAGGE

Wenn wir einen geschlossenen Pfad gebildet haben, können wir die Fläche mit einer Farbe füllen (area filling). Dazu dient die Kombination der Operatoren setrgbcolor und fill. Wir zeichnen die deutsche Flagge, indem wir die drei Balken mit je einer anderen Farbe bzw. Farbmischung versehen. Die drei Operanden von setrgbcolor müssen alle im Bereich von 0 bis 1 liegen, der erste Operand gibt den Rot-Anteil, der zweite den Grün-Anteil und der dritte den Blau-Anteil. Die gelbe Farbe kann beispielsweise mit "1 1 0 setrgbcolor" erzeugt werden.

Voraussetzung für das Arbeiten mit setrgbcolor ist der Zugang zu einem PostScript-Gerät, das farbig drucken kann. Ein Schwarz/Weiss-Drucker wandelt die Farben allerdings in entsprechende Graustufen um!

Die deutsche Flagge.

%!PS-Adobe-2.0 EPSF-2.0 
%%Title: fill.ps
%%BoundingBox: 100 100 330 250
%%EndComments
% Modell RGB
% Farben rot-gruen-blau
 
100 100 translate
 
 newpath
 	0 0 moveto
 	230 0 lineto
 	230 50 lineto
 	0 50 lineto
 closepath 					% Pfad schliessen
 1 1 0 setrgbcolor 				% gelb
 fill 						% fuellen
 
 newpath
 	0 50 moveto
 	230 50 lineto
 	230 100 lineto
 	0 100 lineto
 closepath 					% Pfad schliessen
 1 0 0 setrgbcolor 				% rot
 fill 						% fuellen
 
 newpath
 	0 100 moveto
 	230 100 lineto
 	230 150 lineto
 	0 150 lineto
 closepath 					% Pfad schliessen
 0 0 0 setrgbcolor				% schwarz
 fill 						% fuellen
 
 
showpage
 
%%Trailer
PostScript unterstützt nicht nur das additive RGB-Farbmodell, sondern u.a. auch das subtraktive CMYK-Modell. Der entsprechende Operator nennt sich setcmykcolor. Die vier Buchstaben bedeuten:
C =
cyan = blau,
M =
magenta = anilinrot,
Y =
yellow = gelb,
K =
black = schwarz.
Siehe auch PostScript Level 2 (Color PostScript).

Hausaufgabe: modifizieren Sie das obige Programm für die österreichische Flagge.

2. Text drucken (Beispiel Zapf Dingbats)

Alle PostScript-Drucker und Satzmaschinen kennen mindestens 13 Standard-Fonts. Bei den Standard-Fonts handelt es sich um Times normal, kursiv, fett und fett-kursiv; Helvetica normal, kursiv, fett und fett-kursiv; Courier normal, kursiv, fett und fett-kursiv, und um den Symbol Font. Seit 1988 haben die meisten Drucker mindestens 35 eingebaute Fonts; dazu zählt auch der Font Zapf Dingbats im Beispiel.

Die Adobe Type Bibliothek enthält jedoch eine grosse Zahl weiterer Schriften, so zum Beispiel: Palatino, Garamond, Korinna, Letter Gothic, Helvetica Condensed, Sonata (für Musiknoten), usw. usw.

Der Font Zapf Dingbats.

Die Prozedur showline hat zwei Funktionen:

  1. Zeile drucken mit show
  2. vertikale Bewegung an den Anfang der nächsten Zeile
Die Variable lineskip ist negativ, da wir von oben nach unten gehen. Der PostScript-Operator scalefont in der Prozedur ScaleTo zeigt, wie ein Font in beliebigen Schriftgrössen angesteuert werden kann. Während der Operand von ScaleTo bzw. von scalefont positiv ist (die Schriftgrösse), versieht der Operator neg diesen Wert mit dem negativen Vorzeichen, und der negative Wert wird dann der Variablen lineskip zugewiesen.

Ausser showline und ScaleTo definieren wir keine weiteren Prozeduren.

%!PS Sample
%%DocumentFonts: ZapfDingbats
 
/showline { 
		gsave show grestore 0 lineskip rmoveto}
		def
/ScaleTo {
 		dup neg /lineskip exch def
 		/ZapfDingbats findfont exch scalefont
		setfont } def
%%EndProlog

% Schrift in Punktgroesse 60:
60 ScaleTo
% gehe auf der Seite nach oben:
36 700 moveto
 
(ABCDEFGHIJKLM) showline % Zeile drucken
(NOPQRSTUVWXYZ) showline
(abcdefghijklm) showline
(nopqrstuvwxyz) showline
(à1234567890-=) showline   
(~!@#$%^&*()_+) showline
([]\{}|;':",./<>?) showline
( ) showline
 
% Punktgroesse reduzieren:
24 ScaleTo
(The quick brown fox jumps over the lazy dog. 0123456789)
showline % Zeile drucken
18 ScaleTo
(The quick brown fox jumps over the lazy dog. 0123456789)
showline
12 ScaleTo
(The quick brown fox jumps over the lazy dog. 0123456789)
showline
6 ScaleTo
(The quick brown fox jumps over the lazy dog. 0123456789)
showline
 
/showline { gsave show grestore 0 -12 rmoveto } 
		def
/Times-Roman findfont 12 scalefont setfont
/s40 40 string def
( ) showline % Leerzeile
(Total memory: ) showline
vmstatus s40 cvs showline % 1.Wert von vmstatus
(Memory used: ) showline
s40 cvs showline pop % 2.Wert von vmstatus
( Free memory: ) showline
vmstatus exch sub s40 cvs showline 
						% 1.Wert - 2.Wert
pop
 
showpage
Siehe auch Font-Darstellung, Zeichenbeschreibung.

3. Firmensignete und Logos

Die Seitenbeschreibungssprache PostScript eignet sich auch dazu, Logos oder Firmensignete zu konstruieren. Das Beispiel BOZEN illustriert die Integration von Text und Grafik. Wir konstruieren je eine Prozedur zum Zeichnen der Berge und der Sonne und zum Drucken des Textes.

BOZEN-Logo Version 0

Als Schrift wählen wir "Helvetica fett" in einer Grösse von 24 Punkt. Der definierte Operator fourpops dient lediglich dazu, vier überflüssige Objekte auf dem Stack zu vernichten. Diese vier Objekte werden von arcto erzeugt.

Der Operator fill füllt wiederum den aktuellen Pfad mit einer Farbe auf. Der Operator stringwidth gibt die Länge des Strings (Zeichenkette, Schriftzug) zurück. Position des String-Anfangs = (108-Länge)/2. Diese Formel sorgt dafür, dass der String "BOZEN" schön zentriert wird.

Das Logo BOZEN

%!PS-Adobe-2.0 EPSF-2.0
%%Title: (Logo, Version 0)
%%BoundingBox: 288 99 398 200
%%DocumentFonts: Helvetica-Bold
%%EndComments

/Helvetica-Bold findfont 24 scalefont setfont
/fourpops
 		{4 {pop} repeat} def
 
/berge
		{ 0 setgray 				% schwarz
 		0 18 moveto
 		10 72 lineto 30 62 lineto
 		60 72 lineto 108 36 lineto
 		108 0 0 0 18 arcto fourpops
 		0 0 0 72 18 arcto fourpops
 		fill } def
 
/sonne
		{ newpath .6 setgray 			% grau
 		91 55 18 0 360 arc fill
		} def
 
/text
		{ 1 setgray 				% weiss
 		0 -1 moveto
 		(BOZEN) stringwidth pop
 		108 exch sub 2 div
 		0 rmoveto
 		(BOZEN) show } def
%%EndProlog
 
% Jetzt folgt das Script:
 
288 100 translate
sonne
berge
text
showpage

BOZEN-Logo Version 1

In einer anderen Version des Programms wandeln wir das Beispiel leicht ab, indem wir die Schriftzeichen bei konstanter Breite höher machen. "1 2 scale" lautet der zusätzliche Befehl, die Breite wird mit 1, die Höhe mit 2 multipliziert. Den gleichen Effekt hätten wir auch mit dem Operator makefont erzielen können. Der Operator "24 scalefont" müsste lediglich durch "[24 0 0 48 0 0] makefont" ersetzt werden.
%!PS-Adobe-2.0 EPSF-2.0
%%Title: (Logo, Version 1)
%%BoundingBox: 288 99 398 200
%%DocumentFonts: Helvetica-Bold
%%EndComments

/Helvetica-Bold findfont 24 scalefont setfont
/fourpops
 		{4 {pop} repeat} def
 
/berge
		{ 0 setgray 				% schwarz
 		0 18 moveto
 		10 72 lineto 30 62 lineto
 		60 72 lineto 108 36 lineto
 		108 0 0 0 18 arcto fourpops
 		0 0 0 72 18 arcto fourpops
 		fill } def
 
/sonne
		{ newpath .6 setgray 			% grau
 		91 55 18 0 360 arc fill
		} def
 
/text
		{ 1 setgray 				% weiss
 		0 -1 moveto
 		1 2 scale 				% Zeichen hoeher machen
 
 		(BOZEN) stringwidth pop
 		108 exch sub 2 div
 		0 rmoveto
 		(BOZEN) show } def
%%EndProlog
 
288 100 translate
sonne
berge
text
showpage
Nachdem der Operator translate den Ursprung des Koordinatensystems verschoben hat, ruft das Script der Reihe nach die Routinen sonne, berge und text auf.

Das Logo BOZEN mit hohen Schriftzeichen

Integration von Text und Grafik bedeutet nicht nur das Mischen von Text- und Grafik-Elementen, sondern auch das Einbeziehen und Abwandeln von typografischem Material (es muss nicht immer Helvetica sein). Beispiel Weinflasche (gif).

4. Der Operator forall

ORGELKONZERT Der Operator forall zählt alle Elemente eines Zahlenvektors, d.h. eines Arrays, auf. In unserem Beispiel sind die einzelnen Buchstaben von "ORGELKONZERT" die Vektorelemente. Innerhalb der Schleife wird der aktuelle Buchstabe der Variablen buchstabe zugewiesen (/buchstabe exch def). Die Schriftgrösse wird bei jedem Durchgang um einen Punkt reduziert. Die Zeile "ps ps 1 sub def" bewirkt, dass der erste Buchstabe von "ORGELKONZERT" in der Grösse von 24 Punkt, der zweite Buchstabe in 23 Punkt, der dritte Buchstabe in 22 Punkt, usw. gesetzt wird.

Der Operator show, der sich ebenfalls innerhalb der Schleife befindet, setzt Buchstabe um Buchstabe. Der Operator showpage gibt das bedruckte Blatt letztendlich aus.

%!PS-Adobe-2.0 EPSF-2.0
%%DocumentFonts: Times-Roman
%%Title: forall.ps
%%BoundingBox: 96 100 240 160 
%%EndComments

/ps 25 def % Schrifthoehe (point size)
/T /Times-Roman findfont def
%%EndProlog
 
100 100 translate
 20 rotate 				% alles um 20 Grad drehen
 0 0 moveto
 
% Jetzt folgt die forall-Schleife:
 
[(O)(R)(G)(E)(L)(K)(O)(N)(Z)(E)(R)(T)]
 {
 		/buchstabe exch def
 		/ps ps 1 sub def
 		T ps scalefont setfont
 		buchstabe show
 } forall % Ende der Schleife
 
 showpage
 
%%Trailer
ORGELKONZERT mit dem Operator forall.

5. Rechteck-Operatoren

Rechtecke sind ein häufiges Gestaltungselement. Betrachten wir deshalb, wie man einen Rahmen mit Schatten zeichnet. Wir lösen das Problem mit einer wiederverwendbaren Prozedur:
 
% x y w h rect -
/rect {
	/h exch def	% Hoehe
	/w exch def	% Breite
	/y exch def	% Y-Position
	/x exch def	% X-Position
	x y moveto
	w 0 rlineto 0 h rlineto w neg 0 rlineto
	closepath
} def

gsave
	.6 setgray
	9 -9 translate
	50 550 500 200 rect fill	% Schatten
grestore

gsave
	1 setgray
	50 550 500 200 rect fill	% Hintergrund weiss
	0 setgray
	50 550 500 200 rect stroke	% Umriss schwarz
grestore
 
showpage 
Abbildung: Rahmen mit Schatten.

Wie der Name rect sagt, baut die Prozedur rect einen Rechteck-Pfad auf. Dabei geben x und y die untere linke Ecke an, und w und h die Breite und Höhe des Rechtecks. Die Sequenz moveto-rlineto-rlineto-rlineto-closepath wird in PostScript Level 1 sehr häufig verwendet. Im ersten gsave/grestore-Segment wird der Schatten des Rechtecks gezeichnet, im zweiten Segment das Rechteck selbst (weiss fill) und dessen Umrisse (schwarz stroke). Die Verschiebung um 9 Punkt bewirkt, dass der grösste Teil des dunkeln Rechtecks unsichtbar ist, da dieses unter dem weissen Rechteck liegt.

Für PostScript Level 2 ist die Prozedur unnötig, denn rectfill ist (wie auch rectstroke) ein neuer Operator. Hier sieht das Beispiel so aus:

% neue Rechteck-Operatoren von Level 2:
gsave
	.6 setgray
	9 -9 translate
	50 550 500 200 rectfill		% Schatten
grestore

gsave
	1 setgray
	50 550 500 200 rectfill		% Hintergrund weiss
	0 setgray
	50 550 500 200 rectstroke	% Umriss schwarz
grestore
 
showpage
Auf einer Workstation sind nicht nur die Fenster, sondern auch viele andere Objekte rechteckig. Das folgende Beispiel zeichnet ein kleines weisses Quadrat:
 
bool
{
 1 setgray % weiss
 X 2 sub Y 2 sub 4 4 rectfill % Rechteck
}
if
Das kleine Quadrat wird aber nur dann gezeichnet, wenn die Variable bool true ist. Haben Sie sich inzwischen daran gewöhnt, dass der PostScript-Operator nach den Operatoren steht? In anderen Sprachen würde der Operator "if" gewöhnlich zuerst kommen:
if (bool) PSrectfill(...) ;
PostScript verwendet jedoch eine Postfix-Notation.

6. Die Strichstärke

Die Strichstärke kann mit dem Operator setlinewidth festgelegt werden. Beispiel:
1 setlinewidth		% 1 typograph. Punkt 
Die Strichdicke ist ein Element des grafischen Status, der global für alle grafischen Objekte gilt.

7. Weitere Themen

Siehe auch Ablaufkontrolle..., Speicherplatz-Verwaltung..., der Clip-Pfad..., Text setzen..., Bézier-Kurven..., der Operator makefont..., der Operator image..., der PostScript-Zeichensatz...;

PostScript-Operatoren:

Literatur

Vollenweider, Peter: PostScript, 2. Auflage, Carl Hanser Verlag, München und Wien, 1991. Auflagen von 2000 und 1000 Ex. sind vergriffen.

PostScript | Abfrage Operatoren (cgi) | Abfrage Operatoren (php)
Warning: virtual() [function.virtual]: Unable to include '/includes/foot_nav_php.html' - request execution failed in /usr/local/info-sys/www/id/publications/ps/PSeinfach.php on line 476
Last update: 11.04.2003 by vo