Annotation of researchv10no/cmd/troff/ancient.nroff/macros.d/mmn.src, revision 1.1.1.1

1.1       root        1: '''\"  PWB Memorandum Macros - 10.125 of 12/3/80
                      2: '''\"  C NROFF Version @(#) mmn.src 10.125@(#)
                      3: '\"    *** COMMENTING CONVENTIONS ***
                      4: '\"    '''\"tab ==> prime comment, used in most terse macro summary
                      5: '\"    ''\"tab  ==> additional external comments
                      6: '\"    '\"tab   ==> internal comments, not shown to user
                      7: '\"    *** MACRO DOCUMENTATION ***
                      8: '\"    (following for external macros)
                      9: '\"    '''\"tabXX: Description [number of args allowed: n or n:m]
                     10: '\"    ''\"tab .XX arguments (with optional arguments in [] )
                     11: '\"    ''\"tab further description, comments, notes, etc.
                     12: '\"    (internal macros similar, but prefixed only by single ')
                     13: ''\"   *** NAMING CONVENTIONS ***
                     14: ''\"   A = upper-case alphabetic; a = lower-case alphabetic;
                     15: ''\"   n = digit; X = A, a, or n.
                     16: ''\"   EXTERNALLY-KNOWN ITEMS (generally in order of preference)
                     17: ''\"   MACROS: AA, A, nA, An
                     18: ''\"   STRINGS: An, nA, AA, A (like macros, but necessarily disjoint)
                     19: ''\"   REGISTERS: Aa, a, An.
                     20: ''\"   INTERNAL ITEMS
                     21: ''\"   MACROS:         )X (orignally defined)
                     22: ''\"                   >X (dynamically created via di, da, de, am)
                     23: ''\"                           ?a (floating displays)
                     24: ''\"   STRINGS:        ]X (dedicated to specific uses)
                     25: ''\"                   }X (dynamic; function return; temps (esp }n))
                     26: ''\"   REGISTERS:      :X (dedicated)
                     27: ''\"                   ?a (sizes of floating displays)
                     28: ''\"                   ;X (function return; temporaries (esp. ;n))
                     29: ''\"                   !a (width of floating displays)
                     30: ''\"                   !A (more dedicated registers)
                     31: '\"    Available Name List
                     32: '\"    macros:
                     33: '\"    )egij03456789
                     34: '\"    (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
                     35: '\"    >FGHIJMOPQUVZaefghijklmno
                     36: '\"    strings:
                     37: '\"    ]ABDFGHIJKLMOPQRSTUVWXYijklmopqsu0789
                     38: '\"    }FGIJKMNOPQRTUVWXYZacdghijklmnqrsuwx56789
                     39: '\"    registers:
                     40: '\"    :K
                     41: '\"    ;HLOQVX8
                     42: '\"    !EGHIJMR456789
                     43: '\"    *** INTERNAL STRINGS ***
                     44: '\"    ]a: list stack for counter :a
                     45: '\"    ]b: list stack for text indent :b
                     46: '\"    ]c: list stack for mark indent :c
                     47: '\"    ]d: list stack for pad distance/justification :d
                     48: '\"    ]e: list stack for type :e
                     49: '\"    ]f: list stack for LI-space :f
                     50: '\"    ]g: current list mark
                     51: '\"    ]h: list stack for mark ]g
                     52: '\"    *** INTERNAL NUMBER REGISTERS ***
                     53: '\"    !A  set if long footnotes already output on this page
                     54: '\"    !B  flag wide display output on this page
                     55: '\"    !F  flag narrow/wide footnotes already on this page
                     56: '\"    :A accumulated amount of space before line :N on this page (.SP)
                     57: '\"    :D flag to indicate inside diversion
                     58: '\"    0 ==> not inside, 1 ==> inside
                     59: '\"    used by .SP to do spacing right
                     60: '\"    :N line number of end of block of blank lines :A long (.SP)
                     61: '\"    :I set to control indenting on paragraphs for Pt 2
                     62: '\"            0 is no indent; 1 is indent
                     63: '\"            also flag to )y (float displays) that am
                     64: '\"            inside header
                     65: '\"    :a current counter for lists
                     66: .nr :a 0 1
                     67: '\"    :b current text indent for lists
                     68: .nr :b 0
                     69: '\"    :c current mark indent for lists
                     70: .nr :c 0
                     71: '\"    :d current pad distance/justification for lists
                     72: .nr :d 0
                     73: '\"    :e current type for lists [0:1]
                     74: '\"    0 ==> simple mark, found in ]g
                     75: '\"    1 ==> autonumber/letter
                     76: .nr :e 0
                     77: '\"    :f current LI-space for lists
                     78: .nr :f 0
                     79: '\"    :g current level for lists = [0:6]
                     80: .nr :g 0 1
                     81: '\"    :h flag for default adjustment mode
                     82: '\"    0 ==> .na,  1 ==> .ad (used by .SA and thus .)R )
                     83: .nr :h 1\" default = adjust???
                     84: '\"    :u flag to controlling page increment & main section increment in )h
                     85: '\"    set by .H 1: = 0 if no section/page increment needed, = 1 if needed
                     86: .nr :u 0
                     87: '\"    !X register is extra top of page margin
                     88: .nr !X 0
                     89: '\"    ;p flag controls floating displays cause a break when output on the current
                     90: '\"    page.  ;p == 1 means they cause a break;  ;p == 0 means no.  set by
                     91: '\"    WC macro.
                     92: .nr ;p 1       \" floating break mode is default
                     93: '\"    !0 flag if there are any figures (Fg may reset to 0 for .H 1)
                     94: .nr !0 0
                     95: '\"    !1 flag if there are any tables (Tb may reset to 0 for .H 1)
                     96: .nr !1 0
                     97: '\"    !2 flag if there are any equations (Ec may reset to 0 for .H 1)
                     98: .nr !2 0
                     99: '\"    !3 flag if there are any exhibits (Ex may reset to 0 for .H 1)
                    100: .nr !3 0
                    101: .nr !N 0  \" copy-to flag; no copy-to's encountered yet
                    102: '\"    *** TEMPORARY REGISTERS ***
                    103: '\"    ;0: .H, .HU, .LI, .SK
                    104: '\"    ;1: .LI, .H, .HU, .)F
                    105: '\"    ;2: .MT and .AF normally zero but set to 1 to suppress headings
                    106: '\"    also temp in .H
                    107: '\"    ;3: .)I. .H.
                    108: '\"    ;4: .SP
                    109: '\"    *** TEMPORARY STRINGS ***
                    110: '\"    }0: .H, .)F
                    111: '\"    }1: .H
                    112: '\"    }2: .H, .MT, .AF
                    113: '\"    following allows for override of Bell Laboratories by .AF
                    114: .ds }2 Bell Laboratories
                    115: '\"    }3: .)I return value; .H
                    116: '\"    *** TEMPORARY MACROS ***
                    117: '\"    >A: .H
                    118: '''\"  *** EXTERNALLY AVAILABLE STRINGS ***
                    119: '''\"  Notation: [n] means n arguments; [n:m] means n to m args
                    120: '''\"  BU: Bullet (for nroff/troff compatibility)
                    121: .ds BU \(bu
                    122: '''\"  EM: Dash (for nroff/troff compatibility)
                    123: .ds EM "\ --\ \"
                    124: '''\"  F : footnote numberer
                    125: .ds F \u\\n+(:p\d\" in the text.\*F
                    126: '''\"  DT: current date (unless overriden by .ND) in Month dy, 19yr
                    127: '''\"  HF: Heading Fonts: gives fonts for levels 1-7 of .H & .HU
                    128: '''\"  default: 3 3 2 2 2 2 2
                    129: '''\"  i.e.:    B B I I I I I
                    130: .ds HF 3 3 2 2 2 2 2
                    131: '''\"  Lf: title for List of Figures
                    132: .ds Lf LIST OF FIGURES
                    133: '''\"  Lt: title for List of Tables
                    134: .ds Lt LIST OF TABLES
                    135: '''\"  Lx: title for list of Exhibits
                    136: .ds Lx LIST OF EXHIBITS
                    137: '''\"  Le: title for List of Equations
                    138: .ds Le LIST OF EQUATIONS
                    139: '''\"  RE: SCCS Release.Level of memomacs
                    140: .ds RE 10.125
                    141: '''\"  Rf: reference numberer
                    142: .ds Rf \u[\\n+(:R]\d\" in the text.\*(Rf
                    143: '''\"  Rp: title for references page
                    144: .ds Rp References
                    145: '''\"  Tm: Trademark indicator
                    146: .ds Tm \uTM\d
                    147: '''\"  *** EXTERNALLY-KNOWN NUMBER REGISTERS ***
                    148: '''\"  Notation: [n:m] means x st n <= x <= m
                    149: '''\"  Au: add'l author info after 'from' [0:1] default 1
                    150: .nr Au 1
                    151: '''\"  C : type of copy [0:3] default 0 (original)
                    152: ''\"   0 original; 1 Official;2 Date;3 Draft
                    153: ''\"   settable via -rCn
                    154: '''\"  Cp: Separate pages for List of Figs, etc., default 0
                    155: ''\"   = 0 ==> Use separate pages
                    156: ''\"   = 1 ==> Put on T of C page
                    157: .nr Cp 0
                    158: '''\"  Cl: Contents level [0:3], default = 2
                    159: ''\"   if heading level <= Cl, it is saved for table of contents,
                    160: ''\"   0 ==> none, 1 ==> .H 1 only, etc.
                    161: .nr Cl 2
                    162: '''\"  D : debug flag, settable to debug mode via -rD1 [0:1], default = 0
                    163: ''\"   0 ==> stop on any error, 1 ==> continue, even if garbage output
                    164: '''\"  Ej: page Ejection flag for headings, default = 0
                    165: ''\"   Eject if heading level <= Ej.
                    166: ''\"   0 ==> no Eject, 1 ==> .bp for level 1 headings, 2 ==> .bp
                    167: ''\"   for levels 1 & 2.
                    168: '\"    nr Ej 0
                    169: '''\"  Ds: display space flag
                    170: .nr Ds 1v
                    171: '''\"  Ec:equation counter
                    172: .nr Ec 0 1
                    173: '''\"  Eq: equation label flag, default 0 means labels on right
                    174: .nr Eq 0
                    175: '''\"  Ex: exhibit counter, initially 0.
                    176: .nr Ex 0 1
                    177: '''\"  De: Eject after each floating display is output [0:1] default 0
                    178: ''\"   0 => no eject;  <> 0  => eject
                    179: .nr De 0
                    180: '''\"  Df: Floating Display Format Specifier [0:7] default 5
                    181: ''\"   The following flags may be added together to set a combination of
                    182: ''\"   conditions.  The flags are:
                    183: ''\"     1: put one display on the current page if it fits
                    184: ''\"     2: put one on the top of each page (only if any are queued)
                    185: ''\"     4: put as many as will fit at the top of the page (always at least
                    186: ''\"           one, if any are in the queue)
                    187: ''\"   Note: if both 2 and 4 are selected, the result is as if only 4 were
                    188: ''\"   specified.  If neither 2 or 4 are set, no floating displays will be
                    189: ''\"   output at the top of the page.  Similarly, if 1 is not set, no
                    190: ''\"   floating displays are output on the current page.
                    191: .nr Df 5
                    192: '''\"  Fg: Figure counter, initially 0.
                    193: .nr Fg 0 1
                    194: '''\"  Fs: amount of spacing between footnote entries; default 1
                    195: .nr Fs 1
                    196: '''\"  H1-H7: heading counters: controlled by .H and .HU
                    197: '''\"  H1: 1st level heading counter, initially 0
                    198: ''\"   incremented by .H 1
                    199: .nr H1 0 1
                    200: '''\"  H2: 2nd level heading counter
                    201: .nr H2 0 1
                    202: '''\"  H3: 3rd level heading counter
                    203: .nr H3 0 1
                    204: '''\"  H4: 4th level heading counter
                    205: .nr H4 0 1
                    206: '''\"  H5: 5th level heading counter
                    207: .nr H5 0 1
                    208: '''\"  H6: 6th level heading counter
                    209: .nr H6 0 1
                    210: '''\"  H7: 7th level heading counter
                    211: .nr H7 0 1
                    212: '''\"  Hb: Break level for headings [0:7], default=2
                    213: ''\"   If heading level <= Hb, break occurs after it, else run-in text.
                    214: ''\"   Break always occurs after .H 1 heading.
                    215: .nr Hb 2
                    216: '''\"  Hc: heading centering level, [0:7], default = 0
                    217: ''\"   if level <= Hc & (level <= Hs | level <= Hb), center heading
                    218: '\"    nr Hc 0
                    219: '''\"  Hi: heading temporary indent (following .H) [0:2], default = 1
                    220: ''\"   when registers Hb and sl create a break or space after a heading
                    221: ''\"   (.H and .HU), Hi controls the indent of next line.
                    222: ''\"   = 0 ==> 0 indent (left margin)
                    223: ''\"   = 1 ==> indent to right as much as paragraph (like .P 1)
                    224: ''\"   = 2 ==> indent to line up with text part of preceding heading
                    225: .nr Hi 1
                    226: '''\"  Hs: space level for headings [0:7], default = 2
                    227: ''\"   if head-level <= Hs, a space is output following the heading.
                    228: ''\"   SEE ALSO: register Hb; .H, .HU.
                    229: .nr Hs 2
                    230: '''\"  Ht: Heading type of numbering (multiple or single)
                    231: '''\"  = 0 ==> multiple (1.1.1 etc), = 1 ==> single (as in outline)
                    232: '\"    nr Ht 0
                    233: '''\"  Hu: level at which HU considered to be [1:7], default = 2
                    234: ''\"   This value is used for Bold, Italic, break, space determination,
                    235: ''\"   and also causes incrementation of counter (H1-H7) as appropriate.
                    236: ''\"   SEE ALSO: registers Bl, Hb, H1-H7, Il, sl; .HU, .H
                    237: .nr Hu 2
                    238: '''\"  Hy: control hyphenation in body
                    239: ''\"   0 - no hyphenation (default)
                    240: ''\"   1 - hyphenate
                    241: .nr Hy 0
                    242: '''\"  Le: list indicator for equations; default 0
                    243: ''\"   = 0 ==> no list generated after TOC
                    244: ''\"   = 1 ==> list generated
                    245: .nr Le 0
                    246: '''\"  Lf: list indicator for figures; default 1
                    247: ''\"   = 0 ==> no list generated after TOC
                    248: ''\"   = 1 ==> list generated
                    249: .nr Lf 1
                    250: '''\"  Li: standard list indent (for .AL), default = 6.
                    251: .nr Li 6
                    252: '''\"  Ls: list level for no LB/LI/LE space; default 6
                    253: '\"    there is no spacing for either LB, for LI, or for LE even if requested
                    254: '\"    if the list depth is greater than Ls value
                    255: .nr Ls 6
                    256: '''\"  Lt: list indicator for tables; default 1
                    257: ''\"   = 0 ==> no list generated after TOC
                    258: ''\"   = 1 ==> list generated
                    259: .nr Lt 1
                    260: '''\"  Lx: list indicator for exhibits; default 1
                    261: ''\"   = 0 ==> no list generated after TOC
                    262: ''\"   = 1 ==> list generated
                    263: .nr Lx 1
                    264: '''\"  Np: flag for numbered paragraphs, default 0
                    265: ''\"   = 0 ==> unnumbered paragraphs
                    266: ''\"   = 1 ==> paragraphs numbered in first-level headings
                    267: .nr Np 0
                    268: '''\"  Oc: Arabic TOC page numbering for OSDD, default 0
                    269: ''\"   = 0 ==> Roman numbering for TOC
                    270: ''\"   = 1 ==> Arabic numbering for TOC
                    271: .nr Oc 0
                    272: '''\"  Of: figure caption punctuation, default 0
                    273: ''\"   = 0 ==> use period
                    274: ''\"   = 1 ==> use dash
                    275: .nr Of 0
                    276: '''\"  )d: counter for paragraph numbers
                    277: .nr )d 0 1
                    278: .af )d 01
                    279: '''\"  Pi: std paragraph indent, default 5
                    280: .nr Pi 5
                    281: '''\"  Ps: amount of paragraph spacing, default 1
                    282: .nr Ps 1
                    283: '''\"  Pt: default paragraph type [0:2], initial value = 0
                    284: ''\"   = 0 ==> left-justified is default for .P macro
                    285: ''\"   = 1 ==> indented first line for .P macro
                    286: ''\"   = 2 ==> indent .P except after .H, .DE, .LE
                    287: .nr Pt 0
                    288: '''\"  Pv: put PRIVATE at top of page [0:2], default 0
                    289: ''\"   = 0 ==> not on any pages
                    290: ''\"   = 1 ==> on first page only
                    291: ''\"   = 2 ==> on every page
                    292: .nr Pv 0
                    293: '''\"  Rf: reference count for CS
                    294: .nr Rf 0
                    295: '''\"  Si: standard indent for displays (default 5)
                    296: .nr Si 5
                    297: '''\"  Tb: Table counter, initially = 0
                    298: .nr Tb 0 1
                    299: '''\"  *** EXTERNALLY-AVAILABLE MACROS ***
                    300: '''\"  RD: promt and read from standard input.
                    301: ''\"   .RD prompt diversion string
                    302: ''\"   This macro prints the prompt message on the standard error
                    303: ''\"   channel (an ascii bel if prompt is empty), and then reads text from
                    304: ''\"   the terminal, using the rd request.  All the input is captured in
                    305: ''\"   the diversion named on the macro line, and the first line (up to the
                    306: ''\"   first newline) is captured in the string named on the macro line.
                    307: .de RD
                    308: 'fl    \" flush partial line first
                    309: .di }w         \" diversion to capture text
                    310: .rd \\$1       \" get the input
                    311: .br
                    312: .di
                    313: .ie \w@\\$3@ \{\
                    314: '\"            set string only if asked for
                    315: .      di }x
                    316: .      ds \\$3 "\\*(}w
                    317: .      br
                    318: .      di
                    319: '      br \}
                    320: .if \w@\\$2@ .rn }w \\$2       \" set diversion only if asked for
                    321: .rm }w }x
                    322: ..
                    323: '''\"  B : Boldface [0:6]
                    324: '''\"  .B ["Bold-arg" [prevailing-arg]] (up to six args)
                    325: ''\"   If bold-arg is present, it is made Boldface,
                    326: ''\"   and then the font reverts to the prevailing font.
                    327: ''\"   If no argument is given, the font is changed to Bold
                    328: ''\"   until explicitly changed again.
                    329: ''\"   If the second argument is given, it is concatenated to the
                    330: ''\"   first one, and return to prevailing font.
                    331: ''\"   Up to six arguments are allowed, they will alternate in font.
                    332: ''\"   SEE ALSO: I, R, .IB, .BI, .RI, .IR, .RB, .BR.
                    333: .de B
                    334: .ie \\n(.$ .nr ;G \\n(.f
                    335: .el .ft 3
                    336: .if \\n(.$ .if !\\n(.$-2 \&\f3\\$1\fP\\$2
                    337: .if \\n(.$-2 \{.ds }i
                    338: .              if @\\n(.f@2@ .ds }i \^
                    339: .              ds }I \&\f3\\$1\fP\\$2\\*(}i
                    340: 'br \}
                    341: .if \\n(.$-2 .if !\\n(.$-4 \\*(}I\f3\\$3\fP\\$4
                    342: .if \\n(.$-4 .if !\\n(.$-6 \\*(}I\f3\\$3\fP\\$4\\*(}i\f3\\$5\fP\\$6
                    343: .if \\n(.$ .ft \\n(;G
                    344: ..
                    345: '''\"  I : Italic font [0:6]
                    346: '''\"  .I [ "italic-arg" [prevailing-arg]] (up to six args)
                    347: ''\"   If italic-arg is given, it is made Italic (TROFF) or underlined
                    348: ''\"   (NROFF), and then font reverts to prevailing.
                    349: ''\"   If the argument is omitted, font is changed to Italic (underlined)
                    350: ''\"   until explicitly changed.
                    351: ''\"   If the second argument is given, it is concatenated to the
                    352: ''\"   first one, with one-half narrow blank, and return to prevailing font.
                    353: ''\"   Up to six arguments are allowed, arguments will alternate in font.
                    354: ''\"   SEE ALSO: .B, .R, .IR, .RI, .IB, .BI, .RB, .BR.
                    355: .de I
                    356: .ie \\n(.$ .nr ;G \\n(.f
                    357: .el .ft 2
                    358: .if \\n(.$ .if !\\n(.$-1 \&\f2\\$1
                    359: .if \\n(.$-1 \{.ds }i \^
                    360: .              if @\\n(.f@2@ .ds }i
                    361: .              ds }I \&
                    362: .              if \w@\\$1@ .ds }I \&\f2\\$1\fP\\*(}i
                    363: 'br \}
                    364: .if \\n(.$-1 .if !\\n(.$-3 \\*(}I\\$2\f2\\$3
                    365: .if \\n(.$-3 .if !\\n(.$-5 \\*(}I\\$2\f2\\$3\fP\\*(}i\\$4\f2\\$5
                    366: .if \\n(.$-5 \\*(}I\\$2\f2\\$3\fP\\*(}i\\$4\f2\\$5\fP\\*(}i\\$6
                    367: .if \\n(.$ .ft \\n(;G
                    368: ..
                    369: '''\"  RI : Alternate Roman and Italic [1:6]
                    370: .de RI
                    371: .nr ;G \\n(.f
                    372: .}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
                    373: ..
                    374: '''\"  RB : Alternate Roman and Bold [1:6]
                    375: .de RB
                    376: .nr ;G \\n(.f
                    377: .}S 1 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
                    378: ..
                    379: '''\"  IR : Alternate Italic and Roman [1:6]
                    380: .de IR
                    381: .nr ;G \\n(.f
                    382: .}S 2 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
                    383: ..
                    384: '''\"  IB : Alternate Italic and Bold [1:6]
                    385: .de IB
                    386: .nr ;G \\n(.f
                    387: .}S 2 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
                    388: ..
                    389: '''\"  BR : Alternate Bold and Roman [1:6]
                    390: .de BR
                    391: .nr ;G \\n(.f
                    392: .}S 3 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
                    393: ..
                    394: '''\"  BI : Alternate Bold and Italic [1:6]
                    395: .de BI
                    396: .nr ;G \\n(.f
                    397: .}S 3 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
                    398: ..
                    399: '''\"  }S : Common part of double-font macros [4:9]
                    400: .de }S
                    401: .ds }i
                    402: .if @\\$1@2@ .if !@\\$5@@ .ds }i\^
                    403: .ie !@\\$4@@ .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(}i" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9"
                    404: .el \\$3
                    405: .ft \\n(;G
                    406: ..
                    407: '''\"  SM : If 1 or 2 args, reduce arg1's point size by 1; append arg2 [1:3]
                    408: '''\"  If 3 args, reduce arg2's point size by 1; prepend arg1 & append arg3.
                    409: .de SM
                    410: .ie \\n(.$-2 \&\\$1\s-1\\$2\s0\\$3
                    411: .el \&\s-1\\$1\s0\\$2
                    412: ..
                    413: '''\"  R : Roman font [0]
                    414: '''\"  .R
                    415: ''\"   Make the current font be Roman.
                    416: ''\"   NOTE: this is intended as the closing bracket for I and B, as in:
                    417: ''\"   .I or .B
                    418: ''\"   one or more lines of text
                    419: ''\"   .R
                    420: .de R
                    421: .ft 1
                    422: .ul0
                    423: ..
                    424: .de EQ
                    425: '''\"  EQ: begin equation display [0:1]
                    426: ''\"   .EQ [label]
                    427: .ds ]E \\$1
                    428: .di >E\"when inside display, begin NESTED DIVERSION
                    429: ..
                    430: '''\"  EN: end equation display [0]
                    431: '''\"  .EN
                    432: .de EN
                    433: \!.br
                    434: .br
                    435: .di\"end diversion into >E
                    436: .rm >E
                    437: .lt \\n(.lu
                    438: .pc
                    439: .if \w@\\*(10\\*(}E@ \{\
                    440: .ie !\\n(Eq \{\
                    441: .    ie \\n(:Y>0 \{.if \\n(:Y<\w@\\*(10@ .nr :Y \w@\\*(10@\"if centered block
                    442: \!\\*(10\h'\\\\n(.lu-\w@\\*(10\\*(]E@u-\\\\n(.iu'\\*(]E
                    443: .    br \}
                    444: .    el .ie \\n(:B=2 .tl \(ts\(ts\\*(10\(ts\\*(]E\(ts\"if centered
                    445: .    el .ie \\n(:B=1 .tl \(ts\h'\\n(Sin'\\*(10\(ts\(ts\\*(]E\(ts\"if indented
                    446: .    el .if \\n(:B=0 .tl \(ts\\*(10\(ts\(ts\\*(]E\(ts\"if left-blocked
                    447: '    br  \}            \" end block output only if strings 10 or ]E have width
                    448: .el \{\
                    449: .    ie \\n(:Y>0 \{.if \\n(:Y<\w@\\*(10@ .nr :Y \w@\\*(10@\"if centered block
                    450: \!\\\\h'-\\\\n(.iu'\\*(]E\\\\h'\\\\n(.iu-\\w@\\*(]E@u'\\*(10
                    451: .    br \}
                    452: .    el .ie \\n(:B=2 .tl \(ts\\*(]E\(ts\\*(10\(ts\(ts\"if centered
                    453: .    el .ie \\n(:B=1 .tl \(ts\h'\\n(Sin'\\*(]E\(ts\(ts\\*(10\(ts\"if indented
                    454: .    el .if \\n(:B=0 .tl \(ts\\*(]E\(ts\(ts\\*(10\(ts\"if left-blocked
                    455: '    br  \} \}         \" end block output only if strings 10 or ]E have width
                    456: .pc %
                    457: .lt
                    458: .rm ]E 10
                    459: .rr :E
                    460: ..
                    461: '''\"  HC: Set hyphenatication character everywhere [0:1]
                    462: ''\"   .HC [hyphen-character]
                    463: '\"    sets hyphen character in all 3 enivornments
                    464: .de HC
                    465: .ev 0
                    466: .hc \\$1
                    467: .ev
                    468: .ev 1
                    469: .hc \\$1
                    470: .ev
                    471: .ev 2
                    472: .hc \\$1
                    473: .ev
                    474: ..
                    475: '''\"  H : Heading, numbered [1:3]
                    476: '''\"  .H level ["heading"] [\*F]
                    477: ''\"   level = subordination value [1:7], 1 = most major, 7 = most minor
                    478: ''\"   1 space is output before heading (level = [2:7])
                    479: ''\"   1 more space is added for level=1, unless register Ej=1,
                    480: ''\"           a .bp occurs to get to next page
                    481: ''\"   a .bp occurs in any case if level <= Ej
                    482: ''\"   heading is Bold, Italic, or Roman depending on value of level-th
                    483: ''\"   item in string HF.  null is considered 1 (Roman).
                    484: ''\"   if level <= Hc & (level <= Hb | level <= Hs), heading is centered
                    485: ''\"   if level <= Hb, a break occurs after the heading
                    486: ''\"   if level <= Hs, a space occurs after it.
                    487: ''\"   if there is break or space, temporary indent is done according to Hi
                    488: ''\"   a .ne is done before the heading to keep it together. its value is:
                    489: ''\"           (size of heading)+1     if run-in text used
                    490: ''\"           (size of heading)+2     if break, but no space
                    491: ''\"           (size of heading)+3     if space after heading
                    492: ''\"   SEE ALSO: Hb, Ej, H1-H7, Hi, Hu, Hs; HF; .HU.
                    493: '\"    NOTE: a (secret) entry of .H 0 "heading" is used to implement .HU.
                    494: '\"    ;0 used as temp
                    495: '\"    ;1 is level, either from arg1, or from Hu.
                    496: '\"    ;2 is temp (width of numbering + blanks)
                    497: '\"    ;3 is temp (from .)I)
                    498: '\"    }0, }1, }2, }3 used as local temp strings
                    499: '\"    >A is created and removed
                    500: '\"    :S is flag for sect-page numbering
                    501: .de H
                    502: '\"    error checks
                    503: .if \\n(:F .)D "H:missing FE"
                    504: .if \\n(:y .)D "H:missing DE"
                    505: .if !\\n(.$ .)D "H:missing arg"
                    506: '\"    ;0 set to 1 on any error
                    507: .nr ;0 0
                    508: .if \\$1-7 .nr ;0 1
                    509: .if \w@\\$1@-\w'0'u .nr ;0 1
                    510: .if \\n(;0 .)D "H:bad arg:\\$1"
                    511: '\"    make sure all List Control items cleared
                    512: '\"    Also, reset the world
                    513: .LC 0
                    514: .br
                    515: .)R
                    516: '\"    derive level in ;1, to control most decisions on format
                    517: .nr ;1 0\\$1
                    518: .if !0\\$1 .nr ;1 \\n(Hu \" for unnumbered heading
                    519: .if !\\n(;1 .)D "H:bad arg:\\$1"\" .H a title
                    520: '\"    clear lower-level counters
                    521: .if 2-\\n(;1 .nr H2 0 1
                    522: .if 3-\\n(;1 .nr H3 0 1
                    523: .if 4-\\n(;1 .nr H4 0 1
                    524: .if 5-\\n(;1 .nr H5 0 1
                    525: .if 6-\\n(;1 .nr H6 0 1
                    526: .if 7-\\n(;1 .nr H7 0 1
                    527: .if 2-\\n(;1 \{.if \\n(:S .)w\"flush floating keeps if .H 1 & sec-page
                    528: .if \\n(:C .nr :p 0 1 \}\" reset fn ctr if .H 1 and :C set
                    529: '\"    do pre-spacing & fix increment of current-level counter
                    530: .SP
                    531: .nr :u 0
                    532: .if \\n(;1-1 .nr H\\n(;1 +1 \"all but 1st-level
                    533: .if !\\n(;1-1 \{.nr :u 1 \"in case we cross page
                    534: .SP 2 \}\"total of 2 space, at least, if 1st level
                    535: .if \\n(;1-1 .if (\\n(Ej+1-\\n(;1)&(\\n(nl-\\n(:J) \{ .if \\n(;C .nr ;C 2      \" force back to 1st column
                    536: .                                   bp \}
                    537: .if !\\n(;1-1 \{.if (\\n(Ej+\\n(:S)&(\\n(nl-\\n(:J) \{ .if \\n(;C .nr ;C 2     \" force back to 1st col
                    538: .                                    bp  \}    \" :S ==> Ej
                    539: .if !\\n(:u-1 .nr H1 +1 \"bump if not done by )h
                    540: .if (\\n(:u=1)&(\\n(:S=1) .nr P 1 \}\" and for sec-page, restart to 1
                    541: .nr :u 0
                    542: '\"    '       additional pre-space if space or break
                    543: '\"    .if !\\n(;1-\\n(Hs .SP 1\"if level <=Hs
                    544: '\"    .if !\\n(;1-\\n(Hb .SP 1\"if level <=Hb
                    545: '\"    all constant pre-space done. now accumulate number, if any
                    546: .ds }0 \\n(H1.
                    547: .if 0\\$1-1 .as }0 \\n(H2
                    548: .if 0\\$1-2 .as }0 .\\n(H3
                    549: .if 0\\$1-3 .as }0 .\\n(H4
                    550: .if 0\\$1-4 .as }0 .\\n(H5
                    551: .if 0\\$1-5 .as }0 .\\n(H6
                    552: .if 0\\$1-6 .as }0 .\\n(H7
                    553: .if \\n(Ht \{  .)I \\n(;1 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7
                    554: .      ds }0 \\*(}3.
                    555: '      br  \}
                    556: .as }0 \ \ \"spaces between number and heading
                    557: .if !0\\$1 .ds }0 \"clear if unnumbered heading
                    558: '\"    at this pt, }0 is number blank blank, and $2 (if any) is heading
                    559: '\"    now set ;0 = 0 (run-in), = 1 (break only), = 2 (space)
                    560: .nr ;0 0
                    561: .if !\\n(;1-\\n(Hb .nr ;0 1
                    562: .if !\\n(;1-\\n(Hs .nr ;0 2
                    563: '\"    following defines for non-run-in and run-in text
                    564: .ds }2
                    565: .if !\\n(;0 .if \w@\\$2@ .ds }2 "  \" 2 adjustable blanks
                    566: '\"    set up ;3 to be increment for later .ne, so that HX can change
                    567: .nr ;3 2v
                    568: '\"    call user exit macro (if any exists) to override numbering
                    569: .HX \\n(;1 0\\$1 "\\$2\\$3"
                    570: '\" for double line indent reset counter if first or second level
                    571: .if \\$1<3 .nr )a 0 1
                    572: .af )a 01
                    573: '\"    for numbered paragraphs reset counter if first level heading
                    574: .if (\\$1=1)&(\\n(Np=1) .nr )d 0
                    575: '\"    figure out number of lines for .ne
                    576: .di >A
                    577: \&\\*(}0\\$2\\$3\\*(}2
                    578: .br
                    579: .di
                    580: .rm >A
                    581: .if \\n(;0-1 .nr ;3 +1v\"add some for post-space
                    582: .ne \\n(;3u+\\n(dnu+\\n(;0v
                    583: '\"    call user exit macro (if any exists) to reset indents
                    584: .HY \\n(;1 0\\$1 "\\$2\\$3"
                    585: '\"    finally put out the heading
                    586: .if \\n(;0 .na                 \" don't change adjust if run-in heading
                    587: .)I \\n(;1 \\*(HF\" get font, }3 = 1/null (R), 2 (I), 3 (B)
                    588: .nr ;3 1
                    589: .nr ;3 \\*(}3-1 \"Roman now = 0; Bold/Italic >0
                    590: '\"    number (if any) appears in Roman (not underlined)
                    591: .nr ;2 \w@\\*(}0@
                    592: .if \\n(;0 \{.in+\\n(;2u
                    593: .ti-\\n(;2u \}
                    594: .nr ;2 \\n(.i\"save current indent for use with Hi = 2
                    595: .if !\\n(;1-\\n(Hc .if \\n(;0 .ce
                    596: \\*(}0\&\c
                    597: '\"    figure out whether cu, ul or none.
                    598: .ds }1 cu
                    599: .if \nU .ds }1 ul
                    600: .if \w@\\*(}0\\$2@-\\n(.l .ds }1 ul
                    601: '\"    even though only $2 is to be underlined,
                    602: '\"    }0 is already in the word buffer
                    603: .if \w@\\*(}0\\$2@u>166m .ds }1 ul\" word buffer size limitation
                    604: .if !\\n(;3 .ds }1
                    605: '\"    cu only if: 1. heading fits on 1 line and
                    606: '\"    2. U == 0 and 3. level asks for  Italic.
                    607: '\"    ul if 4. is true, but any of others false.
                    608: .nr ;s \\n(.f  \" save current font
                    609: .if \\n(;3=2 .ds }1 "ft 3      \" use bold overstrike
                    610: '\\*(}1
                    611: .ie \\n(;0 \{\
                    612: \&\\$2\\$3
                    613: '    in
                    614: '    br \}
                    615: .el \{\&\\$2\&\c
                    616: \&\\$3\\*(}2\&\c
                    617: '    br \}
                    618: .if \\n(;3=2 .ft \\n(;s        \" restore font
                    619: .if (\\n(;1<=\\n(Cl)&(\w@\\$2@>0) .)E \\$1 "\\$2"\"save entry for TOC
                    620: 'na
                    621: .if \\n(:h 'ad
                    622: .if \\n(;0 .br
                    623: .if \\n(;0-1 .SP
                    624: '\"    do .ti only if Hi and Pt are both 1
                    625: .if \\n(;0*\\n(Hi*\\n(Pt .if !\\n(Hi-1+\\n(Pt-1 .ti+\\n(Pin
                    626: .if 0\\$1*\\n(;0 .if \\n(Hi-1 .ti\\n(;2u
                    627: .nr :I 1\"force indent on following .P
                    628: .nr !D \\n(nl          \" mark current position for .P
                    629: .nr !Z \\n()O          \" mark on-line position for .P
                    630: .if (0\\$1=1)&(\\nN=5) \{\
                    631: .      nr Fg 0
                    632: .      nr Tb 0
                    633: .      nr Ec 0
                    634: .      nr Ex 0 \}
                    635: .HZ \\n(;1 0\\$1 "\\$2\\$3"
                    636: .ft 1
                    637: ..
                    638: '''\"  HM: Heading Marker styles [0:7]
                    639: '''\"  .HM [arg1 ... arg7]
                    640: ''\"   args are as .af args: 1,a,A,i,I
                    641: ''\"   provide default in case of omitted args
                    642: .de HM
                    643: .af H1 \\$1 1
                    644: .af H2 \\$2 1
                    645: .af H3 \\$3 1
                    646: .af H4 \\$4 1
                    647: .af H5 \\$5 1
                    648: .af H6 \\$6 1
                    649: .af H7 \\$7 1
                    650: ..
                    651: '''\"  HU: Heading, unnumbered [1:2]
                    652: '''\"  .HU "heading" [\*F]
                    653: ''\"   SEE ALSO: register Hu, bl, br, Il, sl, H1-H7; .H
                    654: .de HU
                    655: .if !\\n(.$ .)D "HU:missing arg"
                    656: .H 0 "\\$1" "\\$2"
                    657: ..
                    658: '''\"  HX: Heading user exit X [3]
                    659: '''\"  .HX level-1 level-2 "heading"
                    660: ''\"   called by .H after number string built, just before heading
                    661: ''\"   size computed and put out.
                    662: ''\"   level-1 [1:7]   heading level, given in .H, or by Hu
                    663: ''\"   level-2 [0:7]   same as level-1 for .H, = 0 for .HU
                    664: ''\"   "heading"       heading given to .H or .HU, may be null
                    665: ''\"   useful items (changeable by user):
                    666: ''\"   }0      has string of accumulated numbers, followed by 2 blanks
                    667: ''\"   }2      string to separate number and heading, normally 2 blanks
                    668: ''\"   also: may want to do .ne dependent on level, add extra pre-space,
                    669: ''\"   change indent (maybe?)
                    670: '\"    .de HX
                    671: '\"    ..
                    672: '''\"  HY: Heading user exit Y [3]
                    673: '''\"  .HY level-1 level-2 "heading"
                    674: ''\"   arguments same as .HX but called after heading
                    675: ''\"   size computed, could be used to reset indents
                    676: '\"    .de HY
                    677: '\"    ..
                    678: '''\"  HZ: Heading user exit Z [3]
                    679: '''\"  .HZ level-1 level-2 "heading"
                    680: '''\"  arguments same as .HX, but called at very end of .H
                    681: ''\"   could be used to reset counters (figures, tables, footnotes, etc)
                    682: '\"    .de HZ
                    683: '\"    ..
                    684: '''\"  LOWEST LEVEL LISTING MACROS - LB,LC,LE,LI.
                    685: '''\"  LB: List Begin (and define parameters) [4:7]
                    686: '''\"  .LB text-indent mark-indent pad type [mark [LI-space [LB-space]]]
                    687: ''\"   text-indent = [0:?] = relative indent of text from current indent
                    688: ''\"   normal = [1:2] (simple mark) or [4:5] (a.\ \ text, 10.\ \ text)
                    689: ''\"   mark-indent = [0:?] = relative indent of beginning of
                    690: ''\"   mark from current indent.  only used when left-justifying (pad = 0).
                    691: ''\"   pad = [1:?] = position difference between right character of
                    692: ''\"   right-justified mark and left character of text. normal = [1:3]
                    693: ''\"       = 0 ==> left justify mark
                    694: ''\"   type = [0:6] notes type of marking desired
                    695: ''\"        = 0 ==> simple mark character(s)
                    696: ''\"        = 1 ==> auto number/letter, form x.
                    697: ''\"        = 2 ==> auto number/letter, form x)
                    698: ''\"        = 3 ==> auto number/letter, form (x)
                    699: ''\"        = 4 ==> auto number/letter, form [x]
                    700: ''\"        = 5 ==> auto number/letter, form <x>
                    701: ''\"        = 6 ==> auto number/letter, form {x}
                    702: ''\"   mark = actual mark character (if type = 0)
                    703: ''\"        = beginning value for auto-marking (if type = 1) = 1,a,A,i,I
                    704: ''\"           Defaults to null (type = 0) or 1 (type > 0)
                    705: ''\"   LI-space = [0:1] = number of blank lines to precede .LI
                    706: ''\"           If = 1, LB-space would normally be 0.
                    707: ''\"           defaults to 1 if omitted.
                    708: ''\"   LB-space = [0:1] = number of blank lines to preced .LB
                    709: ''\"           if omitted, 0 assumed
                    710: .de LB
                    711: .if 4-\\n(.$ .)D "LB:missing arg(s)"
                    712: '\"    .)L \\$1u*1.5n \\$2u*1.5n \\$3n "\\$4" "\\$5" "\\$6" "\\$7"
                    713: .)L 0\\$1n 0\\$2n 0\\$3n "\\$4" "\\$5" "\\$6" "\\$7"
                    714: ..
                    715: '\"    )L: actual LB as in nroff version
                    716: '\"    args already have proper dimension
                    717: .de )L
                    718: .if \\n(:g>5 .)D "LB:too many nested lists"\"if :g now 6
                    719: .if \\n(:g .)A \"push status
                    720: .if !\\n+(:g-1 .ds ]b \\n(.i\"save current indent at outer level
                    721: .nr :b \\n(.iu+0\\$1u \"text indent
                    722: .nr :c \\n(.iu+0\\$2u \"mark indent
                    723: .nr :d 0\\$3 \"pad
                    724: .nr :e 0\\$4 \"type
                    725: .nr :f 0\\$6 \"LI-space
                    726: .if !\w@\\$6@ .nr :f 1
                    727: .ds ]g \\$5
                    728: '\"    take care of omitted case
                    729: .if !\w@\\$5@ \{.ds ]g \&
                    730: .      if \\n(:e .ds ]g 1
                    731: '      br  \}
                    732: .nr :a 0 1
                    733: .if 0\\$4 .af :a \\$5 1\"in case $5 is null
                    734: .if (\\n(:g<=\\n(Ls)&(0\\$7) .SP
                    735: .fi
                    736: .in\\n(:bu
                    737: .ti\\n(:bu\"preserve against .ti of .H
                    738: ..
                    739: '''\"  LC: List Status Clear (to specified level) [1]
                    740: '''\"  .LC nmbr
                    741: ''\"   nmbr = [0:?]
                    742: ''\"   List status information is popped, and the list level decremented
                    743: ''\"   until = nmbr.  Thus, .LC 0 makes sure list information cleared.
                    744: .de LC
                    745: .if \\n(:g-0\\$1 .)B\"which decrements :g
                    746: .if \\n(:g-0\\$1 .LC 0\\$1\"only if more levels to pop
                    747: ..
                    748: '''\"  LE: List End (at current level) [0:1]
                    749: '''\"  .LE [1]
                    750: ''\"   Terminates list at current level (i.e., pops 1 level)
                    751: ''\"   If the optional argument 1 given, a blank line is output.
                    752: .de LE
                    753: .if (\\n(:I>1)&(\\n(nl-\\n(:J) .nr :I 0\" no indent on following .P unless just past )h
                    754: .if \\n(:I<2 .nr :I 0
                    755: .ie \\n(:g<1 .)D "LE:mismatched"
                    756: .el .)B
                    757: .if (\\n(:g<=\\n(Ls)&(\\n(.$>0) .SP
                    758: .nr :J \\n(nl
                    759: ..
                    760: '''\"  LI: List Item [0:2]
                    761: '''\"  .LI ["mark" [1]]
                    762: ''\"   The list item is output according to parameters set by the last
                    763: ''\"   previous .LB at same level.
                    764: ''\"   If no arguments given, the mark used is that established by the .LB.
                    765: ''\"   If "mark" is given alone, it is used in place of the default.
                    766: ''\"   If the "1" option used, the "mark" is used as a prefix to the default.
                    767: .de LI 
                    768: .if !\\n(:g .)D "LI:no lists active" 
                    769: .if (\\n(:g<=\\n(Ls)&(\\n(:f>0) .SP
                    770: .in\\n(:bu
                    771: '\"    if doing space and not inside diversion, then use need
                    772: .if (\\n(:f>0)&(\\n(:D<1) .ne2v
                    773: .ds }0 \\*(]g
                    774: .if \\n(:e .ds }0 \\n+(:a.
                    775: .if \\n(:e-1 .ds }0 \\n(:a)
                    776: .if \\n(:e-2 .ds }0 (\\n(:a)
                    777: .if \\n(:e-3 .ds }0 [\\n(:a]
                    778: .if \\n(:e-4 .ds }0 <\\n(:a>
                    779: .if \\n(:e-5 .ds }0 {\\n(:a}
                    780: .if \\n(.$-1 .ds }0 \\$1\ \\*(}0
                    781: .if \\n(.$=1 .ds }0 \\$1
                    782: .nr ;0 \w@\\*(}0@
                    783: .nr ;1 \\n(:c
                    784: .if \\n(:d .nr ;1 \\n(:bu-\\n(:du-\\n(;0u
                    785: .if !\\n(;1 .nr ;1 0
                    786: .nr ;0 \\n(:bu-\\n(;1u-\\n(;0u
                    787: .ti\\n(;1u
                    788: .if !\\n(;0 .nr ;0 \w@ @u\"want at least one blank
                    789: '\"    if zero-width mark, do hanging indent instead
                    790: .if \w@\\*(}0@ \&\\*(}0\h@\\n(;0u@\&\c
                    791: ..
                    792: '''\"  INTERMEDIATE LIST START MACROS: AL, BL, DL, ML, VL.
                    793: '''\"  AL: Begin Auto-Incremented List [0:2]
                    794: '''\"  .AL [type [text-indent]]
                    795: ''\"   type (if present) is: 1, a, A, i, or I  indicating how list is to
                    796: ''\"   be lettered/numbered.
                    797: ''\"   text-indent gives indentation from current margin to text: 4 is
                    798: ''\"   appropriate for lettered lists (or numbered lists going only to 9),
                    799: ''\"   while 5 is better for numbered lists going higher than 9.
                    800: ''\"   if text-indent only is omitted, it is assumed to be Li.
                    801: ''\"   if type if omitted, it is assumed to be 1.
                    802: .de AL
                    803: .nr !D 0               \" clear header mark (for .P)
                    804: .if !@\\$1@@ .if !@\\$1@1@ .if !@\\$1@a@ .if !@\\$1@A@ .if !@\\$1@I@ .if !@\\$1@i@ .)D "AL:bad arg:\\$1"
                    805: .if \\n(.$<3 \{.ie \w@\\$2@=0 .)L \\n(Lin 0 2n 1 "\\$1" 
                    806: .el .LB 0\\$2 0 2 1 "\\$1" \}
                    807: .if \\n(.$>2 \{.ie \w@\\$2@=0 .)L \\n(Lin 0 2n 1 "\\$1" 0 1
                    808: .el .LB 0\\$2 0 2 1 "\\$1" 0 1 \} 
                    809: ..
                    810: '''\"  BL: Begin Bullet List [0:1]
                    811: '''\"  .BL [text-indent]
                    812: '''\"  (followed by 1 or more .LI which generate bullet items)
                    813: .de BL
                    814: .nr ;0 \\n(Pi
                    815: .if (\\n(.$>0)&(\w@\\$1@>0) .nr ;0 0\\$1
                    816: .ie \\n(.$<2 .LB \\n(;0 0 1 0 \\*(BU
                    817: .el .LB \\n(;0 0 1 0 \\*(BU 0 1
                    818: .rr ;0
                    819: ..
                    820: '''\"  DL: Begin Dashed List [0:1]
                    821: '''\"  .DL [text-indent]
                    822: '''\"  (followed by 1 or more .LI which generate dashed items)
                    823: .de DL
                    824: .nr ;0 \\n(Pi
                    825: .if (\\n(.$>0)&(\w@\\$1@>0) .nr ;0 0\\$1
                    826: .ie \\n(.$<2 .LB \\n(;0 0 1 0 \(em
                    827: .el .LB \\n(;0 0 1 0 \(em 0 1
                    828: .rr ;0
                    829: ..
                    830: '''\"  ML: Begin Marked List [1:2]
                    831: '''\"  .ML mark [text-indent]
                    832: ''\"   similar to Bullet List or Dashed List, but with arbitrary mark
                    833: .de ML
                    834: .if \\n(.$<1 .)D "ML:missing arg"
                    835: .nr ;0 \w@\\$1@u/3u/\\n(.su+1u\" get size in n's
                    836: .ie \\n(.$<2 .LB \\n(;0 0 1 0 "\\$1"
                    837: .el .if \\n(.$=2 .LB 0\\$2 0 1 0 "\\$1"
                    838: .if \\n(.$>2 \{.if !\w@\\$2@ .LB \\n(;0 0 1 0 "\\$1" 0 1
                    839: .      if \w@\\$2@ .LB 0\\$2 0 1 0 "\\$1" 0 1 \}
                    840: ..
                    841: '''\"  RL: Begin Reference List [0:1]
                    842: '''\"  .RL [text-indent]
                    843: ''\"   makes auto-numbered list with square brackets.
                    844: ''\"   text-indent defaults to 6 if omitted.
                    845: .de RL
                    846: .nr ;0 6
                    847: .if (\\n(.$>0)&(\w@\\$1@>0).nr ;0 0\\$1
                    848: .ie \\n(.$<2 .LB \\n(;0 0 2 4 
                    849: .el .LB \\n(;0 0 2 4 1 0 1
                    850: .rr ;0
                    851: ..
                    852: '''\"  VL: Begin Variable-item List [1:2]
                    853: '''\"  .VL text-indent [mark-indent]
                    854: ''\"   followed by: .LI item
                    855: ''\"   text-ident gives distance to text
                    856: ''\"   mark-indent gives indent from current margin to mark, default = 0
                    857: .de VL
                    858: .if \\n(.$<1 .)D "VL:missing arg"
                    859: .ie \\n(.$<3 .LB 0\\$1 0\\$2 0 0
                    860: .el .LB 0\\$1 0\\$2 0 0 \& 0 1
                    861: ..
                    862: '''\"  P : Paragraph [0:1]
                    863: '''\"  .P [type]
                    864: ''\"   if no argument is present, the default paragraph style is used.
                    865: ''\"   type = 0 ==> use left-justified paragraph
                    866: ''\"   type = 1 ==> use indented paragraph
                    867: ''\"   the default is set by the register Pt (same 0:1 meanings)
                    868: ''\"   the Np register controls numbering of paragraphs
                    869: '\"    if Pt = 2, then indent when :I >= 1 or when
                    870: '\"            :I = 0 and nl != :J (spot marked by things
                    871: '\"            that say "don't indent")
                    872: .de P
                    873: .if !((\\n(!D=\\n(nl)&(\\n(!Z=\\n()O)&(\\n(Np=0)) \{\
                    874: '\"                                    \" a .P after a .H is a no-op unless numbered paragraphs
                    875: .br
                    876: .nr ;1 \\n(:J\"save place where "no-indent" last marked
                    877: .nr ;2 \\n(nl\"save place where now
                    878: .SP \\n(Psu*1
                    879: .if !\\n(:D .ne 2
                    880: .ie !\\n(;1-\\n(:J .nr ;2 \\n(;2-\\n(:J
                    881: .el .nr ;2 \\n(nl-\\n(:J
                    882: .nr :J \\n(;2
                    883: .if \\n(.$>0&(0\\$1) .ti+\\n(Pin
                    884: .if \\n(.$=0 \{\
                    885: .      if \\n(Pt=1 .ti+\\n(Pin
                    886: .      if \\n(Pt>1&(\\n(:I) .ti+\\n(Pin
                    887: .      if \\n(Pt>1&(\\n(:I=0)&(\\n(:J>0) .ti+\\n(Pin \}
                    888: .if \\n(Np \{\
                    889: \\n(H1.\\n+()d\ \ \c
                    890: 'br \}
                    891: .nr :I 1 \}            \"force indent on following .P (for Pt 2)
                    892: .nr :u 0
                    893: ..
                    894: '''\"  nP: double-line indented paragraph (from ASC)
                    895: '''\"  .nP
                    896: '\"    uses )a as paragraph number counter (set in .H)
                    897: .de nP
                    898: .P 0
                    899: 
                    900: .br
                    901: .sp -\\n()H
                    902: .de )p
                    903: 'ti 6n
                    904: .rm )p
                    905: .wh \\n(.du+\\n()H
                    906: \\..
                    907: .wh \\n(.du+\\n()H )p
                    908: \\n(H2.\\n+()a\h'|6n'\\c
                    909: ..
                    910: '''\"  S : set point size and vertical spacing
                    911: '''\"  .S [arg1] [arg2] [0:2]
                    912: '\"    :P and !P current point size and vertical spacing respectively
                    913: '\"    :Q and !Q previous point size and vertical spacing respectively
                    914: '\"    first argument is selectable point size
                    915: '\"    second argument is selectable vertical spacing
                    916: '\"    D=default, P=previous, C=current
                    917: .de S
                    918: .if !\\n(:Q .nr :Q \\nS
                    919: .if !\\n(.$ .nr ;0 \\n(:Q
                    920: .if \\n(.$ .if !\w@\\$1@ \{\
                    921: .      nr ;J 2
                    922: .      nr ;0 \\n(:P \}
                    923: .if \w@\\$1@ \{\
                    924: .   ie @\\$1@D@ \{\
                    925: .      nr ;J 1
                    926: .      nr ;0 \\nS \}
                    927: .   el \{\
                    928: .      ie @\\$1@C@ \{\
                    929: .          nr ;J 2
                    930: .          nr ;0 \\n(:P \}
                    931: .      el \{\
                    932: .          ie @\\$1@P@ \{\
                    933: .              nr ;J 3
                    934: .              nr ;0 \\n(:Q \}
                    935: .          el \{.if !\\n(;J \{\
                    936: .              nr ;0 \\n(:P
                    937: .              nr ;0 \\$1 \}\}\}\}\}
                    938: .if 0\\$1-99 .nr ;0 \\nS
                    939: .if !\\n(;0 .)D "S:bad arg \\$1"
                    940: .nr :Q \\n(:P
                    941: .nr :P \\n(;0
                    942: .ps \\n(:Pp
                    943: .nr ;J 0
                    944: .if !\\n(!Q .nr !Q \\nS+2
                    945: .if !\\n(.$-1 \{\
                    946: .   ie \\n(.$ \{\
                    947: .      nr ;K 1
                    948: .      nr ;7 \\n(.s+2 \}
                    949: .   el \{\
                    950: .      nr ;K 3
                    951: .      nr ;7 \\n(!Q \}\}
                    952: .if \\n(.$-1 .if !\w@\\$2@ \{\
                    953: .      nr ;K 2
                    954: .      nr ;7 \\n(!P \}
                    955: .if \w@\\$2@ \{\
                    956: .   ie @\\$2@D@ \{\
                    957: .      nr ;K 1
                    958: .      nr ;7 \\n(.s+2 \}
                    959: .   el \{\
                    960: .      ie @\\$2@C@ \{\
                    961: .          nr ;K 2
                    962: .          nr ;7 \\n(!P \}
                    963: .      el \{\
                    964: .          ie @\\$2@P@ \{\
                    965: .              nr ;K 3
                    966: .              nr ;7 \\n(!Q \}
                    967: .          el \{.if !\\n(;K \{\
                    968: .              nr ;7 \\n(!P
                    969: .              nr ;7 \\$2 \}\}\}\}\}
                    970: .if 0\\$2-99 .nr ;7 \\n(.s+2
                    971: .if !\\n(;7 .)D "S:bad arg \\$2"
                    972: .nr !Q \\n(!P
                    973: .nr !P \\n(;7
                    974: .vs \\n(!Pp
                    975: .nr ;K 0
                    976: ..
                    977: '''\"  pn: set page number
                    978: '''\"  REDEFINES pn REQUEST
                    979: '\"    fake out the function of the pn request so that
                    980: '\"    the P register tracks w/ the % register when .pn used
                    981: .rn pn ]N
                    982: .de pn
                    983: .nr :Z 1\"set flag that .pn invoked
                    984: .]N \\$1\"call real .pn request
                    985: ..
                    986: '''\"  SA: Set Adjustment default [0:1]
                    987: '''\"  .SA [arg]
                    988: ''\"   .SA 0   sets default & current adjustment to no adjust (.na)
                    989: ''\"   .SA 1   sets default & current adjustment to adjust (.ad)
                    990: ''\"   .SA     sets adjustment to current default value
                    991: '\"    SEE ALSO: nr :h, macro )R
                    992: .de SA
                    993: .if \\n(.$ \{.if \\$1-1 .)D "SA:bad arg:\\$1"
                    994: .      nr :h 0\\$1 \}
                    995: 'na
                    996: .if \\n(:h 'ad
                    997: ..
                    998: '''\"  SK: skip pages
                    999: '''\"  .SK [arg]
                   1000: '\"    skip arg pages
                   1001: '\"    if arg omitted, to top of a page
                   1002: .de SK
                   1003: .br
                   1004: .bp
                   1005: .nr ;0 0\\$1-1
                   1006: .if \\n(;0+1 .rs
                   1007: .if \\n(;0+1 .SK \\n(;0
                   1008: ..
                   1009: '''\"  OP: odd page
                   1010: '''\"  .OP
                   1011: '\"    ensure top of odd page
                   1012: .de OP
                   1013: .SK
                   1014: .if !\\nP%2 .SK 1
                   1015: ..
                   1016: '''\"  SP: SPace 1 or more lines [0:1]
                   1017: '''\"  .SP [lines]  defaults to 1 if omitted, must be positive
                   1018: ''\"   multiple .SP calls cooperate in producing only maximum requested
                   1019: ''\"   spacing.
                   1020: ''\"   uses ;4 as temp.
                   1021: ''\"   :A expected to be # of accumulate blank lines
                   1022: ''\"   :N = nl at end of last blank output
                   1023: '\"    when in a diversion, use .d (rather than nl) for position
                   1024: '\"    -mm diversion => :D set
                   1025: '\"    tbl diversion => .z is non-null
                   1026: '\"            careful--SP might occur at the same
                   1027: '\"            position BUT in a different named diversion
                   1028: '\"            (hence, the use of the string }D)
                   1029: '\"    bug: still might be possible, if the same named diversion
                   1030: '\"    is used, that a .SP might occur in the same vertical place.
                   1031: '\"    very unlikely for
                   1032: '\"            a) -mm will zero ;D and ;E whenever :D is cleared
                   1033: '\"            b) tbl generates unique names
                   1034: .de SP
                   1035: .br
                   1036: .ie \\n(:D .)S \\$1\" -mm diversion
                   1037: .el .ie !'\\n(.z'' .)S \\$1\" tbl T{...}T diversion
                   1038: .el \{.rr ;D ;E\"no diversion;remove the SP-in-diversion registers
                   1039: .      nr ;4 1v
                   1040: .      if \\n(.$ .nr ;4 \\$1v
                   1041: .      if !(\\n(nl=\\n(:N) .nr :A 0\" different place for sure
                   1042: .      nr ;4 -\\n(:Au\" remove previous accumulation, if any
                   1043: '\"    space and recompute accumulation 
                   1044: .      if \\n(;4 \{.sp\\n(;4u
                   1045: .              nr :A +\\n(;4u \}
                   1046: .      nr :N \\n(nl \}
                   1047: ..
                   1048: .de )S\"space ala SP but within a diversion
                   1049: .br
                   1050: .if !'\\n(.z'\\*(}D' .rr ;D ;E
                   1051: .nr ;4 1v
                   1052: .if \\n(.$ .nr ;4 \\$1v
                   1053: .if !(\\n(.d=\\n(;D) .nr ;E 0\" different place for sure
                   1054: .nr ;4 -\\n(;Eu\" remove previous accumulation, if any
                   1055: .if \\n(;4 \{.sp\\n(;4u
                   1056: .      nr ;E +\\n(;4u \}
                   1057: .nr ;D \\n(.d
                   1058: .ds }D \\n(.z
                   1059: ..
                   1060: .de TS
                   1061: ''\"   Multi-page tables--carry headings over multiple pages
                   1062: '\"    tbl-generated macros/registers that must be utilized:
                   1063: '\"            macros:         T#
                   1064: '\"            registers:      )P )c
                   1065: '\"    (code gleaned from -ms and from tbl output)
                   1066: '\"    macros used:
                   1067: '\"    .t      diversion containing the top-of-table titles
                   1068: '\"            and line drawing info
                   1069: '\"    T#      tbl-defined macro that draws the bottom portion
                   1070: '\"            of boxed tables
                   1071: '\"    >u      macro into which footer is hidden while T# works
                   1072: '\"    registers used:
                   1073: '\"    ;h      flag that header has printed >t
                   1074: '\"    ;f      flag that footer has printed T#
                   1075: '\"    ;I      temp storage for indent value
                   1076: '\"    ;A      flag that .TS H being used
                   1077: '\"    ;B      flag that .TH encountered
                   1078: '''\"  TS: begin table display [0:1]
                   1079: '''\"  .TS [H]
                   1080: .if (\\n(:D=0)&(\\n(Ds>0) .SP\"space according to Ds if NOT being diverted 
                   1081: .if @\\$1@H@ \{.br\"divert tbl-gen'd text up to TH call
                   1082: .      di >t
                   1083: .      nr ;A 1 \}
                   1084: ..
                   1085: '''\"  TH: end .TS H
                   1086: ''\"   .TH [N]
                   1087: ''\"   the [N] option specifies that the header should be output only
                   1088: ''\"   if it is the first header on the page
                   1089: .de TH\"close off .TS H diversion
                   1090: .if \\n(.du>0.5v \{.nr )P 0
                   1091: .      T# 0 \}
                   1092: .br
                   1093: .di
                   1094: .nr ;I \\n(.i
                   1095: .nr ;B 1
                   1096: .if \\n(;T .if !@\\$1@N@ .nr ;T 0
                   1097: .in 0                  \" this might trip )h
                   1098: .mk #a
                   1099: .mk #b
                   1100: .mk #c
                   1101: .mk #d
                   1102: .mk #e
                   1103: .mk #f
                   1104: .if \\n(;T=0 \{\
                   1105: .      >t                      \" output the header
                   1106: .      nr ;T 1 \}              \" mark header output
                   1107: .in \\n(;Iu
                   1108: .mk )c
                   1109: ..
                   1110: '''\"  TE: end table display [0]
                   1111: '''\"  .TE
                   1112: .de TE
                   1113: .if (\\n(:D=0)&(\\n(Ds>0) .SP\"space according to Ds if NOT being diverted 
                   1114: .if (\\n(;A>0)&(\\n(;B=0) \{.br
                   1115: .      di
                   1116: .      )D "TE: used TS H but no TH" \}
                   1117: .rr ;A ;B ;h ;D ;E
                   1118: '\"    remove tbl-generated strings/macros/registers
                   1119: .rm a+ b+ c+ d+ e+ f+ g+ h+ i+ j+ k+ l+ n+ m+
                   1120: .rr 32 33 34 35 36 37 38 40 79 80 81 82
                   1121: .rr a| b| c| d| e| f| g| h| i| j| k| l| m|
                   1122: .rr a- b- c- d- e- f- g- h- i- j- k- l- m-
                   1123: ..
                   1124: '\"    INNER UTILITY MACROS
                   1125: '\"    )A: stack push for list macros; called by .LB
                   1126: '\"    prepends each parameter to front of stack string
                   1127: .de )A
                   1128: .af :a 1
                   1129: .ds ]a \\n(:a \\*(]a
                   1130: .ds ]b \\n(:b \\*(]b
                   1131: .ds ]c \\n(:c \\*(]c
                   1132: .ds ]d \\n(:d \\*(]d
                   1133: .ds ]e \\n(:e \\*(]e
                   1134: .ds ]f \\n(:f \\*(]f
                   1135: .ds ]h \\*(]g \\*(]h
                   1136: ..
                   1137: '\"    )B: list status stack pop of 1 level: called by .LC
                   1138: '\"    expects :g > 0
                   1139: .de )B
                   1140: .br
                   1141: .nr :g -1
                   1142: .)C nr :a ]a \\*(]a
                   1143: .)C nr :b ]b \\*(]b
                   1144: 'in \\n(:bu
                   1145: 'ti \\n(:bu
                   1146: .)C nr :c ]c \\*(]c
                   1147: .)C nr :d ]d \\*(]d
                   1148: .)C nr :e ]e \\*(]e
                   1149: .)C nr :f ]f \\*(]f
                   1150: .)C ds ]g ]h \\*(]h
                   1151: .af :a 1
                   1152: .if \\n(:e .af :a \\*(]g
                   1153: ..
                   1154: '\"    )C: stack shift operation, called from .)B
                   1155: '\"    .)C command current-name stack-name stack-args...
                   1156: .de )C
                   1157: .\\$1 \\$2 \\$4
                   1158: .ds \\$3 \\$5 \\$6 \\$7 \\$8 \\$9
                   1159: ..
                   1160: '\"    )D: print error message and possibly terminate
                   1161: '\"    .)D "message"
                   1162: .de )D
                   1163: 'di
                   1164: .nr :D 0
                   1165: .ie \\n(.P>0 \{\\"if page is being printed
                   1166: .fl
                   1167: ********************
                   1168: .br
                   1169: ERROR:(\\n(.F)input line \\n(.c:\\$1
                   1170: .br
                   1171: ********************
                   1172: \}
                   1173: .el \{\
                   1174: .tm ********************
                   1175: .tm ERROR:(\\n(.F)input line \\n(.c:\\$1
                   1176: .tm ********************
                   1177: \}
                   1178: .if !\\nD .ab \&
                   1179: ..
                   1180: '''\"  EC:equation caption lines
                   1181: '''\"  .EC ["title" ["override" [flag]]]
                   1182: '\"    args like FG or TB
                   1183: '\"    uses Ec as counter
                   1184: .de EC
                   1185: .nr !2 1
                   1186: .ie \\nN=5 .)F Equation 2 \\n+(Ec "\\$1" "\\n(H1-" 0
                   1187: .el .)F Equation 2 \\n+(Ec "\\$1" "\\$2" 0\\$3
                   1188: ..
                   1189: '''\"  EX: Exhibit Title Line(s)
                   1190: '''\"  .EX ["title" ["override" [flag]]]
                   1191: ''\"   args like FG or TB
                   1192: ''\"   uses Ex as counter
                   1193: .de EX
                   1194: .nr !3 1
                   1195: .ie \\nN=5 .)F Exhibit 3 \\n+(Ex "\\$1" "\\n(H1-" 0
                   1196: .el .)F Exhibit 3 \\n+(Ex "\\$1" "\\$2" 0\\$3
                   1197: ..
                   1198: '''\"  FG: Figure Title Line(s)
                   1199: '''\"  .FG ["title" ["override" [flag]]]
                   1200: ''\"   issues figure title and saves for TOC
                   1201: ''\"   normally gives: Figure n -  title
                   1202: ''\"   if title omitted, so are preceding - and blanks
                   1203: ''\"   override is string which can modify normal numbering (using Fg)
                   1204: ''\"   and works according to flag:
                   1205: ''\"   flag: omitted or 0 ==> override used as prefix,
                   1206: ''\"   = 1 ==> suffix, = 2 ==> replaces Fg
                   1207: ''\"   !0 flag set for List of Figs, Fg may be reset to 0 by .H 1
                   1208: ''\"   SEE ALSO: .TB, .)F
                   1209: .de FG
                   1210: .nr !0 1
                   1211: .ie \\nN=5 .)F Figure 0 \\n+(Fg "\\$1" "\\n(H1-" 0
                   1212: .el .)F Figure 0 \\n+(Fg "\\$1" "\\$2" 0\\$3
                   1213: ..
                   1214: '''\"  TB: Table Title Line(s)
                   1215: '''\"  .TB ["title" ["override" [flag]]]
                   1216: ''\"   issues table title and saves for TOC
                   1217: ''\"   all args same as for .FG
                   1218: ''\"   uses counter Tb.
                   1219: ''\"   SEE ALSO: .FG, .)F.
                   1220: .de TB
                   1221: .nr !1 1
                   1222: .ie \\nN=5 .)F TABLE 1 \\n+(Tb "\\$1" "\\n(H1-" 0
                   1223: .el .)F TABLE 1 \\n+(Tb "\\$1" "\\$2" 0\\$3
                   1224: ..
                   1225: '\"    )F: Figure/Table/Equation/Exhibit line inner macro (for .FG, .TB, .EC, EX)
                   1226: '\"    .)F name type counter "title" "override" flag
                   1227: '\"    name = Figure or Table or Equation or Exhibit
                   1228: '\"    type = 0 (Figure) or 1 (Table)  or 2 (equation) or 3 (exhibit) for TOC saving
                   1229: '\"    counter = already-incremented value of counter (Fg or Tb or Ec or Ex)
                   1230: '\"    "title", "override", and flag as in FG/TB
                   1231: '\"    flag = 0/null ==> prefix for override, 1 ==> suffix, 2 ==> replacement
                   1232: '\"    uses temps: regs ;0 & ;1, string }0.
                   1233: '\"    NOTE: needs more work (for TOC); also maybe option for spacing &
                   1234: '\"    always indenting rather than current centering/indent choice.
                   1235: .de )F
                   1236: .nr ;0 \w@\\$5@
                   1237: .nr ;1 0
                   1238: .nr ;1 0\\$6
                   1239: .ds }0 \\$3
                   1240: .if \\n(;0 .ds }0 \\$5\\$3
                   1241: .if \\n(;1*\\n(;0 .ds }0 \\$3\\$5
                   1242: .if \\n(;1-1*\\n(;0 .ds }0 \\$5
                   1243: .ds }0 \\$1\ \\*(}0
                   1244: .ie (\w@\\$4@)&(\\n(Of=0) .as }0 .\ \ \" if actual title, add some space
                   1245: .el .if \\n(Of .as }0 " -\ \" use dash rather than period for OSDD
                   1246: '\"    }0 is now entire string before title: name number [ - ]
                   1247: .nr ;0 \w@\\*(}0@
                   1248: .ll \\nWu
                   1249: .nr ;1 \\n(.lu-\\n(;0u-\w@\\$4@u+1u
                   1250: '\"    ;1 <= 0 ==> cannot center title, > 0 ==> can do so.
                   1251: '\"    don't mess if display already centered (:B=2)
                   1252: .if (\\n(:B<2)&(\\n(;1>0)  \{\
                   1253: .      in 0 \" center with respect to left margin
                   1254: .      ce  \}
                   1255: .if !\\n(;1 \{\
                   1256: .      if !\\n(.u  .nr ;U 1  \" set flag that no-fill was on
                   1257: .      if \\n(:B=2 .ce 0
                   1258: .      fi
                   1259: .      in \\n(;0u
                   1260: .      ti-\\n(;0u \}
                   1261: \f3\\*(}0\fP\\$4
                   1262: .ll
                   1263: .in
                   1264: .if \\n(:B=2 .ce 9999
                   1265: .if \\n(;U \{\
                   1266: .      nf
                   1267: .      nr ;U 0 \}
                   1268: '\"    code here to save for TOC, using }0, \\$2, \\$4
                   1269: .if (\\n(Lf=1&(\\$2=0)):(\\n(Lt=1&(\\$2=1)):\
                   1270: (\\n(Le=1&(\\$2=2)):(\\n(Lx=1&(\\$2=3)) \{\
                   1271: .      ds }3
                   1272: .      if \\n(:S .ds }3 \\n(H1
                   1273: .ie \\n(:y=1 \{\
                   1274: \!.am >L \" if display make page# transparent
                   1275: \!.if \\$2=\\\\\\\\$1 .)T 1 1 "\\*(}0" "\\$4" \\\\nP \\*(}3
                   1276: \!\\\\..
                   1277: 'br \}
                   1278: .el \{\
                   1279: .      am >L
                   1280: .      if \\$2=\\\\$1 .)T 1 1 "\\*(}0" "\\$4" \\nP \\*(}3
                   1281: \\.. \} \}
                   1282: ..
                   1283: '\"    )I: index into list of items
                   1284: '\"    .)I index item1 ... item8
                   1285: '\"    sets }3 to value of item(index); items cannot contain normal blanks
                   1286: '\"    if less items than index, }3 is set to null
                   1287: .de )I
                   1288: .nr ;3 0\\$1+1
                   1289: .ds }3 \\$\\n(;3
                   1290: ..
                   1291: '\"    )E: accumulate 1 entry for TOC
                   1292: '\"    .)E rlevel "heading"
                   1293: '\"    expects:
                   1294: '\"    ;1 = dlevel = [1:7], = rlevel except when rlevel = 0
                   1295: '\"    }0 = string of digits/letters, followed by 2 blanks (normally)
                   1296: '\"    uses as temps: }3
                   1297: '\"    SEE ALSO: .H, .TC
                   1298: .de )E
                   1299: .ds }3
                   1300: .if \\n(:S .ds }3 \\n(H1
                   1301: .am >C
                   1302: .)T \\n(;1 \\$1 "\\*(}0" "\\$2" \\nP \\*(}3
                   1303: \\..
                   1304: ..
                   1305: '\"    )T: version 1: obtain maximum sizes for various section counters
                   1306: '\"    .)T dlevel rlevel mark "heading" page [section]
                   1307: '\"    (called from within .>C, set up by .)E )
                   1308: '\"    sets H1 -- H7 to maximum widths of marks at that level
                   1309: '\"    sets :a to max width of page number (incl. section)
                   1310: '\"    TEMPS: ;0, }3
                   1311: .de )T
                   1312: .nr ;0 \w@\\$5@
                   1313: .if \w@\\$6@ .nr ;0 +\w'-'u+\w@\\$6@u
                   1314: .if \\n(;0-\\n(:a .nr :a \\n(;0
                   1315: .)I \\$1 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7
                   1316: .if \w@\\$3@-\\*(}3 .nr H\\$1 \w@\\$3@
                   1317: ..
                   1318: '\"    )U: (actually version 2 of )T) expand 1 TOC entry
                   1319: '\"    .)U dlevel rlevel mark "heading" page [section]
                   1320: '\"    dlevel = [1:7]
                   1321: '\"    rlevel = [0:7], 0 ==> .HU, ignore mark
                   1322: '\"    mark = string of digits/letters, followed by 2 blanks (normally)
                   1323: '\"    "heading" is always present (no entries for title-less sections)
                   1324: '\"    page is page number, may be restarted at 1 in some cases
                   1325: '\"    section is present if :S > 0
                   1326: '\"    expects:
                   1327: '\"    :a = max size of page, or size of section-page (not counting -)
                   1328: '\"    :b,:c,:d,:f set to args 1-4 (or defaults) of .TC
                   1329: '\"    }0, }1, and }2 set as described in .TC
                   1330: .de )U
                   1331: .if !0\\$1-\\n(:b .sp\\n(:c
                   1332: .)I \\$1 \\*(}0
                   1333: .nr ;0 \\*(}3
                   1334: .)I \\$1 \\*(Ci
                   1335: .nr ;1 \\*(}3
                   1336: .)I \\$1 \\*(}2
                   1337: .nr ;2 \\*(}3
                   1338: '\"    ;0 = width of mark
                   1339: '\"    ;1 = offset to begin of mark
                   1340: '\"    ;2 = offset to text
                   1341: .ds }3 \\$5
                   1342: .if \\n(.$-5 .ds }3 \\$6\-\\$5
                   1343: .nr :e \\n(:au-\w@\\*(}3@u+2n
                   1344: .ds }3 \h@\\n(:eu@\\*(}3
                   1345: '\"    }3 is complete [section-]page string
                   1346: .ds }y
                   1347: .nr ;0 -\w@\\$3@
                   1348: .if \\n(;0 .as }y \h@\\n(;0u@
                   1349: .if 2-0\\$1 .as }y "\\$3
                   1350: .if 0\\$1-1 .ds }y "\\$3\\*(}y
                   1351: .if !0\\$2 .ds }y
                   1352: '\"    }y = mark string, with blanks (if necessary) prepended for level 1
                   1353: '\"    is null for .HU heading
                   1354: .ll \\nWu-\\n(:au-3n
                   1355: .in \\n(;2u
                   1356: .if !0\\$2 .in\\n(;1u
                   1357: .ti \\n(;1u
                   1358: .fi
                   1359: .di >A
                   1360: .if !0\\$1-\\n(:d .if !\\n(:f \\*(}y\\$4\\a\\*(}3
                   1361: .if !0\\$1-\\n(:d .if \\n(:f \\*(}y\\$4\\t\\*(}3
                   1362: .if 0\\$1-\\n(:d \\*(}y\\$4\\*(}3
                   1363: .br\"force out partial line while diverting
                   1364: \!.br\"force out partial line when laying out diversion
                   1365: .di
                   1366: .br
                   1367: .ll \\nWu
                   1368: .ne \\n(dnu
                   1369: .ta \\nWu-\\n(:au-2n
                   1370: .nf            \" don't re-fill
                   1371: .in0
                   1372: .na
                   1373: .>A
                   1374: ..
                   1375: '\"    )Z: set-up for list output
                   1376: '\"    .)Z "list heading" type
                   1377: '\"    "list heading" is the title of the particular
                   1378: '\"    list (i.e., figure, exhibit, table, or equation)
                   1379: '\"    type = [0:3], 0 ==> figure, 1 ==> table,
                   1380: '\"    2 ==> equation, 3 ==> exhibit
                   1381: .de )Z
                   1382: .in 0
                   1383: '\"    Cp controls separate page or TOC printing for lists
                   1384: .ie !\\n(Cp \{\
                   1385: .      SK
                   1386: .      rs
                   1387: .      sp 3v
                   1388: .      ce 1 \}
                   1389: .el .sp 2v
                   1390: \\$1
                   1391: .sp 1v
                   1392: .nr :a 0
                   1393: .nr H1 0
                   1394: .af H1 1
                   1395: .>L \\$2
                   1396: .rn )T )V
                   1397: .rn )U )T
                   1398: .ds }0 \\n(H1
                   1399: .ds Ci 0
                   1400: .ds }2 \\n(H1
                   1401: .>L \\$2
                   1402: .rn )T )U
                   1403: .rn )V )T
                   1404: ..
                   1405: '''\"  TC: Generate Table of Contents
                   1406: '''\"  .TC [slevel] [spacing] [tlevel] [tab] [head1 ... head5]
                   1407: ''\"   slevel gives max level number to have spacing between
                   1408: ''\"   spacing is number of spaces.
                   1409: ''\"   tlevel is max level which tabs over to right margin for page
                   1410: ''\"   tab = 0 (default) ==> leaders, >0 ==> tabs
                   1411: .de TC
                   1412: .LC 0\"clean out lists
                   1413: .if \\n(:F .FE\"close dangling footnote
                   1414: .if \\n(:y .DE \" end dangling DS
                   1415: .if \\n(!N .NE \" end up dangling notation
                   1416: .)N    \" flush stored NS/NE
                   1417: .)w\" flush floating keeps
                   1418: .if \\n(;R .RP 0 1 \" produce references page
                   1419: .)R
                   1420: '\"    may need more, like messing with headers
                   1421: .rm )E )F DE DF DS FD FE FG FS H HU TB
                   1422: '\"    clear out top titles
                   1423: .if !\\nP-1 .if \\nN .if !\\nN-1 .rn }t }b\"only if N = 1
                   1424: .if !\\nP-1 .if \\nN .if !\\nN-1 .nr N 0 
                   1425: .rm }t }e }o
                   1426: .rs
                   1427: .if \\n(;C .nr ;C 2            \" force back to the first column
                   1428: .bp
                   1429: .ie \\n(Oc .nr P 1 \" use Page 1 for osdd contents otherwise Roman
                   1430: .el \{\
                   1431: .      rm }f }p
                   1432: .      nr ;g 1 1
                   1433: .      af ;g i
                   1434: .      ds }b ''- \\\\n(;g -''
                   1435: .      am )b
                   1436: .      nr ;g +1
                   1437: \\..
                   1438: '\"    3 lines above set up for roman page numbering, using ;g as counter
                   1439: '      br \}
                   1440: .nr N 0
                   1441: .rs
                   1442: .if !\\n(.$-4 .TX\"user exit if no more than 4 args
                   1443: .if \\n(;C .ll \\n(:Lu         \" do CONTENTS in wide
                   1444: ''\"   TY is defined to put out CONTENTS so user may redefine to
                   1445: ''\"   suppress CONTENTS (also serves as TX replacement)
                   1446: .if !\\n(.$-4 .TY\"user exit (without CONTENTS) if no more than 4 args
                   1447: .ce99
                   1448: .if \\n(.$-4 \\$5
                   1449: .if \\n(.$-5 \\$6
                   1450: .if \\n(.$-6 \\$7
                   1451: .if \\n(.$-7 \\$8
                   1452: .if \\n(.$-8 \\$9
                   1453: .if \\n(.$-4 .sp
                   1454: .ce 0
                   1455: .sp
                   1456: .if \\n(;C .ll \\n(:lu         \" return to narrow
                   1457: .nr ;m \\n(.hu+2v              \" return position for 2C
                   1458: .nr :b 1
                   1459: .if \w@\\$1@ .nr :b 0\\$1
                   1460: .nr :c 1
                   1461: .if \w@\\$2@ .nr :c 0\\$2
                   1462: .nr :d 2
                   1463: .if \w@\\$3@ .nr :d 0\\$3
                   1464: .nr :f 0
                   1465: .if \w@\\$4@ .nr :f 0\\$4
                   1466: '\"    :b = level for spacing, :c = number of spaces.
                   1467: '\"    :d = max level to tab to right margin
                   1468: '\"    :f = tab flag (0 ==> leader, 1 ==> tab)
                   1469: '\"    set up to find max sizes of things
                   1470: .nr H1 0
                   1471: .af H1 1
                   1472: .nr H2 0
                   1473: .af H2 1
                   1474: .nr H3 0
                   1475: .af H3 1
                   1476: .nr H4 0
                   1477: .af H4 1
                   1478: .nr H5 0
                   1479: .af H5 1
                   1480: .nr H6 0
                   1481: .af H6 1
                   1482: .nr H7 0
                   1483: .af H7 1
                   1484: .nr :a 0
                   1485: '\"    H1 -H7 will have max widths; :a max width of [section] page
                   1486: .>C
                   1487: .rn )T )V
                   1488: .rn )U )T
                   1489: '\"    set up }0, }1, and }2 as useful arrays:
                   1490: '\"    }0 = sizes of individual marks
                   1491: '\"    }1 = offsets to beginning of marks
                   1492: '\"    }2 = offsets to text parts
                   1493: .ds }0 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7
                   1494: .nr H2 +\\n(H1
                   1495: .nr H3 +\\n(H2
                   1496: .nr H4 +\\n(H3
                   1497: .nr H5 +\\n(H4
                   1498: .nr H6 +\\n(H5
                   1499: .nr H7 +\\n(H6
                   1500: .if !\w'\\*(Ci' .ds Ci 0 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6
                   1501: .ds }2 \\n(H1 \\n(H2 \\n(H3 \\n(H4 \\n(H5 \\n(H6 \\n(H7
                   1502: '\"    more set up here for lists
                   1503: .>C
                   1504: .rm >C HX
                   1505: .rn )T )U
                   1506: .rn )V )T
                   1507: .if (\\n(Lf=1)&(\\n(!0>0) .)Z "\\*(Lf" 0
                   1508: .if (\\n(Lt=1)&(\\n(!1>0) .)Z "\\*(Lt" 1
                   1509: .if (\\n(Lx=1)&(\\n(!3>0) .)Z "\\*(Lx" 3
                   1510: .if (\\n(Le=1)&(\\n(!2>0) .)Z "\\*(Le" 2
                   1511: .)R
                   1512: ..
                   1513: '''\"  .TY prints out CONTENTS or can be redefined by user
                   1514: .de TY
                   1515: .ce
                   1516: CONTENTS
                   1517: ..
                   1518: '''\"  Subject/Date/From and Signature
                   1519: '\"    NB: certain portions of this are needed only____
                   1520: '\"    at the beginning of the document.  
                   1521: '\"    Therefore, certain macros/strings/registers are
                   1522: '\"    used here and subsequently reused by other functions.
                   1523: '\"    Reused names are so noted.
                   1524: '\"    list of signatures are diverted and held until .SG macro
                   1525: '\"    >v text of signature list
                   1526: '\"    :V size of signature list
                   1527: '\"    ;x size/flag for TM number      REUSED
                   1528: '\"    ;y flag indicating title diversion      REUSED
                   1529: '\"    >z text of FROM diversion       REUSED
                   1530: '\"    ;z size of FROM diversion       REUSED
                   1531: '\"    }z diverted text of title       REUSED
                   1532: '\"    >8 holder for TM number         REUSED
                   1533: '\"    :9 size of diverted title text  REUSED
                   1534: '\"    :1 temp loc'n of prevailing indent      REUSED
                   1535: '\"    :2 mark location        REUSED
                   1536: '\"    :3 indent for Abstract REUSED
                   1537: '\"    ;n flag to suppress Bell Laboratories, etc. 
                   1538: '\"    }2 Bell Laboratories or other company name. 
                   1539: '''\"  TL: title of memo [0:2]
                   1540: '''\"  .TL [ [case] [file case] ]
                   1541: '''\"  {text of title}
                   1542: ''\"   gather in charging case(s), filing case(s),
                   1543: ''\"   and lines of the title for the top of a memo page
                   1544: .de TL
                   1545: .nr :D 2 \"s/d/f flag & flag for other diversions
                   1546: .nr ;c 2
                   1547: .nr ;z 0 \" zero size of author info diversion
                   1548: .nr :V 0 \" zero size of signature diversion
                   1549: .nr :1 \\n(.i \" save prevailing indent
                   1550: .if \\nC=4 .ls 1       \" for DRAFT single space memorandum header
                   1551: .ds >1 \\$1
                   1552: .ds >2 \\$2
                   1553: 'nr ;y 1
                   1554: 'll \\nWu-34n
                   1555: 'nh
                   1556: 'na
                   1557: 'fi
                   1558: 'if \\nE 'ft 3
                   1559: 'di >T
                   1560: ..
                   1561: '''\"  AU: author info [6:9]
                   1562: '''\"  .AU name initials [loc] [dept] [ext] [room] [[arg] ...]
                   1563: '\"    optional args will appear, one line per each, following FROM
                   1564: '\"    first arg (name) and second arg (initials) will be utilized in .SG
                   1565: .de AU
                   1566: .nr :D 1 \"s/d/f flag
                   1567: .nr ;c 1
                   1568: .if !\\n(;y 'nf
                   1569: .if \\n(;y .>9 \" terminate .TL diversion
                   1570: .rm TL\" free up space
                   1571: .ll \\nWu
                   1572: '\"    build next author info for memo style
                   1573: .da >z
                   1574: 'if \\nE 'ft 3
                   1575: .if (\\n(;z>0)&(\\n(Au>0) .sp \" space if not first author
                   1576: \\$1
                   1577: .if \\n(Au>0 \{.if \w@\\$3@ .ie @\\$3@HP@ HP\ \&\c
                   1578: .              el \\$3\ \&\c
                   1579: .      if \w@\\$4@ \\$4
                   1580: .      if \w@\\$3@ .if !\w@\\$4@ \&
                   1581: .      if \w@\\$6@ \\$6\ \&\c
                   1582: .      if \w@\\$5@ x\\$5
                   1583: .      if \w@\\$6@ .if !\w@\\$5@ \&
                   1584: '      br  \}
                   1585: .if \\n(.$-6 \\$7
                   1586: .if \\n(.$-7 \\$8
                   1587: .if \\n(.$-8 \\$9
                   1588: .br
                   1589: 'if \\nE 'ft
                   1590: .di
                   1591: .nr ;z +\\n(dn
                   1592: .nr dn 0
                   1593: '\"    info for TM cover sheet
                   1594: .am >A
                   1595: .ie \\nE \{\
                   1596: \f3\\$1\\\\t\\$3\ \\$6\\\\t\\$5\fP\" >A, inside MT into >S, then CS
                   1597: 'br \}
                   1598: .el \{\
                   1599: \\$1\\\\t\\$3\ \\$6\\\\t\\$5\" >A, inside MT into >S, then CS
                   1600: 'br \}
                   1601: \\..
                   1602: '\"    build signature & reference portion
                   1603: 'in \\n(:1u
                   1604: .if !\\n(:V .ds }v \\$3-\\$4-\\$2
                   1605: .if \\n(:V .as }v /\\$2
                   1606: .da >v
                   1607: 'if \\nE 'ft 3
                   1608: .sp 3
                   1609: \\$1
                   1610: .br
                   1611: 'if \\nE 'ft
                   1612: .di
                   1613: .nr :V +\\n(dnu
                   1614: .nr dn 0
                   1615: '\"    released paper author info
                   1616: .ds }L \\$3\"get location string
                   1617: .if '\\$3'HOH' .ds }L HO\"change to 2-char name for HOH
                   1618: .if '\\$3'HOH' .nr :H 1
                   1619: .if '\\$3'HP' .ds }L }A\"used for HP
                   1620: .if '\\$3'AL' .ds }L }B\"used for AL
                   1621: .if '\\$3'ALF' .ds }L }B\"used for ALF
                   1622: .if '\\$3'RD' .ds }L }E\"used for RD
                   1623: .if '\\$3'FJ' .ds }L HO\"used for FJ
                   1624: .if '\\$3'IW' .ds }L IH\"used for IW
                   1625: .am >4
                   1626: .sp1
                   1627: \\$1
                   1628: .if \\\\n(:2 .sp
                   1629: .if \\\\n(:2 \\*(}2
                   1630: .if \\\\n(:2 .if \\n(:H \\\\*(}H
                   1631: .if \\\\n(:2 \\\\*(\\*(}L
                   1632: .ds }z \\\\*(\\*(}L
                   1633: \\..
                   1634: ..
                   1635: '\"    .>9
                   1636: '\"    terminate .TL diversion and add case numbers if necessary
                   1637: '\"    REUSED
                   1638: .de >9
                   1639: .br
                   1640: .di
                   1641: .di }z
                   1642: .>T
                   1643: '\"    if both charge and file case were given
                   1644: .if (\w'\\*(>1')&(\w'\\*(>2') \{\
                   1645: .      ie '\\*(>1'\\*(>2' \{\
                   1646: .              br
                   1647: Charge and Filing Case \\*(>1
                   1648: .              br \}
                   1649: .      el \{\
                   1650: .              br
                   1651: Charge Case \\*(>1
                   1652: .              br
                   1653: File Case \\*(>2
                   1654: .              br \} \}
                   1655: .if (\w'\\*(>1'=0):(\w'\\*(>2'=0) \{\
                   1656: .      ie \w'\\*(>1' \{\
                   1657: - Case\ \\*(>1
                   1658: .                      br \}
                   1659: .      el .ie \w'\\*(>2' \{\
                   1660: - Case\ \\*(>2
                   1661: .                      br \}
                   1662: .              el .br \}
                   1663: .di
                   1664: 'if \\nE 'ft 1
                   1665: .nr :9 \\n(dn \" size of diverted title info
                   1666: .nr dn 0
                   1667: .nr ;y 0
                   1668: 'nf \" process rest of heading info in no-fill
                   1669: .rm >9
                   1670: ..
                   1671: '''\"  AT: author title [0:9]
                   1672: '''\"  .AT "line1" [line2-9]
                   1673: ''\"   author title lines appear after signer's name
                   1674: .de AT
                   1675: .da >v
                   1676: 'if \\nE 'ft 3
                   1677: .if \\n(.$-0 \\$1
                   1678: .if \\n(.$-1 \\$2
                   1679: .if \\n(.$-2 \\$3
                   1680: .if \\n(.$-3 \\$4
                   1681: .if \\n(.$-4 \\$5
                   1682: .if \\n(.$-5 \\$6
                   1683: .if \\n(.$-6 \\$7
                   1684: .if \\n(.$-7 \\$8
                   1685: .if \\n(.$-8 \\$9
                   1686: .br
                   1687: 'if \\nE 'ft
                   1688: .di
                   1689: .nr :V +\\n(dnu
                   1690: .nr dn 0
                   1691: ..
                   1692: '''\"  OK: provide other keywords [1:9]
                   1693: '''\"  .OK kw1 kw2 ... kw9
                   1694: .de OK
                   1695: .nr :D 1 \"s/d/f flag
                   1696: .nr ;c 1
                   1697: .de >7
                   1698: .if \\n(.$-0 \\$1
                   1699: .if \\n(.$-1 \\$2
                   1700: .if \\n(.$-2 \\$3
                   1701: .if \\n(.$-3 \\$4
                   1702: .if \\n(.$-4 \\$5
                   1703: .if \\n(.$-5 \\$6
                   1704: .if \\n(.$-6 \\$7
                   1705: .if \\n(.$-7 \\$8
                   1706: .if \\n(.$-8 \\$9
                   1707: \\..
                   1708: .rm OK
                   1709: ..
                   1710: '''\"  TM: get TM numbers [1:9]
                   1711: '''\"  .TM number
                   1712: .de TM
                   1713: .nr :D 1 \"s/d/f flag
                   1714: .nr ;c 1
                   1715: .de >8
                   1716: .if \\nE .ft 3
                   1717: .if \\n(.$-0 \\$1
                   1718: .if \\n(.$-1 \\$2
                   1719: .if \\n(.$-2 \\$3
                   1720: .if \\n(.$-3 \\$4
                   1721: .if \\n(.$-4 \\$5
                   1722: .if \\n(.$-5 \\$6
                   1723: .if \\n(.$-6 \\$7
                   1724: .if \\n(.$-7 \\$8
                   1725: .if \\n(.$-8 \\$9
                   1726: .if \\nE .ft
                   1727: \\..
                   1728: .nr ;x \\n(.$+1 \" size of TM line(s) plus a space
                   1729: .rm TM
                   1730: ..
                   1731: '''\"  AS: abstract start [0:2]
                   1732: '''\"  .AS [flag] [indent]
                   1733: '\"    begin abstract indicating dump now & later (0 or null)
                   1734: '\"    or dump later only (1)
                   1735: '\"    indent and .ll shrink 2nd arg; deflt 5
                   1736: '\"    >3 stored abstract text
                   1737: '\"    :t flag
                   1738: '\"    ;3 size of >3
                   1739: '\"    :3 register containing indent amount (passed to MT)
                   1740: '\"    :t ;1 :3 REUSED
                   1741: .de AS
                   1742: .nr :D 3 \"s/d/f flag & flag for other diversions
                   1743: .nr ;c 3
                   1744: .if \\n(;y .>9\"defense against missing .AU
                   1745: .rm TL\"free up space
                   1746: .nr :t 0\\$1 \" set flag for abstract type
                   1747: .if \\n(:t=1 .nr ;5 \\n(:s \" save value of footnote flag --AS/AE footnotes don't go in
                   1748: .nr :3 0       \" no indent by default
                   1749: .if \\n(.$-1 .nr :3 0\\$2n \" get optional indent
                   1750: .nr ;N \\n(:1  \" save indent for copy-to list
                   1751: 'in \\n(:1u
                   1752: 'fi
                   1753: .SA
                   1754: 'nh
                   1755: 'if \\n(Hy 'hy 14
                   1756: .di >3
                   1757: .ll 0u-2u*\\n(:3u+\\nWu\" really mean \\nW-(2*\\n(:3)
                   1758: .ce
                   1759: .ul
                   1760: ABSTRACT
                   1761: .SP 3
                   1762: .ns
                   1763: .rm AS
                   1764: .nr :I 1\"indent any following .P's
                   1765: ..
                   1766: '''\"  AE: abstract end [0]
                   1767: '''\"  .AE
                   1768: .de AE
                   1769: .br
                   1770: .di
                   1771: 'nf
                   1772: 'nh
                   1773: .nr ;3 \\n(dn
                   1774: .nr ;6 \\n(;3 \"save unperturbed copy for .NE
                   1775: .ll \\nWu
                   1776: 'in \\n(:1u
                   1777: .if \\n(:t=1 .nr :s \\n(;5 \" restore value of :s
                   1778: .rm AE
                   1779: ..
                   1780: '''\"  MT: specify type of memo [0:2]
                   1781: '''\"  .MT [type] [1]   or  .MT [type] [addressee name]
                   1782: ''\"   indicate type of memo; if no arg, get Memo for File
                   1783: '\"    dump subj, date, from info as well
                   1784: '\"    second arg (except MT=4) means use addressee name in header
                   1785: '\"    expects ;n and }2 to be set appropriately (by default or .AF)
                   1786: .de MT
                   1787: .nr :D 0 \"clear s/d/f flag
                   1788: .nr ;c 0
                   1789: .if !\\n(;y 'nf
                   1790: .if \\n(;y .>9 \" defense against missing .AU
                   1791: .rm TL TM OK AS AE AF AU\"free up needed space
                   1792: .ll \\nWu
                   1793: .rn TP >Y \" move TP so not there for )h
                   1794: .in \\n(:1u\" causes )h to be tripped
                   1795: .rn >Y TP
                   1796: .rn )K >Y\"disguise )K in case of long abstract
                   1797: .ie \\nE .nr :W \\nWu-\w'\f3September 33, 1999\fP'+3n\"indent for date for SG
                   1798: .el .nr :W \\nWu-\w'September 33, 1999'+3n\"indent for date for SG
                   1799: '\"    call >6 for memo style
                   1800: '\"    call >5 for released paper style
                   1801: '\"    both of these disappear after either is used!
                   1802: '\"    note that they use :2
                   1803: '\"    second arg (except MT=4) adds addressee name to page header
                   1804: '\"    must check width of $1 because .if !0\\$1=4 doesn't work for string
                   1805: .ie \w@\\$1@u<2n .if !0\\$1=4 .if \\n(.$=2 .ds ]n \\$2
                   1806: .el .if \\n(.$=2 .ds ]n \\$2
                   1807: .if !\\n(.$ .>6
                   1808: .if \\n(.$ .if \w@\\$1@u-\w'0'u .>6 "\\$1"
                   1809: .if \\n(.$ .nr ;y 0\\$1
                   1810: .if \\n(.$ .if !\\n(;y .>6 ""
                   1811: .if \\n(.$ .if \\n(;y-4 .>x 
                   1812: .if \\n(.$ .if \\n(;y-3 .>5 "\\$2"
                   1813: .if \\n(.$ .if \\n(;y-2 .>6 "ENGINEER'S NOTES"
                   1814: .if \\n(.$ .if \\n(;y-1 .>6 "PROGRAMMER'S NOTES"
                   1815: .if \\n(.$ .if \\n(;y .>6 "MEMORANDUM FOR FILE"
                   1816: .)R
                   1817: .ta .8i 1.6i 2.4i 3.2i 4i 4.8i 5.6i 6.4i 7.2i 8i 8.8i 9.6i
                   1818: .ns
                   1819: .if \\nC=4 .ls 2       \" double space for DRAFT
                   1820: .>Y\" kill macros/strings; zero registers
                   1821: .nr ;M 1 \"indicate to .NS that .MT has been called
                   1822: .rm >Y MT
                   1823: ..
                   1824: '\"    >x: print external letter
                   1825: .de >x
                   1826: .rm >6 >5 )Y )X
                   1827: .ta \\n(:Wu-6n
                   1828: .br
                   1829: .rs
                   1830: .sp 1
                   1831: .ie \\n(Pv \{\
                   1832: .      ce
                   1833: .      ul
                   1834: PRIVATE
                   1835: .      sp \}
                   1836: .el .sp 2
                   1837: .ie \\nA=2 \{\
                   1838: \t\(bs
                   1839: .sp .5i
                   1840: .if \w@\\*(}2@ \t\s16\f3\\*(}2\fP\s0
                   1841: 'br \}
                   1842: .el \{\
                   1843: .sp |4v
                   1844: .}z
                   1845: .br \}
                   1846: .rs
                   1847: .mk :2
                   1848: .sp |12v
                   1849: .in \\n(:Wu
                   1850: .ie \\nE \{\
                   1851: \f3\\*(DT\fP
                   1852: 'br \}
                   1853: .el \{\
                   1854: \\*(DT
                   1855: 'br \}
                   1856: .if \\n(:2u-\\n(nlu .sp |\\n(:2u
                   1857: .sp 2v
                   1858: .rm >x
                   1859: ..
                   1860: '\"    >6: dump out memorandum style
                   1861: .de >6 
                   1862: .rm >5 >x )Y
                   1863: .di ]t  \" heading will be saved in ]t
                   1864: .if \\n(;n \{\
                   1865: .      nr ;W \\nWu
                   1866: .      nr W 6.5i
                   1867: .      ll \\nWu
                   1868: .      lt \\nWu \}
                   1869: .ta \\n(:Wu-6n
                   1870: .br 
                   1871: .rs 
                   1872: .sp 1
                   1873: .ie \\n(Pv \{\
                   1874: .      ce
                   1875: .      ul
                   1876: PRIVATE
                   1877: .      sp \}
                   1878: .el .sp 2
                   1879: .if \\nA=2 \{\
                   1880: \t\(bs
                   1881: .sp .5i \}
                   1882: .ie \w@\\*(}2@ \t\s16\f3\\*(}2\fP\s0
                   1883: .el .sp2
                   1884: .sp 3
                   1885: .if \\n(;n .sp\"pre-printed form
                   1886: .mk :2
                   1887: .if !\\n(;n \{\s8subject:\s0
                   1888: .      rt \\n(:2u
                   1889: .      in \w'\s8subject:\s0'u+1n \}
                   1890: .}z
                   1891: .br
                   1892: .rt \\n(:2u
                   1893: .in \\n(:Wu
                   1894: .if \\n(;n .in 0n-8n*\\nWu/35n+\\nWu-100u
                   1895: .if !\\n(;n \{.ps 8
                   1896: .      ti -6n
                   1897: date:
                   1898: .      ps
                   1899: .      rt \\n(:2u \}
                   1900: .ie \\nE \{\
                   1901: \f3\\*(DT\fP
                   1902: 'br \}
                   1903: .el \{\
                   1904: \\*(DT
                   1905: 'br \}
                   1906: .sp
                   1907: .if !\\n(;n \{.mk :2
                   1908: .      ps 8
                   1909: .      ti -6n
                   1910: from:
                   1911: .      ps
                   1912: .      rt \\n(:2u \}
                   1913: .if \\nE .ft 3
                   1914: .>z
                   1915: .if \\nE .ft
                   1916: .in \\n(:1u
                   1917: .in \\n(:1u
                   1918: .if \\n(;x \{.sp
                   1919: .      mk :2
                   1920: .      in \\n(:Wu
                   1921: .      if \\n(;n .in 0n-8n*\\nWu/35n+\\nWu-100u
                   1922: .      if \\nE .ft 3
                   1923: TM 
                   1924: .      rt \\n(:2u
                   1925: '      in +\w'TM 'u
                   1926: '      if \\nE 'ft
                   1927: .      >8
                   1928: .      in \\n(:1u \}
                   1929: .br
                   1930: .if \\n(:9u-\\n(;zu-2v-\\n(;xv .sp \\n(:9u-\\n(;zu-2v-\\n(;xv
                   1931: .sp 3
                   1932: .di
                   1933: .rs \" make sure spaces get out at top of first page
                   1934: '''\"  produce abstract page conditionally, depending
                   1935: '''\"  upon the existence of a abstract and whether
                   1936: '''\"  or not ".AS 1" was specified.
                   1937: '''\"  ".AS" or ".AS 0" puts abstract on page 1 and saves for CS
                   1938: '''\"  ".AS 2" makes memo-style cover sheet with abstract
                   1939: .ie \\n(;3 \{\
                   1940: .      ie \\n(:t=2 \{\
                   1941: .              af !S \\gP \" save format of P register
                   1942: .              af P i
                   1943: .              ]t  \"put out heading
                   1944: .              in +\\n(:3u
                   1945: .              >3  \"put out abstract 
                   1946: .              sp 3
                   1947: .              )N  \"put out copy to
                   1948: .              in -\\n(:3u
                   1949: .              wh 0  \"disable page-top trap
                   1950: .              bp
                   1951: .              nr P 1  \"necessary for tbl of cntnts
                   1952: .              af P \\g(!S \" restore format of P register
                   1953: .              ]t  \"put out heading
                   1954: .              wh 0 )h  \"re-enable page top trap
                   1955: .              if \\n(:G \{\
                   1956: .                      nr :s +1  \"put ftnt from cs -- increment cntr
                   1957: .                      da >y
                   1958: .                      >d
                   1959: \!.                    br
                   1960: .                      di
                   1961: '                      nr dn +4v       \" leave space for 2 blank lines and rule
                   1962: '                      nr :o +\\n(dnu
                   1963: '                      nr :O +\\n(dnu
                   1964: .                      nr dn 0
                   1965: '\"                    Move up footer trap, but not above current position on page,
                   1966: '                      if !\\n(.pu-\\n(nlu-.5v-\\n(:ou 'nr :o \\n(.pu-\\n(nlu-.5v
                   1967: '\"                    or below :m!
                   1968: '                      if !\\n(:ou-\\n(:mu 'nr :o \\n(:mu
                   1969: '                      ch )f -\\n(:ou \" move footer trap
                   1970: '                      br \}
                   1971: .              rm CS \}  \"can't have both kinds of cover sheet
                   1972: .      el .ie \\n(:t=1 .]t  \" just put out heading (no abstract)
                   1973: .              el \{\
                   1974: .                      ]t  \" put out heading
                   1975: .                      in +\\n(:3u
                   1976: .                      >3  \" put out abstract
                   1977: .                      sp 3
                   1978: .                      in -\\n(:3u \} \}
                   1979: .el .]t  \"no abstract just put out heading
                   1980: .if \\n(;n \{\
                   1981: .      nr W \\n(;Wu
                   1982: .      ll \\nWu
                   1983: .      lt \\nWu \}
                   1984: .ns
                   1985: .ne 10
                   1986: .ce
                   1987: .cu
                   1988: .ie !\\n(.$ MEMORANDUM FOR FILE
                   1989: .el .if \w@\\$1@ \\$1
                   1990: .SP 3 \" no effect if $1 is null (due to .ns above)
                   1991: .ce 0
                   1992: .cu 0
                   1993: .if !\\n(:t=2 .)X\"build memo style cover sheet
                   1994: .rm )X >6
                   1995: ..
                   1996: '\"    >5: dump released paper style
                   1997: .de >5
                   1998: .rm >6 >x )X
                   1999: .br
                   2000: .rs
                   2001: .sp 1
                   2002: .ie \\n(Pv \{\
                   2003: .      ce
                   2004: .      ul
                   2005: PRIVATE
                   2006: .      sp \}
                   2007: .el .sp 2
                   2008: .in 0
                   2009: .ds }H "Crawford Hill Laboratory
                   2010: .ds }A "South Plainfield, New Jersey 07080\"
                   2011: .ds PY "Piscataway, New Jersey 08854\"
                   2012: .ds MH "Murray Hill, New Jersey 07974\"
                   2013: .ds WH "Whippany, New Jersey 07981\"
                   2014: .ds HO "Holmdel, New Jersey 07733\"
                   2015: .ds RR "Piscataway, New Jersey 08854\"
                   2016: .ds }B Allentown, Pennsylvania 18103\"
                   2017: .ds AK Norcross, Georgia 30071\"
                   2018: .ds CP Piscataway, New Jersey 08854\"
                   2019: .ds CH Chester, New Jersey 07930\"
                   2020: .ds CB Columbus, Ohio 43213\"
                   2021: .ds DR Denver, Colorado 80234\"
                   2022: .ds IN Indianapolis, Indiana 46206\"
                   2023: .ds IH Naperville, Illinois 60566\"
                   2024: .ds MV North Andover, Maine 01845\"
                   2025: .ds }E Reading, Pennsylvania 19604\"
                   2026: .ds WB West Long Branch, New Jersey 07764\"
                   2027: .ds WV Warren, New Jersey 07060\"
                   2028: .ds HL Short Hills, New Jersey 07078\"
                   2029: '''.ll \\nWu-20n
                   2030: .ll \\nWu
                   2031: .fi
                   2032: .na
                   2033: .nh
                   2034: .di >6
                   2035: .>T
                   2036: .br
                   2037: .di
                   2038: .ll \\nWu
                   2039: .nf
                   2040: .ce 1000
                   2041: .ul 1000
                   2042: .>6
                   2043: .nr :2 0
                   2044: .if \w@\\$1@ .nr :2 1
                   2045: .ul 0
                   2046: .>4
                   2047: .br\"required!!
                   2048: .if !\\n(:2 .sp
                   2049: .if !\\n(:2 \\*(}2
                   2050: .if !\\n(:2 .if \\n(:H \\*(}H
                   2051: .if !\\n(:2 \\*(}z
                   2052: .ce 0
                   2053: .sp 
                   2054: '\"    if abstract (;3 non zero), output according to flag :t
                   2055: .if \\n(;3 .if !\\n(:t .in +\\n(:3u
                   2056: .if \\n(;3 .if !\\n(:t .>3
                   2057: .if \\n(;3 .if !\\n(:t .in -\\n(:3u
                   2058: .if \\n(;3 .if !\\n(:t .sp 
                   2059: .ns
                   2060: .)Y\"build RP style cover sheet
                   2061: .rm )Y >6 PY MH WH HO RR }H WB }A }B }E HL
                   2062: .rm AK CP CH CB DR IN IH MV WV SG )N )M
                   2063: .de NS
                   2064: .br
                   2065: .di
                   2066: .di >Y
                   2067: \\..
                   2068: .de NE
                   2069: .br
                   2070: .di
                   2071: \\..
                   2072: .rm >5
                   2073: ..
                   2074: '\"    )K: kill S/D/F stuff
                   2075: '\"    throw away unneeded macros/strings
                   2076: '\"    zero unneeded registers
                   2077: .de )K
                   2078: .if \\n(:D .ie !\\n(:t=2 .)D "check TL, AU, AS, AE, MT sequence"
                   2079: .      el .)D "check TL, AU, AS, AE, NS, NE, MT sequence"
                   2080: .rm )X )Y >T >x >z >1 >2 >3 >4 >5 >6 >7 >8 >9 }2 }z
                   2081: .rr ;x  ;y  ;z  :D  :1  :2  :3  :9  ;0  ;1  ;n  ;3 
                   2082: .rm TL AU TM AF AS AE OK
                   2083: .rm )K
                   2084: ..
                   2085: '\"    )X: build part of memo style cover sheet
                   2086: '\"    some things currently known; other things must
                   2087: '\"    be computed when >S called (in CS)
                   2088: .de )X
                   2089: .di >S
                   2090: \!.nr O 0\"get back default .po
                   2091: \!.po 0
                   2092: \!.nr W 6.5i\"get back default .ll
                   2093: \!.ll 6.5i
                   2094: \!.lt 6.5i
                   2095: \!.ll +.45i
                   2096: \!.lt +.45i
                   2097: \!.sp 2
                   2098: \!.tl 'Bell Laboratories''Cover Sheet for Technical Memorandum'
                   2099: \!\l@\\\\n(.lu@
                   2100: \!.br
                   2101: \!.fi
                   2102: \!The information contained herein is for the use of
                   2103: \!employees of Bell Laboratories
                   2104: \!and is not for publication
                   2105: \!(see GEI 13.9-3)\\\\p
                   2106: \!.nf
                   2107: \!.sp -.5v
                   2108: \!\l@\\\\n(.lu@
                   2109: \!.ll
                   2110: \!.lt
                   2111: \!.nf
                   2112: \!.sp 2
                   2113: \!.mk ;2
                   2114: \s9Title:\s0
                   2115: \!.rt -1
                   2116: \!.in \w'\s9Title:\s0'u+1n
                   2117: .>T
                   2118: .rm >T
                   2119: \!.in0
                   2120: \!.sp
                   2121: \s9Other\ Keywords:\s0
                   2122: \!.rt -1
                   2123: \!.in \w'\s9Other Keywords:\s0'u+1n
                   2124: .if \\nE .ft 3
                   2125: .>7
                   2126: .rm >7
                   2127: .if \\nE .ft
                   2128: \!.br
                   2129: \!.mk ;0
                   2130: \!.rt \\\\n(;2u
                   2131: \!.in \\\\nWu-1.4i
                   2132: \!.ti -6n
                   2133: \s9Date:\s0
                   2134: \!.rt -1
                   2135: .ie \\nE \{\
                   2136: \f3\\*(DT\fP
                   2137: 'br \}
                   2138: .el \{\
                   2139: \\*(DT
                   2140: 'br \}
                   2141: \!.sp
                   2142: \!.in \\\\nWu-1.4i
                   2143: \!.ti -6n
                   2144: \s9TM:\s0
                   2145: \!.rt -1
                   2146: .>8
                   2147: \!.in 0
                   2148: \!.br
                   2149: \!.if \\\\n(;0u-\\\\n(nlu .sp \\\\n(;0u-\\\\n(nlu
                   2150: \!.sp 2
                   2151: \!.ta 2i 3.2i
                   2152: \!.mk ;0
                   2153: \!.ul
                   2154: Author(s)\\tLocation\\tExtension
                   2155: .>A
                   2156: .rm >A
                   2157: \!.mk ;1
                   2158: \!.rt \\\\n(;0u
                   2159: .br
                   2160: .di
                   2161: ''\"   go through TERRIBLE convolutions to get the case numbers
                   2162: ''\"   in >1 and >2 into vertically stacked lists w/o commas
                   2163: ''\"   biggest problem was that in contructing a macro call line
                   2164: ''\"   within a diversion, a blank didn't stay as a blank
                   2165: .nf
                   2166: .de >7
                   2167: .di >A
                   2168: .tr ,+
                   2169: .tr |.
                   2170: .ie \\nE \{\
                   2171: |ds\ >8\ \f3\\\\$1+\\\\$2+\\\\$3+\\\\$4+\\\\$5+\\\\$6+\\\\$7+\\\\$8+\\\\$9\fP
                   2172: 'br \}
                   2173: .el \{\
                   2174: |ds\ >8\ \\\\$1+\\\\$2+\\\\$3+\\\\$4+\\\\$5+\\\\$6+\\\\$7+\\\\$8+\\\\$9
                   2175: 'br \}
                   2176: .br
                   2177: \!.br
                   2178: .tr ,,++||
                   2179: .di
                   2180: \\..
                   2181: .>7 \\*(>1
                   2182: .>A
                   2183: .rn >8 >1
                   2184: .>7 \\*(>2
                   2185: .>A
                   2186: .rn >8 >2
                   2187: .di >7
                   2188: .tr |.
                   2189: .tr +
                   2190: |>A\ \\*(>1
                   2191: |rn\ >T\ >1
                   2192: |>A\ \\*(>2
                   2193: |rn\ >T\ >2
                   2194: .br
                   2195: .tr ||++
                   2196: .di
                   2197: .de >A
                   2198: .de >T
                   2199: .if \\\\n(.$ \\\\$1
                   2200: .if \\\\n(.$-1 \\\\$2
                   2201: .if \\\\n(.$-2 \\\\$3
                   2202: .if \\\\n(.$-3 \\\\$4
                   2203: .if \\\\n(.$-4 \\\\$5
                   2204: .if \\\\n(.$-5 \\\\$6
                   2205: .if \\\\n(.$-6 \\\\$7
                   2206: .if \\\\n(.$-7 \\\\$8
                   2207: .if \\\\n(.$-8 \\\\$9
                   2208: \\\\..
                   2209: \\..
                   2210: .>7
                   2211: .rm >A >7 >T
                   2212: .da >S
                   2213: \!.ll +.45i
                   2214: \!.in \\\\nWu-5n
                   2215: \!.ti \\\\nWu-1.4i-6n
                   2216: \!.mk ;0
                   2217: \s9Charging\\\\ Case:\s0
                   2218: .br
                   2219: \!.br
                   2220: \!.rt -1
                   2221: \!.if \\nE .ft 3
                   2222: .>1
                   2223: \!.if \\nE .ft
                   2224: .rm>1
                   2225: .br
                   2226: \!.br
                   2227: \!.if \\\\n(nl=\\\\n(;0 .sp1v\"since >1 must have been empty
                   2228: \!.ti \\\\nWu-1.4i-6n
                   2229: \s9Filing\\\\ Case:\s0
                   2230: .br
                   2231: \!.br
                   2232: \!.rt -1
                   2233: \!.if \\nE .ft 3
                   2234: .>2
                   2235: \!.if \\nE .ft
                   2236: .rm>2
                   2237: .br
                   2238: \!.ll
                   2239: \!.br
                   2240: \!.if \\\\n(;1u-\\\\n(nlu .sp \\\\n(;1u-\\\\n(nlu
                   2241: \!.sp 3
                   2242: \!.in 0
                   2243: \!.ll \\\\nWu
                   2244: \!.in +\\n(:3u
                   2245: \!.po +(6.95i-\\\\n(!Wu)/2u
                   2246: .>3
                   2247: \!.in -\\n(:3u
                   2248: \!.po
                   2249: \!.nr ;0 0\" TM style cover sheet
                   2250: .br
                   2251: .di
                   2252: .di >b
                   2253: .nf
                   2254: .na
                   2255: .>c
                   2256: .br
                   2257: .di
                   2258: .if \\n(dn \{\
                   2259: .nr ;c \\n(.pu-\\n(:mu-\\n(dnu
                   2260: .da >S
                   2261: \!.ie \\n(;cu-\\\\n(nlu .sp \\n(;cu-\\\\n(nlu-2v
                   2262: \!.el .sp 1v
                   2263: .nr ;c 0
                   2264: \l'60p'
                   2265: .>c
                   2266: .di
                   2267: 'br \}
                   2268: ..
                   2269: '\"    )Y: build part of cover sheet for released paper
                   2270: '\"    some things currently known; other things must
                   2271: '\"    be computed when >S called (in CS)
                   2272: .de )Y
                   2273: .di >S
                   2274: \!.sp 5
                   2275: \!.in 0
                   2276: \!.ce 1000
                   2277: \!.ul 1000
                   2278: .>6
                   2279: \!.ul 0
                   2280: \!.sp .5v
                   2281: .>4
                   2282: \!.br\"required!!
                   2283: \!.if \\n(:2=0 .sp.5v
                   2284: \!.if \\n(:2=0 \\*(}2
                   2285: \!.if \\n(:2=0 .if \\n(:H \\*(}H
                   2286: \!.if \\n(:2=0 \\*(}z
                   2287: \!.ce 0
                   2288: \!.sp 
                   2289: \!.in 0
                   2290: \!.in +\\n(:3u
                   2291: .>3
                   2292: \!.in -\\n(:3u
                   2293: \!.nr ;0 1\"release paper cover sheet
                   2294: .di
                   2295: '\"    Now calculate height of footnotes and attach to cover sheet.
                   2296: .di >b
                   2297: .nf
                   2298: .na
                   2299: .>c
                   2300: .br
                   2301: .di
                   2302: .if \\n(dn \{\
                   2303: .nr ;c \\n(.pu-\\n(:mu-\\n(dnu
                   2304: .da >S
                   2305: \!.ie \\n(;c-\\\\n(nlu .sp \\n(;cu-\\\\n(nlu-2v
                   2306: \!.el .sp 1v
                   2307: .nr ;c 0
                   2308: \l'60p'
                   2309: .>c
                   2310: .di
                   2311: 'br \}
                   2312: ..
                   2313: '''\"  CS: generate cover sheet [0:6]
                   2314: '''\"  .CS [pages] [other] [total] [figs] [tbls] [refs]
                   2315: .de CS
                   2316: .LC 0\"clean out lists
                   2317: .if \\n(:F .FE\"close dangling footnote
                   2318: .if \\n(:y .DE \" end dangling DS
                   2319: .if \\n(!N .NE \" end up dangling notation
                   2320: .)N    \" flush stored NS/NE
                   2321: .)w \" flush floating keeps
                   2322: .if \\n(;R .RP 0 1 \" produce references page
                   2323: '\"    kill off any page titles
                   2324: .if !\\nP-1 .if \\nN .if !\\nN-1 .rn }t }b\"only if N = 1
                   2325: .if !\\nP-1 .if \\nN .if !\\nN-1 .nr N 0 
                   2326: .rm }t }e }o
                   2327: .wh 0 \" toss off header trap
                   2328: .br
                   2329: .rs
                   2330: .bp
                   2331: .rm }b }f }p
                   2332: .rn )f >z \" save footer def'n
                   2333: .rn >B >s      \" save bottom block expander while moving it out
                   2334: .ch )n 15.1i \" move away footnote diverter
                   2335: .ch )b 15.2i \" move away bottom
                   2336: .de )f \" temp footer
                   2337: .)D "CS:cover sheet too long"
                   2338: \\..
                   2339: .ch )f -\\n(:Mu        \" put footer to default-may have been moved by BS/BE
                   2340: .)R
                   2341: .ll \\nWu
                   2342: .in 0
                   2343: .br
                   2344: .nr !O \\nO    \" save offset to restore for later .TC
                   2345: .nr !W \\nW    \" save width to restore for later .TC
                   2346: .rs
                   2347: '\"    do previous part of cover sheet
                   2348: .nf
                   2349: .>S
                   2350: .rm )f \" kill temp footer
                   2351: .ch )f 15.0i \" move away footer trap
                   2352: .sp \\n(.pu-\\n(nlu-7.5v
                   2353: '\"    TM or Released Paper?
                   2354: .ie \\n(;0 .sp 7.5
                   2355: .el \{ .nr ;1 \\n(.lu+.45i
                   2356: \l@\\n(;1u\(ul@
                   2357: .      ta 1.7i 3.3i
                   2358: .      ie \\n(.$ \{ .ds ]1 \\$1
                   2359: .              ie \w'\\$1' .nr !T +0\\$1
                   2360: .              el .nr !T \\nP \}
                   2361: .      el .nr !T \\nP
                   2362: .      if \\n(.$-1 \{ .ds ]2 \\$2
                   2363: .              nr !T +0\\$2 \}
                   2364: .      if \\n(.$-2 .ds ]3 \\$3
                   2365: .      if \\n(.$-3 .ds ]4 \\$4
                   2366: .      if \\n(.$-4 .ds ]5 \\$5
                   2367: .      if \\n(.$-5 .ds ]6 \\$6
                   2368: .      if !\w'\\*(]1' .ds ]1 \\nP
                   2369: .      if !\w'\\*(]2' .ds ]2 0
                   2370: .      if !\w'\\*(]3' .ds ]3 \\n(!T
                   2371: .      if !\w'\\*(]4' .ds ]4 \\n(Fg
                   2372: .      if !\w'\\*(]5' .ds ]5 \\n(Tb
                   2373: .      if !\w'\\*(]6' .ds ]6 \\n(Rf
                   2374: .      sp .5v
                   2375: \s9Pages Text:\ \s0\\*(]1\t\s9Other:\ \s0\\*(]2\t\s9Total:\ \s0\\*(]3
                   2376: .      sp 1v
                   2377: \s9No. Figures:\ \s0\\*(]4\t\s9No. Tables:\ \s0\\*(]5\t\s9No. Refs.:\ \s0\\*(]6
                   2378: .      sp .5v
                   2379: \l@\\n(;1u\(ul@
                   2380: '      br \}
                   2381: .lt +1n
                   2382: .if !\\n(;0 .tl 'E-1932-U(3-76)'SEE REVERSE SIDE FOR DISTRIBUTION LIST''
                   2383: .lt -1n
                   2384: .nr O \\n(!O   \" restore offset
                   2385: .nr W \\n(!W   \" restore width
                   2386: .po \\nOu
                   2387: .ll \\nWu
                   2388: .lt \\nWu
                   2389: '\"    put back traps
                   2390: .wh 0 )h
                   2391: .ch )n -\\n(:mu
                   2392: .rn >z )f \" regular footer def'n
                   2393: .rn >s >B      \" put back bottom block expander
                   2394: .ch )f -\\n(:mu
                   2395: .ch )b -\\n(:ru
                   2396: .)R \" reset normal world
                   2397: .ta .8i 1.6i 2.4i 3.2i 4i 4.8i 5.6i 6.4i 7.2i 8i 8.8i 9.6i
                   2398: '\"    clean up
                   2399: .rr ;0 ;1  ;2 
                   2400: .rm >S
                   2401: ..
                   2402: '''\"  FC: generate formal closing [0:1]
                   2403: '''\"  .FC [arg]
                   2404: ''\"   .FC   (no arg) uses "Yours very truly," as closing
                   2405: ''\"   .FC x    uses x as formal closing
                   2406: .de FC
                   2407: .)w    \" force out any floating keeps
                   2408: .in 0
                   2409: .nf
                   2410: .ls 1
                   2411: .in (\\n(.lu/2u)       \" start closing at center of page
                   2412: .rs
                   2413: .ne \\n(:Vu+3v+.5p     \" need .SG room + 2 lines
                   2414: .sp
                   2415: .ie \\n(.$ \\$1
                   2416: .el Yours very truly,
                   2417: .in
                   2418: .fi
                   2419: ..
                   2420: '''\"  SG: generate signature line(s) [0:2]
                   2421: '''\"  .SG [arg] [1]
                   2422: ''\"   .SG     (no arg) causes signature, but no reference data
                   2423: ''\"   .SG ""  causes signature, followed by reference data
                   2424: ''\"   .SG x   causes x to be added to reference data as typist's initials
                   2425: ''\"   if 2nd arg, then ref data aligned with first joint author
                   2426: .de SG
                   2427: '\"    error checks
                   2428: .if !\\n(:V .)D "SG:no authors"
                   2429: .if \\n(:F .)D "SG:missing FE"
                   2430: .if \\n(:y .)D "SG:missing DE"
                   2431: .LC 0 \" clean out any lists
                   2432: .)w            \" force out any floating keeps
                   2433: .)R \" reset things
                   2434: .in 0
                   2435: .nf
                   2436: .ls 1
                   2437: .in (\\n(.lu/2u)
                   2438: .ne \\n(:Vu+1v+.5p
                   2439: .rs
                   2440: .mk
                   2441: .>v
                   2442: .in
                   2443: .if \w@\\$1@ .as }v -\\$1
                   2444: .if \\n(.$-1 .rt \" go to top of sig. if 2nd arg
                   2445: .if \\n(.$-1 .sp 3
                   2446: .if\\n(.$ .if !\\n(.$-1 .rt -1
                   2447: .if\\n(.$ \\*(}v
                   2448: .rm >v
                   2449: .fi
                   2450: ..
                   2451: '''\"  NS: notation after .SG [0:1]
                   2452: '''\"  .NS [arg]
                   2453: '      null,0 - 9 => various notations
                   2454: '      string => copy (string) to
                   2455: .de NS
                   2456: .if \\n(!N .di \"close diversion if multiple NS
                   2457: .if \\n(;M .br \"break only if following .MT
                   2458: .)R \" just in case
                   2459: .nr :D 1  \" indicate nofill, open diversion
                   2460: .ds }4 "Copy to\" default notation
                   2461: .nr ;0 0\\$1
                   2462: .if \w@\\$1@u-\w'\0\0'u .nr ;0 10\"arg value not over two digits
                   2463: .if \\n(;0 .ds }4 "Copy (with att.) to\"
                   2464: .if \\n(;0-1 .ds }4 "Copy (without att.) to\"
                   2465: .if \\n(;0-2 .ds }4 "Att.\"
                   2466: .if \\n(;0-3 .ds }4 "Atts.\"
                   2467: .if \\n(;0-4 .ds }4 "Enc.\"
                   2468: .if \\n(;0-5 .ds }4 "Encs.\"
                   2469: .if \\n(;0-6 .ds }4 "U.S.C.\"
                   2470: .if \\n(;0-7 .ds }4 "Letter to\"
                   2471: .if \\n(;0-8 .ds }4 "Memorandum to\"
                   2472: .if \\n(;0-9 .ds }4 "Copy (\\$1) to\"
                   2473: 'in \\n(;N  \" indent the same amount as the abstract
                   2474: .if !\\n(!N .ds }5 \\*(}4  \"save initial copy-to string
                   2475: .if \\n(!N  .da }C  \"if not initial copy-to, continue }C
                   2476: .if !\\n(!N  .di }C  \" if initial copy-to, open }C
                   2477: .if \\n(!N .sp
                   2478: \!.ds }4 \\*(}4\"req'd for >Z macro inside )M
                   2479: \\*(}4
                   2480: .nf
                   2481: .nr !N 1  \"indicate presence of at least 1 NS
                   2482: ..
                   2483: ''\"   )N: put out copy-to list(s)
                   2484: .de )N
                   2485: .br
                   2486: .rr !N \"indicate completion of a copy-to list
                   2487: .di ]v         \" temp div to find size of copy to lst
                   2488: .}C
                   2489: .br
                   2490: .di
                   2491: .rm ]v
                   2492: .nr ;0 \\n(dn  \" size of list
                   2493: .if \\n(;0 .)M \" output notations, if any
                   2494: ..
                   2495: ''\"   )M - dump a notation list
                   2496: .de )M
                   2497: .nf
                   2498: .sp
                   2499: .ne 2v         \" minimum size
                   2500: .if \\n(.tu<=2v \{\
                   2501: \&\\*(}5
                   2502: See next page
                   2503: 'br \}
                   2504: .nr !U \\n(;0>=\\n(.tu \" will list be continued?
                   2505: .if \\n(!U \{\
                   2506: .      ds ]w Continued next page\"     for footer
                   2507: .      ds ]x \\\\*(}4\ \-\ contd.\"    for header
                   2508: .      ch )f -(\\n(:ou+1v) \}  \" move footer up
                   2509: .}C                    \" output copy to list
                   2510: .if \\n(!U \{\
                   2511: .      rm ]w ]x                \" remove strings
                   2512: .      ch )f -\\n(:ou \}       \" put back footer
                   2513: .rm }C
                   2514: ..
                   2515: '''\"  NE: notation end
                   2516: '''\"  .NE
                   2517: .de NE
                   2518: .br
                   2519: .if \\n(!N .di
                   2520: .if \\n(;M .)N  \"if post-MT, put out list immediately
                   2521: .)R \" reset normal world
                   2522: ..
                   2523: '''\"  AV: generate approval line
                   2524: '''\"  .AV "name"
                   2525: .de AV
                   2526: .ne 6v
                   2527: .in 0
                   2528: .nf
                   2529: .sp
                   2530: APPROVED:
                   2531: .sp 2
                   2532: '\"    Draw 3 inch line then .3 inch space then 1.5 inch line
                   2533: \l'3i'\h'.3i\l'1.5i'
                   2534: '\" Arg is approver's name under 3" line then Date under 1.5" line
                   2535: \\$1\h'|4i-(\w'Da'u)'Date
                   2536: .in
                   2537: .fi
                   2538: ..
                   2539: '''\"  ND: set new date [0:1]
                   2540: '''\"  .ND date
                   2541: .de ND
                   2542: .if !\\n(.$ .)D "ND:missing arg"
                   2543: .ds DT "\\$1
                   2544: ..
                   2545: '''\"  AF: Override Format of Bell Laboratories, Subject/Date/From
                   2546: '''\"  .AF ["company"]
                   2547: ''\"   .AF "company" replaces BTL by company
                   2548: ''\"   .AF "" suppresses BTL only (so stamp) can be used
                   2549: '\"    exists only to set ;n and }2 for .MT
                   2550: .de AF
                   2551: .if \\n(;y .>9 \" terminate .TL diversion
                   2552: .if !\\n(.$ \{\
                   2553: .      nr ;n 1
                   2554: .      nr O 1i
                   2555: .      po \\nOu
                   2556: .      nr W 5.8i
                   2557: .      ev 0
                   2558: .      ll \\nWu
                   2559: .      lt \\nWu
                   2560: .      ev
                   2561: .      ev 1
                   2562: .      ll \\nWu
                   2563: .      lt \\nWu
                   2564: .      ev
                   2565: .      ev 2
                   2566: .      ll \\nWu
                   2567: .      lt \\nWu
                   2568: .      ev
                   2569: '      br \}
                   2570: .ds }2 "\\$1
                   2571: ..
                   2572: '\"    Header, Footer, Bottom of page and Footnotes
                   2573: '\"    header/bottom of page use .ev 2
                   2574: '\"    footnotes done in .ev 1
                   2575: '\"    ;x flag set in .em to help flush any remaining footnotes
                   2576: '\"    :o place that footer trap is moved at end of a footnote
                   2577: '\"    :q size of diverted partial footnote
                   2578: '\"    :m trap for partial footnote diverter and initial footer trap locn
                   2579: '\"    :r bottom of page trap
                   2580: '\"    :s counter of existing footnotes
                   2581: '\"    :u flag set by .H to increment H1 (and p)
                   2582: '\"    ;y amount of space left on page when footer called TEMP
                   2583: '\"    ;z amt of space before expanding footnote TEMP
                   2584: '\"    >x partial footnote text diverted here
                   2585: '\"    >w entire footnote text diverted here
                   2586: '\"    }y string used in line drawing func TEMP
                   2587: '\"    !C test if PX outputs text     TEMP
                   2588: '\"    .)h
                   2589: '\"    header macro
                   2590: .de )h
                   2591: 'ev 0
                   2592: 'nh
                   2593: 'if \\n(Hy 'hy 14
                   2594: 'ev
                   2595: 'ev 2
                   2596: .)R
                   2597: .nr P +1
                   2598: .if \\n(:Z \{.nr P \\n%
                   2599: .      rr :Z \}
                   2600: '\"            following may occur when new page is because of .H 1
                   2601: .if \\n(:u*\\n(:S .nr P 1 \" new section, restart to 1
                   2602: .if \\n(:u \{.nr H1 +1 \" section needs increment
                   2603: .            nr :u 2 \}\" show )h incremented it, so .H knows
                   2604: 'sp \\n(!X             \" extra spacing for top of page
                   2605: .TP\" user-redefinable macro
                   2606: .br\"force a break in header environment
                   2607: .)R
                   2608: 'ev
                   2609: .nr :I 2\"force indent on following .P & set flag for )y
                   2610: .nr :J \\n(nl\"mark spot for )y
                   2611: 'ns
                   2612: 'if \\n(:q .)l \" reprocess any leftover partial footnotes
                   2613: 'nr :q 0
                   2614: .mk ;r
                   2615: .mk ;m
                   2616: .nr !B 0                       \" display width flag (set by )z)
                   2617: .if \\n(;d=0&\\n(:z>0 \{\
                   2618: '\"            \" then process floating keeps
                   2619: '      ie \\n(Df>3  \{  ')z    \"option 4: output at least one
                   2620: '                        )s \} \"          but as many as will fit
                   2621: '      el 'if \\n(Df>1 ')z \}  \"option 2: output one keep only
                   2622: .nr !C \\n(.h                  \" save postition
                   2623: .PX \"user-definable page exit
                   2624: 'ns\"in case PX is non-empty
                   2625: .if !((\\n(!C=\\n(.h)&(\\n(!B=0)) .mk ;m  \" set only if PX or wide display
                   2626: '\"    print top part of multi-page table--see )1 macro
                   2627: .nr ;T 0                       \" mark no table header output yet
                   2628: .if \\n(;A>0 \{.nr ;h \\n(.i
                   2629: .      in0
                   2630: .      >t
                   2631: .      nr ;T 1                 \" mark header (>t) output
                   2632: .      in \\n(;hu      \}
                   2633: .mk )c
                   2634: .nr :J \\n(nl\"mark spot for .P indent check
                   2635: .if !@\\*(]x@@ \\*(]x  \" output message for NS/NE continued
                   2636: ..
                   2637: '\"    .)f
                   2638: '\"    footer macro
                   2639: .de )f
                   2640: .if !@\\*(]w@@ \\*(]w  \" output message for NS/NE continued
                   2641: .nr !D 0               \" clear header position (for .P)
                   2642: '\"    following cancels effect of .SP lying around
                   2643: .nr :N 0
                   2644: 'nr dn 0
                   2645: '\"    print bottom part of boxed multi-page table
                   2646: .rn )f >u\"hide footer
                   2647: .if \\n(;A>0 \{.nr )P 1
                   2648: .      if \\n(;f=0 .T# 1
                   2649: '      br \}
                   2650: .nr ;f 1
                   2651: .rn >u )f\"restore footer
                   2652: '\"    compute amount of room left on the page
                   2653: 'nr ;y \\n(.pu-\\n(nlu-\\n(:mu-1v
                   2654: '\"    if footnotes and there is room left, call footnote expander
                   2655: 'if \\n(:s \{'ie \\n(;y-4v .)o
                   2656: '\"    if footnotes and no room left, save entire footnote text
                   2657: '            el .)m \}
                   2658: 'nr :s 0
                   2659: 'nr :o \\n(:mu
                   2660: 'nr :O \\n(:mu
                   2661: .ie \\n(;C=0 \{\
                   2662: '\"            \" new page if not multi-column
                   2663: .      if \\n(;e \&\c\" if end of input - leave a partial
                   2664: '      bp  \}          \"and start a new page
                   2665: .el .ie \\n(;C=2 .)2   \"end second column
                   2666: .    el .)1            \"end first
                   2667: .rr ;f
                   2668: .ie @\\*(]w@@ 'ch )f -\\n(:ou  \" reset footer trap location if not contd NS/NE
                   2669: .el 'ch )f -(\\n(:ou+1v)       \" up one line if contd NS/NE
                   2670: ..
                   2671: '''\"  page headings
                   2672: '\"    }t string containing top title info
                   2673: '\"    }e string containing even top title info
                   2674: '\"    }o string containing odd top title info
                   2675: '\"    }b string containing bottom title info
                   2676: '''\"  PH: set page header [1]
                   2677: '''\"  .PH arg
                   2678: .de PH
                   2679: .ds }t "\\$1\"
                   2680: ..
                   2681: '''\"  EH: set even page header [1]
                   2682: '''\"  .EH arg
                   2683: ''\"   appears below .PH line
                   2684: .de EH
                   2685: .ds }e "\\$1\"
                   2686: ..
                   2687: '''\"  OH: set odd page header [1]
                   2688: '''\"  .OH arg
                   2689: ''\"   appears below .PH line
                   2690: .de OH
                   2691: .ds }o "\\$1\"
                   2692: ..
                   2693: '''\"  PF: set page footer [1]
                   2694: '''\"  .PF arg
                   2695: .de PF
                   2696: .ds }b "\\$1\"
                   2697: ..
                   2698: '''\"  EF: set even page footer [1]
                   2699: '''\"  .EF arg
                   2700: ''\"   appears above .PF line
                   2701: .de EF
                   2702: .ds }f "\\$1\"
                   2703: ..
                   2704: '''\"  OF: set odd page footer [1]
                   2705: '''\"  .OF arg
                   2706: ''\"   appears above PF line
                   2707: .de OF
                   2708: .ds }p "\\$1\"
                   2709: ..
                   2710: '''\"  TP: user redefinable top of page macro [0]
                   2711: '''\"  .TP
                   2712: ''\"   page titles (for top of page)
                   2713: .de TP
                   2714: 'sp
                   2715: .)K\" kill S/D/F macros when no .MT
                   2716: .af ;P \\gP    \" save format
                   2717: .af P 1                \" normal format for next line
                   2718: .nr ;P \\nP    \" must use different name for P (see .PH)
                   2719: .af P \\g(;P   \" restore format to P
                   2720: .af ;P 1       \" and make the value register normal format
                   2721: .ie \\n(Pv \{\
                   2722: .      ie (\\n(Pv=1)&(\\n(;P>1) 'sp 2
                   2723: .      el \{\
                   2724: .              ce
                   2725: .              ul
                   2726: PRIVATE
                   2727: .              sp \} \}
                   2728: .el 'sp 2
                   2729: .if !\\n(;P-1 .if \\nN 'sp
                   2730: .if !\\n(;P-1 .if \\n(:S .tl \\*(}t
                   2731: .if !\\n(;P-1 .if !\\nN .tl \\*(}t
                   2732: .if \\n(;P-1 .ie \w'\\*(]n' .tl '\\*(]n - \\nP'''
                   2733: .      el .tl \\*(}t
                   2734: 'if !\\n(;P%2 'tl \\*(}e
                   2735: 'if \\n(;P%2 'tl \\*(}o
                   2736: 'sp 2
                   2737: ..
                   2738: '''\"  PX: page heading exit
                   2739: '''\"  user-definable macro
                   2740: '\"    .de PX
                   2741: '\"    ..
                   2742: '''\"  .de PM [N:P:BP:BR:]
                   2743: '\"    Disclosure notice macro.
                   2744: .de PM
                   2745: .if @\\$1@@ \{\
                   2746: .      nr !K 0
                   2747: .      nr :U 0-5v      \}
                   2748: .if \w@\\$1@ \{\
                   2749: .   ie @\\$1@P@ .nr !K 1
                   2750: .   el .ie @\\$1@BP@ .nr !K 3
                   2751: .      el .ie @\\$1@BR@ .nr !K 4
                   2752: .         el .nr !K 2 
                   2753: .   nr :U 5v  \}       \" size of disclosure message
                   2754: .)G            \" reserve bottom space
                   2755: ..
                   2756: '\"    .)b
                   2757: '\"    bottom of page titles
                   2758: .de )b
                   2759: 'ev 2
                   2760: .ie \\n(!K=1 \{\
                   2761: .      tl @@\fBPRIVATE\fR@@
                   2762: .      tl @@This information should not be disclosed to unauthorized persons.@@
                   2763: .      tl @@It is meant solely for use by authorized Bell System employees.@@ \}
                   2764: .el .ie \\n(!K=3 \{\
                   2765: .      tl @@\fBBELL LABORATORIES PROPRIETARY\fR@@
                   2766: .      tl @@Not for use or disclosure outside Bell Laboratories except by@@
                   2767: .      tl @@written approval of the director of the distributing organization.@@ \}
                   2768: .el .ie \\n(!K=4 \{\
                   2769: .      tl @@\fBBELL LABORATORIES RESTRICTED\fR@@
                   2770: .      tl @@The information herein is meant solely for use by authorized@@
                   2771: .      tl @@Bell Laboratories employees and is not to be disclosed to others.@@ \}
                   2772: .el .if \\n(!K=2 \{\
                   2773: .      tl @@\fBNOTICE\fR@@
                   2774: .      tl @@Not for use or disclosure outside the@@
                   2775: .      tl @@Bell System except under written agreement.@@ \}
                   2776: .if \\n(!K .tl @@@@
                   2777: .)R
                   2778: .af ;P \\gP    \" save page number format
                   2779: .af P 1
                   2780: .nr ;P \\nP    \" must use different name for P (see .PH)
                   2781: .af P \\g(;P   \" return format
                   2782: .af ;P 1       \" make value usable
                   2783: .ie !\\n(;P%2 .tl \\*(}f
                   2784: .el .tl \\*(}p
                   2785: .ie \\n(;P=1 \{\
                   2786: .   ie \\nN=1 .tl \\*(}t
                   2787: .   el .tl \\*(}b \}
                   2788: .el .tl \\*(}b
                   2789: .if \\nC .tl \\*(]C
                   2790: .)R
                   2791: 'ev
                   2792: ..
                   2793: '\"    )2: end second column
                   2794: .de )2
                   2795: .po \\nOu \" reset page offset
                   2796: .nr ;C 1 \"set col indicator
                   2797: .if \\n(;e \&\c\"  always leave a partial line over page breaks when EOI
                   2798: 'bp \" force next page
                   2799: ..
                   2800: '\"    )1: end first column
                   2801: .de )1
                   2802: .rt \\n(;mu
                   2803: .po +\\n(;ou \"advance page offset
                   2804: .nr ;C 2 \"set col indicator
                   2805: .nr :I 2\"force indent on following .P & set flag for )y
                   2806: .nr :J \\n(nl\"mark spot for )y
                   2807: 'ns
                   2808: 'if \\n(:q .)l \" reprocess any leftover partial footnotes
                   2809: 'nr :q 0
                   2810: 'if \\n(;d=0&\\n(:z>0 \{\
                   2811: '\"                            \" process floating keeps
                   2812: '      ie \\n(Df>3 \{  ')z     \" option 4 (as many as will fit)
                   2813: '                       )s \}  \"     (and at least one)
                   2814: '      el 'if \\n(Df>1 ')z \}  \" option 2: only one
                   2815: '\"    print top part of multi-page table--see )h macro
                   2816: .nr ;T 0                       \" mark header not output on this page yet
                   2817: .if \\n(;A>0 \{.nr ;h \\n(.i
                   2818: .      in0
                   2819: .      >t
                   2820: .      nr ;T 1                 \" mark table header (>t) is output
                   2821: .      in \\n(;hu      \}
                   2822: .mk )c
                   2823: .nr :J \\n(nl\"mark spot for .P indent check
                   2824: ..
                   2825: '\"    ;l new line length for each column
                   2826: '\"    ;o page offset for 2nd column
                   2827: '\"    ;C column indicator
                   2828: '\"    ;m marked place (where 2nd col returns to)
                   2829: .de 2C \" begin 2 column stuff
                   2830: .if \\n(;C=0 \{\
                   2831: '\"                    \" a .2C after a .2C is a no-op
                   2832: .br
                   2833: .)R
                   2834: .nr ;C 1
                   2835: .if !\\n(.$ .nr ;l \\n(.lu*8u/17u \" new line length
                   2836: .if !\\n(.$ .nr ;o \\n(.lu*9u/17u \" 2nd col page offset
                   2837: .if \\n(.$ .nr ;l \\$1u*1.3n
                   2838: .if \\n(.$ .nr ;o \\nWu-\\n(;lu
                   2839: .ev 1
                   2840: .ll \\n(;lu
                   2841: .lt \\n(;lu
                   2842: .ev
                   2843: .ll \\n(;lu
                   2844: .lt \\n(;lu
                   2845: .nr :L \\nW\"save line length
                   2846: .nr W \\n(.lu
                   2847: .SP
                   2848: .ns
                   2849: .mk ;m \}
                   2850: ..
                   2851: .de 1C
                   2852: .if \\n(;C \{\
                   2853: '\"                    \" 1C no-ops if not in 2C mode
                   2854: .br
                   2855: .if \\n(;C>1 .sp |\\n(.hu      \" move below high water mark on this page
                   2856: .po \\nOu                      \" reset page offset
                   2857: .)R
                   2858: .nr W \\n(:Lu
                   2859: .rr ;L ;C
                   2860: .ev1
                   2861: .ll \\nWu
                   2862: .lt \\nWu
                   2863: .ev
                   2864: .ll \\nWu
                   2865: .lt \\nWu
                   2866: .SP
                   2867: .ns \}
                   2868: ..
                   2869: '''\"  WC:  Width and Output Control for displays/footnotes in 1C/2C
                   2870: '''\"  .WC [arg1] [arg2] ... [arg9]
                   2871: '''\"  where each of argi is either N, [-]WD, [-]WF, [-]FF, [-]FB.
                   2872: ''\"   N - set defaults (;a=;b=;j=0, ;p=1)
                   2873: ''\"   WD - set wide display mode (;a=1) - all displays wide
                   2874: ''\"   WF - set wide footnote mode (;b=1) - all footnotes wide
                   2875: ''\"   FF - set footnotes follow mode (;j=1) - footnotes follow prev on page
                   2876: ''\"   FB - set floaters break mode (;p=1) - fl keeps cause break on current page
                   2877: ''\"   an optional '-' preceeding any of the latter 3 arguments willc clear
                   2878: ''\"   the specified flag.
                   2879: ''\"   this macro sets the internal flags from the command mnemonics
                   2880: .de WC
                   2881: .if \\n(.$ \{\
                   2882: .      ie @\\$1@N@ \{ .nr ;a 0
                   2883: .                      nr ;b 0
                   2884: .                      nr ;j 0
                   2885: .                      nr ;p 1 \}      \" set defaults
                   2886: .      el .ie @\\$1@WD@ .nr ;a 1       \" set wide display mode
                   2887: .      el .ie @\\$1@WF@ .nr ;b 1       \" set wide footnotes mode
                   2888: .      el .ie @\\$1@FF@ .nr ;j 1       \" set footnotes follow mode
                   2889: .      el .ie @\\$1@FB@ .nr ;p 1       \" set floaters cause break
                   2890: .      el .ie @\\$1@-WD@ .nr ;a 0      \" clear wide display mode
                   2891: .      el .ie @\\$1@-WF@ .nr ;b 0      \" clear wide footnote mode
                   2892: .      el .ie @\\$1@-FF@ .nr ;j 0      \" clear footnotes follow mode
                   2893: .      el .ie @\\$1@-FB@ .nr ;p 0      \" clear floaters cause break flag
                   2894: .      el ')D "WC: unknown option"
                   2895: .      if \\n(.$>1 .WC \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
                   2896: '      br  \}
                   2897: ..
                   2898: .de >W
                   2899: ''\"   go to temporary wide mode for footnote or display
                   2900: .if \\n(;C \{\
                   2901: .      ev 1            \" change only footnote/keep environment
                   2902: .      ll \\n(:Lu
                   2903: .      lt \\n(:Lu      \" set long length
                   2904: .      ev
                   2905: .      nr W \\n(:Lu    \" set width register
                   2906: .      nr ;W 1 \}      \" mark temporary wide mode
                   2907: ..
                   2908: .de >N
                   2909: ''\"   go to temporary narrow mode for footnote or display
                   2910: .if (\\n(;l>0)&(\\n(;C=0) \{\
                   2911: .      ev 1            \" change only footnote/keep environment
                   2912: .      ll \\n(;lu      \" set short length (calculated by 2C)
                   2913: .      lt \\n(;lu
                   2914: .      ev
                   2915: .      nr W \\n(;lu
                   2916: .      nr ;W 2 \}      \" mark temporary narrow mode
                   2917: ..
                   2918: .de >R
                   2919: ''\"   return from temporary wide or narrow mode
                   2920: .ie \\n(;W=1 .nr W \\n(;lu     \" change back to narrow
                   2921: .el .if \\n(;W=2 .nr W \\n(;Lu \" back to wide
                   2922: .if \\n(;W \{\
                   2923: .      ev 1
                   2924: .      ll \\nWu                \" reset line lengths
                   2925: .      lt \\nWu
                   2926: .      ev
                   2927: .      nr ;W 0 \}              \" clear temp mode flag
                   2928: ..
                   2929: .de )Q
                   2930: '\"    called in second column to not overprint a long footnote
                   2931: '\"    (called as a substitute to )f)
                   2932: .ch )Q 200v    \" move away
                   2933: .rs
                   2934: 'sp 70         \" space over already printed footnotes
                   2935: ..
                   2936: '''\"  BS: bottom start [0]
                   2937: '''\"  .BS
                   2938: ''\"   define a block of text to appear on
                   2939: ''\"   the bottom of a page between the footnotes and
                   2940: ''\"   the page footer
                   2941: .de BS
                   2942: .ev1
                   2943: .)R
                   2944: .di >K
                   2945: ..
                   2946: '''\"  BE: bottom end [0]
                   2947: '''\"  .BE
                   2948: ''\"   end bottom block
                   2949: .de BE
                   2950: .br
                   2951: .di
                   2952: .)R
                   2953: .ev
                   2954: .nr :U \\n(dnu\"how big is new tail block
                   2955: .)W            \" set bottom to size of :U
                   2956: .rn >K >D
                   2957: .nr :T \\n(:Uu\"save size of current tail block
                   2958: ..
                   2959: .de )W         \" set bottom traps to a new bottom position
                   2960: .if (\\n(:Uu+\\n(:Mu)>(\\n(.pu-\\n(nlu-.5v) .SK\"new page if bigger than where we are now
                   2961: .ch )n -(\\n(:Mu+\\n(:Uu)\"move footnote diverter trap
                   2962: .nr :o +(\\n(:Uu-\\n(:Tu)
                   2963: .nr :O +(\\n(:Uu-\\n(:Tu)
                   2964: .ch )f -\\n(:ou\"move footer trap
                   2965: .nr :m \\n(:Mu+\\n(:Uu\"new place for footer to reside
                   2966: .ch >B -(\\n(:Mu+\\n(:Uu+\\n(!Y-1v) \"plant trap for tail mode expander
                   2967: ..
                   2968: '\"    >B: bottom expander
                   2969: '\"    layout block of text collected by BS/BE
                   2970: .de >B
                   2971: .ev2
                   2972: .)R
                   2973: .nf
                   2974: .>D
                   2975: .)R
                   2976: .ev
                   2977: ..
                   2978: '''\"  VM - Vertical Margin control
                   2979: '\"    .VM t b  where t and b are the number of extra lines for top and bottom
                   2980: .de VM
                   2981: .ie 0\\$1>=0 .nr !X 0\\$1      \" legal value
                   2982: .el .nr !X 0                   \" illegal value
                   2983: .ie 0\\$2>=0 .nr ;n 0\\$2      \" legal
                   2984: .el .nr ;n 0
                   2985: .if !@\\$2@@ \{\
                   2986: .      nr :U \\n(;nv   \" new bottom size (extra)
                   2987: .      ie !\\n(!K .nr :M \\n(!V        \" real bottom of page
                   2988: .      el      .nr :M \\n(!V+5v        \" for disclosure
                   2989: .      )G \}           \" reserve new bottom
                   2990: ..
                   2991: ''\"   )G - reserve new bottom margin - size is in :U
                   2992: .de )G
                   2993: .nr !Y \\n(:T  \" save :T
                   2994: .nr :T 0
                   2995: .)W            \" move traps, etc.
                   2996: .nr :M \\n(:m  \" new 'real' bottom for BS/BE
                   2997: .ch )b -(\\n(:mu-2v)   \" move footer headings too
                   2998: .nr :T \\n(!Y  \" restore :T
                   2999: .rr !Y
                   3000: ..
                   3001: '''\"  FS: footnote text start [0:1]
                   3002: '''\"  .FS [flag]
                   3003: ''\"   optional flag used as footnote label;
                   3004: ''\"   if no argument, lay out a number derived from the
                   3005: ''\"   \*F that appears in the text which auto increment 
                   3006: ''\"   a number register
                   3007: '\"    set hyphenation and adjust according to :i and :j
                   3008: '\"    set }y to the "label" -- either the argument
                   3009: '\"            or the footnote numberer
                   3010: '\"    if no indent, layout the label
                   3011: '\"    if indent, determine the width of the standard indent (;z)
                   3012: '\"            and the width of the label
                   3013: '\"            indent by the standard amount
                   3014: '\"            if the label is to be left justified, undent the
                   3015: '\"                    std amount; layout either the label
                   3016: '\"                    and enough space to make up the std
                   3017: '\"                    amt or the label (if it is bigger than the 
                   3018: '\"                    amt); layout the label
                   3019: '\"            if the label is to be right justified,
                   3020: '\"                    undent by the minimum of the std amt
                   3021: '\"                    and the width of the label
                   3022: '\"                    layout the label
                   3023: '\"    !A  -  used to inhibit the output of footnotes in the second
                   3024: '\"            column.
                   3025: .de FS
                   3026: 'nr :s +1 \" incr counter of existing footnotes
                   3027: .if \\n(:F .)D "FS:missing FE"\"error if existing footnote
                   3028: .if \\n(:F .FE\"end prior footnote
                   3029: .if \\n(:y .)D "FS:missing DE"\"error if existing keep
                   3030: .if \\n(:y .DE\"end prior keep
                   3031: .nr :F 1\"indicate FS begun
                   3032: .if !\\n(!F \{\
                   3033: .      ie \\n(;C .nr !F 2      \" narrow
                   3034: .      el .nr !F 1 \}          \" go wide
                   3035: .ie (\\n(;C>0)&((\\n(;b=1):((\\n(;j=1)&(\\n(!F=1))) \{\
                   3036: .      nr !F 1
                   3037: .      >W \}           \" go wide
                   3038: .el .if ((\\n(;C=0)&(\\n(;j=1)&(\\n(!F=2)) .>N \" go narrow
                   3039: 'ev 1
                   3040: 'di >b
                   3041: .nr :D 1
                   3042: .)R
                   3043: 'nh
                   3044: 'if \\n(:i 'hy 14
                   3045: 'ad
                   3046: 'if \\n(:j 'na
                   3047: 'sp \\n(Fs
                   3048: 'if \\n(.$ 'ds }y \\$1\ \"
                   3049: 'if !\\n(.$ 'ds }y \\*(]y.\ \"
                   3050: 'if \\n(:k \\*(}y\&\c
                   3051: 'if !\\n(:k 'nr ;v \w@\0\0.\ @
                   3052: 'if !\\n(:k 'nr ;u \w@\\*(}y@
                   3053: 'if !\\n(:k 'in +\\n(;vu
                   3054: 'if !\\n(:k 'if !\\n(:l 'ti -\\n(;vu
                   3055: 'if !\\n(:k 'if !\\n(:l 'if !\\n(;u-\\n(;v \\*(}y\h@\\n(;vu-\\n(;uu@\&\c\"}y now free
                   3056: 'if !\\n(:k 'if !\\n(:l 'if \\n(;u-\\n(;v \\*(}y\&\c
                   3057: 'if !\\n(:k 'if \\n(:l 'if \\n(;v-\\n(;u 'ti -\\n(;uu
                   3058: 'if !\\n(:k 'if \\n(:l 'if !\\n(;v-\\n(;u 'ti -\\n(;vu
                   3059: 'if !\\n(:k 'if \\n(:l \\*(}y\&\c
                   3060: ..
                   3061: '\"    .FE - Footnote end
                   3062: .de FE
                   3063: .if !\\n(:F .)D "FE:no FS active"
                   3064: .br
                   3065: 'di
                   3066: .nr :D 0
                   3067: .if \\n(;c .nr :D \\n(;c
                   3068: 'in
                   3069: 'nf
                   3070: 'na
                   3071: '\"    Does this footnote go on the cover sheet?
                   3072: .if !\\n% \{\
                   3073: '      da >c
                   3074: .      >b
                   3075: \!.    br
                   3076: '      di
                   3077: .      if !(\\n(:D=3) \{\
                   3078: .              nr :G 1 \" save footnt for reprint on P. 1 of .AS 2
                   3079: .              da >d
                   3080: .              >b
                   3081: \!.            br
                   3082: .              di
                   3083: '              br \}
                   3084: '      br \}
                   3085: '\"    Does this footnote go on  the bottom of the page?
                   3086: .if !((\\n%=0)*(\\n(:D=3)*(\\n(:t=1)) \{\
                   3087: '      da >y
                   3088: .      >b
                   3089: \!.    br
                   3090: '      di
                   3091: '      br \}
                   3092: .rm>b
                   3093: .)R
                   3094: 'ev
                   3095: .nr :F 0\"indicate footnote ended
                   3096: .>R            \" if in temporary width mode - revert back to normal
                   3097: '\"    If footnote on bottom of page, set spacing and traps.
                   3098: 'if !((\\n%=0)*(\\n(:D=3)*(\\n(:t=1)) \{\
                   3099: '\"    add a space if this is the first footnote
                   3100: .if !((\\n(!A=1):((\\n(;C=2)&(\\n(!F=1))) \{\
                   3101: '\"                    \" no footnotes now if they are wide in 2nd col,
                   3102: '\"                    \" or there are already wide ones on this page.
                   3103: '      if !\\n(:s-1 'nr dn +4v \" leave space for 2 blank lines and rule
                   3104: '      nr :o +\\n(dnu
                   3105: '      nr :O +\\n(dnu
                   3106: .      nr dn 0
                   3107: '\"    Move up footer trap, but not above current position on page,
                   3108: '      if !\\n(.pu-\\n(nlu-.5v-\\n(:ou 'nr :o \\n(.pu-\\n(nlu-.5v
                   3109: '\"    or below :m!
                   3110: '      if !\\n(:ou-\\n(:mu 'nr :o \\n(:mu
                   3111: '      ch )f -\\n(:ou \" move footer trap
                   3112: '      br \}\}
                   3113: ..
                   3114: '\"    .)o
                   3115: '\"    footnote expander, called via footer
                   3116: .de )o
                   3117: '\"    if first column and wide footnotes - prepare for the second column
                   3118: .ie (\\n(!F=1)&(\\n(;C=1) \{\
                   3119: .      nr !A 1 \}      \" mark wide footnotes output
                   3120: .el .nr !A 0           \" else wont overprint footnotes
                   3121: 'ev 1
                   3122: .)R
                   3123: 'nf
                   3124: '\"    leave 2 blank lines after text
                   3125: 'sp 2
                   3126: .ti 0
                   3127: '\"    layout partial rule if new footnote
                   3128: '\"    layout full line length rule if continued footnote
                   3129: .if !\\n(:n \l'72p'
                   3130: .if \\n(:n \l@\\n(.lu@
                   3131: 'nr :n 0
                   3132: .br
                   3133: .if \\n(!A .wh (\\n(nlu-2v) )Q \" set trap for later if footnotes in danger
                   3134: 'nr ;Z 1       \" signal )n to expect text
                   3135: 'nr dn 0
                   3136: '\"    dump accumulated footnote text
                   3137: '\"    long text may spring )n trap so the remaining partial
                   3138: '\"    text may go into >x
                   3139: .>y
                   3140: .br
                   3141: 'di
                   3142: .if \\n(dn=1v .nr dn 0 \" ignore if only the blank line
                   3143: 'nr ;Z 0       \" clear footnotes being output flag
                   3144: .if !\\n(;C=1 \{\
                   3145: .      rr !A           \" if page over - clr long footnote flag
                   3146: .      if \\n(dn=0 .rr !F \}   \" clr footnote width if no partial
                   3147: 'rm >y
                   3148: 'nr :q \\n(dnu
                   3149: 'nr dn 0
                   3150: 'nr :s 0 \" zero counter of existing footnotes
                   3151: .)R
                   3152: 'ev
                   3153: ..
                   3154: '\"    .)n
                   3155: '\"    partial footnote text diverter
                   3156: '\"    called via trap planted at -\n(:m
                   3157: '\"    since the default footer trap is also at -n(:m,
                   3158: '\"    this macro actually invoked when the footer trap
                   3159: '\"    has been moved up due to footnote processing
                   3160: .de )n
                   3161: 'if \\n(;Z   \{\
                   3162: '      di >x     \" only if footnotes (set by )o)
                   3163: '      sp \\n(Fs  \}
                   3164: ..
                   3165: '\"    .)m
                   3166: '\"    called from footer when the size of the footnote text
                   3167: '\"    is greater than room left on the page
                   3168: '\"    saves all the accumulated footnote text into >w
                   3169: .de )m
                   3170: 'ev 1
                   3171: .)R
                   3172: .nf
                   3173: 'di >w
                   3174: .>y
                   3175: .br
                   3176: 'di
                   3177: 'rm >y
                   3178: 'nr :q \\n(dn
                   3179: 'nr dn 0
                   3180: 'nr :s 0
                   3181: 'if \\n(:q 'nr :n 1
                   3182: .if !\\n(;C=1 .rr !A   \" if page over - clr long footnotes flag
                   3183: .)R
                   3184: 'ev
                   3185: ..
                   3186: '\"    .)l
                   3187: '\"    reprocess any leftover partial footnotes and any
                   3188: '\"    entire footnotes
                   3189: '\"    called from .)h
                   3190: .de )l
                   3191: 'nr :s 1
                   3192: .nr :n 1
                   3193: 'di
                   3194: 'ev 1
                   3195: 'di >b
                   3196: .)R
                   3197: 'nh
                   3198: 'nf
                   3199: .>x
                   3200: .>w
                   3201: .nr :F 1\"pretend to be .FS
                   3202: .FE
                   3203: 'rm >x
                   3204: 'rm >w
                   3205: ..
                   3206: '''\"  FD: set footnote default formatting [0:2]
                   3207: '''\"  .FD [arg] [1]           0 <= arg <= 11
                   3208: ''\"   arg=1 ==> hyphenate footnotes
                   3209: ''\"   arg=2 ==> don't adjust footnotes
                   3210: ''\"   arg=4 ==> footnotes flush left, no indent
                   3211: ''\"   arg=8 ==> footnotes indented, stub flush right
                   3212: '\"                    (or any combination <_ 11 decimal).
                   3213: '\"             arg=0, arg >11, or arg null ==> reset all defaults 
                   3214: '\"    defaults: no hyphenate, adjust, indent, no stub right
                   3215: '\"    nroff defaults via .FD 10 (or plain .FD)
                   3216: '\"    if 2nd arg, arrange that .H 1's reset fn ctr (set :C)
                   3217: .de FD
                   3218: '\"    set defaults
                   3219: 'nr :i 0 \" hyphenate flag
                   3220: 'nr :j 0 \" no adjust flag
                   3221: 'nr :k 0 \" no-indent flag (on means no indent)
                   3222: 'nr :l 0 \" stub right flag
                   3223: 'nr ;z 0\"
                   3224: '\"    no args or null 1st arg => set nroff default of .FD 10
                   3225: 'if !\\n(.$ 'nr ;z 10 \" nroff version only
                   3226: 'if \\n(.$ 'if !\w@\\$1@ 'nr ;z 10 \" nroff version only
                   3227: 'if \\n(.$ 'nr ;z \\$1\"
                   3228: 'if \\n(;z-11 'nr ;z 0\"
                   3229: 'if \\n(;z-7 'nr :l 1\"
                   3230: 'if \\n(;z-7 'nr ;z -8\"
                   3231: 'if \\n(;z-3 'nr :k 1\"
                   3232: 'if \\n(;z-3 'nr ;z -4\"
                   3233: 'if \\n(;z-1 'nr :j 1\"
                   3234: 'if \\n(;z-1 'nr ;z -2\"
                   3235: 'if \\n(;z 'nr :i 1\"
                   3236: 'if \\n(.$-1 .nr :C 1\"set flag for .H 1
                   3237: ..
                   3238: '\"    Display mechanism
                   3239: '\"    ?a text of stored floating keep (where a is a-z)
                   3240: '\"    ?a size of stored floating keep (where a is a-z)
                   3241: '\"    !a width of stored floating keeps (where a is a-z)
                   3242: '\"    >0 store for initally diverted text
                   3243: '\"    :0 size of initially diverted text
                   3244: '\"    :z counter of floating keeps 
                   3245: '\"    :y flag indicating Display in progress
                   3246: '\"    :x index of floating keep most recently expanded
                   3247: '\"    :w index of floating keep most recently diverted
                   3248: '\"    :v copy of value of :z (used in .)x)
                   3249: '\"    :t register to pass fixed/float info to DE
                   3250: '\"    ;z size of next to-be-expanded floating keep TEMP
                   3251: '''\"  DS: start fixed display [0:2]
                   3252: '''\"  .DS [arg1] [arg2]
                   3253: ''\"   arg1: no indent (0 or L), indent (1 or I), center (2 or C),
                   3254: ''\"           center block (3 or CB)
                   3255: ''\"   arg2: no fill (0 or N), fill (1 or F)
                   3256: .de DS
                   3257: .nr :t 0
                   3258: .)J "\\$1" "\\$2" "\\$3"
                   3259: ..
                   3260: '''\"  DF: start floating display [0:2]
                   3261: '''\"  .DF [arg1] [arg2]
                   3262: ''\"   arg1: no indent (0 or L), indent (1 or I), center (2 or C),
                   3263: ''\"           center block (3 or CB)
                   3264: ''\"   arg2: no fill (0 or N), fill (1 or F)
                   3265: .de DF
                   3266: .nr :t 1
                   3267: .)J "\\$1" "\\$2" "\\$3"
                   3268: ..
                   3269: '\"    )J: real display start
                   3270: '\"    take args from either DS or DF
                   3271: '\"    :t set to indicate float (1) or fixed (0)
                   3272: '\"    add 2 if centered
                   3273: .de )J
                   3274: .nr ;i \\n(.i          \" save prevailing indent
                   3275: .nr ;q \\n(.u          \" save prevailing fill/no-fill mode
                   3276: 'di
                   3277: .if \\n(:D>1 \{.ie \\n(:t=0  .)D "DS:illegal inside TL or AS"
                   3278: .      el  .)D "DF:illegal inside TL or AS" \}
                   3279: .if \\n(:F \{.ie \\n(:t=0 .)D "DS:missing FE"
                   3280: .      el .)D "DF:missing FE"
                   3281: .      FE \}           \"close it
                   3282: .if \\n(:y \{.ie \\n(:t=0 .)D "DS:missing DE"
                   3283: .      el .)D "DF:missing DE"
                   3284: .      DE \}           \" end the prev. DS
                   3285: .nr :y 1               \" set flag indicating Display
                   3286: .if (\\n(;C>0)&(\\n(;a=1) .>W  \" go wide
                   3287: .ev 1                  \" switch to keep/footnote environment
                   3288: .)R                    \" reset all things
                   3289: 'di >0
                   3290: .nr :D 1
                   3291: .nr ;z 0+0\\$1
                   3292: .if @\\$1@L@ .nr ;z 0  \"left-blocked
                   3293: .if @\\$1@I@ .nr ;z 1  \"indented
                   3294: .if @\\$1@C@ .nr ;z 2  \"center each line
                   3295: .if @\\$1@CB@ .nr ;z 3 \"center as a block
                   3296: .if \\n(;z>3 .nr ;z 3
                   3297: .nr :B \\n(;z          \"set flag for type of display
                   3298: '\"    shorten line length only if .DS 0 or .DS 1
                   3299: .if \\n(:t=0 .if \\n(;z<2 .ll -\\n(;iu
                   3300: .if \\n(;z=1 .in +\\n(Sin
                   3301: .if \\n(;z=2 \{.ce 9999
                   3302: .      nr :t +2 \}     \"centering flag
                   3303: .if \\n(:B=3 \{.nr :Y 1        \"initialize width-of-block register
                   3304: .      nr :t +2
                   3305: .      nr :X \\n(.i    \"save existing indent
                   3306: .      di >X \}        \"begin second diversion
                   3307: .nr ;z 0+0\\$2
                   3308: .if @\\$2@N@ .nr ;z 0  \"No-fill mode
                   3309: .if @\\$2@F@ .nr ;z 1  \"fill mode
                   3310: .nf
                   3311: .if \\n(;z .fi
                   3312: .ll -0\\$3n
                   3313: ..
                   3314: '\"    .)z
                   3315: '\"    expand one floating keep here & now
                   3316: '\"    dump it in keep/footnote env
                   3317: .de )z
                   3318: .nr ;w \\n(:x+1%26+1   \" get name of next queue element
                   3319: .if !((\\n(;C=2)&(\\n(!\\n(;w=1)) \{\
                   3320: '\"                    \" inhibit if wide display in 2nd col
                   3321: 'nr ;d 1       \" inhibit header's output of floating keeps
                   3322: .ev 1          \" footnote/keep environment
                   3323: .SP
                   3324: .)R            \" reset all
                   3325: 'nf
                   3326: 'rs
                   3327: .nr :x \\n(:x+1%26     \" index of next in queue [0:25]
                   3328: .?\\n(;w               \" lay out one keep
                   3329: .rm ?\\n(;w
                   3330: .rr ?\\n(;w !\\n(;w    \" remove size regs
                   3331: .if \\n(!\\n(;w=1 .nr !B 1     \" mark wide display
                   3332: .)R
                   3333: .if \\n(De \{\
                   3334: .      if \\n(;e \&\c\"   eject - but leave a partial on EOI
                   3335: .      bp
                   3336: .      nr !B 0 \}      \" clear wide column display flag
                   3337: .ie \\n(:I>1 \{\
                   3338: '\"            \" no indent on following .P
                   3339: .      if \\n(nl>\\n(:J .nr :I 0 \}  \" unless just past )h
                   3340: .el .nr :I 0
                   3341: .SP
                   3342: .nr :J \\n(nl
                   3343: .ev
                   3344: 'nr :z -1      \" decrement queue count
                   3345: 'nr ;d 0 \}
                   3346: ..
                   3347: '\"    .)y
                   3348: '\"    expand floating keep only if it will fit on this page
                   3349: .de )y
                   3350: '\"    get name of next floating display queue entry
                   3351: 'if \\n(:z \{\
                   3352: '      nr ;w \\n(:x+1%26+1     \"get index of next in queue
                   3353: '      nr ;z \\n(?\\n(;w       \"get length of next queue element
                   3354: '\"    - if there is room to expand the display - do so,  then do a break
                   3355: '\"    unless called from the header (:I=2) (and watch for the case
                   3356: '\"    of header, then text, then a DF that fits).
                   3357: '\"    the same test logic is used in )r.  The if conditional consists
                   3358: '\"    of thee major parts: (1) the test on :I tests whether we just
                   3359: '\"    finished a header, (2) the next test tests whether the display will
                   3360: '\"    fit on this page (distance to the next trap), and (3) is a multiple
                   3361: '\"    test - it takes the value true when the display is too large to
                   3362: '\"    fit on any one page, and we have used less than half of the current
                   3363: '\"    page (meaning that the display can be output now).
                   3364: .      if (\\n(:I=2):(\\n(;z<\\n(.t):\
                   3365: ((\\n(;z>(\\n(.p-\\n(;r-\\n(:m))&(\\n(nl<(\\n(.p-\\n(;r-\\n(:o/2u+\\n(;r))) \{\
                   3366: '              ie \\n(:I<2  .if \\n(;p .br     \" break only if FB mode
                   3367: '              el .if \\n(:Ju<\\n(nlu  .if \\n(;p .br
                   3368: '              )z  \}\}        \" output a DF
                   3369: ..
                   3370: '\"    .)x
                   3371: '\"    expand one floating keep here if it fits
                   3372: '\"    else onto next page
                   3373: '\"    called only via .)w
                   3374: .de )x
                   3375: 'nr :v \\n(:z          \" count of keeps in queue
                   3376: ')y                    \" attempt to output one
                   3377: 'if \\n(:v=\\n(:z \{\
                   3378: '      nr ;d 1         \" don't let )h do the work
                   3379: '      if \\n(;e \&\c\"   if no keep was output -
                   3380: '      SP \\n(.tu+1v   \" then start a new page
                   3381: '      nr ;d 0 
                   3382: '      )z  \}          \" and force output of one floating keep
                   3383: ..
                   3384: '\"    .)w
                   3385: '\"    expand all floating keeps
                   3386: '\"    must be called via .em-called macro
                   3387: '\"    should be called by other macros which cause
                   3388: '\"            major breaks i.e. certain level headings
                   3389: .de )w
                   3390: 'if \\n(:z \{\
                   3391: '      )x      \" output the next
                   3392: '      )w  \}  \" and do all
                   3393: ..
                   3394: '\"    .)u
                   3395: '\"    process floating keep for the current page
                   3396: '\"    the action to be performed is controlled by the user-accessible
                   3397: '\"    registers De and Df, which cause, respectively, a page eject after
                   3398: '\"    each display, and specify the number of displays on each page.
                   3399: .de )u
                   3400: 'if \\n+(:z>25 ')D "DF: too many displays"
                   3401: 'nr :w \\n(:w+1%26     \" form the next queue element name
                   3402: 'nr ;w \\n(:w+1                \" get the index name [a:z]
                   3403: 'rn >0 ?\\n(;w         \" put the display into the queue
                   3404: .nr !\\n(;w 1          \" mark full column width
                   3405: .if (\\n(;C>0)&(\\n(;a=0) .nr !\\n(;w 2        \" unless narrow
                   3406: .nr ?\\n(;w \\n(:0     \" put the size of text into parallel nr queue
                   3407: '\"    \" if single DF and desired on current page, and not wide in two
                   3408: '\"    \" columns, then try to fit  it in.
                   3409: 'if !((\\n(;C>0)&(\\n(!\\n(;w=1)) 'if (\\n(:z=1)&((\\n(Df%2=1):(\\n(Df>5)) ')y
                   3410: ..
                   3411: '\"    .)s
                   3412: '\"    output as many floating keeps as will fit on this page
                   3413: .de )s
                   3414: 'nr :v \\n(:z          \" mark the number of keeps now on queue
                   3415: 'nr ;Y \\n(:I          \" save
                   3416: 'nr :I 2               \" from the header
                   3417: ')y                    \" try to output one
                   3418: 'ie \\n(:v>\\n(:z  ')s \" and put them out while they fit
                   3419: 'el 'nr :I \\n(;Y      \" reset
                   3420: ..
                   3421: '\"    .)t
                   3422: '\"    process a static display.  If it is longer than one page and less
                   3423: '\"    than half of the current page has been used, or the display will
                   3424: '\"    fit on this page, output is begun immediately.  Otherwise, a new
                   3425: '\"    page is begun (which may cause output of a floating keep via )h)
                   3426: '\"    and the static display is output then.  If )h has output a floating
                   3427: '\"    keep, then the tests for available space must be made again.
                   3428: .de )t
                   3429: .br
                   3430: .nr !L \\n()H          \" save curr line spacing
                   3431: .ls 1                  \" ls 1 for output
                   3432: .)r                    \" perform page/display length tests and leave setup
                   3433: .ti \\n(.iu            \" preserve against .ti of .H
                   3434: .nf
                   3435: .if \\n(:t>1 .in -\\n(;iu  \" go to zero indent for centering
                   3436: .rs
                   3437: .nr ;d 1               \" prevent )h from outputting a floating keep
                   3438: .>0                    \" expand display
                   3439: .)R
                   3440: .nr ;d 0
                   3441: .ie \\n(:I>1 \{\
                   3442: .      if \\n(nl>\\n(:J .nr :I 0 \}  \" mark indent flag
                   3443: .el .nr :I 0
                   3444: .ls \\n(!L             \" restore line spacing
                   3445: .in \\n(;iu            \" restore prevailing indent
                   3446: .if !\\n(;q .nf                \" restore no-fill if necessary
                   3447: .if \\n(Ds .SP
                   3448: .nr :J \\n(nl
                   3449: ..
                   3450: '\"    .)r
                   3451: '\"    Control page orientation  of static displays.
                   3452: '\"    Static displays are output as soon after their definition as
                   3453: '\"    feasible.  The following rules are used:
                   3454: '\"      1. if the display will fit on the current page, output it there.
                   3455: '\"      2. if the display won't fit on any page, and we have used less than
                   3456: '\"            half of the current page, then output the display on the
                   3457: '\"            current page.
                   3458: '\"      3. skip to the next page.  If this causes a floating display (or
                   3459: '\"            more than one) to be output, then start again with rule
                   3460: '\"            1, otherwise, just output the display.
                   3461: .de )r
                   3462: .if \\n(Ds  .SP        \" initial spacing
                   3463: '\"    The following if condition tests: (1) if the display is too large to
                   3464: '\"    fit on the current page and either (2) it will fit on an unused page
                   3465: '\"    or (3) we have already used more than half of the current page. (the
                   3466: '\"    three conditions are grouped in the form 1 & (2 : 3)). If this
                   3467: '\"    total condition is true, then a page is ejected and the display output
                   3468: '\"    on the next page.  (see )y for a similar construction).
                   3469: .if (\\n(:0>=\\n(.t)&((\\n(:0<(\\n(.p-\\n(;r-\\n(:m)):\
                   3470: (\\n(nl>(\\n(.p-\\n(;r-\\n(:o/2u+\\n(;r))) \{\
                   3471: '\"            \" conditions not met - force a new page
                   3472: .      if \\n(;e \&\c\" save a partial
                   3473: .      ne \\n(.tu+1v   \" spring the trap
                   3474: .      if \\n(:I<2 .)r \}  \" verify room if a floating keep was output
                   3475: ..
                   3476: '''\"  DE: display end
                   3477: '''\"  .DE
                   3478: '\"    :t=0=>fixed; :t=1=>float; +2 for centering
                   3479: .de DE
                   3480: .if !\\n(:y .)D "DE:no DS or DF active"
                   3481: .if \\n(:B=3 \{.br
                   3482: .      di              \"if centered block, end diversion into >X
                   3483: .      if \\n(dl>\\n(:Y .nr :Y \\n(dl
                   3484: .      if \\n(:Y<\\n(.l .in (\\n(.lu-\\n(:Yu)/2u \"indent by half of white-space
                   3485: .      nf
                   3486: .      >X
                   3487: .      fi
                   3488: .      rm >X
                   3489: .      in \\n(:Xu
                   3490: .      rr :X \}
                   3491: .ce 0
                   3492: .br
                   3493: 'di
                   3494: .rr :D ;D ;E :B
                   3495: .)R                    \" reset all things
                   3496: .ll \\nWu              \"including line length
                   3497: .ev
                   3498: 'nr :0 \\n(dn          \" get size of keep 
                   3499: 'nr dn 0
                   3500: .nr ;x \\n(:t
                   3501: .if \\n(:t-1 .nr ;x -2
                   3502: .>R                    \" revert from possible temp width
                   3503: .if !\\n(;x .)t                \" process fixed style 
                   3504: .if \\n(;x .)u         \" process floating keep
                   3505: .nr :y 0               \" flag indicating DE
                   3506: .nr :Y 0               \"clear width-of-block register
                   3507: ..
                   3508: '\"    .)R
                   3509: '\"    reset all things
                   3510: .de )R
                   3511: 'fi
                   3512: 'na\"  reset default adjustment (see .SA)
                   3513: .if \\n(:h 'ad
                   3514: 'nh
                   3515: 'if \\n(Hy 'hy 14
                   3516: 'in 0
                   3517: 'ti 0
                   3518: ..
                   3519: '''\"  RS: reference text start [0:1]
                   3520: '''\"  .RS [stringname]
                   3521: ''\"   optional stringname used to store number for later reference
                   3522: ''\"   preceding \*(Rf in text generates new number from :R 
                   3523: ''\"   ]r is string version of :r -- ;R flag indicates
                   3524: ''\"   that there are references which have not been printed on
                   3525: ''\"   references page yet (set to 2 by .RS and to 1 by .RF)
                   3526: .de RS
                   3527: .if \\n(;R=2 .)D "RS:missing RF"\"error if existing reference
                   3528: .nr ;R 2 \" indicate a reference exists and is currently in progress
                   3529: .nr Rf +1 \" total reference count for CS
                   3530: .if \\n(.$ .ds \\$1 \u[\\n(:R]\d
                   3531: .ev 2
                   3532: .)R
                   3533: 'in \w@\0\0.\ @u
                   3534: 'ti -\w@\\*(]r.\ @u
                   3535: .nr :D 1
                   3536: .da >r
                   3537: \!.ne 2
                   3538: \\*(]r.\ \&\c
                   3539: ..
                   3540: '''\"  RF: reference text finish
                   3541: '''\"  .RF
                   3542: ''\"   completes reference text diversion - set ;R to 1 that reference ready
                   3543: .de RF
                   3544: .if !(\\n(;R=2) .)D "RF: no RS active"
                   3545: .nr ;R 1
                   3546: .br
                   3547: \!.if \\\\n(Ls .sp
                   3548: .di
                   3549: 'in
                   3550: .nr :D 0
                   3551: .ev
                   3552: ..
                   3553: '''\"  RP: lays out references page [0:2]
                   3554: '''\"  .RP [arg1] [arg2]
                   3555: ''\"   called by TC, CS, and )q or explicitly by user
                   3556: ''\"   first arg 0 means restart numbering
                   3557: ''\"   second arg 0 means do a .SK following references page
                   3558: .de RP
                   3559: .if \\n(;R=2 .)D "RP: missing RF"
                   3560: .if \\n(;R \{\
                   3561: .nr ;R 0 \" turn off references flag
                   3562: .if !(0\\$1) .nr :R 0 1 \" restart counter
                   3563: .)R
                   3564: .ie (0\\$2=2):(0\\$2=3) \{\
                   3565: .if \\n(;e \&\c
                   3566: 'ne 8
                   3567: .sp 1 \}
                   3568: .el \{\
                   3569: .ie \\n(;e .SK
                   3570: .el \{\
                   3571: \&\c
                   3572: .bp \" can't use .SK when called from )q
                   3573: 'br \} \}
                   3574: .ce 1
                   3575: .ul
                   3576: \\*(Rp
                   3577: .if \w@\\*(Rp@ \{
                   3578: .am >C
                   3579: .)T 1 1 "" "\\*(Rp" \\nP 
                   3580: \\..
                   3581: 'br \}
                   3582: .sp 2v
                   3583: .nf
                   3584: .>r
                   3585: .br
                   3586: .rm >r
                   3587: .)R
                   3588: .if (0\\$2=0):(0\\$2=2) .SK
                   3589: 'br \}
                   3590: ..
                   3591: '\"    .)q
                   3592: '\"    called via .em request
                   3593: '\"    set flag for footnotes and flush keep/releases
                   3594: .de )q
                   3595: .br\"force out partial line
                   3596: .LC 0\"clean out lists
                   3597: .nr ;e 1       \" flag that the end of input text (EOI) has been reached
                   3598: .if \\n(:F .FE\"close dangling footnote
                   3599: .if \\n(:y .DE \" end dangling DS
                   3600: .if \\n(!N .NE \" end up dangling notation
                   3601: .)N    \" flush stored NS/NE
                   3602: .nr ;x 0 \" flag for footnotes
                   3603: .if \\n(;R .RP 0 1 \" produce references page
                   3604: \&\c
                   3605: .if (\\n(;C>0)&(\\n(:z>0) 'bp  \" new page for keeps in 2C
                   3606: .)w \" flush floating keeps
                   3607: \&
                   3608: '\"    if footnotes remain and there is no room 
                   3609: '\"    on this page, or if diverted footnote text
                   3610: '\"    remains, be sure to begin another page
                   3611: 'nr :0 \\n(.pu+1v-\\n(nlu-\\n(:Ou
                   3612: 'if \\n(:s 'if (\\n(:0<=0):((\\n(;C=2)&(\\n(!F=1)) 'nr ;x 1
                   3613: 'if \\n(:q 'nr ;x 1
                   3614: '\"    if ;x set, force out footnotes
                   3615: 'if \\n(;x \&\c
                   3616: 'if \\n(;x 'bp
                   3617: 'if \\n(;x \&
                   3618: .nr ;e 0       \" prevent extra pages
                   3619: ..
                   3620: '\"    REQUIRED INITIALIZATIONS
                   3621: '\"    initialize various regs
                   3622: .nr :r 6v \" bottom of page
                   3623: .nr :m 8v \" initial footer place and partial footnote diverter trap
                   3624: .nr :n 0 \" flag for continuation footnote rule
                   3625: .nr :p 0 1 \" in-text footnote numberer
                   3626: .nr :o 0 \" register for footer trap location (set via .FE)
                   3627: .nr :z 0 1 \" counter for floating keeps in progress
                   3628: .nr :y 0 \" flag indicating Display in progress
                   3629: .nr :x 0 \" index for name of expanded floating keep
                   3630: .af ;w a       \" number to letter converter register
                   3631: .nr :w 0 \" index for name of diverted floating keep
                   3632: .nr :F 0\" flag indicating FS in progress
                   3633: .nr :R 0 1 \" in-text reference numberer
                   3634: .ds ]r \\n(:R
                   3635: .ds ]y \\n(:p
                   3636: '\"                    INITIAL SET UP
                   3637: 'wh 0 )h
                   3638: .nr :o \n(:mu \" initial footer trap location on a page
                   3639: .nr :O \n(:mu \" high water mark of :o (needed by )q)
                   3640: 'wh -\n(:mu )f
                   3641: 'ch )f 15i
                   3642: 'wh -\n(:mu )n \" trap for partial footnote diverter
                   3643: 'ch )f -\n(:mu
                   3644: 'wh -\n(:ru )b
                   3645: .nr :M \n(:mu
                   3646: .nr !V \n(:mu          \" save real bottom (VM)
                   3647: .wh -(\n(:Mu-1v) >B\"initial trap for bottom expander
                   3648: '\".FD 10\"initial footnote defaults
                   3649: '\"Setting the registers as if .FD 10 were involked
                   3650: 'nr :i 0
                   3651: 'nr :j 1
                   3652: 'nr :k 0
                   3653: 'nr :l 1
                   3654: 'nr ;z 0
                   3655: .SA 0\"initial adjustment default
                   3656: '''>S>NOCOMPACT<<name>>
                   3657: .if @\*(]Z@MM DEFINED@ \{\
                   3658: .      tm ERROR: MM package read twice
                   3659: .      ab     \}
                   3660: .ds ]Z MM DEFINED
                   3661: '\"    ***INTERNAL NUMBER REGISTERS***
                   3662: '\"    *** SET=UPS FOR CERTAIN DEVICES
                   3663: '\"    parms set here may be explicitly overriden
                   3664: '\"    by options on command line
                   3665: '\"    -rT1: gsi at 12 pitch
                   3666: '\"    -rT2: versatec printer
                   3667: .if \nT=1 \{.if \nW=0 .nr W 80\"GSI at 12-pitch
                   3668: .   if \nO=0 .nr O 3 \}
                   3669: .if \nT=2 \{.nr L 84\"Versatec printer
                   3670: .   ds BU o
                   3671: .   rm ul
                   3672: .   rm cu \}
                   3673: '''\"  E : emboldening for s/d/f etc.
                   3674: ''\"   0=no bold (default for nroff)
                   3675: ''\"   1=bold (default for troff)
                   3676: .if !\w'\gE' .nr E 0
                   3677: '''\"  L : length of page
                   3678: ''\"   settable via -rLn
                   3679: .ie \nL .nr L \nLv
                   3680: .el .nr L 11i
                   3681: .pl \nLu
                   3682: '''\"  N : numbering style [0:3] default = 0; set via -rNn
                   3683: ''\"   0/1 normal; 2/3 sect-page; if 1 or 3 special footer for P=1
                   3684: '''\"  O : initial page offset, normally = 0, but can be overridden from
                   3685: ''\"   command line (via -rOvalue)
                   3686: .ie \w'\gO' .nr O \nOn
                   3687: .el .ie \nA .nr O 1i
                   3688: .el .nr O .75i
                   3689: .po\nOu
                   3690: '''\"  P : Page number (internally managed), initially = 0
                   3691: ''\"   if :S = 0, same as %, but reset to 1 by each .H 1 when :S = 1
                   3692: .if \nP .nr P -1
                   3693: .nr P \nP 1
                   3694: '''\"  S : default point size, initially 10
                   3695: .if !\nS .nr S 10
                   3696: '''\"  U : Underline headings (0 ==> cu when possible, 1 ==> ul)
                   3697: '''\"  W : Width of page (line length and length of title)
                   3698: ''\"   settable via -rWn from command line
                   3699: .ie \nW .nr W \nWn
                   3700: .el .ie \nA .nr W 5.8i
                   3701: .el .nr W 6.0i
                   3702: '\"    W will be used in environment initializations later in file
                   3703: '\"            REQUIRED INITIALIZATIONS
                   3704: '\"    load date into DT string
                   3705: .if \n(mo-0 .ds DT January
                   3706: .if \n(mo-1 .ds DT February
                   3707: .if \n(mo-2 .ds DT March
                   3708: .if \n(mo-3 .ds DT April
                   3709: .if \n(mo-4 .ds DT May
                   3710: .if \n(mo-5 .ds DT June
                   3711: .if \n(mo-6 .ds DT July
                   3712: .if \n(mo-7 .ds DT August
                   3713: .if \n(mo-8 .ds DT September
                   3714: .if \n(mo-9 .ds DT October
                   3715: .if \n(mo-10 .ds DT November
                   3716: .if \n(mo-11 .ds DT December
                   3717: .as DT " \n(dy, 19\n(yr
                   3718: '\"                    INITIALIZE ALL THREE ENVIRONMENTS
                   3719: .S D D\"set up point size
                   3720: 'ev 0
                   3721: .)R
                   3722: .ll \nWu
                   3723: .lt \nWu
                   3724: 'ev
                   3725: 'ev 1
                   3726: .)R
                   3727: .ll \nWu
                   3728: .lt \nWu
                   3729: 'ev
                   3730: 'ev 2
                   3731: .)R
                   3732: .ll \nWu
                   3733: .lt \nWu
                   3734: 'ev
                   3735: '\"            INITIAL SET UP
                   3736: .PH "''- \\\\nP -''
                   3737: '\"    set up type of copy
                   3738: .if \nC=3 \{.ds ]C @@D\ R\ A\ F\ T@@
                   3739: .      PF "''\\\\*(DT'' \}     \" set footer when DRAFT
                   3740: .if \nC=4 \{.ds ]C @@D\ R\ A\ F\ T@@
                   3741: .      PF "''\\\\*(DT''  \" set footer when DRAFT
                   3742: .      ls 2    \" double-spacing
                   3743: .      nr Pt 1 \" indent paragraphs
                   3744: .      nr Pi 10 \}     \" use 10 space indent
                   3745: .if \nC=2 .ds ]C ''DATE FILE COPY''
                   3746: .if \nC=1 .ds ]C ''OFFICIAL FILE COPY''
                   3747: '\"    set defaults for sect-page numbering scheme
                   3748: .if (\nN=3):(\nN=5) \{.nr :S 1
                   3749: .      PF "''\\\\n(H1-\\\\nP''"
                   3750: .      PH \}
                   3751: .if \nN=4 \{.PH\"inhibit default page numbering
                   3752: .      nr N 0 \}
                   3753: .if \nD .PH "'\\*(RE line # \\\\n(.c'- \\\\nP -''
                   3754: .if \nA=1 \{ .nr ;n 1\" for use with preprinted forms
                   3755: .      ds }2
                   3756: '      br \}
                   3757: 'em )q \" end macro
                   3758: '''>E>NOCOMPACT<<name>>
                   3759: '\"    accents are at end of file so that grave accent string doesn't 
                   3760: '\"    mess up commenting conventions
                   3761: '\"    NROFF ACCENTS (` ' ^ ~ cedilla and 2 umlauts)
                   3762: '\" Used precisely like the TROFF accents, q.v.
                   3763: '\" All the strings below contain backspaces.
                   3764: '\" The two umlauts don't work too well in column 1, because
                   3765: '\" they (like neqn) try to backspace over it.
                   3766: '\" The two umlauts don't work at all through various filters, such
                   3767: '\" 300, 450, etc.  They really only work with the -T300, -T330s, and
                   3768: '\" -T300s options of NROFF.
                   3769: '\" For terminals without partial line motions, use " for umlauts.
                   3770: '\" The whole thing is VERY dependent on each individual terminal,
                   3771: '\" and the "play" in each individual platen or forms tractor.
                   3772: '\"    Grave accent -- [aeou]\*`
                   3773: .ds ' '
                   3774: '\"    Acute accent -- [aeou]\*'
                   3775: .ds ` `
                   3776: '\"    Circumflex -- [aeou]\*^
                   3777: .ds ^ ^
                   3778: '\"    Tilde -- n\*~ (But watch out for ".tr ~")
                   3779: .ds ~ ~
                   3780: '\"    Cedilla -- c\*,
                   3781: .ds , ,
                   3782: '\"    Lower-case umlaut -- [aeou]\*:
                   3783: .ds : \[email protected]@\[email protected]@.\[email protected]@.\[email protected]@\[email protected]@
                   3784: '\"    Upper-case umlaut -- [AEOU]\*;
                   3785: .ds ; \[email protected]@\[email protected]@.\[email protected]@.\[email protected]@\[email protected]@

unix.superglobalmegacorp.com

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