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