|
|
1.1 ! root 1: |include(list.h) ! 2: |include(macro.h) ! 3: |include(style.h) ! 4: ! 5: |attribute(page.offset; init 0; ! 6: $ [ ! 7: '\" O current page offset ! 8: '\" On page offset for column n ! 9: . po $ ! 10: . nr O \n(.o ! 11: . nr O0 \n(.o ! 12: ]) ! 13: ! 14: |attribute(line.length; init 6i; ! 15: $ [ ! 16: '\" W current page width ! 17: '\" Wn page width for column n ! 18: . ll $ ! 19: . lt $ ! 20: . nr W \n(.lu ! 21: ]) ! 22: ! 23: |attribute(page.length; init 11i; ! 24: $ [ ! 25: . pl $ ! 26: ]) ! 27: ! 28: |attribute(spacing; init off; ! 29: on [ ! 30: . rs ! 31: ] off [ ! 32: . ns ! 33: ]) ! 34: ! 35: |attribute(new.page; nostack; ! 36: [ ! 37: . bp ! 38: ] odd [ ! 39: '\" ;P page number register TEMP ! 40: . bp ! 41: . af ;P \g+Q+-Q-page_counter \" save format of page_counter ! 42: . af page_counter 1 \" normal format for next line ! 43: . nr ;P \n page_counter \" must use different name for P ! 44: . af page_counter \g(;P \" restore format to P ! 45: . af ;P 1 \" normal format for control register ! 46: . if !\n(;P%2 \{\ ! 47: . rs ! 48: . bp \} ! 49: . rr ;P \" free storage ! 50: ] even [ ! 51: '\" ;P page number register TEMP ! 52: . bp ! 53: . af ;P \g+Q+-Q-page_counter \" save format of page_counter ! 54: . af page_counter 1 \" normal format for next line ! 55: . nr ;P \n page_counter \" must use different name for P ! 56: . af page_counter \g(;P \" restore format to P ! 57: . af ;P 1 \" normal format for control register ! 58: . if \n(;P%2 \{\ ! 59: . rs ! 60: . bp \} ! 61: . rr ;P \" free storage ! 62: ]) ! 63: ! 64: |attribute(line.spacing; stack, init 1; ! 65: $ [ ! 66: . ls $ ! 67: ]) ! 68: ! 69: |attribute(blank.lines; nostack; ! 70: $ [ ! 71: . sp $ ! 72: . ti \n(.iu \" movement resets indentation ! 73: ] [ ! 74: . sp 1 ! 75: . ti \n(.iu \" movement resets indentation ! 76: ]) ! 77: ! 78: |attribute(minimum.lines; nostack; ! 79: $ [ ! 80: '\" minimum space mechanism ! 81: '\" :B amount of accumulated blank space ! 82: '\" :D amount of accumulated blank space in diversion ! 83: '\" :E position of last minimum space in diversion ! 84: '\" :N position of last minimum space ! 85: '\" }D name of last minimum space diversion ! 86: '\" ;4 amount to space TEMP ! 87: . br ! 88: '\" when in a diversion, use .d (rather than nl) for position ! 89: '\" careful--space might occur at the same ! 90: '\" position BUT in a different named diversion ! 91: '\" (hence, the use of the string }D) ! 92: '\" bug still might be possible, if the same named diversion ! 93: '\" is used, that a space might occur in the same vertical place. ! 94: '\" very unlikely for ! 95: '\" a) monk will remove :D and :E when not in a diversion ! 96: '\" b) tbl generates unique names ! 97: . ie !'\n(.z'' \{\ ! 98: . if !'\n(.z'\*(}D' .rr :D :E ! 99: . nr ;4 $v ! 100: . if !(\n(.d=\n(:D) .nr :E 0 \" different place for sure ! 101: . nr ;4 -\n(:Eu \" remove previous accumulation, if any ! 102: . if \n(;4 \{\ ! 103: . sp \n(;4u ! 104: . nr :E +\n(;4u \} ! 105: . rm ;4 ! 106: . ds }D \n(.z ! 107: . nr :D \n(.d \} ! 108: . el \{\ ! 109: . rr :D :E \" remove the in-diversion registers ! 110: . nr ;4 $v ! 111: . if !(\n(nl=\n(:N) .nr :B 0 \" different place for sure ! 112: . nr ;4 -\n(:Bu \" remove previous accumulation, if any ! 113: . if \n(;4 \{\ ! 114: . sp \n(;4u \" space and recompute accumulation ! 115: . nr :B +\n(;4u \} ! 116: . rm ;4 ! 117: . nr :N \n(nl \} ! 118: . ti \n(.iu \" movement resets indentation ! 119: ] [ ! 120: '\" minimum space mechanism ! 121: '\" :B amount of accumulated blank space ! 122: '\" :D amount of accumulated blank space in diversion ! 123: '\" :E position of last minimum space in diversion ! 124: '\" :N position of last minimum space ! 125: '\" }D name of last minimum space diversion ! 126: '\" ;4 amount to space TEMP ! 127: . br ! 128: '\" when in a diversion, use .d (rather than nl) for position ! 129: '\" careful--space might occur at the same ! 130: '\" position BUT in a different named diversion ! 131: '\" (hence, the use of the string }D) ! 132: '\" bug still might be possible, if the same named diversion ! 133: '\" is used, that a space might occur in the same vertical place. ! 134: '\" very unlikely for ! 135: '\" a) monk will remove :D and :E when not in a diversion ! 136: '\" b) tbl generates unique names ! 137: . ie !'\n(.z'' \{\ ! 138: . if !'\n(.z'\*(}D' .rr :D :E ! 139: . nr ;4 1v ! 140: . if !(\n(.d=\n(:D) .nr :E 0 \" different place for sure ! 141: . nr ;4 -\n(:Eu \" remove previous accumulation, if any ! 142: . if \n(;4 \{\ ! 143: . sp \n(;4u ! 144: . nr :E +\n(;4u \} ! 145: . rm ;4 ! 146: . ds }D \n(.z ! 147: . nr :D \n(.d \} ! 148: . el \{\ ! 149: . rr :D :E \" remove the in-diversion registers ! 150: . nr ;4 1v ! 151: . if !(\n(nl=\n(:N) .nr :B 0 \" different place for sure ! 152: . nr ;4 -\n(:Bu \" remove previous accumulation, if any ! 153: . if \n(;4 \{\ ! 154: . sp \n(;4u \" space and recompute accumulation ! 155: . nr :B +\n(;4u \} ! 156: . rm ;4 ! 157: . nr :N \n(nl \} ! 158: . ti \n(.iu \" movement resets indentation ! 159: ]) ! 160: ! 161: |attribute(horizontal.motion; nostack; ! 162: $ [\h'$'] ! 163: number $$. [\h'\n$$.'] ! 164: number $number.register [\h'\n($number.register']) ! 165: ! 166: |attribute(vertical.motion; nostack; ! 167: $ [\v'$'] ! 168: number $$. [\v'\n$$.'] ! 169: number $number.register [\v'\n($number.register']) ! 170: ! 171: |attribute(concatenate; nostack; ! 172: [\&\c ! 173: ]) ! 174: ! 175: |attribute(new.line; nostack; ! 176: [ ! 177: . br ! 178: ]) ! 179: ! 180: |attribute(indent; stack, default 0; ! 181: $ [ ! 182: . in $ ! 183: ]) ! 184: ! 185: |attribute(indent.line; nostack; ! 186: $ [ ! 187: . ti $ ! 188: ] ! 189: number $$. [ ! 190: . ti \n$$.u ! 191: ] ! 192: number $number.register [ ! 193: . ti \n($number.registeru ! 194: ]) ! 195: ! 196: |attribute(fill; stack, init on; ! 197: on [ ! 198: ' fi ! 199: ] off [ ! 200: ' nf ! 201: ]) ! 202: ! 203: |attribute(adjust; stack, init both; ! 204: right [ ! 205: . ad r ! 206: ] left [ ! 207: . ad l ! 208: ] both [ ! 209: . ad b ! 210: ] on [ ! 211: . ad ! 212: ] off [ ! 213: . na ! 214: ]) ! 215: ! 216: |attribute(title; nostack; ! 217: $left $center $right [ ! 218: . tl \(ts$left\(ts$center\(ts$right\(ts ! 219: ] $$. [ ! 220: . tl \*$$. ! 221: ] $$.. [ ! 222: . tl \*($$.. ! 223: ] $ [ ! 224: . tl $ ! 225: ]) ! 226: ! 227: |attribute(center; stack, default off; ! 228: on [ ! 229: . ce 9999 ! 230: ] off [ ! 231: . ce 0 ! 232: ]) ! 233: ! 234: |attribute(center.block; stack, default off; ! 235: on [ ! 236: '\" :1 store for centered block text ! 237: '\" :Y width of a center block diversion ! 238: . nr :Y 0 \" initialize width of block ! 239: . br \" output partial line before block ! 240: . di :1 \" begin diversion ! 241: ] off [ ! 242: '\" :1 store for centered block text ! 243: '\" :Y width of a center block diversion ! 244: '\" ;L remembered line spacing TEMP ! 245: '\" ;i remembered indent TEMP ! 246: '\" ;q remembered fill/no-fill mode TEMP ! 247: . br \" get last partial line ! 248: . di \" end diversion of centered block ! 249: . nr ;q \n(.u \" save prevailing fill/no-fill mode ! 250: . nf \" bring it back in no-fill ! 251: . nr ;L \n(.L \" save line spacing ! 252: . ls 1 \" output display in ls 1 ! 253: . nr ;i \n(.i \" save prevailing indent ! 254: . if \n(dl>\n(:Y .nr :Y \n(dl ! 255: . if \n(:Y<\n(.l .in (\n(.lu-\n(:Yu)/2u \"indent by half of white-space ! 256: . :1 \" text ! 257: . if \n(;q .fi \" restore fill if necessary ! 258: . ls \n(;L \" restore line spacing ! 259: . in \n(;iu \" restore prevailing indent ! 260: . rr ;L ;i ;q \" free storage ! 261: . rm :1 ! 262: ]) ! 263: ! 264: |attribute(text; nostack; ! 265: $ [$] ! 266: roman $ [\f1\&$\fP\&] ! 267: italics $ [\f2\&$\fP\&] ! 268: bold $ [\f3\&$\fP\&] ! 269: bolditalics $ [\f4\&$\fP\&] ! 270: cw $ [\f(CW\&$\fP\&]) ! 271: ! 272: |attribute(error; nostack; ! 273: number $* $$. [ ! 274: . tm "__FILE__":__LINE__: $* \n$$. ! 275: ] number $* $number.register [ ! 276: . tm "__FILE__":__LINE__: $* \n($number.register ! 277: ] string $* $$. [ ! 278: . tm "__FILE__":__LINE__: $* \n$$. ! 279: ] string $* $string.register [ ! 280: . tm "__FILE__":__LINE__: $* \n($string.register ! 281: ] $* [ ! 282: . tm "__FILE__":__LINE__: $* ! 283: ]) ! 284: ! 285: |attribute(here; stack, default off; ! 286: on [ ! 287: '\" group mechanism ! 288: '\" :0 store for initally diverted text ! 289: '\" :y flag indicating group/float in progress ! 290: . if \n(:y .tm "__FILE__":__LINE__: Here's and/or Around's can not be nested ! 291: . nr :y 1 \" set flag indicating group ! 292: . br \" output partial line before display ! 293: . di :0 \" collect in :0 ! 294: ] off [ ! 295: '\" Control page orientation of blocks. ! 296: '\" Blocks are output as soon after their definition as ! 297: '\" feasible. The following rules are used: ! 298: '\" 1. if the block will fit on the current page, output it there. ! 299: '\" 2. if the block won't fit on any page, and we have used less than ! 300: '\" half of the current page, then output the block on the ! 301: '\" current page. ! 302: '\" 3. skip to the next page. ! 303: . br \" get last partial line ! 304: . di \" end diversion ! 305: '\" The following if condition tests: (1) if the block is too large to ! 306: '\" fit on the current page and either (2) it will fit on an unused page ! 307: '\" or (3) we have already used more than half of the current page. (the ! 308: '\" three conditions are grouped in the form 1 & (2 : 3)). If this ! 309: '\" total condition is true, then a page is ejected and the block output ! 310: '\" on the next page. ! 311: '\" :0 store for initally diverted text ! 312: '\" :d prevent )h from outputting a floating group ! 313: '\" :m initial footer place and partial footnote diverter trap ! 314: '\" :o footer trap location ! 315: '\" :r position at end of page header macro ! 316: '\" :y flag indicating group/float in progress ! 317: '\" ;L remembered line spacing TEMP ! 318: '\" ;i remembered indent TEMP ! 319: '\" ;q remembered fill/no-fill mode TEMP ! 320: . nr :d 1 \" prevent )h from outputting a floating group ! 321: . if (\n(dn>=\n(.t)&((\n(dn<(\n(.p-\n(:r-\n(:m)):\ ! 322: (\n(nl>(\n(.p-\n(:r-\n(:o/2u+\n(:r)))\ ! 323: . ne \n(.tu+1v \" spring the trap ! 324: . nr ;q \n(.u \" save prevailing fill/no-fill mode ! 325: . nf \" bring it back in no-fill ! 326: . nr ;L \n(.L \" save line spacing ! 327: . ls 1 \" output display in ls 1 ! 328: . nr ;i \n(.i \" save prevailing indent ! 329: . in 0 \" indent back ! 330: . rs \" restore spacing ! 331: . :0 \" text ! 332: . nr :d 0 \" allow )h to output a floating group ! 333: . if \n(;q .fi \" restore fill if necessary ! 334: . ls \n(;L \" restore line spacing ! 335: . in \n(;iu \" restore prevailing indent ! 336: . nr :y 0 \" reset flag indicating group ! 337: . rr ;L ;i ;q \" free storage ! 338: . rm :0 ! 339: ]) ! 340: ! 341: |attribute(around; stack, default off; ! 342: on [ ! 343: '\" float mechanism ! 344: '\" :0 store for initally diverted text ! 345: '\" :y flag indicating group/float in progress ! 346: '\" Wn page width for column n ! 347: '\" ;L prevailing line spacing ! 348: '\" ;f prevailing font ! 349: '\" ;i prevailing indent ! 350: '\" ;j prevailing adjust ! 351: '\" ;l prevailing line length ! 352: '\" ;s prevailing point size ! 353: '\" ;u prevailing fill/no-fill mode ! 354: '\" ;v prevailing vertical spacing ! 355: . if \n(:y .tm "__FILE__":__LINE__: Here's and/or Around's can not be nested ! 356: . nr :y 1 \" set flag indicating group ! 357: . nr ;s \n(.s \" save prevailing point size ! 358: . nr ;f \n(.f \" save prevailing font ! 359: . nr ;u \n(.u \" save prevailing fill/no-fill mode ! 360: . nr ;j \n(.j \" save prevailing adjust ! 361: . nr ;v \n(.v \" save prevailing vertical spacing ! 362: . nr ;L \n(.L \" save prevailing line spacing ! 363: . nr ;l \n(.l \" save prevailing line length ! 364: . nr ;i \n(.i \" save prevailing indent ! 365: . ev 1 \" use footnote environment ! 366: . ps \n(;s \" restore point size ! 367: . vs \n(;sp+2p \" restore vertical spacing ! 368: . ft \n(;f \" restore font ! 369: . nf \" bring it back in no-fill ! 370: . if \n(;u .fi \" restore fill if necessary ! 371: . ad \n(;j \" restore page adjust ! 372: . vs \n(;vu \" restore vertical spacing ! 373: . ls \n(;L \" restore line spacing ! 374: . ll \n(;lu \" restore line length ! 375: . in \n(;iu \" restore indent ! 376: . ti \n(;iu \" restore indentation ! 377: . hy 14 \" turn on hyphenation ! 378: . lt \n(;lu \" restore title length ! 379: |ifvalue around_width full [ ! 380: . if \n(column_counter \{\ ! 381: . ll \n(W0u \" go wide ! 382: . lt \n(W0u \} ! 383: ] ! 384: . di :0 \" collect in :0 ! 385: ] off [ ! 386: '\" Control page orientation of floats. ! 387: '\" Floats are output as soon after their definition as ! 388: '\" feasible. The following rules are used: ! 389: '\" 1. if the queue contains only this float and it will fit on the ! 390: '\" current page, output it there. ! 391: '\" 2. if the queue contains only this float and it won't fit on any ! 392: '\" page, and we have used less than half of the current page, ! 393: '\" then output the float on the current page. ! 394: '\" 3. let the top of page macro handle it. ! 395: '\" !{a-z} width of stored floating 0=narrow, 1=wide ! 396: '\" :0 store for initally diverted text ! 397: '\" :m initial footer place and partial footnote diverter trap ! 398: '\" :o footer trap location ! 399: '\" :r position at end of page header macro ! 400: '\" :w output counter for floating keeps ! 401: '\" :y flag indicating group/float in progress ! 402: '\" :z input counter for floating keeps ! 403: '\" ?{a-z} text of stored floating ! 404: '\" W current page width ! 405: '\" |{a-z} size of stored floating ! 406: '\" ;L prevailing line spacing ! 407: '\" ;f prevailing font ! 408: '\" ;i prevailing indent ! 409: '\" ;j prevailing adjust ! 410: '\" ;l prevailing line length ! 411: '\" ;s prevailing point size ! 412: '\" ;u prevailing fill/no-fill mode ! 413: '\" ;v prevailing vertical spacing ! 414: '\" ;w convert to alpha format ! 415: . br \" get last partial line ! 416: . di \" end diversion of around block ! 417: |ifvalue around_width full [ ! 418: . if \n(column_counter \{\ ! 419: . ll \nWu \" go narrow ! 420: . lt \nWu \} ! 421: ] ! 422: . ev \" back to previous environment ! 423: . nr :z \n(:z%26+1 \" get index of next output element ! 424: . if \n(:z-\n(:w=0 .tm "__FILE__":__LINE__: too many floating displays ! 425: . af ;w a \" conversion register for display queue names ! 426: . nr ;w \n(:z \" form the next queue element name ! 427: . rn :0 ?\n(;w \" put the display into the queue ! 428: . nr !\n(;w 0 \" narrow ! 429: |ifvalue around_width full [ ! 430: . nr !\n(;w 1 \" wide around ! 431: ] ! 432: |ifnotvalue around_width full [ ! 433: . if !\n(column_counter .nr !\n(;w 1 \" wide around if only one column ! 434: ] ! 435: . nr |\n(;w \n(dn \" put the size of text ! 436: '\" The following if condition tests: (1) if there is only one float ! 437: '\" on the queue to output and (2) if wide displays and (3) we are on the ! 438: '\" first column and (4) if the float fits on the current page or ! 439: '\" (5) the float is too large to fit on any one page, and (6) we have used ! 440: '\" less than half of the current page. (the six conditions are grouped ! 441: '\" in the form (1 & (2 & 3) & (4 : (5 & 6))). If this total condition is true, ! 442: '\" then a float is output. ! 443: . if (((\n(:z-\n(:w=1):(\n(:z+26-\n(:w=1))&((\n(!\n(;w=1)&(\n(column_counter<2))&\ ! 444: ((\n(dn<\n(.t):((\n(dn>(\n(.p-\n(:r-\n(:m))&\ ! 445: (\n(nl<=(\n(.p-\n(:r-\n(:o/2u+\n(:r))))) .)z ! 446: . nr :y 0 \" reset flag indicating group ! 447: . rr ;L ;f ;i ;j ;l ;s ;u ;v ;w \" free storage ! 448: ]) ! 449: ! 450: |attribute(around_placement; nostack; ! 451: [ ! 452: . )w ! 453: ]) ! 454: ! 455: |attribute(footnote; stack, default off; ! 456: on [ ! 457: '\" :F Footnote text ! 458: '\" :q amount of footnote text ! 459: '\" :x flag indicating footnote in progress ! 460: '\" Wn page width for column n ! 461: '\" ;L prevailing line spacing ! 462: '\" ;f prevailing font ! 463: '\" ;j prevailing adjust ! 464: '\" ;l prevailing line length ! 465: '\" ;o prevailing page offset ??????? bug with .po ! 466: '\" ;s prevailing point size ! 467: '\" ;u prevailing fill/no-fill mode ! 468: '\" ;v prevailing vertical spacing ! 469: . if \n(:x .tm "__FILE__":__LINE__: Footnotes can not be nested ! 470: . nr :x 1 \" set flag indicating footnote ! 471: . nr ;s \n(.s \" save prevailing point size ! 472: . nr ;f \n(.f \" save prevailing font ! 473: . nr ;u \n(.u \" save prevailing fill/no-fill mode ! 474: . nr ;j \n(.j \" save prevailing adjust ! 475: . nr ;v \n(.v \" save prevailing vertical spacing ! 476: . nr ;L \n(.L \" save prevailing line spacing ! 477: . nr ;l \n(.l \" save prevailing line length ! 478: . ev 1 \" use footnote environment ! 479: . ps \n(;s \" restore point size ! 480: . vs \n(;sp+2p \" restore vertical spacing ! 481: . ft \n(;f \" restore font ! 482: . nf \" bring it back in no-fill ! 483: . if \n(;u .fi \" restore fill if necessary ! 484: . ad \n(;j \" restore page adjust ! 485: . vs \n(;vu \" restore vertical spacing ! 486: . ls \n(;L \" restore line spacing ! 487: . ll \n(;lu \" restore line length ! 488: . in 0 \" reset indent ! 489: . ti 0 \" reset indentation ! 490: . hy 14 \" turn on hyphenation ! 491: . lt \n(;lu \" restore title length ! 492: |ifvalue footnote_width full [ ! 493: . if \n(column_counter \{\ ! 494: . ll \n(W0u \" go wide ! 495: . lt \n(W0u \} ! 496: ] ! 497: . da :F \" collect in :F ! 498: . ie !\n(:q \{\ ! 499: . nr ;o \n(.o \" save prevailing page offset ! 500: . po 0 \" always from left margin ! 501: . ps 10 \" 10 point roman font ! 502: . vs 12p ! 503: . ft 1 ! 504: . ie \n(.A=0 \l'72p' \" layout partial rule if new footnote ! 505: . el __________ ! 506: . ft \" restore values ! 507: . vs ! 508: . ps ! 509: . po \n(;ou \} ! 510: . el .sp 1 \" leave a blank between them ! 511: ] off [ ! 512: '\" :V vertical spacing ! 513: '\" :m initial footer place and partial footnote diverter trap ! 514: '\" :o footer trap location ! 515: '\" :q amount of footnote text ! 516: '\" :v width of stored footnote 0=narrow, 1=wide ! 517: '\" :x flag indicating footnote in progress ! 518: '\" W current page width ! 519: '\" ;L prevailing line spacing ! 520: '\" ;f prevailing font ! 521: '\" ;j prevailing adjust ! 522: '\" ;l prevailing line length ! 523: '\" ;o prevailing page offset ??????? bug with .po ! 524: '\" ;s prevailing point size ! 525: '\" ;u prevailing fill/no-fill mode ! 526: '\" ;v prevailing vertical spacing ! 527: . br \" get last partial line ! 528: . da \" end diversion ! 529: |ifvalue footnote_width full [ ! 530: . if \n(column_counter \{\ ! 531: . ll \nWu \" go narrow ! 532: . lt \nWu \} ! 533: . nr :v 1 \" wide footnote ! 534: ] ! 535: |ifnotvalue footnote_width full [ ! 536: . if !\n(column_counter .nr :v 1 \" wide footnote if only one column ! 537: ] ! 538: . ev \" go back to previous environment ! 539: . nr :x 0 \" clear flag indicating footnote ! 540: . if !\n(:o-\n(:m \{\ ! 541: . nr :o +\n(:Vu-1u \" traps spring once we go past ! 542: . nr dn +\n(:V-\n(.v \} \" uncertainty correction ! 543: . nr :q +\n(dnu \" add in amount of new footnotes ! 544: '\" Move up footer trap, but not above current position on page ! 545: . nr :o +\n(dnu ! 546: . if !\n(.pu-\n(nlu-.5p-\n(:ou .nr :o \n(.pu-\n(nlu-.5p ! 547: '\" or below :m! ! 548: . if !\n(:ou-\n(:mu .nr :o \n(:mu ! 549: '\" or at all if in multi-column mode and the footnote is wide ! 550: . if \n(column_counter>1&\n(:v .nr :o \n(:mu ! 551: . ch )f -\n(:ou \" move footer trap ! 552: . rr ;L ;f ;j ;l ;o ;s ;u ;v \" free storage ! 553: ]) ! 554: ! 555: |attribute(size; stack, default 10; ! 556: $ [|ifvalue inline on [\s$\&]|ifvalue inline off [ ! 557: . ps $ ! 558: ]]) ! 559: ! 560: |attribute(space; stack, init 12; ! 561: $ [ ! 562: . vs $ ! 563: ]) ! 564: ! 565: |attribute(SPACE; nostack; ! 566: [ ! 567: . vs \n(.sp+2p \" restore vertical spacing ! 568: ]) ! 569: ! 570: |attribute(font; stack, default roman; ! 571: roman [|ifvalue inline on [\&\f1\&]|ifvalue inline off [ ! 572: . ft 1 ! 573: ]] italics [|ifvalue inline on [\&\f2\&]|ifvalue inline off [ ! 574: . ft 2 ! 575: ]] bold [|ifvalue inline on [\&\f3\&]|ifvalue inline off [ ! 576: . ft 3 ! 577: ]] bolditalics [|ifvalue inline on [\&\f4\&]|ifvalue inline off [ ! 578: . ft 4 ! 579: ]] cw [|ifvalue inline on [\&\f(CW\&]|ifvalue inline off [ ! 580: . ft CW ! 581: ]]) ! 582: ! 583: |attribute(font.family; stack, default times; ! 584: times [ ! 585: . fp 1 R ! 586: . fp 2 I ! 587: . fp 3 B ! 588: . fp 4 BI ! 589: ] palatino [ ! 590: . fp 1 PA ! 591: . fp 2 PI ! 592: . fp 3 PB ! 593: . fp 4 PX ! 594: ] bembo [ ! 595: . fp 1 B1 ! 596: . fp 2 B2 ! 597: . fp 3 B3 ! 598: . fp 4 B4 ! 599: ] optima [ ! 600: . fp 1 O1 ! 601: . fp 2 O2 ! 602: . fp 3 O3 ! 603: . fp 4 O4 ! 604: ] souvenir [ ! 605: . fp 1 SV ! 606: . fp 2 SI ! 607: . fp 3 SB ! 608: . fp 4 SX ! 609: ] helvetica [ ! 610: . fp 1 H ! 611: . fp 2 HI ! 612: . fp 3 HB ! 613: . fp 4 HX ! 614: ] cw [ ! 615: . fp 1 CW ! 616: . fp 2 I ! 617: . fp 3 B ! 618: . fp 4 BI ! 619: ] gothic [ ! 620: . fp 1 C ! 621: . fp 2 CX ! 622: . fp 3 TB ! 623: . fp 4 TX ! 624: ] condensed [ ! 625: . fp 1 Hcond ! 626: . fp 2 HcondI ! 627: . fp 3 HcondB ! 628: . fp 4 HlightI ! 629: ] narrow [ ! 630: . fp 1 Hr ! 631: . fp 2 Hi ! 632: . fp 3 Hb ! 633: . fp 4 Hx ! 634: ]) ! 635: ! 636: |attribute(if; nostack; ! 637: $test [ ! 638: . if $test \ ! 639: ] begin $test [ ! 640: . if $test \{\ ! 641: ] end [\}\c ! 642: ] else $test [ ! 643: . ie $test \ ! 644: ] else begin $test [ ! 645: . ie $test \{\ ! 646: ] else [ ! 647: . el \ ! 648: ] else begin [ ! 649: . el \{\ ! 650: ]) ! 651: ! 652: |attribute(tab; nostack; ! 653: [\& ]) ! 654: ! 655: |attribute(leader; nostack; ! 656: [\&&]) ! 657: ! 658: |attribute(thick.line; nostack; ! 659: $ [ ! 660: . ps 24 ! 661: \l'$' ! 662: . ps ! 663: ] [ ! 664: . ps 24 ! 665: \l'\n(.lu' ! 666: . ps ! 667: ]) ! 668: ! 669: |attribute(line; nostack; ! 670: $ [\l'$'] ! 671: [\l'\n(.lu']) ! 672: ! 673: |attribute(box; nostack; ! 674: x [\s12\o'\(mu\(sq'\s0] ! 675: empty [\s12\(sq\s0] ! 676: [\(sq]) ! 677: ! 678: |attribute(underline; stack, default off; ! 679: on [\kx] ! 680: off [\l'|\nxu\(ul']) ! 681: ! 682: |attribute(hyphenate; stack, init on; ! 683: on [ ! 684: . hy 14 ! 685: ] off [ ! 686: . nh ! 687: ]) ! 688: ! 689: |attribute(case; stack, init any; ! 690: upper [ ! 691: '\" need to write this yet ! 692: ] lower [ ! 693: '\" need to write this yet ! 694: ] capitalize [ ! 695: '\" need to write this yet ! 696: ] any [ ! 697: '\" need to write this yet ! 698: ]) ! 699: ! 700: |attribute(tab.stops; nostack; ! 701: $* [ ! 702: . ta $* ! 703: ] [ ! 704: . ta .5i 1.0i 1.5i 2.0i 2.5i 3.0i 3.5i 4.0i 4.5i 5.0i 5.5i 6.0i 6.5i 7.0i 7.5i ! 705: ]) ! 706: ! 707: |attribute(set; nostack; ! 708: $* $number [ ! 709: |for i in $* { ! 710: . nr $i $number ! 711: }] string $* $string [ ! 712: |for i in $* { ! 713: . ds $i $string ! 714: }]) ! 715: ! 716: |attribute(store; nostack; ! 717: $* $$. [ ! 718: |for i in $* { ! 719: . nr $i \n$$. ! 720: }] $* $number.register [ ! 721: |for i in $* { ! 722: . nr $i \n($number.register ! 723: }] string $* $$. [ ! 724: |for i in $* { ! 725: . ds $i \*$$. ! 726: }] string $* $string.register [ ! 727: |for i in $* { ! 728: . ds $i \*($string.register ! 729: }] number.from.string $* $$. [ ! 730: |for i in $* { ! 731: . nr $i \*$$. ! 732: }] number.from.string $* $string.register [ ! 733: |for i in $* { ! 734: . nr $i \*($string.register ! 735: }] string.from.number $* $$. [ ! 736: |for i in $* { ! 737: . ds $i \n$$. ! 738: }] string.from.number $* $number.register [ ! 739: |for i in $* { ! 740: . ds $i \n($number.register ! 741: }] width $* $$. [ ! 742: |for i in $* { ! 743: . nr $i \w'\*$$.' ! 744: }] width $* $number.register [ ! 745: |for i in $* { ! 746: . nr $i \w'\*($number.register' ! 747: }] indent $* [ ! 748: |for i in $* { ! 749: . nr $i \n(.i ! 750: }] linelength $* [ ! 751: |for i in $* { ! 752: . nr $i \n(.l ! 753: }] pagewidth $* [ ! 754: |for i in $* { ! 755: . nr $i \nWu ! 756: }] totrap $* [ ! 757: |for i in $* { ! 758: . nr $i \n(.t ! 759: }] pageoffset $* [ ! 760: |for i in $* { ! 761: . nr $i \n(.o ! 762: }] diversionheight $* [ ! 763: |for i in $* { ! 764: . nr $i \n(dn ! 765: }]) ! 766: ! 767: |attribute(clear; nostack; ! 768: $* [ ! 769: |for i in $* { ! 770: . nr $i 0 ! 771: }] string $* [ ! 772: . rm $* ! 773: ]) ! 774: ! 775: |attribute(rename; nostack; ! 776: $from $to [ ! 777: . rn $from $to ! 778: ]) ! 779: ! 780: |attribute(add; nostack; ! 781: $result $$. $* [ ! 782: . nr $result \n$$. ! 783: |for i in $* { ! 784: . nr $result +\n($i ! 785: }] $result $operand $* [ ! 786: . nr $result \n($operand ! 787: |for i in $* { ! 788: . nr $result +\n($i ! 789: }] $result $$. [ ! 790: . nr $result +\n$$. ! 791: ] $result $operand [ ! 792: . nr $result +\n($operand ! 793: ] constant $result $constant $* [ ! 794: . nr $result $constant ! 795: |for i in $* { ! 796: . nr $result +$i ! 797: }] constant $result $constant [ ! 798: . nr $result +$constant ! 799: ] string $string $text [ ! 800: . as $string $text ! 801: ] string.from.number $string $$. [ ! 802: . as $string \n$$. ! 803: ] string.from.number $string $number.register [ ! 804: . as $string \n($number.register ! 805: ] string.from.string $string $$. [ ! 806: . as $string \*$$. ! 807: ] string.from.string $string $string.register [ ! 808: . as $string \*($string.register ! 809: ]) ! 810: ! 811: |attribute(sub; nostack; ! 812: $result $$. $* [ ! 813: . nr $result \n$$. ! 814: |for i in $* { ! 815: . nr $result -\n($i ! 816: }] $result $operand $* [ ! 817: . nr $result \n($operand ! 818: |for i in $* { ! 819: . nr $result -\n($i ! 820: }] $result $$. [ ! 821: . nr $result -\n$$. ! 822: ] $result $operand [ ! 823: . nr $result -\n($operand ! 824: ] constant $result $constant $* [ ! 825: . nr $result $constant ! 826: |for i in $* { ! 827: . nr $result -$i ! 828: }] constant $result $constant [ ! 829: . nr $result -$constant ! 830: ]) ! 831: ! 832: |attribute(incr; nostack; ! 833: $* [ ! 834: |for i in $* { ! 835: . nr $i +1 ! 836: }]) ! 837: ! 838: |attribute(decr; nostack; ! 839: $* [ ! 840: |for i in $* { ! 841: . nr $i -1 ! 842: }]) ! 843: ! 844: |attribute(protect; nostack; ! 845: $ [ ! 846: . ne $ ! 847: ] [ ! 848: . ne 3 ! 849: ]) ! 850: ! 851: |attribute(warn.orphan; nostack; ! 852: $ [ ! 853: '\" need to write this yet ! 854: ] [ ! 855: '\" need to write this yet ! 856: ]) ! 857: ! 858: |attribute(column; nostack; ! 859: $column $width $offset [ ! 860: '\" :c number of columns ! 861: '\" On page offset for column n ! 862: '\" Wn page width for column n ! 863: . if \n(:c<$column .nr :c $column ! 864: . nr W$column $width ! 865: . nr O$column $offset ! 866: ] width $width [ ! 867: '\" :c number of columns ! 868: '\" Wn page width for column n ! 869: . nr W\n(:c $width ! 870: ] offset $offset [ ! 871: '\" :c number of columns ! 872: '\" On page offset for column n ! 873: . nr O\n(:c $offset ! 874: ] next [ ! 875: '\" :c number of columns ! 876: . nr :c +1 ! 877: ] clear [ ! 878: '\" :c number of columns ! 879: . rr :c ! 880: ] new [ ! 881: . ie !\n(column_counter .tm "__FILE__":__LINE__: not in multi-column mode ! 882: . el \{\ ! 883: . br \" force out last partial line ! 884: . ne \n(.tu+1v \} \" spring footer trap for this column ! 885: ] new $ [ ! 886: '\" O current page offset ! 887: '\" On page offset for column n ! 888: '\" W current page width ! 889: '\" Wn page width for column n ! 890: '\" ;d delta width TEMP ! 891: . ie !\n(column_counter .tm "__FILE__":__LINE__: not in multi-column mode ! 892: . el \{\ ! 893: . br \" force out last partial line ! 894: . ne \n(.tu+1v \" spring footer trap for this column ! 895: . nr ;d \n(.lu-\n(W\n(column_counter+Q+-Q-u \" quotations shrink line length ! 896: . nr column_counter $ \" set column to $ ! 897: . nr O \n(O$u \" restore new offset ! 898: . po \nOu \" set new offset ! 899: . nr W \n(W$u+\n(;du \" restore new width ! 900: . ll \nWu \" set new line length ! 901: . lt \nWu \" set new title length ! 902: . rr ;d \} \" free storage ! 903: ] old $ [ ! 904: '\" O current page offset ! 905: '\" On page offset for column n ! 906: '\" Un position to return to for column n ! 907: '\" W current page width ! 908: '\" Wn page width for column n ! 909: '\" ;d delta width TEMP ! 910: . ie !\n(column_counter .tm "__FILE__":__LINE__: not in multi-column mode ! 911: . el \{\ ! 912: . br \" force out last partial line ! 913: . if \n(nl>\n(U\n(column_counter \ ! 914: . mk U\n(column_counter \" new vertical position ! 915: . nr ;d \n(.lu-\n(W\n(column_counter+Q+-Q-u \" quotations shrink line length ! 916: . nr column_counter $ \" set column to $ ! 917: . nr O \n(O$u \" restore new offset ! 918: . po \nOu \" set new offset ! 919: . nr W \n(W$u+\n(;du \" restore new width ! 920: . ll \nWu \" set new line length ! 921: . lt \nWu \" set new title length ! 922: . rs \" restore spacing ! 923: . ie \n(U$ .sp |\n(U$u \" restore vertical position ! 924: . el .sp |\n(U0u \" default top if not set ! 925: . ns \" turn off spacing ! 926: . rr ;d \} \" free storage ! 927: ] on [ ! 928: '\" O current page offset ! 929: '\" On page offset for column n ! 930: '\" Un position to return to for column n ! 931: '\" W current page width ! 932: '\" Wn page width for column n ! 933: . ie \n(column_counter .tm "__FILE__":__LINE__: already in multi-column mode ! 934: . el \{\ ! 935: . br \" force out last partial line ! 936: . nr column_counter 1 \" flag for multi-column mode, first column ! 937: . nr W \n(W1u \" restore first column width ! 938: . ll \nWu \" set first column line length ! 939: . lt \nWu \" set first column title length ! 940: . nr O \n(O1u \" restore first column offset ! 941: . po \nOu \" set first column offset ! 942: . mk U0 \" set where all columns start ! 943: . ns \" avoid .sp in user text here ! 944: . rr U1 U2 U3 U4 U5 U6 U7 U8 U9 \" zero column starts ! 945: . rr ;d \} \" free storage ! 946: ] off [ ! 947: '\" :c number of columns ! 948: '\" Un position to return to for column n ! 949: '\" W current page width ! 950: '\" Wn page width for column n ! 951: '\" ;d delta width TEMP ! 952: . ie !\n(column_counter .tm "__FILE__":__LINE__: already in full page mode ! 953: . el \{\ ! 954: . br \" force out last partial line ! 955: . if \n(nl>\n(U\n(column_counter \ ! 956: . mk U\n(column_counter \" new vertical position ! 957: . nr ;d \n(.lu-\n(W\n(column_counter+Q+-Q-u \" quotations shrink line length ! 958: . nr column_counter 0 \" set flag for full page mode ! 959: . nr O \n(O0u \" restore new offset ! 960: . po \nOu \" set new offset ! 961: . nr W \n(W0u+\n(;du \" restore line length ! 962: . ll \nWu \" set new line length ! 963: . lt \nWu \" set new title length ! 964: . rs \" restore spacing ! 965: . sp |\n(U0u \" restore vertical position ! 966: . if \n(nl<\n(U1 \ ! 967: . sp |\n(U1u ! 968: . if \n(nl<\n(U2 \ ! 969: . sp |\n(U2u ! 970: . if \n(nl<\n(U3 \ ! 971: . sp |\n(U3u ! 972: . if \n(nl<\n(U4 \ ! 973: . sp |\n(U4u ! 974: . if \n(nl<\n(U5 \ ! 975: . sp |\n(U5u ! 976: . if \n(nl<\n(U6 \ ! 977: . sp |\n(U6u ! 978: . if \n(nl<\n(U7 \ ! 979: . sp |\n(U7u ! 980: . if \n(nl<\n(U8 \ ! 981: . sp |\n(U8u ! 982: . if \n(nl<\n(U9 \ ! 983: . sp |\n(U9u ! 984: . ti \n(.iu \" movement resets indentation ! 985: . rr U1 U2 U3 U4 U5 U6 U7 U8 U9 \" zero column starts ! 986: . ns \" turn off spacing ! 987: . rr ;d \} \" free storage ! 988: ] 2 [ ! 989: '\" :c number of columns ! 990: '\" O current page offset ! 991: '\" On page offset for column n ! 992: '\" Un position to return to for column n ! 993: '\" W current page width ! 994: '\" Wn page width for column n ! 995: . ie \n(column_counter .tm "__FILE__":__LINE__: already in multi-column mode ! 996: . el \{\ ! 997: . br \" force out last partial line ! 998: . nr column_counter 1 \" flag for multi-column mode, first column ! 999: . nr W0 \nW \" save width ! 1000: . nr W \n(.lu*8u/17u \" new width ! 1001: . nr W1 \nW \" new width ! 1002: . nr W2 \nW \" new width ! 1003: . nr O0 \n(.ou \" page offset for other column ! 1004: . nr O1 \n(.ou \" page offset for other column ! 1005: . nr O2 \n(.lu*9u/17u+\n(.ou \" page offset for other column ! 1006: . ll \nWu \" set new line length ! 1007: . lt \nWu \" set new title length ! 1008: . nr :c 2 \" two columns ! 1009: . mk U0 \" set where all columns start ! 1010: . ns \" turn off spacing ! 1011: . rr U1 U2 \} \" zero column starts ! 1012: ]) ! 1013: ! 1014: |attribute(divert.string; stack, default off; ! 1015: $string.name [ ! 1016: . ds $string.name ] ! 1017: off [ ! 1018: ]) ! 1019: ! 1020: |attribute(divert.number; stack, default off; ! 1021: $number.name [ ! 1022: . nr $number.name ] ! 1023: off [ ! 1024: ]) ! 1025: ! 1026: |attribute(divert.output; stack, default off; ! 1027: on $string.name [ ! 1028: '\" ;L prevailing line spacing ! 1029: '\" ;f prevailing font ! 1030: '\" ;j prevailing adjust ! 1031: '\" ;l prevailing line length ! 1032: '\" ;o prevailing page offset ??????? bug with .po ! 1033: '\" ;s prevailing point size ! 1034: '\" ;u prevailing fill/no-fill mode ! 1035: '\" ;v prevailing vertical spacing ! 1036: . nr ;s \n(.s \" save prevailing point size ! 1037: . nr ;f \n(.f \" save prevailing font ! 1038: . nr ;u \n(.u \" save prevailing fill/no-fill mode ! 1039: . nr ;j \n(.j \" save prevailing adjust ! 1040: . nr ;v \n(.v \" save prevailing vertical spacing ! 1041: . nr ;L \n(.L \" save prevailing line spacing ! 1042: . nr ;l \n(.l \" save prevailing line length ! 1043: . ev 1 \" use footnote environment ! 1044: . ps \n(;s \" restore point size ! 1045: . vs \n(;sp+2p \" restore vertical spacing ! 1046: . ft \n(;f \" restore font ! 1047: . nf \" bring it back in no-fill ! 1048: . if \n(;u .fi \" restore fill if necessary ! 1049: . ad \n(;j \" restore page adjust ! 1050: . vs \n(;vu \" restore vertical spacing ! 1051: . ls \n(;L \" restore line spacing ! 1052: . ll \n(;lu \" restore line length ! 1053: . in 0 \" reset indent ! 1054: . ti 0 \" reset indentation ! 1055: . hy 14 \" turn on hyphenation ! 1056: . lt \n(;lu \" restore title length ! 1057: . di $string.name \" collect in $string.name ! 1058: ] off [ ! 1059: '\" ;L prevailing line spacing ! 1060: '\" ;f prevailing font ! 1061: '\" ;j prevailing adjust ! 1062: '\" ;l prevailing line length ! 1063: '\" ;o prevailing page offset ??????? bug with .po ! 1064: '\" ;s prevailing point size ! 1065: '\" ;u prevailing fill/no-fill mode ! 1066: '\" ;v prevailing vertical spacing ! 1067: . br \" get last partial line ! 1068: . di \" end diversion ! 1069: . ev \" go back to previous environment ! 1070: . rr ;L ;f ;j ;l ;o ;s ;u ;v \" free storage ! 1071: ]) ! 1072: ! 1073: |attribute(divert.input; stack, default off; ! 1074: on $string.name [ ! 1075: . eo ! 1076: . de $string.name\(ts\(ts ! 1077: ] off [ ! 1078: .\(ts\(ts ! 1079: . ec ! 1080: ]) ! 1081: ! 1082: |attribute(append.output; stack, default off; ! 1083: on $string.name [ ! 1084: '\" ;L prevailing line spacing ! 1085: '\" ;f prevailing font ! 1086: '\" ;j prevailing adjust ! 1087: '\" ;l prevailing line length ! 1088: '\" ;o prevailing page offset ??????? bug with .po ! 1089: '\" ;s prevailing point size ! 1090: '\" ;u prevailing fill/no-fill mode ! 1091: '\" ;v prevailing vertical spacing ! 1092: . nr ;s \n(.s \" save prevailing point size ! 1093: . nr ;f \n(.f \" save prevailing font ! 1094: . nr ;u \n(.u \" save prevailing fill/no-fill mode ! 1095: . nr ;j \n(.j \" save prevailing adjust ! 1096: . nr ;v \n(.v \" save prevailing vertical spacing ! 1097: . nr ;L \n(.L \" save prevailing line spacing ! 1098: . nr ;l \n(.l \" save prevailing line length ! 1099: . ev 1 \" use footnote environment ! 1100: . ps \n(;s \" restore point size ! 1101: . vs \n(;sp+2p \" restore vertical spacing ! 1102: . ft \n(;f \" restore font ! 1103: . nf \" bring it back in no-fill ! 1104: . if \n(;u .fi \" restore fill if necessary ! 1105: . ad \n(;j \" restore page adjust ! 1106: . vs \n(;vu \" restore vertical spacing ! 1107: . ls \n(;L \" restore line spacing ! 1108: . ll \n(;lu \" restore line length ! 1109: . in 0 \" reset indent ! 1110: . ti 0 \" reset indentation ! 1111: . hy 14 \" turn on hyphenation ! 1112: . lt \n(;lu \" restore title length ! 1113: . da $string.name \" collect in $string.name ! 1114: ] off [ ! 1115: '\" ;L prevailing line spacing ! 1116: '\" ;f prevailing font ! 1117: '\" ;j prevailing adjust ! 1118: '\" ;l prevailing line length ! 1119: '\" ;o prevailing page offset ??????? bug with .po ! 1120: '\" ;s prevailing point size ! 1121: '\" ;u prevailing fill/no-fill mode ! 1122: '\" ;v prevailing vertical spacing ! 1123: . br \" get last partial line ! 1124: . da \" end diversion ! 1125: . ev \" go back to previous environment ! 1126: . rr ;L ;f ;j ;l ;o ;s ;u ;v \" free storage ! 1127: ]) ! 1128: ! 1129: |attribute(append.input; stack, default off; ! 1130: on $string.name [ ! 1131: . eo ! 1132: . am $string.name\(ts\(ts ! 1133: ] off [ ! 1134: .\(ts\(ts ! 1135: . ec ! 1136: ]) ! 1137: ! 1138: |attribute(invoke; nostack; ! 1139: on $offset $what [ ! 1140: . wh 15i $what \" activate the trap ! 1141: . ch $what \n(nlu+$offset \" move it in place ! 1142: ] on number $$. $what [ ! 1143: . wh 15i $what \" activate the trap ! 1144: . ch $what \n(nlu+\n$$.u \" move it in place ! 1145: ] on number $number.register $what [ ! 1146: . wh 15i $what \" activate the trap ! 1147: . ch $what \(nlu+\n($number.registeru \" move it in place ! 1148: ] at constant $constant $what [ ! 1149: . wh 15i $what \" activate the trap ! 1150: . ch $what $constant \" move it in place ! 1151: ] at number $$. $what [ ! 1152: . wh 15i $what \" activate the trap ! 1153: . ch $what \n$$.u \" move it in place ! 1154: ] at number $number.register $what [ ! 1155: . wh 15i $what \" activate the trap ! 1156: . ch $what \n($number.registeru \" move it in place ! 1157: ] end [ ! 1158: . br \" get last partial line ! 1159: . di \" turn off diversions ! 1160: ] off $what [ ! 1161: . ch $what \" remove the trap ! 1162: ]) ! 1163: ! 1164: |attribute(remember; nostack; ! 1165: $ [ ! 1166: . mk $ ! 1167: ]) ! 1168: ! 1169: |attribute(return; nostack; ! 1170: $$. [ ! 1171: . sp |\n$$.u ! 1172: . ti \n(.iu \" movement resets indentation ! 1173: ] $ [ ! 1174: . sp |\n($u ! 1175: . ti \n(.iu \" movement resets indentation ! 1176: ]) ! 1177: ! 1178: |attribute(goto; nostack; ! 1179: $ [ ! 1180: . sp |$ ! 1181: . ti \n(.iu \" movement resets indentation ! 1182: ]) ! 1183: ! 1184: |attribute(string; nostack; ! 1185: $$. [\*$$.] ! 1186: $string.register [\*($string.register] ! 1187: roman $$. [\f1\&\*$$.\fP\&] ! 1188: italics $$. [\f2\&\*$$.\fP\&] ! 1189: bold $$. [\f3\&\*$$.\fP\&] ! 1190: bolditalics $$. [\f4\&\*$$.\fP\&] ! 1191: cw $$. [\f(CW\&\*$$.\fP\&] ! 1192: roman $string.register [\f1\&\*($string.register\fP\&] ! 1193: italics $string.register [\f2\&\*($string.register\fP\&] ! 1194: bold $string.register [\f3\&\*($string.register\fP\&] ! 1195: bolditalics $string.register [\f4\&\*($string.register\fP\&] ! 1196: cw $string.register [\f(CW\&\*($string.register\fP\&]) ! 1197: ! 1198: |attribute(macro; nostack; ! 1199: $ [ ! 1200: . $ ! 1201: ]) ! 1202: ! 1203: |attribute(number; nostack; ! 1204: $$. [\n$$.] ! 1205: $number.register [\n($number.register] ! 1206: ++ $$. [\n+$$.] ! 1207: ++ $number.register [\n+($number.register] ! 1208: format $* $format [ ! 1209: |for i in $* { ! 1210: . af $i $format ! 1211: }] ! 1212: incr $* $incr [ ! 1213: |for i in $* { ! 1214: . nr $i +0 $incr ! 1215: }] ! 1216: format.from.string $* $$. [ ! 1217: |for i in $* { ! 1218: . af $i \*$$. ! 1219: }] ! 1220: incr $* $incr [ ! 1221: |for i in $* { ! 1222: . nr $i +0 $incr ! 1223: }] ! 1224: format.from.string $* $format [ ! 1225: |for i in $* { ! 1226: . af $i \*($format ! 1227: }] ! 1228: incr $* $incr [ ! 1229: |for i in $* { ! 1230: . nr $i +0 $incr ! 1231: }]) ! 1232: ! 1233: |attribute(list.pre; stack, default; ! 1234: [ ! 1235: . rm premark_string ! 1236: ] ! 1237: $pre [ ! 1238: . ds premark_string $pre ! 1239: ]) ! 1240: ! 1241: |attribute(list.format; stack, default; ! 1242: [ ! 1243: . rm format_string ! 1244: ] ! 1245: $format [ ! 1246: . ds format_string $format ! 1247: ]) ! 1248: ! 1249: |attribute(list.post; stack, default; ! 1250: [ ! 1251: . rm postmark_string ! 1252: ] ! 1253: $post [ ! 1254: . ds postmark_string $post ! 1255: ]) ! 1256: ! 1257: |attribute(list.indent; stack, default; ! 1258: [ ! 1259: . rm indent_string ! 1260: ] ! 1261: $indent [ ! 1262: . ds indent_string $indent ! 1263: ]) ! 1264: ! 1265: |attribute(list; nostack; ! 1266: off [ ! 1267: '\" ;i remembered indent TEMP ! 1268: . )C ;i indentsave_string \*(indentsave_string ! 1269: . in \n(;iu ! 1270: . )C list_counter listsave_string \*(listsave_string ! 1271: . rm ;i ! 1272: ] on [ ! 1273: . ds indentsave_string \n(.i \*(indentsave_string ! 1274: . in +\w'\*(indent_string'u ! 1275: . af list_counter 0 ! 1276: . ds listsave_string \n(list_counter \*(listsave_string ! 1277: . nr list_counter 0 1 ! 1278: ]) ! 1279: ! 1280: |attribute(file.information; nostack; ! 1281: [ ! 1282: . lf __LINE__ __FILE__ ! 1283: ]) ! 1284: ! 1285: |attribute(reference.style; nostack; ! 1286: acm [|reference_style(acm) ! 1287: ] apa [|reference_style(apa) ! 1288: ] att [|reference_style(att) ! 1289: ] ieee [|reference_style(ieee) ! 1290: ] lsa [|reference_style(lsa) ! 1291: ] pami [|reference_style(pami) ! 1292: ] spectrum [|reference_style(spectrum) ! 1293: ]) ! 1294: ! 1295: |attribute(reference.option; nostack; ! 1296: tm [|reference_style(same tm) ! 1297: ] rp [|reference_style(same rp) ! 1298: ] nroff [|reference_style(same nroff) ! 1299: ] troff [|reference_style(same troff) ! 1300: ] sort [|reference_style(same sort) ! 1301: ] sequence [|reference_style(same sequence) ! 1302: ] a [|reference_style(same a) ! 1303: ] d [|reference_style(same d) ! 1304: ] t [|reference_style(same t) ! 1305: ] ad [|reference_style(same ad) ! 1306: ] at [|reference_style(same at) ! 1307: ] da [|reference_style(same da) ! 1308: ] dt [|reference_style(same dt) ! 1309: ] ta [|reference_style(same ta) ! 1310: ] td [|reference_style(same td) ! 1311: ] adt [|reference_style(same adt) ! 1312: ] atd [|reference_style(same atd) ! 1313: ] dat [|reference_style(same dat) ! 1314: ] dta [|reference_style(same dta) ! 1315: ] tad [|reference_style(same tad) ! 1316: ] tda [|reference_style(same tda) ! 1317: ]) ! 1318: ! 1319: |attribute(reference; stack, default off; ! 1320: database [|reference_database<] ! 1321: include [|reference_include<] ! 1322: list [|reference_list<] ! 1323: on [|reference<] ! 1324: off [>]) ! 1325: ! 1326: |attribute(reference.placement; nostack; ! 1327: [|reference_placement ! 1328: ]) ! 1329: ! 1330: |attribute(table; stack, default off; ! 1331: on [ ! 1332: . TS ! 1333: ] off [ ! 1334: . TE ! 1335: ]) ! 1336: ! 1337: |attribute(ipa; stack, default off; ! 1338: on [@ipa(] ! 1339: off [)]) ! 1340: ! 1341: |attribute(picture; stack, default off; ! 1342: on [ ! 1343: . PS ! 1344: ] off [ ! 1345: . PE ! 1346: ]) ! 1347: ! 1348: |attribute(ped; stack, default off; ! 1349: on [ ! 1350: . GS ! 1351: ] off[ ! 1352: . GE ! 1353: ]) ! 1354: ! 1355: |attribute(ideal; stack, default off; ! 1356: on [ ! 1357: . IS ! 1358: ] off[ ! 1359: . IE ! 1360: ]) ! 1361: ! 1362: |attribute(equation; stack, default off; ! 1363: on [ ! 1364: '\" :4 store for equations ! 1365: . br \" output partial line before equation ! 1366: . di :4 \" begin diversion ! 1367: . EQ \" begin equation ! 1368: ] off [ ! 1369: '\" :4 store for equations ! 1370: '\" :D amount of accumulate blank lines in diversion ! 1371: '\" :E position of last minimum space in diversion ! 1372: '\" :Y width of a center block diversion ! 1373: '\" 10 the equation as a string ! 1374: . EN \" end equation ! 1375: . br \" get last partial line ! 1376: . di \" end diversion of equation ! 1377: . rm :4 \" throw the equation away ! 1378: |ifvalue center.block on [ ! 1379: . if \w@\*(10\*(equation_string@ \{\ ! 1380: . if \n(:Y<\w@\*(10@ .nr :Y \w@\*(10@ \" update width ! 1381: \!\*(10\h'\\n(.lu-\w@\*(10\*(equation_string@u-\\n(.iu'\*(equation_string \" output next expansion ! 1382: . rr :D :E \}] \" pretend we've moved ! 1383: |ifvalue center on [ ! 1384: . if \w@\*(10\*(equation_string@ .tl \(ts\(ts\*(10\(ts\*(equation_string\(ts] ! 1385: |ifnotvalue center.block on [ |ifnotvalue center on [ ! 1386: . if \w@\*(10\*(equation_string@ \{\ ! 1387: . pc \" protect against use of % in eqn ! 1388: . tl \(ts\h'\n(.iu'\*(10\(ts\(ts\*(equation_string\(ts ! 1389: . pc % \}]] \" give % back to tl ! 1390: . rm 10 \" free storage ! 1391: ]) ! 1392: ! 1393: |attribute(inline.equation; stack, default off; ! 1394: on [] ! 1395: off []) ! 1396: ! 1397: |attribute(graph; stack, default off; ! 1398: on [ ! 1399: . G1 ! 1400: ] off [ ! 1401: . G2 ! 1402: ]) ! 1403: ! 1404: |attribute(bargraph; stack, default off; ! 1405: on [ ! 1406: . B1 ! 1407: ] off [ ! 1408: . B0 ! 1409: ]) ! 1410: ! 1411: |attribute(computeroutput; stack, default off; ! 1412: on [ ! 1413: . CW ! 1414: ] off [ ! 1415: . CN ! 1416: ]) ! 1417: ! 1418: |attribute(citation; nostack; ! 1419: save on [ ! 1420: . CD "] ! 1421: save off string $$. [" "\*$$." ! 1422: ] save off string $string.register [" "\*($string.register" ! 1423: ] save off number $$. [" "\n$$." ! 1424: ] save off number $number.register [" "\n($number.register" ! 1425: ] save string $name $$. [\&\c ! 1426: . CD "$name" "\*$$." ! 1427: ] save string $name $string.register [\&\c ! 1428: . CD "$name" "\*($string.register" ! 1429: ] save number $name $$. [\&\c ! 1430: . CD "$name" "\n$$." ! 1431: ] save number $name $number.register [\&\c ! 1432: . CD "$name" "\n($number.register" ! 1433: ] remember on [\&\c ! 1434: . CU "] ! 1435: remember off ["] ! 1436: remember string $name [\&\c ! 1437: . CU "$name"]) ! 1438: ! 1439: |attribute(index; stack, default off; ! 1440: on [\&\c ! 1441: . tm ix: ] ! 1442: off [ \n page_counter ! 1443: \&]) ! 1444: ! 1445: |attribute(contents; nostack; ! 1446: $category $level $sequence $text [ ! 1447: . tm .TC $category $level \*($sequence \*($text \n page_counter ! 1448: ]) ! 1449: ! 1450: |attribute(white.text; nostack; ! 1451: $text [|ifvalue verbatim off []|ifvalue verbatim on [$text]]) ! 1452: ! 1453: |attribute(nl.paragraph; nostack; ! 1454: [|ifvalue verbatim on [ ! 1455: ]|ifvalue verbatim off []]) ! 1456: ! 1457: |attribute(format.type; stack, init none; ! 1458: model [ ! 1459: . ds format_type model ! 1460: ] acm [ ! 1461: . ds format_type acm ! 1462: ] none [ ! 1463: . ds format_type none ! 1464: ]) ! 1465: ! 1466: |attribute(list.type; stack, default none; ! 1467: fixed [] ! 1468: calculated [] ! 1469: none []) ! 1470: ! 1471: |attribute(list.spacing; stack, default off; ! 1472: off [] ! 1473: on []) ! 1474: ! 1475: |attribute(verbatim; stack, default off; ! 1476: off [] ! 1477: on []) ! 1478: ! 1479: |attribute(draft; stack, default off; ! 1480: off [] ! 1481: on []) ! 1482: ! 1483: |attribute(sectioning; stack, default bysection; ! 1484: bysection [] ! 1485: bychapter [] ! 1486: byappendix []) ! 1487: ! 1488: |attribute(globalparagraph.style; stack, default flushed; ! 1489: indented [] ! 1490: numbered [] ! 1491: flushed []) ! 1492: ! 1493: |attribute(localparagraph.style; stack, default flushed; ! 1494: indented [] ! 1495: numbered [] ! 1496: flushed []) ! 1497: ! 1498: |attribute(inline; stack, default on; ! 1499: off [] ! 1500: on []) ! 1501: ! 1502: |attribute(footnote_width; stack, default normal; ! 1503: narrow [] ! 1504: full [] ! 1505: normal[]) ! 1506: ! 1507: |attribute(around_width; stack, default normal; ! 1508: narrow [] ! 1509: full [] ! 1510: normal[]) ! 1511: ! 1512: |attribute(sawreference; stack, default off; ! 1513: off [] ! 1514: on []) ! 1515: ! 1516: |attribute(sawabstract; stack, default off; ! 1517: off [] ! 1518: on []) ! 1519: ! 1520: |attribute(sawkeywords; stack, default off; ! 1521: off [] ! 1522: on []) ! 1523: ! 1524: |attribute(sawoverflow; stack, default off; ! 1525: off [] ! 1526: on []) ! 1527: ! 1528: |attribute(sawtitlebox; stack, default off; ! 1529: off [] ! 1530: on []) ! 1531: ! 1532: |attribute(sawendnote; stack, default off; ! 1533: off [] ! 1534: on [])
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.