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