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