|
|
1.1 ! root 1: |include(macro.h) ! 2: |include(list.h) ! 3: |include(whitespace.h) ! 4: |include(style.h) ! 5: ! 6: |attribute(page.offset; init; ! 7: [ ! 8: . po \nOu ! 9: ] ! 10: $ [ ! 11: . po $ ! 12: ]) ! 13: ! 14: |attribute(line.length; init; ! 15: [ ! 16: . ll \nWu ! 17: . lt \nWu ! 18: ] ! 19: $ [ ! 20: . ll $ ! 21: . lt $ ! 22: ]) ! 23: ! 24: |attribute(page.length; init; ! 25: [ ! 26: . pl \nLu ! 27: ] ! 28: $ [ ! 29: . pl $ ! 30: ]) ! 31: ! 32: |attribute(spacing; init off; ! 33: on [ ! 34: . rs ! 35: ] off [ ! 36: . ns ! 37: ]) ! 38: ! 39: |attribute(new.page; nostack; ! 40: [ ! 41: . bp ! 42: ]) ! 43: ! 44: |attribute(line.spacing; stack, init; ! 45: $ [ ! 46: . ls $ ! 47: ] [ ! 48: . ls 1 ! 49: ]) ! 50: ! 51: |attribute(blank.lines; nostack; ! 52: $ [ ! 53: . sp $ ! 54: ] [ ! 55: . sp 1 ! 56: ]) ! 57: ! 58: |attribute(horizontal.motion; nostack; ! 59: $ [\h'$']) ! 60: ! 61: |attribute(vertical.motion; nostack; ! 62: $ [\v'$']) ! 63: ! 64: |attribute(concatenate; nostack; ! 65: [\c]) ! 66: ! 67: |attribute(new.line; nostack; ! 68: [ ! 69: . br ! 70: ]) ! 71: ! 72: |attribute(indent; stack, init; ! 73: $ [ ! 74: . in $ ! 75: ] [ ! 76: ' in 0 ! 77: ]) ! 78: ! 79: |attribute(indent.line; nostack; ! 80: $ [ ! 81: . ti $ ! 82: ] [ ! 83: ' ti 0 ! 84: ]) ! 85: ! 86: |attribute(fill; stack, init on; ! 87: on [ ! 88: . fi ! 89: ] off [ ! 90: . nf ! 91: ]) ! 92: ! 93: |attribute(adjust; stack, init both; ! 94: right [ ! 95: . ad r ! 96: ] left [ ! 97: . ad l ! 98: ] both [ ! 99: . ad b ! 100: ] on [ ! 101: . ad ! 102: ] off [ ! 103: . na ! 104: ]) ! 105: ! 106: |attribute(center; stack, default off; ! 107: on [ ! 108: . ce 9999 ! 109: ] off [ ! 110: . ce 0 ! 111: ]) ! 112: ! 113: |attribute(center.block; stack, default off; ! 114: on [ ! 115: . di :1 \" begin second diversion ! 116: ] off [ ! 117: . br \" get last partial line ! 118: . di \" end diversion of centered block ! 119: . nr ;q \n(.u \" save prevailing fill/no-fill mode ! 120: . nf \" bring it back in no-fill ! 121: . nr ;L \n(.L \" save line spacing ! 122: . ls 1 \" output display in ls 1 ! 123: . nr ;i \n(.i \" save prevailing indent ! 124: . nr ;y 1 \" initialize width of block ! 125: . if \n(dl>\n(;y .nr ;y \n(dl ! 126: . if \n(;y<\n(.l .in (\n(.lu-\n(;yu)/2u \"indent by half of white-space ! 127: . :1 \" text ! 128: . if \n(;q .fi \" restore fill if necessary ! 129: . ls \n(;L \" restore line spacing ! 130: . in \n(;iu \" restore prevailing indent ! 131: . rr ;y \" free storage ! 132: . rm :1 ! 133: ]) ! 134: ! 135: |attribute(text; nostack; ! 136: $ [$]) ! 137: ! 138: |attribute(error; nostack; ! 139: $ [ ! 140: . tm "__FILE__":__LINE__: $ ! 141: ]) ! 142: ! 143: |attribute(width; stack, default full; ! 144: narrow [ ! 145: . if \n(:C \{\ ! 146: . ll \nW \" go narrow ! 147: . lt \nW \} ! 148: ] full [ ! 149: . if \n(:C \{\ ! 150: . ll \n(:W \" go wide ! 151: . lt \n(:W \} ! 152: ]) ! 153: ! 154: |attribute(here; stack, default off; ! 155: on [ ! 156: '\" group mechanism ! 157: '\" :0 store for initally diverted text ! 158: '\" :1 store for centered block text ! 159: '\" :C 0=one column, 1=first column, 2=second column ! 160: '\" :W page width for full page output ! 161: '\" :d prevent )h from outputting a floating group ! 162: '\" :m initial footer place and partial footnote diverter trap ! 163: '\" :o footer trap location ! 164: '\" :r position at end of page header macro ! 165: '\" :y flag indicating group/float in progress ! 166: '\" W page width ! 167: '\" ;L remembered line spacing TEMP ! 168: '\" ;i remembered indent TEMP ! 169: '\" ;q remembered fill/no-fill mode TEMP ! 170: '\" ;y initialize width of block TEMP ! 171: . if \n(:y .tm "__FILE__":__LINE__: Groups can not be nested ! 172: . nr :y 1 \" set flag indicating group ! 173: . br \" output partial line before display ! 174: . di :0 \" collect in :0 ! 175: ] off [ ! 176: '\" Control page orientation of blocks. ! 177: '\" Blocks are output as soon after their definition as ! 178: '\" feasible. The following rules are used: ! 179: '\" 1. if the block will fit on the current page, output it there. ! 180: '\" 2. if the block won't fit on any page, and we have used less than ! 181: '\" half of the current page, then output the block on the ! 182: '\" current page. ! 183: '\" 3. skip to the next page. ! 184: . br \" get last partial line ! 185: . di \" end diversion ! 186: '\" The following if condition tests: (1) if the block is too large to ! 187: '\" fit on the current page and either (2) it will fit on an unused page ! 188: '\" or (3) we have already used more than half of the current page. (the ! 189: '\" three conditions are grouped in the form 1 & (2 : 3)). If this ! 190: '\" total condition is true, then a page is ejected and the block output ! 191: '\" on the next page. ! 192: . nr :d 1 \" prevent )h from outputting a floating group ! 193: . if (\n(dn>=\n(.t)&((\n(dn<(\n(.p-\n(:r-\n(:m)):\ ! 194: (\n(nl>(\n(.p-\n(:r-\n(:o/2u+\n(:r)))\ ! 195: . ne \n(.tu+1v \" spring the trap ! 196: . nr ;q \n(.u \" save prevailing fill/no-fill mode ! 197: . nf \" bring it back in no-fill ! 198: . nr ;L \n(.L \" save line spacing ! 199: . ls 1 \" output display in ls 1 ! 200: . nr ;i \n(.i \" save prevailing indent ! 201: . in 0 \" indent back ! 202: . rs \" restore spacing ! 203: . :0 \" text ! 204: . nr :d 0 \" allow )h to output a floating group ! 205: . if \n(;q .fi \" restore fill if necessary ! 206: . ls \n(;L \" restore line spacing ! 207: . in \n(;iu \" restore prevailing indent ! 208: . nr :y 0 \" reset flag indicating group ! 209: . rr ;L ;i ;q \" free storage ! 210: . rm :0 ! 211: ]) ! 212: ! 213: |attribute(around; stack, default off; ! 214: on [ ! 215: '\" float mechanism ! 216: '\" !{a-z} width of stored floating 0=narrow, 1=wide ! 217: '\" :0 store for initally diverted text ! 218: '\" :1 store for centered block text ! 219: '\" :C 0=one column, 1=first column, 2=second column ! 220: '\" :W page width for full page output ! 221: '\" :m initial footer place and partial footnote diverter trap ! 222: '\" :o footer trap location ! 223: '\" :r position at end of page header macro ! 224: '\" :w output counter for floating keeps ! 225: '\" :y flag indicating group/float in progress ! 226: '\" :z input counter for floating keeps ! 227: '\" W page width ! 228: '\" ?{a-z} text of stored floating ! 229: '\" |{a-z} size of stored floating ! 230: '\" ;L prevailing line spacing ! 231: '\" ;f prevailing font ! 232: '\" ;i prevailing indent ! 233: '\" ;j prevailing adjust ! 234: '\" ;l prevailing line length ! 235: '\" ;o prevailing page offset ??????? bug with .po ! 236: '\" ;s prevailing point size ! 237: '\" ;u prevailing fill/no-fill mode ! 238: '\" ;v prevailing vertical spacing ! 239: '\" ;w convert to alpha format ! 240: '\" ;y initialize width of block ! 241: . if \n(:y .tm "__FILE__":__LINE__: Groups can not be nested ! 242: . nr :y 1 \" set flag indicating group ! 243: . nr ;s \n(.s \" save prevailing point size ! 244: . nr ;f \n(.f \" save prevailing font ! 245: . nr ;u \n(.u \" save prevailing fill/no-fill mode ! 246: . nr ;j \n(.j \" save prevailing adjust ! 247: . nr ;v \n(.v \" save prevailing vertical spacing ! 248: . nr ;L \n(.L \" save prevailing line spacing ! 249: . nr ;l \n(.l \" save prevailing line length ! 250: . nr ;i \n(.i \" save prevailing indent ! 251: . ev 1 \" use footnote environment ! 252: . ps \n(;s \" restore point size ! 253: . vs \n(;sp+2p \" restore vertical spacing ! 254: . ft \n(;f \" restore font ! 255: . nf \" bring it back in no-fill ! 256: . if \n(;u .fi \" restore fill if necessary ! 257: . ad \n(;j \" restore page adjust ! 258: . vs \n(;vu \" restore vertical spacing ! 259: . ls \n(;L \" restore line spacing ! 260: . ll \n(;lu \" restore line length ! 261: . in \n(;iu \" restore indent ! 262: . ti \n(;iu \" turn off indentation ! 263: . hy 14 \" turn on hyphenation ! 264: . lt \n(;lu \" restore title length ! 265: . di :0 \" collect in :0 ! 266: ] off [ ! 267: '\" Control page orientation of floats. ! 268: '\" Floats are output as soon after their definition as ! 269: '\" feasible. The following rules are used: ! 270: '\" 1. if the queue contains only this float and it will fit on the ! 271: '\" current page, output it there. ! 272: '\" 2. if the queue contains only this float and it won't fit on any ! 273: '\" page, and we have used less than half of the current page, ! 274: '\" then output the float on the current page. ! 275: '\" 3. let the top of page macro handle it. ! 276: . br \" get last partial line ! 277: . di \" end diversion of centered block ! 278: . ev \" back to previous environment ! 279: . nr :z \n(:z%26+1 \" get index of next output element ! 280: . if \n(:z-\n(:w=0 .tm "__FILE__":__LINE__: too many floating displays ! 281: . af ;w a \" conversion register for display queue names ! 282: . nr ;w \n(:z \" form the next queue element name ! 283: . rn :0 ?\n(;w \" put the display into the queue ! 284: . nr !\n(;w 0 \" narrow ! 285: . if !\n(:C .nr !\n(;w 1 \" wide display if only one column ! 286: . nr |\n(;w \n(dn \" put the size of text ! 287: '\" The following if condition tests: (1) if there is only one float ! 288: '\" on the queue to output and (2) if wide displays and (3) we are on the ! 289: '\" first column and (4) if the float fits on the current page or ! 290: '\" (5) the float is too large to fit on any one page, and (6) we have used ! 291: '\" less than half of the current page. (the six conditions are grouped ! 292: '\" in the form (1 & (2 & 3) & (4 : (5 & 6))). If this total condition is true, ! 293: '\" then a float is output. ! 294: . if ((\n(:z-\n(:w=1)&((\n(!\n(;w=1)&(\n(:C<2))&\ ! 295: ((\n(dn<\n(.t):((\n(dn>(\n(.p-\n(:r-\n(:m))&\ ! 296: (\n(nl<=(\n(.p-\n(:r-\n(:o/2u+\n(:r))))) .)z ! 297: . nr :y 0 \" reset flag indicating group ! 298: . rr ;L ;f ;i ;j ;l ;o ;s ;u ;v ;w \" free storage ! 299: ]) ! 300: ! 301: |attribute(around_placement; nostack; ! 302: [ ! 303: . )w ! 304: ]) ! 305: ! 306: |attribute(footnote; stack, default off; ! 307: on [ ! 308: '\" :C 0=one column, 1=first column, 2=second column ! 309: '\" :F Footnote text ! 310: '\" :W page width for full page output ! 311: '\" :m initial footer place and partial footnote diverter trap ! 312: '\" :o footer trap location ! 313: '\" :q amount of footnote text ! 314: '\" :v width of stored footnote 0=narrow, 1=wide ! 315: '\" :x flag indicating footnote in progress ! 316: '\" W page width ! 317: '\" ;L prevailing line spacing ! 318: '\" ;f prevailing font ! 319: '\" ;i prevailing indent ! 320: '\" ;j prevailing adjust ! 321: '\" ;l prevailing line length ! 322: '\" ;o prevailing page offset ??????? bug with .po ! 323: '\" ;s prevailing point size ! 324: '\" ;u prevailing fill/no-fill mode ! 325: '\" ;v prevailing vertical spacing ! 326: . if \n(:x .tm "__FILE__":__LINE__: Footnotes can not be nested ! 327: . nr :x 1 \" set flag indicating footnote ! 328: . nr ;s \n(.s \" save prevailing point size ! 329: . nr ;f \n(.f \" save prevailing font ! 330: . nr ;u \n(.u \" save prevailing fill/no-fill mode ! 331: . nr ;j \n(.j \" save prevailing adjust ! 332: . nr ;v \n(.v \" save prevailing vertical spacing ! 333: . nr ;L \n(.L \" save prevailing line spacing ! 334: . nr ;l \n(.l \" save prevailing line length ! 335: . nr ;i \n(.i \" save prevailing indent ! 336: . ev 1 \" use footnote environment ! 337: . ps \n(;s \" restore point size ! 338: . vs \n(;sp+2p \" restore vertical spacing ! 339: . ft \n(;f \" restore font ! 340: . nf \" bring it back in no-fill ! 341: . if \n(;u .fi \" restore fill if necessary ! 342: . ad \n(;j \" restore page adjust ! 343: . vs \n(;vu \" restore vertical spacing ! 344: . ls \n(;L \" restore line spacing ! 345: . ll \n(;lu \" restore line length ! 346: . in \n(;iu \" restore indent ! 347: . ti \n(;iu \" turn off indentation ! 348: . hy 14 \" turn on hyphenation ! 349: . lt \n(;lu \" restore title length ! 350: |ifvalue wide on [ ! 351: . if \n(:C \{\ ! 352: . ll \n(:W \" go wide ! 353: . lt \n(:W \} ! 354: ] ! 355: 'DUMMY ! 356: . da :F \" collect in :F ! 357: . if !\n(:q \{\ ! 358: . nr ;o \n(.o \" save prevailing page offset ! 359: . po 0 \" always from left margin ! 360: . ps 10 \" 10 point roman font ! 361: . vs 10p ! 362: . ft 1 ! 363: . ie \n(.A=0 \l'72p'\" layout partial rule if new footnote ! 364: . el __________ ! 365: . ft \" restore values ! 366: . vs ! 367: . ps ! 368: . po \n(;ou\} ! 369: ] off [ ! 370: . br \" get last partial line ! 371: . di \" end diversion ! 372: |ifvalue wide on [ ! 373: . if \n(:C \{\ ! 374: . ll \nW \" go narrow ! 375: . lt \nW \} ! 376: . nr :v 1 \" wide footnote ! 377: ] ! 378: 'DUMMY ! 379: |ifnotvalue wide on [ ! 380: . if !\n(:C .nr :v 1 \" wide footnote if only one column ! 381: ] ! 382: 'DUMMY ! 383: . ev \" go back to previous environment ! 384: . nr :x 0 \" clear flag indicating footnote ! 385: . nr :q +\n(dnu \" add in amount of new footnotes ! 386: '\" Move up footer trap, but not above current position on page ! 387: . nr :o +\n(dnu ! 388: . if !\n(.pu-\n(nlu-.5p-\n(:ou .nr :o \n(.pu-\n(nlu-.5p ! 389: '\" or below :m! ! 390: . if !\n(:ou-\n(:mu .nr :o \n(:mu ! 391: . ch )f -\n(:ou \" move footer trap ! 392: . rr ;L ;f ;i ;j ;l ;s ;u ;v \" free storage ! 393: ]) ! 394: ! 395: |attribute(size; stack, default; ! 396: $ [\&\s$] ! 397: [\&\s\nS]) ! 398: ! 399: |attribute(font.size; stack, init; ! 400: $ [ ! 401: . ps $ ! 402: . vs \n(.sp+2p ! 403: ] [ ! 404: . ps \nSp ! 405: . vs \nSp+2p ! 406: ]) ! 407: ! 408: |attribute(font; stack, init; ! 409: roman [ ! 410: |ifvalue fill off [\&\f1] ! 411: |ifvalue fill on [ ! 412: . ft 1 ! 413: ] ! 414: ] italics [ ! 415: |ifvalue fill off [\&\f2] ! 416: |ifvalue fill on [ ! 417: . ft 2 ! 418: ] ! 419: ] bold [ ! 420: |ifvalue fill off [\&\f3] ! 421: |ifvalue fill on [ ! 422: . ft 3 ! 423: ] ! 424: ] special [ ! 425: |ifvalue fill off [\&\f4] ! 426: |ifvalue fill on [ ! 427: . ft 4 ! 428: ] ! 429: ] cw [ ! 430: |ifvalue fill off [\&\f(CW] ! 431: |ifvalue fill on [ ! 432: . ft CW ! 433: ] ! 434: ] [ ! 435: |ifvalue fill off [\&\f\nF] ! 436: |ifvalue fill on [ ! 437: . ft \nF ! 438: ] ! 439: ]) ! 440: ! 441: |attribute(temporary.font; nostack; ! 442: roman [\f1] ! 443: roman $ [\f1$\fP] ! 444: italics [\f2] ! 445: italics $ [\f2$\fP] ! 446: bold [\f3] ! 447: bold $ [\f3$\fP] ! 448: special [\f4] ! 449: special $ [\f4$\fP] ! 450: cw [\f(CW] ! 451: cw $ [\f(CW$\fP] ! 452: [\fP] ! 453: ) ! 454: ! 455: |attribute(font.family; stack, default times; ! 456: times [ ! 457: . fp 1 R ! 458: . fp 2 I ! 459: . fp 3 B ! 460: . fp 4 BI ! 461: ] palatino [ ! 462: . fp 1 PA ! 463: . fp 2 PI ! 464: . fp 3 PB ! 465: . fp 4 PX ! 466: ] bembo [ ! 467: . fp 1 B1 ! 468: . fp 2 B2 ! 469: . fp 3 B3 ! 470: . fp 4 B4 ! 471: ] optima [ ! 472: . fp 1 O1 ! 473: . fp 2 O2 ! 474: . fp 3 O3 ! 475: . fp 4 O4 ! 476: ] souvenir [ ! 477: . fp 1 SV ! 478: . fp 2 SI ! 479: . fp 3 SB ! 480: . fp 4 SX ! 481: ] helvetica [ ! 482: . fp 1 H ! 483: . fp 2 HI ! 484: . fp 3 HB ! 485: . fp 4 HX ! 486: ] cw [ ! 487: . fp 1 CW ! 488: . fp 2 I ! 489: . fp 3 B ! 490: . fp 4 BI ! 491: ]) ! 492: ! 493: |attribute(if; nostack; ! 494: $test [ ! 495: . if $test \ ! 496: ] begin $test [ ! 497: . if $test \{\ ! 498: ] end [\}\c ! 499: ] else $test [ ! 500: . ie $test \ ! 501: ] else begin $test [ ! 502: . ie $test \{] ! 503: else [ ! 504: . el \ ! 505: ] else begin [ ! 506: . el \{]) ! 507: ! 508: |attribute(tab; nostack; ! 509: [\& ]) ! 510: ! 511: |attribute(thick.line; nostack; ! 512: $ [ ! 513: . ps 24 ! 514: \l'$' ! 515: . ps ! 516: ] [ ! 517: . ps 24 ! 518: \l'\n(.lu' ! 519: . ps ! 520: ]) ! 521: ! 522: |attribute(line; nostack; ! 523: $ [\l'$'] ! 524: [\l'\n(.lu']) ! 525: ! 526: |attribute(box; nostack; ! 527: x [\s12\o'\(mu\(sq'\s0] ! 528: empty [\s12\(sq\s0] ! 529: [\(sq]) ! 530: ! 531: |attribute(underline; stack, default off; ! 532: on [\kx] ! 533: off [\l'|\nxu\(ul']) ! 534: ! 535: |attribute(hyphenate; stack, init on; ! 536: on [ ! 537: . hy 14 ! 538: ] off [ ! 539: . nh ! 540: ]) ! 541: ! 542: |attribute(case; stack, init any; ! 543: upper [ ! 544: '\" need to write this yet ! 545: ] lower [ ! 546: '\" need to write this yet ! 547: ] capitalize [ ! 548: '\" need to write this yet ! 549: ] any [ ! 550: '\" need to write this yet ! 551: ]) ! 552: ! 553: |attribute(tab.stops; nostack; ! 554: $* [ ! 555: . ta $* ! 556: ] [ ! 557: . 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 ! 558: ]) ! 559: ! 560: |attribute(set; nostack; ! 561: $* $number [ ! 562: |for i in $* { ! 563: . nr $i $number ! 564: }] string $* $string [ ! 565: |for i in $* { ! 566: . ds $i $string ! 567: }]) ! 568: ! 569: |attribute(store; nostack; ! 570: $* $$. [ ! 571: |for i in $* { ! 572: . nr $i \n$$. ! 573: }] $* $number.register [ ! 574: |for i in $* { ! 575: . nr $i \n($number.register ! 576: }] string $* $$. [ ! 577: |for i in $* { ! 578: . ds $i \*$$. ! 579: }] string $* $string.register [ ! 580: |for i in $* { ! 581: . ds $i \*($string.register ! 582: }] number.from.string $* $$. [ ! 583: |for i in $* { ! 584: . nr $i \*$$. ! 585: }] number.from.string $* $string.register [ ! 586: |for i in $* { ! 587: . nr $i \*($string.register ! 588: }] string.from.number $* $$. [ ! 589: |for i in $* { ! 590: . ds $i \n$$. ! 591: }] string.from.number $* $number.register [ ! 592: |for i in $* { ! 593: . ds $i \n($number.register ! 594: }]) ! 595: ! 596: |attribute(clear; nostack; ! 597: $* [ ! 598: |for i in $* { ! 599: . nr $i 0 ! 600: }] string $* [ ! 601: . rm $* ! 602: ]) ! 603: ! 604: |attribute(add; nostack; ! 605: $result $operand $* [ ! 606: . nr $result \n($operand ! 607: |for i in $* { ! 608: . nr $result +\n($i ! 609: }] $result $operand [ ! 610: . nr $result \n($operand ! 611: ] string $string $text [ ! 612: . as $string $text ! 613: ] string.from.number $string $number.register [ ! 614: . as $string \n($number.register ! 615: ] string.from.string $string $string.register [ ! 616: . as $string \*($string.register ! 617: ]) ! 618: ! 619: ! 620: |attribute(incr; nostack; ! 621: $* [ ! 622: |for i in $* { ! 623: . nr $i +1 ! 624: }]) ! 625: ! 626: |attribute(decr; nostack; ! 627: $* [ ! 628: |for i in $* { ! 629: . nr $i -1 ! 630: }]) ! 631: ! 632: |attribute(protect; nostack; ! 633: $ [ ! 634: . ne $ ! 635: ] [ ! 636: . ne 3 ! 637: ]) ! 638: ! 639: |attribute(warn.orphan; nostack; ! 640: $ [ ! 641: '\" need to write this yet ! 642: ] [ ! 643: '\" need to write this yet ! 644: ]) ! 645: ! 646: |attribute(two.columns; nostack; ! 647: on [ ! 648: '\" :C 0=one column, 1=first column, 2=second column ! 649: '\" :O page offset for other column ! 650: '\" :W page width for full page output ! 651: '\" :u position to return to for second column output ! 652: '\" O page offset ! 653: '\" W page width ! 654: . if \n(:C .tm "__FILE__":__LINE__: already in two column mode ! 655: . br \" force out last partial line ! 656: . nr :C 1 \" flag for two column mode, first column ! 657: . nr :W \nW \" save line length ! 658: . nr W \n(.lu*8u/17u \" new line length ! 659: . nr :O \n(.lu*9u/17u+\nOu\" page offset for other column ! 660: . ll \nWu \" set new line length ! 661: . lt \nWu \" set new title length ! 662: . mk :u \" save where second column starts ! 663: ] off [ ! 664: . if !\n(:C .tm "__FILE__":__LINE__: already in full page mode ! 665: . br \" force out last partial line ! 666: . if \n(:C>1 .ne \n(.tu+1v\" spring footer trap for second column ! 667: . nr W \n(:Wu \" restore line length ! 668: . ll \nWu \" set new line length ! 669: . lt \nWu \" set new title length ! 670: . nr :C 0 \" flag for full page mode ! 671: ]) ! 672: ! 673: |attribute(divert.string; nostack; ! 674: $string.name [ ! 675: . ds $string.name ]) ! 676: ! 677: |attribute(divert.number; nostack; ! 678: $number.name [ ! 679: . nr $number.name ]) ! 680: ! 681: |attribute(divert.output; stack, default off; ! 682: on $string.name [ ! 683: . di $string.name \" start diverting into macro ! 684: ] off [ ! 685: . br \" get last partial line ! 686: . di \" turn off diversions ! 687: ]) ! 688: ! 689: |attribute(divert.input; stack, default off; ! 690: on $string.name [ ! 691: . eo ! 692: . de $string.name ! 693: ] off [ ! 694: .. ! 695: . ec ! 696: ]) ! 697: ! 698: |attribute(remember; nostack; ! 699: $ [ ! 700: . mk $ ! 701: ]) ! 702: ! 703: |attribute(return; nostack; ! 704: $$. [ ! 705: . sp |\n$$.u ! 706: ] $ [ ! 707: . sp |\n($u ! 708: ]) ! 709: ! 710: |attribute(goto; nostack; ! 711: $ [ ! 712: . sp |$ ! 713: ]) ! 714: ! 715: |attribute(string; nostack; ! 716: $$. [\*$$.] ! 717: $string.register [\*($string.register]) ! 718: ! 719: |attribute(macro; nostack; ! 720: $ [ ! 721: . $ ! 722: ]) ! 723: ! 724: |attribute(number; nostack; ! 725: $$. $format [ ! 726: . af $$. $format ! 727: \n$$.] ! 728: $number.register $format [ ! 729: . af $number.register $format ! 730: \n($number.register] ! 731: $$. [\n$$.] ! 732: $number.register [\n($number.register] ! 733: ++ $$. [\n+$$.] ! 734: ++ $number.register [\n+($number.register] ! 735: format $* $format [ ! 736: |for i in $* { ! 737: . af $i $format ! 738: }]) ! 739: ! 740: |attribute(reference; stack, default off; ! 741: on { ! 742: . [ ! 743: } off { ! 744: . ] ! 745: } placement { ! 746: . [ ! 747: $LIST$ ! 748: }) ! 749: ! 750: |attribute(table; stack, default off; ! 751: on [ ! 752: . TS ! 753: ] off [ ! 754: . TE ! 755: ]) ! 756: ! 757: |attribute(picture; stack, default off; ! 758: on [ ! 759: . PS ! 760: ] off [ ! 761: . PE ! 762: ]) ! 763: ! 764: |attribute(equation; stack, default off; ! 765: on [ ! 766: . EQ ! 767: ] off [ ! 768: . EN ! 769: ]) ! 770: ! 771: |attribute(inline.equation; stack, default off; ! 772: on [] ! 773: off []) ! 774: ! 775: |attribute(graph; stack, default off; ! 776: on $$. [ ! 777: . G1 \*$$. ! 778: ] on $string.register [ ! 779: . G1 \*($string.register ! 780: ] off [ ! 781: . G2 ! 782: ]) ! 783: ! 784: |attribute(bargraph; stack, default off; ! 785: on [ ! 786: . B1 ! 787: ] off [ ! 788: . B0 ! 789: ]) ! 790: ! 791: |attribute(citation; nostack; ! 792: save [ ! 793: . CD "] ! 794: save end $$. [" "\*$$." ! 795: ] save end $string.register [" "\*($string.register" ! 796: ] savepage end [" "\nP" ! 797: ] remember [ ! 798: . CU "] ! 799: remember end ["]) ! 800: ! 801: |attribute(insert; nostack; ! 802: $file.name [ ! 803: . so $file.name ! 804: ]) ! 805: ! 806: |attribute(list.tags; stack, init none; ! 807: bullet [ ! 808: . ds list_type bullet ! 809: ] dash [ ! 810: . ds list_type dash ! 811: ] outline [ ! 812: . ds list_type outline ! 813: ] number [ ! 814: . ds list_type number ! 815: ] none [ ! 816: . ds list_type none ! 817: ]) ! 818: ! 819: |attribute(format.type; stack, init none; ! 820: model [ ! 821: . ds format_type model ! 822: ] none [ ! 823: . ds format_type none ! 824: ]) ! 825: ! 826: |attribute(verbatim; stack, init off; ! 827: off [] ! 828: on []) ! 829: ! 830: |attribute(file.information; nostack; ! 831: [ ! 832: . lf __LINE__ __FILE__ ! 833: ]) ! 834: ! 835: |attribute(white.text; nostack; ! 836: $text [|ifvalue verbatim off []|ifvalue verbatim on [$text]]) ! 837: ! 838: |attribute(nl.paragraph; nostack; ! 839: [|ifvalue verbatim on [ ! 840: ]|ifvalue verbatim off []])
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.