Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ pic(1M) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

grap(1M)

troff(1M)

troff(5)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026