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

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

unix.superglobalmegacorp.com

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