|
|
1.1 root 1: |include(macro.h)
2:
3: |macro(.top.of.page;
4: [
5: '\" #T used by tbl to draw boxes ?????
6: '\" :2 store for multi-page table heading
7: '\" :A multi-page table heading being used
8: '\" :T top of table printed
9: '\" :d prevent )h from outputting a floating group
10: '\" :o footer trap location
11: '\" :q amount of footnote text
12: '\" :r position at end of page header macro
13: '\" :u position to return to for second column output
14: '\" :v width of stored footnote 0=narrow, 1=wide
15: '\" :w output counter for floating keeps
16: '\" :z input counter for floating keeps
17: '\" P page number register
18: '\" ;i remembered indent TEMP
19: '\" ;o prevailing page offset ??????? bug with .po
20: '\" ;t copy of :w TEMP
21: '\" ;w convert to alpha format TEMP
22: . de )h
23: . ev 2 \" use header environment
24: . if "\*(.T"aps" \{\
25: . nr ;o \\n(.o \" save prevailing page offset
26: . po 0 \" always from left margin
27: . lt 7.5i \" width of photo composer
28: . ps 10 \" 10 point roman font
29: . vs 10p
30: . ft 1
31: . tl '--''--' \" output the cut marks
32: . ft \" restore values
33: . vs
34: . ps
35: . lt
36: . po \\n(;ou\}
37: . nr P +1 \" incr page number
38: . lt \\nWu \" use line length for title
39: . TP \" user-redefinable macro
40: . br \" force a break in the header environment
41: . ev \" back to main environment
42: . ie \\n(:q .ch )f -\\n(:ou \" reset footer trap
43: . el .nr :v 0 \" no saved footnotes, thus narrow
44: . mk :r \" position at end of page header macro
45: . mk :u \" save where second column starts
46: '\" output floating displays
47: . if \\n(:d=0&(\\n(:z-\\n(:w) \{\
48: . nr ;t \\n(:w%26+1 \" get index of next output element
49: . af ;w a \" conversion register for display queue names
50: . nr ;w \\n(;t \" form the next queue element name
51: . )z \" output at least one floating display
52: . )s \" but as many as will fit
53: . rr ;t ;w \} \" free storage
54: '\" print top part of multi-page table
55: . nr :T 0 \" mark multi-page table header not printed
56: . if \\n(:A>0 \{\
57: . nr ;i \\n(.i \" save prevailing indent
58: . in 0 \" indent back
59: . :2 \" heading
60: . nr :T 1 \" mark multi-page table header printed
61: . in \\n(;iu \} \" restore prevailing indent
62: . mk #T \" mark spot for table drawing ???????
63: . rr ;i ;o ;t ;w \" free storage
64: . ns \" avoid .sp in user text here
65: ..
66: ])
67:
68: |macro(top.of.page;
69: [
70: '\" EH string containing even top title info
71: '\" OH string containing odd top title info
72: '\" P page number register
73: '\" PH string containing top title info
74: '\" ;P page number register TEMP
75: . de TP
76: ' sp
77: . af ;P \\gP \" save format of P
78: . af P 1 \" normal format for next line
79: . nr ;P \\nP \" must use different name for P
80: . af P \\g(;P \" restore format to P
81: . af ;P 1 \" normal format for control register
82: ' sp 2
83: . if \\n(;P-1 .tl \\*(PH \" output headers
84: . if !\\n(;P%2 .tl \\*(EH
85: . if \\n(;P%2 .tl \\*(OH
86: ' sp 2
87: . if \\n(;P=4 .if "\\*(f0"model" \{.nr L 13.25i \" model sheet kludge
88: . pl 13.25i \} \" model sheet kludge
89: . rr ;P \" free storage
90: ..
91: ])
92:
93: |macro(.end.of.page;
94: [
95: '\" #T used by tbl to draw boxes ?????
96: '\" :2 store for multi-page table heading
97: '\" :A multi-page table heading being used
98: '\" :C 0=one column, 1=first column, 2=second column
99: '\" :K position for )f trap
100: '\" :T top of table printed
101: '\" :d prevent )h from outputting a floating group
102: '\" :f bottom of table printed
103: '\" :m initial footer place and partial footnote diverter trap
104: '\" :o footer trap location
105: '\" :q amount of footnote text
106: '\" :v width of stored footnote 0=narrow, 1=wide
107: '\" :w output counter for floating keeps
108: '\" :z input counter for floating keeps
109: '\" T. ?????
110: '\" ;i remembered indent TEMP
111: '\" ;o page offset transfer TEMP
112: '\" ;t copy of :w TEMP
113: '\" ;u hidden def of )f TEMP
114: '\" ;w convert to alpha format TEMP
115: '\" ;y room left on the page TEMP
116: . de )f
117: '\" print bottom part of boxed multi-page table
118: . if \\n(:A \{\
119: . rn )f ;u \"hide footer
120: . nr T. 1
121: . if \\n(:f=0 .T# 1 \" print multi-page table footer
122: ' br \" output new page
123: . nr :f 1 \" remember footer has been printed
124: . rn ;u )f \} \" restore footer
125: . nr ;y \\n(.pu-\\n(nlu-\\n(:mu \" compute amount of room left on the page
126: . if \\n(:qu>4v .nr ;y -4v \" output a reasonable amount
127: '\" if footnotes and there is room left and full page or left column output,
128: '\" or narrow footnotes, call footnote expander
129: . ie \\n(:q&\\n(;y&((\\n(:C<2):(\\n(:v=0)) .)o
130: . el \{\
131: . ch )f -\\n(:mu \" hide footnote divider trap
132: . nr :o \\n(:m+\\n(:q \} \" reset footer trap location
133: . ie \\n(:C=0 'bp \" new page if not multi-column
134: '\" end second column
135: . el .ie \\n(:C=2 \{\
136: . nr ;o \\nOu \" save second column offset
137: . nr O \\n(:Ou \" restore first column offset
138: . nr :O \\n(;o \" save second column offset
139: . po \\nOu \" reset page offset
140: . nr :C 1 \" set col indicator
141: ' bp \" force next page
142: . rr ;o \} \" free storage
143: '\" end first column
144: . el \{\
145: . rt \\n(:uu \" return to top
146: . nr ;o \\nOu \" save first column offset
147: . nr O \\n(:Ou \" restore second column offset
148: . nr :O \\n(;o \" save first column offset
149: . po \\nOu \" advance page offset
150: . nr :C 2 \" set col indicator
151: . if \\n(:q .ch )f -\\n(:ou \" reset footer trap
152: '\" output floating displays that are narrow
153: . if \\n(:d=0&(\\n(:z-\\n(:w) \{\
154: . nr ;t \\n(:w%26+1 \" get index of next output element
155: . af ;w a \" conversion register for display queue names
156: . nr ;w \\n(;t \" form the next queue element name
157: '\" inhibit if wide display
158: . if \\n(!\\n(;w=1 \{\
159: . )z \" output at least one floating display
160: . )s \} \" but as many as will fit
161: . rr ; o ;t ;w \} \" free storage
162: '\" print top part of multi-page table
163: . nr :T 0 \" mark multi-page table header not printed
164: . if \\n(:A>0 \{\
165: . nr ;i \\n(.i \" save prevailing indent
166: . in 0 \" indent back
167: . :2 \" heading
168: . nr :T 1 \" mark multi-page table header printed
169: . in \\n(;iu \} \" restore prevailing indent
170: . mk #T \" mark spot for table drawing ???????
171: . rr ;i ;t ;w \" free storage
172: . ns \} \" avoid .sp in user text here
173: . if \\n(:A \{\
174: . nr :K \\n(:ou+2v \" position for )f trap
175: . ch >f -(\\n(:Ku+1v) \" when moved by >f macro
176: ' br \}
177: . rr ;y \" free storage
178: ..
179: ])
180:
181: |macro(.float.output;
182: [
183: '\" !{a-z} width of stored floating 0=narrow, 1=wide
184: '\" :C 0=one column, 1=first column, 2=second column
185: '\" :d prevent )h from outputting a floating group
186: '\" :w output counter for floating keeps
187: '\" :z input counter for floating keeps
188: '\" ?{a-z} text of stored floating
189: '\" |{a-z} size of stored floating
190: '\" ;i remembered indent TEMP
191: '\" ;l remembered line spacing TEMP
192: '\" ;q remembered fill/no-fill mode TEMP
193: '\" ;w convert to alpha format TEMP
194: . de )z
195: . if !\\n(:z-\\n(:w .tm no floats to output
196: . nr :w \\n(:w%26+1 \" get index of next output element
197: . af ;w a \" conversion register for display queue names
198: . nr ;w \\n(:w \" form the next queue element name
199: . nr ;q \\n(.u \" save prevailing fill/no-fill mode
200: . nr ;l \\n(.L \" save line spacing
201: . nr ;i \\n(.i \" save prevailing indent
202: . ev 1 \" use footnote environment
203: . nf \" bring it back in no-fill
204: . ls 1 \" output display in ls 1
205: . in 0 \" indent back
206: . nr :d 1 \" inhibit header from calling )y
207: . rs \" restore spacing
208: . br \" output partial line before display
209: . ?\\n(;w \" lay out one keep
210: . if \\n(;q .fi \" restore fill if necessary
211: . ls \\n(;L \" restore line spacing
212: . in \\n(;iu \" restore prevailing indent
213: . nr :d 0 \" allow )h to process fl keeps again
214: . ev \" back to previous environment
215: . ne 2 \" require two lines under float
216: . rm ?\\n(;w \" free storage
217: . rr |\\n(;w !\\n(;w
218: . rr ;i ;l ;q ;w
219: ..
220: ])
221:
222: |macro(.multiple.float.output;
223: [
224: '\" !{a-z} width of stored floating 0=narrow, 1=wide
225: '\" :C 0=one column, 1=first column, 2=second column
226: '\" :m initial footer place and partial footnote diverter trap
227: '\" :o footer trap location
228: '\" :r position at end of page header macro
229: '\" :w output counter for floating keeps
230: '\" :z input counter for floating keeps
231: '\" |{a-z} size of stored floating
232: '\" ;h height of floating display on top of queue TEMP
233: '\" ;t copy of :w TEMP
234: '\" ;w convert to alpha format TEMP
235: . de )s
236: '\" inhibit if no floats in queue
237: . if \\n(:z-\\n(:w \{\
238: . nr ;t \\n(:w%26+1 \" get index of next output element
239: . af ;w a \" conversion register for display queue names
240: . nr ;w \\n(;t \" form the next queue element name
241: . nr ;h \\n(|\\n(;w \" height of current display
242: '\" The following if condition tests: (1) if wide displays and (2) we are on the
243: '\" first column and (3) if the float fits on the current page
244: '\" or (4) the float is too large to fit on any one page, and (5) we have used
245: '\" less than half of the current page. (the five conditions are grouped
246: '\" in the form ((1 & 2) & (1 : (2 & 3))). If this total condition is true,
247: '\" then a float is output.
248: . if (((\\n(!\\n(;w=1)&(\\n(:C<2))&\
249: ((\\n(;h<\\n(.t):((\\n(;h>(\\n(.p-\\n(:r-\\n(:m))&\
250: (\\n(nl<=(\\n(.p-\\n(:r-\\n(:o/2u+\\n(:r))))) \{\
251: . )z \" output it
252: . )s \} \" recurse
253: . rr ;h ;t ;w \} \" free storage
254: ..
255: ])
256:
257: |macro(.flush.float.output;
258: [
259: '\" :d prevent )h from outputting a floating group
260: '\" :w output counter for floating keeps
261: '\" :z input counter for floating keeps
262: '\" ;o copy of :w TEMP
263: . de )w
264: '\" inhibit if no floats in queue
265: . if \\n(:z-\\n(:w \{\
266: . nr ;o \\n(:w \" save output count
267: . )s
268: . if \\n(:w=\\n(;o \{\
269: . nr :d 1 \" inhibit header from calling )y
270: . rs \" turn on spacing
271: . bp \" top of next page
272: . nr :d 0 \} \" allow )h to process fl keeps again
273: . )w \} \" recurse
274: . rr ;o \" free storage
275: ..
276: ])
277:
278: |macro(.footnote.output;
279: [
280: '\" dump accumulated footnote text
281: '\" long text may spring )n trap so the remaining partial
282: '\" text may go into :3
283: '\" :3 store for partial footnotes
284: '\" :m initial footer place and partial footnote diverter trap
285: '\" :o footer trap location
286: '\" :q amount of footnote text
287: '\" :v width of stored footnote 0=narrow, 1=wide
288: . de )o
289: . ev 1 \" use footnote environment
290: . nf \" bring it back in no-fill
291: . ls 1 \" output display in ls 1
292: . in 0 \" indent back
293: . :F \" lay out footnotes
294: '\" did we spring the partial footnote trap
295: . ie "\\n(.z":3" \{\
296: . br \" get last partial line
297: . di \" end diversion
298: . nr :q \\n(dnu \" fix amount of footnote text
299: . rn :3 :F \} \" put text back in :F
300: . el .nr :q 0 \" clear amount of footnote text
301: . ev \" back to main environment
302: . if \\n(:qu<=2v \{\ \" ignore just divider line
303: . nr :q 0 \" clear amount of footnote text
304: . rm :F \} \" clear text of footnote
305: . nr :o \\n(:mu+\\n(:qu \" reset footnote location register
306: . ch )f -\\n(:ou \" reset trap for footer
307: ..
308: ])
309:
310: |macro(.footnote.diverter;
311: [
312: '\" partial footnote text diverter
313: '\" called via trap planted at -\n(:m
314: '\" since the default footer trap is also at -n(:m,
315: '\" this macro actually invoked when the footer trap
316: '\" has been moved up due to footnote processing
317: '\" :3 store for partial footnotes
318: '\" :q amount of footnote text
319: '\" ;o prevailing page offset ??????? bug with .po
320: . de )n
321: . if \\n(:q \{\
322: . di :3
323: . nr ;o \\n(.o \" save prevailing page offset
324: . po \\nOu \" always from left margin
325: . ps 10 \" 10 point roman font
326: . vs 10p
327: . ft 1
328: . ie \n(.A=0 \l@\\n(.lu@
329: . el _____________________________
330: . ft \" restore values
331: . vs
332: . ps
333: . po \\n(;ou\}
334: ..
335: ])
336:
337: |macro(.end.of.file;
338: [
339: . de )q
340: ..
341: ])
342:
343: |macro(.initalize;
344: [
345: '\" REQUIRED INITIALIZATIONS
346: '\" initialize various regs
347: '\" !{a-z} width of stored floating 0=narrow, 1=wide
348: '\" #T used by tbl to draw boxes ?????
349: '\" :0 store for initally diverted text
350: '\" :1 store for centered block text
351: '\" :2 store for multi-page table heading
352: '\" :3 store for partial footnotes
353: '\" :A multi-page table heading being used
354: . nr :A 0
355: '\" :C 0=one column, 1=first column, 2=second column
356: . nr :C 0
357: '\" :F Footnote text
358: '\" :K position for )f trap
359: . nr :K 0
360: '\" :O page offset for other column
361: . nr :O 0
362: '\" :T top of table printed
363: . nr :T 0
364: '\" :W page width for full page output
365: . nr :W 0
366: '\" :d prevent )h from outputting a floating group
367: . nr :d 0
368: '\" :f bottom of table printed
369: . nr :f 0
370: '\" :m initial footer place and partial footnote diverter trap
371: . nr :m .8i
372: '\" :o footer trap location
373: . nr :o \n(:mu
374: '\" :q amount of footnote text
375: . nr :q 0
376: '\" :r position at end of page header macro
377: . nr :r .6i
378: '\" :u position to return to for second column output
379: . nr :u .6i
380: '\" :v width of stored footnote 0=narrow, 1=wide
381: . nr :v 0
382: '\" :w output counter for floating keeps
383: . nr :w 0
384: '\" :x flag indicating footnote in progress
385: . nr :x 0
386: '\" :y flag indicating group/float in progress
387: . nr :y 0
388: '\" :z input counter for floating keeps
389: . nr :z 0
390: '\" ?{a-z} text of stored floating
391: '\" AT string containing AT&T in helvetica
392: . ds AT \fP\f(HBA\h'-.2m'T\h'-.15m'\s0\s13&\s0\s16\h'-.15m'T
393: '\" DT date string
394: . if \n(mo-0 .ds DT January
395: . if \n(mo-1 .ds DT February
396: . if \n(mo-2 .ds DT March
397: . if \n(mo-3 .ds DT April
398: . if \n(mo-4 .ds DT May
399: . if \n(mo-5 .ds DT June
400: . if \n(mo-6 .ds DT July
401: . if \n(mo-7 .ds DT August
402: . if \n(mo-8 .ds DT September
403: . if \n(mo-9 .ds DT October
404: . if \n(mo-10 .ds DT November
405: . if \n(mo-11 .ds DT December
406: . as DT " \n(dy, 19\n(yr
407: '\" EH string containing even top title info
408: '\" F default font
409: . nr F 1
410: '\" L page length
411: . if !\nL .nr L 11i
412: '\" LO string containing logo
413: . ie "\*(.T"aps" .ds LO \s36\(Lb\s0
414: . el .ds LO \s36\(L1\s0\s16\v'-.4'\*(AT\v'.4'\h'-\w'\*(AT'u'\fP\s0
415: '\" OH string containing odd top title info
416: '\" P page number
417: . if \nP .nr P -1
418: . nr P \nP 1
419: '\" PH string containing top title info
420: . ds PH ''- \\nP -'' \" top of page string
421: '\" O page offset
422: . if !\w'\gO' .ie t .nr O .963i
423: . el .nr O 0i
424: . if "\*(.T"202" .nr O \nO-.34375i
425: . if "\*(.T"aps" .nr O \nO-.21875i
426: '\" S default point size
427: . if !\nS .nr S 10
428: '\" T. ?????
429: '\" W page width
430: . if !\nW .nr W 6i
431: '\" |{a-z} size of stored floating
432: '\" INITIAL SET UP
433: . wh 0 )h \" trap for header
434: . wh -\n(:mu )f \" trap for footer
435: . ch )f 15i \" move it over partial footnote diverter
436: . wh -\n(:mu )n \" trap for partial footnote diverter
437: . ch )f -\n(:mu
438: . em )q \" end macro
439: '\" TROFF ACCENTS (` ' ^ ~ cedilla and 2 umlauts)
440: '\" The accent string must follow immediately the character to be accented.
441: '\" These strings are "tuned" to the Times Roman type faces ONLY.
442: '\" The R, I, and B fonts are assumed to be mounted in
443: '\" positions 1, 2, and 3, respectively.
444: '\" All of these strings alter the number register `:'.
445: '\" Grave accent -- {aeou}\*`
446: . ds ` \\k:\h@-\\n(.wu*8u/10u@\h@\\n(.fu/2u*2u+1u-\\n(.fu*.2m@\(ga\h@|\\n:u@
447: '\" Lower-case acute accent -- {aeou}\*'
448: . ds ' \\k:\h@-\\n(.wu*8u/10u@\h@\\n(.fu/2u*2u+1u-\\n(.fu*.2m+.07m@\(aa\h@|\\n:u@
449: '\" Upper-case acute accent -- {aeou}\*+
450: . ds + \\k:\h@-\\n(.wu*8u/10u@\h@\\n(.fu/2u*2u+1u-\\n(.fu*.2m+.07m@\[email protected]@\(aa\[email protected]@\h@|\\n:u@
451: '\" Circumflex -- {aeou}\*^
452: . ds ^ \\k:\h@-\\n(.wu*8u/10u@\h@\\n(.fu/2u*2u+1u-\\n(.fu*.15m-.07m@\
453: \h@\\n(.fu-1u/2u*.02m@^\h@|\\n:u@
454: '\" Tilde -- n\*~ (But watch out for ".tr ~")
455: . ds ~ \\k:\h@-\\n(.wu*8u/10u@\h@\\n(.fu/2u*2u+1u-\\n(.fu*.2m-.07m@\
456: \h@\\n(.fu-1u/2u*.05m@~\h@|\\n:u@
457: '\" Cedilla -- c\*,
458: . ds , \\k:\h@-\\n(.wu*85u/100u@\[email protected]@,\[email protected]@\h@|\\n:u@
459: '\" Lower-case umlaut -- {aeou}\*:
460: . ds : \\k:\h@-\\n(.wu*85u/100u@\h@\\n(.fu/2u*2u+1u-\\n(.fu*3u*.06m@\
461: \h@3u-\\n(.fu/2u*.05m-.1m@\
462: \[email protected]@\z.\h@\\n(.fu-1u/2u*.05m+.2m@.\[email protected]@\h@|\\n:u@
463: '\" Upper-case umlaut -- {AEOU}\*;
464: . ds ; \\k:\h@-\\n(.wu*75u/100u@\h@\\n(.fu/2u*2u+1u-\\n(.fu*3u*.09m@\
465: \h@3u-\\n(.fu/2u*.06m-.15m@\h@\\n(.fu-1u/2u*.04m@\
466: \[email protected]@\z.\[email protected]@.\[email protected]@\h@|\\n:u@
467: '\" Nasal -- c\*-
468: . ds - \\k:\h@-\\n(.wu*75u/100u@\[email protected]@`\[email protected]@\h@|\\n:u@
469: '\" Slash -- c\*/
470: . ds / \\k:\h@-\\n(.wu*85u/100u@\[email protected]@\(aa\[email protected]@\h@|\\n:u@
471: ])
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.