5 Copyright (C) 1991-2014 Free Software Foundation, Inc.
6 mgm is written by Jörgen Hägg <jh@axis.com>
8 mgm is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 mgm is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 Please send bug reports with examples to bug-groff@gnu.org.
23 Naming convention stolen from mgs.
24 Local names module*name
25 Extern names module@name
29 .if !\n(.g .ab These mm macros require groff.
31 .if \n(.C .ab The groff mm macros do not work in compatibility mode.
32 .if (\n[.warn] == 65543) .warn
34 .\" ######## init #######
35 .\" Contents level [0:14], contents saved if heading level <= Cl
37 .\" Eject page between LIST OF XXXX if Cp == 0
41 .\" Eject after floating display is output [0:1]
43 .\" Floating keep output [0;5]
45 .\" space before and after display if == 1 [0:1]
49 .\" Equation label adjust 0=left, 1=right
51 .\" Bullet string (for .BL)
53 .el .ds BU \s-2\(bu\s0
59 .\" H1-H7 heading counters
74 .\" Heading break level [0:14]
76 .\" heading centering level, [0:14]
79 .ds HF 2 2 2 2 2 2 2 2 2 2 2 2 2 2
80 .\" heading temp. indent [0:2]
81 .\" 0 -> 0 indent, left margin
82 .\" 1 -> indent to right , like .P 1
83 .\" 2 -> indent to line up with text part of preceding heading
86 .ds HP 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87 .\" heading space level [0:14]
89 .\" heading numbering type
90 .\" 0 -> multiple (1.1.1 ...)
93 .\" Unnumbered heading level
95 .\" hyphenation in body
96 .\" 0 -> no hyphenation
97 .\" 1 -> hyphenation 14 on
99 .\" text for toc, selfexplanatory. Look in the new variable section
100 .ds Lf LIST OF FIGURES
102 .ds Lt LIST OF TABLES
104 .ds Lx LIST OF EXHIBITS
106 .ds Le LIST OF EQUATIONS
108 .\" List indent, used by .AL
110 .\" List space, if listlevel > Ls then no spacing will occur around lists.
112 .\" Numbering style [0:5]
114 .\" numbered paragraphs
115 .\" 0 == not numbered
116 .\" 1 == numbered in first level headings.
118 .\" Format of figure,table,exhibit,equation titles.
121 .\" Table of contents page numbering style
123 .\" Page-number, normally same as %.
127 .\" paragraph spacing
130 .\" 0 == left-justified
132 .\" 2 == indented .P except after .H, .DE or .LE.
136 .\" Reference page eject status
141 .\" Current state of TOC, empty outside TC, inside
142 .\" it will be set to co,fg,tb,ec,ex or ap.
147 .\"---------------------------------------------
148 .\" Internal global variables
150 .\" This is for cover macro .MT
154 .if r C .nr @copy_type \n[C]
155 .\" >0 if Subject/Date/From should be bold, roman otherwise
156 .ie n .ds @sdf_font R
158 .if \n[@copy_type]=4 \{\
166 . ie \n[E] .ds @sdf_font B
170 .\" Current pointsize and vertical space, always in points.
177 .if \n[D]>1 .tm @ps=\n[@ps], @vs=\n[@vs]
178 .if \n[D]>3 .tm INIT: l:\n[.l] p:\n[.p] o:\n[.o]
206 .\" non-zero if escape mechanism is turned off. Used by VERBON/OFF
208 .\"---------------------------------------------
213 .\" print appendixheader, 0 == don't
216 .\" Current appendix text
218 .\" Controls the space before and after static displays if defined.
219 .\" Lsp is used otherwise
222 .\" Add a dot after level one heading number if >0
225 .\" header prespace level. If level <= Hps, then two lines will be printed
226 .\" before the header instead of one.
229 .\" These variables controls the number of lines preceding .H.
230 .\" Hps1 is the number of lines when level > Hps
234 .\" Hps2 is the number of lines when level <= Hps
238 .\" Hss is the number of lines (Lsp) after the header.
241 .\" H1txt will be updated by .H and .HU, containing the heading text.
242 .\" Will also be updated in table of contents & friends
246 .\" header text for the index
248 .\" command to sort the index
252 .if !r Idxf .nr Idxf 0
253 .\" Change these in the national configuration file
259 .\" Flag for space between mark and prefix 1==space, 0==no space
260 .\" Can also be controlled by using '.LI mark 2'
263 .\" Lsp controls the height of an empty line. Normally 0.5v
264 .\" Normally used for nroff compatibility.
280 .ds Qrf See chapter \\*[Qrfh], page \\*[Qrfp].
282 .\" header- and footer-size will only change to the current
286 .\" section-page if Sectp > 0
288 .if (\n[N]=3):(\n[N]=5) \{\
292 .\" section-figure if Sectf > 0
294 .if \n[N]=5 .nr Sectf 1
296 .\" argument to .nm in .VERBON.
298 .\" indent for VERBON
302 .\" Formal closing (.FC)
303 .ds Letfc Yours very truly,
307 .\" Approval date-string
310 .ds LetCN CONFIDENTIAL\" Confidential default
311 .ds LetSA To Whom It May Concern:\" Salutation default
312 .ds LetAT ATTENTION:\" Attention string
313 .ds LetSJ SUBJECT:\" Subject string
314 .ds LetRN In reference to:\" Reference string
318 .ds Letns!copy Copy \" space!
321 .ds Letns!1 Copy (with att.) to
322 .ds Letns!2 Copy (without att.) to
327 .ds Letns!7 Under separate cover
328 .ds Letns!8 Letter to
329 .ds Letns!9 Memorandum to
330 .ds Letns!10 Copy (with atts.) to
331 .ds Letns!11 Copy (without atts.) to
332 .ds Letns!12 Abstract Only to
333 .ds Letns!13 Complete Memorandum to
336 .\" Text printed below the footer. Controlled by @copy_type (C).
338 .ds Pg_type!1 OFFICIAL FILE COPY
339 .ds Pg_type!2 DATE FILE COPY
340 .ds Pg_type!3 D\ R\ A\ F\ T
341 .ds Pg_type!4 D\ R\ A\ F\ T
342 .\" Max lines in return address
344 .\"--------------------------
345 .\" test for mgm macro. This can be used if the text must test
346 .\" what macros is used.
349 .\" Due to security problems with groff I had to rewrite
350 .\" the reference system. It's not as elegant as before, you
351 .\" have to run groff with '-z -rRef=1' and put stderr into the filename
354 .\" Output references to stderr if non-zero
360 .\"---------------------------------------------
361 .\" set local variables.
362 .ie d @country .mso mm/\*[@country]_locale
364 .\"---------------------------------------------
365 .if \n[D] .tm Groff mm, version \*[RE].
366 .\" ####### module init ######
369 .ie \\n[misc@adjust] 'ad
379 'tm WARNING:(\\n[.F]) input line \\n[.c]:\\$*
380 .if \\n[D] .backtrace
383 'tm ******************
384 'tm ERROR:(\\n[.F]) input line \\n[.c]:\\$*
385 .if \\n[D] .backtrace
386 'tm ******************
387 .ab "Input aborted, syntax error"
390 .tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
393 .tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz
396 .\" ####### module debug #################################
398 'tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s],\\n[.ps] \
399 in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%]
404 'tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s] in=\\n[.i]\
405 ad=\\n[.j] fi=\\n[.u] pl=\\n[.p] page=\\n[%] .o=\\n[.o]
406 'tm _______ .d=\\n[.d] .f=\\n[.f] .h=\\n[.h] .k=\\n[.k] .n=\\n[.n]\
407 .p=\\n[.p] .t=\\n[.t] .z=\\n[.z] nl=\\n[nl] dn=\\n[dn] n=\\n[debug*n]
409 .\" ####### module par #################################
410 .nr par@ind-flag 1 \" indent on following P if Pt=2
417 .nr par*num-count 0 1
419 .\" reset numbered paragraphs, arg1 = headerlevel
421 .if \\$1<3 .nr par*num-count 0
422 .if (\\$1=1)&(\\n[Np]=1) .nr par*number 0
427 .\" skip P if previous heading
429 . tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos]
430 . tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize]
432 .if !((\\n[nl]=\\n[hd*last-pos])&(\\n[hd*last-hsize]=\\n[.k])) \{\
433 . if \\n[D]>2 .tm Paragraph set ind-flag=1
435 . \" any collected unprinted text?
438 .if \\n[Np] \\n[H1].\\n+[par*number]\ \ \c
442 .\" skip P if previous heading
444 . tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos]
445 . tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize]
447 .if !((\\n[nl]=\\n[hd*last-pos])&(\\n[hd*last-hsize]=\\n[.k])) \{\
448 . if \\n[D]>2 .tm Paragraph set ind-flag=1
452 \\n[H2].\\n+[par*number2]\ \ \c
457 .SP (u;\\n[Ps]*\\n[Lsp])
459 . if \\$1=1 .ti +\\n[Pi]n
462 . if \\n[Pt]=1 .ti +\\n[Pi]n
463 . if (\\n[Pt]=2)&\\n[par@ind-flag] .ti +\\n[Pi]n
466 .\" ####### module line #######################################
469 .if !r line*lp\\n[.z] .nr line*lp\\n[.z] 0
470 .if !r line*ac\\n[.z] .nr line*ac\\n[.z] 0
471 .ie \\n[.$] .nr line*temp (v;\\$1)
474 .ie \\n[line*lp\\n[.z]]=\\n[.d] \{\
475 . \" go here if no output since the last .SP
476 . nr line*output \\n[line*temp]-\\n[line*ac\\n[.z]]
477 . if \\n[line*output]<0 .nr line*output 0
478 . nr line*ac\\n[.z] +\\n[line*output]
481 . nr line*ac\\n[.z] \\n[line*temp]
482 . nr line*output \\n[line*temp]
483 . \" no extra space in the beginning of a page
484 . if (\\n[.d]<0):(\\n[pg*head-mark]=\\n[.d]) .nr line*output 0
486 .if \\n[line*output] .sp \\n[line*output]u
487 .nr line*lp\\n[.z] \\n[.d]
489 .\" ######## module misc ###############
493 . if \\$1-1 .@error "SA: bad arg: \\$1"
494 . nr misc@adjust 0\\$1
496 .ie \\n[misc@adjust] 'ad
500 .\" switch environment, keep all important settings.
508 .\" .misc@push stackname value
510 .ie d misc*st-\\$1 .ds misc*st-\\$1 \\$2 \\*[misc*st-\\$1]
511 .el .ds misc*st-\\$1 \\$2
514 .\" .misc@pop stackname
515 .\" value returned in the string misc*pop
517 .misc@pop-set misc*st-\\$1 \\*[misc*st-\\$1]
521 .ds misc*st-name \\$1
523 .if \\n[.$]<1 .@error "stack \\*[misc*st-name] empty"
526 .ds \\*[misc*st-name] \\$*
529 .\" .misc@pop-nr stackname varname
532 .nr \\$2 0\\*[misc*pop]
535 .\" .misc@pop-ds stackname varname
538 .ds \\$2 \\*[misc*pop]
546 .\" .PGFORM linelength [ pagelength [ pageoffset [1]]]
548 .\" Break here to avoid problems with new linesetting of the previous line.
549 .\" Hope this doesn't break anything else :-)
550 .\" Don't break if arg_4 is a '1'.
551 .if \\n[D]>2 .tm PGFORM: \\$*
553 .if \\n[D]>3 .tm PGFORM: IN l:\\n[.l] p:\\n[.p] o:\\n[.o]
557 . nr @cur-ll \\n[@ll]
576 .if \\n[D]>3 .tm PGFORM: OUT l:\\n[.l] p:\\n[.p] o:\\n[.o]
577 .if \\n[D]>2 .tm PGFORM: ll=\\n[@ll], pl=\\n[@pl], po=\\n[@po]
586 .\" .MOVE y [[x] linelength]
587 .\" move to line y, indent to x
589 .if !\\n[.$] .@error "MOVE y [x]: no arguments"
594 .ie \\n[.$]>2 .nr pg*i (n;\\$3)
596 . ie \\n[.$]>1 .nr pg*i (n;\\n[@ll]u-\\$2)
597 . el .nr pg*i \\n[@ll]u
599 .\" move to X-pos, if any
600 .if !''\\$2' .po \\$2
606 .if !\\n[.$] .@error "SM: no arguments"
607 .if \\n[.$]=1 \s-1\\$1\s0
608 .if \\n[.$]=2 \s-1\\$1\s0\\$2
609 .if \\n[.$]=3 \\$1\s-1\\$2\s0\\$3
612 .nr misc*S-ps \n[@ps]
613 .nr misc*S-vs \n[@vs]
614 .nr misc*S-ps1 \n[@ps]
615 .nr misc*S-vs1 \n[@vs]
624 . ie \\n[.$]=1 .ds misc*b D
626 . ie \w@\\$2@=0 .ds misc*b C
629 . ie \w@\\$1@=0 .ds misc*a C
634 .if !'\\*[misc*a]'C' \{\
635 . ie '\\*[misc*a]'P' .ps \\n[misc*S-ps]u
637 . ie '\\*[misc*a]'D' .ps \\n[S]
639 . if \\n[D]>2 .tm S: .ps \\*[misc*a]
643 .\" set vertical spacing
644 .if !'\\*[misc*b]'C' \{\
645 . ie '\\*[misc*b]'P' .vs \\n[misc*S-vs]u
647 . ie '\\*[misc*b]'D' .vs \\n[.ps]s+2p
649 . if \\n[D]>2 .tm S: .vs \\*[misc*b]
659 . tmc "S(\\$*): ma:\\*[misc*a], mb:\\*[misc*b]
660 . tm1 " => ps:\\n[.s]p (\\n[@psu]u), vs:\\n[@vsp]p (\\n[@vs]u) (res:\\n[@res])
662 .nr misc*S-ps \\n[misc*S-ps1]
663 .nr misc*S-vs \\n[misc*S-vs1]
664 .nr misc*S-ps1 \\n[@ps]
665 .nr misc*S-vs1 \\n[@vs]
689 . ds \\$3 "\\*[misc*rd]
693 .if !''\\$2' .rn misc*rd \\$2
697 .\" VERBON [flag [pointsize [font]]]
701 .\" 1 add an empty line before verbose text
702 .\" 2 add an empty line after verbose text
703 .\" 3 numbered lines (controlled by the string Verbnm)
704 .\" 4 indent text by the numbervariable Verbin.
708 .if (0\\n[misc*verb]%4)/2 .SP \\n[Lsp]u
709 .misc@ev-keep misc*verb-ev
711 .if (0\\n[misc*verb]%16)/8 .nm \\*[Verbnm]
712 .ie !'\\$3'' .ft \\$3
721 .if (0\\n[misc*verb]%32)/16 .in +\\n[Verbin]u
722 .if 0\\n[misc*verb]%2 \{\
724 . nr @verbose-flag 1 \" tell pageheader to set ec/eo
730 .if (0\\n[misc*verb]%8)/4 .SP \\n[Lsp]u
731 .if (0\\n[misc*verb]%16)/8 .nm
732 .if (0\\n[misc*verb]%32)/16 .in
736 .\" Wrapper to cancel the side effect of .tag + .br generating
737 .\" unwanted vertical space.
739 .\" retain temporary indentation and horizontal position
740 .if !(\\n[.in]-\\n[.i]=0) .nr misc*ti \\n[.in]
755 .\" ######## module pict #################
761 .\" I assume that the number variable pict*id is the same
762 .\" between two runs.
784 . nr pict*ind (m;\\$2)
798 . nr pict*width (i;\\$1)
802 . nr pict*height (i;\\$1)
806 .\" let mmroff know the filename and id
808 . tm .\\\\" PIC id \\n[pict*id]
809 . tm .\\\\" PIC file \\*[pict*f]
811 .\" these are defined by mmroff in the second pass
812 .if d pict*file!\\n[pict*id] \{\
813 . ds pict*f \\*[pict*file!\\n[pict*id]]
814 . nr pict*llx \\n[pict*llx!\\n[pict*id]]
815 . nr pict*lly \\n[pict*lly!\\n[pict*id]]
816 . nr pict*urx \\n[pict*urx!\\n[pict*id]]
817 . nr pict*ury \\n[pict*ury!\\n[pict*id]]
819 . nr pict*w (p;\\n[pict*urx]-\\n[pict*llx])
820 . if \\n[pict*w]<0 .nr pict*w 0-\\n[pict*w]
821 . nr pict*h (p;\\n[pict*ury]-\\n[pict*lly])
822 . if \\n[pict*h]<0 .nr pict*h 0-\\n[pict*h]
823 . if \\n[pict*width]>0 \{\
824 . nr pict*rs (u;1000*\\n[pict*width]/\\n[pict*w])
825 . nr pict*w (u;\\n[pict*w]*\\n[pict*rs]/1000)
826 . nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000)
828 . if \\n[pict*height]>0 \{\
829 . nr pict*rs (u;1000*\\n[pict*height]/\\n[pict*h])
830 . nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000)
832 . if '0'\\n[pict*mode]' \{\
833 . nr pict*in \\n[.i]u
835 . if '1'\\n[pict*mode]' \{\
836 . nr pict*in (u;\\n[.l]-\\n[.i]-\\n[pict*w])
838 . if '2'\\n[pict*mode]' \{\
839 . nr pict*in \\n[pict*ind]u
841 . if '3'\\n[pict*mode]' \{\
842 . nr pict*in (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2)
845 . if \\n[pict*h]>0 .ds pict*h \\n[pict*h]
849 . \" these lines are copied and modified from pspic.tmac.
850 . \" Originally written by James Clark
852 . ie \\n[pict*box]>0 \{\
853 \v'-1v'\h'\\n[pict*in]u'\
854 \Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\
855 \v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \
856 \\n[pict*llx] \\n[pict*lly] \
857 \\n[pict*urx] \\n[pict*ury] \
858 \\n[pict*w] \\n[pict*h]'
861 \v'-1v'\h'\\n[pict*in]u'\
863 \Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\
865 \v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \
866 \\n[pict*llx] \\n[pict*lly] \
867 \\n[pict*urx] \\n[pict*ury] \
868 \\n[pict*w] \\n[pict*h]'
877 .if \\n[.$]<2 .@error "EPIC: Not enough arguments"
878 .nr pict*adj 0 \" centered
880 . shift 1 \" left adjust
886 .ds pict*name "External picture
887 .if !''$3' .ds pict*name \\$3
891 .if !\\n[pict*adj] .nr pict*ind (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2)
894 \D'l \\n[pict*w]u 0'\
895 \D'l 0 -\\n[pict*h]u'\
896 \D'l -\\n[pict*w]u 0'\
897 \D'l 0 \\n[pict*h]u'\
898 \v'-(u;\\n[pict*h]/2)'\
899 \h'(u;(\\n[pict*w]-\w'\\*[pict*name]'/2))'\\*[pict*name]
904 .\" ######## module acc #################
906 .\" accents. These are copied from mgs, written by James Clark.
908 .ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\
909 \h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2'
912 .ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2'
920 .acc@under-def , \(ac
921 .\" ######## module uni #################
922 .\" unimplemented macros
924 'tm "OK: not implemented"
927 'tm "PM: not implemented"
929 .\" ######## module hd #################
930 .\" support for usermacro
931 .nr hd*h1-page 1 \" last page-number for level 1 header.
942 .\" .hd@split varable index name val1 val2 ...
944 .if \\$2>(\\n[.$]-3) .@error "\\$3 must have at least \\$2 values (\\*[\\$3]).
946 .ds \\$1 \\$[\\n[hd*sp-tmp]]
953 .if !r hd*cur-bline .nr hd*cur-bline \\n[nl]
955 .df@print-float 2\" $$$ could be wrong...
956 .\" terminate all lists
961 .if !\\n[hd*level] .nr hd*level \\n[Hu]
963 .\" clear lower counters
965 .while \\n+[hd*i]<15 .if \\n[hd*level]<\\n[hd*i] .nr H\\n[hd*i] 0 1
967 .\" save last text for use in TP
968 .if \\n[hd*level]=1 .ds H1txt \\$2\\$3
970 .\" This is a little fix to be able to get correct H1 heading number
971 .\" in page headers. Special attention was needed when other formats are used.
973 . ds hd*format \\g[H1]
976 . af H1 \\*[hd*format]
978 .el .nr H1h \\n[H1] 1
979 .if \\n[hd*level]=1 .nr H1h +1
981 .\" Check if it's time for new page. Only if text has
983 .if \\n[Ej]&(\\n[Ej]>=\\n[hd*level])&(\\n[nl]>\\n[hd*cur-bline]) .pg@next-page
985 .\" increment current counter
986 .nr H\\n[hd*level] +1
988 .\" update pagenumber if section-page is used
989 .if (\\n[hd*level]=1)&(\\n[Sectp]>0) .hd@set-page 1
991 .\" hd*mark is the text written to the left of the header.
994 .if \\n[hd*level]>1 .as hd*mark \\n[H2]
997 .while \\n+[hd*i]<15 .if \\n[hd*level]>(\\n[hd*i]-1) .as hd*mark .\\n[H\\n[hd*i]]
998 .if \\n[Ht] .ds hd*mark \\n[H\\n[hd*level]].
1000 .\" special case, no dot after level one heading if not H1dot true
1001 .if (\\n[hd*level]=1)&(\\n[H1dot]=0) .ds hd*mark \\n[H1]
1003 .ds hd-mark-trimmed \\*[hd*mark]\" save hd-mark w/o spaces for references
1004 .as hd*mark \ \ \" add spaces between mark and heading
1005 .if !\\n[hd*arg1] .ds hd*mark\" no mark for unnumbered
1007 .if \\n[D]>1 .tm At header \\*[hd*mark] "\\$2"
1008 .nr hd*htype 0 \" hd*htype = check break and space
1009 . \" 0 = run-in, 1 = break only, 2 = space
1010 .if \\n[hd*level]<=\\n[Hb] .nr hd*htype 1
1011 .if \\n[hd*level]<=\\n[Hs] .nr hd*htype 2
1012 . \" two spaces if hd*htype == 0
1013 .ie (\\n[hd*htype]=0)&(\w@\\$2@) .ds hd*suf-space " \"
1014 .el .ds hd*suf-space
1015 .nr hd*need 2v \" hd*need = header need space
1016 .\"---------- user macro HX ------------
1017 .\" User exit macro to override numbering.
1018 .\" May change hd*mark (}0), hd*suf-space (}2) and hd*need (;3)
1019 .\" Can also change Hps1/2.
1020 .if d HX .HX \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
1021 .\"--------------------------------------
1023 .ie \\n[hd*level]<=\\n[Hps] .SP (u;\\n[Hps2])
1024 .el .SP (u;\\n[Hps1])
1026 .par@reset-num \\n[hd*level]\" reset numbered paragraph
1027 .\" start diversion to measure size of header
1029 \\*[hd*mark]\\$2\\$3\\*[hd*suf-space]
1033 .if \\n[hd*htype] .na \" no adjust if run-in
1034 .if \\n[hd*htype]<2 .nr hd*need +\\n[Lsp]u \" add some extra space
1035 .ne \\n[hd*need]u+\\n[dn]u+.5p-1v \" this is the needed space for a header
1037 .\" size and font calculations
1038 .hd@split hd*font \\n[hd*level] HF \\*[HF]\" get font for this level
1039 .ft \\*[hd*font]\" set new font
1040 .hd@split hd*new-ps \\n[hd*level] HP \\*[HP]\" get point size
1041 .ie (\\*[hd*new-ps]=0):(\w@\\*[hd*new-ps]@=0) \{\
1042 . if \\n[hd*htype] \{\
1043 . if '\\*[hd*font]'3' \{\
1047 . if '\\*[hd*font]'B' \{\
1055 . vs \\*[hd*new-ps]+2
1058 .\"---------- user macro HY -------------
1059 .\" user macro to reset indents
1060 .if d HY .HY \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
1061 .\" HTML: mark beginning of heading
1062 .misc@tag NH \\n[hd*level]
1063 .\"--------------------------------------
1064 .nr hd*mark-size \w@\\*[hd*mark]@
1065 .if (\\n[hd*level]<=\\n[Hc])&\\n[hd*htype] .ce\" center if level<=Hc
1067 .\" finally, output the header
1069 .\" and the rest of the header
1070 .ie \\n[hd*htype] \{\
1074 .el \\$2\\$3\\*[hd*suf-space]\&\c
1076 .\" restore pointsize and vertical size.
1080 .\" table of contents
1081 .if (\\n[hd*level]<=\\n[Cl])&\w@\\$2@ .toc@entry \\n[hd*level] "\\$2"
1082 .\" set adjust to previous value
1084 .\" do break or space
1085 .if \\n[hd*htype] .br
1086 .if \\n[hd*htype]>1 .SP (u;\\n[Lsp]*\\n[Hss])
1087 .if \\n[hd*htype] \{\
1088 . \" indent if Hi=1 and Pt=1
1089 . if (\\n[Hi]=1)&(\\n[Pt]=1) .ti +\\n[Pi]n
1090 . \" indent size of mark if Hi=2
1091 . if \\n[hd*htype]&(\\n[Hi]>1) .ti +\\n[hd*mark-size]u
1093 .nr par@ind-flag 0 \" no indent on .P if Pt=2
1095 .\" check if it is time to reset footnotes
1096 .if (\\n[hd*level]=1)&\\n[ft*clear-at-header] .nr ft*nr 0 1
1098 .\" check if it is time to reset indexes
1099 .if (\\n[hd*level]=1)&\\n[Sectf] \{\
1105 .\"---------- user macro HZ ----------
1106 .if d HZ .HZ \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
1107 .nr hd*last-pos \\n[nl]
1108 .nr hd*last-hsize \\n[.k]
1110 .\" HTML: end of heading
1116 .while \\n+[hd*i]<15 .af H\\n[hd*i] \\$[\\n[hd*i]] 1
1118 .\"----------------------
1119 .\" set page-nr, called from header
1123 .ie \\n[.$]>0 .nr P \\$1
1125 .\" Set section-page-string
1126 .ds hd*sect-pg \\n[H1]-\\n[P]
1127 .if \\n[Sectp]>1 .if '\\n[H1]'0' .ds hd*sect-pg "
1129 .\"########### module pg ####################
1130 .\" set end of text trap
1134 .ds pg*header ''- \\nP -''
1136 .if \n[N]=4 .ds pg*header ''''
1137 .if (\n[N]=3):(\n[N]=5) \{\
1139 . ds pg*footer ''\\*[hd*sect-pg]''
1147 .nr pg*foot-margin 0
1149 .nr pg*footer-size 5v\" 1v+footer+even/odd footer+2v
1150 .nr pg*header-size 7v\" 3v+header+even/odd header+2v
1151 .nr pg*extra-footer-size 0
1152 .nr pg*extra-header-size 0
1155 .nr pg*cols-per-page 1
1156 .nr pg*cur-po \n[@po]
1161 .\"-------------------------
1162 .\" footer TRAPS: set, enable and disable
1164 .nr pg*foot-trap \\n[@pl]u-(\\n[pg*block-size]u+\\n[ft*note-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]u+\\n[pg*extra-footer-size]u)
1166 .if \\n[D]>2 .tm pg*foot-trap \\n[@pl]u-(\\n[pg*block-size]u+\\n[ft*note-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]u+\\n[pg*extra-footer-size]u) = \\n[pg*foot-trap]
1168 .\" last-pos points to the position of the footer and bottom
1169 .\" block below foot-notes.
1170 .nr pg*last-pos \\n[@pl]u-(\\n[pg*block-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]u+\\n[pg*extra-footer-size]u)
1171 .if \\n[D]>2 .tm pg*last-pos \\n[@pl]u-(\\n[pg*block-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]u+\\n[pg*extra-footer-size]u) = \\n[pg*last-pos]
1174 .\" Disable in HTML mode
1175 .if !'\*[.T]'html' \{\
1176 .wh \\n[pg*foot-trap]u pg@footer
1177 .if \\n[D]>2 .tm pg@enable-trap .t=\\n[.t] nl=\\n[nl]
1184 .\" move to new trap (if changed).
1190 .de pg@enable-top-trap
1191 .\" set trap for pageheader.
1192 .nr pg*top-enabled 1
1194 .de pg@disable-top-trap
1195 .\" remove trap for pageheader.
1196 .nr pg*top-enabled 0
1198 .\" no header on the next page
1200 .nr pg*top-enabled (-1)
1202 .\" set first trap for pagefooter
1206 .\"-------------------------
1207 .\" stop output and begin on next page. Fix footnotes and all that.
1210 .ne 999i \" activate trap
1213 .\"-------------------------
1214 .\" support for PX, TP and EOP.
1216 .als }e pg*even-header
1217 .als }o pg*odd-header
1219 .als TPeh pg*even-header
1220 .als TPoh pg*odd-header
1223 .als }f pg*even-footer
1224 .als }p pg*odd-footer
1226 .als EOPef pg*even-footer
1227 .als EOPof pg*odd-footer
1228 .\"------------------------------------------------------------
1231 .\" Disable in HTML mode
1232 .if !'\*[.T]'html' \{\
1233 .if \\n[D]>1 .tm Page# \\n[%] (\\n[.F]:\\n[c.])
1234 .\" check if Hy has been changed
1238 .tl '<pagenr\ \\n[%]>'''
1240 .\" assign current page-number to P
1243 .nr line*lp\\n[.z] 0
1244 .nr line*ac\\n[.z] 0
1246 .\" suppress pageheader if pagenumber == 1 and N == [124]
1247 .if \\n[pg*top-enabled] \{\
1249 .\". pg@disable-top-trap
1250 . if \\n[pg*extra-header-size] 'sp \\n[pg*extra-header-size]u
1251 . if \\n[pg*top-margin] 'sp \\n[pg*top-margin]u
1254 . ie d let@header .let@header
1259 . ds hd*format \\g[P]
1261 . ie ((\\n[P]=1)&((\\n[N]=1):(\\n[N]=2))) .sp
1262 . el .tl \\*[pg*header]
1263 . af P \\*[hd*format]
1264 . ie o .tl \\*[pg*odd-header]
1265 . el .tl \\*[pg*even-header]
1276 . \" check for pending footnotes
1279 . \" back to normal text processing
1281 . \" mark for multicolumn
1282 . nr pg*head-mark \\n[nl]u
1283 . \" reset NCOL pointer at each new page.
1285 . \" set multicolumn
1288 . \" print floating displays
1293 .if \\n[pg*top-enabled]<0 .nr pg*top-enabled 1
1294 .nr hd*cur-bline \\n[nl] \" .H needs to know if output has occured
1297 .\"---------------------------------------------------------
1301 .if \\n[D]>2 .tm Footer# \\n[%] (\\n[.F]:\\n[c.]) nl=\\n[nl]
1305 .\" increment pageoffset for MC
1306 .\" move to the exact start of footer.
1307 'sp |\\n[pg*foot-trap]u+1v
1309 .if \\n[D]>3 .tm FOOTER after .sp, nl=\\n[nl]
1311 .if d ft*div .ft@print
1314 .if !\\n[pg*cur-column] .pg@print-footer
1318 .if \\n[@verbose-flag] .eo \" to help VERBON/VERBOFF
1320 .\"-------------------------
1322 .\" jump to the position just below the foot-notes.
1323 'sp |\\n[pg*last-pos]u+1v
1324 .if \\n[D]>3 .tm print-footer nl=\\n[nl]
1325 .\" check if there are any bottom block
1326 .if d pg*block-div .pg@block
1328 .\" print the footer and eject new page
1332 .\" user defined end-of-page macro
1335 . ie o .tl \\*[pg*odd-footer]
1336 . el .tl \\*[pg*even-footer]
1337 . ds hd*format \\g[P]
1339 . ie (\\n[P]=1)&(\\n[N]=1) .tl \\*[pg*header]
1340 . el .tl \\*[pg*footer]
1341 . af P \\*[hd*format]
1342 . tl ''\\*[Pg_type!\\n[@copy_type]]''
1346 .\" be sure that floating displays and footnotes will be
1347 .\" printed at the end of the document.
1348 .ie (\\n[df*fnr]>=\\n[df*o-fnr]):\\n[ft*exist] \{\
1355 .\"-------------------------
1357 .\" Initialize the title environment
1374 .\"-------------------------
1384 .ds pg*odd-header "\\$1
1388 .ds pg*even-header "\\$1
1392 .ds pg*odd-footer "\\$1
1396 .ds pg*even-footer "\\$1
1414 .\"-------------------------
1415 .\" end of page processing
1418 .\" output footnotes. set trap for block
1421 .\"-------------------------
1422 .\" print bottom block
1432 .\"-------------------------
1433 .\" define bottom block
1435 .misc@ev-keep pg*block-ev
1440 .\"-------------------------
1444 .nr pg*block-size \\n[dn]u
1448 .\"-------------------------
1449 .\" print out all pending text
1451 .if \\n[D]>2 .tm ---------- End of text processing ----------------
1455 .\"-------------------------
1456 .\" set top and bottom margins
1457 .\" -T sets pg*footer-size and pg*header-size instead
1462 . nr pg*footer-size 5v
1463 . nr pg*header-size 7v
1465 . if \\n[.$]>0 .nr pg*header-size (v;\\$1)
1466 . if \\n[.$]>1 .nr pg*footer-size (v;\\$2)
1470 . nr pg*extra-footer-size 0
1471 . nr pg*extra-header-size 0
1473 . if \\n[.$]>0 .nr pg*extra-header-size (v;\\$1)
1474 . if \\n[.$]>1 .nr pg*extra-footer-size (v;\\$2)
1476 . tm extra top \\n[pg*extra-footer-size]
1477 . tm extra bottom \\n[pg*extra-header-size]
1482 .\"---------------------
1483 .\" multicolumn output.
1485 .if \\n[pg*cols-per-page]>1 \{\
1486 . ll \\n[pg*column-size]u
1490 .if \\n[pg*cols-per-page]>1 \{\
1491 . ie \\n+[pg*cur-column]>=\\n[pg*cols-per-page] \{\
1492 . nr pg*cur-column 0 1
1493 . nr pg*cur-po \\n[@po]u
1498 . nr pg*cur-po +(\\n[pg*column-size]u+\\n[pg*column-sep]u)
1499 . po \\n[pg*cur-po]u
1500 ' sp |\\n[pg*head-mark]u
1505 .\" An argument disables the page-break.
1508 .if \\n[pg*cols-per-page]<=1 .@error "1C: multicolumn mode not active"
1509 .nr pg*cols-per-page 1
1511 .nr pg*column-size \\n[@ll]
1512 .nr pg*ncol-i \\n[pg*cur-column]\" temp variable
1513 .nr pg*cur-column 0 1
1514 .nr pg*cur-po \\n[@po]u
1519 . if \\n[pg*ncol-i]>0 \{\
1520 . @warning 1C: footnotes will be messy
1523 . if \\n[pg*last-ncol]>0 \{\
1524 . sp |\\n[pg*last-ncol]u
1531 .nr pg*head-mark \\n[nl]u
1532 .if \\n[pg*cols-per-page]>1 .@error "2C: multicolumn mode already active"
1533 .nr pg*cols-per-page 2
1534 .nr pg*column-sep \\n[@ll]/15
1535 .nr pg*column-size (\\n[@ll]u*7)/15
1536 .nr pg*cur-column 0 1
1537 .nr pg*cur-po \\n[@po]u
1538 .ll \\n[pg*column-size]u
1539 .\" .lt \\n[pg*column-size]u
1541 .\" MC column-size [ column-separation ]
1544 .nr pg*head-mark \\n[nl]u
1545 .if \\n[pg*cols-per-page]>1 .@error "MC: multicolumn mode already active"
1546 .ie ''\\$1' .nr pg*column-size \\n[.l]
1547 .el .nr pg*column-size (n;\\$1)
1548 .ie ''\\$2' .nr pg*column-sep \\n[pg*column-size]/15
1549 .el .nr pg*column-sep (n;\\$2)
1551 .\" calculate the number of columns/page
1552 .nr pg*cols-per-page 0
1553 .nr pg*i \\n[pg*column-size]
1554 .while \\n[pg*i]<=\\n[.l] \{\
1555 . nr pg*cols-per-page \\n[pg*cols-per-page]+1
1556 . nr pg*i \\n[pg*i]+\\n[pg*column-sep]+\\n[pg*column-size]
1558 .nr pg*cur-column 0 1
1559 .nr pg*cur-po \\n[@po]u
1560 .ll \\n[pg*column-size]u
1561 .\" .lt \\n[pg*column-size]u
1563 .\" begin a new column
1566 .if \\n[nl]>\\n[pg*last-ncol] .nr pg*last-ncol \\n[nl]
1574 .\" force new page by writing something invisible.
1575 .while \\n+[pg*i]<=(0\\$1) \{\
1580 .\"-------------------------------
1581 .\" MULB width1 space1 width2 space2 width3 space3 ...
1589 . nr pg*mul!\\n+[pg*i] (n;0\\$1)
1590 . nr pg*muls!\\n[pg*i] (n;0\\$2)
1593 .nr pg*mul-max-col \\n[pg*i]
1594 .ds pg*mul-fam \\n[.fam]
1595 .nr pg*mul-font \\n[.f]
1599 .fam \\*[pg*mul-fam]
1600 .ft \\n[pg*mul-font]
1608 .if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@error "MULN: Undefined columnwidth"
1610 .if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
1612 .in \\n[pg*mul-ind]u
1613 .ll (u;\\n[.i]+\\n[pg*mul!\\n+[pg*mul-x]])u
1614 .nr pg*mul-ind +(u;\\n[pg*mul!\\n[pg*mul-x]]+\\n[pg*muls!\\n[pg*mul-x]])
1620 .if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
1623 .ne \\n[pg*mul-last]u
1628 .sp \\n[pg*mul-last]u
1634 .ie o .if !\\n[pg*head-mark]=\\n[nl] \{\
1640 .\"########### module footnotes ###################
1645 .nr ft*hyphen 0\" hyphenation value
1646 .nr ft*adjust 1\" >0 if adjust true
1647 .nr ft*indent 1\" >0 if text indent true (not imp. $$$)
1648 .nr ft*just 0\" 0=left justification, 1=right (not imp. $$$)
1649 .nr ft*exist 0\" not zero if there are any footnotes to be printed
1650 .nr ft*clear-at-header 0\" >0 if footnotes should be reset at first level head.
1652 .ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m'
1654 .\"-----------------
1655 .\" init footnote environment
1657 .\" indentcontrol not implemented $$$
1658 .\" label justification not implemented $$$
1661 .ie \\n[ft*adjust] 'ad
1663 .ie \\n[ft*hyphen] 'hy 14
1670 .\"-----------------
1671 .\" set footnote format
1672 .\" no support for two column processing (yet). $$$
1674 .if \\n[.$]=0 .@error "FD: bad arg \\$1"
1675 .ie \\n[.$]=2 .nr ft*clear-at-header 1
1676 .el .nr ft*clear-at-header 0
1679 . ie \\$1>11 .nr ft*format 0
1680 . el .nr ft*format \\$1
1682 . nr ft*hyphen (\\n[ft*format]%2)*14
1683 . nr ft*format \\n[ft*format]/2
1685 . nr ft*adjust 1-(\\n[ft*format]%2)
1686 . nr ft*format \\n[ft*format]/2
1688 . nr ft*indent 1-(\\n[ft*format]%2)
1689 . nr ft*format \\n[ft*format]/2
1691 . nr ft*just \\n[ft*format]%2
1695 .\" Footnote and display width control $$$
1698 .while \\n+[ft*i]<=\\n[.$] \{\
1699 . ds ft*x \\$[\\n[ft*i]]
1700 . if '\\*[ft*x]'N' \{\
1704 . nr ds*float-break 1
1706 . if '\\*[ft*x]'-WF' .nr ft*wide 0
1707 . if '\\*[ft*x]'WF' .nr ft*wide 1
1708 . if '\\*[ft*x]'-FF' .nr ft*first-fn 0
1709 . if '\\*[ft*x]'FF' .nr ft*first-fn 1
1710 . if '\\*[ft*x]'-WD' \{\
1712 . if r ft*df-save \{\
1713 . nr Df \\n[ft*df-save]
1717 . if '\\*[ft*x]'WD' \{\
1719 . nr ft*df-save \\n[Df]
1722 . if '\\*[ft*x]'-FB' .nr ds*float-break 0
1723 . if '\\*[ft*x]'FB' .nr ds*float-break 1
1724 . if \\n[D]>1 .tm WC WF=\\n[ft*wide] WD=\\n[ds*wide]
1727 .\"-----------------
1729 .\" Change environment, switch to diversion and print the foot-note mark.
1731 .if \\n[ft*busy] .@error "FS: missing FE"
1735 .if !\\n[ft*wide] .pg@set-po
1737 .nr ft*space (u;\\n[Fs]*\\n[Lsp])
1740 .ie \\n[.$] .ds ft*mark \\$1
1741 .el .ds ft*mark \\n[ft*nr].
1747 .\"-----------------
1748 .\" init footnote diversion
1749 .de ft@init-footnote
1754 .nr ft*note-size \\n[dn]
1756 .\"-----------------
1758 .\" End the diversion, back to previous environment, and adjust
1759 .\" the trap to the new foot-note size.
1766 .if \\n[@pl]u<\\n[dn]u .@error "FE: too big footnote"
1767 .if !d ft*div .nr dn +1v
1768 .if \\n[D]>3 .tm FE: foot-trap=\\n[pg*foot-trap] .d=\\n[.d] dn=\\n[dn]
1769 .ie (\\n[pg*foot-trap]u-\\n[.d]u)<\\n[dn]u \{\
1776 . if !d ft*div .ft@init-footnote
1780 . nr ft*note-size +\\n[dn]
1786 .\"-----------------
1787 .\" print footnotes, see pg@footer
1800 .\"-----------------
1801 .\" check if any pending footnotes, see pg@header
1803 .if d ft*next-div \{\
1812 . nr ft*note-size +\\n[dn]
1819 .\"########### module display ###################
1820 .nr ds*wide 0\" >0 if wide displays wanted
1821 .nr df*fnr 0 1\" floating display counter
1822 .nr df*o-fnr 1\" floating display counter, already printed
1823 .nr ds*snr 0 1\" static display counter
1824 .nr ds*lvl 0 1\" display level
1825 .nr ds*float-busy 0\" >0 if printing float
1826 .nr df*float 0\" >0 if previous display was floating
1827 .\"--------------------------------------------
1829 .ie \\n[df*float] .df@end \\$@
1832 .\"--------------------------------------------
1833 .\" floating display start
1834 .\" nested DF/DE is not allowed.
1836 .if \\n[df*float] .@error "DF:nested floating is not allowed. Use DS."
1839 .nr df*old-ll \\n[.l]
1848 .ds@set-new-ev \\n[df*old-ll]
1852 .\"--------------------------------------------
1857 .nr df*width!\\n+[df*fnr] \\n[dl]
1858 .nr df*height!\\n[df*fnr] \\n[dn]
1859 .nr df*wide!\\n[df*fnr] \\n[ds*wide]
1860 .nr df*format!\\n[df*fnr] \\n[ds*format]
1862 .if \\n[D]>2 .tm DF:fnr=\\n[df*fnr] w=\\n[dl] h=\\n[dn] wide=\\n[ds*wide] \
1864 .\" move div to the floating display list
1865 .rn df*div df*fdiv!\\n[df*fnr]
1868 .\" print float if queue is empty and the display fits into
1869 .\" the current page
1870 .if ((\\n[df*fnr]>=\\n[df*o-fnr])&(\\n[dn]<\\n[.t])) .df@print-float 1
1874 .\" called by end-of-text
1877 .if \\n[df*o-fnr]<=\\n[df*fnr] \{\
1878 . if \\n[D]>2 .tm Print remaining displays.
1879 .\" still some floats left, make non-empty environment
1888 .\" print according to Df and De.
1889 .\" .df@print-float type
1890 .\" type called from
1892 .\" 2 end of section
1893 .\" 3 end of document
1894 .\" 4 beginning of new page
1897 .if \\n[Df]>5 .@error "Df=\\n[Df], max value is 5"
1898 .if !\\n[ds*float-busy] \{\
1899 . nr ds*float-busy 1
1901 . if \\n[D]>3 .tm print-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1903 . if (\\$1=1)&((\\n[Df]=1):(\\n[Df]=5)) \{\
1904 . if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\
1905 . \" Print only new displays.
1906 . if \\n[df*o-fnr]=\\n[df*fnr] \{\
1908 . ds@print-one-float
1913 . if (\\$1=1)&(\\n[Df]=3) \{\
1914 . if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\
1916 . ds@print-one-float
1919 .\" print all if Df<2 and end of section
1920 . if (\\$1=2)&(\\n[Sectp]>0)&(\\n[Df]<2) \{\
1922 . ds@print-all-floats
1924 .\" print all if end of document. Where should they go instead?
1927 . ds@print-all-floats
1930 . if (\\$1=4)&(\\n[Df]>1) \{\
1931 . if \\n[Df]=2 .ds@print-one-float
1932 . if \\n[Df]=3 .ds@print-one-float
1934 . ie \\n[De] .ds@print-all-floats
1935 . el .ds@print-this-page
1938 . nr ds*float-busy 0
1943 .\" print a floating diversion
1945 .nr df*old-ll \\n[.l]
1946 .nr df*old-in \\n[.i]
1949 .nr df*i \\n[df*o-fnr]
1950 .nr df*f \\n[df*format!\\n[df*i]]
1953 .if \\n[df*f]=1 'in +\\n[Si]n
1954 .if \\n[df*f]>=2 'in 0
1955 .if \\n[df*f]=2 'ce 9999
1956 .if \\n[df*f]=3 'in (u;(\\n[.l]-\\n[df*width!\\n[df*i]])/2)
1957 .if \\n[df*f]=4 'rj 9999
1958 .if \\n[df*f]=5 'in (u;\\n[.l]-\\n[df*width!\\n[df*i]])
1961 .df*fdiv!\\n[df*o-fnr]
1963 .if \\n[df*f]=2 'ce 0
1964 .if \\n[df*f]=4 'rj 0
1966 .rm df*fdiv!\\n[df*i]
1967 .rm df*height!\\n[df*i]
1968 .rm df*format!\\n[df*i]
1969 .if \\n[df*wide!\\n[df*i]] .nr pg*head-mark \\n[nl]u
1973 .\" print one floating display if there is one.
1974 .de ds@print-one-float
1975 .if \\n[df*o-fnr]<=\\n[df*fnr] \{\
1976 . if \\n[D]>3 .tm print-one-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1977 . if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .pg@next-page
1979 . if \\n[De] .pg@next-page
1983 .\" print all queued floats.
1984 .\" if De>0 do a page eject between the floats.
1985 .de ds@print-all-floats
1986 .while \\n[df*o-fnr]<=\\n[df*fnr] \{\
1987 . if \\n[D]>3 .tm print-all-floats: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1988 . if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .pg@next-page
1992 . if \\n[De] .pg@next-page
1996 .\" print as many floats as will fit on the current page
1997 .de ds@print-this-page
1998 .while \\n[df*o-fnr]<=\\n[df*fnr] \{\
1999 . if \\n[D]>3 .tm print-this-page: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
2000 . if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .break
2004 .\"---------------------------------------------------
2005 .\" get format of the display
2008 . ie r ds*format!\\$1 .nr ds*format \\n[ds*format!\\$1]
2009 . el .@error "DS/DF:wrong format:\\$1"
2012 .if \\n[D]>2 .tm set format=\\n[ds*format]
2013 .\" fill or not to fill, that is the...
2016 . ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2]
2017 . el .@error "\\*[ds*type]:wrong fill:\\$2"
2019 .if \\n[D]>2 .tm set fill=\\n[ds*fill]
2021 .if \\n[.$]>2 .nr ds*rindent \\$3
2022 .if \\n[D]>2 .tm set indent=\\n[ds*rindent]
2024 .\"-----------------------------
2025 .\" .ds@set-new-ev previous-line-length
2029 .if \\n[ds*rindent] \{\
2030 . ll -\\n[ds*rindent]n
2031 . lt -\\n[ds*rindent]n
2033 .if \\n[ds*wide] \{\
2038 .ie \\n[ds*fill] 'fi
2041 .\"--------------------------------------------------------
2042 .nr ds*format 0\" dummy value for .En/.EQ
2043 .nr ds*format! 0\" no indent
2044 .nr ds*format!0 0\" no indent
2045 .nr ds*format!L 0\" no indent
2046 .nr ds*format!I 1\" indent
2047 .nr ds*format!1 1\" indent
2048 .nr ds*format!C 2\" center each line
2049 .nr ds*format!2 2\" center each line
2050 .nr ds*format!CB 3\" center as block
2051 .nr ds*format!3 3\" center as block
2052 .nr ds*format!R 4\" right justify each line
2053 .nr ds*format!4 4\" right justify each line
2054 .nr ds*format!RB 5\" right justify as block
2055 .nr ds*format!5 5\" right justify as block
2057 .nr ds*fill! 0\" no fill
2058 .nr ds*fill!N 0\" no fill
2059 .nr ds*fill!0 0\" no fill
2060 .nr ds*fill!F 1\" fill on
2061 .nr ds*fill!1 1\" fill on
2062 .\"--------------------------------------------
2063 .\" static display start
2064 .\" nested DS/DE is allowed. No limit on depth.
2071 .nr ds*old-ll \\n[.l]
2072 .nr ds*old-in \\n[.i]
2073 .misc@push ds-in \\n[ds*old-in] \" Saving indent and line length of
2074 .misc@push ds-ll \\n[ds*old-ll] \" the text outside the display.
2075 .misc@push ds-form \\n[ds*format]
2078 .misc@ev-keep ds*ev!\\n+[ds*snr]
2082 .\" indent in a diversion doesn't seem like a good idea.
2084 .di ds*div!\\n[ds*snr]
2086 .ds@set-new-ev \\n[ds*old-ll]
2089 .\"--------------------------------------------
2091 .if \\n-[ds*lvl]<0 .@error "DE: no corresponding DS"
2095 .nr ds*width \\n[dl]
2096 .nr ds*height \\n[dn]
2097 .misc@pop-nr ds-ll ds*old-ll \" Restore indent and
2098 .misc@pop-nr ds-in ds*old-in \" line length
2099 .misc@pop-nr ds-form ds*format
2103 .\" calculate needed space
2104 .nr ds*need \\n[ds*height]
2105 .nr ds*i \\n[pg*foot-trap]-\\n[pg*header-size]u-\\n[pg*extra-header-size]u
2106 .if (\\n[ds*height]>\\n[ds*i])&(\\n[.t]<(\\n[ds*i]/2)) .nr ds*need \\n[.t]u+1v
2107 .if (\\n[ds*height]<\\n[ds*i])&(\\n[.t]<(\\n[ds*height])) .nr ds*need \\n[.t]u+1v
2108 .\" Eject page if display will fit one page and
2109 .\" there are less than half of the page left.
2110 .if \\n[ds*need] .ne \\n[ds*need]u
2112 .\" Print static display
2114 .if r Dsp .nr ds*i \\n[Dsp]
2116 .if \\n[Ds] .SP \\n[ds*i]u \" Space before display
2117 .\" check if pending equation label
2118 .eq@check \\n[ds*need]
2120 .if \\n[ds*format]=1 'in \\n[ds*old-in]u+\\n[Si]n
2121 .if \\n[ds*format]>=2 'in 0
2122 .if \\n[ds*format]=2 'ce 9999
2123 .if \\n[ds*format]=3 'in (u;(\\n[.l]-\\n[ds*width])/2)
2124 .if \\n[ds*format]=4 'rj 9999
2125 .if \\n[ds*format]=5 'in (u;\\n[.l]-\\n[ds*width])
2129 .if \\n[Ds] .SP \\n[ds*i]u \" Space after display
2131 .if \\n[ds*format]=2 'ce 0
2132 .if \\n[ds*format]=4 'rj 0
2133 .rm ds*div!\\n[ds*snr]
2138 .\"########### module list ###################
2139 .\" .LI text-indent mark-indent pad type [mark [LI-space [LB-space] ] ]
2150 .\"--------------------------
2151 .\" the major list-begin macro.
2152 .\" If type == -1 a 'break' will occur.
2154 .if \\n[.$]<4 .@error "LB: not enough arguments, min 4"
2155 .misc@push cind \\n[.i]
2156 .misc@push tind \\n[li*tind]
2157 .misc@push mind \\n[li*mind]
2158 .misc@push pad \\n[li*pad]
2159 .misc@push type \\n[li*type]
2160 .misc@push li-spc \\n[li*li-spc]
2161 .ds li*mark-list!\\n[li*lvl] \\*[li*mark]
2164 .nr li*tind (n;0\\$1)\" text-indent
2165 .nr li*mind (n;0\\$2)\" mark-indent
2166 .nr li*pad (n;0\\$3)\" pad
2167 .nr li*type 0\\$4\" type
2168 .ds li*mark \\$5\" mark
2169 .ie !'\\$6'' .nr li*li-spc \\$6\" LI-space
2171 .ie !'\\$7'' .nr li*lb-spc \\$7\" LB-space
2173 .\" init listcounter
2174 .nr li*cnt!\\n[li*lvl] 0 1
2176 .af li*cnt!\\n[li*lvl] 1
2177 .if \\n[li*type] .if !'\\*[li*mark]'' .af li*cnt!\\n[li*lvl] \\*[li*mark]
2179 .if \\n[li*lb-spc] .SP (u;\\n[li*lb-spc]*\\n[Lsp])
2184 .if \\n[li*lvl]<1 .@error "LI:no lists active"
2185 .if \\n[li*li-spc]&(\\n[Ls]>=\\n[li*lvl]) .SP (u;\\n[li*li-spc]*\\n[Lsp])
2188 .ds li*c-mark \\*[li*mark]
2189 .nr li*cnt!\\n[li*lvl] +1
2190 .if \\n[li*type]=1 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]].
2191 .if \\n[li*type]=2 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]])
2192 .if \\n[li*type]=3 .ds li*c-mark (\\n[li*cnt!\\n[li*lvl]])
2193 .if \\n[li*type]=4 .ds li*c-mark [\\n[li*cnt!\\n[li*lvl]]]
2194 .if \\n[li*type]=5 .ds li*c-mark <\\n[li*cnt!\\n[li*lvl]]>
2195 .if \\n[li*type]=6 .ds li*c-mark {\\n[li*cnt!\\n[li*lvl]]}
2196 .if \\n[.$]=1 .ds li*c-mark \\$1
2198 . ie (\\$2=2):(\\n[Limsp]=0) .ds li*c-mark \\$1\\*[li*c-mark]
2199 . el .ds li*c-mark \\$1\ \\*[li*c-mark]
2202 .\" determine where the text begins
2203 .nr li*text-begin \\n[li*tind]>?\w@\\*[li*c-mark]\ @
2205 .\" determine where the mark begin
2206 .ie !\\n[li*pad] .nr li*in \\n[li*mind]
2207 .el .nr li*in \\n[li*text-begin]-\\n[li*pad]-\w@\\*[li*c-mark]@
2208 .if !\\n[li*in] .nr li*in 0
2211 .\" no indentation if hanging indent
2212 .if (\w@\\*[li*c-mark]@=0)&((\\n[.$]=0):(\w@\\$1@=0)) .nr li*text-begin 0
2213 \Z'\&\h'\\n[li*in]u'\\*[li*c-mark]'\h'\\n[li*text-begin]u'\&\c
2214 .if \\n[li*type]=-1 .br
2220 .misc@pop-nr cind li*tmp
2222 .misc@pop-nr tind li*tind
2223 .misc@pop-nr mind li*mind
2224 .misc@pop-nr pad li*pad
2225 .misc@pop-nr type li*type
2226 .misc@pop-nr li-spc li*li-spc
2227 .ds li*mark \\*[li*mark-list!\\n[li*lvl]]
2230 .if \\n[li*lvl]<1 .@error "LE:mismatched"
2232 .if '\\$1'1' .SP \\n[Lsp]u
2235 .\" list status clear.
2236 .\" terminate all lists to level i
2238 .ie \\n[.$]<1 .nr li*i 0
2240 .if \\n[li*i]>\\n[li*lvl] .@error "LC: incorrect argument: \\n[li*i] (too big)"
2241 .while \\n[li*lvl]>\\n[li*i] .li@pop
2246 .if \\n[.$]>3 .@error "AL: too many arguments"
2247 .if \\n[D]>2 .tm AL $*
2248 .ie \\n[.$]<=1 .LB \\n[Li] 0 2 1 "\\$1"
2250 . ie \\n[.$]=2 .LB 0\\$2 0 2 1 "\\$1"
2252 . ie !'\\$2'' .LB \\$2 0 2 1 "\\$1" 0 1
2253 . el .LB \\n[Li] 0 2 1 "\\$1" 0 1
2258 .if \\n[.$]>3 .@error "ML: too many arguments"
2259 .if \\n[D]>2 .tm ML $*
2260 .nr li*ml-width \w@\\$1@u+1n
2261 .if \\n[.$]<2 .LB \\n[li*ml-width]u 0 1 0 "\\$1"
2262 .if \\n[.$]=2 .LB 0\\$2 0 1 0 "\\$1"
2264 . ie '\\$2'' .LB \\n[li*ml-width]u 0 1 0 "\\$1" 0 1
2265 . el .LB \\n[Li] 0 1 0 "\\$1" 0 1
2269 .if \\n[D]>2 .tm VL $*
2270 .if \\n[.$]>3 .@error "VL: too many arguments"
2271 .if \\n[.$]<1 .@error "VL: missing text-indent"
2272 .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0
2273 .el .LB 0\\$1 0\\$2 0 0 \& 0 1
2276 .if \\n[D]>2 .tm BL $*
2277 .if \\n[.$]>2 .@error "BL: too many arguments"
2278 .if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \\*[BU]
2279 .if \\n[.$]=1 .LB 0\\$1 0 1 0 \\*[BU]
2281 . ie '\\$1'' .LB \\n[Pi] 0 1 0 \\*[BU] 0 1
2282 . el .LB 0\\$1 0 1 0 \\*[BU] 0 1
2286 .if \\n[D]>2 .tm DL $*
2287 .if \\n[.$]>2 .@error "DL: too many arguments"
2288 .if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \(em
2289 .if \\n[.$]=1 .LB 0\\$1 0 1 0 \(em
2291 . ie '\\$1'' .LB \\n[Pi] 0 1 0 \(em 0 1
2292 . el .LB 0\\$1 0 1 0 \(em 0 1
2296 .if \\n[D]>2 .tm RL $*
2297 .if \\n[.$]>2 .@error "RL: too many arguments"
2298 .if \\n[.$]<1 .LB 6 0 2 4
2299 .if \\n[.$]=1 .LB 0\\$1 0 2 4
2301 . ie '\\$1'' .LB 6 0 2 4 1 0 1
2302 . el .LB 0\\$1 0 2 4 1 0 1
2305 .\" Broken Variable List. As .VL but text begin on the next line
2307 .if \\n[D]>2 .tm BVL $*
2308 .if \\n[.$]>3 .@error "BVL: too many arguments"
2309 .if \\n[.$]<1 .@error "BVL: missing text-indent"
2310 .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 -1
2311 .el .LB 0\\$1 0\\$2 0 -1 \& 0 1
2313 .\" ####### module tbl #######################################
2314 .\" This module is copied from groff_ms and modified for mgm.
2315 .\" Yes, it does not resemble the original anymore :-).
2316 .\" Don't know if I missed something important.
2317 .\" Groff_ms is written by James Clark.
2318 .nr tbl*have-header 0
2319 .nr tbl*header-written 0
2323 .if '\\$1'H' .di tbl*header-div
2326 .if \\n[tbl*have-header] \{\
2327 . ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl@print-header
2332 .if \\n[tbl*have-header] \{\
2334 .\" draw bottom and side lines of boxed tables.
2337 .nr tbl*header-written 0
2339 .de tbl@print-header
2345 .nr tbl*header-written 1
2348 .ie '\\n[.z]'tbl*header-div' \{\
2353 . nr tbl*header-ht \\n[dn]
2355 . nr tbl*have-header 1
2356 . ie '\\$1'N' .if !\\n[tbl*header-written] .tbl@print-header
2357 . el .tbl@print-header
2359 .el .@error ".TH without .TS H"
2362 .ie '\\n(.z'tbl*header-div' .@error ".TS H but no .TH before .TE"
2364 . nr tbl*have-header 0
2371 .\" ####### module pic #######################################
2376 .ie \\n[.$]<2 .@error "PS: bad arguments. Probably not processed with pic."
2378 . if !\\n[ds*lvl] .ne (u;\\$1)+1v
2379 .\" should be contained between .DS/.DE
2381 . if \\n[ds*lvl]&((\\n[ds*format]=2):(\\n[ds*format]=3)) \{\
2383 .\" . in +(u;\\n[.l]-\\n[.i]-\\$2/2)
2392 .\" ####### module eq #######################################
2400 .if !'\\*[eq*label]'' \{\
2402 . \" space down to middle of equation
2403 ' sp (u;(\\$1-1v)/2)
2404 . ie (\\n[Eq]%2) \{\
2405 . \" label to the left
2409 . \" label to the right
2410 \h'|\\n[.l]u-\w'\\*[eq*label]'u'\\*[eq*label]
2418 .\"########### module toc ###################
2419 .\" table of contents
2421 .nr toc*spacing \n[Lsp]u
2425 .\" Table of contents with friends (module lix)
2428 .\" print any pending displays and references
2430 .if \\n[ref*flag] .RP 0 1
2432 .if \w@\\$1@>0 .nr toc*slevel \\$1
2433 .if \w@\\$2@>0 .nr toc*spacing (u;\\$2*\\n[Lsp])
2434 .if \w@\\$3@>0 .nr toc*tlevel \\$3
2435 .if \w@\\$4@>0 .nr toc*tab \\$4
2436 .if \\n[pg*cols-per-page]>1 .1C
2437 .ds H1txt \\*[Licon]
2444 .if d Ci .toc@read-Ci \\*[Ci]
2447 .ie \\n[Oc] .hd@set-page 1
2452 . PF "''\\\\\\\\n[toc*pn]''"
2458 .while \\n+[toc*i]<10 \{\
2459 . if !'\\$\\n[toc*i]'' \{\
2465 .if \\n[.$]<=4 .if d TX .TX
2466 .ie d TY .if \\n[.$]<=4 .TY
2473 .if d toc*list .toc*list
2475 .\" print LIST OF XXX
2476 .if d lix*dsfg .lix@print-ds fg FG "\\*[Lf]" \\n[.$]
2477 .if d lix*dstb .lix@print-ds tb TB "\\*[Lt]" \\n[.$]
2478 .if d lix*dsec .lix@print-ds ec EC "\\*[Le]" \\n[.$]
2479 .if d lix*dsex .lix@print-ds ex EX "\\*[Lx]" \\n[.$]
2482 .\" .toc@read-Ci lev1 lev2 lev3 lev4 ... lev7
2485 .while \\n+[toc*i]<15 \{\
2486 . nr toc*hl!\\n[toc*i] \\$[\\n[toc*i]]
2492 . toc@save \\$1 "\\*[hd*mark]" "\\$2" \\*[hd*sect-pg]
2494 .el .toc@save \\$1 "\\*[hd*mark]" "\\$2" \\n[P]
2499 .\" collect maxsize of mark if string Ci don't exist.
2501 . if !r toc*hl!\\$1 .nr toc*hl!\\$1 0
2502 . if \\n[toc*hl!\\$1]<=\w@\\$2@ \{\
2503 . nr toc*hl!\\$1 \w@\\$2@u
2507 .\" .toc@set level headernumber text pagenr
2508 .toc@set \\$1 "\\$2" "\\$3" \\$4
2512 .\" level mark text pagenumber
2514 .if \\$1<=\\n[toc*slevel] .SP \\n[toc*spacing]u
2520 . nr toc*ind +\\n[toc*hl!\\$1]u
2523 . while \\n+[toc*i]<\\$1 \{\
2524 . nr toc*ind +\\n[toc*hl!\\n[toc*i]]u
2527 .nr toc*text \\n[toc*ind]u+\\n[toc*hl!\\$1]u
2529 .ti -\\n[toc*hl!\\$1]u
2531 .\" length of headernum space
2532 .nr toc*i \\n[toc*hl!\\$1]-\w@\\$2@
2534 .ll \\n[@ll]u-\w@\\$4@u-2m
2536 .\" ragged right ---------------------------------
2537 .ie \\$1>\\n[toc*tlevel] \{\
2544 . \" unnumbered heading --------------------
2549 . \" normal heading ------------------------
2557 . nr toc*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$4@)-1m
2558 \h'|\\n[.n]u'\l'\\n[toc*sep]u.'\h'1m'\\$4
2562 .\"########################### module lix ############################
2563 .\" LIST OF figures, tables, exhibits and equations
2574 .lix@print-line fg Lf \\n+[lix*fg-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2577 .lix@print-line tb Lt \\n+[lix*tb-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2580 .lix@print-line ec Le \\n+[lix*ec-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2583 .lix@print-line ex Lx \\n+[lix*ex-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2586 .\" print line with 'figure' in the text
2587 .\" type stringvar number text override flag refname
2591 .ie \\n[Sectf] .ds lix*numb \\n[H1]-\\$3
2592 .el .ds lix*numb \\$3
2594 .ie !\\n[Of] .ds lix*ds-form .\ \ \"
2595 .el .ds lix*ds-form "\ \(em\ \"
2597 .ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\*[lix*ds-form]
2599 . if !0\\$6 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*numb]\\*[lix*ds-form]
2600 . if 0\\$6=1 .ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\$5\\*[lix*ds-form]
2601 . if 0\\$6=2 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*ds-form]
2603 .\" print line if not between DS/DE
2604 .ie (\\n[ds*lvl]<1)&(\\n[df*float]=0) \{\
2605 . lix@print-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7
2608 . lix@embedded-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7
2613 .\" label text type stringvar refname
2615 .ie \\n[Sectp] .ds lix*pgnr \\*[hd*sect-pg]
2616 .el .ds lix*pgnr \\n[%]
2621 .ie (\w@\\$1\\$2@)>(\\n[.l]-\\n[.i]) \{\
2629 .\" save line for LIST OF XXX, wth is the width of the label
2630 .if !r lix*wth\\$3 .nr lix*wth\\$3 0
2631 .\" find the maximum width
2632 .if \w@\\*[lix*label]@>\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@
2633 .if \\n[\\$4] .lix@ds-save \\$3 \\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]"
2634 .\" save reference to the figure
2635 .if !'\\$5'' .SETR \\$5 \\*[lix*numb]
2637 .\" hide printout until diversion is evaluated
2638 .de lix@embedded-text
2639 \!.ie \\\\n[Sectp] .ds lix*pgnr \\\\*[hd*sect-pg]
2640 \!.el .ds lix*pgnr \\\\n[%]
2646 \!.ie (\w@\\$1\\$2@)>(\\\\n[.l]-\\\\n[.i]) \{\
2657 .\" save line for LIST OF XXX, wth is the width of the label
2658 \!.if !r lix*wth\\$3 .nr lix*wth\\$3 0
2659 .\" find the maximum width
2660 \!.if \w@\\*[lix*label]@>\\\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@
2661 \!.if \\\\n[\\$4] .lix@ds-save \\$3 \\\\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]"
2662 .\" save reference to the figure
2663 \!.if !'\\$5'' .SETR \\$5 \\*[lix*numb]
2666 .\" print complete list of XXXX
2668 .\" arg: fg,tb,ec,ex text
2671 .if !\\n[Cp] .pg@next-page
2672 .\" print LIST OF XXXX
2673 .\" execute user-defined macros
2674 .if \\$4<=4 .if d TX\\$2 .TX\\$2
2675 .ie d TY\\$2 .if \\$4<=4 .TY\\$2
2681 .in \\n[lix*wth\\$1]u
2686 .\" save line of list in macro
2688 .\" type pagenumber text
2690 .lix@dsln \\$1 \\$2 "\\$3" "\\$4" \\$5
2694 .\" print appended macro
2695 .\" lix@dsln type pagenumber text headernr
2697 .nr lix*i \\n[lix*wth\\$1]-\w@\\$4@
2699 .ll \\n[@ll]u-\w@\\$4@u-\w@\\$2@u-2m
2700 .ti -\\n[lix*wth\\$1]u
2706 .nr lix*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$2@)-1m
2707 \h'|\\n[.n]u'\l'\\n[lix*sep]u.'\h'1m'\\$2
2708 .SP \\n[toc*spacing]u
2710 .\"########################### module fnt ############################
2711 .\" some font macros.
2720 .nr fnt*prev \\n[.f]
2722 .while \\n+[fnt*i]<=\\n[.$] \{\
2723 . if \\n[fnt*i]>3 .as fnt*tmp \,
2724 . ie (\\n[fnt*i]%2)=1 .as fnt*tmp \\$1\\$[\\n[fnt*i]]
2725 . el .as fnt*tmp \\$2\\$[\\n[fnt*i]]
2726 . if \\n[fnt*i]<\\n[.$] .as fnt*tmp \/
2728 \&\\*[fnt*tmp]\f[\\n[fnt*prev]]
2732 .ie \\n[.$] .fnt@switch \f3 \f[\\n[.f]] \\$@
2736 .ie \\n[.$] .fnt@switch \f2 \f[\\n[.f]] \\$@
2740 .if \\n[.$] .fnt@switch \f2 \f3 \\$@
2743 .if \\n[.$] .fnt@switch \f3 \f2 \\$@
2746 .if \\n[.$] .fnt@switch \f2 \f1 \\$@
2749 .if \\n[.$] .fnt@switch \f1 \f2 \\$@
2752 .if \\n[.$] .fnt@switch \f1 \f3 \\$@
2755 .if \\n[.$] .fnt@switch \f3 \f1 \\$@
2757 .\"########################### module box ############################
2758 .\" draw a box around some text. Text will be kept on the same page.
2761 .\" .B1 and .B2 works like .DS
2763 .if \\n[box*ll] .@error "B1: missing B2"
2766 .nr box*hyp \\n[.hy]
2767 .nr box*wid \\n[.l]-\\n[.i]
2769 .\" jump to new environment.
2775 .ll (u;\\n[box*wid]-1n)
2779 .if !\\n[box*ll] .@error "B2: missing B1"
2782 .nr box*height \\n[dn]
2786 .nr box*y-pos \\n[.d]u
2791 \D'l \\n[box*wid]u 0'\
2792 \D'l 0 -\\n[box*height]u'\
2793 \D'l -\\n[box*wid]u 0'\
2794 \D'l 0 \\n[box*height]u'
2804 .\"########################### module ref ############################
2809 .nr ref*flag 0 \" for end-of-text
2810 .ds Rf \v'-.4m'\s-3[\\n+[ref*nr]]\s0\v'.4m'
2815 .if !''\\$1' .ds \\$1 \v'-.4m'\s-3[\\n[ref*nr]]\s0\v'.4m'
2818 .ref@start-print \\n[ref*nr].
2833 .in \\n[ref*nr-width]u
2847 .if \\n[Ls] .SP \\n[Lsp]u
2851 .if !d ref*mac .@error "RP: No references!"
2852 .ie !''\\$2' .nr ref*i 0\\$2
2853 .el .nr ref*i \\n[Rpe]
2854 .if \\n[ref*i]<2 .SK
2857 .if 0\\$1<1 .nr ref*nr 0 1
2858 .if ((\\n[ref*i]=0):(\\n[ref*i]=2)) .SK
2861 .\" called by end-of-text!
2863 .\".if \\n[ref*flag] \{
2865 . if \\n[D]>2 .tm Print references, called by eot
2877 .\" prints the references
2879 .toc@save 1 "" "\\*[Rp]" \\n[%]
2884 .misc@ev-keep ref*ev
2893 .\"########################### module app ############################
2901 .\" name == "" -> autonumber
2903 .\" .if \\n[.$]<2 .@error "APP: too few arguments"
2909 .ie \\n[Aph] .app@header \\*[app*ind] "\\$2"
2911 .app@index "\\*[app*ind]" "\\$2"
2914 .\" .APPSK name pages text
2915 .\" name == "" -> autonumber
2917 .if \\n[.$]<2 .@error "APPSK: too few arguments"
2923 .ie \\n[Aph] .app@header \\*[app*ind] "\\$3"
2925 .app@index "\\*[app*ind]" "\\$3"
2930 .ie \w@\\$1@ .ds app*ind \\$1
2932 . if !\\n[app*flag] \{\
2938 . ds app*ind \\n+[app*nr]
2939 . nr H1 \\n+[app*dnr]
2940 . nr H1h \\n[app*dnr]
2942 .\" clear lower counters
2944 .while \\n+[app*i]<15 .nr H\\n[app*i] 0 1
2948 .toc@save 1 "" "\\*[App] \\$1: \\$2" \\n[%]
2951 .\" app@header name text
2956 \s+4\f3\\*[App]\ \\$1\fP\s0
2958 .if \w@\\$2@<\\n[.l] .ce 1
2962 .als APPX app@header
2963 .\"########################### module cov ############################
2964 .\" title stored in diversion cov*title
2965 .\" abstract stored in diversion cov*abstract
2966 .\" arg to abstract stored in cov*abs-arg
2967 .\" indent stored in cov*abs-ind
2968 .\" number of authors stored in cov*au
2969 .\" author(s) stored in cov*au!x!y
2970 .\" author(s) title stored in cov*at!x!y
2971 .\" x is the author-index [1-cov*au], y is the argument-index [1-9].
2972 .\" author(s) firm stored in cov*firm
2973 .\" new date (if .ND exists) is stored in cov*new-date
2976 .ds cov*abs-name ABSTRACT
2980 .rm IA IE WA WE LO LT
2981 .if \\n[.$]>0 .ds cov*title-charge-case \\$1
2982 .if \\n[.$]>1 .ds cov*title-file-case \\$2
2983 .pg@disable-top-trap
2987 .\"-------------------
2991 .\"-------------------
2992 .\" .AU name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]]
2995 .pg@disable-top-trap
2998 .ds cov*au!\\n[cov*au]!1
2999 .while \\n[.$]>=\\n+[cov*i] \{\
3000 . ds cov*au!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
3002 .if (\\n[.$]>=3)&(\w@\\$3@) \{\
3003 . if d cov*location-\\$3] \{\
3004 . ds cov*au!3!\\n[cov*au] \\*[cov*location-\\$3]
3008 .\"-------------------
3009 .\" .AT title1 [title2 [... [title9] ]]]]
3010 .\" Well, thats all that COVEND look for.
3011 .\" Must appear directly after .AU
3013 .if \\n[.$]<1 .@error "AT: no arguments"
3015 .while \\n[.$]>=\\n+[cov*i] \{\
3016 . ds cov*at!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
3019 .\"-------------------
3022 .if !''\\$1' .ds cov*firm \\$1
3025 .ds cov*abs-name \\$1
3028 .pg@disable-top-trap
3029 .if d cov*abstract .@error "AS: only one abstract allowed"
3030 .if !''\\n[.z]' .@error "AS: no diversion allowed (previous .AS?)"
3031 .nr cov*abs-arg 0\\$1
3032 .nr cov*abs-ind (n;0\\$2)
3037 .\" fixed for 2000, now uses \n[year].
3039 . \" support for ISO-date
3045 . ds cov*new-date \\*[MO\\n[mo]] \\n[dy], \\n[year]
3048 . ds cov*new-date \\n[year]-\\n[cov*mm]-\\n[cov*dd]
3052 .als DT cov*new-date
3054 .ds cov*new-date \\$1
3056 .\" switch to ISO-date if register Iso exist: YYYY-MM-DD
3057 .if r Iso .ISODATE 1
3058 .\"-------------------
3059 .\" save technical numbers.
3062 .while \\n[.$]>=\\n+[cov*i] .ds cov*mt-tm!\\n[cov*i] \\$[\\n[cov*i]]
3063 .nr cov*mt-tm-max \\n[.$]
3065 .\"-----------------------
3067 .\" the file must have the following last lines (somewhere):
3068 .\" .pg@enable-top-trap
3071 .ds cov*mt-file!0 0.MT
3072 .ds cov*mt-file!1 0.MT
3073 .ds cov*mt-file!2 0.MT
3074 .ds cov*mt-file!3 0.MT
3075 .ds cov*mt-file!4 4.MT
3076 .ds cov*mt-file!5 5.MT
3077 .ds cov*mt-file!6 0.MT
3081 . ie d cov*mt-file!\\$1 .ds cov*mt-type \\$1
3082 . el .ds cov*mt-type 6
3084 .el .ds cov*mt-type 1
3085 .ds cov*mt-addresse "\\$2
3086 .ds cov*mt-type-text "\\$1
3087 .ie d @country .ds cov*str mm/\\*[@country]_
3089 .mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]]
3092 .ie !\\n[.$] .ds cov*cov-type ms
3093 .el .ds cov*cov-type \\$1
3094 .pg@disable-top-trap
3095 .ie d @country .ds cov*str mm/\\*[@country]_\\*[cov*cov-type].cov
3096 .el .ds cov*str mm/\\*[cov*cov-type].cov
3099 .\"########################### module qrf ############################
3100 .\" forward and backward reference thru special files.
3102 .\" check if stderr-method is wanted
3103 .\" This was needed when I discovered that groff was considered unsafe
3104 .\" and groff -U didn't work. It's a workaround like the original
3105 .\" index method, but not in my view elegant enough.
3107 .\" init reference system
3109 .ds qrf*file \\$1.qrf
3111 .if \\n[D]>1 .tm INITR: source \\*[qrf*file]
3113 . tm .\\\\" Rfilename: \\*[qrf*file]
3115 .el 'so \\*[qrf*file]
3118 .\" set a reference.
3120 .if \\n[.$]<1 .@error "SETR:reference name missing"
3121 .if !r qrf*pass .tm "SETR: No .INITR in this file"
3123 . ds qrf*name qrf*ref-\\$1
3124 . if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd-mark-trimmed],\\n[%]
3126 . ds \\*[qrf*name]-hn \\*[hd-mark-trimmed]
3128 . ds \\*[qrf*name]-pn \\n[%]
3131 . tm .ds \\*[qrf*name]-hn \\*[hd-mark-trimmed]
3132 . tm .ds \\*[qrf*name]-pn \\n[%]
3133 . if !'\\$2'' .tm .ds \\*[qrf*name]-xx \\$2
3139 .\" If two arg -> set var. arg to misc-string.
3141 .if \\n[.$]<1 .@error "GETST:reference name missing"
3142 .if !r qrf*pass .tm "GETST: No .INITR in this file"
3143 .ds qrf*name qrf*ref-\\$1
3144 . if d \\*[qrf*name]-xx \{\
3145 . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-xx]
3146 . el \\*[\\*[qrf*name]-xx]\c
3151 .\" get header-number
3152 .\" If two arg -> set var. arg to header-number.
3154 .if \\n[.$]<1 .@error "GETHN:reference name missing"
3155 .if !r qrf*pass .tm "GETHN: No .INITR in this file"
3156 .ds qrf*name qrf*ref-\\$1
3157 .if d \\*[qrf*name]-hn \{\
3158 . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-hn]
3159 . el \\*[\\*[qrf*name]-hn]\c
3164 .\" If two arg -> set var. arg to page-number.
3166 .if \\n[.$]<1 .@error "GETPN:reference name missing"
3167 .if !r qrf*pass .tm "GETPN: No .INITR in this file"
3168 .ds qrf*name qrf*ref-\\$1
3169 .if d \\*[qrf*name]-pn \{\
3170 . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-pn]
3171 . el \\*[\\*[qrf*name]-pn]\c
3176 .if \\n[.$]<1 .@error "GETR:reference name missing"
3178 . tm "GETR: No .INITR in this file"
3186 .\"########################### module ind ############################
3187 .\" Support for mgs-style indexing, borrowed from mgs.
3189 . tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[%]
3191 .\"--------------------
3192 .\" Another type of index system
3193 .\" INITI type filename [macro]
3195 .if \\n[.$]<1 .@error "INITI:type missing"
3196 .\" ignore if INITI has already been used
3198 . if d ind*file .@error "INITI:file already set"
3199 . ds ind*file \\$2.ind
3200 . if \\n[D]>1 .tm INITI: source \\*[ind*file]
3202 .if !d ind*file .@error "INITI:file not specified"
3205 . if \\n[.$]>2 .tm .\\\\" Imacro: \\$3
3210 .if !d ind*file .@error "IND: No active INITI"
3211 .if \\n[D]>1 .tm IND: type=\\*[ind*type]
3213 .if '\\*[ind*type]'N' .ds ind*ref \\n[%]
3214 .if '\\*[ind*type]'H' .ds ind*ref \\*[hd*mark]
3215 .if '\\*[ind*type]'B' .ds ind*ref \\*[hd*mark]\t\\n[%]
3216 .if '\\*[ind*ref]'' .@error "IND:wrong index type: \\*[ind*ref]"
3219 .while \\n[.$]>0 \{\
3221 . as ind*line \t\\$1
3223 .as ind*line \\*[ind*ref]
3224 .if \\n[Ref] .tm .\\\\" IND \\*[ind*line]
3228 .ie \\n[Ref] .tm .\\\\" Index: \\*[ind*file]
3230 . if !\\n[Cp] .pg@next-page
3232 . \" execute user-defined macros
3252 .\"########################### module let ############################
3254 .\"------------------------
3258 .ie \\n[.$] .ds let*i \\$1
3259 .el .ds let*i \\*[Letfc]
3260 .ie d let*type .let@fc_\\*[let*type] "\\*[let*i]" \\$@
3261 .el .let@mt-closing "\\*[let*i]" \\$@
3271 .\"------------------------
3274 .ie d let*type .let*lt-sign \\$@
3275 .el .let*mt-sign \\$@
3277 .\"------------------------
3279 .if !d let@sg_\\*[let*type] .@error "SG: letter type \\*[let*type] undefined"
3283 .while \\n+[let*i]<=\\n[let*wa-n] \{\
3284 .if \\n[let*i]=\\n[let*wa-n] .nr let*j 1
3285 .let@sg_\\*[let*type] "\\*[let*wa-name!\\n[let*i]]" "\\*[let*wa-title!\\n[let*i]]" \\n[let*i] \\n[let*j] \\$@
3288 .\"------------------------
3289 .\" Memorandum signature
3293 .ie \\n[.$]>1 .nr let*k 1
3294 .el .nr let*k \\n[cov*au]
3295 .ds let*tmp \\*[cov*au!\\n[let*k]!3]-\\*[cov*au!\\n[let*k]!4]-
3297 .while \\n+[let*i]<=\\n[cov*au] \{\
3298 . if \\n[let*i]>1 .as let*tmp /
3299 . as let*tmp \\*[cov*au!\\n[let*k]!2]
3301 .if !''\\$1' .as let*tmp -\\$1
3305 .while \\n+[let*i]<=\\n[cov*au] \{\
3307 . if \\n[let*i]=\\n[let*k] \{\
3308 \Z'\h'-(u;\\n[.l]/2)'\\*[let*tmp]'\c
3310 \\*[cov*au!\\n[let*i]!1]
3315 .\"------------------------
3316 .\" Approval signature
3321 .ie \\n[.$]<2 \\*[Letapp]
3324 .ie n ______________________________ ______________
3325 .el \D'l 25m 0'\h'4m'\D'l 12m 0'
3326 \Z'\\$1'\h'29m'\f[\\*[@sdf_font]]\\*[Letdate]\fP
3329 .\"------------------------
3330 .\" Letter signature
3335 .ie n ______________________________
3340 .\"------------------------
3342 .\" let@header is called from the header. It is supposed
3343 .\" to remove the alias itself.
3345 .rm AF AS AE AT AU CS OK TL MT
3349 .if !''\\$1' .ds let*type \\$1
3350 .if !d let@head_\\*[let*type] .@error "LT: unknown letter type \\$1"
3352 .als let@header let@head_\\*[let*type]
3353 .let@init_\\*[let*type] \\$@
3354 .if \n[D]>1 .tm Letter type \\*[let*type]
3373 .if \w'\\$5'&\\$4 \\$5
3376 .als let@fc_BL let@mt-closing
3378 .\" Semiblocked letter
3386 .als let@sg_SB let@sg_BL
3387 .als let@fc_SB let@mt-closing
3389 .\" Full-blocked letter
3403 .if \w'\\$5'&\\$4 \\$5
3412 .\" Simplified letter
3423 .misc@toupper "\\$1, \\$2"
3425 .if \w'\\$5'&\\$4 \\$5
3431 .\"--------------------------------------
3432 .\" Print the letter-head
3436 .if '1'\\$1' .in (u;\\n[.l]/2)
3438 .ie d let@wa-div .let@wa-div
3443 .if '1'\\$1' .if !d let*lo-CN .if !d let*lo-RN .sp 2
3444 .\" ---- Confidential
3447 . ie !''\\*[let*lo-CN]' \\*[let*lo-CN]
3453 \\*[LetRN] \\*[let*lo-RN]
3460 .while \\n+[let*i]<=\\n[let*ia-n] \{\
3461 \\*[let*ia-name!\\n[let*i]]
3462 \\*[let*ia-title!\\n[let*i]]
3464 .if d let@ia-div .let@ia-div
3468 \\*[LetAT] \\*[let*lo-AT]
3471 .if !'\\*[let*type]'SP' .if d let*lo-SA \{\
3474 . ie !''\\*[let*lo-SA]' \\*[let*lo-SA]
3479 . ie '\\*[let*type]'SP' \{\
3481 . misc@toupper \\*[let*lo-SJ]
3486 . if '\\*[let*type]'SB' .ti +5m
3487 \\*[LetSJ] \f[\\*[@sdf_font]]\\*[let*lo-SJ]\fP
3491 .\"-------------------
3492 .\" .IA [name [title]]
3495 .if \\n[.$] .ds let*ia-name!\\n+[let*ia-n] \\$1
3496 .if \\n[.$]>1 .ds let*ia-title!\\n[let*ia-n] \\$2
3508 .\"-------------------
3509 .\" .WA [name [title]]
3512 .if \\n[.$] .ds let*wa-name!\\n+[let*wa-n] \\$1
3513 .if \\n[.$]>1 .ds let*wa-title!\\n[let*wa-n] \\$2
3518 .it \\n[Letwam] let@wa-drain
3533 .if d let@wa-junk .rm let@wa-junk
3535 .\"-------------------
3539 .ie !''\\$2' .ds let*str \\$1
3542 . ie !\w'\\$1' .ds let*str \\*[Letns!\\*[Letnsdef]]
3544 . ie d Letns!\\$1 .ds let*str \\*[Letns!\\$1]
3545 . el .ds let*str \\*[Letns!copy](\\$1)\\*[Letns!to]
3548 . el .ds let*str \\*[Letns!\\*[Letnsdef]]
3557 .\"-------------------
3560 .rm AF AS AE AT AU CS OK TL MT
3561 .if ''\\$1' .@error "LO: missing option"
3562 .if !d Let\\$1 .@error "LO: unknown option (\\$1)"
3563 .ds let*lo-\\$1 \\$2
3564 .if \n[D]>1 .tm Letter option \\$1 \\$2
3566 .\"--------------------
3567 .\" Start with a clean slate