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