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