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