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