pic(1M) pic(1M)
NAME
pic - troff-Präprozessor für das Zeichnen von Bildern
SYNTAX
pic [-T gerät] [--] [-] [datei] ...
BESCHREIBUNG
Voraussetzungen
Das Programm pic zur Erzeugung von Graphiken ist ebenso wie das Pro-
gramm tbl(1M) (für Tabellen) oder das Programm eqn(1M) (für mathemati-
sche Formeln) ein Präprozessor, der den in troff-Quelltexte eingebet-
teten speziellen Quellcode in troff-Quelltext übersetzt. Erst danach
erfolgt die eigentliche Formatierung dieses erweiterten ("übersetz-
ten") Eingabetextes sowie des übrigen, "normalen" Eingabetextes.
Der ganze Zusammenhang ist in dem folgenden Bild noch einmal veran-
schaulicht.
+----------+
| Eingabe- | erstellt und ändert
| Datei | der Benutzer
+----------+
|
|
|
v
+-------+ +-------+ +-------+
|¢ pic ¢| |¢ tbl ¢| |¢ eqn ¢|
+-------+ +-------+ +-------+
|
|
|
v
+------------+
| Erweiterte | +---------+ +----------+
| Eingabe- |-------->|¢ troff ¢|-------->| Ausgabe- |
| Datei | | | | Datei |
+------------+ +---------+ +----------+
¢ = Programm
Im Gegensatz zu tbl und eqn/neqn kann pic nur mit troff kombiniert
werden:
pic option datei ... | troff ...
Verwenden Sie pic, eqn und tbl, ist die Pipe-Reihenfolge:
pic option datei ... | tbl | eqn | troff ...
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
OPTIONEN
Folgende Option ist zugelassen:
-T gerät
Die Ausgabe wird aufbereitet für das Ausgabegerät gerät. Für
gerät muß das Verzeichnis /usr/lib/font/devgerät vollständig vor-
handen sein.
Folgende Parameter sind zugelassen:
-- Ende der Optionenliste. Die Angabe ist nötig, wenn datei mit -
beginnt.
- Ist keine Datei oder - als Argument angegeben, wird von der Stan-
dardeingabe gelesen.
datei
Name der troff-Eingabedatei.
EINGABE VON GRAFIKEN IN TROFF-TEXTEN
Jede Beschreibung einer Grafik wird im troff-Eingabetext in die
Begrenzer .PS und .PE (in eigenen Zeilen) eingefaßt. Optional können
Sie hinter .PS die Breite und die Höhe der Grafik in Inches angeben;
die Grafik wird dann auf diese Maße gedehnt und gestreckt. Andernfalls
werden Standardmaße bzw. die in der Grafikbeschreibung enthaltenen
Maße verwendet. Wird nur die Breite angegeben, wird die Höhe propor-
tional angepaßt. Lautet die .PS-Zeile
.PS <datei
wird sie durch den Inhalt von datei ersetzt. datei darf Begrenzer ent-
halten, muß aber nicht.
Verwenden Sie .PF anstelle von .PE, wird nach Erstellen der Grafik die
Textposition vor Beginn der Grafik wieder eingestellt. So kann z. B.
Text neben einer Grafik ausgegeben werden.
pic reicht die Begrenzer .PS/.PE weiter, wobei es an .PS die errech-
nete Höhe und Breite der Grafik anhängt (vor die eventuell vorhandenen
Werte). Die Begrenzer einschließlich Höhe und Breite der Grafik können
so in einem Makropaket weiterverarbeitet werden. So können Sie z. B.
alle Grafiken zentrieren lassen, indem Sie definieren:
.de PS
.ne \\$1u
.in (\\n(.lu-\\$2u)/2u
..
.de PE
.in
..
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
SYNTAX DER PIC-EINGABESPRACHE
Die Beschreibung einer Grafik setzt sich im wesentlichen aus vielen
Figuren jeweils mit bestimmten Attributen zusammen, hierauf wird
gleich im einzelnen eingegangen. Jede Kombination Figur-Attribute
(= Objekt bzw. Element) steht in einer einzelnen Zeile. Sie können
auch mehrere Elemente auf einer Zeile angeben, indem Sie sie durch ;
trennen. Ist die Beschreibung eines Elements sehr lang, können Sie sie
auf mehrere Zeilen verteilen, dabei müssen Sie das Zeilenende vor
einer Folgezeile durch \ kennzeichnen.
Die Grafikbeschreibung können Sie mit Kommentaren versehen. Sie begin-
nen mit einem # und enden am Ende der Zeile.
Sie werden später sehen, daß Sie auch mit Variablen arbeiten und Mar-
ken setzen dürfen; vorab die Schreibweise: Variablennamen beginnen mit
einem Kleinbuchstaben; Markennamen beginnen mit einem Großbuchstaben.
Sowohl Variablen als auch Marken behalten ihre Werte auch in Folgegra-
fiken im selben Dokument.
Jede mit einem Punkt beginnende Zeile gilt als troff-Kommando und wird
unverändert weitergegeben. Steuerzeichen für vertikale Leerräume oder
Änderung des Zeilenabstandes dürfen Sie allerdings nicht verwenden.
Sinnvoll sind z. B. Wechsel von Schriftgröße und Schriftart.
BASISFIGUREN UND IHRE ATTRIBUTE
Die Basisfiguren von pic sind Kästen, Linien/Pfeile, Kreise, Ellipsen,
Kreisbögen, Splines (Freiformkurven), Text in Anführungszeichen sowie
Bewegungen ohne Ausgabe (Moves). Die folgende Grafik stellt alle
Basisfiguren vor:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
arrow ist ein anderes Wort für line ->.
Jede dieser Basisfiguren können Sie mit Attributen versehen, die im
wesentlichen Größe, Positionierung und Beschriftung der Figuren beein-
flussen. Sie können auch jede Figur durch Hinzufügen des Wortes
invis(ible) unsichtbar machen. Damit lassen sich z. B. Grafikbeschrif-
tungen bequem positionieren. Jedes Attribut besteht aus einem Schlüs-
selwort, eventuell gefolgt von einem Wert. Beispiel:
height 3.5 oder ht 3.5
bedeutet, die vorher benannte Basisfigur wird mit einer Höhe von 3,5
Inch ausgegeben. Entsprechend der amerikanischen Schreibweise müssen
Sie bei der Eingabe den Dezimalpunkt (nicht das deutsche Dezimalkomma)
verwenden.
Fehlende Attribute und Werte werden durch Standardwerte ersetzt. Nicht
jedes Attribut ist auf jedes Basisobjekt anwendbar, unpassende werden
ignoriert. Es folgt eine Aufstellung der jeweils möglichen Attribute
einer Figur:
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Figur Mögliches Attribut
box h(eigh)t, wid(th), at, same, dotted, dashed, invis,
"Text"
circle, ellipse chop, rad(ius), diam(eter), h(eigh)t, wid(th), at,
same, invis, "Text"
line, arrow up, down, left, right, h(eigh)t, wid(th), from, to,
by, then, at, same, dotted, dashed, invis, <-, ->,
<->, "Text"
arc up, down, left, right, h(eigh)t, wid(th), from, to,
at, rad(ius), invis, cw (= clockwise), <-, ->, <->,
"Text"
spline up, down, left, right, h(eigh)t, wid(th), from, to,
by, then, at, same, invis, <-, ->, <->, "Text"
move up, down, left, right, to, by, same, "Text"
"Text" at, by
Box
Das Schlüsselwort box erstellt eine Box mit Standardmaßen (0,75 Inch
breit, 0,5 Inch hoch) an der aktuellen Position:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Mehrere Figuren werden ohne Zwischenraum direkt aneinandergehängt,
d. h. aus
box; box; box
wird
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Die Eingabe hätte genauso gut lauten können:
box
box
box
Beschriftungen der Kästen nehmen Sie vor, indem Sie Textattribute in
doppelten Hochkommata an den Figurnamen anhängen:
box "Box"
box "mittlere" "Box"
box "dies" "ist die" "letzte"
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Anführungszeichen müssen eingefügt werden, selbst wenn der Text keine
Leerzeichen enthält. Jedes Textattribut wird in aktueller Schriftgröße
und Schriftart ausgegeben sowie horizontal und vertikal zentriert,
wobei mehrere Textattribute für die gleiche Figur im aktuellen Zeilen-
abstand übereinander ausgegeben werden.
Eine interessante Variante sind gestrichelte oder gepunktete Kästen,
nach box ist dann dashed oder dotted einzugeben.
Sie können die Box auch in jeder beliebigen Größe ausgeben. So wird
aus
box dotted wid 2i height 0.2
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Maßangaben werden grundsätzlich als Inches interpretiert. Der Buch-
stabe "i" kann, muß aber nicht angegeben werden. Die Maße gelten nur
für die zuvor angegebene Basisfigur. Auch bei einer eventuell noch
folgenden Basisfigur gleichen Typs gelten zunächst wieder die Stan-
dardmaße. Mit dem Schlüsselwort same können Sie die Maße allerdings
übernehmen:
box dotted wid 2i height 0.2; box same
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Auch hinter dotted und dashed können Sie Maße angeben. Die Erläuterung
dieser Maße folgt im Abschnitt "Line und arrow".
Move
Basisfiguren werden normalerweise direkt aneinander von links nach
rechts ausgegeben. Sollen dazwischen Leerräume auftreten, benutzen Sie
move:
box; move; box; move; box
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Da move eigentlich keine Figur ist, gibt man das Maß der Bewegung
nicht mit "width" oder "height", sondern mit up, down, left oder right
und eventuell einem Maß an. Doch Vorsicht: jedes dieser Attribute
ändert auch die generelle Richtung der Basisfiguren. So erzeugt:
box; move; box; move; box; move down; box
move; box;
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
(Die moves sind durch punktierte Linien verdeutlicht.)
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Line und arrow
Linien und Pfeile erzeugen Sie mit line und arrow. arrow ist keine
eigentliche Basisfigur, sondern nur eine Kurzschreibweise für line ->
und erzeugt eine Linie mit einer Pfeilspitze am Ende. Genausogut kön-
nen Sie Pfeilspitzen am Anfang oder auf beiden Seiten durch line <-
bzw. line <-> erzeugen.
Beobachten Sie die Textausgabe an Linien und Pfeilen an folgenden Bei-
spielen:
line "Linie"; move; arrow "Dies ist" "ein Pfeil"
move; line <- "Dies ist" "ein Pfeil" "rückwärts"
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Sollen Linien und Pfeile andere Längen und Richtungen haben, geben Sie
wie bei move Bewegungsrichtung und Abstand von der derzeitigen Posi-
tion aus an, d. h. up, down, left und right und eventuell eine Entfer-
nung. Beispiel:
line up .5 right 1
line down .5
arrow up .5 right 1
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Wenn Sie nach up, down usw. keine Entfernung angeben, benutzt pic
Standardwerte. Umgekehrt darf allerdings keine Entfernung ohne Rich-
tung angegeben werden. Und noch einmal Achtung: Auch hier ändert ein
Richtungsattribut die generelle Richtung der Grafik.
Geben Sie bei line oder arrow "width" oder "height" mit einem Maß an,
bezieht sich das ausschließlich auf die Größe der Pfeilspitze. Für
line ohne ->, <- oder <-> haben solche Attribute also keine Bedeutung.
Linien können wie Kästen gepunktet oder gestrichelt werden:
line dotted; move; line dashed
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Beide Attribute können mit Maßen versehen werden. Eine Zahl hinter
dotted legt den Abstand der Punkte fest. Das Maß bei dashed legt
sowohl die Länge der Striche als auch der Zwischenräume fest. Bei-
spiel:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
ist das Ergebnis der Eingaben (als getrennte Grafiken):
line right 3i dotted 0.2
line right 3i dashed 0.2
line right 3i dashed 0.5
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Circle
Kreise werden mit dem Wort circle erzeugt. Die Größe des Kreises kann,
falls der Standard überschrieben werden soll, als Radius ("rad") oder
Durchmesser ("diam" oder "wid") angegeben werden:
circle rad 0.5 "Kreis"; circle diam 0.5
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Kreise und Kreisbögen werden bei Maßangaben hinter .PS niemals gedehnt
oder gestreckt, sondern immer proportional vergrößert oder verklein-
ert. Kreise (und Kreisbögen) können nicht gepunktet oder gestrichelt
werden.
Ellipse
Ellipsen werden mit dem Wort ellipse erzeugt. Die Größe einer Ellipse
wird, falls der Standard überschrieben werden soll, mit Höhe ("ht")
oder Breite ("wid" oder "diam") angegeben:
ellipse ht 0.8 wid 1.2 "Ellipse"
ellipse wid 0.8 ht 1.2
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Auch die Angabe eines Radius ("rad") wirkt nur auf die Breite einer
Ellipse.
Arc
Kreisbögen erzeugen Sie mit arc. Mit Standardwerten drehen sie um 90°
entgegen dem Uhrzeigersinn. So zeichnet
arc; arc; arc; arc
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
natürlich einen Kreis. Die Richtung kann durch das Attribut cw
(= clockwise) umgekehrt werden:
arc cw; arc cw; arc
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Der Standardradius ist der gleiche wie für Kreise, er läßt sich mit
dem rad-Attribut ändern.
Jeder Kreisbogen ändert die generelle Richtung der Grafik in die Rich-
tung seines letzten Teilstücks. Beobachten Sie dies am folgenden Bei-
spiel:
arc; arc; arc; move
arc; arc; arc; move
arc; arc; arc; move
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
arc; arc; arc; move
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Wenn Sie herausbekommen haben, in welcher Reihenfolge die Bögen dieser
Figur gezeichnet werden, haben Sie die Regel verstanden.
Soll ein Bogen in eine andere Richtung als die aktuelle starten, so
geben Sie up, down, left oder right als Attribut an (ohne Entfernung).
Sollen Kreisbögen ganz andere Längen und Richtungen haben, arbeiten
Sie mit den Attributen from und to, jeweils mit einer Positionsangabe
(siehe Abschnitt "Koordinaten").
Für Pfeilspitzen auf Kreisbögen benutzen Sie die Attribute <-, -> oder
<->; height und width wirken bei Bögen ausschließlich auf die Pfeil-
spitze. Kreisbögen können nicht gepunktet oder gestrichelt werden.
Spline
Ein Spline ist ein geglätteter Kurvenzug entlang einer Folge gerader
Linien. Die Syntax für ein Spline entspricht der Syntax für eine Folge
verbundener Geraden (Polygon), allerdings mit dem Schlüsselwort
spline. Im folgenden Beispiel wird ein Polygon und ein Spline neben-
einander vorgestellt:
line left .3 down 1 then right 1 then \
left .3 up 1
move right
spline left .3 down 1 then right 1 then \
left .3 up 1
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Die Elemente eines Polygons oder eines Spline werden als Eckpunktfolge
angegeben und durch "then" getrennt. Die Eckpunkte werden im allgemei-
nen als Koordinaten angegeben (siehe Abschnitt "Koordinaten").
Pfeilspitzen können an den Enden eines Polygons oder eines Spline aus-
gegeben werden, height und width wirken auf die Pfeilspitze. Splines
können nicht gepunktet oder gestrichelt dargestellt werden.
Text
Textattribute werden in doppelte Hochkommata eingeschlossen. Standard-
mäßig wird ein Textattribut in der Mitte der Basisfigur (Text-Positi-
on) mittig ausgegeben. Für Textattribute gibt es allerdings auch
Zusatzattribute, so daß der Text auch links- oder rechtsbündig zur
Position oder eine halbe Zeile höher oder tiefer ausgegeben werden
kann. Diese Zusatzattribute sind ljust, rjust, above und below. Die
Zusatzattribute dürfen allerdings nicht kombiniert werden.
Seite 8 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
box "Text"; move
box "Text" ljust; move
box "Text" rjust; move
box "Text" above; move
line "Text"; move
line "Text" above
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Sind mehrere Textattribute für eine Basisfigur angegeben, so werden
sie mittig übereinander gesetzt, falls nicht anders angegeben. Ein
Zusatzattribut betrifft nur das direkt vorangestellte Textattribut.
Text ist meistens Attribut eines anderen Objekts, doch läßt sich auch
ein selbständiger Text erzeugen:
box; move right 3; "Text"
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Auch selbständiger Text kann mit den Zusatzattributen versehen werden.
GRÖSSEN DER BASISFIGUREN
Jedes Basisfigur (box, circle usw.) hat voreingestellte Standardabmes-
sungen wie Höhe, Breite, Radius usw.:
______________________________________________________
| Basisfigur Maße |
|_____________________________________________________|
| box 0,75 Inch breit x 0,5 Inch hoch |
| move 0,5 Inch senkrecht und waagerecht |
| line/arrow 0,5 Inch senkrecht und waagerecht |
| circle 0,5 Inch Durchmesser = 0,25 Inch Radius|
| ellipse 0,75 Inch breit x 0,5 Inch hoch |
| arc 0,25 Inch Radius |
| spline 0,5 Inch |
| "Text" 0 Inch breit und hoch |
|_____________________________________________________|
Wie Sie diese Maße für einzelne Basisfiguren per Attribut ändern,
wurde bei den Basisfiguren erläutert. Geben Sie ein Attribut wie width
an, so wird damit nur ein Objekt geändert. Wenn eine Figur die gleiche
Größe wie ein vorheriges Objekt der gleichen Art haben soll, fügen Sie
das Wort same hinzu. Beispiel:
down; box ht 0.2i wid 1.5i; move down 0.15i
box same; move same; box same; move; box
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Durch Zuweisung von neuen Werten an bestimmte Variablen lassen sich
die Standardabmessungen der Basisfiguren dauerhaft ändern. Ihre Namen
sind (vgl. Abschnitt "Variablen und Arithmetik" unten):
Seite 9 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
boxwid, boxht
movewid, moveht
arrowwid, arrowht
linewid, lineht
dashwid
circlerad
arcrad
ellipsewid, ellipseht
textwid, textht
Sollen z. B. alle Kreise groß sein und dicht beieinander liegen, kön-
nen Sie dies generell einstellen:
circlerad = .5; movewid = 0.2i
circle; move; circle; move; circle
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Obwohl Texte immer normal ausgegeben werden, ist der Platz, den Texte
einnehmen, standardmäßig 0 (textwid = textht = 0). Beobachten Sie das
an folgendem Beispiel:
box; "Text"; box;
move; textwid = .5
box; "Text"; box;
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
pic arbeitet generell mit Inches als Maßeinheit, bietet mit der Stan-
dardvariablen scale aber die Möglichkeit, innerhalb der Grafikbe-
schreibung eine andere Einheit - z. B. Zentimeter - zu verwenden.
Stellen Sie scale auf einen Wert ungleich 1 ein, so werden alle Abmes-
sungen durch diesen Wert geteilt. scale=2.54 bewirkt also, daß alle
Abmessungen als Zentimeter interpretiert werden.
Die in der .PS-Zeile als Breite angegebene Zahl übersteuert die in der
Grafik angegebenen Abmessungen. Auf diese Weise können Sie eine Grafik
auf eine bestimmte Größe bringen. Beispiel:
boxwid = 1; boxht = .1; box
Geben Sie dies mit .PS ohne Parameter bzw. mit .PS 3 aus, erhalten
Sie:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Seite 10 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
POSITIONIERUNG
Koordinaten
Die Figuren von pic werden normalerweise direkt aneinander von links
nach rechts unter dem zuletzt formatierten Text ausgegeben. Sie können
Objekte aber auch an beliebiger Stelle plazieren. pic benutzt dazu ein
gewöhnliches zweidimensionales Koordinatensystem, in dem jeder Punkt
eine x- und eine y-Koordinate hat. Die Position 0,0 ist immer der
Anfangspunkt des ersten Objekts einer Grafik. Die x,y-Position einer
Box, eines Kreises oder einer Ellipse ist ihr geometrischer Mittel-
punkt. Die Position einer Geraden oder Bewegung ist der Anfangspunkt.
Die Position eines Kreisbogens ist der Mittelpunkt des Kreises.
Die Positionierung einer Figur verändern Sie mit dem Attribut "at" und
einem Koordinatenpaar absolut oder mit dem Attribut "by" und einem
Koordinatenpaar relativ. Bei Bewegungen, Linien/Pfeilen und Kreisbögen
geben Sie eine Positionierung durch "from" und "to" (oder auch nur to
alleine) mit Koordinaten an.
Wird das Attribut from weggelassen, beginnt die Bewegung, Linie oder
der Kreisbogen an der Stelle, an der Sie sich gerade befinden, und
geht zu dem durch to gegebenen Punkt.
Die x- bzw. y-Koordinate können Sie auch einzeln über die bereits
bekannten Attribute left/right bzw. up/down jeweils mit einem (relati-
ven) Wert ändern.
Eine Position ist also eigentlich ein x,y-Koordinatenpaar, kann aber
auch auf andere Weise angegeben werden. Das Koordinatenpaar
Ausdruck,Ausdruck kann in Klammern eingeschlossen werden.
Größen- und Positionsattribute wie ht, wid und at können in beliebiger
Reihenfolge geschrieben werden. So sind
circle rad .3 at 1.5,.8
circle at 1.5,.8 rad .3
gleichwertig.
Positionen können addiert, subtrahiert und projiziert werden, um neue
Positionen zu erzeugen:
(x1,y1)+(x2,y2) = (x1+x2,y1+y2)
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Seien p1 und p2 Positionen mit den Koordinaten (x1,y1) bzw. (x2,y2).
Dann referiert
(p1,p2)
Seite 11 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
die Projektion der beiden Positionen
(p1.x,p2.y) (= (x1,y2))
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Anfangs- und Endpunkte der Figuren
Objekte werden in der Reihenfolge verbunden, die durch das letzte up,
down, left oder right bestimmt ist. Dabei ist der Anfangspunkt des
zweiten Objekts der Endpunkt des ersten Objekts. Die Anfangs- und End-
punkte für Kästen, Kreise und Ellipsen liegen jeweils mitten auf den
gegenüberliegenden Seiten der Figur in der aktuellen Richtung gesehen,
und sie sind Beginn und Ende von Linien, Splines, Bewegungen und
Kreisbögen. Beispiel:
box "1"; move; box "2"; move down; box "3"
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Die Anfangs- und Endpunkte der Boxen sind mit Ai bzw. Ei gekennzeich-
net. Der Endpunkt einer Figur ist gleichzeitig der Anfangspunkt der
folgenden Figur, d. h. E2 ist der Anfangspunkt des zweiten move (move
down) und A3 sein Endpunkt.
Richtung
Die anfangs eingestellte Richtung jeder Grafik ist right, d. h.
Objekte werden von links nach rechts verbunden. Wenn Sie eine Richtung
als eigenes Objekt oder als Attribut angeben, werden alle folgenden
Objekte in dieser Richtung verbunden. Beispiel:
circlerad = .1; movewid = 0.2i; moveht = .2
circle; move; circle; move; circle; move down
circle; move; circle; move; left
circle; move; circle; move; circle; move up
circle; move; circle; move
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Jede weitere Grafik (.PS-.PE) verläuft wieder von links nach rechts.
Marken
Objekte können markiert und benannt werden, damit ihre Position später
angesprochen werden kann. Beispiel:
Cir1:
circle; move; circle; move; circle; move
circle; move to Cir1; "Kreis 1"
Die Marke in diesem Beispiel ist Cir1. Markennamen müssen mit einem
Großbuchstaben beginnen. Der Name weist auf die "Position" der direkt
folgenden Figur hin. In den meisten Fällen ist diese Position der geo-
metrische Mittelpunkt. Marken können Sie wie folgt verwenden:
Seite 12 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
line from Cir1 to Cir2
move to Cir1 down .5 right 0.3
line to Cir1 + 0.5,0.3
circle at Cir1 + 0.5,0.3
In den beiden letzten Beispielen wird durch Marke + x,y eine neue
Position erzeugt. Der reservierte Name Here dient zur Bezeichnung der
aktuellen Position:
Stelle1: Here
Marken sind variabel, sie können in einer Grafik auch geändert werden,
selbst folgende Redefinition ist zulässig:
Stelle1: Stelle1 + 1,1
Statt mit einer geeignet gesetzten Marke können Sie sich auch mit dem
Wort last auf bereits beschriebene Objekte jedes Typs beziehen. Bei
folgender Grafikbeschreibung
box "1"; circle "2"; box "3"
bezieht sich last box auf Box 3, last circle auf Kreis 2 und 2nd last
box auf Box 1. Objekte gleichen Typs werden in jeder Grafik durchnume-
riert. Box 1 und 3 sind somit 1st box bzw. 2nd box (1th ist ebenso
zugelassen wie 1st oder 3rd).
Ecken
Um nicht nur die Position eines Objekts ansprechen zu können, sondern
auch eine Reihe ihrer Randpunkte, besitzen die meisten Objekte
"Ecken", die nach Kompaßpunkten benannt sind:
.n
.nw +-----------------------+ .ne
| |
| |
| |
.w + .c + .e
| |
| |
| |
| |
.sw +-----------------------+ .se
.s
Zusätzlich gibt es noch die Bezeichnungen .r, .b, .l und .t (für
"right", "bottom", "left" und "top") für die Ecken .e, .s, .w bzw. .n.
Linien und Pfeile haben neben Ecken ein .start und .end. Kreisbögen
haben nur .c, .start und .end. Neben dieser Art eignet sich fast jede
Kombination von left, right, top, bottom, upper, lower und center, um
bestimmte Punkte bei einer Basisfigur zu bezeichnen. So entsprechen
sich last box.ne und upper right of last box.
Seite 13 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Objekte lassen sich dadurch positionieren, daß eine Ecke eines Objekts
gleichzeitig eine Ecke eines anderen Objekts bildet. Das Attribut with
ermöglicht Ihnen diese Art der Positionierung. Beispiel:
box ht 0.75i wid 0.75i
circle with .nw at last box.se
erzeugt:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Schließlich gibt es die Positionierung entlang einer Strecke, die
durch zwei Punkte festgelegt wird:
Anteil [of the way] between Position1 and Position2
Diese Schreibweise läßt sich abkürzen zu:
Anteil <Position1, Position2>
Der durch Anteil angegebene Wert kann größer als 1 oder kleiner als 0
sein. Beispiel:
box
arrow right from -1/2 <last box.sw, last box.ne>
arrow right from 1/2 of the way between \
last box.nw and last box.se
arrow right from 3/2 <last box.nw, last box.se>
erzeugt:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Verdeckte Linien
In manchen Fällen soll eine Linie einen Kreis in einem Punkt schnei-
den, der nicht einer der acht in pic vorgesehenen Kompaßpunkte ist.
Das läßt sich durch eine Linie zum Mittelpunkt erreichen, bei der mit
dem Attribut chop ein Teil der Linie abgeschnitten wird:
circle "1"
circle "2" at 1st circle + 1,-.2
line from 1st circle to 2nd circle chop
erzeugt:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Eine Linie wird standardmäßig durch chop an jedem Ende um circlerad
abgeschnitten. Dieses Maß läßt sich ändern:
line ... chop Länge
Seite 14 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
verkürzt beide Enden um Länge,
line ... chop Länge1 chop Länge2
verkürzt den Anfang um Länge1 und das Ende um Länge2.
Blöcke
Ein Block wird gebildet durch eine Folge von pic-Anweisungen in ecki-
gen Klammern. Ein Block zählt als ein Objekt und läßt sich wie eine
Box, die alle Figuren des Blocks enthält, verarbeiten. Beispiel:
[down; box; arrow; box]
move; move; move
[down; box; arrow; box]
"Kontroll-" "fluß" at 1st [].e
"Daten-" "fluß" at last [].e
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Ein Block wird als Einheit behandelt, besitzt eine eigene Bewegungs-
richtung und seine internen Objekte sind nicht ansprechbar: last box
ist außerhalb der Blöcke nicht bekannt, mit last [] kann jedoch der
Block als ganzes angesprochen werden.
Blöcke haben Kompaßpunkte wie Kästen, weil jeder Block durch eine
(unsichtbare) Box begrenzt wird. Ein Block läßt sich auch positionie-
ren, indem Sie ihn als ganzes oder eine interne Marke positionieren:
[ ...; Cir1: ...; ... ] with .Cir1 at ...
Blöcke verbinden sich mit der folgenden Figur wie Boxen (d. h. am End-
punkt der begrenzenden Box).
Namen von Variablen und Marken innerhalb eines Blocks sind nur im
Block gültig; sie geraten nicht mit außerhalb liegenden Variablen und
Marken gleichen Namens in Konflikt. Interne Marken können jedoch auf
folgende Arten auch außerhalb des Blocks verwendet werden:
last [].Cir1 oder Block1.Cir1
wenn Block1 eine Marke ist, die dem Block gegeben wird:
Block1: [ ... ; Cir1: ...; ]
Obgleich Blöcke geschachtelt werden dürfen, darf die Schachtelung von
Marken wie Block1.Cir1 nur einstufig sein. Cir1 kann dann aber noch
näher bezeichnet werden: z. B. Block1.Cir1.e oder start of
Block1.Cir1.
Seite 15 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Neben den echten Blöcken gibt es Kommandofolgen in geschweiften Klam-
mern {...}. Diese bewirken, daß aktuelle Position und Bewegungsrich-
tung nach schließender Klammer genauso sind wie bei öffnender Klammer.
Dies ist ihre einzige Wirkung.
VARIABLEN UND ARITHMETIK
Überall dort, wo Sie Werte einsetzen sollen - also z. B. hinter down
oder wid -, können Sie auch Variablen oder beliebige Ausdrücke ange-
ben. Wie bei der Programmierung sind absolute Koordinaten bei späteren
Änderungen aufwendig und fehleranfällig. Mit Variablen können Sie Ihre
Grafik parametrisieren. Beispiel:
g = .75; h = 1.2
box wid g/3 ht h*1.5
move to last box - (a, b*2)
Ausdrücke können die Operatoren +, -, *, / und % benutzen, für Zusam-
menfassungen außerdem runde Klammern. Beachten Sie, daß Variablennamen
mit einem Kleinbuchstaben beginnen müssen.
Es gibt bereits vordefinierte Variablen, die die Standardgrößen der
Basisfiguren festlegen. Ihre Werte können in einer Grafik jederzeit
geändert werden, sie behalten dann ihre Werte bis zu einer erneuten
Festlegung im selben Dokument. Die vordefinierten Variablen und ihre
Initialisierungen sind:
___________________________________________________________________
| Variable | Voreinstellung| Bedeutung |
|___________|________________|_____________________________________|
| arcrad | 0.25i = 0.635c| Radius eines Kreisbogens |
| arrowwid | 0.05i = 0.127c| Breite einer Pfeilspitze |
| arrowht | 0.1i = 0.254c| Länge einer Pfeilspitze |
| boxwid | 0.75i = 1.905c| Breite einer Box |
| boxht | 0.5i = 1.27c | Höhe einer Box |
| circlerad | 0.25i = 0.635c| Radius eines Kreises |
| dashwid | 0.05i = 0.127c| Strich- und Zwischenraumlänge einer|
| | | gestrichelten Linie |
| ellipsewid| 0.75i = 1.905c| Breite einer Ellipse |
| ellipseht | 0.5i = 1.27c | Höhe einer Ellipse |
| linewid | 0.5i = 1.27c | Länge einer horizontalen Linie |
| lineht | 0.5i = 1.27c | Länge einer vertikalen Linie |
| movewid | 0.5i = 1.27c | Distanz einer horizontalen Bewegung|
| moveht | 0.5i = 1.27c | Distanz einer vertikalen Bewegung |
| scale | 1i = 2.54c | Skalierungsfaktor |
| textwid | 0i | Breite des Platzes, den ein Text |
| | | als Objekt braucht |
| textht | 0i | Höhe des Platzes, den ein Text als |
| | | Objekt braucht |
|___________|________________|_____________________________________|
Sie können z. B. eine Pfeilspitze vergrößern, indem Sie die folgenden
vordefinierten Variablen so ändern:
Seite 16 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Die Standardvariablen können Sie beliebig in Ausdrücken verwenden.
Weitere einsetzbare Werte sind andere Variablen, Höhe, Breite, Radius
sowie die x- und y-Koordinaten eines Objekts oder einer Ecke. Bei-
spiele:
abstand # Variable
Cir1.x # x-Koordinate von Cir1
Cir1.ne.y # y-Koordinate der Nordostecke von Cir1
Cir1.diam # Durchmesser von Cir1
2nd last circle.rad # Radius des vorletzten Kreises
Ausdrücke werden als gebrochene Werte berechnet. Alle Zahlen, die
Abmessungen darstellen, werden als Inches interpretiert. Während der
Ausgabe werden sie durch scale geteilt.
PROGRAMMIERMÖGLICHKEITEN VON PIC
Die Programmiermöglichkeiten von pic sind neben der bereits bekannten
Variablenverwendung und Ausdruckbildung zwar nicht sehr umfangreich,
dafür aber sehr effizient auf Grafikerstellung zugeschnitten. Die
wichtigsten Elemente sind Definitionen und Makros, Schleifenbildung
sowie bedingte Ausführung, dazu kommen Formatierung von Werten, Ein-
binden anderer Dateien sowie einige eingebaute mathematische Funktio-
nen.
Definitionen und Makros
pic besitzt eine Makrofunktion, deren einfachste Form mit der in eqn
identisch ist:
define name 'Ersetzungsstring'
Bei jedem Auftreten von name in nachfolgenden Grafiken wird er durch
Ersetzungsstring ersetzt. Das Trennzeichen (hier ') kann jedes belie-
bige Zeichen sein, das in Ersetzungsstring nicht vorkommt. Ersetzungs-
string darf Zeilenvorschübe enthalten.
Makros können auch mit Argumenten definiert werden. Im Ersetzungs-
string einer Makrodefinition können die Zeichen $1 bis $9 auftreten,
die durch die entsprechenden aktuellen Argumente ersetzt werden, wenn
das Makro aufgerufen wird. Der Aufruf für ein Makro mit Argumenten
lautet:
Name(Arg1, Arg2, ...)
Nicht vorhandene Argumente werden durch leere Zeichenketten ersetzt.
Koordinatenpaare können in runde Klammern eingeschlossen werden (wie
(x,y)), so daß sie sich als Makroargument übergeben lassen. Beispiel:
define quadrat Xbox ht $1 wid $1 $2X
Seite 17 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Dann erzeugt
quadrat(.9, "Big" "Box"); quadrat(.3)
ein großes beschriftetes und ein kleines nicht beschriftetes Quadrat:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Schleifen
Schleifen für das wiederholte Ausführen gleichartiger Vorgänge schrei-
ben Sie wie folgt:
for Variable = Anfangswert to Endwert [ by Schrittweite ] do
X
... # Schleifen-
... # körper
X
X ist ein beliebiges Zeichen, das im Schleifenkörper nicht vorkommt.
Ohne Angabe von Schrittweite wird 1 eingesetzt. Beispiel:
for i = 1 to 5 do
X
circle at (i*0.2,0+0.33*(i%2))
X
erzeugt:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Bedingte Ausführung
Die Syntax für das bedingte Ausführen von pic-Anweisungen ist:
if Ausdruck then X
...
X [ else X
...
X ]
X ist ein beliebiges Zeichen, das in den eingeschlossenen pic-Anwei-
sungen nicht vorkommt. Je nachdem, ob Ausdruck wahr (ungleich 0) oder
falsch (= 0) ist, wird der Teil hinter then bzw. else ausgeführt. Wenn
der else-Zweig fehlt und Ausdruck ist falsch, wird nichts ausgeführt.
Die Wahr-falsch-Semantik entspricht also der Sprache C, nicht
nroff/troff.
Neben den arithmetischen Operatoren sind auch die Vergleichs- und
logischen Operatoren der Sprache C zugelassen:
Seite 18 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Operator Bedeutung
_________________________________________________________
Vergleichs-Operatoren == gleich
!= ungleich
< kleiner
<= kleiner oder gleich
> größer
>= größer oder gleich
_________________________________________________________
Logische Operatoren ! (logisches) Nicht
&& (logisches) Und
|| (logisches) Oder
_________________________________________________________
Mit den Vergleichsoperatoren == und != dürfen Sie (weitergehend als in
der Sprache C) sogar Strings vergleichen. Beispiel:
for i = 0 to 0.8 by 0.2 do
X
if i == 0.2 || i == 0.6 then #
circle at (i, 0)
# else #
circle at (i, 0.33)
#
X
erzeugt:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Formatierte Werte
Zur Ausgabe von Werten, die in Ausdrücken berechnet werden, dient die
plot-Funktion. Dabei ist sogar eine Formatierung ähnlich zu printf()
in der Sprache C möglich:
plot Ausdruck [Format] Attribute
Beispiel:
box "43 / 17"; arrow; box "Rechen-" "werk"
arrow; box; plot 43 / 17 "%4.2f" at last box
erzeugt:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Seite 19 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Eingebaute Funktionen
Folgende mathematische Funktionen können zum Erzeugen von Werten in
Ausdrücken verwendet werden:
sin(Ausdruck) Sinus von Ausdruck
cos(Ausdruck) Cosinus von Ausdruck
atan2(Ausdruck1, Ausdruck2) Arcustangens von (Ausdruck1/Ausdruck2)
log(Ausdruck) Logarithmus von Ausdruck zur Basis 10
exp(Ausdruck) 10 "hoch" Ausdruck
sqrt(Ausdruck) Quadratwurzel von Ausdruck
int(Ausdruck) Ganzzahlwert von Ausdruck
max(Ausdruck1, Ausdruck2) Maximum von Ausdruck1, Ausdruck2
min(Ausdruck1, Ausdruck2) Minimum von Ausdruck1, Ausdruck2
rand(Ausdruck) Ganzzahlige Zufallszahl im Bereich
[1, Ausdruck]
Beispiele:
box "log(10)"; arrow; box "Rechen-" "werk"
arrow; box; plot log(10) "%4.2f" at last box
erzeugt:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
for i = 0 to 6.3 by 0.1 do
X
"." at (i, sin(i))
X
erzeugt:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Shellkommandos und Einbinden von Dateien
Aus pic heraus können Sie auch Shellkommandos aufrufen mit:
sh X Shellkommando X
X ist wieder ein Zeichen, das im eingeschlossenen Teil nicht vorkommt.
Beachten Sie, daß eine eventuelle Ausgabe des Shellkommandos ebenso
wie die Ausgabe von pic auf Standardausgabe erfolgt.
Neben der (selten benutzten) Möglichkeit, Dateien per .PS <Datei ein-
zubinden, gibt es das weitaus flexiblere copy-Kommando, das an jeder
Stelle innerhalb einer Grafik angegeben werden kann. Die einfachste
Form ist
copy "Datei"
Seite 20 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
Diese Anweisung wird einfach durch den Inhalt von Datei ersetzt. Ent-
hält Datei .PS/.PE, werden sie ignoriert. So können bereits vorhandene
Grafiken leicht in anderen Grafiken eingesetzt werden. Eine andere
Möglichkeit, die die copy-Funktion bietet, ist das externe Parametri-
sieren von Makros:
copy "Datei" thru Makroname oder
copy "Datei" thru X Ersetzungsstring X
Jede Zeile der kopierten Datei ruft das auf eine dieser beiden Arten
angegebene Makro auf. Dabei bilden die Felder des Zeileninhalts die
Parameter des Makros. Beispiel: Sowohl die Eingabe
define CI X circle rad $1 at 0,0 X
copy "radien" thru CI
als auch
copy "radien" thru X circle rad $1 at 0,0 X
erzeugen mit der Datei radien dieses Bild:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
FEHLERBEHANDLUNG UND FEHLERVERMEIDUNG
Die harmloseste Meldung von pic ist
pic: xx X yy picture shrunk to aa X bb
Sie bedeutet, daß eine Grafik den Seitenrahmen gesprengt hat und von
pic automatisch verkleinert wurde.
Wenn Sie beim Beschreiben einer Grafik einen grammatischen Fehler
machen, versucht pic anzugeben, an welcher Stelle der Fehler aufgetre-
ten ist. Zum Beispiel wird aufgrund der ungültigen Eingabe
circle move circle
die Nachricht ausgedruckt:
pic: syntax error near line n, file abc
context is
circle >>> move <<< circle
Die Zeichen >>> <<< markieren die Stelle, an der der Fehler festge-
stellt wurde. Die Fehlerursache kann unter Umständen auch schon davor
liegen. pic bricht nach einer solchen Meldung die Verarbeitung ab.
Für das Testen und die Fehlersuche (debugging) stellt pic die print-
Anweisung zur Verfügung. print kann die Werte von Ausdrücken (d. h.
auch von Variablen), von Positionen und komplette Strings auf Stan-
dardfehlerausgabe ausgeben. Beispiele:
Seite 21 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
box
print "Die aktuelle Position ist"
print Here
print "Die Box-Breite ist"
print boxwid
bringt folgende Meldungen auf Standardfehlerausgabe:
Die aktuelle Position ist
0.75, 0
Die Box-Breite ist
0.75
Um zu prüfen, ob pic ohne Fehlermeldung durchläuft, geben Sie folgen-
des Kommando ein:
pic Datei >/dev/null
So erzeugt pic keinerlei troff-Ausgabe, es erscheinen aber die Fehler-
meldungen und print-Ausgaben.
Ein gutes Mittel, Fehler durch Auswirkungen einer Grafik auf andere
Grafiken im selben Dokument zu unterbinden, ist, jede Grafik in einen
eigenen Block zu stellen:
.PS
[ ...
...
... ]
.PE
Auf diese Weise wirken sich z. B. Änderungen an Standardvariablen nur
auf die jeweils aktuelle Grafik aus.
BEISPIELE
Beispiel 1
Informationsfluß-Diagramm:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Das Informationsfluß-Diagramm wurde mit folgender Eingabe erzeugt:
.PS
scale=2.54
# Boxen rechts
boxht = 1; boxwid = 1.8
BoxTM: box "TM-" "Leitung"
BoxTCB: box with .n at BoxTM.s -(0,1.5) "TCB"
BoxPCB: box with .n at BoxTCB.s -(0,6) "PCB"
Seite 22 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
# Boxen links
BoxAG: box with .e at BoxTCB.w -(5.8,0) "Arbeits-" "gruppen"
BoxPG: box with .n at BoxAG.s -(0,6) "Projekt-" "gruppen"
# Kreise mitte
Circleanfor: circle diam 1.8 with .e at BoxTCB.w -(2,0) \
"Anford." "stellen"
Circleprodukte: circle rad same with .n at Circleanfor.s -(0,1) \
"Produkte" "planen"
Circleprojekte: circle rad same with .n at Circleprodukte.s -(0,1) \
"Projekte" "planen"
Circleentwicklung: circle rad same with .n at Circleprojekte.s -(0,1) \
"Produkte" "entwickeln"
# Kreis rechts
Circleentscheidung: circle rad same with .w at Circleprodukte.e +(2,0) \
"Produkt-" "entwickl." "entsch."
# Verbindungspfeile
arrow from BoxTCB.s to Circleentscheidung.n
arrow from BoxAG.e to Circleanfor.w
arrow from BoxPG.e to Circleprojekte.w
arrow from BoxPG.e to Circleentwicklung.n
arrow from BoxPCB.n to Circleprodukte.e
arrow dotted from BoxTCB.n to BoxTM.s
arrow dotted from Circleentscheidung.s to BoxPCB.n
arrow dotted from Circleanfor.e to BoxTCB.w
arrow dotted from Circleentwicklung.e to BoxPCB.s
arrow dotted from Circleprojekte.e to BoxPCB.w
arrow dotted from Circleprodukte.e to BoxTCB.s
arrow dotted from Circleprodukte.w to BoxAG.s
arrow dotted from Circleprodukte.w to BoxPG.n
arrow dashed from BoxPCB.w +(0,.2) to Circleprojekte.e +(0,.2)
arrow dashed from BoxPCB.s +(-.4,0) to Circleentwicklung.e +(0,.2)
arrow dashed from BoxTCB.s +(-.2,0) to Circleprodukte.e +(0,.2)
arrow dashed from BoxTCB.w +(0,.2) to Circleanfor.e +(0,.2)
# Spline
spline -> left 5.5 from Circleentwicklung.w then up 8.5 \
then right 1.7
.PE
Beispiel 2
Wir zeichnen einen Weihnachtsgruß:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Der Weihnachtsgruß wurde mit folgender Eingabe erzeugt:
Seite 23 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
.PS 3.9
define tanne Y TANNE: [
xshift=1.0i
yshift=-2.0i
rd=1.5i
pi=atan2(0,-1)
p2=pi/2
an=pi/5
ic=pi/60
for i = p2 + ic to p2 + an by ic do X
arc -> from xshift + 0,yshift + rd \
to xshift + rd * cos(i),yshift + rd * sin(i) rad rd X
# 2. (unterer) Zweig
an2=an/2
betan=pi/6
r2=rd/2
ic2=pi/30
ctx1=rd*cos(p2+an2)
ctx=xshift + ctx1
cty1=rd*sin(p2+an2)
cty=yshift+cty1-r2
for i = p2 - betan + ic2 to p2 by ic2 do X
arc -> from ctx + r2 * cos(p2 - betan),cty + r2 * sin(p2 -betan) to \
ctx + r2 * cos(i),cty + r2 * sin(i) rad r2 X
# Kugel
kh = 0.3i
ll=kh/2
rk= ll/2
cx= ctx
cy= cty+r2-ll-rk
h=rk/5
L: line down ll
C: circle rad rk at cx,cy
for ynew=0.0 to rk by h do X
yh=cy+ynew
yl=cy-ynew
xnew=sqrt(rk*rk-ynew*ynew)
xr=cx+xnew
xl=cx-xnew
line dotted .02 from xl,yh to xr-.01,yh
line dotted .02 from xl,yl to xr-.01,yl
X
Seite 24 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
# 3. (oberer) Zweig
an2 = 3 * an/4
betan = pi/6
shan = pi - pi/6
r2 = rd/2
ic2 = pi/30
ctx1 = rd * cos(p2 + an2)
ctx = xshift + ctx1 - r2 * cos(shan)
cty1 = rd * sin(p2 + an2)
cty = yshift + cty1 - r2 * sin(shan)
for i = shan - betan + ic2 to shan by ic2 do X
arc -> from ctx + r2 * cos(shan - betan),cty + r2 * sin(shan-betan) \
to ctx + r2 * cos(i),cty + r2 * sin(i) rad r2 X
# Kerze und Docht
kh = 0.3i
kw = kh/4
krzx = xshift + rd * cos(p2 + an/3)
krzy = yshift + rd * sin(p2 + an/3)
move to krzx,krzy + kh
KRZ: box ht kh wid kw
line up kh/10 from KRZ.n
# Flamme
fh = kh/3
fw = fh/3
ellipse ht fh wid fw
# Strahlen
flcx = krzx + kw/2 -.035
flcy = krzy + kh + kh/10 + fh/2
gamfac = 6
gams = 2 * pi/gamfac
shni = fh
shno = fh * 1.8 #1.8
for i = -pi/2 + gams to 3 * pi/2 - gams by gams do X
line from flcx + shni * cos(i),flcy + shni * sin(i) \
to flcx + shno * cos(i),flcy + shno * sin(i) X
]
Seite 25 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
# Rahmen
air = 0.2i
box ht last [].ht + 1.3 * air wid last [].wid + air at last []
Y
tanne
.PE
Beispiel 3
Torten-Diagramm:
==> Siehe den Ausdruck im Referenzhandbuch für Systemverwalter <==
Das Torten-Diagramm wurde mit folgender Eingabe erzeugt:
.PS
scale=2.54
copy "pietxtmacro"
PIE: [
pietxt(2.5,30,0,5,0,"8,3 %")
pietxt(2.5,40,30,15,0,"11,1 %")
pietxt(2.5,60,70,25,0,"16,7 %")
pietxt(2.5,30,130,490,0,"8,3 %")
pietxt(2.5,200,160,13,1,"Sonstige")
]
circle rad 2.53 at PIE.c
.PE
Die eingebundene Datei pietxtmacro enthält die Basis-Definitionen und
hat folgenden Inhalt:
.\"=========================================================
.\"
.\" pietxt: Torten-Diagramm, optional mit gepunkteten Linien.
.\" An jedes Teilstück wird ein String angehängt.
.\"
.\" Der Name des Makros ist pietxt.
.\" Hilfs-Makros sind pie, pieaux, pietxaux.
.\"=========================================================
.\" Die Parameter sind:
.\"
.\" cx x-Koordinate vom Mittelpunkt des Kreises.
.\" cy y-Koordinate vom Mittelpunkt des Kreises.
.\" rd Radius des Kreises.
.\" phi Winkelgröße des Tortenstücks ( >=0,
.\" 360 = ganzer Kreis).
Seite 26 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
.\" alfa Rotations-Winkel des Stücks (beliebig,
.\" alfa=0: Start rechts, horizontal).
.\" h Anzahl Linien bezogen auf den Radius zum Schraffieren
.\" (h=0: Weißes Stück). Ein großer h-Wert
.\" macht die Stück schwarz.
.\" dflag =1: Linie ist gepunktet. Jeder andere Wert:
.\" durchgezogene Linie.
.\" str Ein String wird an das Tortenstück angehängt.
.\"=========================================================
.\"
.PS
#=========================================================
# Konstanten und Initialisierungen
#=========================================================
pi = atan2(0,-1)
pi2 = pi / 2.0
#=========================================================
# pieaux( cx, cy, rd, phi, alfa, hdist, dfl ):
# Hilfs-Makro für 0 <= phi <= pi.
#
# phi, alfa als Bogenmaß (2 pi = ganzer Kreis),
# hdist ist die (absolute) Distanz zwischen schraffierten Linien.
# dfl ist ein Flag für gepunktete Linien.
#=========================================================
define pieaux @
#---------------------------------------------------------
# Mittelpunkt und Radius des Kreises
#---------------------------------------------------------
cxx = $1
cyy = $2
rdd = $3
#---------------------------------------------------------
# Winkel als Bogenmaß (d. h. 2 pi = ganzer Kreis)
#---------------------------------------------------------
phix = $4
alfx = $5
#---------------------------------------------------------
# Distanz zwischen den Linien
#---------------------------------------------------------
hdist = $6
Seite 27 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
#---------------------------------------------------------
# Flag für gepunktete Linien
#---------------------------------------------------------
dfl = $7
#---------------------------------------------------------
# Häufig benutzte trigonometrische Größen
#---------------------------------------------------------
cosp = cos(phix)
sinp = sin(phix)
tanp = sinp / cosp
rcosp = rdd * cosp
cosa = cos(alfx)
sina = sin(alfx)
#=========================================================
# Aktion
#=========================================================
#---------------------------------------------------------
# 0 <= phid <= 90 Grad
#---------------------------------------------------------
for x = 0.0 to rdd-.01 by hdist do X
if x < rcosp then Y yh = x * tanp Y \
else Y yh = sqrt(rdd * rdd + 0.1 - x * x) Y
yl = 0
#---------------------------------------------------------
# Punkte (x,yh) und (x,yl) um alfx (2 x 2 Matrix) drehen
#---------------------------------------------------------
x1 = cxx + x * cosa - yh * sina
y1 = cyy + x * sina + yh * cosa
x2 = cxx + x * cosa - yl * sina
y2 = cyy + x * sina + yl * cosa
if dfl == 1 then Q line dotted hdist from x1-.01,y1-.01 \
to x2+.01,y2+.01 Q \
else Q line from x1+.01,y1 to x2,y2 Q
X
#---------------------------------------------------------
# 90 < phi <= 180 Grad
#---------------------------------------------------------
Seite 28 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
if phix > pi2 then Z
for xt = hdist to -rcosp by hdist do X
x = -xt
yh = sqrt(rdd * rdd - x * x)
yl = x * tanp
#---------------------------------------------------------
# Punkte (x,yh) und (x,yl) um alfx (2 x 2 Matrix) drehen
#---------------------------------------------------------
x1 = cxx + x * cosa - yh * sina
y1 = cyy + x * sina + yh * cosa
x2 = cxx + x * cosa - yl * sina
y2 = cyy + x * sina + yl * cosa
if dfl == 1 then Q line dotted hdist from x1-.01,y1-.01 \
to x2+.01,y2+.01 Q \
else Q line from x1,y1 to x2,y2 Q
X
Z
@
#===================== Ende von pieaux =====================
#=========================================================
# pietxaux( cx, cy, rd, phi, alfa, str ): Tortentext-Makro.
#
# str ($6) ist ein String, der an das Tortenstück angehängt wird.
#
# phi und alfa sind Gradangaben (ganzer Kreis = 360°).
#=========================================================
#---------------------------------------------------------
# Eine radiale Linie für den Text zeichnen
#---------------------------------------------------------
define pietxaux &
ccxx = $1
ccyy = $2
rrdd = $3
phii = $4
alff = $5
whspace = rrdd / 8
rd1 = rrdd + whspace
rd2 = rd1 + rrdd / 10
bigr = rd2 + ( rrdd / 20 )
Seite 29 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
#---------------------------------------------------------
# Winkel am 'Kreismittelpunkt' berechnen und zum
# Bogenmaß konvertieren
#---------------------------------------------------------
gamma = ( alff + phii / 2 ) * pi / 180.0
cosg = cos( gamma )
sing = sin( gamma )
xx1 = ccxx + rd1 * cosg
yy1 = ccyy + rd1 * sing
xx2 = ccxx + rd2 * cosg
yy2 = ccyy + rd2 * sing
line from xx1,yy1 to xx2,yy2
#---------------------------------------------------------
# Horizontale Linie für den Text, links oder rechts.
# Text anhängen (1 String).
#---------------------------------------------------------
if cosg < 0 then X
line to ccxx - bigr,yy2
line invis to ccxx - bigr - whspace,yy2
$6 rjust
X \
else X
line to ccxx + bigr, yy2
line invis to ccxx + bigr + whspace,yy2
$6 ljust
X
&
#===================== Ende von pietxaux =====================
#=========================================================
# pie( cx, cy, rd, phi, alfa, haux, dflag ):
# Torten-Diagramm-Makro, roh.
#
# Einen Kreis bei (cx,cy) mit Radius rd ziehen.
# Tortenstück mit Winkel phi herausschneiden, gedreht um alfa.
# h ist die Anzahl Linien zum Schraffieren.
# dflag ist ein Flag für gepunktete Linien (=1).
#
# phi und alfa sind Gradangaben (ganzer Kreis = 360°).
#=========================================================
define pie %
#---------------------------------------------------------
# Mittelpunkt und Radius des Kreises.
#---------------------------------------------------------
Seite 30 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
cx = $1
cy = $2
rd = $3
#---------------------------------------------------------
# Winkel des Sektors (in Grad, d. h. 360° = ganzer Kreis).
# phid: Größe des Sektors ( >= 0 ).
# alfad: Winkel, um den der Sektor gedreht wird (beliebig).
#---------------------------------------------------------
phid = $4
alfad = $5
#---------------------------------------------------------
# haux: Anzahl Linien zum Schraffieren.
# h: Abstand zwischen den Linien.
#---------------------------------------------------------
haux = $6
h = 2 * rd
if haux > 0 then W
h = rd / haux
W
#---------------------------------------------------------
# Flag für gepunktete Linien
#---------------------------------------------------------
dflag = $7
#---------------------------------------------------------
# Winkel als Bogenmaß (d. h. 2 pi = ganzer Kreis)
#---------------------------------------------------------
phi = phid * pi / 180.0
alfa = alfad * pi / 180.0
beta = alfa + phi
#=========================================================
# Akion
#=========================================================
#---------------------------------------------------------
# Kreis ziehen.
# Tortenstücke durch Linien abgrenzen.
#---------------------------------------------------------
circle rad rd at cx,cy
circle rad rd+.01 at cx,cy
Seite 31 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
line from cx,cy to cx + rd * cos(alfa),cy + rd * sin(alfa)
line from cx,cy to cx + rd * cos(beta),cy + rd * sin(beta)
#---------------------------------------------------------
# Schraffierung nur wenn haux > 0 (Anzahl Linien zum Schraffieren).
#---------------------------------------------------------
if haux > 0 then Y
#---------------------------------------------------------
# 0 <= phid <= 180 Grad
#---------------------------------------------------------
if phi <= pi then W
pieaux( cx, cy, rd, phi, alfa, h, dflag )
W
#---------------------------------------------------------
# phid > 180 Grad
#---------------------------------------------------------
if phi > pi then W
pieaux( cx, cy, rd, pi, alfa, h, dflag )
pieaux( cx, cy, rd, phi - pi, alfa + pi, h, dflag )
W
Y
%
#===================== Ende von pie =====================
#=========================================================
# pietxt( rd, phi, alfa, h, dflag, str ):
# Torten-Diagramm-Makro, mit Text.
#
# Einen Kreis mit Radius rd ziehen.
# Tortenstück mit Winkel phi herausschneiden, gedreht um alfa.
# h ist die Anzahl Linien zum Schraffieren.
# dflag ist ein Flag für gepunktete Linien (=1).
# str ist ein String, der an die Tortenstück angehängt wird.
#
# phi und alfa sind Gradangaben (ganzer Kreis = 360°).
#=========================================================
Seite 32 Reliant UNIX 5.44 Gedruckt 11/98
pic(1M) pic(1M)
define pietxt !
pie( 0, 0, $1, $2, $3, $4, $5 )
pietxaux( 0, 0, $1, $2, $3, $6 )
!
#===================== Ende von pietxt =====================
.PE
SIEHE AUCH
grap(1M), troff(1M), troff(5).
LITERATUR
B. W. Kernighan, PIC - A Crude Graphics Language for Typesetting
D. Dougherty, T. O'Reilly, UNIX TEXT PROCESSING, Hayden Books,
Indianapolis, Indiana 46268 USA, ISBN 0-672-46291-5
Claus Schirmer, Dokumentations-Tools unter Unix. Troff, nroff,
Documenter's Workbench, R. Oldenbourg Verlag, München/Wien 1990
Seite 33 Reliant UNIX 5.44 Gedruckt 11/98