2 Copyright
(C
) 1989, 1990, 1991, 1992 Free Software Foundation
, Inc.
3 Written by James Clark
(jjc@jclark.com
)
5 This file is part of groff.
7 groff is free software; you can redistribute it
and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version
2, or (at your option
) any later
12 groff is distributed in the hope that it will
be useful
, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY
or
14 FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received
a copy of the GNU General Public License along
18 with groff; see the file COPYING. If
not, write to the Free Software
19 Foundation
, 675 Mass Ave
, Cambridge
, MA
02139, USA.
21 .if !\n(.g .ab These ms macros require groff.
23 . ab The groff ms macros do not work in compatibility mode.
24 .\" Enable warnings. You can delete this if you want.
26 .\" See if already loaded.
30 .tm \\n(.F:\\n(.c: macro error: \\$*
33 .tm \\n(.F:\\n(.c: macro warning: \\$*
36 .ab \\n(.F:\\n(.c: fatal macro error: \\$*
39 .@error sorry, \\$0 not implemented
42 .als TM @not-implemented
43 .als CT @not-implemented
47 .\" a non-empty environment
55 .ds REFERENCES References
57 .ds TOC Table of Contents
70 .ds MO \\*[MONTH\n[mo]]
72 .ds DY \n[dy] \*[MO] \n[*year]
74 .if \\n[.$] .ds DY "\\$*
77 .if \\n[.$] .ds DY "\\$*
82 .tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[PN]
84 .\" print an error message and then try to recover
86 .@error \\$@ (recovering)
89 . \"@warning automatically terminating diversion \\n(.z
90 . ie d @div-end!\\n(.z .@div-end!\\n(.z
91 . el .*div-end-default
93 . \" ensure that we don't loop forever
94 . if \\n[*pop-count]>20 .@fatal recovery failed
96 .while !'\\n[.ev]'0' .ev
108 .\" ****************************
109 .\" ******** module cov ********
110 .\" ****************************
111 .\" Cover sheet and first page.
112 .de cov*err-not-after-first-page
113 .@error \\$0 is not allowed after the first page has started
115 .de cov*err-not-before-tl
116 .@error \\$0 is not allowed before TL
118 .de cov*err-not-again
119 .@error \\$0 is not allowed more than once
121 .de cov*err-not-after-ab
122 .@error \\$0 is not allowed after first AB, LP, PP, IP, SH or NH
124 .als AU cov*err-not-before-tl
125 .als AI cov*err-not-before-tl
126 .als AB cov*err-not-before-tl
127 .de cov*first-page-init
128 .rm cov*first-page-init
130 .als RP cov*err-not-after-first-page
132 .ie \\n[cov*rp-format] \{\
144 .wh 0 cov*first-page-init
145 .\" This handles the case where FS occurs before TL or LP.
152 .\" released paper format
155 .if \\n[.$] .if '\\$1'no' .nr cov*rp-no 1
160 .als TL cov*err-not-again
179 .di cov*au-div!\\n[cov*n-au]
190 .ie !\\n[cov*n-au] .@error AI before AU
192 . di cov*ai-div!\\n[cov*n-au]
217 .als cov*ab-init @nop
234 .als AB cov*err-not-after-ab
259 .ie '\\n(.z'cov*ab-div' \{\
260 . als AE cov*err-not-again
263 .\" nr cov*ab-height \\n[dn]
268 .el .@error AE without AB
270 .de @div-end!cov*ab-div
276 . ie \\n[cov*rp-format] .cov*rp-print
277 . el .cov*draft-print
280 . if \\n[cov*rp-format] \{\
281 . @warning RP format but no TL
290 .nr cov*page-length \\n[.p]
302 .if \\n[cov*fn-height] \{\
303 . sp |(u;\\n[cov*page-length]-\\n[FM]\
304 -\\n[cov*fn-height]-\\n[fn@sep-dist]>?\\n[nl])
309 . ie \\n[cov*rp-no] .rm cov*fn-div
311 . rn cov*fn-div fn@overflow-div
312 . nr fn@have-overflow 1
317 .\" If anything was printed below where the footer line is normally printed,
318 .\" then that's an overflow.
319 .if -\\n[FM]/2+1v+\\n[cov*page-length]<\\n[nl] .@error cover sheet overflow
320 .pl \\n[cov*page-length]u
322 .if !\\n[cov*rp-no] .cov*tl-au-print
344 .while \\n[cov*i]<=\\n[cov*n-au] \{\
346 . cov*au-div!\\n[cov*i]
347 . ie d cov*ai-div!\\n[cov*i] \{\
349 . cov*ai-div!\\n[cov*i]
359 .\" start of footnote on cover
361 .if \\n[cov*in-fn] \{\
369 .if !\\n[cov*fn-height] .ns
370 .ie \\n[.$] .FP "\\$1" no
373 .de @div-end!cov*fn-div
376 .\" end of footnote on cover
378 .ie '\\n(.z'cov*fn-div' \{\
383 . nr cov*fn-height +\\n[dn]
385 .el .@error FE without matching FS
387 .\" ***************************
388 .\" ******** module pg ********
389 .\" ***************************
390 .\" Page-level formatting.
391 .\" > 0 if we have a footnote on the current page
404 .ds pg*OH '\\*[LH]'\\*[CH]'\\*[RH]'
405 .ds pg*EH '\\*[LH]'\\*[CH]'\\*[RH]'
406 .ds pg*OF '\\*[LF]'\\*[CF]'\\*[RF]'
407 .ds pg*EF '\\*[LF]'\\*[CF]'\\*[RF]'
415 .ie \\n%=1 .if \\n[pg*P1] .tl \\*[pg*OH]
417 . ie o .tl \\*[pg*OH]
429 .wh -\n[FM]u pg@bottom
430 .wh -\n[FM]u/2u pg*footer
434 .if !'\\n(.z'' .error-recover MC while diversion open
436 .ie \\n[pg@ncols]>1 .pg@super-eject
438 . \" flush out any floating keeps
439 . while \\n[kp@tail]>\\n[kp@head] \{\
445 . nr pg@colw \\n[LL]*7/15
446 . nr pg*gutw \\n[LL]-(2*\\n[pg@colw])
450 . nr pg@colw (n;\\$1)<?\\n[LL]
451 . ie \\n[.$]<2 .nr pg*gutw \\n[MINGW]
452 . el .nr pg*gutw (n;\\$2)
453 . nr pg@ncols \\n[LL]-\\n[pg@colw]/(\\n[pg@colw]+\\n[pg*gutw])+1
454 . ie \\n[pg@ncols]>1 \
455 . nr pg*gutw \\n[LL]-(\\n[pg@ncols]*\\n[pg@colw])/(\\n[pg@ncols]-1)
461 .nr pg@fn-colw \\n[pg@colw]*5/6
470 .\" top of page macro
472 .ch pg*footer -\\n[FM]u/2u
475 .nr pg@fn-bottom-margin 0
476 .nr pg*saved-po \\n[PO]
490 .\" Handle footnote overflow before floating keeps, because the keep
491 .\" might contain an embedded footnote.
499 .\" move pg@bottom and pg*footer out of the way
500 .ch pg@bottom \\n[.p]u*2u
501 .ch pg*footer \\n[.p]u*2u
506 .if \\n[pg@fn-flag] .fn@bottom-hook
508 .ie \\n[pg*col-num]<\\n[pg@ncols] .pg*end-col
512 'sp |\\n[pg*col-top]u
513 .po (u;\\n[pg*saved-po]+(\\n[pg@colw]+\\n[pg*gutw]*\\n[pg*col-num]))
514 .\"po +(u;\\n[pg@colw]+\\n[pg*gutw])
518 .po \\n[pg*saved-po]u
519 .\" Make sure we don't exit if there are still floats
or footnotes left-over.
520 .ie \\n[kp@head]<\\n[kp@tail]:\\n[fn@have-overflow] \{\
521 . \" Switching environments ensures that we don't get an unnecessary
522 . \" blank line at the top of the page.
528 . \" If the text has ended and there are no more footnotes or keeps, exit.
529 . if \\n[pg@text-ended] .ex
530 . if r pg*next-number \{\
531 . pn \\n[pg*next-number]
533 . if d pg*next-format \{\
534 . af PN \\*[pg*next-format]
541 .\" pg@begin number format
544 . nr pg*next-number (;\\$1)
545 . ie \\n[.$]>1 .ds pg*next-format \\$2
546 . el .rm pg*next-format
548 .el .rr pg*next-number
551 .\" print the footer line
558 .\" flush out any keeps or footnotes
561 .if !'\\n
(.z'' .@error-recover diversion open while ejecting page
562 .\" Make sure we stay in the end macro while there is still footnote overflow
563 .\" left, or floating keeps.
564 .while \\n[kp@tail]>\\n[kp@head]:\\n[pg@fn-flag] \{\
577 .\" ***************************
578 .\" ******** module fn ********
579 .\" ***************************
583 .\" Round it vertically
585 .nr fn@sep-dist \n[.v]
589 .ds * \\*[par@sup-start]\En+[fn*text-num]\\*[par@sup-end]
593 .ie \\n[.$] .fn*do-FS "\\$1" no
595 . ie \\n[fn*text-num]>\\n[fn*note-num] .fn*do-FS \\n+[fn*note-num]
599 .\" Second argument of `no' means don't embellish the first argument.
601 .if \\n[fn*open] .@error-recover nested FS
604 . \" Ensure that the first line of the footnote is on the same page
605 . \" as the reference. I think this is minimal.
609 . ie \\n[pg@fn-flag] .nr fn*need +\\n[fn:PD]
610 . el .nr fn*need +\\n[fn@sep-dist]
611 . ne \\n[fn*need]u+\\n[.V]u>?0
621 .ie !\\n[fn*open] .@error FE without FS
629 .nr fn@have-overflow 0
630 .\" called at the top of each column
633 .nr fn*page-bottom-pos 0-\\n[FM]-\\n[pg@fn-bottom-margin]
634 .ch pg@bottom \\n[fn*page-bottom-pos]u
635 .if \\n[fn@have-overflow] \{\
636 . nr fn@have-overflow 0
644 .\" This is called at the bottom of the column if pg@fn-flag is set.
647 .nr fn@have-overflow 0
648 .nr fn@bottom-pos \\n[.p]-\\n[FM]-\\n[pg@fn-bottom-margin]+\\n[.v]
650 .nr fn@bottom-pos -\\n[.v]
652 .ie \\n[nl]+\\n[fn@sep-dist]+\n[.V]>\\n[fn@bottom-pos] \{\
653 . rn fn@div fn@overflow-div
654 . nr fn@have-overflow 1
657 . if \\n[pg@ncols]>1 \
658 . if \\n[fn*max-width]>\\n[pg@fn-colw] \
659 . nr pg@fn-bottom-margin \\n[.p]-\\n[FM]-\\n[nl]+1v
660 . wh \\n[fn@bottom-pos]u fn*catch-overflow
666 . if '\\n(.z'fn@overflow-div' \{\
668 . nr fn@have-overflow \\n[dn]>0
670 . ch fn*catch-overflow
673 .de fn*catch-overflow
679 .if '\\n[.ev]'fn' .ev
683 .als @div-end!fn*embed-div @div-end!fn@div
687 . if !\\n[pg@fn-flag] .ns
692 .ie '\\n(.z'fn@div' \{\
694 . nr fn*page-bottom-pos -\\n[dn]
695 . nr fn*max-width \\n[fn*max-width]>?\\n[dl]
696 . if !\\n[pg@fn-flag] .nr fn*page-bottom-pos -\\n[fn@sep-dist]
698 . nr fn*page-bottom-pos \\n[nl]-\\n[.p]+\n[.V]>?\\n[fn*page-bottom-pos]
699 . ch pg@bottom \\n[fn*page-bottom-pos]u
702 . ie '\\n(.z'fn*embed-div' \{\
704 . rn fn*embed-div fn*embed-div!\\n[fn*embed-count]
705 \!. fn*embed-start \\n[fn*embed-count]
707 ' sp (u;\\n[dn]+\\n[fn@sep-dist]+\\n[.V])
709 . nr fn*embed-count +1
713 . @error-recover unclosed diversion within footnote
722 . rm fn*embed-div!\\$1
728 \!. fn*embed-start \\$1
733 .ie '\\n(.z'fn*null' \{\
739 .\" It's important that fn@print-sep use up exactly fn@sep-dist vertical space.
743 .vs \\n[fn@sep-dist]u
748 .\" ***************************
749 .\" ******** module kp ********
750 .\" ***************************
757 .if !'\\n(.z'' .@error-recover KF while open diversion
764 .ie '\\n(.z'kp*div' .kp*end
766 . ie '\\n(.z'kp*fdiv' .kp*fend
767 . el .@error KE without KS or KF
777 .ie '\\n(.z'' .ds@need \\$1
780 .\" end non-floating keep
793 .\" end floating keep
798 .ie \\n[.t]-(\\n[.k]>0*1v)>\\n[dn] \{\
806 . rn kp*fdiv kp*div!\\n[kp@tail]
807 . nr kp*ht!\\n[kp@tail] 0\\n[dn]
811 .\" top of page processing for KF
814 .if !\\n[kp*doing-top] \{\
821 .\" If the first keep won't fit, only force it out if we haven't had a footnote
822 .\" and we're at the top of the page.
823 .nr kp*force \\n[pg@fn-flag]=0&(\\n[nl]<=\\n[pg@header-bottom])
825 .while \\n[kp@tail]>\\n[kp@head]&\\n[kp*fits] \{\
826 . ie \\n[.t]>\\n[kp*ht!\\n[kp@head]]:\\n[kp*force] \{\
828 . \" It's important to advance kp@head before bringing
829 . \" back the keep, so that if the last line of the
830 . \" last keep springs the bottom of page trap, a new
831 . \" page will not be started unnecessarily.
832 . rn kp*div!\\n[kp@head] kp*temp
842 .\" ***************************
843 .\" ******** module ds ********
844 .\" ***************************
845 .\" Displays and non-floating keeps.
847 .ds*end!\\n[\\n[.ev]:ds-type]
848 .nr \\n[.ev]:ds-type 0
851 .if \\n[\\n[.ev]:ds-type] \{\
852 . @error automatically terminating display
857 .ie \\n[\\n[.ev]:ds-type] .DE
861 .@error DE without DS, ID, CD, LD or BD
865 .nr \\n[.ev]:ds-type 1
872 .ie \\n[.$] .in +(n;\\$1)
887 .als ds*end!1 ds*common-end
890 .nr \\n[.ev]:ds-type 2
895 .ie '\\n(.z'ds*div' \{\
898 . in (u;\\n[.l]-\\n[dl]/2)
903 .el .@error-recover mismatched DE
910 . nr \\n[.ev]:ds-type 4
919 . ie '\\$1'I' .ID \\$2
924 . nr \\n[.ev]:ds-type 3
929 . while \\n[.t]<=(\\$1)&(\\n[nl]>\\n[pg@header-bottom]) \{\
937 .ie '\\n
(.z'ds*div' \{\
946 .el .@error-recover mismatched DE
949 .ie '\\n(.z'ds*div' \{\
953 . in (u;\\n[.l]-\\n[dl]/2)
959 .el .@error-recover mismatched DE
961 .\" ****************************
962 .\" ******** module par ********
963 .\" ****************************
964 .\" Paragraph-level formatting.
968 .\" If it's too big to be in points, treat it as units.
969 .ie (p;\\$1)>=40p .vs (u;\\$1)
973 .nr 0:li (u;\\n[LL]/12)
980 .aln \\n[.ev]:MCLL LL
982 .aln \\n[.ev]:MCLT LT
988 .\" happens when the first page begins
990 .if !rLT .nr LT \\n[LL]
991 .if !rFL .nr FL \\n[LL]*5/6
992 .if !rVS .nr VS \\n[PS]+2
998 .if !rPD .nr PD .3v>?\n(.V
999 .if !rDD .nr DD .5v>?\n(.V
1000 .if !dFAM .ds FAM \\n[.fam]
1016 .if !rFPS .nr FPS \\n[PS]-2
1017 .if !rFVS .nr FVS \\n[FPS]+2
1019 .if !rFPD .nr FPD \\n[PD]/2
1026 .aln fn:MCLL pg@fn-colw
1027 .aln fn:MCLT pg@fn-colw
1033 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1036 .nr \\n[.ev]:ds-type 0
1045 .ie \\n[pg@ncols]>1 \{\
1046 . ll (u;\\n[\\n[.ev]:MCLL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
1047 . lt \\n[\\n[.ev]:MCLT]u
1050 . ll (u;\\n[\\n[.ev]:LL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
1051 . lt \\n[\\n[.ev]:LT]u
1053 .in (u;\\n[\\n[.ev]:li]+\\n[\\n[.ev]:pli])
1056 .ps \\n[\\n[.ev]:PS]
1057 .par*vs \\n[\\n[.ev]:VS]
1063 .\" This can be redefined by the user.
1069 .nr \\n[.ev]:pli \\$1
1070 .nr \\n[.ev]:pri \\$2
1072 .sp \\n[\\n[.ev]:PD]u
1083 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1087 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1088 .ti +\\n[\\n[.ev]:ai]u
1091 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1092 .par*start \\n[QI] \\n[QI]
1095 .par*start \\n[\\n[.ev]:PI] 0
1096 .ti -\\n[\\n[.ev]:PI]u
1099 .if \\n[.$]>1 .nr \\n[.ev]:ai (n;\\$2)
1100 .par*start \\n[\\n[.ev]:ai] 0
1102 . \" Divert the label so as to freeze any spaces.
1111 . ti -\\n[\\n[.ev]:ai]u
1112 . ie \\n[dl]+1n<=\\n[\\n[.ev]:ai] \\*[par*label]\h'|\\n[\\n[.ev]:ai]u'\c
1122 .nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
1123 .nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
1124 .nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
1125 .nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
1126 .nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
1128 .nr \\n[.ev]:li +\\n[\\n[.ev]:ai]
1129 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1134 .ie \\n[\\n[.ev]:il] \{\
1136 . nr \\n[.ev]:ai \\n[\\n[.ev]:ai!\\n[\\n[.ev]:il]]
1137 . nr \\n[.ev]:li \\n[\\n[.ev]:li!\\n[\\n[.ev]:il]]
1138 . nr \\n[.ev]:ri \\n[\\n[.ev]:ri!\\n[\\n[.ev]:il]]
1139 . nr \\n[.ev]:pli \\n[\\n[.ev]:pli!\\n[\\n[.ev]:il]]
1140 . nr \\n[.ev]:pri \\n[\\n[.ev]:pri!\\n[\\n[.ev]:il]]
1142 .el .@error unbalanced \\$0
1147 .nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
1148 .nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
1149 .nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
1150 .nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
1151 .nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
1153 .nr \\n[.ev]:li +\\n[QI]
1154 .nr \\n[.ev]:ri +\\n[QI]
1155 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1159 .\" start boxed text
1167 .de @div-end!par*box-div
1171 .\" Postpone the drawing of the box until we're in the top-level diversion,
1172 .\" in case there's a footnote inside the box.
1174 .ie '\\n(.z'par*box-div' \{\
1182 . nr \\n[.ev]:ri -1n
1183 . nr \\n[.ev]:li -1n
1185 . par*box-draw \\n[.i]u \\n[.l]u
1187 .el .@error B2 without B1
1189 .de par*box-mark-top
1190 .ie '\\n[.z]'' .mk par*box-top
1191 .el \!.par*box-mark-top
1195 . nr par*box-in \\n[.i]
1196 . nr par*box-ll \\n[.l]
1197 . nr par*box-vpt \\n[.vpt]
1202 \D
'l (u;\\n[.l]-\\n[.i]) 0'\
1203 \D
'l 0 |\\n[par*box-top]u'\
1204 \D
'l -(u;\\n[.l]-\\n[.i]) 0'\
1205 \D
'l 0 -|\\n[par*box-top]u'
1208 . in \\n[par*box-in]u
1209 . ll \\n[par*box-ll]u
1210 . vpt \\n[par*box-vpt]
1212 .el \!.par*box-draw \\$1 \\$2
1216 .\" Keep together the heading and the first two lines of the next paragraph.
1217 .ne 3v+\\n[\\n[.ev]:PD]u+\\n(.Vu
1221 .\" TL, AU, and AI are aliased to these in cov*ab-init.
1241 .\" In paragraph macros.
1243 .ps \\n[\\n[.ev]:PS]
1254 .\" par*define-font-macro macro font
1255 .de par*define-font-macro
1258 . nr par*prev-font \\\\n[.f]
1259 \
&\\\\$
3\f[\\$
2]\\\\$
1\f[\\\\n
[par
*prev-font
]]\\\\$
2
1264 .par*define-font-macro B B
1265 .par*define-font-macro I I
1266 .par*define-font-macro BI BI
1267 .par*define-font-macro CW CR
1268 .\" underline a word
1270 \Z
'\\$1'\v'.25m'\D
'l \w'\\$
1'u 0'\v'-.25m'\\$
2
1274 .nr par*bxw \w'\\$1'+.4m
1275 \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''\
1279 .\" The first time UX is used, put a registered mark after it.
1282 \s
[\\n
[.s]*8u/10u]UNIX\s0\\$1\\*[par*ux-rg]
1285 .ds par@sup-start \v'-.9m\s'\En[.s]*7u/10u'+.7m'
1286 .als { par@sup-start
1287 .ds par@sup-end \v'-.7m\s0+.9m'
1289 .\" footnote paragraphs
1290 .\" FF is the footnote format
1292 .\" This can be redefined. It gets a second argument of `no' if the first
1293 .\" argument was supplied by the user, rather than automatically.
1296 .if !d par*fp!\\n[FF] \{\
1297 . @error unknown footnote format `\\n[FF]'
1300 .ie '\\$2'no' .par*fp!\\n[FF]-no "\\$1"
1301 .el .par*fp!\\n[FF] "\\$1"
1305 \&\\*[par@sup-start]\\$1\\*[par@sup-end]\ \c
1328 .@IP "\\$1." (u;\\n[\\n[.ev]:PI]*2)
1331 .@IP "\\$1" (u;\\n[\\n[.ev]:PI]*2)
1333 .\" ***************************
1334 .\" ******** module nh ********
1335 .\" ***************************
1336 .\" Numbered headings.
1337 .\" nh*hl is the level of the last heading
1339 .\" numbered heading
1346 . nr H\\n[nh*hl] 0\\$1
1349 . if !\\n[nh*hl] \{\
1352 . @error missing arguments to .NH S
1356 . nr nh*ohl \\n[nh*hl]
1359 . ie \\n[nh*hl]<=0 \{\
1364 . if \\n[nh*hl]-\\n[nh*ohl]>1 \
1365 . @warning .NH \\n[nh*ohl] followed by .NH \\n[nh*hl]
1369 . while \\n[nh*hl]>\\n[nh*ohl] \{\
1377 .while \\n[nh*i]<\\n[nh*hl] \{\
1379 . as SN \\n[H\\n[nh*i]].
1384 .\" ****************************
1385 .\" ******** module toc ********
1386 .\" ****************************
1387 .\" Table of contents generation.
1391 .ie \\n[.$] .XA "\\$1"
1394 .de @div-end!toc*div
1398 .ie '\\n(.z'toc*div' \{\
1399 . if d toc*num .toc*end-entry
1401 . ie '\\$1'no' .ds toc*num
1402 . el .ds toc*num "\\$1
1404 . el .ds toc*num \\n[PN]
1410 .el .@error XA without XS
1413 .ie '\\n(.z'toc*div' \{\
1414 . if d toc*num .toc*end-entry
1418 .el .@error XS without XE
1436 .char \[toc*leader-char] .\h'1m'
1437 .lc \[toc*leader-char]
1438 .ta (u;\\n[.l]-\\n[.i]-\w'000') (u;\\n[.l]-\\n[.i])R
1443 .\" print the table of contents on page i
1449 .\" ****************************
1450 .\" ******** module eqn ********
1451 .\" ****************************
1460 .ie '\\$1'L' .nr eqn*type 0
1462 . ie '\\$1'I' .nr eqn*type 1
1465 . if !'\\$1'C' .ds eqn*num "\\$1
1472 .de @div-end!eqn*div
1475 .\" Note that geqn mark and lineup work correctly in centered equations.
1477 .ie !'\\n(.z'eqn*div' .@error-recover mismatched EN
1482 . if !'\\*[eqn*num]'' .nr eqn*have-num 1
1483 . if \\n[dl]:\\n[eqn*have-num] \{\
1486 . ds eqn*tabs \\n[.tabs]
1489 . ds@need \\n[dn]u-1v+\n[.V]u
1491 . ie \\n[eqn*type]=0 \{\
1492 . ta (u;\\n[.l]-\\n[.i])R
1493 \\*[eqn*div]\t\\*[eqn*num]
1496 . ie \\n[eqn*type]=1 .ta \\n[DI]u \
1497 (u;\\n[.l]-\\n[.i])R
1498 . el .ta (u;\\n[.l]-\\n[.i]/2)C \
1499 (u;\\n[.l]-\\n[.i])R
1500 \t\\*[eqn*div]\t\\*[eqn*num]
1504 . ta (u;\\n[.l]-\\n[.i])R
1513 .\" ****************************
1514 .\" ******** module tbl ********
1515 .\" ****************************
1517 .nr tbl*have-header 0
1519 .\" The break is necessary in the case where the first page has not yet begun.
1522 .if '\\$1'H' .di tbl*header-div
1525 .if \\n[tbl*have-header] \{\
1526 . ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl*print-header
1530 .de tbl*print-header
1537 .ie '\\n[.z]'tbl*header-div' \{\
1542 . ie \\n[dn]+\\n[FM]+\\n[HM]+2v>=\\n[.p] \{\
1543 . @error ridiculously long table header
1548 . nr tbl*header-ht \\n[dn]
1549 . ds@need \\n[dn]u+1v
1551 . nr tbl*have-header 1
1554 .el .@error-recover .TH without .TS H
1556 .de @div-end!tbl*header-div
1561 .ie '\\n(.z'tbl*header-div' .@error-recover .TS H but no .TH before .TE
1563 . nr tbl*have-header 0
1570 .if \\n[tbl*have-header] \{\
1577 .\" ****************************
1578 .\" ******** module pic ********
1579 .\" ****************************
1585 .ie \\n[.$]<2 .@error bad arguments to PS (not preprocessed with pic?)
1587 . ds@need (u;\\$1)+1v
1588 . in +(u;\\n[.l]-\\n[.i]-\\$2/2>?0)
1595 .\" ****************************
1596 .\" ******** module ref ********
1597 .\" ****************************
1600 .rm [A [B [C [D [E [G [I [J [N [O [P [Q [R [S [T [V
1604 .ds ref*spec!0 Q A T1 S V N P I C D O
1606 .ds ref*spec!1 Q A T2 J S V N P I C D O
1608 .ds ref*spec!2 Q A T1 S V P I C D O
1609 .\" Article within book
1610 .ds ref*spec!3 Q A T2 B E S V P I C D O
1612 .ds ref*spec!4 Q A T2 R G P I C D O
1619 .ie d ref*spec!\\$1 .ref*build \\*[ref*spec!\\$1]
1621 . @error unknown reference type `\\$1'
1622 . ref*build \\*[ref*spec!0]
1628 .\" start of reference number
1629 .ds [. \\*[par@sup-start]
1630 .\" end of reference number
1631 .ds .] \\*[par@sup-end]
1632 .\" period before reference
1634 .\" period after reference
1636 .\" comma before reference
1638 .\" comma after reference
1640 .\" start collected references
1642 .als ref*print ref*end-print
1647 .\" end collected references
1650 .als ref*print ref*normal-print
1652 .de ref*normal-print
1653 .ie d [F .FS "\\*([.\\*([F\\*(.]"
1659 .ie d [F .IP "\\*([F."
1663 .als ref*print ref*normal-print
1665 .rm ref*string ref*post-punct
1666 .nr ref*suppress-period 1
1669 . ie d ref*add-\\$1 .ref*add-\\$1
1670 . el .ref*add-dflt \\$1
1674 .\" now add a final period
1675 .ie d ref*string \{\
1676 . if !\\n[ref*suppress-period] .as ref*string .
1677 . if d ref*post-punct \{\
1678 . as ref*string "\\*[ref*post-punct]
1685 .ref*field T , "\fI" "" "\fP"
1686 .if r [T .nr ref*suppress-period \\n([T
1689 .ref*field T , "\\*Q" "" "\\*U"
1690 .if r [T .nr ref*suppress-period \\n([T
1693 .ie \\n([P>0 .ref*field P , "pp. "
1694 .el .ref*field P , "p. "
1697 .ref*field J , \fI "" \fP
1703 .ref*field E , "ed. "
1709 .ref*field B "" "in \fI" "" \fP
1713 .ie r [O .nr ref*suppress-period \\n([O
1714 .el .nr ref*suppress-period 1
1718 .if r [A .nr ref*suppress-period \\n([A
1723 .\" First argument is the field letter.
1724 .\" Second argument is the punctuation character to use to separate this field
1725 .\" from the previous field.
1726 .\" Third argument is a string with which to prefix this field.
1727 .\" Fourth argument is a string with which to postfix this field.
1728 .\" Fifth argument is a string to add after the punctuation character supplied
1729 .\" by the next field.
1731 .if d ref*string \{\
1732 . ie d ref*post-punct \{\
1733 . as ref*string "\\$2\\*[ref*post-punct] \"
1736 . el .as ref*string "\\$2 \"
1738 .as ref*string "\\$3\\*([\\$1\\$4
1739 .if \\n[.$]>4 .ds ref*post-punct "\\$5
1740 .nr ref*suppress-period 0
1742 .\" ****************************
1743 .\" ******** module acc ********
1744 .\" ****************************
1745 .\" Accents and special characters.
1750 .\" The idea of this definition is for the top of the 3 to be at the x-height.
1751 .if !c\[yogh] .char \[yogh] \Z'\v'\w'x'*0-\En[rst]u'\s[\En[.s]*8u/10u]\
1752 \v'\w'3'*0+\En[rst]u'3\s0
'\h'\w
'\s[\En[.s]*8u/10u]3'u
'
1755 .ds \\$1 \Z'\v'(u;\w'x
'*0+\En[rst]-\En[.cht])'\
1756 \h
'(u;-\En[skw]+(-\En[.w]-\w'\\$
2'/2)+\En[.csk])'\\$
2'
1759 .ds \\$1 \Z'\v'\En[.cdp]u'\h
'(u;-\En[.w]-\w'\\$
2'/2)'\\$
2'
1762 .ds \\$1 \Z'\h
'(u;-\En[.w]-\w'\\$
2'/2)'\
1763 \v'(u;\En[.cdp]-\En[.cht]+\En[rst]+\En[rsb]/2)'\\$
2'
1766 .ds \\$1 \Z'\h
'(u;\w'x
'-\w'\\$
2'/2)'\\$
2'
1768 .acc*prefix-def ' \'
1769 .acc*prefix-def ` \`
1771 .acc*prefix-def , \(ac
1772 .acc*prefix-def : \(ad
1774 .\" improved accent marks
1780 .acc*over-def : \(ad
1781 .acc*over-def v \(ah
1782 .acc*over-def _ \(a-
1783 .acc*over-def o \(ao
1784 .acc*under-def , \(ac
1785 .acc*under-def . \s[\En[.s]*8u/10u]\v'.2m'.\v'-.2m'\s0
1786 .acc*under-def hook \(ho
1788 .char \[hooko] o\\\\*[hook]
1791 .ds D- \(-D\" Icelandic uppercase eth
1792 .ds d- \(Sd\" Icelandic lowercase eth
1793 .ds Th \(TP\" Icelandic uppercase thorn
1794 .ds th \(Tp\" Icelandic lowercase thorn
1795 .ds 8 \(ss\" German double s
1796 .ds Ae \(AE\" AE ligature
1797 .ds ae \(ae\" ae ligature
1798 .ds Oe \(OE\" OE ligature
1799 .ds oe \(oe\" oe ligature
1800 .ds ? \(r?\" upside down ?
1801 .ds ! \(r!\" upside down !
1803 .\" Make sure that no blank lines creep in at the end of this file.