* tmac/fr.tmac: Handle chapter system for `me'.
[s-roff.git] / tmac / s.tmac
blobb43fd45430c7b8bc2de7c341c22c8b64b5202787
1 .\" -*- nroff -*-
2 .ig
4 s.tmac
6 Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003, 2004
7   Free Software Foundation, Inc.
8      Written by James Clark (jjc@jclark.com)
10 This file is part of groff.
12 groff is free software; you can redistribute it and/or modify it under
13 the terms of the GNU General Public License as published by the Free
14 Software Foundation; either version 2, or (at your option) any later
15 version.
17 groff is distributed in the hope that it will be useful, but WITHOUT ANY
18 WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 for more details.
22 You should have received a copy of the GNU General Public License along
23 with groff; see the file COPYING.  If not, write to the Free Software
24 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA.
26 .if !\n(.g .ab These ms macros require groff.
27 .if \n(.C \
28 .       ab The groff ms macros do not work in compatibility mode.
29 .\" Enable warnings (only if none are given on the command line).
30 .\" You can delete this if you want.
31 .if (\n[.warn] == 65543) .warn
32 .\" See if already loaded.
33 .if r GS .nx
34 .mso devtag.tmac
35 .nr GS 1
36 .nr need_eo_h 0
37 .nr need_eo_tl 0
38 .de @error
39 .tm \\n(.F:\\n(.c: macro error: \\$*
41 .de @warning
42 .tm \\n(.F:\\n(.c: macro warning: \\$*
44 .de @fatal
45 .ab \\n(.F:\\n(.c: fatal macro error: \\$*
47 .de @not-implemented
48 .@error sorry, \\$0 not implemented
49 .als \\$0 @nop
51 .als TM @not-implemented
52 .als CT @not-implemented
53 .de @nop
55 .de @init
56 .if !rPO .nr PO \\n(.o
57 .\" a non-empty environment
58 .ev ne
60 .ev
61 .ev nf
62 'nf
63 .ev
65 .ds REFERENCES References
66 .ds ABSTRACT ABSTRACT
67 .ds TOC Table of Contents
68 .ds MONTH1 January
69 .ds MONTH2 February
70 .ds MONTH3 March
71 .ds MONTH4 April
72 .ds MONTH5 May
73 .ds MONTH6 June
74 .ds MONTH7 July
75 .ds MONTH8 August
76 .ds MONTH9 September
77 .ds MONTH10 October
78 .ds MONTH11 November
79 .ds MONTH12 December
80 .ds MO \E*[MONTH\n[mo]]
81 .ds DY \n[dy] \*[MO] \n[year]
82 .de ND
83 .if \\n[.$] .ds DY "\\$*
85 .de DA
86 .if \\n[.$] .ds DY "\\$*
87 .ds CF \\*[DY]
89 .\" indexing
90 .de IX
91 .tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[PN]
93 .\" print an error message and then try to recover
94 .de @error-recover
95 .@error \\$@ (recovering)
96 .nr *pop-count 0
97 .while !'\\n(.z'' \{\
98 .       \"@warning automatically terminating diversion \\n(.z
99 .       ie d @div-end!\\n(.z .@div-end!\\n(.z
100 .       el .*div-end-default
101 .       nr *pop-count +1
102 .       \" ensure that we don't loop forever
103 .       if \\n[*pop-count]>20 .@fatal recovery failed
105 .while !'\\n[.ev]'0' .ev
106 .par@reset-env
107 .par@reset
109 .de *div-end-default
110 .ds *last-div \\n(.z
113 .ev nf
114 .\\*[*last-div]
117 .\" ****************************
118 .\" ******** module cov ********
119 .\" ****************************
120 .\" Cover sheet and first page.
121 .de cov*err-not-after-first-page
122 .@error \\$0 is not allowed after the first page has started
124 .de cov*err-not-before-tl
125 .@error \\$0 is not allowed before TL
127 .de cov*err-not-again
128 .@error \\$0 is not allowed more than once
130 .de cov*err-not-after-ab
131 .@error \\$0 is not allowed after first AB, LP, PP, IP, SH or NH
133 .als AU cov*err-not-before-tl
134 .als AI cov*err-not-before-tl
135 .als AB cov*err-not-before-tl
136 .de cov*first-page-init
137 .rm cov*first-page-init
138 .par@init
139 .als RP cov*err-not-after-first-page
140 .@init
141 .ie \\n[cov*rp-format] \{\
142 .       pg@cs-top
143 .       als FS cov*FS
144 .       als FE cov*FE
146 .el \{\
147 .       pg@top
148 .       als FS @FS
149 .       als FE @FE
151 .wh 0 pg@top
152 .CHECK-FOOTER-AND-KEEP
154 .wh 0 cov*first-page-init
155 .\" This handles the case where FS occurs before TL or LP.
156 .de FS
158 \\*[FS]\\
160 .nr cov*rp-format 0
161 .nr cov*rp-no 0
162 .\" released paper format
163 .de RP
164 .nr cov*rp-format 1
165 .if \\n[.$] .if '\\$1'no' .nr cov*rp-no 1
166 .if rPO .po \\n(POu
167 .pn 0
169 .de TL
171 .als TL cov*err-not-again
172 .rn @AB AB
173 .rn @AU AU
174 .rn @AI AI
175 .di cov*tl-div
176 .par@reset
177 .ft B
178 .ps +2
179 .vs +3p
180 .ll (u;\\n[LL]*5/6)
181 .nr cov*n-au 0
182 .DEVTAG-TL
184 .de @AU
185 .par@reset
186 .if !'\\n(.z'' \{\
187 .       br
188 .       di
190 .nr cov*n-au +1
191 .di cov*au-div!\\n[cov*n-au]
193 .ft I
194 .ie (\\n[PS] >= 1000) \
195 .       ps (\\n[PS]z / 1000u)
196 .el \
197 .       ps \\n[PS]
199 .de @AI
200 .par@reset
201 .if !'\\n(.z'' \{\
202 .       br
203 .       di
205 .ie !\\n[cov*n-au] .@error AI before AU
206 .el \{\
207 .       di cov*ai-div!\\n[cov*n-au]
208 .       nf
209 .       ft R
210 .       ie (\\n[PS] >= 1000) \
211 .               ps (\\n[PS]z / 1000u)
212 .       el \
213 .               ps \\n[PS]
216 .de LP
217 .if !'\\n[.z]'' \{\
218 .       br
219 .       di
222 .cov*ab-init
223 .cov*print
224 \\*[\\$0]\\
226 .als IP LP
227 .als PP LP
228 .als XP LP
229 .als QP LP
230 .als RS LP
231 .als NH LP
232 .als SH LP
233 .als MC LP
234 .als RT LP
235 .als XS LP
236 .de cov*ab-init
237 .als cov*ab-init @nop
238 .als LP @LP
239 .als IP @IP
240 .als PP @PP
241 .als XP @XP
242 .als RT @RT
243 .als XS @XS
244 .als SH @SH
245 .als NH @NH
246 .als QP @QP
247 .als RS @RS
248 .als RE @RE
249 .als QS @QS
250 .als QE @QE
251 .als MC @MC
252 .als EQ @EQ
253 .als EN @EN
254 .als TS @TS
255 .als AB cov*err-not-after-ab
256 .als AU par@AU
257 .als AI par@AI
258 .als TL par@TL
260 .de @AB
261 .if !'\\n(.z'' \{\
262 .       br
263 .       di
265 .cov*ab-init
266 .ie '\*(.T'html' \{\
267 .       cov*tl-au-print
268 .       als cov*tl-au-print @nop
270 .el .di cov*ab-div
271 .par@ab-indent
272 .par@reset
273 .if !'\\$1'no' \{\
274 .       if '\*(.T'html'  \{\
275 .               nf
276 .               sp
277 .       \}
278 .       ft I
279 .       ce 1
280 \\*[ABSTRACT]
281 .       sp
282 .       ft R
285 .@PP
286 .if '\*(.T'html' \{\
287 .       cov*tl-au-print
288 .       als cov*tl-au-print @nop
289 .       par@reset-env
290 .       par@reset
291 .       cov*print
294 .de AE
295 .ie '\*(.T'html' \{\
296 .       als AE cov*err-not-again
298 .el \{\
299 .  ie '\\n(.z'cov*ab-div' \{\
300 .       als AE cov*err-not-again
301 .       br
302 .       di
303 .\"     nr cov*ab-height \\n[dn]
304 .       par@reset-env
305 .       par@reset
306 .       cov*print
307 .  \}
308 .  el .@error AE without AB
311 .de @div-end!cov*ab-div
314 .de cov*print
315 .als cov*print @nop
316 .ie d cov*tl-div \{\
317 .       ie \\n[cov*rp-format] .cov*rp-print
318 .       el .cov*draft-print
320 .el \{\
321 .       if \\n[cov*rp-format] \{\
322 .               @warning RP format but no TL
323 .               bp 1
324 .               als FS @FS
325 .               als FE @FE
326 .               CHECK-FOOTER-AND-KEEP
327 .       \}
328 .       br
331 .de cov*rp-print
332 .nr cov*page-length \\n[.p]
333 .pl 1000i
334 .cov*tl-au-print
335 .sp 3
336 .if d cov*ab-div \{\
337 .  if !'\*(.T'html'  .  nf
338 .       cov*ab-div
340 .sp 3
341 .par@reset
342 \\*[DY]
344 .if \\n[cov*fn-height] \{\
345 .       sp |(u;\\n[cov*page-length]-\\n[FM]\
346 -\\n[cov*fn-height]-\\n[fn@sep-dist]>?\\n[nl])
347 .       fn@print-sep
348 .       ev nf
349 .       cov*fn-div
350 .       ev
351 .       ie \\n[cov*rp-no] .rm cov*fn-div
352 .       el \{\
353 .               rn cov*fn-div fn@overflow-div
354 .               nr fn@have-overflow 1
355 .       \}
357 .als FS @FS
358 .als FE @FE
359 .CHECK-FOOTER-AND-KEEP
360 .\" If anything was printed below where the footer line is normally printed,
361 .\" then that's an overflow.
362 .if -\\n[FM]/2+1v+\\n[cov*page-length]<\\n[nl] .@error cover sheet overflow
363 .pl \\n[cov*page-length]u
364 .bp 1
365 .if !\\n[cov*rp-no] .cov*tl-au-print
367 .sp 1
369 .de cov*draft-print
370 .cov*tl-au-print
371 .if d cov*ab-div \{\
372 .       nf
373 .       sp 2
374 .       cov*ab-div
376 .sp 1
378 .de cov*tl-au-print
379 .par@reset
382 .sp 3
383 .ce 9999
384 .if d cov*tl-div \{\
385 .    cov*tl-div
386 .    DEVTAG-EO-TL
388 .nr cov*i 1
389 .nr cov*sp 1v
390 .while \\n[cov*i]<=\\n[cov*n-au] \{\
391 .       ie '\*(.T'html' .br
392 .       el .sp \\n[cov*sp]u
393 .       cov*au-div!\\n[cov*i]
394 .       ie d cov*ai-div!\\n[cov*i] \{\
395 .               sp .5v  
396 .               cov*ai-div!\\n[cov*i]
397 .               nr cov*sp 1v
398 .       \}
399 .       el .nr cov*sp .5v
400 .       nr cov*i +1
402 .ce 0
404 .nr cov*fn-height 0
405 .nr cov*in-fn 0
406 .\" start of footnote on cover
407 .de cov*FS
408 .if \\n[cov*in-fn] \{\
409 .       @error nested FS
410 .       FE
412 .nr cov*in-fn 1
413 .ev fn
414 .par@reset-env
415 .da cov*fn-div
416 .if !\\n[cov*fn-height] .ns
417 .ie \\n[.$] .FP "\\$1" no
418 .el .@LP
420 .de @div-end!cov*fn-div
421 .cov*FE
423 .\" end of footnote on cover
424 .de cov*FE
425 .ie '\\n(.z'cov*fn-div' \{\
426 .       br
427 .       ev
428 .       di
429 .       nr cov*in-fn 0
430 .       nr cov*fn-height +\\n[dn]
432 .el .@error FE without matching FS
434 .\" ***************************
435 .\" ******** module pg ********
436 .\" ***************************
437 .\" Page-level formatting.
438 .\" > 0 if we have a footnote on the current page
439 .nr pg@fn-flag 0
440 .nr pg@colw 0
441 .nr pg@fn-colw 0
442 .nr HM 1i
443 .nr FM 1i
444 .ds LF
445 .ds CF
446 .ds RF
447 .ds LH
448 .ds CH -\En[PN]-
449 .ds RH
450 .ds pg*OH '\E*[LH]'\E*[CH]'\E*[RH]'
451 .ds pg*EH '\E*[LH]'\E*[CH]'\E*[RH]'
452 .ds pg*OF '\E*[LF]'\E*[CF]'\E*[RF]'
453 .ds pg*EF '\E*[LF]'\E*[CF]'\E*[RF]'
454 .de OH
455 .ds pg*\\$0 "\\$*
457 .als EH OH
458 .als OF OH
459 .als EF OH
460 .de PT
461 .ie \\n%=1 .if \\n[pg*P1] .tl \\*[pg*OH]
462 .el \{\
463 .       ie o .tl \\*[pg*OH]
464 .       el .tl \\*[pg*EH]
467 .de BT
468 .ie o .tl \\*[pg*OF]
469 .el .tl \\*[pg*EF]
471 .nr pg*P1 0
472 .de P1
473 .ie r bell_localisms \{\
474 .       DS L
475 .       ft CW
477 .el .nr pg*P1 1
479 .wh -\n[FM]u pg@bottom
480 .wh -\n[FM]u/2u pg*footer
481 .nr MINGW 2n
482 .nr pg@ncols 1
483 .de @MC
484 .if !'\\n(.z'' .error-recover MC while diversion open
486 .ie \\n[pg@ncols]>1 .pg@super-eject
487 .el \{\
488 .       \" flush out any floating keeps
489 .       while \\n[kp@tail]>\\n[kp@head] \{\
490 .               rs
491 .               bp
492 .       \}
494 .ie !\\n(.$ \{\
495 .       nr pg@colw \\n[LL]*7/15
496 .       nr pg*gutw \\n[LL]-(2*\\n[pg@colw])
497 .       nr pg@ncols 2
499 .el \{\
500 .       nr pg@colw (n;\\$1)<?\\n[LL]
501 .       ie \\n[.$]<2 .nr pg*gutw \\n[MINGW]
502 .       el .nr pg*gutw (n;\\$2)
503 .       nr pg@ncols \\n[LL]-\\n[pg@colw]/(\\n[pg@colw]+\\n[pg*gutw])+1
504 .       ie \\n[pg@ncols]>1 \
505 .               nr pg*gutw \\n[LL]-(\\n[pg@ncols]*\\n[pg@colw])/(\\n[pg@ncols]-1)
506 .       el .nr pg*gutw 0
508 .DEVTAG ".mc \\n[pg@ncols] \\n[pg@colw] \\n[pg*gutw]"
509 .mk pg*col-top
511 .nr pg*col-num 0
512 .nr pg@fn-colw \\n[pg@colw]*5/6
513 .par@reset
515 .de 2C
518 .de 1C
519 .MC \\n[LL]u
521 .\" top of page macro
522 .de pg@top
523 .ch pg*footer -\\n[FM]u/2u
524 .nr PN \\n%
525 .nr pg*col-num 0
526 .nr pg@fn-bottom-margin 0
527 .po \\n[PO]u
528 .ev h
529 .par@reset
530 .sp (u;\\n[HM]/2)
532 .sp |\\n[HM]u
533 .if d HD .HD
534 .mk pg@header-bottom
536 .mk pg*col-top
537 .pg*start-col
539 .de pg*start-col
540 .\" Handle footnote overflow before floating keeps, because the keep
541 .\" might contain an embedded footnote.
542 .fn@top-hook
543 .kp@top-hook
544 .tbl@top-hook
547 .de pg@cs-top
548 .sp \\n[HM]u
549 .\" move pg@bottom and pg*footer out of the way
550 .ch pg@bottom \\n[.p]u*2u
551 .ch pg*footer \\n[.p]u*2u
554 .de pg@bottom
555 .tbl@bottom-hook
556 .if \\n[pg@fn-flag] .fn@bottom-hook
557 .nr pg*col-num +1
558 .ie \\n[pg*col-num]<\\n[pg@ncols] .pg*end-col
559 .el .pg*end-page
561 .de pg*end-col
562 'sp |\\n[pg*col-top]u
563 .po (u;\\n[PO]+(\\n[pg@colw]+\\n[pg*gutw]*\\n[pg*col-num]))
564 .\"po +(u;\\n[pg@colw]+\\n[pg*gutw])
565 .pg*start-col
567 .de pg*end-page
568 .po \\n[PO]u
569 .\" Make sure we don't exit if there are still floats or footnotes left-over.
570 .ie \\n[kp@head]<\\n[kp@tail]:\\n[fn@have-overflow] \{\
571 .       \" Switching environments ensures that we don't get an unnecessary
572 .       \" blank line at the top of the page.
573 .       ev ne
574 '       bp
575 .       ev
577 .el \{\
578 .       \" If the text has ended and there are no more footnotes or keeps, exit.
579 .       if \\n[pg@text-ended] .ex
580 .       if r pg*next-number \{\
581 .               pn \\n[pg*next-number]
582 .               rr pg*next-number
583 .               if d pg*next-format \{\
584 .                       af PN \\*[pg*next-format]
585 .                       rm pg*next-format
586 .               \}
587 .       \}
588 '       bp
591 .\" pg@begin number format
592 .de pg@begin
593 .ie \\n[.$]>0 \{\
594 .       nr pg*next-number (;\\$1)
595 .       ie \\n[.$]>1 .ds pg*next-format \\$2
596 .       el .rm pg*next-format
598 .el .rr pg*next-number
599 .pg@super-eject
601 .\" print the footer line
602 .de pg*footer
603 .ev h
604 .par@reset
608 .\" flush out any keeps or footnotes
609 .de pg@super-eject
611 .if !'\\n(.z'' .@error-recover diversion open while ejecting page
612 .\" Make sure we stay in the end macro while there is still footnote overflow
613 .\" left, or floating keeps.
614 .while \\n[kp@tail]>\\n[kp@head]:\\n[pg@fn-flag] \{\
615 .       rs
616 .       bp
620 .nr pg@text-ended 0
621 .de pg@end-text
623 .nr pg@text-ended 1
624 .pg@super-eject
626 .em pg@end-text
627 .\" ***************************
628 .\" ******** module fn ********
629 .\" ***************************
630 .\" Footnotes.
631 .nr fn@sep-dist 8p
632 .ev fn
633 .\" Round it vertically
634 .vs \n[fn@sep-dist]u
635 .nr fn@sep-dist \n[.v]
637 .nr fn*text-num 0 1
638 .nr fn*note-num 0 1
639 .ds * \E*[par@sup-start]\En+[fn*text-num]\E*[par@sup-end]
640 .nr fn*open 0
641 .\" normal FS
642 .de @FS
643 .ie \\n[.$] .fn*do-FS "\\$1" no
644 .el \{\
645 .       ie \\n[fn*text-num]>\\n[fn*note-num] .fn*do-FS \\n+[fn*note-num]
646 .       el .fn*do-FS
649 .\" Second argument of `no' means don't embellish the first argument.
650 .de fn*do-FS
651 .if \\n[fn*open] .@error-recover nested FS
652 .nr fn*open 1
653 .if \\n[.u] \{\
654 .       \" Ensure that the first line of the footnote is on the same page
655 .       \" as the reference.  I think this is minimal.
656 .       ev fn
657 .       nr fn*need 1v
658 .       ev
659 .       ie \\n[pg@fn-flag] .nr fn*need +\\n[fn:PD]
660 .       el .nr fn*need +\\n[fn@sep-dist]
661 .       ne \\n[fn*need]u+\\n[.V]u>?0
663 .ev fn
664 .par@reset-env
665 .fn*start-div
666 .par@reset
667 .ie \\n[.$] .FP \\$@
668 .el .@LP
670 .de @FE
671 .ie !\\n[fn*open] .@error FE without FS
672 .el \{\
673 .       nr fn*open 0
674 .       br
675 .       ev
676 .       fn*end-div
679 .nr fn@have-overflow 0
680 .\" called at the top of each column
681 .de fn@top-hook
682 .nr fn*max-width 0
683 .nr fn*page-bottom-pos 0-\\n[FM]-\\n[pg@fn-bottom-margin]
684 .ch pg@bottom \\n[fn*page-bottom-pos]u
685 .if \\n[fn@have-overflow] \{\
686 .       nr fn@have-overflow 0
687 .       fn*start-div
688 .       ev nf
689 .       fn@overflow-div
690 .       ev
691 .       fn*end-div
694 .\" This is called at the bottom of the column if pg@fn-flag is set.
695 .de fn@bottom-hook
696 .nr pg@fn-flag 0
697 .nr fn@have-overflow 0
698 .nr fn@bottom-pos \\n[.p]-\\n[FM]-\\n[pg@fn-bottom-margin]+\\n[.v]
699 .ev fn
700 .nr fn@bottom-pos -\\n[.v]
702 .ie \\n[nl]+\\n[fn@sep-dist]+\n[.V]>\\n[fn@bottom-pos] \{\
703 .       rn fn@div fn@overflow-div
704 .       nr fn@have-overflow 1
706 .el \{\
707 .       if \\n[pg@ncols]>1 \
708 .               if \\n[fn*max-width]>\\n[pg@fn-colw] \
709 .                       nr pg@fn-bottom-margin \\n[.p]-\\n[FM]-\\n[nl]+1v
710 .       wh \\n[fn@bottom-pos]u fn*catch-overflow
711 .       fn@print-sep
712 .       ev nf
713 .       fn@div
714 .       rm fn@div
715 .       ev
716 .       if '\\n(.z'fn@overflow-div' \{\
717 .               di
718 .               nr fn@have-overflow \\n[dn]>0
719 .       \}
720 .       ch fn*catch-overflow
723 .de fn*catch-overflow
724 .di fn@overflow-div
726 .nr fn*embed-count 0
727 .de @div-end!fn@div
729 .if '\\n[.ev]'fn' .ev
730 .fn*end-div
731 .nr fn*open 0
733 .als @div-end!fn*embed-div @div-end!fn@div
734 .de fn*start-div
735 .ie '\\n(.z'' \{\
736 .       da fn@div
737 .       if !\\n[pg@fn-flag] .ns
739 .el .di fn*embed-div
741 .de fn*end-div
742 .ie '\\n(.z'fn@div' \{\
743 .       di
744 .       nr fn*page-bottom-pos -\\n[dn]
745 .       nr fn*max-width \\n[fn*max-width]>?\\n[dl]
746 .       if !\\n[pg@fn-flag] .nr fn*page-bottom-pos -\\n[fn@sep-dist]
747 .       nr pg@fn-flag 1
748 .       nr fn*page-bottom-pos \\n[nl]-\\n[.p]+\n[.V]>?\\n[fn*page-bottom-pos]
749 .       ch pg@bottom \\n[fn*page-bottom-pos]u
751 .el \{\
752 .       ie '\\n(.z'fn*embed-div' \{\
753 .       di
754 .               rn fn*embed-div fn*embed-div!\\n[fn*embed-count]
755 \!.             fn*embed-start \\n[fn*embed-count]
756 .               rs
757 '               sp (u;\\n[dn]+\\n[fn@sep-dist]+\\n[.V])
758 \!.             fn*embed-end
759 .               nr fn*embed-count +1
760 .       \}
761 .       el \{\
762 .               ev fn
763 .               @error-recover unclosed diversion within footnote
764 .       \}
767 .de fn*embed-start
768 .ie '\\n(.z'' \{\
769 .       fn*start-div
770 .       ev nf
771 .       fn*embed-div!\\$1
772 .       rm fn*embed-div!\\$1
773 .       ev
774 .       fn*end-div
775 .       di fn*null
777 .el \{\
778 \!.     fn*embed-start \\$1
779 .       rs
782 .de fn*embed-end
783 .ie '\\n(.z'fn*null' \{\
784 .       di
785 .       rm fn*null
787 .el \!.fn*embed-end
789 .\" It's important that fn@print-sep use up exactly fn@sep-dist vertical space.
790 .de fn@print-sep
791 .ev fn
792 .in 0
793 .vs \\n[fn@sep-dist]u
794 \D'l 1i 0'
798 .\" ***************************
799 .\" ******** module kp ********
800 .\" ***************************
801 .\" Keeps.
802 .de KS
804 .di kp*div
806 .de KF
807 .if !'\\n(.z'' .@error-recover KF while open diversion
808 .di kp*fdiv
809 .ev k
810 .par@reset-env
811 .par@reset
813 .de KE
814 .ie '\\n(.z'kp*div' .kp*end
815 .el \{\
816 .       ie '\\n(.z'kp*fdiv' .kp*fend
817 .       el .@error KE without KS or KF
820 .de @div-end!kp*div
821 .kp*end
823 .de @div-end!kp*fdiv
824 .kp*fend
826 .de kp*need
827 .ie '\\n(.z'' .ds@need \\$1
828 .el \!.kp*need \\$1
830 .\" end non-floating keep
831 .de kp*end
834 .kp*need \\n[dn]
835 .ev nf
836 .kp*div
838 .rm kp*div
840 .\" Floating keeps.
841 .nr kp@head 0
842 .nr kp@tail 0
843 .\" end floating keep
844 .de kp*fend
848 .ie \\n[.t]-(\\n[.k]>0*1v)>\\n[dn] \{\
849 .       br
850 .       ev nf
851 .       kp*fdiv
852 .       rm kp*fdiv
853 .       ev
855 .el \{\
856 .       rn kp*fdiv kp*div!\\n[kp@tail]
857 .       nr kp*ht!\\n[kp@tail] 0\\n[dn]
858 .       nr kp@tail +1
861 .\" top of page processing for KF
862 .nr kp*doing-top 0
863 .de kp@top-hook
864 .if !\\n[kp*doing-top] \{\
865 .       nr kp*doing-top 1
866 .       kp*do-top
867 .       nr kp*doing-top 0
870 .de kp*do-top
871 .\" If the first keep won't fit, only force it out if we haven't had a footnote
872 .\" and we're at the top of the page.
873 .nr kp*force \\n[pg@fn-flag]=0&(\\n[nl]<=\\n[pg@header-bottom])
874 .nr kp*fits 1
875 .while \\n[kp@tail]>\\n[kp@head]&\\n[kp*fits] \{\
876 .       ie \\n[.t]>\\n[kp*ht!\\n[kp@head]]:\\n[kp*force] \{\
877 .               nr kp*force 0
878 .               \" It's important to advance kp@head before bringing
879 .               \" back the keep, so that if the last line of the
880 .               \" last keep springs the bottom of page trap, a new
881 .               \" page will not be started unnecessarily.
882 .               rn kp*div!\\n[kp@head] kp*temp
883 .               nr kp@head +1
884 .               ev nf
885 .               kp*temp
886 .               ev
887 .               rm kp*temp
888 .       \}
889 .       el .nr kp*fits 0
892 .\" ***************************
893 .\" ******** module ds ********
894 .\" ***************************
895 .\" Displays and non-floating keeps.
896 .de DE
897 .ds*end!\\n[\\n[.ev]:ds-type]
898 .nr \\n[.ev]:ds-type 0
900 .de ds@auto-end
901 .if \\n[\\n[.ev]:ds-type] \{\
902 .       @error automatically terminating display
903 .       DE
906 .de @div-end!ds*div
907 .ie \\n[\\n[.ev]:ds-type] .DE
908 .el .ds*end!2
910 .de ds*end!0
911 .@error DE without DS, ID, CD, LD or BD
913 .de LD
915 .nr \\n[.ev]:ds-type 1
916 .par@reset
918 .sp \\n[DD]u
920 .de ID
922 .ie \\n[.$] .in +(n;\\$1)
923 .el .in +\\n[DI]u
925 .de CD
927 .ce 9999
929 .de RD
931 .rj 9999
933 .de ds*common-end
934 .par@reset
935 .sp \\n[DD]u
937 .als ds*end!1 ds*common-end
938 .de BD
940 .nr \\n[.ev]:ds-type 2
941 .di ds*div
943 .de ds*end!2
945 .ie '\\n(.z'ds*div' \{\
946 .       di
947 .       nf
948 .       in (u;\\n[.l]-\\n[dl]/2>?0)
949 .       ds*div
950 .       rm ds*div
951 .       ds*common-end
953 .el .@error-recover mismatched DE
955 .de DS
957 .di ds*div
958 .ie '\\$1'B' \{\
959 .       LD
960 .       nr \\n[.ev]:ds-type 4
962 .el \{\
963 .       ie '\\$1'L' .LD
964 .       el \{\
965 .               ie '\\$1'C' .CD
966 .               el \{\
967 .                       ie '\\$1'R' .RD
968 .                       el \{\
969 .                               ie '\\$1'I' .ID \\$2
970 .                               el .ID \\$1
971 .                       \}
972 .               \}
973 .       \}
974 .       nr \\n[.ev]:ds-type 3
977 .de ds@need
978 .if '\\n(.z'' \{\
979 .       while \\n[.t]<=(\\$1)&(\\n[nl]>\\n[pg@header-bottom]) \{\
980 .               rs
981 '               sp \\n[.t]u
982 .       \}
985 .de ds*end!3
987 .ie '\\n(.z'ds*div' \{\
988 .       di
989 .       ds@need \\n[dn]
990 .       ev nf
991 .       ds*div
992 .       ev
993 .       rm ds*div
994 .       ds*common-end
996 .el .@error-recover mismatched DE
998 .de ds*end!4
999 .ie '\\n(.z'ds*div' \{\
1000 .       br
1001 .       di
1002 .       nf
1003 .       in (u;\\n[.l]-\\n[dl]/2>?0)
1004 .       ds@need \\n[dn]
1005 .       ds*div
1006 .       rm ds*div
1007 .       ds*common-end
1009 .el .@error-recover mismatched DE
1011 .\" ****************************
1012 .\" ******** module par ********
1013 .\" ****************************
1014 .\" Paragraph-level formatting.
1015 .\" Load time initialization.
1016 .de par@load-init
1017 .\" PS and VS might have been set on the command-line
1018 .if !rPS .nr PS 10
1019 .if !rLL .nr LL 6i
1020 .ll \\n[LL]u
1021 .\" don't set LT so that it can be defaulted from LL
1022 .ie rLT .lt \\n[LT]u
1023 .el .lt \\n[LL]u
1024 .ie (\\n[PS] >= 1000) \
1025 .       ps (\\n[PS]z / 1000u)
1026 .el \
1027 .       ps \\n[PS]
1028 .\" don't set VS so that it can be defaulted from PS
1029 .ie rVS \{\
1030 .       ie (\\n[VS] >= 1000) \
1031 .               par*vs "(\\n[VS]p / 1000u)"
1032 .       el \
1033 .               par*vs \\n[VS]
1035 .el \{\
1036 .       ie (\\n[PS] >= 1000) \
1037 .               par*vs "((\\n[PS]p / 1000u) + 2p)"
1038 .       el \
1039 .               par*vs "(\\n[PS] + 2)"
1041 .if dFAM .fam \\*[FAM]
1042 .if !rHY .nr HY 14
1043 .hy \\n[HY]
1045 .CHECK-FOOTER-AND-KEEP
1047 .de par*vs
1048 .\" If it's too big to be in points, treat it as units.
1049 .ie (p;\\$1)>=40p .vs (u;\\$1)
1050 .el .vs (p;\\$1)
1052 .de par@ab-indent
1053 .nr 0:li (u;\\n[LL]/12)
1054 .nr 0:ri \\n[0:li]
1056 .de par*env-init
1057 .aln \\n[.ev]:PS PS
1058 .aln \\n[.ev]:VS VS
1059 .aln \\n[.ev]:LL LL
1060 .aln \\n[.ev]:MCLL LL
1061 .aln \\n[.ev]:LT LT
1062 .aln \\n[.ev]:MCLT LT
1063 .aln \\n[.ev]:PI PI
1064 .aln \\n[.ev]:PD PD
1065 .ad \\n[par*adj]
1066 .par@reset-env
1068 .\" happens when the first page begins
1069 .de par@init
1070 .if !rLT .nr LT \\n[LL]
1071 .if !rFL .nr FL \\n[LL]*5/6
1072 .if !rVS \{\
1073 .       ie (\\n[PS] >= 1000) \
1074 .               nr VS (\\n[PS] + 2000)
1075 .       el \
1076 .               nr VS (\\n[PS] + 2)
1078 .if !rDI .nr DI .5i
1079 .if !rFPS \{\
1080 .       ie (\\n[PS] >= 1000) \
1081 .               nr FPS (\\n[PS] - 2000)
1082 .       el \
1083 .               nr FPS (\\n[PS] - 2)
1085 .if !rFVS \{\
1086 .       ie (\\n[FPS] >= 1000) \
1087 .               nr FVS (\\n[FPS] + 2000)
1088 .       el \
1089 .               nr FVS (\\n[FPS] + 2)
1091 .\" don't change environment 0
1092 .ev h
1093 .ie (\\n[PS] >= 1000) \
1094 .       ps (\\n[PS]z / 1000u)
1095 .el \
1096 .       ps \\n[PS]
1097 .if !rQI .nr QI 5n
1098 .if !rPI .nr PI 5n
1099 .ie (\\n[VS] >= 1000) \
1100 .       par*vs "(\\n[VS]p / 1000u)"
1101 .el \
1102 .       par*vs \\n[VS]
1103 .if !rPD .nr PD .3v>?\n(.V
1104 .if !rDD .nr DD .5v>?\n(.V
1105 .if !rFI .nr FI 2n
1106 .if !rFPD .nr FPD \\n[PD]/2
1108 .if !dFAM .ds FAM \\n[.fam]
1109 .nr par*adj \\n[.j]
1110 .par*env-init
1111 .ev h
1112 .par*env-init
1114 .ev fn
1115 .par*env-init
1117 .ev k
1118 .par*env-init
1120 .aln 0:MCLL pg@colw
1121 .aln 0:MCLT pg@colw
1122 .aln k:MCLL pg@colw
1123 .aln k:MCLT pg@colw
1124 .aln fn:PS FPS
1125 .aln fn:VS FVS
1126 .aln fn:LL FL
1127 .aln fn:LT FL
1128 .aln fn:PI FI
1129 .aln fn:PD FPD
1130 .aln fn:MCLL pg@fn-colw
1131 .aln fn:MCLT pg@fn-colw
1133 .de par@reset-env
1134 .nr \\n[.ev]:il 0
1135 .nr \\n[.ev]:li 0
1136 .nr \\n[.ev]:ri 0
1137 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1138 .nr \\n[.ev]:pli 0
1139 .nr \\n[.ev]:pri 0
1140 .nr \\n[.ev]:ds-type 0
1142 .\" par@reset
1143 .de par@reset
1145 .if \\n[need_eo_tl]>0 .DEVTAG-EO-TL
1146 .nr need_eo_tl 0
1147 .if \\n[need_eo_h]>0 .DEVTAG-EO-H
1148 .nr need_eo_h 0
1149 .ce 0
1150 .rj 0
1151 .ul 0
1153 .ie \\n[pg@ncols]>1 \{\
1154 .       ll (u;\\n[\\n[.ev]:MCLL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
1155 .       lt \\n[\\n[.ev]:MCLT]u
1157 .el \{\
1158 .       ll (u;\\n[\\n[.ev]:LL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
1159 .       lt \\n[\\n[.ev]:LT]u
1161 .in (u;\\n[\\n[.ev]:li]+\\n[\\n[.ev]:pli])
1162 .ft 1
1163 .fam \\*[FAM]
1164 .ie (\\n[\\n[.ev]:PS] >= 1000) \
1165 .       ps (\\n[\\n[.ev]:PS]z / 1000u)
1166 .el \
1167 .       ps \\n[\\n[.ev]:PS]
1168 .ie (\\n[\\n[.ev]:VS] >= 1000) \
1169 .       par*vs "(\\n[\\n[.ev]:VS]p / 1000u)"
1170 .el \
1171 .       par*vs \\n[\\n[.ev]:VS]
1172 .ls 1
1174 .hy \\n[HY]
1176 .de @RT
1177 .nr \\n[.ev]:pli 0
1178 .nr \\n[.ev]:pri 0
1179 .par@reset
1181 .\" This can be redefined by the user.
1182 .de TA
1183 .ta T 5n
1185 .\" \n[PORPHANS] sets number of initial lines of any paragraph,
1186 .\" which must be kept together, without any included page break.
1187 .\" Initialise to reproduce original behaviour; user may adjust it.
1188 .if !rPORPHANS .nr PORPHANS 1
1190 .de par*start
1191 .ds@auto-end
1192 .nr \\n[.ev]:pli \\$1
1193 .nr \\n[.ev]:pri \\$2
1194 .par@reset
1195 .sp \\n[\\n[.ev]:PD]u
1196 .ne \\n[PORPHANS]v+\\n(.Vu
1198 .de par@finish
1199 .nr \\n[.ev]:pli 0
1200 .nr \\n[.ev]:pri 0
1201 .par@reset
1203 .\" normal LP
1204 .de @LP
1205 .par*start 0 0
1206 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1208 .de @PP
1209 .par*start 0 0
1210 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1211 .if !'\*(.T'html' .ti +\\n[\\n[.ev]:ai]u
1213 .de @QP
1214 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1215 .par*start \\n[QI] \\n[QI]
1217 .de @XP
1218 .par*start \\n[\\n[.ev]:PI] 0
1219 .ti -\\n[\\n[.ev]:PI]u
1221 .de @IP
1222 .if \\n[.$]>1 .nr \\n[.ev]:ai (n;\\$2)
1223 .par*start \\n[\\n[.ev]:ai] 0
1224 .if !'\\$1'' \{\
1225 .       \" Divert the label so as to freeze any spaces.
1226 .       di par*label
1227 .       par*push-tag-env
1228 \&\\$1
1229 .       par*pop-tag-env
1230 .       di
1231 .       chop par*label
1232 .       ti -\\n[\\n[.ev]:ai]u
1233 .       ie \\n[dl]+1n<=\\n[\\n[.ev]:ai] \{\
1234 .               DEVTAG-COL 1
1235 \\*[par*label]\h'|\\n[\\n[.ev]:ai]u'\c
1236 .               DEVTAG-COL 2
1237 .       \}
1238 .       el \{\
1239 .               DEVTAG-COL 1
1240 \\*[par*label]
1241 .               DEVTAG-COL-NEXT 2
1242 .               br
1243 .       \}
1244 .       rm par*label
1247 .\" We don't want margin characters to be attached when we divert
1248 .\" the tag.  Since there's no way to save and restore the current
1249 .\" margin character, we have to switch to a new environment, taking
1250 .\" what we need of the old environment with us.
1251 .de par*push-tag-env
1252 .nr par*saved-font \\n[.f]
1253 .nr par*saved-size \\n[.s]z
1254 .nr par*saved-ss \\n[.ss]
1255 .ds par*saved-fam \\n[.fam]
1256 .ev par
1259 .ft \\n[par*saved-font]
1260 .ps \\n[par*saved-size]u
1261 .ss \\n[par*saved-ss]
1262 .fam \\*[par*saved-fam]
1264 .de par*pop-tag-env
1267 .de @RS
1269 .nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
1270 .nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
1271 .nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
1272 .nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
1273 .nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
1274 .nr \\n[.ev]:il +1
1275 .nr \\n[.ev]:li +\\n[\\n[.ev]:ai]
1276 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1277 .par@reset
1279 .de @RE
1281 .ie \\n[\\n[.ev]:il] \{\
1282 .       nr \\n[.ev]:il -1
1283 .       nr \\n[.ev]:ai \\n[\\n[.ev]:ai!\\n[\\n[.ev]:il]]
1284 .       nr \\n[.ev]:li \\n[\\n[.ev]:li!\\n[\\n[.ev]:il]]
1285 .       nr \\n[.ev]:ri \\n[\\n[.ev]:ri!\\n[\\n[.ev]:il]]
1286 .       nr \\n[.ev]:pli \\n[\\n[.ev]:pli!\\n[\\n[.ev]:il]]
1287 .       nr \\n[.ev]:pri \\n[\\n[.ev]:pri!\\n[\\n[.ev]:il]]
1289 .el .@error unbalanced \\$0
1290 .par@reset
1292 .de @QS
1294 .nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
1295 .nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
1296 .nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
1297 .nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
1298 .nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
1299 .nr \\n[.ev]:il +1
1300 .nr \\n[.ev]:li +\\n[QI]
1301 .nr \\n[.ev]:ri +\\n[QI]
1302 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1303 .par@reset
1305 .als @QE @RE
1306 .\" start boxed text
1307 .de B1
1309 .HTML-IMAGE
1310 .di par*box-div
1311 .nr \\n[.ev]:li +1n
1312 .nr \\n[.ev]:ri +1n
1313 .nr par*box-in \\n[.in]
1314 .\" remember what 1n is, just in case the point size changes
1315 .nr par*box-n 1n
1316 .in +1n
1317 .ll -1n
1318 .lt -1n
1319 .ti \\n[par*box-in]u+1n
1321 .de @div-end!par*box-div
1324 .\" end boxed text
1325 .\" Postpone the drawing of the box until we're in the top-level diversion,
1326 .\" in case there's a footnote inside the box.
1327 .de B2
1328 .ie '\\n(.z'par*box-div' \{\
1329 .       br
1330 .       if \n[.V]>.25m .sp
1331 .       di
1332 .       if \n[.V]>.25m .sp
1333 .       ds@need \\n[dn]
1334 .       par*box-mark-top
1335 .       ev nf
1336 .       par*box-div
1337 .       ev
1338 .       nr \\n[.ev]:ri -\\n[par*box-n]
1339 .       nr \\n[.ev]:li -\\n[par*box-n]
1340 .       in -\\n[par*box-n]u
1341 .       ll +\\n[par*box-n]u
1342 .       lt +\\n[par*box-n]u
1343 .       par*box-draw \\n[.i]u \\n[.l]u-(\\n[.H]u==1n*1n)
1345 .el .@error B2 without B1
1346 .HTML-IMAGE-END
1348 .de par*box-mark-top
1349 .ie '\\n[.z]'' \{\
1350 .       rs
1351 .       mk par*box-top
1353 .el \!.par*box-mark-top
1355 .de par*box-draw
1356 .ie '\\n[.z]'' \{\
1357 .       nr par*box-in \\n[.i]
1358 .       nr par*box-ll \\n[.l]
1359 .       nr par*box-vpt \\n[.vpt]
1360 .       nr par*box-ad \\n[.j]
1361 .       ad l
1362 .       vpt 0
1363 .       in \\$1
1364 .       ll \\$2
1365 \v'-1v+.25m'\
1366 \D'l (u;\\n[.l]-\\n[.i]) 0'\
1367 \D'l 0 |\\n[par*box-top]u'\
1368 \D'l -(u;\\n[.l]-\\n[.i]) 0'\
1369 \D'l 0 -|\\n[par*box-top]u'
1370 .       br
1371 .       sp -1
1372 .       in \\n[par*box-in]u
1373 .       ll \\n[par*box-ll]u
1374 .       vpt \\n[par*box-vpt]
1375 .       ad \\n[par*box-ad]
1377 .el \!.par*box-draw \\$1 \\$2
1379 .\" \n[HORPHANS] sets how many lines of the following paragraph must be
1380 .\" kept together, with a preceding section header.  Initialise it,
1381 .\" to reproduce original behaviour; user may change it.
1382 .if !rHORPHANS .nr HORPHANS 1
1384 .\" \n[GROWPS] and \n[PSINCR] cause auto-increment of header point size.
1385 .\" Initialise them, so they have no effect, unless explicitly set by the user.
1386 .if !rGROWPS .nr GROWPS 0
1387 .if !rPSINCR .nr PSINCR 1p
1389 .de SH-NO-TAG
1390 .par@finish
1391 .\" Keep the heading and the first few lines of the next paragraph together.
1392 .\" (\n[HORPHANS] defines "first few" -- default = 1; user may redefine it).
1393 .nr sh*minvs \\n[HORPHANS]v
1394 .if \\n[sh*psincr]<0 .nr sh*psincr 0
1395 .ie \\n(VS<1000 .par*vs \\n(VSp+\\n[sh*psincr]u
1396 .el .par*vs \\n(VSp/1000u+\\n[sh*psincr]u
1397 .ne 2v+\\n[sh*minvs]u+\\n[\\n[.ev]:PD]u+\\n(.Vu
1398 .\" Adjust point size for heading text, as specified by \n[GROWPS] and \n[PSINCR].
1399 .ie \\n(PS<1000 .ps \\n(PS+\\n[sh*psincr]u
1400 .el .ps \\n(PSz/1000u+\\n[sh*psincr]u
1401 .sp 1
1402 .ft B
1404 .de @SH
1405 .\" Standard ms implementation does not expect an argument,
1406 .\" but allow ".SH n" to make heading point size match ".NH n",
1407 .\" for same "n", when \n[GROWPS] and \n[PSINCR] are set.
1408 .  nr sh*psincr 0
1409 .  if 0\\$1>0 .nr sh*psincr (\\n[GROWPS]-0\\$1)*\\n[PSINCR]
1410 .  SH-NO-TAG
1411 .  DEVTAG-SH 1
1412 .  if '\*(.T'html' .nr need_eo_h 1
1414 .\" TL, AU, and AI are aliased to these in cov*ab-init.
1415 .de par@TL
1416 .par@finish
1417 .sp 1
1418 .ft B
1419 .ps +2
1420 .vs +3p
1421 .ce 9999
1422 .DEVTAG-TL
1423 .nr need_eo_tl 1
1425 .de par@AU
1426 .par@finish
1427 .sp 1
1428 .ft I
1429 .ce 9999
1431 .de par@AI
1432 .par@finish
1433 .sp .5
1434 .ce 9999
1436 .\" In paragraph macros.
1437 .de NL
1438 .ie (\\n[\\n[.ev]:PS] >= 1000) \
1439 .       ps (\\n[\\n[.ev]:PS]z / 1000u)
1440 .el \
1441 .       ps \\n[\\n[.ev]:PS]
1443 .de SM
1444 .ps -2
1446 .de LG
1447 .ps +2
1449 .de R
1450 .ft R
1452 .\" par*define-font-macro macro font
1453 .de par*define-font-macro
1454 .de \\$1
1455 .ie \En[.$] \{\
1456 .       nr par*prev-font \En[.f]
1457 \&\E$3\f[\\$2]\E$1\f[\En[par*prev-font]]\E$2
1459 .el .ft \\$2
1460 \\..
1462 .par*define-font-macro B B
1463 .par*define-font-macro I I
1464 .par*define-font-macro BI BI
1465 .par*define-font-macro CW CR
1466 .\" underline a word
1467 .de UL
1468 \Z'\\$1'\v'.25m'\D'l \w'\\$1'u 0'\v'-.25m'\\$2
1470 .\" box a word
1471 .de BX
1472 .nr par*bxw \w'\\$1'+.4m
1473 \Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
1474 \Z'\h'.2m'\\$1'\
1475 \h'\\n[par*bxw]u'
1477 .\" The first time UX is used, put a registered mark after it.
1478 .ds par*ux-rg \(rg
1479 .de UX
1480 \s[\\n[.s]*8u/10u]UNIX\s0\\$1\\*[par*ux-rg]
1481 .ds par*ux-rg
1483 .ds par@sup-start \v'-.9m\s'\En[.s]*7u/10u'+.7m'
1484 .als { par@sup-start
1485 .ds par@sup-end \v'-.7m\s0+.9m'
1486 .als } par@sup-end
1487 .\" footnote paragraphs
1488 .\" FF is the footnote format
1489 .nr FF 0
1490 .\" This can be redefined. It gets a second argument of `no' if the first
1491 .\" argument was supplied by the user, rather than automatically.
1492 .de FP
1494 .if !d par*fp!\\n[FF] \{\
1495 .       @error unknown footnote format `\\n[FF]'
1496 .       nr FF 0
1498 .ie '\\$2'no' .par*fp!\\n[FF]-no "\\$1"
1499 .el .par*fp!\\n[FF] "\\$1"
1501 .de par*fp!0
1502 .@PP
1503 \&\\*[par@sup-start]\\$1\\*[par@sup-end]\ \c
1505 .de par*fp!0-no
1506 .@PP
1507 \&\\$1\ \c
1509 .de par*fp!1
1510 .@PP
1511 \&\\$1.\ \c
1513 .de par*fp!1-no
1514 .@PP
1515 \&\\$1\ \c
1517 .de par*fp!2
1518 .@LP
1519 \&\\$1.\ \c
1521 .de par*fp!2-no
1522 .@LP
1523 \&\\$1\ \c
1525 .de par*fp!3
1526 .@IP "\\$1." (u;\\n[\\n[.ev]:PI]*2)
1528 .de par*fp!3-no
1529 .@IP "\\$1" (u;\\n[\\n[.ev]:PI]*2)
1531 .\" ***************************
1532 .\" ******** module nh ********
1533 .\" ***************************
1534 .\" Numbered headings.
1535 .\" nh*hl is the level of the last heading
1536 .nr nh*hl 0
1537 .\" SN-DOT and SN-NO-DOT represent the section number of
1538 .\" the current heading, with and without a terminating dot.
1539 .ds SN-DOT
1540 .ds SN-NO-DOT
1541 .\" SN-STYLE sets the statement numbering style used in headings
1542 .\" (either SN-DOT or SN-NO-DOT); for backward compatibility with
1543 .\" earlier ms versions, the default is SN-DOT
1544 .als SN-STYLE SN-DOT
1545 .\" Also for backward compatibility, let SN represent SN-DOT.
1546 .als SN SN-DOT
1547 .\" numbered heading
1548 .de @NH
1549 .ie '\\$1'S' \{\
1550 .       shift
1551 .       nr nh*hl 0
1552 .       while \\n[.$] \{\
1553 .               nr nh*hl +1
1554 .               nr H\\n[nh*hl] 0\\$1
1555 .               shift
1556 .       \}
1557 .       if !\\n[nh*hl] \{\
1558 .               nr H1 1
1559 .               nr nh*hl 1
1560 .               @error missing arguments to .NH S
1561 .       \}
1563 .el \{\
1564 .       nr nh*ohl \\n[nh*hl]
1565 .       ie \\n[.$] \{\
1566 .               nr nh*hl 0\\$1
1567 .               ie \\n[nh*hl]<=0 \{\
1568 .                       nr nh*ohl 0
1569 .                       nr nh*hl 1
1570 .               \}
1571 .               el \{\
1572 .                       if \\n[nh*hl]-\\n[nh*ohl]>1 \
1573 .                               @warning .NH \\n[nh*ohl] followed by .NH \\n[nh*hl]
1574 .               \}
1575 .       \}
1576 .       el .nr nh*hl 1
1577 .       while \\n[nh*hl]>\\n[nh*ohl] \{\
1578 .               nr nh*ohl +1
1579 .               nr H\\n[nh*ohl] 0
1580 .       \}
1581 .       nr H\\n[nh*hl] +1
1583 .ds SN-NO-DOT \\n(H1
1584 .nr nh*i 1
1585 .while \\n[nh*i]<\\n[nh*hl] \{\
1586 .       nr nh*i +1
1587 .       as SN-NO-DOT .\\n[H\\n[nh*i]]
1589 .ds SN-DOT \\*[SN-NO-DOT].
1590 .nr sh*psincr (\\n[GROWPS]-\\n[nh*hl])*\\n[PSINCR]
1591 .SH-NO-TAG
1592 .DEVTAG-NH "\\$1"
1593 .  if '\*(.T'html' .nr need_eo_h 1
1594 \\*[SN-STYLE]
1596 .\" ****************************
1597 .\" ******** module toc ********
1598 .\" ****************************
1599 .\" Table of contents generation.
1600 .de @XS
1601 .da toc*div
1602 .ev h
1603 .ie \\n[.$] .XA "\\$1"
1604 .el .XA
1606 .de @div-end!toc*div
1609 .de XA
1610 .ie '\\n(.z'toc*div' \{\
1611 .       if d toc*num .toc*end-entry
1612 .       ie \\n[.$] \{\
1613 .               ie '\\$1'no' .ds toc*num
1614 .               el .ds toc*num "\\$1
1615 .       \}
1616 .       el .ds toc*num \\n[PN]
1617 .       br
1618 .       par@reset
1619 .       na
1620 .       ll -8n
1621 .       in (n;0\\$2)
1623 .el .@error XA without XS
1625 .de XE
1626 .ie '\\n(.z'toc*div' \{\
1627 .       if d toc*num .toc*end-entry
1628 .       ev
1629 .       di
1631 .el .@error XE without XS
1633 .de toc*end-entry
1634 \\a\\t\\*[toc*num]
1636 .rm toc*num
1638 .de PX
1640 .if !'\\$1'no' \{\
1641 .       ce 1
1642 .       ie (\\n[PS] >= 1000) \
1643 .               ps ((\\n[PS]z / 1000u) + 2z)
1644 .       el \
1645 .               ps \\n[PS]+2
1646 .       ft B
1647 \\*[TOC]
1648 .       ft
1649 .       ps
1652 .char \[toc*leader-char] .\h'1m'
1653 .lc \[toc*leader-char]
1654 .ta (u;\\n[.l]-\\n[.i]-\w'000') (u;\\n[.l]-\\n[.i])R
1655 .sp 2
1656 .toc*div
1657 .par@reset
1659 .\" print the table of contents on page i
1660 .de TC
1662 .pg@begin 1 i
1663 .PX \\$1
1665 .\" ****************************
1666 .\" ******** module eqn ********
1667 .\" ****************************
1668 .\" Eqn support.
1669 .de EQ
1671 .de EN
1673 .de @EQ
1675 .ds eqn*num "\\$2
1676 .ie '\\$1'L' .nr eqn*type 0
1677 .el \{\
1678 .       ie '\\$1'I' .nr eqn*type 1
1679 .       el \{\
1680 .               nr eqn*type 2
1681 .               if !'\\$1'C' .ds eqn*num "\\$1
1682 .       \}
1684 .di eqn*div
1685 .in 0
1686 .if \\n[eqn*type]=0 .HTML-IMAGE-LEFT
1687 .if \\n[eqn*type]=1 \{\
1688 .   if '\*(.T'html' .RS
1689 .   HTML-IMAGE-INLINE
1691 .if \\n[eqn*type]=2 .HTML-IMAGE
1694 .de @div-end!eqn*div
1695 .@EN
1697 .\" Note that geqn mark and lineup work correctly in centered equations.
1698 .de @EN
1699 .ie !'\\n(.z'eqn*div' .@error-recover mismatched EN
1700 .el \{\
1701 .       br
1702 .       di
1703 .       nr eqn*have-num 0
1704 .       if !'\\*[eqn*num]'' .nr eqn*have-num 1
1705 .       ie \\n[dl]:\\n[eqn*have-num] \{\
1706 .               sp \\n[DD]u
1707 .               par@reset
1708 .               ds eqn*tabs \\n[.tabs]
1709 .               nf
1710 .               ie \\n[dl] \{\
1711 .\"                     --fixme-- this really should not be necessary
1712 .\"                     and indicates that there is extra space creeping into
1713 .\"                     an equation when ps4html is enabled..
1714 .                       ie r ps4html .ds@need \\n[dn]u-1v+\n[.V]u+1i
1715 .                       el .ds@need \\n[dn]u-1v+\n[.V]u
1716 .                       chop eqn*div
1717 .                       ie \\n[eqn*type]=0 \{\
1718 .                               ta (u;\\n[.l]-\\n[.i])R
1719 \\*[eqn*div]\t\\*[eqn*num]
1720 .                       \}
1721 .                       el \{\
1722 .                               ie \\n[eqn*type]=1 .ta \\n[DI]u \
1723 (u;\\n[.l]-\\n[.i])R
1724 .                               el .ta (u;\\n[.l]-\\n[.i]/2)C \
1725 (u;\\n[.l]-\\n[.i])R
1726 \t\\*[eqn*div]\t\\*[eqn*num]
1727 .                       \}
1728 .               \}
1729 .               el \{\
1730 .                       ta (u;\\n[.l]-\\n[.i])R
1731 \t\\*[eqn*num]
1732 .               \}
1733 .\".            if !'\*(.T'html' .sp \\n[DD]u
1734 .               sp \\n[DD]u
1735 .               ta \\*[eqn*tabs]
1736 .       \}
1737 .       el \{
1738 .\" must terminate empty equations in html and ps4html as they contain
1739 .\" the HTML-IMAGE-END suppression nodes
1740 .               if \\n[dl] .chop eqn*div
1741 .               if '\*(.T'html' \\*[eqn*div]
1742 .               if r ps4html    \\*[eqn*div]
1743 .       \}
1744 .       if !'\*(.T'html' .fi
1745 .       if \\n[eqn*type]=0 .HTML-IMAGE-END
1746 .       if \\n[eqn*type]=1 \{\
1747 .               HTML-IMAGE-END
1748 .               if '\*(.T'html' .RE
1749 .       \}
1750 .       if \\n[eqn*type]=2 .HTML-IMAGE-END
1753 .\" ****************************
1754 .\" ******** module tbl ********
1755 .\" ****************************
1756 .\" Tbl support.
1757 .nr tbl*have-header 0
1758 .\" This gets called if TS occurs before the first paragraph.
1759 .de TS
1761 .\" cov*ab-init aliases TS to @TS
1762 \\*[TS]\\
1764 .de @TS
1765 .sp \\n[DD]u
1766 .if '\\$1'H' .di tbl*header-div
1767 .HTML-IMAGE
1769 .de tbl@top-hook
1770 .if \\n[tbl*have-header] \{\
1771 .       ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl*print-header
1772 .       el .sp \\n[.t]u
1775 .de tbl*print-header
1776 .ev nf
1777 .tbl*header-div
1779 .mk #T
1781 .de TH
1782 .ie '\\n[.z]'tbl*header-div' \{\
1783 .       nr T. 0
1784 .       T#
1785 .       br
1786 .       di
1787 .       ie \\n[dn]+\\n[FM]+\\n[HM]+2v>=\\n[.p] \{\
1788 .               @error ridiculously long table header
1789 .               ds@need \\n[dn]
1790 .               tbl*print-header
1791 .       \}
1792 .       el \{\
1793 .               nr tbl*header-ht \\n[dn]
1794 .               ds@need \\n[dn]u+1v
1795 .               tbl*print-header
1796 .               nr tbl*have-header 1
1797 .       \}
1799 .el .@error-recover .TH without .TS H
1801 .de @div-end!tbl*header-div
1805 .de TE
1806 .ie '\\n(.z'tbl*header-div' .@error-recover .TS H but no .TH before .TE
1807 .el \{\
1808 .       nr tbl*have-header 0
1809 .       if !'\*(.T'html' .sp \\n[DD]u
1811 .       HTML-IMAGE-END
1812 .\" reset tabs
1815 .de tbl@bottom-hook
1816 .if \\n[tbl*have-header] \{\
1817 .       nr T. 1
1818 .       T#
1821 .de T&
1823 .\" ****************************
1824 .\" ******** module pic ********
1825 .\" ****************************
1826 .\" Pic support.
1827 .\" PS height width
1828 .de PS
1830 .sp \\n[DD]u
1831 .ie \\n[.$]<2 .@error bad arguments to PS (not preprocessed with pic?)
1832 .el \{\
1833 .       ds@need (u;\\$1)+1v
1834 .       in +(u;\\n[.l]-\\n[.i]-\\$2/2>?0)
1836 .HTML-IMAGE
1838 .de PE
1839 .HTML-IMAGE-END
1840 .par@reset
1841 .sp \\n[DD]u+.5m
1843 .\" ****************************
1844 .\" ******** module ref ********
1845 .\" ****************************
1846 .\" Refer support.
1847 .de ]-
1848 .rm [A [B [C [D [E [G [I [J [N [O [P [Q [R [S [T [V
1849 .rm ref*string
1851 .\" Other
1852 .ds ref*spec!0 Q A T1 S V N P I C D O
1853 .\" Journal article
1854 .ds ref*spec!1 Q A T2 J S V N P I C D O
1855 .\" Book
1856 .ds ref*spec!2 Q A T1 S V P I C D O
1857 .\" Article within book
1858 .ds ref*spec!3 Q A T2 B E S V P I C D O
1859 .\" Tech report
1860 .ds ref*spec!4 Q A T2 R G P I C D O
1861 .\" ][ type
1862 .de ][
1863 .if r [T \{\
1864 .       als [T1 [T
1865 .       als [T2 [T
1867 .ie d ref*spec!\\$1 .ref*build \\*[ref*spec!\\$1]
1868 .el \{\
1869 .       @error unknown reference type `\\$1'
1870 .       ref*build \\*[ref*spec!0]
1872 .ref*print
1873 .rm ref*string
1874 .rm [F [T1 [T2
1876 .\" start of reference number
1877 .ds [. \E*[par@sup-start]
1878 .\" end of reference number
1879 .ds .] \E*[par@sup-end]
1880 .\" period before reference
1881 .ds <. .
1882 .\" period after reference
1883 .ds >. \" empty
1884 .\" comma before reference
1885 .ds <, ,
1886 .\" comma after reference
1887 .ds >, \" empty
1888 .\" start collected references
1889 .de ]<
1890 .als ref*print ref*end-print
1892 \&\\*[REFERENCES]
1893 .par@reset
1895 .\" end collected references
1896 .de ]>
1897 .par@finish
1898 .als ref*print ref*normal-print
1900 .de ref*normal-print
1901 .ie d [F .FS "\\*([.\\*([F\\*(.]"
1902 .el .FS \&
1903 \\*[ref*string]
1906 .de ref*end-print
1907 .ie d [F .IP "\\*([F."
1908 .el .XP
1909 \\*[ref*string]
1911 .als ref*print ref*normal-print
1912 .de ref*build
1913 .rm ref*string ref*post-punct
1914 .nr ref*suppress-period 1
1915 .while \\n[.$] \{\
1916 .       if d [\\$1 \{\
1917 .               ie d ref*add-\\$1 .ref*add-\\$1
1918 .               el .ref*add-dflt \\$1
1919 .       \}
1920 .       shift
1922 .\" now add a final period
1923 .ie d ref*string \{\
1924 .       if !\\n[ref*suppress-period] .as ref*string .
1925 .       if d ref*post-punct \{\
1926 .               as ref*string "\\*[ref*post-punct]
1927 .               rm ref*post-punct
1928 .       \}
1930 .el .ds ref*string
1932 .de ref*add-T1
1933 .ref*field T , " " "\fI" "" "\fP"
1934 .if r [T .nr ref*suppress-period \\n([T
1936 .de ref*add-T2
1937 .ref*field T , " " "\\*Q" "" "\\*U"
1938 .if r [T .nr ref*suppress-period \\n([T
1940 .de ref*add-P
1941 .ie \\n([P>0 .ref*field P , " " "pp. "
1942 .el .ref*field P , " " "p. "
1944 .de ref*add-J
1945 .ref*field J , " " \fI "" \fP
1947 .de ref*add-D
1948 .ref*field D "" " " ( )
1950 .de ref*add-E
1951 .ref*field E , " " "ed. "
1953 .de ref*add-G
1954 .ref*field G "" " " ( )
1956 .de ref*add-B
1957 .ref*field B "" " " "in \fI" "" \fP
1959 .de ref*add-O
1960 .ref*field O . " "
1961 .ie r [O .nr ref*suppress-period \\n([O
1962 .el .nr ref*suppress-period 1
1964 .de ref*add-A
1965 .ref*field A , " "
1966 .if r [A .nr ref*suppress-period \\n([A
1968 .de ref*add-V
1969 .ref*field V "" " " \fB \fR
1971 .de ref*add-N
1972 .ref*field N "" ( "" ")"
1974 .de ref*add-dflt
1975 .ref*field \\$1 , " "
1977 .\" First argument is the field letter.
1978 .\" Second argument is the punctuation character to use to separate this field
1979 .\" from the previous field.
1980 .\" Third argument is a string to insert after the punctuation character of
1981 .\" the previous field (normally a space)
1982 .\" Fourth argument is a string with which to prefix this field.
1983 .\" Fifth argument is a string with which to postfix this field.
1984 .\" Sixth argument is a string to add after the punctuation character supplied
1985 .\" by the next field.
1986 .de ref*field
1987 .if d ref*string \{\
1988 .       ie d ref*post-punct \{\
1989 .               as ref*string "\\$2\\*[ref*post-punct]\\$3\"
1990 .               rm ref*post-punct
1991 .       \}
1992 .       el .as ref*string "\\$2\\$3\"
1994 .as ref*string "\\$4\\*([\\$1\\$5
1995 .if \\n[.$]>5 .ds ref*post-punct "\\$6
1996 .nr ref*suppress-period 0
1998 .\" ****************************
1999 .\" ******** module acc ********
2000 .\" ****************************
2001 .\" Accents and special characters.
2002 .ds Q \(lq
2003 .ds U \(rq
2004 .ds - \(em
2005 .\" Characters
2006 .\" The idea of this definition is for the top of the 3 to be at the x-height.
2007 .if !c\[yogh] .char \[yogh] \Z'\v'\w'x'*0-\En[rst]u'\s[\En[.s]*8u/10u]\
2008 \v'\w'3'*0+\En[rst]u'3\s0'\h'\w'\s[\En[.s]*8u/10u]3'u'
2009 .\" Accents
2010 .de acc*over-def
2011 .ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\
2012 \h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2'
2014 .de acc*under-def
2015 .ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2'
2017 .de acc*slash-def
2018 .ds \\$1 \Z'\h'(u;-\En[.w]-\w'\\$2'/2)'\
2019 \v'(u;\En[.cdp]-\En[.cht]+\En[rst]+\En[rsb]/2)'\\$2'
2021 .de acc*prefix-def
2022 .ds \\$1 \Z'\h'(u;\w'x'-\w'\\$2'/2)'\\$2'
2024 .acc*prefix-def ' \'
2025 .acc*prefix-def ` \`
2026 .acc*prefix-def ^ ^
2027 .acc*prefix-def , \(ac
2028 .acc*prefix-def : \(ad
2029 .acc*prefix-def ~ ~
2030 .\" improved accent marks
2031 .de AM
2032 .acc*over-def ' \'
2033 .acc*over-def ` \`
2034 .acc*over-def ^ ^
2035 .acc*over-def ~ ~
2036 .acc*over-def : \(ad
2037 .acc*over-def v \(ah
2038 .acc*over-def _ \(a-
2039 .acc*over-def o \(ao
2040 .acc*under-def , \(ac
2041 .acc*under-def . \s[\En[.s]*8u/10u]\v'.2m'.\v'-.2m'\s0
2042 .acc*under-def hook \(ho
2043 .acc*slash-def / /
2044 .char \[hooko] o\E*[hook]
2045 .ds q \[hooko]
2046 .ds 3 \[yogh]
2047 .ds D- \(-D\"                   Icelandic uppercase eth
2048 .ds d- \(Sd\"                   Icelandic lowercase eth
2049 .ds Th \(TP\"                   Icelandic uppercase thorn
2050 .ds th \(Tp\"                   Icelandic lowercase thorn
2051 .ds 8 \(ss\"                    German double s
2052 .ds Ae \(AE\"                   AE ligature
2053 .ds ae \(ae\"                   ae ligature
2054 .ds Oe \(OE\"                   OE ligature
2055 .ds oe \(oe\"                   oe ligature
2056 .ds ? \(r?\"                    upside down ?
2057 .ds ! \(r!\"                    upside down !
2059 .de CHECK-FOOTER-AND-KEEP
2060 .\" it might be better to als FS -> B1 and FE -> B2
2061 .\" however this produced wierd results, so I've moved back to a more reliable
2062 .\" but less interesting solution --fixme--
2063 .   if '\*(.T'html' \{\
2064 .       rm KF
2065 .       als KF KS
2066 .       rm FS
2067 .       de FS
2068 .               br
2069 .               HTML-IMAGE
2070 \\..
2071 .       rm FE
2072 .       de FE
2073 .               br
2074 .               HTML-IMAGE-END
2075 \\..
2076 .   \}
2077 .   if r ps4html \{\
2078 .       rm FS
2079 .       de FS
2080 .               br
2081 .               HTML-IMAGE
2082 \\..
2083 .       rm FE
2084 .       de FE
2085 .               br
2086 .               HTML-IMAGE-END
2087 \\..
2088 .   \}
2090 .par@load-init
2091 .\" ****************************
2092 .\" ******** module bell ********
2093 .\" ****************************
2094 .\" Emulate Bell Labs localisms. Note, (a) they're not documented, and
2095 .\" (b) the .P1 and .UC macros collide with different ones in Berkeley ms.
2096 .\" We hack around this by conditionalizing the behavior of P1; UC was
2097 .\" not defined by groff and will be a no-op if called Berkeley style
2098 .\" with no arguments, so there is no problem with hijacking it here.
2100 .\" What's done here is sufficient to give back the Guide to EQN (1976) its
2101 .\" section headings and restore some text that had gone missing as macro
2102 .\" arguments; no warranty express or implied is given as to how well the
2103 .\" typographic details these produce match the original Bell Labs macros.
2105 .\" P1 is now defined in module pg.
2106 .de SC
2107 .nr bell_localisms 1
2108 .NH 
2109 \\$*
2111 .de UC
2112 .if r bell_localisms \f(CW\\$*\fP
2114 .de P2
2115 .if r bell_localisms \{\
2116 .       ft
2117 .       DE
2120 .\" Make sure that no blank lines creep in at the end of this file.