|
|
1.1 ! root 1: .nr _0 \n(.c ! 2: .\"********************************************************************** ! 3: .\"* * ! 4: .\"* ****** - M E N R O F F / T R O F F M A C R O S ****** * ! 5: .\"* * ! 6: .\"* Produced for your edification and enjoyment by: * ! 7: .\"* Eric Allman * ! 8: .\"* Electronics Research Laboratory * ! 9: .\"* U.C. Berkeley. * ! 10: .\"* current address: * ! 11: .\"* Britton-Lee, Inc. * ! 12: .\"* 1919 Addison Street Suite 105 * ! 13: .\"* Berkeley, California 94704 * ! 14: .\"* * ! 15: .\"* VERSION 2.28 First Release: 11 Sept 1978 * ! 16: .\"* See file \*(||/revisions for revision history * ! 17: .\"* * ! 18: .\"* Documentation is available. * ! 19: .\"* * ! 20: .\"********************************************************************** ! 21: .\" ! 22: .\" @(#)tmac.e 2.28 5/12/86 ! 23: .\" %beginstrip% ! 24: .\" ! 25: .\" Code on .de commands: ! 26: .\" *** a user interface macro. ! 27: .\" &&& a user interface macro which is redefined ! 28: .\" when used to be the real thing. ! 29: .\" $$$ a macro which may be redefined by the user ! 30: .\" to provide variant functions. ! 31: .\" --- an internal macro. ! 32: .\" ! 33: .if !\n(.V .tm You are using the wrong version of NROFF/TROFF!! ! 34: .if !\n(.V .tm This macro package works only on the version seven ! 35: .if !\n(.V .tm release of NROFF and TROFF. ! 36: .if !\n(.V .ex ! 37: .if \n(pf \ ! 38: . nx \*(||/null.me ! 39: .\" *** INTERNAL GP MACROS *** ! 40: .de @C \" --- change ev's, taking info with us ! 41: .nr _S \\n(.s ! 42: .nr _V \\n(.v ! 43: .nr _F \\n(.f ! 44: .nr _I \\n(.i ! 45: .ev \\$1 ! 46: .ps \\n(_S ! 47: .vs \\n(_Vu ! 48: .ft \\n(_F ! 49: 'in \\n(_Iu ! 50: .xl \\n($lu ! 51: .lt \\n($lu ! 52: .rr _S ! 53: .rr _V ! 54: .rr _F ! 55: .rr _I ! 56: .ls 1 ! 57: 'ce 0 ! 58: .. ! 59: .de @D \" --- determine display type (Indent, Left, Center) ! 60: .ds |p "\\$3 ! 61: .nr _d \\$1 ! 62: .ie "\\$2"C" \ ! 63: . nr _d 1 ! 64: .el .ie "\\$2"L" \ ! 65: . nr _d 2 ! 66: .el .ie "\\$2"I" \ ! 67: . nr _d 3 ! 68: .el .ie "\\$2"M" \ ! 69: . nr _d 4 ! 70: .el \ ! 71: . ds |p "\\$2 ! 72: .. ! 73: .de @z \" --- end macro ! 74: .if \n@>1 .tm >> @z, .z=\\n(.z ?a=\\n(?a ! 75: .if !"\\n(.z"" \ ! 76: \{\ ! 77: . tm Line \\n(c. -- Unclosed block, footnote, or other diversion (\\n(.z) ! 78: . di ! 79: . ex ! 80: .\} ! 81: .if \\n(?a \ ! 82: . bp \" force out final table ! 83: .rm bp ! 84: .rm @b\" \" don't start another page ! 85: .if t \ ! 86: . wh -1p @m ! 87: .br ! 88: .if \n@>1 .tm << @z ! 89: .. ! 90: .de @I \" --- initialize processor ! 91: .rm th ! 92: .rm ac ! 93: .rm lo ! 94: .rm sc ! 95: .rm @I ! 96: .. ! 97: .\" *** STANDARD HEADERS AND FOOTERS *** ! 98: .de he \" *** define header ! 99: .ie !\\n(.$ \ ! 100: \{\ ! 101: . rm |4 ! 102: . rm |5 ! 103: .\} ! 104: .el \ ! 105: \{\ ! 106: . ds |4 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ! 107: . ds |5 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ! 108: .\} ! 109: .. ! 110: .de eh \" *** define even header ! 111: .ie !\\n(.$ \ ! 112: . rm |4 ! 113: .el \ ! 114: . ds |4 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ! 115: .. ! 116: .de oh \" *** define odd header ! 117: .ie !\\n(.$ \ ! 118: . rm |5 ! 119: .el \ ! 120: . ds |5 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ! 121: .. ! 122: .de fo \" *** define footer ! 123: .ie !\\n(.$ \ ! 124: \{\ ! 125: . rm |6 ! 126: . rm |7 ! 127: .\} ! 128: .el \ ! 129: \{\ ! 130: . ds |6 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ! 131: . ds |7 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ! 132: .\} ! 133: .. ! 134: .de ef \" *** define even foot ! 135: .ie !\\n(.$ \ ! 136: . rm |6 ! 137: .el \ ! 138: . ds |6 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ! 139: .. ! 140: .de of \" *** define odd footer ! 141: .ie !\\n(.$ \ ! 142: . rm |7 ! 143: .el \ ! 144: . ds |7 "\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 ! 145: .. ! 146: .de ep \" *** end page (must always be followed by a .bp) ! 147: .if \\n(nl>0 \ ! 148: \{\ ! 149: . wh 0 ! 150: . rs ! 151: . @b ! 152: .\} ! 153: .. ! 154: .\" *** INTERNAL HEADER AND FOOTER MACROS *** ! 155: .de @h \" --- header ! 156: .if \n@>1 .tm >> @h %=\\n% ?a=\\n(?a ?b=\\n(?b ?w=\\n(?w ! 157: .if (\\n(.i+\\n(.o)>=\\n(.l \ ! 158: . tm Line \\n(c. -- Offset + indent exceeds line length ! 159: .if t .if (\\n(.l+\\n(.o)>7.75i \ ! 160: . tm Line \\n(c. -- Offset + line length exceeds paper width ! 161: .\" initialize a pile of junk ! 162: .nr ?h \\n(?H \" transfer "next page" to "this page" ! 163: .rr ?H ! 164: .nr ?c \\n(?C ! 165: .rr ?C ! 166: .rn |4 |0 ! 167: .rn |5 |1 ! 168: .rn |6 |2 ! 169: .rn |7 |3 ! 170: .nr _w 0 \" reset max footnote width ! 171: .nr ?W 0 \" no wide floats this page (yet) ! 172: .nr ?I 1 ! 173: .\" begin actual header stuff ! 174: .ev 2 ! 175: .rs ! 176: .if t .@m \" output cut mark ! 177: .if \\n(hm>0 \ ! 178: . sp |\\n(hmu \" move to header position ! 179: .@t $h \" output header title ! 180: .if \\n(tm<=0 \ ! 181: . nr tm \n(.Vu ! 182: .sp |\\n(tmu \" move to top of text ! 183: .ev ! 184: .mk _k \" for columned output ! 185: .if \\n(?n .nm 1 \" restore line numbering if n1 mode ! 186: .nr $c 1 \" set first column ! 187: .if \n@>4 .tm -- @h >> .ns nl=\\n(nl %=\\n% _k=\\n(_k tm=\\n(tm ! 188: .ie \\n(?s \ ! 189: \{\ ! 190: . rr ?s ! 191: . rs ! 192: ' @b ! 193: .\} ! 194: .el \ ! 195: . @n \" begin the column ! 196: .if \n@>2 .tm << @h ! 197: .. ! 198: .if \nv=2 \ ! 199: \{\ ! 200: . de @m \" --- output cut mark (only on C/A/T-style) ! 201: . @O 0 ! 202: . lt 7.5i ! 203: . tl '\(rn''\(rn' ! 204: . @O ! 205: . lt ! 206: .. ! 207: .\} ! 208: .de @n \" --- new column or page ! 209: .if \n@>3 .tm >> @n nl=\\n(nl %=\\n% ?f=\\n(?f ?o=\\n(?o ! 210: .if \\n(bm<=0 \ ! 211: . nr bm \\n(.Vu ! 212: .if (\\n(_w<=\\n($l)&(\\n(?W=0) \ ! 213: \{\ ! 214: . nr _b (\\n(ppu*\\n($ru)/2u \" compute fudge factor (must be < 1P) ! 215: . if \\n(_bu>((\\n(bmu-\\n(fmu-(\\n(tpu*\\n($ru))/2u) \ ! 216: . nr _b (\\n(ppu*\\n($ru)-\n(.Vu ! 217: . nr _b +\\n(bmu ! 218: .\} ! 219: .nr _B \\n(_bu ! 220: .ch @f ! 221: .wh -\\n(_bu @f ! 222: .nr _b +(\\n(ppu*\\n($ru) \" add 1 paragraph v in case of sweep past ! 223: .if \n@>2 .tm @n .p=\\n(.p bm=\\n(bm _b=\\n(_b _B=\\n(_B ! 224: .nr ?f 0 \" reset footnote flag ! 225: .if \\n(?o \ ! 226: \{\ ! 227: . (f _ \" reprocess footnotes which run off page ! 228: . nf ! 229: . |o ! 230: . fi ! 231: . )f ! 232: . rm |o ! 233: .\} ! 234: .nr ?o 0 ! 235: .if \\n(?T \ ! 236: \{\ ! 237: . nr _i \\n(.i ! 238: . in \\n($iu ! 239: . |h \" output the table header ! 240: . in \\n(_iu ! 241: . rr _i ! 242: . mk #T \" for tbl commands ! 243: . ns ! 244: .\} ! 245: .if (\\n(?a)&((\\n($c<2):(\\n(?w=0)) \ ! 246: \{\ ! 247: . nr ?a 0 \" output floating keep ! 248: . @k |t ! 249: . if \\n(?w \ ! 250: . mk _k \" don't overstrike wide keeps ! 251: . nr ?w 0 ! 252: .\} ! 253: .os ! 254: .$H \" special column header macro ! 255: .ns ! 256: .. ! 257: .de @f \" --- footer ! 258: .if \n@>1 .tm >> @f %=\\n% nl=\\n(nl ?a=\\n(?a ?b=\\n(?b ?f=\\n(?f ! 259: .if \n@>2 .nr VL \\n(.pu-\\n(nlu ! 260: .if \n@>2 .tm @f bm=\\n(bm _B=\\n(_B _b=\\n(_b .p-nl=\\n(VL ! 261: .ec ! 262: .if \\n(?T \ ! 263: \{\ ! 264: . nr T. 1 \" for tbl commands (to output bottom line) ! 265: . T# 1 \" output the sides and bottom lines ! 266: . br ! 267: .\} ! 268: .ev 2 ! 269: .ce 0 ! 270: .if \\n(?b \ ! 271: \{\ ! 272: . nr ?b 0 ! 273: . @k |b\" \" output bottom of page tables ! 274: .\} ! 275: .if \\n(?f \ ! 276: . @o \" output footnote if present ! 277: .ie \\n($c<\\n($m \ ! 278: . @c \" handle new column ! 279: .el \ ! 280: . @e \" new page ! 281: .ev ! 282: .if \n@>2 .tm << @f ! 283: .. ! 284: .de @o \" --- output footnote ! 285: .nf ! 286: .ls 1 ! 287: .in 0 ! 288: .if \n@>2 .tm @o last printed text = \\n(nl placing @r trap at -\\n(_B ! 289: .wh -\\n(_Bu @r ! 290: .|f ! 291: .fi ! 292: .if \n@>2 .tm @o triggered @r (?o) = \\n(?o ! 293: .if \\n(?o \ ! 294: \{\ ! 295: . di \" just in case triggered @r ! 296: . if \\n(dn=0 \ ! 297: \{\ ! 298: . rm |o ! 299: . nr ?o 0 ! 300: . \} ! 301: . nr dn \\n(_D ! 302: . rr _D ! 303: .\} ! 304: .rm |f ! 305: .ch @r ! 306: .. ! 307: .de @c \" --- new column ! 308: .if \n@>2 .tm >> @c %=\\n% ! 309: .rs ! 310: .sp |\\n(_ku ! 311: .@O +\\n($lu+\\n($su ! 312: .nr $c +1 ! 313: .@n ! 314: .. ! 315: .de @e \" --- end page ! 316: .if \n@>2 .tm >> @e ! 317: .@O \\n(_ou ! 318: .rs ! 319: .sp |\\n(.pu-\\n(fmu-(\\n(tpu*\\n($ru) \" move to footer position ! 320: .@t $f \" output footer title ! 321: .nr ?h 0 ! 322: .bp ! 323: .. ! 324: .de @t \" --- output header or footer title ! 325: .if !\\n(?h \ ! 326: \{\ ! 327: . sz \\n(tp \" set header/footer type fonts, etc. ! 328: . @F \\n(tf ! 329: . lt \\n(_Lu \" make title span entire page ! 330: . nf ! 331: . \\$1 ! 332: . br ! 333: .\} ! 334: .. ! 335: .de $h \" $$$ print header ! 336: .rm |z ! 337: .if !\\n(?c \ ! 338: \{\ ! 339: . if e .ds |z "\\*(|0 ! 340: . if o .ds |z "\\*(|1 ! 341: .\} ! 342: .if !\(ts\\*(|z\(ts\(ts \ ! 343: ' tl \\*(|z ! 344: .rm |z ! 345: .. ! 346: .de $f \" $$$ print footer ! 347: .rm |z ! 348: .if \\n(?c \ ! 349: \{\ ! 350: . if e .ds |z "\\*(|0 ! 351: . if o .ds |z "\\*(|1 ! 352: .\} ! 353: .if \(ts\\*(|z\(ts\(ts \ ! 354: \{\ ! 355: . if e .ds |z "\\*(|2 ! 356: . if o .ds |z "\\*(|3 ! 357: .\} ! 358: .if !\(ts\\*(|z\(ts\(ts \ ! 359: ' tl \\*(|z ! 360: .rm |z ! 361: .. ! 362: .de @r \" --- reprocess overflow footnotes ! 363: .if \n@>3 .tm >> @r .z=\\n(.z ?f=\\n(?f ?a=\\n(?a ?b=\\n(?b _b=\\n(_b ! 364: .di |o \" save overflow footnote ! 365: .nr ?o 1 ! 366: .nr _D \\n(dn ! 367: .ns ! 368: .. ! 369: .\" *** COMMANDS WITH VARIANT DEFINITIONS *** ! 370: .rn bp @b \" --- begin page ! 371: .de bp \" *** begin new page (overrides columns) ! 372: .nr $c \\n($m \" force new page, not new column ! 373: .ie \\n(nl>0 \ ! 374: . @b \\$1 ! 375: .el \ ! 376: \{\ ! 377: . if \\n(.$>0 \ ! 378: . pn \\$1 ! 379: . if \\n(?I \ ! 380: . @h \" 'spring' the header trap ! 381: .\} ! 382: .br ! 383: .wh 0 @h \" reset header ! 384: .. ! 385: .rn ll xl \" *** special line length (local) ! 386: .de ll \" *** line length (global to environments) ! 387: .xl \\$1 ! 388: .lt \\$1 ! 389: .nr $l \\n(.l ! 390: .if (\\n($m<=1):(\\n($l>\\n(_L) \ ! 391: . nr _L \\n(.l ! 392: .. ! 393: .rn po @O \" --- local page offset ! 394: .de po \" *** page offset ! 395: .@O \\$1 ! 396: .nr _o \\n(.o ! 397: .. ! 398: .\" *** MISCELLANEOUS ROFF COMMANDS *** ! 399: .de hx \" *** suppress headers and footers next page ! 400: .nr ?H 1 ! 401: .. ! 402: .de ix \" *** indent, no break ! 403: 'in \\$1 ! 404: .. ! 405: .de bl \" *** contiguous blank lines ! 406: .br ! 407: .ne \\$1 ! 408: .rs ! 409: .sp \\$1 ! 410: .. ! 411: .de n1 \" *** line numbering 1 ! 412: .nm 1 ! 413: .xl -\w'0000'u ! 414: .nr ?n 1 ! 415: .. ! 416: .de n2 \" *** line numbering 2 ! 417: .nm \\$1 ! 418: .ie \\n(.$ \ ! 419: . xl -\w'0000'u ! 420: .el \ ! 421: . xl \\n($lu ! 422: .. ! 423: .de pa \" *** new page ! 424: .bp \\$1 ! 425: .. ! 426: .de ro \" *** roman page numbers ! 427: .af % i ! 428: .. ! 429: .de ar \" *** arabic page numbers ! 430: .af % 1 ! 431: .. ! 432: .de m1 \" *** position one space ! 433: .nr _0 \\n(hmu ! 434: .nr hm \\$1v ! 435: .nr tm +\\n(hmu-\\n(_0u ! 436: .rr _0 ! 437: .. ! 438: .de m2 \" *** position two space ! 439: .nr tm \\n(hmu+\\n(tpp+\\$1v ! 440: .. ! 441: .de m3 \" *** position three space ! 442: .nr bm \\n(fmu+\\n(tpp+\\$1v ! 443: .. ! 444: .de m4 \" *** position four space ! 445: .nr _0 \\n(fmu ! 446: .nr fm \\$1v ! 447: .nr bm +\\n(fmu-\\n(_0u ! 448: .. ! 449: .de sk \" *** leave a blank page (next page) ! 450: .if \\n(.$>0 \ ! 451: . tm Line \\n(c. -- I cannot skip multiple pages ! 452: .nr ?s 1 ! 453: .. ! 454: .\" *** MISCELLANEOUS USER SUPPORT COMMANDS *** ! 455: .de re \" *** reset tabs (TROFF defines 15 stops default) ! 456: .ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i ! 457: .. ! 458: .if t .ig ! 459: .de re \" *** reset tabs (NROFF version) ! 460: .ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i ! 461: .. ! 462: .de ba \" *** set base indent ! 463: .ie \\n(.$ \ ! 464: . nr $i \\$1n ! 465: .el \ ! 466: . nr $i \\n(siu*\\n($0u ! 467: .. ! 468: .de hl \" *** draw horizontal line ! 469: .br ! 470: \l'\\n(.lu-\\n(.iu' ! 471: .sp ! 472: .. ! 473: .\" *** PARAGRAPHING *** ! 474: .de pp \" *** paragraph ! 475: .lp \\n(piu ! 476: .. ! 477: .de lp \" *** left aligned paragraph ! 478: .@p ! 479: .if \\n(.$ \ ! 480: . ti +\\$1 ! 481: .nr $p 0 1 ! 482: .. ! 483: .de ip \" *** indented paragraph w/ optional tag ! 484: .if (\\n(ii>0)&(\\n(ii<1n) \ ! 485: . nr ii \\n(iin ! 486: .nr _0 \\n(ii ! 487: .if \\n(.$>1 \ ! 488: . nr _0 \\$2n ! 489: .@p \\n(_0u ! 490: .if \\w"\\$1" \ ! 491: \{\ ! 492: . ti -\\n(_0u ! 493: . ie \\w"\\$1">=\\n(_0 \ ! 494: \{\ ! 495: \&\\$1 ! 496: . br ! 497: . \} ! 498: . el \&\\$1\h'|\\n(_0u'\c ! 499: .\} ! 500: .rr _0 ! 501: .. ! 502: .de np \" *** numbered paragraph ! 503: .if \\n($p<0 \ ! 504: . nr $p 0 \" reset number after .bu ! 505: .nr $p +1 \" increment paragraph number ! 506: .@p \w'\0(000)\0'u ! 507: .ti -\w'\0(000)\0'u ! 508: \0(\\n($p)\h'|\w'\0(000)\0'u'\c ! 509: .. ! 510: .de bu \" *** bulleted paragraph ! 511: .br ! 512: .if \\n($p<0 \ ! 513: . ns \" don't space between .bu paragraphs ! 514: .nr $p 0-1 \" mark "bulleted paragraph" mode ! 515: .@p \w'\0\(bu\0'u ! 516: .ti -\w'\0\(bu\0'u ! 517: \0\(bu\0\c ! 518: .. ! 519: .de @p \" --- initialize for paragraph ! 520: .@I \" initialize macro processor ! 521: .if "\\n(.z"|e" .tm Line \\n(c. -- Unmatched continued equation ! 522: .in \\n($iu+\\n(pou ! 523: .if \\n(.$ \ ! 524: . in +\\$1n ! 525: .ce 0 ! 526: .fi ! 527: .@F \\n(pf ! 528: .sz \\n(pp ! 529: .sp \\n(psu ! 530: .ne \\n(.Lv+\\n(.Vu ! 531: .ns ! 532: .. ! 533: .\" *** SECTION HEADINGS *** ! 534: .de sh \" &&& section heading ! 535: .rn sh @T ! 536: .so \\*(||/sh.me ! 537: .sh "\\$1" "\\$2" \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 ! 538: .rm @T ! 539: .. ! 540: .de $p \" $$$ print section heading ! 541: .if (\\n(si>0)&(\\n(.$>2) \ ! 542: . nr $i \\$3*\\n(si ! 543: .in \\n($iu ! 544: .ie !"\\$1\\$2"" \ ! 545: \{\ ! 546: . sp \\n(ssu \" one of them is non-null ! 547: . ne \\n(.Lv+\\n(.Vu+\\n(psu+(\\n(spu*\\n($ru*\\n(.Lu) ! 548: . ie \\n(.$>2 \ ! 549: . ti -(\\n(siu-\\n(sou) ! 550: . el \ ! 551: . ti +\\n(sou ! 552: . @F \\n(sf ! 553: . sz \\n(sp ! 554: . if \\$3>0 \ ! 555: . $\\$3 ! 556: . if \w"\\$2">0 \\$2. ! 557: . if \w"\\$1">0 \\$1\f1\ \ \& ! 558: .\} ! 559: .el \ ! 560: . sp \\n(psu ! 561: .@F \\n(pf ! 562: .sz \\n(pp ! 563: .. ! 564: .de uh \" *** unnumbered section heading ! 565: .rn uh @T ! 566: .so \\*(||/sh.me ! 567: .uh "\\$1" ! 568: .rm @T ! 569: .. ! 570: .\" *** COLUMNNED OUTPUT *** ! 571: .de 2c \" *** double columned output ! 572: .br ! 573: .if \\n($m>1 \ ! 574: . 1c \" revert to 1c if already 2c ! 575: .nr $c 1 ! 576: .nr $m 2 ! 577: .if \\n(.$>1 \ ! 578: . nr $m \\$2 ! 579: .if \\n(.$>0 \ ! 580: . nr $s \\$1n \" param 1: column seperation ! 581: .nr $l (\\n(.l-((\\n($m-1)*\\n($s))/\\n($m ! 582: .xl \\n($lu ! 583: .mk _k ! 584: .ns ! 585: .. ! 586: .de 1c \" *** single columned output ! 587: .br ! 588: .nr $c 1 ! 589: .nr $m 1 ! 590: .ll \\n(_Lu \" return to normal output ! 591: .sp |\\n(.hu ! 592: .@O \\n(_ou ! 593: .. ! 594: .de bc \" *** begin column ! 595: .sp 24i ! 596: .. ! 597: .\" *** FLOATING TABLES AND NONFLOATING BLOCKS *** ! 598: .de (z \" &&& begin floating keep ! 599: .rn (z @V ! 600: .so \\*(||/float.me ! 601: .(z \\$1 \\$2 ! 602: .rm @V ! 603: .. ! 604: .de )z \" &&& end floating keep ! 605: .tm Line \\n(c. -- unmatched .)z ! 606: .. ! 607: .de (t \" XXX temp ref to (z ! 608: .(z \\$1 \\$2 ! 609: .. ! 610: .de )t \" XXX temp ref to )t ! 611: .)z \\$1 \\$2 ! 612: .. ! 613: .de (b \" *** begin block ! 614: .br ! 615: .@D 3 \\$1 \\$2 ! 616: .sp \\n(bsu ! 617: .@( ! 618: .. ! 619: .de )b \" *** end block ! 620: .br ! 621: .@) ! 622: .if (\\n(bt=0):(\\n(.t<\\n(bt) \ ! 623: . ne \\n(dnu \" make it all on one page ! 624: .ls 1 ! 625: .nf ! 626: .|k ! 627: .ec ! 628: .fi ! 629: .in 0 ! 630: .xl \\n($lu ! 631: .ev ! 632: .rm |k ! 633: .sp \\n(bsu+\\n(.Lv-1v ! 634: .. ! 635: .de @( \" --- begin keep ! 636: .if !"\\n(.z"" .tm Line \\n(c. -- Illegal nested keep \\n(.z ! 637: .@M ! 638: .di |k ! 639: \!'rs ! 640: .. ! 641: .de @M \" --- set modes for display ! 642: .nr ?k 1 ! 643: .@C 1 ! 644: .@F \\n(df ! 645: .vs \\n(.su*\\n($Ru ! 646: .nf ! 647: .if "\\*(|p"F" \ ! 648: . fi \" set fill mode if "F" parameter ! 649: .if \\n(_d=4 \ ! 650: . in 0 ! 651: .if \\n(_d=3 \ ! 652: \{\ ! 653: . in +\\n(biu ! 654: . xl -\\n(biu ! 655: .\} ! 656: .if \\n(_d=1 \ ! 657: . ce 10000 ! 658: .. ! 659: .de @) \" --- end keep ! 660: .br ! 661: .if !"\\n(.z"|k" .tm Line \\n(c. -- Close of a keep which has never been opened ! 662: .nr ?k 0 ! 663: .di ! 664: .in 0 ! 665: .ce 0 ! 666: .. ! 667: .de (c \" *** begin block centered text ! 668: .if "\\n(.z"|c" .tm Line \\n(c. -- Nested .(c requests ! 669: .di |c ! 670: .. ! 671: .de )c \" *** end block centered text ! 672: .if !"\\n(.z"|c" .tm Line \\n(c. -- Unmatched .)c ! 673: .br \" force out final line ! 674: .di ! 675: .if \n@>4 .tm >> .)c .l=\\n(.l .i=\\n(.i $i=\\n($i dl=\\n(dl ! 676: .ev 1 ! 677: .ls 1 ! 678: .in (\\n(.lu-\\n(.iu-\\n(dlu)/2u ! 679: .if \n@>4 .tm -- .)c << .in .l=\\n(.l .i=\\n(.i dl=\\n(dl ! 680: .nf ! 681: .|c ! 682: .ec ! 683: .in ! 684: .ls ! 685: .ev ! 686: .rm |c ! 687: .. ! 688: .\" *** BLOCK QUOTES (OR WHATEVER) AND LISTS *** ! 689: .de (q \" *** begin block quote ! 690: .br ! 691: .@C 1 ! 692: .fi ! 693: .sp \\n(qsu ! 694: .in +\\n(qiu ! 695: .xl -\\n(qiu ! 696: .sz \\n(qp ! 697: .. ! 698: .de )q \" *** end block quote ! 699: .br ! 700: .ev ! 701: .sp \\n(qsu+\\n(.Lv-1v ! 702: .nr ?k 0 ! 703: .. ! 704: .de (l \" *** begin list ! 705: .br ! 706: .sp \\n(bsu ! 707: .@D 3 \\$1 \\$2 ! 708: .@M ! 709: .. ! 710: .de )l \" *** end list ! 711: .br ! 712: .ev ! 713: .sp \\n(bsu+\\n(.Lv-1v ! 714: .nr ?k 0 ! 715: .. ! 716: .\" *** PREPROCESSOR SUPPORT *** ! 717: .\" ! 718: .\" EQN ! 719: .\" ! 720: .de EQ \" &&& begin equation ! 721: .rn EQ @T ! 722: .so \\*(||/eqn.me ! 723: .EQ \\$1 \\$2 ! 724: .rm @T ! 725: .. ! 726: .\" ! 727: .\" TBL ! 728: .\" ! 729: .de TS \" &&& begin table ! 730: .rn TS @W ! 731: .so \\*(||/tbl.me ! 732: .TS \\$1 \\$2 ! 733: .rm @W ! 734: .. ! 735: .\" ! 736: .\" REFER ! 737: .\" ! 738: .de ]- \" &&& initialize reference ! 739: .rn ]- @] ! 740: .so \\*(||/refer.me ! 741: .]- ! 742: .rm @] ! 743: .. ! 744: .de ]< \" &&& initialize reference ! 745: .rn ]< @] ! 746: .so \\*(||/refer.me ! 747: .]< ! 748: .rm @] ! 749: .. ! 750: .if n .ds [. " [ ! 751: .if t .ds [. \s-2\v'-.4m'\f1 ! 752: .if n .ds .] ] ! 753: .if t .ds .] \v'.4m'\s+2\fP ! 754: .if n .ds <. " ! 755: .if t .ds <. . ! 756: .if n .ds >. . ! 757: .if t .ds >. " ! 758: .\" ! 759: .\" IDEAL ! 760: .\" ! 761: .de IS \" *** start ideal picture ! 762: .nr g7 \\n(.u ! 763: .ls 1 ! 764: .. ! 765: .de IF ! 766: .if \\n(g7 .fi ! 767: .ls ! 768: .. ! 769: .de IE \" *** end ideal picture ! 770: .if \\n(g7 .fi ! 771: .ls ! 772: .. ! 773: .\" ! 774: .\" PIC ! 775: .\" ! 776: .de PS \" *** start picture: $1=height, $2=width in units ! 777: .if t \ ! 778: . sp 0.3 ! 779: .in (\\n(.lu-\\$2u)/2u ! 780: .ne \\$1u ! 781: .nr g7 \\n(.u ! 782: .ls 1 ! 783: .. ! 784: .de PE \" *** end picture ! 785: .ls ! 786: .in ! 787: .if \\n(g7 .fi ! 788: .if t .sp .6 ! 789: .. ! 790: .\" ! 791: .\" GREMLIN ! 792: .\" ! 793: .de GS \" *** start gremlin picture ! 794: .nr g7 (\\n(.lu-\\n(g1u)/2u ! 795: .if "\\$1"L" .nr g7 \\n(.iu ! 796: .if "\\$1"R" .nr g7 \\n(.lu-\\n(g1u ! 797: .in \\n(g7u ! 798: .nr g7 \\n(.u ! 799: .ls 1 ! 800: .nf ! 801: .ne \\n(g2u ! 802: .. ! 803: .de GE \" *** end gremlin picture ! 804: .GF ! 805: .if t .sp .6 ! 806: .. ! 807: .de GF \" *** finish gremlin picture; stay at top ! 808: .ls ! 809: .in ! 810: .if \\n(g7 .fi ! 811: .. ! 812: .\" *** FONT AIDS *** ! 813: .de sz \" *** set point size and vertical spacing ! 814: .ps \\$1 ! 815: .vs \\n(.su*\\n($ru \" default vs at pointsize + 20% ! 816: .bd S B \\n(.su/3u ! 817: .. ! 818: .de r \" *** enter roman font ! 819: .nr _F \\n(.f ! 820: .ul 0 ! 821: .ft 1 ! 822: .if \\n(.$ \&\\$1\f\\n(_F\\$2 ! 823: .rr _F ! 824: .. ! 825: .de i \" *** enter italic ! 826: .nr _F \\n(.f ! 827: .ul 0 ! 828: .ft 2 ! 829: .if \\n(.$ \&\\$1\f\\n(_F\\$2 ! 830: .rr _F ! 831: .. ! 832: .de b \" *** enter boldface (underline in NROFF) ! 833: .nr _F \\n(.f ! 834: .ul 0 ! 835: .ft \\n($b ! 836: .if \\n(.$ \&\\$1\f\\n(_F\\$2 ! 837: .rr _F ! 838: .. ! 839: .de rb \" *** enter real boldface (not underlined in NROFF) ! 840: .nr _F \\n(.f ! 841: .ul 0 ! 842: .ft 3 ! 843: .if \\n(.$ \&\\$1\f\\n(_F\\$2 ! 844: .rr _F ! 845: .. ! 846: .de u \" *** enter underlined word ! 847: \&\\$1\l'|0\(ul'\\$2 ! 848: .. ! 849: .de q \" *** enter quoted word ! 850: \&\\*(lq\\$1\\*(rq\\$2 ! 851: .. ! 852: .de bi \" *** enter word in bold italics ! 853: .ft 2 ! 854: .ie t \&\k~\\$1\h'|\\n~u+(\\w' 'u/4u)'\\$1\fP\\$2 ! 855: .el \&\\$1\fP\\$2 ! 856: .. ! 857: .de bx \" *** enter boxed word ! 858: .ie \\n($T \&\f2\\$1\fP\\$2 ! 859: .el \k~\(br\|\\$1\|\(br\l'|\\n~u\(rn'\l'|\\n~u\(ul'\^\\$2 ! 860: .. ! 861: .de sm \" *** print in smaller font ! 862: \s-1\\$1\\s0\\$2 ! 863: .. ! 864: .de @F \" --- change font (8 -> underlined, 0 -> no change) ! 865: .nr ~ \\$1 ! 866: .if \\n~>0 \ ! 867: \{\ ! 868: . ul 0 ! 869: . if \\n~>4 \ ! 870: . nr ~ \\n($b ! 871: . ft \\n~ ! 872: .\} ! 873: .rr ~ ! 874: .. ! 875: .\" *** FOOTNOTING *** ! 876: .de (f \" &&& begin footnote ! 877: .rn (f @U ! 878: .so \\*(||/footnote.me ! 879: .(f \\$1 \\$2 ! 880: .rm @U ! 881: .. ! 882: .de )f \" &&& end footnote ! 883: .tm Line \\n(c. -- unmatched .)f ! 884: .. ! 885: .de $s \" $$$ footnote separator ! 886: \l'2i' ! 887: .if n \ ! 888: . sp 0.3 ! 889: .. ! 890: .\" *** DELAYED TEXT *** ! 891: .de (d \" &&& begin delayed text ! 892: .rn (d @U ! 893: .so \\*(||/deltext.me ! 894: .(d \\$1 \\$2 ! 895: .rm @U ! 896: .. ! 897: .de )d \" &&& end delayed text ! 898: .tm Line \\n(c. -- unmatched .)d ! 899: .. ! 900: .\" *** INDEXES (TABLE OF CONTENTS) *** ! 901: .de (x \" &&& begin index ! 902: .rn (x @U ! 903: .so \\*(||/index.me ! 904: .(x \\$1 \\$2 ! 905: .rm @U ! 906: .. ! 907: .de )x \" &&& end index entry ! 908: .tm Line \\n(c. -- unmatched .)x ! 909: .. ! 910: .\" *** STUFF FOR "STANDARD" PAPERS *** ! 911: .de th \" *** set "thesis" mode ! 912: .so \\*(||/thesis.me ! 913: .rm th ! 914: .. ! 915: .de +c \" *** begin chapter ! 916: .ep \" force out footnotes ! 917: .if \\n(?o:\\n(?a \ ! 918: \{\ ! 919: . bp \" force out a table or more footnote ! 920: . rs ! 921: . ep ! 922: .\} ! 923: .nr ?C 1 ! 924: .nr $f 1 1 ! 925: .ds * \\*[1\\*]\k* ! 926: .if \\n(?R \ ! 927: . pn 1 ! 928: .bp ! 929: .in \\n($iu \" reset the indent ! 930: .rs ! 931: .ie \\n(.$ \ ! 932: . $c "\\$1" ! 933: .el \ ! 934: . sp 3 ! 935: .. ! 936: .de ++ \" *** declare chapter type ! 937: .nr _0 0 ! 938: .if "\\$1"C" \ ! 939: . nr _0 1 \" chapter ! 940: .if "\\$1"RC" \ ! 941: . nr _0 11 \" renumbered chapter ! 942: .if "\\$1"A" \ ! 943: . nr _0 2 \" appendix ! 944: .if "\\$1"RA" \ ! 945: . nr _0 12 \" renumbered appendix ! 946: .if "\\$1"P" \ ! 947: . nr _0 3 \" preliminary material ! 948: .if "\\$1"B" \ ! 949: . nr _0 4 \" bibliographic material ! 950: .if "\\$1"AB" \ ! 951: . nr _0 5 \" abstract ! 952: .if \\n(_0=0 \ ! 953: . tm Line \\n(c. -- Bad mode to .++ ! 954: .nr ?R 0 ! 955: .if \\n(_0>10 \ ! 956: .\{ ! 957: . nr ?R 1 ! 958: . nr _0 -10 ! 959: .\} ! 960: .nr ch 0 1 ! 961: .if (\\n(_0=3):(\\n(_0=5) \ ! 962: . pn 1 \" must do before .ep ! 963: .ep \" end page for correct page number types ! 964: .if \\n(_0=1 \ ! 965: \{\ ! 966: . af ch 1 ! 967: . af % 1 ! 968: .\} ! 969: .if \\n(_0=2 \ ! 970: \{\ ! 971: . af ch A ! 972: . af % 1 ! 973: .\} ! 974: .if \\n(_0=3 \ ! 975: . af % i ! 976: .if \\n(_0=4 \ ! 977: . af % 1 ! 978: .if \\n(_0=5 \ ! 979: . af % 1 ! 980: .if \\n(.$>1 \ ! 981: . he \\$2 ! 982: .if !\\n(_0=\\n(_M .if \\n(_M=3 \ ! 983: . pn 1 ! 984: .nr _M \\n(_0 ! 985: .rr _0 ! 986: .. ! 987: .de $c \" $$$ print chapter title ! 988: .sz 12 ! 989: .ft B ! 990: .ce 1000 ! 991: .if \\n(_M<3 \ ! 992: . nr ch +1 ! 993: .ie \\n(_M=1 CHAPTER\ \ \\n(ch ! 994: .el .if \\n(_M=2 APPENDIX\ \ \\n(ch ! 995: .if \w"\\$1" .sp 3-\\n(.L ! 996: .if \w"\\$1" \\$1 ! 997: .if (\\n(_M<3):(\w"\\$1") \ ! 998: . sp 4-\\n(.L ! 999: .ce 0 ! 1000: .ft ! 1001: .sz ! 1002: .ie \\n(_M=1 \ ! 1003: . $C Chapter \\n(ch "\\$1" ! 1004: .el .if \\n(_M=2 \ ! 1005: . $C Appendix \\n(ch "\\$1" ! 1006: .. ! 1007: .de tp \" *** title page ! 1008: .hx ! 1009: .bp ! 1010: .br ! 1011: .rs ! 1012: .pn \\n% ! 1013: .. ! 1014: .de ac \" *** setup for ACM photo-ready paper ! 1015: .rn ac @T ! 1016: .so \\*(||/acm.me ! 1017: .ac "\\$1" "\\$2" ! 1018: .rm @T ! 1019: .. ! 1020: .de lo \" *** pull in the set of local macros ! 1021: .\" all these macros should be named "*X", where X is any letter ! 1022: .so \\*(||/local.me ! 1023: .rm lo ! 1024: .. ! 1025: .de lh \" *** letterhead ! 1026: .so \\*(||/letterhead.me ! 1027: .. ! 1028: .\" *** DATES *** ! 1029: .if \n(mo=1 .ds mo January ! 1030: .if \n(mo=2 .ds mo February ! 1031: .if \n(mo=3 .ds mo March ! 1032: .if \n(mo=4 .ds mo April ! 1033: .if \n(mo=5 .ds mo May ! 1034: .if \n(mo=6 .ds mo June ! 1035: .if \n(mo=7 .ds mo July ! 1036: .if \n(mo=8 .ds mo August ! 1037: .if \n(mo=9 .ds mo September ! 1038: .if \n(mo=10 .ds mo October ! 1039: .if \n(mo=11 .ds mo November ! 1040: .if \n(mo=12 .ds mo December ! 1041: .if \n(dw=1 .ds dw Sunday ! 1042: .if \n(dw=2 .ds dw Monday ! 1043: .if \n(dw=3 .ds dw Tuesday ! 1044: .if \n(dw=4 .ds dw Wednesday ! 1045: .if \n(dw=5 .ds dw Thursday ! 1046: .if \n(dw=6 .ds dw Friday ! 1047: .if \n(dw=7 .ds dw Saturday ! 1048: .ds td \*(mo \n(dy, 19\n(yr ! 1049: .\" *** PARAMETRIC INITIALIZATIONS *** ! 1050: .if (1m<0.1i)&(\nx!=0) \ ! 1051: . vs 9p \" for 12-pitch DTC terminals ! 1052: .rr x ! 1053: .nr $r \n(.v/\n(.s \" ratio of vs to ps for .sz request ! 1054: .nr $R \n($r \" ratio for displays & footnotes ! 1055: .nr hm 4v \" header margin ! 1056: .nr tm 7v \" top margin ! 1057: .nr bm 6v \" bottom margin ! 1058: .nr fm 3v \" footer margin ! 1059: .nr tf 3 \" title font: (real) Times Bold ! 1060: .nr tp 10 \" title point size ! 1061: .hy 14 ! 1062: .nr bi 4m \" indent for blocks ! 1063: .nr pi 5n \" indent for paragraphs ! 1064: .nr pf 1 \" normal text font ! 1065: .nr pp 10 \" normal text point size ! 1066: .nr qi 4n \" indent for quotes ! 1067: .nr qp -1 \" down one point ! 1068: .nr ii 5n \" indent for .ip's and .np's ! 1069: .nr $m 1 \" max number of columns ! 1070: .nr $s 4n \" column separation ! 1071: .ds || /usr/lib/me ! 1072: .if \n@>0 .ds || . ! 1073: .bd S B 3 ! 1074: .\" *** OTHER INITIALIZATION *** ! 1075: .ds [ \u\x'-0.25v' ! 1076: .ds ] \d ! 1077: .ds < \d\x'0.25v' ! 1078: .ds > \u ! 1079: .ds - -- ! 1080: .if t \ ! 1081: \{\ ! 1082: . ds [ \v'-0.4m'\x'-0.2m'\s-3 ! 1083: . ds ] \s0\v'0.4m' ! 1084: . ds < \v'0.4m'\x'0.2m'\s-3 ! 1085: . ds > \s0\v'-0.4m' ! 1086: . ds - \(em ! 1087: . nr fi 0.3i ! 1088: .\} ! 1089: .if n \ ! 1090: \{\ ! 1091: . nr fi 3n ! 1092: .\} ! 1093: .nr _o \n(.o ! 1094: .if n .po 1i ! 1095: .if \n(.V=1v \ ! 1096: . nr $T 2 ! 1097: .if n .if \n(.T=0 \ ! 1098: . nr $T 1 ! 1099: .if \nv=2 \ ! 1100: \{\ ! 1101: . nr $T 0 ! 1102: . po -0.5i \" make ugly line on LHS on C/A/T typesetters ! 1103: .\} ! 1104: .if \n($T \ ! 1105: \{\ ! 1106: . if \n($T=1 \ ! 1107: . po 0 ! 1108: . ds [ [ ! 1109: . ds ] ] ! 1110: . ds < < ! 1111: . ds > > ! 1112: .\} ! 1113: .nr $b \nb \" figure the real font 8 font ! 1114: .rr b ! 1115: .if \n($b=0 \ ! 1116: \{\ ! 1117: . if n .nr $b 2 \" italic ! 1118: . if t .nr $b 3 \" bold ! 1119: .\} ! 1120: .nr ps 0.5v \" paragraph pre/post spacing ! 1121: .if \n($T \ ! 1122: . nr ps 1v ! 1123: .if t .nr ps 0.35v ! 1124: .nr bs \n(ps \" block pre/post spacing ! 1125: .nr qs \n(ps \" quote pre/post spacing ! 1126: .nr zs 1v \" float-block pre/postspacing ! 1127: .nr xs 0.2v \" index prespacing ! 1128: .nr fs 0.2v \" footnote prespacing ! 1129: .if \n($T \ ! 1130: . nr fs 0 ! 1131: .if n .nr es 1v \" equation pre/postspacing ! 1132: .if t .nr es 0.5v ! 1133: .wh 0 @h \" set header ! 1134: .nr $l \n(.lu \" line length ! 1135: .nr _L \n(.lu \" line length of page ! 1136: .nr $c 1 \" current column number ! 1137: .nr $f 1 1 \" footnote number ! 1138: .ds * \*[1\*]\k*\" \" footnote "name" ! 1139: .nr $d 1 1 \" delayed text number ! 1140: .ds # [1]\k#\" \" delayed text "name" ! 1141: .nr _M 1 \" chapter mode is chapter ! 1142: .ds lq \&"\" \" left quote ! 1143: .ds rq \&"\" \" right quote ! 1144: .if t \ ! 1145: . ds lq `` ! 1146: .if t \ ! 1147: . ds rq '' ! 1148: .em @z ! 1149: .\" *** FOREIGN LETTERS AND SPECIAL CHARACTERS *** ! 1150: .de sc \" *** define special characters ! 1151: .so \\*(||/chars.me ! 1152: .rm sc ! 1153: .. ! 1154: .ll 6.0i ! 1155: .lt 6.0i
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.