|
|
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.