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