Annotation of researchv10dc/vol2/pic/pic.cstr, revision 1.1.1.1

1.1       root        1: .so ../ADM/mac
                      2: ....XX pic 53 "Pic \(em A Graphics Language for Typesetting"
                      3: ...\" Wed Sep 24 15:49:34 EDT 1986
                      4: .de IT
                      5: \\$3\f2\\$1\f1\\$2
                      6: ..
                      7: .TR 116
                      8: .ND "Revised, May, 1991
                      9: .TL
                     10: PIC \(em A Graphics Language for Typesetting
                     11: .br
                     12: User Manual\(dg
                     13: .AU
                     14: Brian W. Kernighan
                     15: .AI
                     16: .MH
                     17: .AB
                     18: .PP
                     19: .IT Pic
                     20: is a language for drawing simple figures
                     21: on a typesetter.
                     22: The basic objects in
                     23: .IT pic
                     24: are
                     25: boxes,
                     26: circles,
                     27: ellipses,
                     28: lines,
                     29: arrows,
                     30: arcs,
                     31: spline curves,
                     32: and text.
                     33: These may be placed anywhere,
                     34: at positions specified absolutely
                     35: or in terms of previous objects.
                     36: The example below illustrates the style and basic capabilities
                     37: of the language.
                     38: .PS
                     39: ellipse "document"
                     40: arrow
                     41: box "PIC"
                     42: arrow
                     43: box "TBL/EQN" "(optional)" dashed
                     44: arrow
                     45: box "TROFF"
                     46: arrow
                     47: ellipse "typesetter"
                     48: .PE
                     49: This picture was created with the input
                     50: .P1
                     51:        \&.PS
                     52:        ellipse "document"
                     53:        arrow
                     54:        box "PIC"
                     55:        arrow
                     56:        box "TBL/EQN" "(optional)" dashed
                     57:        arrow
                     58:        box "TROFF"
                     59:        arrow
                     60:        ellipse "typesetter"
                     61:        \&.PE
                     62: .P2
                     63: .PP
                     64: .IT Pic 
                     65: is a
                     66: .IT troff
                     67: preprocessor;
                     68: it passes most of its input through untouched, but translates
                     69: commands between
                     70: .CW .PS
                     71: and
                     72: .CW .PE
                     73: into
                     74: .IT troff
                     75: commands that draw the pictures.
                     76: .AE
                     77: .FS
                     78: \(dg This is a revised version of |reference(pic cstr 116).
                     79: .FE
                     80: .NH
                     81: Introduction
                     82: .PP
                     83: .IT Pic
                     84: is a language for drawing
                     85: pictures.
                     86: It operates as yet another
                     87: .IT troff
                     88: |reference(latest reference troff)
                     89: preprocessor
                     90: (in the same style as
                     91: .IT eqn
                     92: |reference(latest eqn) and
                     93: .IT tbl
                     94: |reference(latest tbl)),
                     95: with pictures delimited by
                     96: .CW .PS
                     97: and
                     98: .CW .PE .
                     99: .PP
                    100: .IT Pic
                    101: was inspired partly by Chris Van Wyk's
                    102: early work on
                    103: .IT ideal
                    104: |reference(ideal acm);
                    105: it has somewhat the same capabilities,
                    106: but quite a different flavor.
                    107: In particular,
                    108: .IT pic
                    109: is much more procedural\(ema picture
                    110: is drawn by specifying (sometimes in painful detail)
                    111: the motions that one goes through to draw it.
                    112: Other direct influences include the PICTURE language
                    113: |reference(beatty picture),
                    114: the V viewgraph language |reference(viewgraph-v),
                    115: and, more recently, new features from the
                    116: .IT grap
                    117: language |reference(bentley kernighan grap)
                    118: for typesetting graphs.
                    119: .PP
                    120: This paper is primarily a user's manual for
                    121: .IT pic ;
                    122: a discussion of design issues and user experience
                    123: may be found in
                    124: |reference(kernighan pic spe).
                    125: The next section shows how to use
                    126: .IT pic
                    127: in the most simple way.
                    128: Subsequent sections describe how to change
                    129: the sizes of objects when the defaults are wrong,
                    130: and how to change their positions when the standard positioning rules
                    131: are wrong.
                    132: An appendix describes the language succinctly and
                    133: summarizes changes since the last manual.
                    134: .........
                    135: .NH
                    136: Basics
                    137: .PP
                    138: .IT Pic
                    139: provides boxes, lines, arrows, circles, ellipses, arcs,
                    140: and splines (smooth curves),
                    141: plus facilities for positioning
                    142: and labeling them.
                    143: The picture below shows all of the fundamental objects
                    144: (except for splines)
                    145: in their default sizes:
                    146: .PS
                    147: box "box"
                    148: move
                    149: line "line" above
                    150: move
                    151: arrow "arrow" above
                    152: move
                    153: circle "circle"
                    154: move
                    155: ellipse "ellipse"
                    156: move down .25 right
                    157: arc "arc"
                    158: .PE
                    159: Each picture begins with
                    160: .CW .PS
                    161: and ends with
                    162: .CW .PE ;
                    163: between them are commands to describe the picture.
                    164: Each command is typed on a line by itself.
                    165: For example
                    166: .P1
                    167: \&.PS
                    168: box "this is" "a box"
                    169: \&.PE
                    170: .P2
                    171: creates a standard box (\(34 inch wide, \(12 inch high)
                    172: and centers the two pieces of text in it:
                    173: .PS
                    174: box "this is" "a box"
                    175: .PE
                    176: .PP
                    177: Each line of text is a separate quoted string.
                    178: Quotes are mandatory, even if the text contains no blanks.
                    179: (Of course there needn't be any text at all.)
                    180: Each line will be
                    181: printed in the current size and font,
                    182: centered horizontally, and separated
                    183: vertically by the current
                    184: .IT troff
                    185: line spacing.
                    186: .IT Pic
                    187: does
                    188: not
                    189: center the complete drawing itself,
                    190: but the default definitions of
                    191: .CW .PS
                    192: and
                    193: .CW .PE
                    194: in the
                    195: .CW -ms
                    196: macro package do.
                    197: .PP
                    198: You can use
                    199: .CW circle
                    200: or
                    201: .CW ellipse
                    202: in place of
                    203: .CW box :
                    204: .PS
                    205: circle "this is" "a box"
                    206: move; move
                    207: ellipse "this is" "a box"
                    208: .PE
                    209: .PP
                    210: Text is centered on lines and arrows; if there is more than one
                    211: line of text, the lines are centered above and below:
                    212: .P1
                    213: line "this is" "a line"
                    214: .P2
                    215: .PS
                    216: line "this is" "a line"
                    217: .PE
                    218: .P1
                    219: arrow "this is" "an arrow"
                    220: .P2
                    221: .PS
                    222: arrow "this is" "an arrow"
                    223: .PE
                    224: .PP
                    225: Boxes and lines may be dashed or dotted;
                    226: just add the word
                    227: .CW dashed
                    228: or
                    229: .CW dotted
                    230: after
                    231: .CW box
                    232: or
                    233: .CW line :
                    234: .P1
                    235: line dashed "dashed" "line"
                    236: .P2
                    237: .PS
                    238: line dashed "dashed" "line"
                    239: .PE
                    240: .PP
                    241: Arcs by default turn 90 degrees counterclockwise from the current direction;
                    242: you can make them turn clockwise by saying
                    243: .CW arc
                    244: .CW cw :
                    245: .P1
                    246: line; arc; arc cw; arrow
                    247: .P2
                    248: .PS
                    249: line; arc; arc cw; arrow
                    250: .PE
                    251: A spline might well do this job better; we will return to that shortly.
                    252: .PP
                    253: As you might guess,
                    254: .P1
                    255: arc; arc; arc; arc
                    256: .P2
                    257: draws a circle, though not very efficiently.
                    258: Notice that several commands can be put on a single line
                    259: if they are separated by semicolons.
                    260: .PP
                    261: Objects are normally drawn one after another,
                    262: left to right,
                    263: and connected at the obvious places:
                    264: .P1
                    265: arrow; box "input"; arrow; box "process"; arrow; box "output"; arrow
                    266: .P2
                    267: .PS
                    268: arrow; box "input"; arrow; box "process"; arrow; box "output"; arrow
                    269: .PE
                    270: One way to leave a space is with
                    271: .CW move :
                    272: .P1
                    273: box; move; box; move; box
                    274: .P2
                    275: .PS
                    276: box; move; box; move; box
                    277: .PE
                    278: .PP
                    279: Although objects are normally connected left to right,
                    280: this can be changed.
                    281: If you specify a direction (as a separate object), subsequent objects
                    282: will be joined in that direction:
                    283: .P1
                    284: down; box; arrow; ellipse; arrow; circle
                    285: .P2
                    286: .PS
                    287: down; box; arrow; ellipse; arrow; circle
                    288: .PE
                    289: .P1
                    290: left; box; arrow; ellipse; arrow; circle
                    291: .P2
                    292: .PS
                    293: left; box; arrow; ellipse; arrow; circle
                    294: .PE
                    295: Each new picture begins going to the right.
                    296: .PP
                    297: Normally, figures are drawn at a fixed scale,
                    298: with objects of a standard size.
                    299: It is possible, however, to arrange that a figure be expanded or shrunk
                    300: to fit a particular width.
                    301: If the
                    302: .CW .PS
                    303: line contains a number, the drawing is forced to be that many inches wide,
                    304: with the height scaled proportionately.
                    305: Thus
                    306: .P1
                    307: \&.PS 3.5
                    308: .P2
                    309: causes the picture to be 3.5 inches wide.
                    310: If two dimensions are specified, the second is the height.
                    311: .PP
                    312: .IT Pic
                    313: is pretty dumb about the size of text in relation
                    314: to the size of boxes, circles, and so on.
                    315: There is no way to say
                    316: ``make a box that just fits around this text''
                    317: or ``make this text fit inside this circle''
                    318: or ``draw a line as long as this text.''
                    319: Tight fitting of text
                    320: can generally only be done by trial and error.
                    321: .PP
                    322: Speaking of errors,
                    323: if you make a grammatical error in the way you describe
                    324: a picture,
                    325: .IT pic
                    326: will complain and try to indicate where.
                    327: For example, the invalid input
                    328: .P1
                    329: box arrow box
                    330: .P2
                    331: will draw the message
                    332: .P1
                    333: pic: syntax error near line 5, file -
                    334:  context is
                    335:         box >>>  arrow <<<  box
                    336: .P2
                    337: The brackets
                    338: point to the place where the error was first noted;
                    339: it sometimes follows 
                    340: the word in error, although in this example it's right on target.
                    341: The filename
                    342: .CW - ' `
                    343: is the standard input.
                    344: .NH
                    345: Controlling Sizes
                    346: .PP
                    347: This section deals with how to
                    348: control the sizes of objects
                    349: when the default sizes are not what is wanted.
                    350: The next section deals with positioning them
                    351: when the default positions are not right.
                    352: .PP
                    353: Each object that
                    354: .IT pic
                    355: knows about
                    356: (boxes, circles, etc.) has
                    357: associated dimensions, like height, width, radius, and so on.
                    358: By default,
                    359: .IT pic
                    360: tries to choose sensible default values for these dimensions,
                    361: so that simple pictures can be drawn with a minimum
                    362: of fuss and bother.
                    363: All of the figures and motions shown so far
                    364: have been in their default sizes:
                    365: .DS
                    366: .ta 1i
                    367: box    \(34" wide \(mu \(12" high
                    368: circle \(12" diameter
                    369: ellipse        \(34" wide \(mu \(12" high
                    370: arc    \(12" radius
                    371: line or arrow  \(12" long
                    372: move   \(12" in the current direction
                    373: .DE
                    374: .LP
                    375: When necessary,
                    376: you can make any object any size you want:
                    377: .P1
                    378: box width 3 height 0.1; circle radius 0.1
                    379: .P2
                    380: .PS
                    381:        box wid 3 ht 0.1; circle radius 0.1
                    382: .PE
                    383: All positions and dimensions are in inches, so
                    384: the box is 3 inches wide and 1/10 inch high and the circle has radius 1/10 inch.
                    385: .PP
                    386: An attribute like 
                    387: .CW width
                    388: changes only the one instance of the object.
                    389: You can also change the default size for all objects
                    390: of a particular type by assigning values to
                    391: .IT pic
                    392: variables;
                    393: this will be discussed in Section 6.
                    394: .PP
                    395: The attributes of
                    396: .CW height
                    397: (which you can abbreviate to
                    398: .CW ht )
                    399: and
                    400: .CW width
                    401: (or
                    402: .CW wid )
                    403: apply to boxes, circles,
                    404: ellipses,
                    405: and to the head on an arrow.
                    406: The attributes of
                    407: .CW radius
                    408: (or
                    409: .CW rad )
                    410: and
                    411: .CW diameter
                    412: (or
                    413: .CW diam )
                    414: can be used for circles and arcs if they seem more natural.
                    415: .PP
                    416: Lines and arrows are most easily drawn by specifying
                    417: the amount of motion from where you are right now,
                    418: in terms of directions.
                    419: Accordingly the words
                    420: .CW up ,
                    421: .CW down ,
                    422: .CW left
                    423: and
                    424: .CW right
                    425: and an optional distance can be attached to
                    426: .CW line ,
                    427: .CW arrow ,
                    428: and
                    429: .CW move :
                    430: .P1
                    431: line up 1 right 2
                    432: arrow left 2
                    433: move left 0.1
                    434: line <-> down 1 "height " rjust
                    435: .P2
                    436: .PS
                    437: line up 1 right 2
                    438: arrow left 2
                    439: move left 0.1
                    440: line <-> down 1 "height " rjust
                    441: .PE
                    442: The notation
                    443: .CW <->
                    444: indicates a two-headed arrow;
                    445: use
                    446: .CW ->
                    447: for a head on the end and
                    448: .CW <-
                    449: for one on the start.
                    450: Lines and arrows are really the same thing;
                    451: in fact,
                    452: .CW arrow
                    453: is a synonym for
                    454: .CW line
                    455: .CW -> .
                    456: .PP
                    457: If you don't specify any distance after
                    458: .CW up ,
                    459: .CW down ,
                    460: etc.,
                    461: .IT pic
                    462: uses the standard distance:
                    463: .P1
                    464: line up right; line down; line down left; line up
                    465: .P2
                    466: .PS
                    467: line up right; line down; line down left; line up
                    468: .PE
                    469: If you omit the direction associated with a distance,
                    470: the current direction is used.
                    471: .PP
                    472: Boxes and lines may be dotted or dashed:
                    473: .P1
                    474: box dotted; line dotted; move; line dashed; box dashed
                    475: .P2
                    476: .PS
                    477: box dotted; line dotted; move; line dashed; box dashed
                    478: .PE
                    479: If there is a number after
                    480: .CW dot ,
                    481: the dots will be approximately that far apart.
                    482: You can also control the size of the dashes (at least somewhat):
                    483: if there is a length after the word
                    484: .CW dashed ,
                    485: the dashes will be that long,
                    486: and the intervening spaces will be as close as possible to that size:
                    487: .P1
                    488: line right 5 dashed; move left 5 down .25; right
                    489: line right 5 dashed 0.25; move left 5 down .25; right
                    490: line right 5 dashed 0.5; move left 5 down .25; right
                    491: line right 5 dashed 1
                    492: .P2
                    493: .PS
                    494: line right 5 dashed; move left 5 down .25; right
                    495: line right 5 dashed 0.25; move left 5 down .25; right
                    496: line right 5 dashed 0.5; move left 5 down .25; right
                    497: line right 5 dashed 1
                    498: .PE
                    499: Dotted or dashed attributes apply only to lines and boxes.
                    500: .LP
                    501: .PP
                    502: You can make any object invisible by adding the word
                    503: .CW invis
                    504: after it.
                    505: This is particularly useful for positioning things correctly
                    506: near text:
                    507: .P1
                    508: box invis "input"; arrow; box invis "output"
                    509: .P2
                    510: .PS
                    511: box invis "input"; arrow; box invis "output"
                    512: .PE
                    513: .PP
                    514: Text may be positioned on lines and arrows:
                    515: .P1
                    516: arrow "on top of"; move
                    517: arrow "above" "below"; move
                    518: arrow "above" above; move
                    519: arrow "below" below; move
                    520: arrow "above" "on top of" "below"
                    521: .P2
                    522: .PS
                    523: arrow "on top of"; move
                    524: arrow "above" "below"; move
                    525: arrow "above" above; move
                    526: arrow "below" below; move
                    527: arrow "above" "on top of" "below"
                    528: .PE
                    529: .LP
                    530: .PP
                    531: The ``width'' of an arrowhead is the distance across
                    532: its tail;
                    533: the ``height'' is the distance along the shaft.
                    534: The arrowheads in this picture are default size and shape.
                    535: .PP
                    536: As we said earlier, arcs go 90 degrees counterclockwise
                    537: from where you are right now, and
                    538: .CW arc
                    539: .CW cw
                    540: changes this to clockwise.
                    541: The default radius is the same as for circles,
                    542: but you can change it with the
                    543: .CW rad
                    544: attribute.
                    545: It is also easy to draw arcs between specific places;
                    546: this will be described in the next section.
                    547: .PP
                    548: To put an arrowhead on an arc, use one of
                    549: .CW <- ,
                    550: .CW ->
                    551: or
                    552: .CW <-> ,
                    553: as with lines.
                    554: .LP
                    555: .PP
                    556: In all cases,
                    557: unless an explicit dimension for some object is specified,
                    558: you will get the default size.
                    559: If you want an object to have the same size
                    560: as the previous one of that kind,
                    561: add the word
                    562: .CW same .
                    563: Thus
                    564: in the set of boxes given by
                    565: .P1
                    566: down; box ht 0.2 wid 1.5; move down 0.15; box same; move same; box same
                    567: .P2
                    568: .PS
                    569: down; box ht 0.2 wid 1.5; move down 0.15; box same; move same; box same
                    570: .PE
                    571: the dimensions set by the first
                    572: .CW box
                    573: are used several times;
                    574: similarly, the amount of motion for the second
                    575: .CW move
                    576: is the same as for the first one.
                    577: .PP
                    578: You can change the default sizes of objects
                    579: by assigning values to the variables that define their values.
                    580: Here is the list, with their default values:
                    581: .P1
                    582: .ta 2i 3.3i
                    583: boxwid = 0.75; boxht = 0.5
                    584: linewid = 0.75;        lineht = 0.5
                    585: circlerad = 0.25;      arcrad = 0.25
                    586: ellipsewid = 0.75;     ellipseht = 0.5
                    587: movewid = 0.75;        moveht = 0.5
                    588: textwid = 0;   textht = 0
                    589: arrowwid = 0.05;       arrowht = 0.1   \f1(These refer to the arrowhead.)\fP
                    590: dashwid = 0.05;        arrowhead = 2   \f1(Arrowhead fill style)\fP
                    591: maxpsht = 8.5; maxpswid = 11   \f1(Maximum picture dimensions)\fP
                    592: fillval = 0.3; scale = 1
                    593: .P2
                    594: So if you want all your boxes to be long and skinny, and relatively close together,
                    595: .P1
                    596: boxwid = 0.1; boxht = 1
                    597: movewid = 0.2
                    598: box; move; box; move; box
                    599: .P2
                    600: .PS
                    601: boxwid = 0.1; boxht = 1
                    602: movewid = 0.2
                    603: box; move; box; move; box
                    604: .PE
                    605: .nf
                    606: .PS
                    607: x = boxwid
                    608:  y = boxht
                    609: boxwid = 0.1
                    610:  boxht = 1
                    611: movewid = 0.2
                    612: boxwid = x
                    613:  boxht = y
                    614: arrowhead = 7
                    615:  arrowhead = 2
                    616: .PE
                    617: .PP
                    618: Setting the variable
                    619: .CW arrowhead
                    620: to a value like 7 causes arrowheads to be filled by overstriking;
                    621: the default is 2:
                    622: .P1
                    623: arrowhead = 7; arrow; move; arrowhead = 2; arrow
                    624: .P2
                    625: .PS
                    626: arrowhead = 7; arrow; move; arrowhead = 2; arrow
                    627: .PE
                    628: .PP
                    629: .IT Pic
                    630: works internally in inches.
                    631: Setting the variable
                    632: .CW scale
                    633: to some value causes all dimensions to be scaled down
                    634: by that value.
                    635: Thus, for example,
                    636: .CW scale=2.54
                    637: causes dimensions to be interpreted as centimeters.
                    638: .PP
                    639: The numbers given in the
                    640: .CW .PS
                    641: line override the dimensions given in the picture;
                    642: these can be used to force a picture to a particular width and height.
                    643: Experience indicates that a good way to get a picture
                    644: of the right size is to enter its dimensions in inches,
                    645: then if necessary add a width and perhaps height to the
                    646: .CW .PS
                    647: line.
                    648: .PP
                    649: Once set, variables like
                    650: .CW boxht
                    651: retain their values from one picture to the next.
                    652: You can reset variables to their default values by listing them in a
                    653: .CW reset
                    654: statement:
                    655: .P1
                    656: reset boxht, boxwid
                    657: .P2
                    658: A bare
                    659: .CW reset
                    660: resets all variables.
                    661: .PP
                    662: There is a minimal facility for filling or shading objects,
                    663: intended for Postscript output devices.
                    664: The attribute
                    665: .CW fill
                    666: .IT expr
                    667: sets the gray scale value to
                    668: .IT expr ;
                    669: the default, determined by the variable
                    670: .CW fillval ,
                    671: is 0.3.
                    672: Following Postscript, smaller values are darker.
                    673: Thus:
                    674: .P1
                    675: box fill
                    676: box ht boxht/2 wid boxwid/2 "hello" at last box
                    677: .P2
                    678: .PS
                    679: reset
                    680: box fill
                    681: box ht boxht/2 wid boxwid/2 "hello" at last box
                    682: .PE
                    683: .CW fill
                    684: currently only applies to boxes, circles, and ellipses.
                    685: .NH
                    686: Controlling Positions
                    687: .PP
                    688: You can place things anywhere you want;
                    689: .IT pic
                    690: provides a variety of ways to talk about positions.
                    691: .IT Pic
                    692: uses a standard Cartesian coordinate system with
                    693: .IT x
                    694: increasing rightwards and
                    695: .IT y
                    696: increasing upwards,
                    697: so any point or object has an
                    698: .IT x
                    699: and
                    700: .IT y
                    701: position, measured in inches.
                    702: The first object is placed with its start at position 0,0 by default.
                    703: The
                    704: .IT x,y
                    705: position of a box, circle or ellipse is its geometric center;
                    706: the position of a line or spline or motion is its beginning;
                    707: the position of an arc is the center of the corresponding circle.
                    708: .PP
                    709: Position modifiers like
                    710: .CW from ,
                    711: .CW to ,
                    712: .CW by
                    713: and
                    714: .CW at
                    715: are followed by an
                    716: .IT x,y
                    717: pair, and
                    718: can be attached to boxes, circles, lines, motions, and so on,
                    719: to specify or modify a position.
                    720: .PP
                    721: You can also use
                    722: .CW up ,
                    723: .CW down ,
                    724: .CW right ,
                    725: and
                    726: .CW left
                    727: with
                    728: .CW line
                    729: and
                    730: .CW move :
                    731: .P1
                    732: box ht 0.2 wid 0.2 at 0,0 "1"
                    733: move right 0.5                 # or "move to 0.5,0"
                    734: box ht 0.2 wid 0.2 "2"
                    735: move right 0.5                 # or "move 0.5" or "move same"
                    736: box ht 0.2 wid 0.2 "3"
                    737: .P2
                    738: .PS 2
                    739: box ht 0.2 wid 0.2 at 0,0 "1"
                    740: move right 0.5                 # or "move to 0.5,0"
                    741: box ht 0.2 wid 0.2 "2"
                    742: move right 0.5
                    743: box ht 0.2 wid 0.2 "3"
                    744: .PE
                    745: Comments can be used in pictures;
                    746: they begin with a
                    747: .CW #
                    748: and end at the end of the line.
                    749: .PP
                    750: Attributes like
                    751: .CW ht
                    752: and
                    753: .CW wid
                    754: and positions like
                    755: .CW at
                    756: can be written out in any order.
                    757: So
                    758: .P1
                    759: box ht 0.2 wid 0.2 at 0,0
                    760: box at 0,0 wid 0.2 ht 0.2
                    761: box ht 0.2 at 0,0 wid 0.2
                    762: .P2
                    763: are all equivalent, though the last is harder to read
                    764: and thus less desirable.
                    765: .PP
                    766: The
                    767: .CW from
                    768: and
                    769: .CW to
                    770: attributes are particularly useful with arcs,
                    771: to specify the endpoints.
                    772: By default, arcs are drawn counterclockwise,
                    773: .P1
                    774: "+" at 0,0
                    775: arc -> from 0.5,0 to 0,0.5
                    776: arc -> cw from 0,0 to 1,0.5
                    777: .P2
                    778: .PS
                    779: "+" at 0,0
                    780: arc -> from 0.5,0 to 0,0.5
                    781: arc -> cw from 0,0 to 1,0.5
                    782: .PE
                    783: The radius can be made large to provide flat arcs:
                    784: .P1
                    785: arc -> cw from 0,0 to 2,0 rad 15
                    786: .P2
                    787: .PS
                    788: arc -> cw from 0,0 to 2,0 rad 15
                    789: .PE
                    790: If the circle is under-specified,
                    791: .IT pic
                    792: guesses a radius and/or center;
                    793: you will have to provide them explicitly if the guess is wrong.
                    794: .LP
                    795: .PP
                    796: We said earlier that
                    797: objects are normally connected left to right.
                    798: This is an over-simplification.
                    799: The truth is that objects are connected together
                    800: in the direction specified by the most recent
                    801: .CW up ,
                    802: .CW down ,
                    803: .CW left
                    804: or
                    805: .CW right
                    806: (either alone or as part of some object).
                    807: Thus, in
                    808: .P1
                    809: arrow left; box; arrow; circle; arrow
                    810: .P2
                    811: the
                    812: .CW left
                    813: implies connection towards the left:
                    814: .PS
                    815: arrow left; box; arrow; circle; arrow
                    816: .PE
                    817: This could also be written as
                    818: .P1
                    819: left; arrow; box; arrow; circle; arrow
                    820: .P2
                    821: .PP
                    822: Objects are joined in the direction determined by the last
                    823: .CW up ,
                    824: .CW down ,
                    825: etc., with the entry point of the second object attached
                    826: to the exit point of the first
                    827: (which is fixed at the time of entry).
                    828: Entry and exit points for boxes, circles and ellipses are
                    829: on opposite sides.
                    830: This automatic connection and direction selection
                    831: works well if the direction doesn't change but it will occasionally surprise you:
                    832: .P1
                    833: arrow; circle; down; arrow
                    834: .P2
                    835: .PS
                    836: arrow; circle; down; arrow
                    837: .PE
                    838: The arrow comes out of the right side of the circle, not the bottom,
                    839: as might be expected.
                    840: .PP
                    841: If a set of commands is enclosed in braces
                    842: .CW {...} ,
                    843: the current position and direction of motion when the group is finished
                    844: will be exactly where it was when entered.
                    845: Nothing else is restored.
                    846: There is also a more general way to group objects,
                    847: using
                    848: .CW [
                    849: and
                    850: .CW ] ,
                    851: which is discussed in Section 9.
                    852: .NH
                    853: Labels and Corners
                    854: .PP
                    855: Objects can be labelled or named so that you can talk about them later.
                    856: For example,
                    857: .P1
                    858: Box1:  box
                    859:        # ... other stuff ...
                    860:        move to Box1
                    861: .P2
                    862: Place names 
                    863: .IT must
                    864: begin with an upper case letter
                    865: (to distinguish them from variable names,
                    866: which begin with lower case letters).
                    867: The name refers to the ``center''
                    868: of the object,
                    869: which is the geometric center for most things.
                    870: .PP
                    871: Other combinations also work:
                    872: .P1
                    873: line from Box1 to Box2
                    874: move to Box1 up 0.1 right 0.2
                    875: move to Box1 + 0.2,0.1 # same as previous
                    876: line to Box1 - 0.5,0
                    877: .P2
                    878: The reserved name
                    879: .CW Here
                    880: may be used to refer to the current position.
                    881: .PP
                    882: Labels can be reset several times in a single picture,
                    883: so a statement like
                    884: .P1
                    885: Box1:  Box1 + 1,1
                    886: .P2
                    887: is perfectly legal.
                    888: .LP
                    889: .PP
                    890: You can also refer to previously drawn objects of each type,
                    891: using the word
                    892: .CW last .
                    893: For example, given the input
                    894: .P1
                    895: box "A"; circle "B"; box "C"
                    896: .P2
                    897: then
                    898: .CW last \& `
                    899: .CW box '
                    900: refers to box
                    901: .CW C ,
                    902: .CW last \& `
                    903: .CW circle '
                    904: refers to circle
                    905: .CW B ,
                    906: and
                    907: .CW 2nd \& `
                    908: .CW last
                    909: .CW box '
                    910: refers to box
                    911: .CW A .
                    912: Numbering of objects can also be done from the beginning,
                    913: so boxes
                    914: .CW A
                    915: and
                    916: .CW C
                    917: are
                    918: .CW 1st \& `
                    919: .CW box '
                    920: and
                    921: .CW 2nd \& `
                    922: .CW box '
                    923: respectively.
                    924: .PP
                    925: To cut down the need for explicit coordinates,
                    926: objects have ``corners'' named by compass points:
                    927: .P1
                    928: B: box "B.c" ht 1 wid 1.5
                    929:        " B.e" at B.e ljust
                    930:        " B.ne" at B.ne ljust
                    931:        " B.se" at B.se ljust
                    932:        "B.s" at B.s below
                    933:        "B.n" at B.n above
                    934:        "B.sw " at B.sw rjust
                    935:        "B.w " at B.w rjust
                    936:        "B.nw " at B.nw rjust
                    937: .P2
                    938: .PS
                    939: B: box "B.c" ht 1 wid 1.5
                    940: " B.e" at B.e ljust
                    941: " B.ne" at B.ne ljust
                    942: " B.se" at B.se ljust
                    943: "B.s" at B.s below
                    944: "B.n" at B.n above
                    945: "B.sw " at B.sw rjust
                    946: "B.w " at B.w rjust
                    947: "B.nw " at B.nw rjust
                    948: .PE
                    949: Note the use of
                    950: .CW ljust ,
                    951: .CW rjust ,
                    952: .CW above ,
                    953: and
                    954: .CW below
                    955: to alter the default positioning of text,
                    956: and of a blank within some strings to help space them away from a vertical line.
                    957: .PP
                    958: Lines and arrows have a
                    959: .CW start ,
                    960: an
                    961: .CW end
                    962: and a 
                    963: .CW center
                    964: in addition to corners.
                    965: Circles and ellipses have corners too;
                    966: an arc has the same corners as the circle of which it is a part.
                    967: The words
                    968: .CW left ,
                    969: .CW right ,
                    970: .CW top ,
                    971: and
                    972: .CW bottom
                    973: are synonyms for
                    974: .CW west ,
                    975: .CW east ,
                    976: .CW north
                    977: and
                    978: .CW south .
                    979: .PP
                    980: It is often easiest to position objects by positioning
                    981: some part of one at some part of another,
                    982: for example the southwest corner of one at the southeast corner
                    983: of another.
                    984: The
                    985: .CW with
                    986: attribute
                    987: permits this kind of positioning:
                    988: .P1
                    989: box ht 0.75 wid 0.75
                    990: box ht 0.5 wid 0.5 with .sw at last box.se
                    991: .P2
                    992: .PS
                    993: box ht 0.75 wid 0.75
                    994: box ht 0.5 wid 0.5 with .sw at last box.se
                    995: .PE
                    996: Notice that the corner after
                    997: .CW with
                    998: is written
                    999: .CW .sw .
                   1000: .PP
                   1001: As another example, consider
                   1002: .P1
                   1003: ellipse
                   1004: ellipse ht .2 wid .3 with .se at 1st ellipse.nw
                   1005: ellipse ht .2 wid .3 with .sw at 1st ellipse.ne
                   1006: .P2
                   1007: .PS
                   1008: ellipse
                   1009: ellipse ht .2 wid .3 with .se at 1st ellipse.nw
                   1010: ellipse ht .2 wid .3 with .sw at 1st ellipse.ne
                   1011: .PE
                   1012: .LP
                   1013: .PP
                   1014: Sometimes it is desirable to have a line intersect a circle
                   1015: at a point which is not one of the eight compass points
                   1016: that
                   1017: .IT pic
                   1018: knows about.
                   1019: In such cases, the proper visual effect can be obtained by using
                   1020: the attribute
                   1021: .CW chop
                   1022: to chop off part of the line:
                   1023: .P1
                   1024: circlerad = 0.15; arrowhead = 7
                   1025: circle "a"
                   1026: circle "b" at 1st circle - (0.4, 0.6)
                   1027: circle "c" at 1st circle + (0.4, -0.6)
                   1028: arrow from 1st circle to 2nd circle chop
                   1029: arrow from 1st circle to 3rd circle chop
                   1030: .P2
                   1031: .PS
                   1032: circlerad = 0.15; arrowhead = 7
                   1033: circle "a"
                   1034: circle "b" at 1st circle - (0.4, 0.6)
                   1035: circle "c" at 1st circle + (0.4, -0.6)
                   1036: arrow from 1st circle to 2nd circle chop
                   1037: arrow from 1st circle to 3rd circle chop
                   1038: reset
                   1039: .PE
                   1040: By default the line is chopped by
                   1041: .CW circlerad
                   1042: at each end.
                   1043: This may be changed:
                   1044: .P1
                   1045: line ... chop \f2r\fP
                   1046: .P2
                   1047: chops both ends by
                   1048: \f2r\fP, and
                   1049: .P1
                   1050: line ... chop \f2r1\fP chop \f2r2\fP
                   1051: .P2
                   1052: chops the beginning by
                   1053: .IT r1
                   1054: and the end by
                   1055: .IT r2 .
                   1056: More complicated intersections can be computed with
                   1057: the built-in trigonometric functions listed in the next section.
                   1058: .PP
                   1059: There is one other form of positioning that is sometimes useful,
                   1060: to refer to a point some fraction of the way between
                   1061: two other points.
                   1062: This can be expressed in 
                   1063: .IT pic
                   1064: as
                   1065: .P1
                   1066: \f2fraction\fP of the way between \f2position1\fP and \f2position2\fP
                   1067: .P2
                   1068: where
                   1069: .IT fraction
                   1070: is any expression, and
                   1071: .IT position1
                   1072: and
                   1073: .IT position2
                   1074: are any positions.
                   1075: You can abbreviate this rather windy phrase;
                   1076: ``of the way'' is optional, and the whole thing can
                   1077: be written instead as
                   1078: .P1
                   1079: \f2fraction\fP < \f2position1\fP , \f2position2\fP >
                   1080: .P2
                   1081: As a pair of examples:
                   1082: .P1
                   1083: box
                   1084: arrow right from 1/3 of the way between last box.ne and last box.se
                   1085: arrow right from 2/3 <last box.ne, last box.se>
                   1086: .P2
                   1087: .PS
                   1088: box
                   1089: arrow right from 1/3 of the way between last box.ne and last box.se
                   1090: arrow right from 2/3 <last box.ne, last box.se>
                   1091: .PE
                   1092: .P1
                   1093: A:  ellipse
                   1094:     ellipse ht .2 wid .3 with .se at 1st ellipse.nw
                   1095:     ellipse ht .2 wid .3 with .sw at 1st ellipse.ne
                   1096:     circle rad .05 at 0.5 <A.nw,A.c>
                   1097:     circle rad .05 at 0.5 <A.ne,A.c>
                   1098:     arc from 0.25 <A.w,A.e> to 0.75 <A.w,A.e>
                   1099: .P2
                   1100: .PS
                   1101: A:     ellipse
                   1102:        ellipse ht .2 wid .3 with .se at 1st ellipse.nw
                   1103:        ellipse ht .2 wid .3 with .sw at 1st ellipse.ne
                   1104:        circle rad .05 at 0.5 <A.nw,A.c>
                   1105:        circle rad .05 at 0.5 <A.ne,A.c>
                   1106:        arc from 0.25 <A.w,A.e> to 0.75 <A.w,A.e>
                   1107: .PE
                   1108: Naturally,
                   1109: the distance given by
                   1110: .IT fraction
                   1111: can be greater than 1 or less than 0.
                   1112: .PP
                   1113: Advice:\ 
                   1114: experience suggests that the easiest way to position objects
                   1115: is by placing them relative to previous objects
                   1116: and places, using
                   1117: .CW with ,
                   1118: .CW at ,
                   1119: etc.
                   1120: This is better than using
                   1121: .CW move ;
                   1122: you should generally avoid
                   1123: .CW move .
                   1124: .NH
                   1125: Variables, Expressions and Built-in Functions
                   1126: .PP
                   1127: It's generally a bad idea to write everything in 
                   1128: absolute coordinates if you are likely
                   1129: to change things.
                   1130: .IT Pic
                   1131: variables let you parameterize your picture:
                   1132: .P1
                   1133: a = 0.5;  b = 1
                   1134: 
                   1135: box wid a ht b
                   1136: ellipse wid a/2 ht 1.5*b
                   1137: Box2:  Box1 - (a/2, b/2)
                   1138: .P2
                   1139: Expressions may use the standard operators
                   1140: .CW + ,
                   1141: .CW - ,
                   1142: .CW * ,
                   1143: .CW / ,
                   1144: .CW % ,
                   1145: .CW ^
                   1146: (exponentiation),
                   1147: and parentheses for grouping.
                   1148: .PP
                   1149: The most important variables are the predefined ones for
                   1150: controlling the default sizes of objects,
                   1151: listed in Section 3.
                   1152: These may be set at any time in any picture,
                   1153: and retain their values from picture to picture until reset.
                   1154: .PP
                   1155: You can use the height, width, radius,
                   1156: and
                   1157: .IT x
                   1158: and
                   1159: .IT y
                   1160: coordinates of any object or corner in an expression:
                   1161: .P1
                   1162: Box1.x         # the \f2x\fP coordinate of the center of Box1
                   1163: Box1.ne.y      # the \f2y\fP coordinate of the northeast corner of Box1
                   1164: Box1.wid       # the width of Box1
                   1165: Box1.ht                # and its height
                   1166: 2nd last circle.rad    # the radius of the 2nd last circle
                   1167: .P2
                   1168: .PP
                   1169: Any pair of expressions enclosed in parentheses
                   1170: defines a position;  furthermore such positions
                   1171: can be added or subtracted to yield new positions:
                   1172: .EQ
                   1173: delim $$
                   1174: define cw X font CW X
                   1175: .EN
                   1176: .P1
                   1177: (\f2x\fP, \f2y\fP)
                   1178: ($x sub 1$, $y sub 1$) + ($x sub 2$, $y sub 2$)
                   1179: .P2
                   1180: If $p sub 1$ and $p sub 2$ are positions, then
                   1181: $( p sub 1 , p sub 2 )$
                   1182: refers to the point
                   1183: $( p sub 1 font CW .x ,~ p sub 2 font CW .y )$.
                   1184: .PP
                   1185: .IT Pic
                   1186: provides a small collection of standard functions:
                   1187: .DS
                   1188: .ta 3i
                   1189: $cw "sin" (expr)$, $cw "cos" (expr)$, $cw atan2 (y,x)$ (angle in radians)
                   1190: $cw "log" (expr)$, $cw "exp" (expr)$   (Beware: both base 10)
                   1191: $cw "sqrt" (expr)$, $cw "max" (e sub 1 , e sub 2 )$, $cw "min" (e sub 1 , e sub 2 )$
                   1192: $cw "int" (expr)$      (integer part of $expr$)
                   1193: $cw rand ()$   (random number between 0 and 1)
                   1194: .DE
                   1195: .EQ
                   1196: delim off
                   1197: .EN
                   1198: .NH
                   1199: More on Text
                   1200: .PP
                   1201: Normally, text is centered
                   1202: at the geometric center of the object it is associated with.
                   1203: The attribute
                   1204: .CW ljust
                   1205: causes the left end to be at the specified point
                   1206: (which means that the text lies to the right of the specified place!),
                   1207: and
                   1208: .CW rjust
                   1209: puts the right end at the place.
                   1210: .CW above
                   1211: and
                   1212: .CW below
                   1213: center the text one half line space in the given direction.
                   1214: .PP
                   1215: Text attributes can be compounded:
                   1216: .P1
                   1217: arrow 1 "ljust above" ljust above
                   1218: .P2
                   1219: .PS
                   1220: arrow 1 "ljust above" ljust above
                   1221: .PE
                   1222: .LP
                   1223: .PP
                   1224: Text is most often an attribute of some other object,
                   1225: but you can also have self-standing text:
                   1226: .P1
                   1227: "origin" "(0,0)" at 0,0
                   1228: "this is" "(1,1)" at 1,1
                   1229: box ht 1 wid 1 dotted with .sw at 0,0
                   1230: .P2
                   1231: .PS
                   1232: "origin" "(0,0)" at 0,0
                   1233: "this is" "(1,1)" at 1,1
                   1234: box ht 1 wid 1 dotted with .sw at 0,0
                   1235: .PE
                   1236: .LP
                   1237: In effect, \f2n\fP text strings are contained in an invisible box
                   1238: of width
                   1239: .CW textwid
                   1240: and height \f2n\fP \(mu
                   1241: .CW textht .
                   1242: The variables
                   1243: .CW textwid
                   1244: and
                   1245: .CW textht
                   1246: may be set to any values;
                   1247: they are normally zero.
                   1248: .PP
                   1249: A list of numeric expressions can be converted to a formatted string
                   1250: with the
                   1251: .CW sprintf
                   1252: function and used anywhere a quoted string can be:
                   1253: .P1
                   1254: B: box wid log(20)
                   1255:    sprintf("width = %g, height = %g ", B.wid, B.ht) rjust at B.w
                   1256: .P2
                   1257: .PS
                   1258: B: box wid log(20)
                   1259:    sprintf("width = %g, height = %g ", B.wid, B.ht) rjust at B.w
                   1260: .PE
                   1261: .......
                   1262: .NH
                   1263: Lines and Splines
                   1264: .PP
                   1265: A ``line'' may actually be a path,
                   1266: that is, it may consist of connected segments:
                   1267: .P1
                   1268: line right 1 then down .5 left 1 then right 1
                   1269: .P2
                   1270: .PS
                   1271: line right 1 then down .5 left 1 then right 1
                   1272: .PE
                   1273: The word
                   1274: .CW then
                   1275: separates components of the path.
                   1276: .PP
                   1277: A spline is a smooth curve guided by a set of straight lines
                   1278: just like the line above.
                   1279: It begins at the same place, ends at the same place,
                   1280: and in between is tangent to the mid-point of each guiding line.
                   1281: The syntax for a spline is identical to a (path) line
                   1282: except for using
                   1283: .CW spline
                   1284: instead of
                   1285: .CW line :
                   1286: .P1
                   1287: line dashed right 1 then down .5 left 1 then right 1
                   1288: spline from start of last line \e
                   1289:   right 1 then down .5 left 1 then right 1
                   1290: .P2
                   1291: .PS
                   1292: line dashed right 1 then down .5 left 1 then right 1
                   1293: spline from start of last line \
                   1294:   right 1 then down .5 left 1 then right 1
                   1295: .PE
                   1296: (Long input lines can be split by ending each piece
                   1297: with a backslash.)
                   1298: .PP
                   1299: The elements of a path, whether line or spline,
                   1300: are specified as a series of points,
                   1301: either in absolute terms or by
                   1302: .CW up ,
                   1303: .CW down , 
                   1304: etc.
                   1305: .P1
                   1306: spline right then up then left then down ->
                   1307: .P2
                   1308: .PS
                   1309: spline right then up then left then down ->
                   1310: .PE
                   1311: .P1
                   1312: spline right then up left then down ->
                   1313: .P2
                   1314: .PS
                   1315: spline right then up left then down ->
                   1316: .PE
                   1317: .PP
                   1318: Notice that arrowheads may be put on the ends
                   1319: of a line or spline.
                   1320: .NH
                   1321: Blocks
                   1322: .PP
                   1323: Any sequence of
                   1324: .IT pic
                   1325: statements may be enclosed in
                   1326: brackets
                   1327: .CW [
                   1328: and
                   1329: .CW ]
                   1330: to form
                   1331: a block,
                   1332: which can then be treated as a single object,
                   1333: and manipulated rather like an ordinary box:
                   1334: .P1
                   1335: box "1"
                   1336: [ box "2"; arrow "3" above; box "4" ] with .n at last box.s - (0,0.1)
                   1337: "Thing 2: " rjust at last [].w
                   1338: .P2
                   1339: .PS
                   1340: box "1"
                   1341: [ box "2"; arrow "3" above; box "4" ] with .n at last box.s - (0,0.1)
                   1342: "Thing 2: " rjust at last [].w
                   1343: .PE
                   1344: Notice that
                   1345: ``last''-type constructs treat blocks as a unit and don't look
                   1346: inside for objects:
                   1347: .CW last "" ``
                   1348: .CW box.s ''
                   1349: refers to box 1, not box 2 or 4.
                   1350: You can use
                   1351: .CW last\ [] ,
                   1352: etc.,
                   1353: just like
                   1354: .CW last\ box .
                   1355: .PP
                   1356: Blocks have the same compass corners as
                   1357: boxes (determined by the bounding box).
                   1358: It is also
                   1359: possible to position a block by placing either an absolute 
                   1360: coordinate (like
                   1361: .CW 0,0 )
                   1362: or an internal label (like
                   1363: .CW A )
                   1364: at some
                   1365: external point, as in
                   1366: .P1
                   1367: [ ...; A: ...; ... ] with .A at ...
                   1368: .P2
                   1369: By default, blocks join with other things as boxes do, at the
                   1370: center of the appropriate side.
                   1371: .PP
                   1372: Names of variables and places within a block are local
                   1373: to that block, and thus do not affect variables and places
                   1374: of the same name outside.
                   1375: (In particular, that includes the built-in variables like
                   1376: .CW boxwid ,
                   1377: etc.;
                   1378: if they are set within a block,
                   1379: they revert to their original values when the block is left.)
                   1380: You can get at the internal
                   1381: place names with constructs like
                   1382: .P1
                   1383: last [].A
                   1384: .P2
                   1385: or
                   1386: .P1
                   1387: B.A
                   1388: .P2
                   1389: where
                   1390: .CW B
                   1391: is a name attached to a block:
                   1392: .P1
                   1393: B:  [ ... ;  A: ...;  ]
                   1394: .P2
                   1395: When combined with
                   1396: .CW define
                   1397: statements (next section), blocks provide
                   1398: a reasonable simulation of a procedure mechanism.
                   1399: .PP
                   1400: Although blocks nest,
                   1401: it is currently possible to look only one level deep
                   1402: with constructs like
                   1403: .CW B.A ,
                   1404: although
                   1405: .CW A
                   1406: may be
                   1407: further qualified by a corner name (i.e.,
                   1408: .CW B.A.sw
                   1409: or
                   1410: .CW top
                   1411: .CW of
                   1412: .CW B.A
                   1413: are legal).
                   1414: .PP
                   1415: The following example illustrates most of the points made above
                   1416: about how blocks work:
                   1417: .P1
                   1418: h = .5;  dh = .02;  dw = .1
                   1419: [
                   1420:        Ptr: [
                   1421:                boxht = h; boxwid = dw
                   1422:                A: box
                   1423:                B: box
                   1424:                C: box
                   1425:                box wid 2*boxwid "..."
                   1426:                D: box
                   1427:        ]
                   1428:        Block: [
                   1429:                boxht = 2*dw; boxwid = 2*dw
                   1430:                movewid = 2*dh
                   1431:                A: box; move
                   1432:                B: box; move
                   1433:                C: box; move
                   1434:                box invis "..." wid 2*boxwid; move
                   1435:                D: box
                   1436:        ] with .t at Ptr.s - (0,h/2)
                   1437:        arrow from Ptr.A to Block.A.nw + (dh,0)
                   1438:        arrow from Ptr.B to Block.B.nw + (dh,0)
                   1439:        arrow from Ptr.C to Block.C.nw + (dh,0)
                   1440:        arrow from Ptr.D to Block.D.nw + (dh,0)
                   1441: ]
                   1442: box dashed ht last [].ht+dw wid last [].wid+dw at last []
                   1443: .P2
                   1444: This produces
                   1445: .PS
                   1446: h = .5
                   1447: dh = .02
                   1448: dw = .1
                   1449: [
                   1450:        Ptr: [
                   1451:                boxht = h; boxwid = dw
                   1452:                A: box
                   1453:                B: box
                   1454:                C: box
                   1455:                box wid 2*boxwid "..."
                   1456:                D: box
                   1457:        ]
                   1458:        Block: [
                   1459:                boxht = 2*dw; boxwid = 2*dw
                   1460:                movewid = 2*dh
                   1461:                A: box; move
                   1462:                B: box; move
                   1463:                C: box; move
                   1464:                box invis "..." wid 2*boxwid; move
                   1465:                D: box
                   1466:        ] with .t at Ptr.s - (0,h/2)
                   1467:        arrow from Ptr.A to Block.A.nw + (dh,0)
                   1468:        arrow from Ptr.B to Block.B.nw + (dh,0)
                   1469:        arrow from Ptr.C to Block.C.nw + (dh,0)
                   1470:        arrow from Ptr.D to Block.D.nw + (dh,0)
                   1471: ]
                   1472: box dashed ht last [].ht+dw wid last [].wid+dw at last []
                   1473: .PE
                   1474: .NH
                   1475: Macros
                   1476: .PP
                   1477: .IT Pic
                   1478: provides a basic macro facility.
                   1479: In the simplest form,
                   1480: .P1
                   1481: define  \f2name\fP  { \f2replacement text\fP }
                   1482: .P2
                   1483: defines
                   1484: .IT name
                   1485: to be the
                   1486: .IT "replacement text" .
                   1487: Any subsequent occurrence of
                   1488: .IT name
                   1489: will be replaced by
                   1490: .IT "replacement text" .
                   1491: .PP
                   1492: Macros may have arguments.
                   1493: If the replacement text of a macro definition contains occurrences of
                   1494: .CW $1 ,
                   1495: .CW $2 ,
                   1496: etc.,
                   1497: these will be replaced by the corresponding actual arguments
                   1498: when the macro is invoked.
                   1499: The invocation for a macro with arguments is
                   1500: .P1
                   1501: name(arg1, arg2, ...)
                   1502: .P2
                   1503: Non-existent arguments are replaced by null strings.
                   1504: Macro definitions last from picture to picture;
                   1505: a macro definition can be removed by
                   1506: .P1
                   1507: undef \f2macro-name\fP
                   1508: .P2
                   1509: .PP
                   1510: As an example, one might define a
                   1511: .CW square
                   1512: by
                   1513: .P1
                   1514: define square { box ht $1 wid $1  $2 }
                   1515: .P2
                   1516: and use it as
                   1517: .P1
                   1518: square(1, "one" "inch")
                   1519: square(0.5)
                   1520: square(0.25, "\es-4tiny\es+4" dashed)
                   1521: .P2
                   1522: .PS
                   1523: define square { box ht $1 wid $1  $2 }
                   1524: square(1, "one" "inch")
                   1525: square(0.5)
                   1526: square(0.25, "\s-4tiny\s+4" dashed)
                   1527: .PE
                   1528: Notice how the second argument may be used to pass in arbitrary contents.
                   1529: .PP
                   1530: Coordinates like
                   1531: .IT x,y
                   1532: may be enclosed in parentheses,
                   1533: as in
                   1534: .IT x,y ), (
                   1535: so they can be included in a macro argument.
                   1536: .NH
                   1537: File Copy
                   1538: .PP
                   1539: The statement
                   1540: .P1
                   1541: copy "\f2filename\fP"
                   1542: .P2
                   1543: inserts the contents of the named file
                   1544: at that point in the input.
                   1545: Any
                   1546: .CW .PS
                   1547: or
                   1548: .CW .PE
                   1549: lines within the file
                   1550: are ignored, so previously prepared pictures
                   1551: can be used as parts of larger ones without editing.
                   1552: .PP
                   1553: .IT Pic
                   1554: also provides the
                   1555: .CW copy
                   1556: .CW thru
                   1557: mechanism found in
                   1558: .IT grap :
                   1559: .P1
                   1560: copy "\f2file\fP" thru \f2macro-name\fP
                   1561: .P2
                   1562: copies
                   1563: .IT file ,
                   1564: treating each line as an invocation of the named macro
                   1565: (each field being an argument).
                   1566: A literal macro may be used instead of a name:
                   1567: .P1
                   1568: copy "\f2file\fP" thru { \f2macro replacement text\fP }
                   1569: .P2
                   1570: and if no file name is given,
                   1571: the remainder of the input until the next
                   1572: .CW .PE
                   1573: is used.
                   1574: So to plot a set of circles at points whose coordinates and radii
                   1575: are included in-line:
                   1576: .P1
                   1577: copy thru { circle rad $3 at $1,$2 }
                   1578: 0 0 .05
                   1579: 1 1 .1
                   1580: .2 .3 .03
                   1581: .4 .7 .05
                   1582: \&...
                   1583: .P2
                   1584: .PS
                   1585: copy thru { circle rad $3 at $1,$2 }
                   1586: 0 0 .05
                   1587: 1 1 .1
                   1588: .2 .3 .03
                   1589: .4 .7 .05
                   1590: .1 .8 .1
                   1591: .4 .9 .02
                   1592: .7 .5 .15
                   1593: 1 .4 .04
                   1594: .8 0 .075
                   1595: .5 .25 .03
                   1596: .PE
                   1597: .PP
                   1598: The
                   1599: .CW sh
                   1600: command executes an arbitrary commandline:
                   1601: .P1
                   1602: sh { \f2anything\fP }
                   1603: .P2
                   1604: Macros within
                   1605: .IT anything
                   1606: are expanded first.
                   1607: .NH
                   1608: Loops and Conditionals
                   1609: .PP
                   1610: .IT Pic
                   1611: provides an
                   1612: .CW if
                   1613: statement and a
                   1614: .CW for
                   1615: loop.
                   1616: .P1
                   1617: pi = atan2(0,-1)
                   1618: for i = 0 to 2 * pi by 0.1 do {
                   1619:        "\-" at i/2, 0
                   1620:        "s" at i/2, sin(i)/2
                   1621:        "c" at i/2, cos(i)/2
                   1622: }
                   1623: .P2
                   1624: .PS
                   1625: .ps -2
                   1626: pi = atan2(0,-1)
                   1627: for i = 0 to 2 * pi by 0.1 do {
                   1628:        "\-" at i/2, 0
                   1629:        "s" at i/2, sin(i)/2
                   1630:        "c" at i/2, cos(i)/2
                   1631: }
                   1632: .ps +2
                   1633: .PE
                   1634: The
                   1635: .CW by
                   1636: clause is optional;
                   1637: if the value is preceded by a
                   1638: .CW * ,
                   1639: the steps are multiplicative, not additive.
                   1640: The body of the loop is delimited by braces,
                   1641: which are also used for definitions,
                   1642: .CW copy ,
                   1643: .CW sh
                   1644: and
                   1645: .CW if
                   1646: statements.
                   1647: .PP
                   1648: The
                   1649: .CW if
                   1650: statement is
                   1651: .P1
                   1652: if \f2expression\fP then { \f2anything\fP } else { \f2anything\fP }
                   1653: .P2
                   1654: where the
                   1655: .CW else
                   1656: clause is optional.
                   1657: The
                   1658: .IT expression
                   1659: may use the usual relational operators:
                   1660: .CW == ,
                   1661: .CW != ,
                   1662: .CW > ,
                   1663: .CW >= ,
                   1664: .CW < ,
                   1665: .CW <= ,
                   1666: .CW && ,
                   1667: and
                   1668: .CW || .
                   1669: .P1
                   1670: pi = atan2(0,-1)
                   1671: for i = 0 to pi by 0.1 do {
                   1672:        if (s = sin(i)) > 0.8 then { s = 0.8 }
                   1673:        "x" at i/2, s/2
                   1674: }
                   1675: .P2
                   1676: .PS
                   1677: .ps -2
                   1678: pi = atan2(0,-1)
                   1679: for i = 0 to pi by 0.1 do {
                   1680:        if (s = sin(i)) > 0.8 then { s = 0.8 }
                   1681:        "x" at i/2, s/2
                   1682: }
                   1683: .ps +2
                   1684: .PE
                   1685: A string comparison using
                   1686: .CW ==
                   1687: or
                   1688: .CW !=
                   1689: is also permitted, to compare quoted strings:
                   1690: .P1
                   1691: if "\f2string1\fP" == "\f2string2\fP" then ...
                   1692: .P2
                   1693: .NH
                   1694: \fITroff\fP Interface
                   1695: .PP
                   1696: .IT Pic
                   1697: is usually run as a
                   1698: .IT troff
                   1699: preprocessor:
                   1700: .P1
                   1701: pic file | troff -ms
                   1702: .P2
                   1703: Run it before
                   1704: .IT eqn
                   1705: if it is also present.
                   1706: .PP
                   1707: If the
                   1708: .CW .PS
                   1709: line looks like
                   1710: .P1
                   1711: \&.PS <file
                   1712: .P2
                   1713: then the contents of 
                   1714: .CW file
                   1715: are inserted in place of the
                   1716: .CW .PS
                   1717: line,
                   1718: whether or not the file contains
                   1719: .CW .PS
                   1720: or
                   1721: .CW .PE .
                   1722: (This feature is deprecated in favor of the
                   1723: .CW copy
                   1724: statement.)
                   1725: .PP
                   1726: .IT Pic
                   1727: copies the
                   1728: .CW .PS
                   1729: and
                   1730: .CW .PE
                   1731: lines from input to output intact,
                   1732: except that it adds two things on the same line as the
                   1733: .CW .PS :
                   1734: .P1
                   1735: \&.PS h w
                   1736: .P2
                   1737: .CW h
                   1738: and
                   1739: .CW w
                   1740: are the picture height and width in units.
                   1741: The
                   1742: .CW -ms
                   1743: macro package has definitions for
                   1744: .CW .PS
                   1745: and
                   1746: .CW .PE
                   1747: that cause
                   1748: pictures to be centered and offset a bit from surrounding text.
                   1749: (See the appendix.)
                   1750: .PP
                   1751: If 
                   1752: .CW .PF '' ``
                   1753: is used instead of
                   1754: .CW .PE ,
                   1755: the position after printing is restored to where
                   1756: it was before the picture started, instead of being at the bottom.
                   1757: .CW F '' (``
                   1758: is for ``flyback.'')
                   1759: .PP
                   1760: Any input line that begins with a
                   1761: period is assumed to be a
                   1762: .IT troff
                   1763: command that makes sense at that point;
                   1764: it is copied to the output at that point in the document.
                   1765: It is asking for trouble to add vertical space or in any way fiddle with
                   1766: the line spacing here,
                   1767: but point size and font changes are generally harmless:
                   1768: .P1
                   1769: \&.ps 24
                   1770: circle radius .4 at 0,0
                   1771: \&.ps 12
                   1772: circle radius .2 at 0,0
                   1773: \&.ps 8
                   1774: circle radius .1 at 0,0
                   1775: \&.ps 6
                   1776: circle radius .05 at 0,0
                   1777: \&.ps 10       \e" don't forget to restore size
                   1778: .P2
                   1779: .PS
                   1780: .ps 24
                   1781: circle radius .4 at 0,0
                   1782: .ps 12
                   1783: circle radius .2 at 0,0
                   1784: .ps 8
                   1785: circle radius .1 at 0,0
                   1786: .ps 6
                   1787: circle radius .05 at 0,0
                   1788: .ps 10 \" don't forget to restore size
                   1789: .PE
                   1790: .IT Pic
                   1791: does preserve the state of 
                   1792: .IT troff 's
                   1793: fill mode across pictures.
                   1794: .PP
                   1795: It is also safe to include sizes, fonts and local motions
                   1796: within quoted strings
                   1797: .CW \&"..." ) (
                   1798: in
                   1799: .IT pic ,
                   1800: so long as whatever changes are made are unmade before exiting the string.
                   1801: For example, to print text in Helvetica Bold 2 points larger:
                   1802: .P1
                   1803: ellipse "\es+2\ef(HBSmile!\efP\es-2"
                   1804: .P2
                   1805: .PS
                   1806: ellipse "\s+2\f(HBSmile!\fP\s-2"
                   1807: .PE
                   1808: This is essentially the same rule as applies in
                   1809: .IT eqn .
                   1810: .PP
                   1811: There is a subtle problem with complicated equations inside
                   1812: .IT pic
                   1813: pictures \(em they come out wrong
                   1814: if
                   1815: .IT eqn
                   1816: has to leave extra vertical space for the equation.
                   1817: If your equation involves more than subscripts and superscripts,
                   1818: you must add to the beginning of each equation the extra information
                   1819: .CW "space 0" :
                   1820: .P1
                   1821: arrow
                   1822: box "$space 0 {H( omega )} over {1 - H( omega )}$"
                   1823: arrow
                   1824: .P2
                   1825: .EQ
                   1826: delim $$
                   1827: .EN
                   1828: .PS
                   1829: arrow
                   1830: box "$space 0 {H( omega )} over {1 - H( omega )}$"
                   1831: arrow
                   1832: .PE
                   1833: .NH
                   1834: Some Examples
                   1835: .PP
                   1836: Here are a handful of larger examples:
                   1837: .KS
                   1838: .PS
                   1839: define ndblock X
                   1840:        box wid boxwid/2 ht boxht/2
                   1841:        down;  box same with .t at bottom of last box;   box same
                   1842: X
                   1843: .ps -2
                   1844: .ft CW
                   1845: boxht = .2; boxwid = .3; dx = 0.05
                   1846: down; box; box; box; box ht 3*boxht "." "." "."
                   1847: L: box; box; box invis wid 2*boxwid "hashtab:" with .e at 1st box .w
                   1848: right
                   1849: Start: box wid .5 with .sw at 1st box.ne + (.4,.2) "..."
                   1850: N1: box wid .2 "n1";  D1: box wid .3 "d1"
                   1851: N3: box wid .4 "n3";  D3: box wid .3 "d3"
                   1852: box wid .4 "..."
                   1853: N2: box wid .5 "n2";  D2: box wid .2 "d2"
                   1854: 
                   1855: arrow right from 2nd box 
                   1856: ndblock
                   1857: spline -> right .2 from 3rd last box then to N1.sw + (dx,0)
                   1858: spline -> right .3 from 2nd last box then to D1.sw + (dx,0)
                   1859: arrow right from last box
                   1860: ndblock
                   1861: spline -> right .2 from 3rd last box to N2.sw-(dx,.2) to N2.sw+(dx,0)
                   1862: spline -> right .3 from 2nd last box to D2.sw-(dx,.2) to D2.sw+(dx,0)
                   1863: arrow right 2*linewid from L
                   1864: ndblock
                   1865: spline -> right .2 from 3rd last box to N3.sw + (dx,0)
                   1866: spline -> right .3 from 2nd last box to D3.sw + (dx,0)
                   1867: 
                   1868: circlerad = .3
                   1869: circle invis "ndblock"  at last box.e + (1.2,.2)
                   1870: arrow dashed from last circle.w to last box chop 0 chop .3
                   1871: 
                   1872: box invis wid 2*boxwid "ndtable:" with .e at Start.w
                   1873: .ps
                   1874: .ft
                   1875: .PE
                   1876: .KE
                   1877: .sp
                   1878: .P1
                   1879: .vs -1p
                   1880: define ndblock {
                   1881:        box wid boxwid/2 ht boxht/2
                   1882:        down;  box same with .t at bottom of last box;   box same
                   1883: }
                   1884: boxht = .2; boxwid = .3; circlerad = .3; dx = 0.05
                   1885: down; box; box; box; box ht 3*boxht "." "." "."
                   1886: L: box; box; box invis wid 2*boxwid "hashtab:" with .e at 1st box .w
                   1887: right
                   1888: Start: box wid .5 with .sw at 1st box.ne + (.4,.2) "..."
                   1889: N1: box wid .2 "n1";  D1: box wid .3 "d1"
                   1890: N3: box wid .4 "n3";  D3: box wid .3 "d3"
                   1891: box wid .4 "..."
                   1892: N2: box wid .5 "n2";  D2: box wid .2 "d2"
                   1893: arrow right from 2nd box 
                   1894: ndblock
                   1895: spline -> right .2 from 3rd last box then to N1.sw + (dx,0)
                   1896: spline -> right .3 from 2nd last box then to D1.sw + (dx,0)
                   1897: arrow right from last box
                   1898: ndblock
                   1899: spline -> right .2 from 3rd last box to N2.sw-(dx,.2) to N2.sw+(dx,0)
                   1900: spline -> right .3 from 2nd last box to D2.sw-(dx,.2) to D2.sw+(dx,0)
                   1901: arrow right 2*linewid from L
                   1902: ndblock
                   1903: spline -> right .2 from 3rd last box to N3.sw + (dx,0)
                   1904: spline -> right .3 from 2nd last box to D3.sw + (dx,0)
                   1905: circlerad = .3
                   1906: circle invis "ndblock"  at last box.e + (1.2,.2)
                   1907: arrow dashed from last circle.w to last box chop 0 chop .3
                   1908: box invis wid 2*boxwid "ndtable:" with .e at Start.w
                   1909: .P2
                   1910: .sp
                   1911: .KS
                   1912: .PS 5
                   1913: .ps 8
                   1914: boxht = .5; boxwid = .75
                   1915: circlerad = .25
                   1916:        arrow "source" "code"
                   1917: LA:    box "lexical" "analyzer"
                   1918:        arrow "tokens" above
                   1919: P:     box "parser"
                   1920:        arrow "intermediate" "code"
                   1921: Sem:   box "semantic" "checker"
                   1922:        arrow
                   1923: 
                   1924:        arrow <-> up from top of LA
                   1925: LC:    box "lexical" "corrector"
                   1926:        arrow <-> up from top of P
                   1927: Syn:   box "syntactic" "corrector"
                   1928:        arrow up
                   1929: DMP:   box "diagnostic" "message" "printer"
                   1930:        arrow <-> right  from right of DMP
                   1931: ST:    box "symbol" "table"
                   1932:        arrow from LC.ne to DMP.sw
                   1933:        arrow from Sem.nw to DMP.se
                   1934:        arrow <-> from Sem.top to ST.bot
                   1935: .PE
                   1936: .KE
                   1937: .LP
                   1938: .P1
                   1939: \&.PS 5
                   1940: \&.ps 8
                   1941: \&     arrow "source" "code"
                   1942: \&LA:  box "lexical" "analyzer"
                   1943: \&     arrow "tokens" above
                   1944: \&P:   box "parser"
                   1945: \&     arrow "intermediate" "code"
                   1946: \&Sem: box "semantic" "checker"
                   1947: \&     arrow
                   1948: \&
                   1949: \&     arrow <-> up from top of LA
                   1950: \&LC:  box "lexical" "corrector"
                   1951: \&     arrow <-> up from top of P
                   1952: \&Syn: box "syntactic" "corrector"
                   1953: \&     arrow up
                   1954: \&DMP: box "diagnostic" "message" "printer"
                   1955: \&     arrow <-> right  from right of DMP
                   1956: \&ST:  box "symbol" "table"
                   1957: \&     arrow from LC.ne to DMP.sw
                   1958: \&     arrow from Sem.nw to DMP.se
                   1959: \&     arrow <-> from Sem.top to ST.bot
                   1960: \&.PE
                   1961: .P2
                   1962: .PP
                   1963: There are eighteen objects (boxes and arrows) in the picture,
                   1964: and one line of
                   1965: .IT pic
                   1966: input for each;
                   1967: this seems like an acceptable level of verbosity.
                   1968: .sp
                   1969: .KS
                   1970: .PS
                   1971: .ps -2
                   1972:        circle "DISK"
                   1973:        arrow "character" "defns"
                   1974: CPU:   box "CPU" "(16-bit mini)"
                   1975:        { arrow <- from top of CPU up "input " rjust }
                   1976:        arrow
                   1977: CRT:   "   CRT" ljust
                   1978:        line from CRT - 0,0.075 up 0.15 \
                   1979:                then right 0.5 \
                   1980:                then right 0.5 up 0.25 \
                   1981:                then down 0.5+0.15 \
                   1982:                then left 0.5 up 0.25 \
                   1983:                then left 0.5
                   1984: Paper: CRT + 1.05,0.75
                   1985:        arrow <- from Paper down 1.5
                   1986:        " ...  paper" ljust at end of last arrow + 0, 0.25
                   1987:        circle rad 0.05 at Paper + (-0.055, -0.25)
                   1988:        circle rad 0.05 at Paper + (0.055, -0.25)
                   1989:        "   rollers" ljust at Paper + (0.1, -0.25)
                   1990: .ps +2
                   1991: .PE
                   1992: .ce
                   1993: Basic Digital Typesetter
                   1994: .sp
                   1995: .KE
                   1996: .LP
                   1997: .P1
                   1998: .vs -1
                   1999: \&.PS
                   2000: \&.ps -2
                   2001:        circle "DISK"
                   2002:        arrow "character" "defns"
                   2003: CPU:   box "CPU" "(16-bit mini)"
                   2004:        { arrow <- from top of CPU up "input " rjust }
                   2005:        arrow
                   2006: CRT:   "   CRT" ljust
                   2007:        line from CRT - 0,0.075 up 0.15 \e
                   2008:                then right 0.5 \e
                   2009:                then right 0.5 up 0.25 \e
                   2010:                then down 0.5+0.15 \e
                   2011:                then left 0.5 up 0.25 \e
                   2012:                then left 0.5
                   2013: Paper: CRT + 1.05,0.75
                   2014:        arrow <- from Paper down 1.5
                   2015:        " ...  paper" ljust at end of last arrow + 0, 0.25
                   2016:        circle rad 0.05 at Paper + (-0.055, -0.25)
                   2017:        circle rad 0.05 at Paper + (0.055, -0.25)
                   2018:        "   rollers" ljust at Paper + (0.1, -0.25)
                   2019: \&.ps +2
                   2020: \&.PE
                   2021: \&.ce
                   2022: \&Basic Digital Typesetter
                   2023: .P2
                   2024: .SH
                   2025: Acknowledgements
                   2026: .PP
                   2027: I am indebted to Chris Van Wyk for ideas from several versions of
                   2028: .IT ideal .
                   2029: He and Doug McIlroy have also contributed algorithms
                   2030: for line and circle drawing,
                   2031: and made useful suggestions on the design of
                   2032: .IT pic .
                   2033: Theo Pavlidis contributed the basic spline algorithm;
                   2034: Eric Grosse provided code to compute the bounding box of an arc.
                   2035: Charles Wetherell pointed out reference
                   2036: [2]
                   2037: to me, and made several valuable criticisms on an early
                   2038: draft of the language and manual.
                   2039: The exposition in this manual has been greatly improved
                   2040: by suggestions from Jim Blinn and Mark Miller.
                   2041: I am grateful to
                   2042: my early users \(em
                   2043: Brenda Baker,
                   2044: Dottie Luciani,
                   2045: and Paul Tukey
                   2046: \(em
                   2047: for their suggestions and cheerful use of
                   2048: an often shaky and clumsy system.
                   2049: .PP
                   2050: More recent versions of
                   2051: .IT pic
                   2052: have benefited greatly from
                   2053: adventurous use by
                   2054: Jon Bentley and Ravi Sethi;
                   2055: their comments on the manual are also much appreciated.
                   2056: .SH
                   2057: References
                   2058: .LP
                   2059: |reference_placement
                   2060: .BP
                   2061: ........
                   2062: .SH
                   2063: Appendix A:  \fIPic\fP Reference Manual
                   2064: .SH
                   2065: Pictures
                   2066: .PP
                   2067: The top-level object in
                   2068: .IT pic
                   2069: is the ``picture'':
                   2070: .P1
                   2071: \f2picture\fP:
                   2072:        .PS \f2optional-width\fP \f2optional-height\fP
                   2073:        \f2element-list\fP
                   2074:        .PE
                   2075: .P2
                   2076: If
                   2077: .IT optional-width
                   2078: is present, the picture is made that many inches wide,
                   2079: regardless of any dimensions used internally.
                   2080: The height is scaled in the same proportion unless
                   2081: .IT optional-height
                   2082: is present.
                   2083: If instead the line is
                   2084: .P1
                   2085: \&.PS <f
                   2086: .P2
                   2087: the file
                   2088: .CW f
                   2089: is inserted in place of the
                   2090: .CW .PS
                   2091: line.
                   2092: If
                   2093: .CW .PF
                   2094: is used instead of
                   2095: .CW .PE ,
                   2096: the position after printing is restored to what it was
                   2097: upon entry.
                   2098: .PP
                   2099: In no case will the picture be larger than
                   2100: .CW maxpsht
                   2101: \(mu
                   2102: .CW maxpswid .
                   2103: .SH
                   2104: Elements
                   2105: .PP
                   2106: An
                   2107: .IT element-list
                   2108: is a list of elements (what else?);
                   2109: the elements are
                   2110: .P1
                   2111: \f2element\fP:
                   2112:        \f2primitive  attribute-list\fP
                   2113:        \f2placename\fP : \f2element\fP
                   2114:        \f2placename\fP : \f2position\fP
                   2115:        \f2var\fP = \f2expr\fP
                   2116:        \f2direction\fP
                   2117:        { \f2element-list\fP }
                   2118:        [ \f2element-list\fP ]
                   2119:        for \f2var\fP = \f2expr\fP to \f2expr\fP by \f2expr\fP do { \f2anything\fP }
                   2120:        if \f2expr\fP then { \f2anything\fP } else { \f2anything\fP }
                   2121:        copy \f2file\fP
                   2122:        copy thru \f2macro\fP
                   2123:        copy \f2file\fP thru \fPmacro\fP
                   2124:        sh { \f2commandline\fP }
                   2125:        print \f2expr\fP
                   2126:        reset \f2optional var-list\fP
                   2127:        \f2troff-command\fP
                   2128: .P2
                   2129: .PP
                   2130: Elements are separated by newlines or semicolons;
                   2131: a long element may be continued by ending the line with a backslash.
                   2132: Comments are introduced by a
                   2133: .CW #
                   2134: and terminated by a newline.
                   2135: .PP
                   2136: Variable names begin with a lower case letter;
                   2137: place names begin with upper case.
                   2138: Place and variable names retain their values
                   2139: from one picture to the next.
                   2140: .PP
                   2141: The current position and direction of motion are saved upon entry
                   2142: to a
                   2143: .CW {...}
                   2144: block and restored upon exit.
                   2145: .PP
                   2146: Elements within a block enclosed in
                   2147: .CW [...]
                   2148: are treated as a unit;
                   2149: the dimensions are determined by the extreme points
                   2150: of the contained objects.
                   2151: Names, variables, and direction of motion within a block are local to that block.
                   2152: .PP
                   2153: .IT troff-command
                   2154: is any line that begins with a period.
                   2155: Such a line is assumed to make sense in the context where it appears;
                   2156: accordingly,
                   2157: if it doesn't work, don't call.
                   2158: .SH
                   2159: Primitives
                   2160: .PP
                   2161: The primitive objects are
                   2162: .P1
                   2163: \f2primitive\fP:
                   2164:        box
                   2165:        circle
                   2166:        ellipse
                   2167:        arc
                   2168:        line
                   2169:        arrow
                   2170:        spline
                   2171:        move
                   2172:        \f2text-list\fP
                   2173: .P2
                   2174: .CW arrow
                   2175: is a synonym for
                   2176: .CW line
                   2177: .CW -> .
                   2178: .SH
                   2179: Attributes
                   2180: .PP
                   2181: An
                   2182: .IT attribute-list
                   2183: is a sequence of zero or more attributes;
                   2184: each attribute consists of a keyword, perhaps followed by a value.
                   2185: .P1
                   2186: .ta .5i 2.5i
                   2187: \f2attribute\fP:
                   2188:        h(eigh)t \f2expr\fP     wid(th) \f2expr\fP
                   2189:        rad(ius) \f2expr\fP     diam(eter) \f2expr\fP
                   2190:        up \f2opt-expr\fP       down \f2opt-expr\fP
                   2191:        right \f2opt-expr\fP    left \f2opt-expr\fP
                   2192:        from \f2position\fP     to \f2position\fP
                   2193:        at \f2position\fP       with \f2corner\fP
                   2194:        by \f2expr, expr\fP     then
                   2195:        dotted \f2opt-expr\fP   dashed \f2opt-expr\fP
                   2196:        chop \f2opt-expr\fP     ->  <-  <->
                   2197:        invis   solid
                   2198:        fill \f2opt-expr\fP     same
                   2199:        \f2text-list\fP \f2expr\fP
                   2200: .P2
                   2201: Missing attributes and values are filled in from defaults.
                   2202: Not all attributes make sense for all primitives;
                   2203: irrelevant ones are silently ignored.
                   2204: The attribute
                   2205: .CW at
                   2206: causes the geometrical center to be put at the specified place;
                   2207: .CW with
                   2208: causes the position on the object to be put at the specified place.
                   2209: For lines, splines and arcs,
                   2210: .CW height
                   2211: and
                   2212: .CW width
                   2213: refer to arrowhead size.
                   2214: A bare
                   2215: .IT expr
                   2216: implies motion in the current direction.
                   2217: .SH
                   2218: Text
                   2219: .PP
                   2220: Text is normally an attribute of some primitive;
                   2221: by default it is placed at the geometrical center of the object.
                   2222: Stand-alone text is also permitted.
                   2223: A
                   2224: .IT text-list
                   2225: is a list of text items; a text item is
                   2226: a quoted string optionally followed by positioning requests:
                   2227: .P1
                   2228: \f2text-item\fP:
                   2229:        "..." \f2positioning ...\fP
                   2230:        sprintf("\f2format\fP", \f2expr\fP, \f2...\fP) \f2positioning ...\fP
                   2231: \f2positioning\fP:
                   2232:        center  ljust  rjust  above  below
                   2233: .P2
                   2234: If there are multiple text items for some primitive,
                   2235: they are centered vertically except as qualified.
                   2236: Positioning requests apply to each item independently.
                   2237: .PP
                   2238: Text items can contain
                   2239: .IT troff
                   2240: commands for size and font changes, local motions, etc.,
                   2241: but make sure that these are balanced
                   2242: so that the entering state is restored before exiting.
                   2243: .SH
                   2244: Positions and places
                   2245: .PP
                   2246: A position is ultimately an
                   2247: .IT x,y
                   2248: coordinate pair, but it may be specified in other ways.
                   2249: .P1
                   2250: \f2position\fP:
                   2251:        \f2expr, expr\fP
                   2252:        \f2place\fP \(+- \f2expr, expr\fP
                   2253:        \f2place\fP \(+- ( \f2expr, expr\fP )
                   2254:        ( \f2position\fP,\f2 position\fP )
                   2255:        \f2expr\fP \f2[\fPof the way\f2]\fP between \f2position\fP and \f2position\fP
                   2256:        \f2expr\fP < \f2position\fP , \f2position\fP >
                   2257:        ( \f2position\fP )
                   2258: .sp .5
                   2259: \f2place\fP:
                   2260:        \f2placename\fP \f2optional-corner\fP
                   2261:        \f2corner\fP of \f2placename\fP
                   2262:        \f2nth\fP \f2primitive\fP \f2optional-corner\fP
                   2263:        \f2corner\fP of \f2nth\fP \f2primitive\fP
                   2264:        Here
                   2265: .P2
                   2266: An
                   2267: .IT optional-corner
                   2268: is one of the eight compass points
                   2269: or the center or the start or end of a primitive.
                   2270: .P1
                   2271: \f2optional-corner\fP:
                   2272:        .n  .e  .w  .s  .ne  .se  .nw  .sw  .c  .start  .end
                   2273: \f2corner\fP:
                   2274:        top  bot  left  right  start  end
                   2275: .P2
                   2276: Each object in a picture has an ordinal number;
                   2277: .IT nth
                   2278: refers to this.
                   2279: .P1
                   2280: \f2nth\fP:
                   2281:        \f2n\fPth
                   2282:        \f2n\fPth last
                   2283: .P2
                   2284: Since barbarisms like
                   2285: .CW 1th
                   2286: and
                   2287: .CW 3th
                   2288: are barbaric,
                   2289: synonyms like
                   2290: .CW 1st
                   2291: and
                   2292: .CW 3rd
                   2293: are accepted as well.
                   2294: .SH
                   2295: Variables
                   2296: .PP
                   2297: The built-in variables and their default values are:
                   2298: .P1
                   2299: .ta .5i 2.5i
                   2300:        boxwid 0.75     boxht 0.5
                   2301:        circlerad 0.25  arcrad 0.25
                   2302:        ellipsewid 0.75 ellipseht 0.5
                   2303:        linewid 0.5     lineht 0.5
                   2304:        movewid 0.5     moveht 0.5
                   2305:        textwid 0       textht 0
                   2306:        arrowwid 0.05   arrowht 0.1
                   2307:        dashwid 0.1     arrowhead 2
                   2308:        maxpsht 8.5     maxpswid 11
                   2309:        scale 1 fillval .3
                   2310: .P2
                   2311: These may be changed at any time,
                   2312: and the new values remain in force from picture to picture until changed again
                   2313: or reset by a
                   2314: .CW reset
                   2315: statement.
                   2316: Variables changed within
                   2317: .CW [
                   2318: and
                   2319: .CW ]
                   2320: revert to their previous value upon exit from the block.
                   2321: Dimensions are divided by
                   2322: .CW scale
                   2323: during output.
                   2324: .SH
                   2325: Expressions
                   2326: .PP
                   2327: Expressions in
                   2328: .IT pic
                   2329: are evaluated in floating point.
                   2330: All numbers representing dimensions are taken to be in inches.
                   2331: .EQ
                   2332: delim $$
                   2333: .EN
                   2334: .P1
                   2335: \f2expr\fP:
                   2336:        \f2expr\fP \f2op\fP \f2expr\fP
                   2337:        - \f2expr\fP
                   2338:        ! \f2expr\fP
                   2339:        ( \f2expr\fP )
                   2340:        variable
                   2341:        number
                   2342:        \f2place\fP .x
                   2343:        \f2place\fP .y
                   2344:        \f2place\fP .ht
                   2345:        \f2place\fP .wid
                   2346:        \f2place\fP .rad
                   2347:        sin($expr$)  cos($expr$)  atan2($expr,expr$)  log($expr$)  exp($expr$)
                   2348:        sqrt($expr$)  max($expr,expr$)  min($expr,expr$)  int($expr$)  rand()
                   2349: \f2op\fP:
                   2350:        +  -   *  /   %   ^
                   2351:        <  <=  >  >=  ==  !=  &&  ||
                   2352: .P2
                   2353: .SH
                   2354: Definitions
                   2355: .PP
                   2356: The
                   2357: .CW define
                   2358: and
                   2359: .CW undef
                   2360: statements are not part of the grammar.
                   2361: .P1
                   2362: \f2define\fP:
                   2363:        define \f2name\fP { \f2replacement text\fP }
                   2364: \f2undef\fP:
                   2365:        undef \f2name\fP
                   2366: .P2
                   2367: .EQ
                   2368: delim off
                   2369: .EN
                   2370: Occurrences of
                   2371: .CW $1 ,
                   2372: .CW $2 ,
                   2373: etc.,
                   2374: in the replacement text
                   2375: will be replaced by the corresponding arguments if
                   2376: .IT name
                   2377: is invoked as
                   2378: .P1
                   2379: \f2name\fP(\f2arg1\fP, \f2arg2\fP, ...)
                   2380: .P2
                   2381: Non-existent arguments are replaced by null strings.
                   2382: .IT Replacement
                   2383: .IT text
                   2384: may contain newlines.
                   2385: The
                   2386: .CW undef
                   2387: statement removes the definition of a macro.
                   2388: .SH
                   2389: The .PS and .PE Macros
                   2390: .PP
                   2391: This is the default definition of the
                   2392: .CW .PS
                   2393: and
                   2394: .CW .PE
                   2395: macros:
                   2396: .P1
                   2397:  .de PS        \e" start picture; $1 is height, $2 is width, in inches
                   2398:  .sp .3
                   2399:  .in (\e\en(.lu-\e\e$2)/2u
                   2400:  .ne \e\e$1
                   2401:  ..
                   2402:  .de PE        \e" end of picture
                   2403:  .in
                   2404:  .sp .6
                   2405:  ..
                   2406: .P2
                   2407: .SH
                   2408: Summary of Features Added Since Original Version
                   2409: .PP
                   2410: The built-in functions
                   2411: .CW sin ,
                   2412: .CW cos ,
                   2413: .CW atan2 ,
                   2414: .CW log ,
                   2415: .CW exp ,
                   2416: .CW sqrt ,
                   2417: .CW max ,
                   2418: .CW min ,
                   2419: .CW int ,
                   2420: and
                   2421: .CW rand
                   2422: are available.
                   2423: .PP
                   2424: The
                   2425: .CW copy
                   2426: statement includes data from a file or that follows immediately:
                   2427: .P1
                   2428: copy "\f2filename\fP"
                   2429: copy thru \f2macro\fP
                   2430: copy "\f2filename\fP" thru \f2macro\fP
                   2431: .P2
                   2432: The
                   2433: .IT macro
                   2434: may be either the name of a defined macro, or the body of a macro
                   2435: enclosed in braces.
                   2436: If no filename is given,
                   2437: .CW copy
                   2438: copies the input until the next
                   2439: .CW .PE .
                   2440: .PP
                   2441: The
                   2442: .CW for
                   2443: and
                   2444: .CW if
                   2445: statements provide loops and decision-making:
                   2446: .P1
                   2447: for \f2var\fP=\f2expr\fP to \f2expr\fP by \f2expr\fP do { \f2anything\fP }
                   2448: if \f2expr\fP then { \f2anything\fP } else { \f2anything\fP }
                   2449: .P2
                   2450: The
                   2451: .CW by
                   2452: and
                   2453: .CW else
                   2454: clauses are optional.
                   2455: The
                   2456: .IT expr
                   2457: in an
                   2458: .CW if
                   2459: may use the usual relational operators
                   2460: or the tests
                   2461: .IT str1
                   2462: .CW ==
                   2463: (or
                   2464: .CW != )
                   2465: .IT str2
                   2466: for two quoted strings.
                   2467: .PP
                   2468: The
                   2469: .CW sh
                   2470: command executes any sequence of commands, after expanding any defined names:
                   2471: .P1
                   2472: sh { \f2anything\fP }
                   2473: .P2
                   2474: .PP
                   2475: In all of the above,
                   2476: any single character that does not occur within the body
                   2477: may be used to enclose a body,
                   2478: instead of
                   2479: braces, as in
                   2480: .P1
                   2481: define name X replacement text X
                   2482: .P2
                   2483: .PP
                   2484: Text strings are first-class citizens:
                   2485: a statement beginning with a sequence of text strings is treated
                   2486: as an invisible box with the strings positioned at its center.
                   2487: The variable
                   2488: .CW textht
                   2489: and
                   2490: .CW textwid
                   2491: may be set to any values to control positioning.
                   2492: The height of \f2n\fP such strings is \f2n\fP \(mu
                   2493: .CW textht .
                   2494: .PP
                   2495: It is possible to convert expressions to formatted strings:
                   2496: .P1
                   2497: sprintf("\f2format\fP", \f2expr\fP, \f2expr\fP, ...)
                   2498: .P2
                   2499: is equivalent to a quoted string in any context.
                   2500: Variants of
                   2501: .CW %f
                   2502: and
                   2503: .CW %g
                   2504: are the only sensible format conversions.
                   2505: .PP
                   2506: Built-in variables may be reset to default values with
                   2507: .CW reset .
                   2508: .PP
                   2509: The
                   2510: .CW undef
                   2511: statement removes a macro definition.
                   2512: .PP
                   2513: Arrowheads may be filled with the 
                   2514: .CW arrowhead
                   2515: variable;
                   2516: their positioning is improved on arcs.
                   2517: .PP
                   2518: The width and height of the generated picture
                   2519: may be set independently from the
                   2520: .CW .PS
                   2521: line;
                   2522: the maximum height and width are set from
                   2523: .CW maxpsht 
                   2524: and
                   2525: .CW maxpswid .
                   2526: .PP
                   2527: The state of
                   2528: .IT troff 's
                   2529: fill or no-fill mode is preserved around a picture.
                   2530: .PP
                   2531: Input numbers may be expressed in
                   2532: .CW E
                   2533: notation.
                   2534: .PP
                   2535: Numerous internal changes have been made as well.
                   2536: Any number of objects, text strings, etc., may be used;
                   2537: the only limit is total available memory.
                   2538: Output is now produced in inches instead of units
                   2539: for a particular typesetter,
                   2540: so the 
                   2541: .CW -T
                   2542: option has gone away.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.