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