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

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

unix.superglobalmegacorp.com

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