2 Copyright
(C
) 1990, 1991 Free Software Foundation
, Inc.
3 Written by James Clark
(jjc@jclark.uucp
)
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
1, 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 LICENSE. 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.
27 .if r GS .nx /dev/null
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]
216 .als cov*ab-init @nop
232 .als AB cov*err-not-after-ab
257 .ie '\\n(.z'cov*ab-div' \{\
258 . als AE cov*err-not-again
261 .\" nr cov*ab-height \\n[dn]
266 .el .@error AE without AB
268 .de @div-end!cov*ab-div
274 . ie \\n[cov*rp-format] .cov*rp-print
275 . el .cov*draft-print
278 . if \\n[cov*rp-format] \{\
279 . @warning RP format but no TL
288 .nr cov*page-length \\n[.p]
300 .if \\n[cov*fn-height] \{\
301 . sp |(u;\\n[cov*page-length]-\\n[FM]\
302 -\\n[cov*fn-height]-\\n[fn@sep-dist]>?\\n[nl])
307 . ie \\n[cov*rp-no] .rm cov*fn-div
309 . rn cov*fn-div fn@overflow-div
310 . nr fn@have-overflow 1
315 .\" If anything was printed below where the footer line is normally printed,
316 .\" then that's an overflow.
317 .if -\\n[FM]/2+1v+\\n[cov*page-length]<\\n[nl] .@error cover sheet overflow
318 .pl \\n[cov*page-length]u
320 .if !\\n[cov*rp-no] .cov*tl-au-print
342 .while \\n[cov*i]<=\\n[cov*n-au] \{\
344 . cov*au-div!\\n[cov*i]
345 . ie d cov*ai-div!\\n[cov*i] \{\
347 . cov*ai-div!\\n[cov*i]
357 .\" start of footnote on cover
359 .if \\n[cov*in-fn] \{\
367 .if !\\n[cov*fn-height] .ns
368 .ie \\n[.$] .FP "\\$1" no
371 .de @div-end!cov*fn-div
374 .\" end of footnote on cover
376 .ie '\\n(.z'cov*fn-div' \{\
381 . nr cov*fn-height +\\n[dn]
383 .el .@error FE without matching FS
385 .\" ***************************
386 .\" ******** module pg ********
387 .\" ***************************
388 .\" Page-level formatting.
389 .\" > 0 if we have a footnote on the current page
402 .ds pg*OH '\\*[LH]'\\*[CH]'\\*[RH]'
403 .ds pg*EH '\\*[LH]'\\*[CH]'\\*[RH]'
404 .ds pg*OF '\\*[LF]'\\*[CF]'\\*[RF]'
405 .ds pg*EF '\\*[LF]'\\*[CF]'\\*[RF]'
413 .ie \\n%=1 .if \\n[pg*P1] .tl \\*[pg*OH]
415 . ie o .tl \\*[pg*OH]
427 .wh -\n[FM]u pg@bottom
428 .wh -\n[FM]u/2u pg*footer
432 .if !'\\n(.z'' .error-recover MC while diversion open
434 .ie \\n[pg@ncols]>1 .pg@super-eject
436 . \" flush out any floating keeps
437 . while \\n[kp@tail]>\\n[kp@head] \{\
443 . nr pg@colw \\n[LL]*7/15
444 . nr pg*gutw \\n[LL]-(2*\\n[pg@colw])
448 . nr pg@colw (n;\\$1)<?\\n[LL]
449 . ie \\n[.$]<2 .nr pg*gutw \\n[MINGW]
450 . el .nr pg*gutw (n;\\$2)
451 . nr pg@ncols \\n[LL]-\\n[pg@colw]/(\\n[pg@colw]+\\n[pg*gutw])+1
452 . ie \\n[pg@ncols]>1 \
453 . nr pg*gutw \\n[LL]-(\\n[pg@ncols]*\\n[pg@colw])/(\\n[pg@ncols]-1)
459 .nr pg@fn-colw \\n[pg@colw]*5/6
468 .\" top of page macro
470 .ch pg*footer -\\n[FM]u/2u
473 .nr pg@fn-bottom-margin 0
474 .nr pg*saved-po \\n[PO]
489 .\" Handle footnote overflow before floating keeps, because the keep
490 .\" might contain an embedded footnote.
497 .\" move pg@bottom and pg*footer out of the way
498 .ch pg@bottom \\n[.p]u*2u
499 .ch pg*footer \\n[.p]u*2u
504 .if \\n[pg@fn-flag] .fn@bottom-hook
506 .ie \\n[pg*col-num]<\\n[pg@ncols] .pg*end-col
510 'sp |\\n[pg*col-top]u
511 .po (u;\\n[pg*saved-po]+(\\n[pg@colw]+\\n[pg*gutw]*\\n[pg*col-num]))
512 .\"po +(u;\\n[pg@colw]+\\n[pg*gutw])
516 .po \\n[pg*saved-po]u
517 .\" Make sure we don't exit if there are still floats
or footnotes left-over.
518 .ie \\n[kp@head]<\\n[kp@tail]:\\n[fn@have-overflow] \{\
519 . \" Switching environments ensures that we don't get an unnecessary
520 . \" blank line at the top of the page.
526 . if r pg*next-number \{\
527 . pn \\n[pg*next-number]
529 . if d pg*next-format \{\
530 . af PN \\*[pg*next-format]
537 .\" pg@begin number format
540 . nr pg*next-number (;\\$1)
541 . ie \\n[.$]>1 .ds pg*next-format \\$2
542 . el .rm pg*next-format
544 .el .rr pg*next-number
547 .\" print the footer line
554 .\" flush out any keeps or footnotes
557 .if !'\\n
(.z'' .@error-recover diversion open while ejecting page
558 .\" Make sure we stay in the end macro while there is still footnote overflow
559 .\" left, or floating keeps.
560 .while \\n[kp@tail]>\\n[kp@head]:\\n[pg@fn-flag] \{\
567 .\" ***************************
568 .\" ******** module fn ********
569 .\" ***************************
573 .\" Round it vertically
575 .nr fn@sep-dist \n[.v]
579 .ds * \\*[par@sup-start]\En+[fn*text-num]\\*[par@sup-end]
583 .ie \\n[.$] .fn*do-FS "\\$1" no
585 . ie \\n[fn*text-num]>\\n[fn*note-num] .fn*do-FS \\n+[fn*note-num]
589 .\" Second argument of `no' means don't embellish the first argument.
591 .if \\n[fn*open] .@error-recover nested FS
594 . \" Ensure that the first line of the footnote is on the same page
595 . \" as the reference. I think this is minimal.
599 . ie \\n[pg@fn-flag] .nr fn*need +\\n[fn:PD]
600 . el .nr fn*need +\\n[fn@sep-dist]
601 . ne \\n[fn*need]u+\\n[.V]u>?0
611 .ie !\\n[fn*open] .@error FE without FS
619 .nr fn@have-overflow 0
620 .\" called at the top of each column
623 .nr fn*page-bottom-pos 0-\\n[FM]-\\n[pg@fn-bottom-margin]
624 .ch pg@bottom \\n[fn*page-bottom-pos]u
625 .if \\n[fn@have-overflow] \{\
626 . nr fn@have-overflow 0
634 .\" This is called at the bottom of the column if pg@fn-flag is set.
637 .nr fn@have-overflow 0
638 .nr fn@bottom-pos \\n[.p]-\\n[FM]-\\n[pg@fn-bottom-margin]+\\n[.v]
640 .nr fn@bottom-pos -\\n[.v]
642 .ie \\n[nl]+\\n[fn@sep-dist]+\n[.V]>\\n[fn@bottom-pos] \{\
643 . rn fn@div fn@overflow-div
644 . nr fn@have-overflow 1
647 . if \\n[pg@ncols]>1 \
648 . if \\n[fn*max-width]>\\n[pg@fn-colw] \
649 . nr pg@fn-bottom-margin \\n[.p]-\\n[FM]-\\n[nl]+1v
650 . wh \\n[fn@bottom-pos]u fn*catch-overflow
656 . if '\\n(.z'fn@overflow-div' \{\
658 . nr fn@have-overflow \\n[dn]>0
660 . ch fn*catch-overflow
663 .de fn*catch-overflow
669 .if '\\n[.ev]'fn' .ev
673 .als @div-end!fn*embed-div @div-end!fn@div
677 . if !\\n[pg@fn-flag] .ns
682 .ie '\\n(.z'fn@div' \{\
684 . nr fn*page-bottom-pos -\\n[dn]
685 . nr fn*max-width \\n[fn*max-width]>?\\n[dl]
686 . if !\\n[pg@fn-flag] .nr fn*page-bottom-pos -\\n[fn@sep-dist]
688 . nr fn*page-bottom-pos \\n[nl]-\\n[.p]+\n[.V]>?\\n[fn*page-bottom-pos]
689 . ch pg@bottom \\n[fn*page-bottom-pos]u
692 . ie '\\n(.z'fn*embed-div' \{\
694 . rn fn*embed-div fn*embed-div!\\n[fn*embed-count]
695 \!. fn*embed-start \\n[fn*embed-count]
697 ' sp (u;\\n[dn]+\\n[fn@sep-dist]+\\n[.V])
699 . nr fn*embed-count +1
703 . @error-recover unclosed diversion within footnote
712 . rm fn*embed-div!\\$1
718 \!. fn*embed-start \\$1
723 .ie '\\n(.z'fn*null' \{\
729 .\" It's important that fn@print-sep use up exactly fn@sep-dist vertical space.
733 .vs \\n[fn@sep-dist]u
738 .\" ***************************
739 .\" ******** module kp ********
740 .\" ***************************
747 .if !'\\n(.z'' .@error-recover KF while open diversion
754 .ie '\\n(.z'kp*div' .kp*end
756 . ie '\\n(.z'kp*fdiv' .kp*fend
757 . el .@error KE without KS or KF
767 .ie '\\n(.z'' .ds@need \\$1
770 .\" end non-floating keep
783 .\" end floating keep
788 .ie \\n[.t]-(\\n[.k]>0*1v)>\\n[dn] \{\
796 . rn kp*fdiv kp*div!\\n[kp@tail]
797 . nr kp*ht!\\n[kp@tail] 0\\n[dn]
801 .\" top of page processing for KF
804 .if !\\n[kp*doing-top] \{\
811 .\" If the first keep won't fit, only force it out if we haven't had a footnote
812 .\" and we're at the top of the page.
813 .nr kp*force \\n[pg@fn-flag]=0&(\\n[nl]<=\\n[pg@header-bottom])
815 .while \\n[kp@tail]>\\n[kp@head]&\\n[kp*fits] \{\
816 . ie \\n[.t]>\\n[kp*ht!\\n[kp@head]]:\\n[kp*force] \{\
818 . \" It's important to advance kp@head before bringing
819 . \" back the keep, so that if the last line of the
820 . \" last keep springs the bottom of page trap, a new
821 . \" page will not be started unnecessarily.
822 . rn kp*div!\\n[kp@head] kp*temp
832 .\" ***************************
833 .\" ******** module ds ********
834 .\" ***************************
835 .\" Displays and non-floating keeps.
837 .ds*end!\\n[\\n[.ev]:ds-type]
838 .nr \\n[.ev]:ds-type 0
841 .if \\n[\\n[.ev]:ds-type] \{\
842 . @error automatically terminating display
847 .ie \\n[\\n[.ev]:ds-type] .DE
851 .@error DE without DS, ID, CD, LD or BD
855 .nr \\n[.ev]:ds-type 1
862 .ie \\n[.$] .in +(n;\\$1)
877 .als ds*end!1 ds*common-end
880 .nr \\n[.ev]:ds-type 2
885 .ie '\\n(.z'ds*div' \{\
888 . in (u;\\n[.l]-\\n[dl]/2)
893 .el .@error-recover mismatched DE
900 . nr \\n[.ev]:ds-type 4
909 . ie '\\$1'I' .ID \\$2
914 . nr \\n[.ev]:ds-type 3
919 . while \\n[.t]<=(\\$1)&(\\n[nl]>\\n[pg@header-bottom]) \{\
927 .ie '\\n
(.z'ds*div' \{\
936 .el .@error-recover mismatched DE
939 .ie '\\n(.z'ds*div' \{\
943 . in (u;\\n[.l]-\\n[dl]/2)
949 .el .@error-recover mismatched DE
951 .\" ****************************
952 .\" ******** module par ********
953 .\" ****************************
954 .\" Paragraph-level formatting.
958 .\" If it's too big to be in points, treat it as units.
959 .ie (p;\\$1)>=40p .vs (u;\\$1)
963 .nr 0:li (u;\\n[LL]/12)
970 .aln \\n[.ev]:MCLL LL
972 .aln \\n[.ev]:MCLT LT
977 .\" happens when the first page begins
979 .if !rLT .nr LT \\n[LL]
980 .if !rFL .nr FL \\n[LL]*5/6
981 .if !rVS .nr VS \\n[PS]+2
989 .if !dFAM .ds FAM \\n[.fam]
1005 .if !rFPS .nr FPS \\n[PS]-2
1006 .if !rFVS .nr FVS (p;\\n[FPS]+2)
1008 .if !rFPD .nr FPD \\n[PD]/2
1015 .aln fn:MCLL pg@fn-colw
1016 .aln fn:MCLT pg@fn-colw
1022 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1025 .nr \\n[.ev]:ds-type 0
1035 .ie \\n[pg@ncols]>1 \{\
1036 . ll (u;\\n[\\n[.ev]:MCLL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
1037 . lt \\n[\\n[.ev]:MCLT]u
1040 . ll (u;\\n[\\n[.ev]:LL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
1041 . lt \\n[\\n[.ev]:LT]u
1043 .in (u;\\n[\\n[.ev]:li]+\\n[\\n[.ev]:pli])
1046 .ps \\n[\\n[.ev]:PS]
1047 .par*vs \\n[\\n[.ev]:VS]
1053 .\" This can be redefined by the user.
1059 .nr \\n[.ev]:pli \\$1
1060 .nr \\n[.ev]:pri \\$2
1062 .sp \\n[\\n[.ev]:PD]u
1073 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1077 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1078 .ti +\\n[\\n[.ev]:ai]u
1081 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1082 .par*start \\n[QI] \\n[QI]
1085 .par*start \\n[\\n[.ev]:PI] 0
1086 .ti -\\n[\\n[.ev]:PI]u
1089 .if \\n[.$]>1 .nr \\n[.ev]:ai (n;\\$2)
1090 .par*start \\n[\\n[.ev]:ai] 0
1092 . \" Divert the label so as to freeze any spaces.
1101 . ti -\\n[\\n[.ev]:ai]u
1102 . ie \\n[dl]+1n<=\\n[\\n[.ev]:ai] \\*[par*label]\h'|\\n[\\n[.ev]:ai]u'\c
1112 .nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
1113 .nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
1114 .nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
1115 .nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
1116 .nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
1118 .nr \\n[.ev]:li +\\n[\\n[.ev]:ai]
1119 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1124 .ie \\n[\\n[.ev]:il] \{\
1126 . nr \\n[.ev]:ai \\n[\\n[.ev]:ai!\\n[\\n[.ev]:il]]
1127 . nr \\n[.ev]:li \\n[\\n[.ev]:li!\\n[\\n[.ev]:il]]
1128 . nr \\n[.ev]:ri \\n[\\n[.ev]:ri!\\n[\\n[.ev]:il]]
1129 . nr \\n[.ev]:pli \\n[\\n[.ev]:pli!\\n[\\n[.ev]:il]]
1130 . nr \\n[.ev]:pri \\n[\\n[.ev]:pri!\\n[\\n[.ev]:il]]
1132 .el .@error unbalanced \\$0
1137 .nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
1138 .nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
1139 .nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
1140 .nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
1141 .nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
1143 .nr \\n[.ev]:li +\\n[QI]
1144 .nr \\n[.ev]:ri +\\n[QI]
1145 .nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
1149 .\" start boxed text
1157 .de @div-end!par*box-div
1161 .\" Postpone the drawing of the box until we're in the top-level diversion,
1162 .\" in case there's a footnote inside the box.
1164 .ie '\\n(.z'par*box-div' \{\
1172 . nr \\n[.ev]:ri -1n
1173 . nr \\n[.ev]:li -1n
1175 . par*box-draw \\n[.i]u \\n[.l]u
1177 .el .@error B2 without B1
1179 .de par*box-mark-top
1180 .ie '\\n[.z]'' .mk par*box-top
1181 .el \!.par*box-mark-top
1185 . nr par*box-in \\n[.i]
1186 . nr par*box-ll \\n[.l]
1187 . nr par*box-vpt \\n[.vpt]
1192 \D
'l (u;\\n[.l]-\\n[.i]) 0'\
1193 \D
'l 0 |\\n[par*box-top]u'\
1194 \D
'l -(u;\\n[.l]-\\n[.i]) 0'\
1195 \D
'l 0 -|\\n[par*box-top]u'
1198 . in \\n[par*box-in]u
1199 . ll \\n[par*box-ll]u
1200 . vpt \\n[par*box-vpt]
1202 .el \!.par*box-draw \\$1 \\$2
1206 .\" Keep together the heading and the first two lines of the next paragraph.
1207 .ne 3v+\\n[\\n[.ev]:PD]u+\\n(.Vu
1211 .\" TL, AU, and AI are aliased to these in cov*ab-init.
1231 .\" In paragraph macros.
1233 .ps \\n[\\n[.ev]:PS]
1246 . nr par*prev-font \\n[.f]
1247 \
&\\$
3\f[\\*[par
*font-name
!\\$
0]]\\$
1\f[\\n
[par
*prev-font
]]\\$
2
1249 .el .ft \\*[par*font-name!\\$0]
1251 .ds par*font-name!B B
1252 .ds par*font-name!I I
1253 .ds par*font-name!BI BI
1254 .ds par*font-name!CW CR
1257 .als BI par*set-font
1258 .als CW par*set-font
1259 .\" underline a word
1261 \Z
'\\$1'\v'.25m'\D
'l \w'\\$
1'u 0'\v'-.25m'\\$
2
1265 .nr par*bxw \w'\\$1'+.4m
1266 \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''\
1270 .\" The first time UX is used, put a registered mark after it.
1273 \s
[\\n
[.s]*8u/10u]UNIX\s0\\$1\\*[par*ux-rg]
1276 .ds par@sup-start \v'-.9m\s'\En[.s]*7u/10u'+.7m'
1277 .als { par@sup-start
1278 .ds par@sup-end \v'-.7m\s0+.9m'
1280 .\" footnote paragraphs
1281 .\" FF is the footnote format
1283 .\" This can be redefined. It gets a second argument of `no' if the first
1284 .\" argument was supplied by the user, rather than automatically.
1287 .if !d par*fp!\\n[FF] \{\
1288 . @error unknown footnote format `\\n[FF]'
1291 .ie '\\$2'no' .par*fp!\\n[FF]-no "\\$1"
1292 .el .par*fp!\\n[FF] "\\$1"
1296 \&\\*[par@sup-start]\\$1\\*[par@sup-end]\ \c
1319 .@IP "\\$1." (u;\\n[\\n[.ev]:PI]*2)
1322 .@IP "\\$1" (u;\\n[\\n[.ev]:PI]*2)
1324 .\" ***************************
1325 .\" ******** module nh ********
1326 .\" ***************************
1327 .\" Numbered headings.
1328 .\" nh*hl is the level of the last heading
1330 .\" numbered heading
1337 . nr H\\n[nh*hl] 0\\$1
1340 . if !\\n[nh*hl] \{\
1343 . @error missing arguments to .NH S
1347 . nr nh*ohl \\n[nh*hl]
1350 . ie \\n[nh*hl]<=0 \{\
1355 . if \\n[nh*hl]-\\n[nh*ohl]>1 \
1356 . @warning .NH \\n[nh*ohl] followed by .NH \\n[nh*hl]
1360 . while \\n[nh*hl]>\\n[nh*ohl] \{\
1368 .while \\n[nh*i]<\\n[nh*hl] \{\
1370 . as SN \\n[H\\n[nh*i]].
1375 .\" ****************************
1376 .\" ******** module toc ********
1377 .\" ****************************
1378 .\" Table of contents generation.
1384 .ie \\n[.$] .XA "\\$1"
1387 .de @div-end!toc*div
1391 .ie '\\n(.z'toc*div' \{\
1392 . if d toc*num .toc*end-entry
1394 . ie '\\$1'no' .ds toc*num
1395 . el .ds toc*num "\\$1
1397 . el .ds toc*num \\n[PN]
1400 .el .@error XA without XS
1403 .ie '\\n(.z'toc*div' \{\
1404 . if d toc*num .toc*end-entry
1408 .el .@error XS without XE
1426 .char \[toc*leader-char] .\h'1m'
1427 .lc \[toc*leader-char]
1428 .ta (u;\\n[.l]-\\n[.i]-\w'000') (u;\\n[.l]-\\n[.i])R
1433 .\" print the table of contents on page i
1439 .\" ****************************
1440 .\" ******** module eqn ********
1441 .\" ****************************
1450 .ie '\\$1'L' .nr eqn*type 0
1452 . ie '\\$1'I' .nr eqn*type 1
1455 . if !'\\$1'C' .ds eqn*num "\\$1
1462 .de @div-end!eqn*div
1465 .\" Note that geqn mark and lineup work correctly in centered equations.
1467 .ie !'\\n(.z'eqn*div' .@error-recover mismatched EN
1472 . if !'\\*[eqn*num]'' .nr eqn*have-num 1
1473 . if \\n[dl]:\\n[eqn*have-num] \{\
1476 . ds eqn*tabs \\n[.tabs]
1479 . ds@need \\n[dn]u-1v+\n[.V]u
1481 . ie \\n[eqn*type]=0 \{\
1482 . ta (u;\\n[.l]-\\n[.i])R
1483 \\*[eqn*div]\t\\*[eqn*num]
1486 . ie \\n[eqn*type]=1 .ta \\n[DI]u \
1487 (u;\\n[.l]-\\n[.i])R
1488 . el .ta (u;\\n[.l]-\\n[.i]/2)C \
1489 (u;\\n[.l]-\\n[.i])R
1490 \t\\*[eqn*div]\t\\*[eqn*num]
1494 . ta (u;\\n[.l]-\\n[.i])R
1503 .\" ****************************
1504 .\" ******** module tbl ********
1505 .\" ****************************
1507 .nr tbl*have-header 0
1509 .\" The break is necessary in the case where the first page has not yet begun.
1512 .if '\\$1'H' .di tbl*header-div
1515 .if \\n[tbl*have-header] \{\
1516 . ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl*print-header
1520 .de tbl*print-header
1527 .ie '\\n[.z]'tbl*header-div' \{\
1532 . ie \\n[dn]+\\n[FM]+\\n[HM]+2v>=\\n[.p] \{\
1533 . @error ridiculously long table header
1538 . nr tbl*header-ht \\n[dn]
1539 . ds@need \\n[dn]u+1v
1541 . nr tbl*have-header 1
1544 .el .@error-recover .TH without .TS H
1546 .de @div-end!tbl*header-div
1551 .ie '\\n(.z'tbl*header-div' .@error-recover .TS H but no .TH before .TE
1553 . nr tbl*have-header 0
1560 .if \\n[tbl*have-header] \{\
1567 .\" ****************************
1568 .\" ******** module pic ********
1569 .\" ****************************
1575 .ie \\n[.$]<2 .@error bad arguments to PS (not preprocessed with pic?)
1577 . ds@need (u;\\$1)+1v
1578 . in +(u;\\n[.l]-\\n[.i]-\\$2/2)
1585 .\" ****************************
1586 .\" ******** module ref ********
1587 .\" ****************************
1590 .rm [A [B [C [D [E [G [I [J [N [O [P [Q [R [S [T [V
1594 .ds ref*spec!0 Q A T S V N P I C D O
1596 .ds ref*spec!1 Q A T J S V N P I C D O
1598 .ds ref*spec!2 Q A T S V P I C D O
1599 .\" Article within book
1600 .ds ref*spec!3 Q A T B E S V P I C D O
1602 .ds ref*spec!4 Q A T R G P I C D O
1605 .ie d ref*spec!\\$1 .ref*build \\*[ref*spec!\\$1]
1607 . @error unknown reference type `\\$1'
1608 . ref*build \\*[ref*spec!0]
1614 .\" start of reference number
1615 .ds [. \\*[par@sup-start]
1616 .\" end of reference number
1617 .ds .] \\*[par@sup-end]
1618 .\" period before reference
1620 .\" period after reference
1622 .\" comma before reference
1624 .\" comma after reference
1626 .\" start collected references
1628 .als ref*print ref*end-print
1633 .\" end collected references
1636 .als ref*print ref*normal-print
1638 .de ref*normal-print
1639 .ie d [F .FS "\\*([.\\*([F\\*(.]"
1645 .ie d [F .IP "\\*([F."
1649 .als ref*print ref*normal-print
1651 .rm ref*string ref*post-punct
1652 .nr ref*suppress-period 1
1655 . ie d ref*add-\\$1 .ref*add-\\$1
1656 . el .ref*add-dflt \\$1
1660 .\" now add a final period
1661 .ie d ref*string \{\
1662 . if !\\n[ref*suppress-period] .as ref*string .
1663 . if d ref*post-punct \{\
1664 . as ref*string "\\*[ref*post-punct]
1671 .ref*field T , "\\*Q" "" "\\*U"
1672 .if r [T .nr ref*suppress-period \\n([T
1675 .ie \\n([P>0 .ref*field P , "pp. "
1676 .el .ref*field P , "p. "
1679 .ref*field J , \fI "" \fP
1685 .ref*field E , "ed. "
1691 .ref*field B "" "in \fI" "" \fP
1695 .ie r [O .nr ref*suppress-period \\n([O
1696 .el .nr ref*suppress-period 1
1700 .if r [A .nr ref*suppress-period \\n([A
1705 .\" First argument is the field letter.
1706 .\" Second argument is the punctuation character to use to separate this field
1707 .\" from the previous field.
1708 .\" Third argument is a string with which to prefix this field.
1709 .\" Fourth argument is a string with which to postfix this field.
1710 .\" Fifth argument is a string to add after the punctuation character supplied
1711 .\" by the next field.
1713 .if d ref*string \{\
1714 . ie d ref*post-punct \{\
1715 . as ref*string "\\$2\\*[ref*post-punct] \"
1718 . el .as ref*string "\\$2 \"
1720 .as ref*string "\\$3\\*([\\$1\\$4
1721 .if \\n[.$]>4 .ds ref*post-punct "\\$5
1722 .nr ref*suppress-period 0
1724 .\" ****************************
1725 .\" ******** module acc ********
1726 .\" ****************************
1727 .\" Accents and special characters.
1732 .if !c\(rg .char \(rg (R)
1733 .if !c\(ah .char \(ah \v'-.55m'\s[\En[.s]/2u]v\s0\v'.55m'
1734 .if !c\(ad .char \(ad \v'-.55m'\s[\En[.s]*7u/10u].\h'.05m'.\s0\v'.55m'
1735 .if !c\(a- .char \(a- \v'-.55m'\D'l .25m 0'\v'.55m'
1736 .if !c\(ao .char \(ao \v'-.55m'\s[\En[.s]*6u/10u]\D'c .25m'\s0\v'.55m'
1737 .if !c\(ac .char \(ac \s[\En[.s]*8u/10u]\v'.05m',\v'-.05m'\s0
1738 .if !c\(ho .char \(ho \s[\En[.s]/2u]\v'.4m'c\v'-.4m'\s0
1739 .if !c\(-D .char \(-D \Z'\v'-.1m'-'D
1740 .if !c\(Sd .char \(Sd \Z'\v'-.3m'\h'.2m'-'\(pd
1741 .if !c\(TP .char \(TP I\h'-.25m'\v'-.33m'\s[\En[.s]*6u/10u]\v'.33m'D\
1742 \v'-.33m'\s0\v'.33m'
1743 .if !c\(Tp .char \(Tp \zlp
1744 .if !c\(ss .char \(ss \(*b
1745 .if !c\(AE .char \(AE A\h'-.3m'E
1746 .if !c\(ae .char \(ae a\h'-.19m'e
1747 .if !c\(OE .char \(OE O\h'-.25m'E
1748 .if !c\(oe .char \(oe o\h'-.14m'e
1749 .if !c\(r? .char \(r? \Z'\h'.1m'\v'-.15m'\s[\En[.s]*7u/10u]i\s0\v'.15m''\
1750 \v'.15m'\s[\En[.s]*7u/10u]c\s0\v'-.15m'
1751 .if !c\(r! .char \(r! \h'.1m'\Z'\v'-.4m'\s[\En[.s]*8u/10u].\s0\v'.4m''\
1752 \s[\En[.s]*8u/10u]\v'.4m'\(or\v'-.4m'\s0\h'.1m'
1753 .\" The idea of this definition is for the top of the 3 to be at the x-height.
1754 .\" A yogh really ought to have a little line going north-west from the top
1756 .if !c\[yogh] .char \[yogh] \Z'\v'\w'x'*0-\En[rst]u'\s[\En[.s]*8u/10u]\
1757 \v'\w'3'*0+\En[rst]u'3\s0
'\h'\w
'\s[\En[.s]*8u/10u]3'u
'
1760 .ds \\$1 \Z'\v'(u;\w'x
'*0+\En[rst]-\En[.cht])'\
1761 \h
'(u;-\En[skw]+(-\En[.w]-\w'\\$
2'/2)+\En[.csk])'\\$
2'
1764 .ds \\$1 \Z'\v'\En[.cdp]u'\h
'(u;-\En[.w]-\w'\\$
2'/2)'\\$
2'
1767 .ds \\$1 \Z'\h
'(u;-\En[.w]-\w'\\$
2'/2)'\
1768 \v'(u;\En[.cdp]-\En[.cht]+\En[rst]+\En[rsb]/2)'\\$
2'
1771 .ds \\$1 \Z'\h
'(u;\w'x
'-\w'\\$
2'/2)'\\$
2'
1773 .acc*prefix-def ' \'
1774 .acc*prefix-def ` \`
1776 .acc*prefix-def , \(ac
1777 .acc*prefix-def : \(ad
1779 .\" improved accent marks
1785 .acc*over-def : \(ad
1786 .acc*over-def v \(ah
1787 .acc*over-def _ \(a-
1788 .acc*over-def o \(ao
1789 .acc*under-def , \(ac
1790 .acc*under-def . \s[\En[.s]*8u/10u]\v'.2m'.\v'-.2m'\s0
1791 .acc*under-def hook \(ho
1793 .char \[hooko] o\\\\*[hook]
1796 .ds D- \(-D\" Icelandic uppercase eth
1797 .ds d- \(Sd\" Icelandic lowercase eth
1798 .ds Th \(TP\" Icelandic uppercase thorn
1799 .ds th \(Tp\" Icelandic lowercase thorn
1800 .ds 8 \(ss\" German double s
1801 .ds Ae \(AE\" AE ligature
1802 .ds ae \(ae\" ae ligature
1803 .ds Oe \(OE\" OE ligature
1804 .ds oe \(oe\" oe ligature
1805 .ds ? \(r?\" upside down ?
1806 .ds ! \(r!\" upside down !
1808 .\" Make sure that no blank lines creep in at the end of this file.