10 Copyright (C) 1991-2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
11 mgm is written by Jörgen Hägg <jh@axis.com>
13 mgm is free software; you can redistribute it and/or modify it under
14 the terms of the GNU General Public License as published by the Free
15 Software Foundation; either version 2, or (at your option) any later
18 mgm is distributed in the hope that it will be useful, but WITHOUT ANY
19 WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23 You should have received a copy of the GNU General Public License along
24 with groff; see the file COPYING. If not, write to the Free Software
25 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
27 Please send bugreports with examples to jh@axis.com.
29 Naming convention stolen from mgs.
30 Local names module*name
31 Extern names module@name
35 .if !\n(.g .ab These mm macros require groff.
37 .if \n(.C .ab The groff mm macros do not work in compatibility mode.
38 .if (\n[.warn] == 65543) .warn
39 .\" ######## init #######
40 .\" Contents level [0:14], contents saved if heading level <= Cl
42 .\" Eject page between LIST OF XXXX if Cp == 0
46 .\" Eject after floating display is output [0:1]
48 .\" Floating keep output [0;5]
50 .\" space before and after display if == 1 [0:1]
54 .\" Equation label adjust 0=left, 1=right
61 .\" H1-H7 heading counters
76 .\" Heading break level [0:14]
78 .\" heading centering level, [0:14]
81 .ds HF 2 2 2 2 2 2 2 2 2 2 2 2 2 2
82 .\" heading temp. indent [0:2]
83 .\" 0 -> 0 indent, left margin
84 .\" 1 -> indent to right , like .P 1
85 .\" 2 -> indent to line up with text part of preceding heading
88 .ds HP 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89 .\" heading space level [0:14]
91 .\" heading numbering type
92 .\" 0 -> multiple (1.1.1 ...)
95 .\" Unnumbered heading level
97 .\" hyphenation in body
98 .\" 0 -> no hyphenation
99 .\" 1 -> hyphenation 14 on
101 .\" text for toc, selfexplanatory. Look in the new variable section
102 .ds Lf LIST OF FIGURES
104 .ds Lt LIST OF TABLES
106 .ds Lx LIST OF EXHIBITS
108 .ds Le LIST OF EQUATIONS
110 .\" List indent, used by .AL
112 .\" List space, if listlevel > Ls then no spacing will occur around lists.
114 .\" Numbering style [0:5]
116 .\" numbered paragraphs
117 .\" 0 == not numbered
118 .\" 1 == numbered in first level headings.
120 .\" Format of figure,table,exhibit,equation titles.
123 .\" Table of contents page numbering style
125 .\" Page-number, normally same as %.
129 .\" paragraph spacing
132 .\" 0 == left-justified
134 .\" 2 == indented .P except after .H, .DE or .LE.
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 @language .mso mm/\*[@language]_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
436 .\" 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 \\*[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 .\" ######## module pict #################
742 .\" I assume that the number variable pict*id is the same
743 .\" between two runs.
765 . nr pict*ind (m;\\$2)
779 . nr pict*width (i;\\$1)
783 . nr pict*height (i;\\$1)
787 .\" let mmroff know the filename and id
789 . tm .\\\\" PIC id \\n[pict*id]
790 . tm .\\\\" PIC file \\*[pict*f]
792 .\" these are defined by mmroff in the second pass
793 .if d pict*file!\\n[pict*id] \{\
794 . ds pict*f \\*[pict*file!\\n[pict*id]]
795 . nr pict*llx \\n[pict*llx!\\n[pict*id]]
796 . nr pict*lly \\n[pict*lly!\\n[pict*id]]
797 . nr pict*urx \\n[pict*urx!\\n[pict*id]]
798 . nr pict*ury \\n[pict*ury!\\n[pict*id]]
800 . nr pict*w (p;\\n[pict*urx]-\\n[pict*llx])
801 . if \\n[pict*w]<0 .nr pict*w 0-\\n[pict*w]
802 . nr pict*h (p;\\n[pict*ury]-\\n[pict*lly])
803 . if \\n[pict*h]<0 .nr pict*h 0-\\n[pict*h]
804 . if \\n[pict*width]>0 \{\
805 . nr pict*rs (u;1000*\\n[pict*width]/\\n[pict*w])
806 . nr pict*w (u;\\n[pict*w]*\\n[pict*rs]/1000)
807 . nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000)
809 . if \\n[pict*height]>0 \{\
810 . nr pict*rs (u;1000*\\n[pict*height]/\\n[pict*h])
811 . nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000)
813 . if '0'\\n[pict*mode]' \{\
814 . nr pict*in \\n[.i]u
816 . if '1'\\n[pict*mode]' \{\
817 . nr pict*in (u;\\n[.l]-\\n[.i]-\\n[pict*w])
819 . if '2'\\n[pict*mode]' \{\
820 . nr pict*in \\n[pict*ind]u
822 . if '3'\\n[pict*mode]' \{\
823 . nr pict*in (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2)
826 . if \\n[pict*h]>0 .ds pict*h \\n[pict*h]
830 . \" these lines are copied and modified from tmac.pspic.
831 . \" Originally written by James Clark
833 . ie \\n[pict*box]>0 \{\
834 \v'-1v'\h'\\n[pict*in]u'\
835 \Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\
836 \v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \
837 \\n[pict*llx] \\n[pict*lly] \
838 \\n[pict*urx] \\n[pict*ury] \
839 \\n[pict*w] \\n[pict*h]'
842 \v'-1v'\h'\\n[pict*in]u'\
844 \Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\
846 \v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \
847 \\n[pict*llx] \\n[pict*lly] \
848 \\n[pict*urx] \\n[pict*ury] \
849 \\n[pict*w] \\n[pict*h]'
858 .if \\n[.$]<2 .@error "EPIC: Not enough arguments"
859 .nr pict*adj 0 \" centered
861 . shift 1 \" left adjust
867 .ds pict*name "External picture
868 .if !''$3' .ds pict*name \\$3
872 .if !\\n[pict*adj] .nr pict*ind (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2)
875 \D'l \\n[pict*w]u 0'\
876 \D'l 0 -\\n[pict*h]u'\
877 \D'l -\\n[pict*w]u 0'\
878 \D'l 0 \\n[pict*h]u'\
879 \v'-(u;\\n[pict*h]/2)'\
880 \h'(u;(\\n[pict*w]-\w'\\*[pict*name]'/2))'\\*[pict*name]
885 .\" ######## module acc #################
887 .\" accents. These are copied from mgs, written by James Clark.
889 .ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\
890 \h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2'
893 .ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2'
901 .acc@under-def , \(ac
902 .\" ######## module uni #################
903 .\" unimplemented macros
905 'tm "OK: not implemented"
908 'tm "PM: not implemented"
910 .\" ######## module hd #################
911 .\" support for usermacro
912 .nr hd*h1-page 1 \" last page-number for level 1 header.
923 .\" .hd@split varable index name val1 val2 ...
925 .if \\$2>(\\n[.$]-3) .@error "\\$3 must have at least \\$2 values (\\*[\\$3]).
927 .ds \\$1 \\$[\\n[hd*sp-tmp]]
934 .if !r hd*cur-bline .nr hd*cur-bline \\n[nl]
936 .df@print-float 2\" $$$ could be wrong...
937 .\" terminate all lists
942 .if !\\n[hd*level] .nr hd*level \\n[Hu]
944 .\" clear lower counters
946 .while \\n+[hd*i]<15 .if \\n[hd*level]<\\n[hd*i] .nr H\\n[hd*i] 0 1
948 .\" save last text for use in TP
949 .if \\n[hd*level]=1 .ds H1txt \\$2\\$3
951 .\" This is a little fix to be able to get correct H1 heading number
952 .\" in page headers. Special attention was needed when other formats are used.
954 . ds hd*format \\g[H1]
957 . af H1 \\*[hd*format]
959 .el .nr H1h \\n[H1] 1
960 .if \\n[hd*level]=1 .nr H1h +1
962 .\" Check if it's time for new page. Only if text has
964 .if \\n[Ej]&(\\n[Ej]>=\\n[hd*level])&(\\n[nl]>\\n[hd*cur-bline]) .pg@next-page
966 .\" increment current counter
967 .nr H\\n[hd*level] +1
969 .\" update pagenumber if section-page is used
970 .if (\\n[hd*level]=1)&(\\n[Sectp]>0) .hd@set-page 1
972 .\" hd*mark is the text written to the left of the header.
975 .if \\n[hd*level]>1 .as hd*mark \\n[H2]
978 .while \\n+[hd*i]<15 .if \\n[hd*level]>(\\n[hd*i]-1) .as hd*mark .\\n[H\\n[hd*i]]
979 .if \\n[Ht] .ds hd*mark \\n[H\\n[hd*level]].
981 .\" special case, no dot after level one heading if not H1dot true
982 .if (\\n[hd*level]=1)&(\\n[H1dot]=0) .ds hd*mark \\n[H1]
984 .as hd*mark \ \ \" add spaces between mark and heading
985 .if !\\n[hd*arg1] .ds hd*mark\" no mark for unnumbered
987 .if \\n[D]>1 .tm At header \\*[hd*mark] "\\$2"
988 .nr hd*htype 0 \" hd*htype = check break and space
989 . \" 0 = run-in, 1 = break only, 2 = space
990 .if \\n[hd*level]<=\\n[Hb] .nr hd*htype 1
991 .if \\n[hd*level]<=\\n[Hs] .nr hd*htype 2
992 . \" two spaces if hd*htype == 0
993 .ie (\\n[hd*htype]=0)&(\w@\\$2@) .ds hd*suf-space " \"
995 .nr hd*need 2v \" hd*need = header need space
996 .\"---------- user macro HX ------------
997 .\" User exit macro to override numbering.
998 .\" May change hd*mark (}0), hd*suf-space (}2) and hd*need (;3)
999 .\" Can also change Hps1/2.
1000 .if d HX .HX \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
1001 .\"--------------------------------------
1003 .ie \\n[hd*level]<=\\n[Hps] .SP (u;\\n[Hps2])
1004 .el .SP (u;\\n[Hps1])
1006 .par@reset-num \\n[hd*level]\" reset numbered paragraph
1007 .\" start diversion to measure size of header
1009 \\*[hd*mark]\\$2\\$3\\*[hd*suf-space]
1013 .if \\n[hd*htype] .na \" no adjust if run-in
1014 .if \\n[hd*htype]<2 .nr hd*need +\\n[Lsp]u \" add some extra space
1015 .ne \\n[hd*need]u+\\n[dn]u+.5p-1v \" this is the needed space for a header
1017 .\" size and font calculations
1018 .hd@split hd*font \\n[hd*level] HF \\*[HF]\" get font for this level
1019 .ft \\*[hd*font]\" set new font
1020 .hd@split hd*new-ps \\n[hd*level] HP \\*[HP]\" get point size
1021 .ie (\\*[hd*new-ps]=0):(\w@\\*[hd*new-ps]@=0) \{\
1022 . if \\n[hd*htype] \{\
1023 . if '\\*[hd*font]'3' \{\
1027 . if '\\*[hd*font]'B' \{\
1035 . vs \\*[hd*new-ps]+2
1038 .\"---------- user macro HY -------------
1039 .\" user macro to reset indents
1040 .if d HY .HY \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
1041 .\"--------------------------------------
1042 .nr hd*mark-size \w@\\*[hd*mark]@
1043 .if (\\n[hd*level]<=\\n[Hc])&\\n[hd*htype] .ce\" center if level<=Hc
1045 .\" finally, output the header
1047 .\" and the rest of the header
1048 .ie \\n[hd*htype] \{\
1052 .el \\$2\\$3\\*[hd*suf-space]\&\c
1054 .\" restore pointsize and vertical size.
1058 .\" table of contents
1059 .if (\\n[hd*level]<=\\n[Cl])&\w@\\$2@ .toc@entry \\n[hd*level] "\\$2"
1060 .\" set adjust to previous value
1062 .\" do break or space
1063 .if \\n[hd*htype] .br
1064 .if \\n[hd*htype]>1 .SP (u;\\n[Lsp]*\\n[Hss])
1065 .if \\n[hd*htype] \{\
1066 . \" indent if Hi=1 and Pt=1
1067 . if (\\n[Hi]=1)&(\\n[Pt]=1) .ti +\\n[Pi]n
1068 . \" indent size of mark if Hi=2
1069 . if \\n[hd*htype]&(\\n[Hi]>1) .ti +\\n[hd*mark-size]u
1071 .nr par@ind-flag 0 \" no indent on .P if Pt=2
1073 .\" check if it is time to reset footnotes
1074 .if (\\n[hd*level]=1)&\\n[ft*clear-at-header] .nr ft*nr 0 1
1076 .\" check if it is time to reset indexes
1077 .if (\\n[hd*level]=1)&\\n[Sectf] \{\
1083 .\"---------- user macro HZ ----------
1084 .if d HZ .HZ \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
1085 .nr hd*last-pos \\n[nl]
1086 .nr hd*last-hsize \\n[.k]
1092 .while \\n+[hd*i]<15 .af H\\n[hd*i] \\$[\\n[hd*i]] 1
1094 .\"----------------------
1095 .\" set page-nr, called from header
1099 .ie \\n[.$]>0 .nr P \\$1
1101 .\" Set section-page-string
1102 .ds hd*sect-pg \\n[H1]-\\n[P]
1103 .if \\n[Sectp]>1 .if '\\n[H1]'0' .ds hd*sect-pg "
1105 .\"########### module pg ####################
1106 .\" set end of text trap
1110 .ds pg*header ''- \\nP -''
1112 .if \n[N]=4 .ds pg*header ''''
1113 .if (\n[N]=3):(\n[N]=5) \{\
1115 . ds pg*footer ''\\*[hd*sect-pg]''
1123 .nr pg*foot-margin 0
1125 .nr pg*footer-size 5v\" 1v+footer+even/odd footer+2v
1126 .nr pg*header-size 7v\" 3v+header+even/odd header+2v
1127 .nr pg*extra-footer-size 0
1128 .nr pg*extra-header-size 0
1131 .nr pg*cols-per-page 1
1132 .nr pg*cur-po \n[@po]
1137 .\"-------------------------
1138 .\" footer TRAPS: set, enable and disable
1140 .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)
1142 .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]
1144 .\" last-pos points to the position of the footer and bottom
1145 .\" block below foot-notes.
1146 .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)
1147 .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]
1150 .wh \\n[pg*foot-trap]u pg@footer
1151 .if \\n[D]>2 .tm pg@enable-trap .t=\\n[.t] nl=\\n[nl]
1157 .\" move to new trap (if changed).
1163 .de pg@enable-top-trap
1164 .\" set trap for pageheader.
1165 .nr pg*top-enabled 1
1167 .de pg@disable-top-trap
1168 .\" remove trap for pageheader.
1169 .nr pg*top-enabled 0
1171 .\" no header on the next page
1173 .nr pg*top-enabled (-1)
1175 .\" set first trap for pagefooter
1179 .\"-------------------------
1180 .\" stop output and begin on next page. Fix footnotes and all that.
1183 .ne 999i \" activate trap
1186 .\"-------------------------
1187 .\" support for PX, TP and EOP.
1189 .als }e pg*even-header
1190 .als }o pg*odd-header
1192 .als TPeh pg*even-header
1193 .als TPoh pg*odd-header
1196 .als EOPef pg*even-footer
1197 .als EOPof pg*odd-footer
1198 .\"------------------------------------------------------------
1201 .if \\n[D]>1 .tm Page# \\n[%] (\\n[.F]:\\n[c.])
1202 .\" check if Hy has been changed
1206 .tl '<pagenr\ \\n[%]>'''
1208 .\" assign current page-number to P
1211 .nr line*lp\\n[.z] 0
1212 .nr line*ac\\n[.z] 0
1214 .\" suppress pageheader if pagenumber == 1 and N == [124]
1215 .if \\n[pg*top-enabled] \{\
1217 .\". pg@disable-top-trap
1218 . if \\n[pg*extra-header-size] 'sp \\n[pg*extra-header-size]u
1219 . if \\n[pg*top-margin] 'sp \\n[pg*top-margin]u
1222 . ie d let@header .let@header
1227 . ie ((\\n[%]=1)&((\\n[N]=1):(\\n[N]=2))) .sp
1228 . el .tl \\*[pg*header]
1229 . ie o .tl \\*[pg*odd-header]
1230 . el .tl \\*[pg*even-header]
1241 . \" check for pending footnotes
1244 . \" back to normal text processing
1246 . \" mark for multicolumn
1247 . nr pg*head-mark \\n[nl]u
1248 . \" reset NCOL pointer at each new page.
1250 . \" set multicolumn
1253 . \" print floating displays
1258 .if \\n[pg*top-enabled]<0 .nr pg*top-enabled 1
1259 .nr hd*cur-bline \\n[nl] \" .H needs to know if output has occured
1261 .\"---------------------------------------------------------
1265 .if \\n[D]>2 .tm Footer# \\n[%] (\\n[.F]:\\n[c.]) nl=\\n[nl]
1269 .\" increment pageoffset for MC
1270 .\" move to the exact start of footer.
1271 'sp |\\n[pg*foot-trap]u+1v
1273 .if \\n[D]>3 .tm FOOTER after .sp, nl=\\n[nl]
1275 .if d ft*div .ft@print
1278 .if !\\n[pg*cur-column] .pg@print-footer
1282 .if \\n[@verbose-flag] .eo \" to help VERBON/VERBOFF
1284 .\"-------------------------
1286 .\" jump to the position just below the foot-notes.
1287 'sp |\\n[pg*last-pos]u+1v
1288 .if \\n[D]>3 .tm print-footer nl=\\n[nl]
1289 .\" check if there are any bottom block
1290 .if d pg*block-div .pg@block
1292 .\" print the footer and eject new page
1295 .\" user defined end-of-page macro
1298 . ie o .tl \\*[pg*odd-footer]
1299 . el .tl \\*[pg*even-footer]
1300 . ie (\\n[%]=1)&(\\n[N]=1) .tl \\*[pg*header]
1301 . el .tl \\*[pg*footer]
1302 . tl ''\\*[Pg_type!\\n[@copy_type]]''
1305 .\" be sure that floating displays and footnotes will be
1306 .\" printed at the end of the document.
1307 .ie (\\n[df*fnr]>=\\n[df*o-fnr]):\\n[ft*exist] \{\
1314 .\"-------------------------
1316 .\" Initialize the title environment
1333 .\"-------------------------
1343 .ds pg*odd-header "\\$1
1347 .ds pg*even-header "\\$1
1351 .ds pg*odd-footer "\\$1
1355 .ds pg*even-footer "\\$1
1373 .\"-------------------------
1374 .\" end of page processing
1377 .\" output footnotes. set trap for block
1380 .\"-------------------------
1381 .\" print bottom block
1391 .\"-------------------------
1392 .\" define bottom block
1394 .misc@ev-keep pg*block-ev
1399 .\"-------------------------
1403 .nr pg*block-size \\n[dn]u
1407 .\"-------------------------
1408 .\" print out all pending text
1410 .if \\n[D]>2 .tm ---------- End of text processing ----------------
1414 .\"-------------------------
1415 .\" set top and bottom margins
1416 .\" -T sets pg*footer-size and pg*header-size instead
1421 . nr pg*footer-size 5v
1422 . nr pg*header-size 7v
1424 . if \\n[.$]>0 .nr pg*header-size (v;\\$1)
1425 . if \\n[.$]>1 .nr pg*footer-size (v;\\$2)
1429 . nr pg*extra-footer-size 0
1430 . nr pg*extra-header-size 0
1432 . if \\n[.$]>0 .nr pg*extra-header-size (v;\\$1)
1433 . if \\n[.$]>1 .nr pg*extra-footer-size (v;\\$2)
1435 . tm extra top \\n[pg*extra-footer-size]
1436 . tm extra bottom \\n[pg*extra-header-size]
1441 .\"---------------------
1442 .\" multicolumn output.
1444 .if \\n[pg*cols-per-page]>1 \{\
1445 . ll \\n[pg*column-size]u
1449 .if \\n[pg*cols-per-page]>1 \{\
1450 . ie \\n+[pg*cur-column]>=\\n[pg*cols-per-page] \{\
1451 . nr pg*cur-column 0 1
1452 . nr pg*cur-po \\n[@po]u
1457 . nr pg*cur-po +(\\n[pg*column-size]u+\\n[pg*column-sep]u)
1458 . po \\n[pg*cur-po]u
1459 ' sp |\\n[pg*head-mark]u
1464 .\" An argument disables the page-break.
1467 .if \\n[pg*cols-per-page]<=1 .@error "1C: multicolumn mode not active"
1468 .nr pg*cols-per-page 1
1470 .nr pg*column-size \\n[@ll]
1471 .nr pg*ncol-i \\n[pg*cur-column]\" temp variable
1472 .nr pg*cur-column 0 1
1473 .nr pg*cur-po \\n[@po]u
1478 . if \\n[pg*ncol-i]>0 \{\
1479 . @warning 1C: footnotes will be messy
1482 . if \\n[pg*last-ncol]>0 \{\
1483 . sp |\\n[pg*last-ncol]u
1490 .nr pg*head-mark \\n[nl]u
1491 .if \\n[pg*cols-per-page]>1 .@error "2C: multicolumn mode already active"
1492 .nr pg*cols-per-page 2
1493 .nr pg*column-sep \\n[@ll]/15
1494 .nr pg*column-size (\\n[@ll]u*7)/15
1495 .nr pg*cur-column 0 1
1496 .nr pg*cur-po \\n[@po]u
1497 .ll \\n[pg*column-size]u
1498 .\" .lt \\n[pg*column-size]u
1500 .\" MC column-size [ column-separation ]
1503 .nr pg*head-mark \\n[nl]u
1504 .if \\n[pg*cols-per-page]>1 .@error "MC: multicolumn mode already active"
1505 .ie ''\\$1' .nr pg*column-size \\n[.l]
1506 .el .nr pg*column-size (n;\\$1)
1507 .ie ''\\$2' .nr pg*column-sep \\n[pg*column-size]/15
1508 .el .nr pg*column-sep (n;\\$2)
1510 .\" calculate the number of columns/page
1511 .nr pg*cols-per-page 0
1512 .nr pg*i \\n[pg*column-size]
1513 .while \\n[pg*i]<=\\n[.l] \{\
1514 . nr pg*cols-per-page \\n[pg*cols-per-page]+1
1515 . nr pg*i \\n[pg*i]+\\n[pg*column-sep]+\\n[pg*column-size]
1517 .nr pg*cur-column 0 1
1518 .nr pg*cur-po \\n[@po]u
1519 .ll \\n[pg*column-size]u
1520 .\" .lt \\n[pg*column-size]u
1522 .\" begin a new column
1525 .if \\n[nl]>\\n[pg*last-ncol] .nr pg*last-ncol \\n[nl]
1533 .\" force new page by writing something invisible.
1534 .while \\n+[pg*i]<=(0\\$1) \{\
1539 .\"-------------------------------
1540 .\" MULB width1 space1 width2 space2 width3 space3 ...
1548 . nr pg*mul!\\n+[pg*i] (n;0\\$1)
1549 . nr pg*muls!\\n[pg*i] (n;0\\$2)
1552 .nr pg*mul-max-col \\n[pg*i]
1553 .ds pg*mul-fam \\n[.fam]
1554 .nr pg*mul-font \\n[.f]
1558 .fam \\*[pg*mul-fam]
1559 .ft \\n[pg*mul-font]
1567 .if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@error "MULN: Undefined columnwidth"
1569 .if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
1571 .in \\n[pg*mul-ind]u
1572 .ll (u;\\n[.i]+\\n[pg*mul!\\n+[pg*mul-x]])u
1573 .nr pg*mul-ind +(u;\\n[pg*mul!\\n[pg*mul-x]]+\\n[pg*muls!\\n[pg*mul-x]])
1579 .if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
1582 .ne \\n[pg*mul-last]u
1587 .sp \\n[pg*mul-last]u
1593 .ie o .if !\\n[pg*head-mark]=\\n[nl] \{\
1599 .\"########### module footnotes ###################
1604 .nr ft*hyphen 0\" hyphenation value
1605 .nr ft*adjust 1\" >0 if adjust true
1606 .nr ft*indent 1\" >0 if text indent true (not imp. $$$)
1607 .nr ft*just 0\" 0=left justification, 1=right (not imp. $$$)
1608 .nr ft*exist 0\" not zero if there are any footnotes to be printed
1609 .nr ft*clear-at-header 0\" >0 if footnotes should be reset at first level head.
1611 .ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m'
1613 .\"-----------------
1614 .\" init footnote environment
1616 .\" indentcontrol not implemented $$$
1617 .\" label justification not implemented $$$
1620 .ie \\n[ft*adjust] 'ad
1622 .ie \\n[ft*hyphen] 'hy 14
1629 .\"-----------------
1630 .\" set footnote format
1631 .\" no support for two column processing (yet). $$$
1633 .if \\n[.$]=0 .@error "FD: bad arg \\$1"
1634 .ie \\n[.$]=2 .nr ft*clear-at-header 1
1635 .el .nr ft*clear-at-header 0
1638 . ie \\$1>11 .nr ft*format 0
1639 . el .nr ft*format \\$1
1641 . nr ft*hyphen (\\n[ft*format]%2)*14
1642 . nr ft*format \\n[ft*format]/2
1644 . nr ft*adjust 1-(\\n[ft*format]%2)
1645 . nr ft*format \\n[ft*format]/2
1647 . nr ft*indent 1-(\\n[ft*format]%2)
1648 . nr ft*format \\n[ft*format]/2
1650 . nr ft*just \\n[ft*format]%2
1654 .\" Footnote and display width control $$$
1657 .while \\n+[ft*i]<=\\n[.$] \{\
1658 . ds ft*x \\$[\\n[ft*i]]
1659 . if '\\*[ft*x]'N' \{\
1663 . nr ds*float-break 1
1665 . if '\\*[ft*x]'-WF' .nr ft*wide 0
1666 . if '\\*[ft*x]'WF' .nr ft*wide 1
1667 . if '\\*[ft*x]'-FF' .nr ft*first-fn 0
1668 . if '\\*[ft*x]'FF' .nr ft*first-fn 1
1669 . if '\\*[ft*x]'-WD' \{\
1671 . if r ft*df-save \{\
1672 . nr Df \\n[ft*df-save]
1676 . if '\\*[ft*x]'WD' \{\
1678 . nr ft*df-save \\n[Df]
1681 . if '\\*[ft*x]'-FB' .nr ds*float-break 0
1682 . if '\\*[ft*x]'FB' .nr ds*float-break 1
1683 . if \\n[D]>1 .tm WC WF=\\n[ft*wide] WD=\\n[ds*wide]
1686 .\"-----------------
1688 .\" Change environment, switch to diversion and print the foot-note mark.
1690 .if \\n[ft*busy] .@error "FS: missing FE"
1694 .if !\\n[ft*wide] .pg@set-po
1696 .nr ft*space (u;\\n[Fs]*\\n[Lsp])
1699 .ie \\n[.$] .ds ft*mark \\$1
1700 .el .ds ft*mark \\n[ft*nr].
1706 .\"-----------------
1707 .\" init footnote diversion
1708 .de ft@init-footnote
1713 .nr ft*note-size \\n[dn]
1715 .\"-----------------
1717 .\" End the diversion, back to previous environment, and adjust
1718 .\" the trap to the new foot-note size.
1725 .if \\n[@pl]u<\\n[dn]u .@error "FE: too big footnote"
1726 .if !d ft*div .nr dn +1v
1727 .if \\n[D]>3 .tm FE: foot-trap=\\n[pg*foot-trap] .d=\\n[.d] dn=\\n[dn]
1728 .ie (\\n[pg*foot-trap]u-\\n[.d]u)<\\n[dn]u \{\
1735 . if !d ft*div .ft@init-footnote
1739 . nr ft*note-size +\\n[dn]
1745 .\"-----------------
1746 .\" print footnotes, see pg@footer
1759 .\"-----------------
1760 .\" check if any pending footnotes, see pg@header
1762 .if d ft*next-div \{\
1771 . nr ft*note-size +\\n[dn]
1778 .\"########### module display ###################
1779 .nr ds*wide 0\" >0 if wide displays wanted
1780 .nr df*fnr 0 1\" floating display counter
1781 .nr df*o-fnr 1\" floating display counter, already printed
1782 .nr ds*snr 0 1\" static display counter
1783 .nr ds*lvl 0 1\" display level
1784 .nr ds*float-busy 0\" >0 if printing float
1785 .nr df*float 0 >0 if previous display was floating
1786 .\"--------------------------------------------
1788 .ie \\n[df*float] .df@end \\$@
1791 .\"--------------------------------------------
1792 .\" floating display start
1793 .\" nested DF/DE is not allowed.
1795 .if \\n[df*float] .@error "DF:nested floating is not allowed. Use DS."
1798 .nr df*old-ll \\n[.l]
1807 .ds@set-new-ev \\n[df*old-ll]
1811 .\"--------------------------------------------
1816 .nr df*width!\\n+[df*fnr] \\n[dl]
1817 .nr df*height!\\n[df*fnr] \\n[dn]
1818 .nr df*wide!\\n[df*fnr] \\n[ds*wide]
1819 .nr df*format!\\n[df*fnr] \\n[ds*format]
1821 .if \\n[D]>2 .tm DF:fnr=\\n[df*fnr] w=\\n[dl] h=\\n[dn] wide=\\n[ds*wide] \
1823 .\" move div to the floating display list
1824 .rn df*div df*fdiv!\\n[df*fnr]
1827 .\" print float if queue is empty and the display fits into
1828 .\" the current page
1829 .if ((\\n[df*fnr]>=\\n[df*o-fnr])&(\\n[dn]<\\n[.t])) .df@print-float 1
1833 .\" called by end-of-text
1836 .if \\n[df*o-fnr]<=\\n[df*fnr] \{\
1837 . if \\n[D]>2 .tm Print remaining displays.
1838 .\" still some floats left, make non-empty environment
1847 .\" print according to Df and De.
1848 .\" .df@print-float type
1849 .\" type called from
1851 .\" 2 end of section
1852 .\" 3 end of document
1853 .\" 4 beginning of new page
1856 .if \\n[Df]>5 .@error "Df=\\n[Df], max value is 5"
1857 .if !\\n[ds*float-busy] \{\
1858 . nr ds*float-busy 1
1860 . if \\n[D]>3 .tm print-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1862 . if (\\$1=1)&((\\n[Df]=1):(\\n[Df]=5)) \{\
1863 . if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\
1864 . \" Print only new displays.
1865 . if \\n[df*o-fnr]=\\n[df*fnr] \{\
1867 . ds@print-one-float
1872 . if (\\$1=1)&(\\n[Df]=3) \{\
1873 . if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\
1875 . ds@print-one-float
1878 .\" print all if Df<2 and end of section
1879 . if (\\$1=2)&(\\n[Sectp]>0)&(\\n[Df]<2) \{\
1881 . ds@print-all-floats
1883 .\" print all if end of document. Where should they go instead?
1886 . ds@print-all-floats
1889 . if (\\$1=4)&(\\n[Df]>1) \{\
1890 . if \\n[Df]=2 .ds@print-one-float
1891 . if \\n[Df]=3 .ds@print-one-float
1893 . ie \\n[De] .ds@print-all-floats
1894 . el .ds@print-this-page
1897 . nr ds*float-busy 0
1902 .\" print a floating diversion
1904 .nr df*old-ll \\n[.l]
1905 .nr df*old-in \\n[.i]
1908 .nr df*i \\n[df*o-fnr]
1909 .nr df*f \\n[df*format!\\n[df*i]]
1912 .if \\n[df*f]=1 'in +\\n[Si]n
1913 .if \\n[df*f]>=2 'in 0
1914 .if \\n[df*f]=2 'ce 9999
1915 .if \\n[df*f]=3 'in (u;(\\n[.l]-\\n[df*width!\\n[df*i]])/2)
1916 .if \\n[df*f]=4 'rj 9999
1917 .if \\n[df*f]=5 'in (u;\\n[.l]-\\n[df*width!\\n[df*i]])
1920 .df*fdiv!\\n[df*o-fnr]
1922 .if \\n[df*f]=2 'ce 0
1923 .if \\n[df*f]=4 'rj 0
1925 .rm df*fdiv!\\n[df*i]
1926 .rm df*height!\\n[df*i]
1927 .rm df*format!\\n[df*i]
1928 .if \\n[df*wide!\\n[df*i]] .nr pg*head-mark \\n[nl]u
1932 .\" print one floating display if there is one.
1933 .de ds@print-one-float
1934 .if \\n[df*o-fnr]<=\\n[df*fnr] \{\
1935 . if \\n[D]>3 .tm print-one-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1936 . if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .pg@next-page
1938 . if \\n[De] .pg@next-page
1942 .\" print all queued floats.
1943 .\" if De>0 do a page eject between the floats.
1944 .de ds@print-all-floats
1945 .while \\n[df*o-fnr]<=\\n[df*fnr] \{\
1946 . if \\n[D]>3 .tm print-all-floats: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1947 . if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .pg@next-page
1951 . if \\n[De] .pg@next-page
1955 .\" print as many floats as will fit on the current page
1956 .de ds@print-this-page
1957 .while \\n[df*o-fnr]<=\\n[df*fnr] \{\
1958 . if \\n[D]>3 .tm print-this-page: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1959 . if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .break
1963 .\"---------------------------------------------------
1964 .\" get format of the display
1967 . ie r ds*format!\\$1 .nr ds*format \\n[ds*format!\\$1]
1968 . el .@error "DS/DF:wrong format:\\$1"
1971 .if \\n[D]>2 .tm set format=\\n[ds*format]
1972 .\" fill or not to fill, that is the...
1975 . ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2]
1976 . el .@error "\\*[ds*type]:wrong fill:\\$2"
1978 .if \\n[D]>2 .tm set fill=\\n[ds*fill]
1980 .if \\n[.$]>2 .nr ds*rindent \\$3
1981 .if \\n[D]>2 .tm set indent=\\n[ds*rindent]
1983 .\"-----------------------------
1984 .\" .ds@set-new-ev previous-line-length
1988 .if \\n[ds*rindent] \{\
1989 . ll -\\n[ds*rindent]n
1990 . lt -\\n[ds*rindent]n
1992 .if \\n[ds*wide] \{\
1997 .ie \\n[ds*fill] 'fi
2000 .\"--------------------------------------------------------
2001 .nr ds*format 0\" dummy value for .En/.EQ
2002 .nr ds*format! 0\" no indent
2003 .nr ds*format!0 0\" no indent
2004 .nr ds*format!L 0\" no indent
2005 .nr ds*format!I 1\" indent
2006 .nr ds*format!1 1\" indent
2007 .nr ds*format!C 2\" center each line
2008 .nr ds*format!2 2\" center each line
2009 .nr ds*format!CB 3\" center as block
2010 .nr ds*format!3 3\" center as block
2011 .nr ds*format!R 4\" right justify each line
2012 .nr ds*format!4 4\" right justify each line
2013 .nr ds*format!RB 5\" right justify as block
2014 .nr ds*format!5 5\" right justify as block
2016 .nr ds*fill! 0\" no fill
2017 .nr ds*fill!N 0\" no fill
2018 .nr ds*fill!0 0\" no fill
2019 .nr ds*fill!F 1\" fill on
2020 .nr ds*fill!1 1\" fill on
2021 .\"--------------------------------------------
2022 .\" static display start
2023 .\" nested DS/DE is allowed. No limit on depth.
2030 .nr ds*old-ll \\n[.l]
2031 .nr ds*old-in \\n[.i]
2032 .misc@push ds-ll \\n[.l]
2033 .misc@push ds-form \\n[ds*format]
2036 .misc@ev-keep ds*ev!\\n+[ds*snr]
2040 .\" indent in a diversion doesn't seem like a good idea.
2042 .di ds*div!\\n[ds*snr]
2044 .ds@set-new-ev \\n[ds*old-ll]
2047 .\"--------------------------------------------
2049 .if \\n-[ds*lvl]<0 .@error "DE: no corresponding DS"
2053 .nr ds*width \\n[dl]
2054 .nr ds*height \\n[dn]
2055 .misc@pop-nr ds-ll ds*old-ll
2056 .misc@pop-nr ds-form ds*format
2060 .\" calculate needed space
2061 .nr ds*need \\n[ds*height]
2062 .nr ds*i \\n[pg*foot-trap]-\\n[pg*header-size]u-\\n[pg*extra-header-size]u
2063 .if (\\n[ds*height]>\\n[ds*i])&(\\n[.t]<(\\n[ds*i]/2)) .nr ds*need \\n[.t]u+1v
2064 .if (\\n[ds*height]<\\n[ds*i])&(\\n[.t]<(\\n[ds*height])) .nr ds*need \\n[.t]u+1v
2065 .\" Eject page if display will fit one page and
2066 .\" there are less than half of the page left.
2067 .if \\n[ds*need] .ne \\n[ds*need]u
2069 .\" check if pending equation label
2070 .eq@check \\n[ds*need]
2072 .if \\n[ds*format]=1 'in \\n[ds*old-in]u+\\n[Si]n
2073 .if \\n[ds*format]>=2 'in 0
2074 .if \\n[ds*format]=2 'ce 9999
2075 .if \\n[ds*format]=3 'in (u;(\\n[.l]-\\n[ds*width])/2)
2076 .if \\n[ds*format]=4 'rj 9999
2077 .if \\n[ds*format]=5 'in (u;\\n[.l]-\\n[ds*width])
2080 .\" Print static display
2082 .if r Dsp .nr ds*i \\n[Dsp]
2084 .if \\n[Ds] .sp \\n[ds*i]u
2086 .if \\n[Ds] .sp \\n[ds*i]u
2088 .if \\n[ds*format]=2 'ce 0
2089 .if \\n[ds*format]=4 'rj 0
2090 .rm ds*div!\\n[ds*snr]
2095 .\"########### module list ###################
2096 .\" .LI text-indent mark-indent pad type [mark [LI-space [LB-space] ] ]
2107 .\"--------------------------
2108 .\" the major list-begin macro.
2109 .\" If type == -1 a 'break' will occur.
2111 .if \\n[.$]<4 .@error "LB: not enough arguments, min 4"
2112 .misc@push cind \\n[.i]
2113 .misc@push tind \\n[li*tind]
2114 .misc@push mind \\n[li*mind]
2115 .misc@push pad \\n[li*pad]
2116 .misc@push type \\n[li*type]
2117 .misc@push li-spc \\n[li*li-spc]
2118 .ds li*mark-list!\\n[li*lvl] \\*[li*mark]
2121 .nr li*tind (n;0\\$1)\" text-indent
2122 .nr li*mind (n;0\\$2)\" mark-indent
2123 .nr li*pad (n;0\\$3)\" pad
2124 .nr li*type 0\\$4\" type
2125 .ds li*mark \\$5\" mark
2126 .ie !'\\$6'' .nr li*li-spc \\$6\" LI-space
2128 .ie !'\\$7'' .nr li*lb-spc \\$7\" LB-space
2130 .\" init listcounter
2131 .nr li*cnt!\\n[li*lvl] 0 1
2133 .af li*cnt!\\n[li*lvl] 1
2134 .if \\n[li*type] .if !'\\*[li*mark]'' .af li*cnt!\\n[li*lvl] \\*[li*mark]
2136 .if \\n[li*lb-spc] .SP (u;\\n[li*lb-spc]*\\n[Lsp])
2141 .if \\n[li*lvl]<1 .@error "LI:no lists active"
2142 .if \\n[li*li-spc]&(\\n[Ls]>=\\n[li*lvl]) .SP (u;\\n[li*li-spc]*\\n[Lsp])
2145 .ds li*c-mark \\*[li*mark]
2146 .nr li*cnt!\\n[li*lvl] +1
2147 .if \\n[li*type]=1 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]].
2148 .if \\n[li*type]=2 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]])
2149 .if \\n[li*type]=3 .ds li*c-mark (\\n[li*cnt!\\n[li*lvl]])
2150 .if \\n[li*type]=4 .ds li*c-mark [\\n[li*cnt!\\n[li*lvl]]]
2151 .if \\n[li*type]=5 .ds li*c-mark <\\n[li*cnt!\\n[li*lvl]]>
2152 .if \\n[li*type]=6 .ds li*c-mark {\\n[li*cnt!\\n[li*lvl]]}
2153 .if \\n[.$]=1 .ds li*c-mark \\$1
2155 . ie (\\$2=2):(\\n[Limsp]=0) .ds li*c-mark \\$1\\*[li*c-mark]
2156 . el .ds li*c-mark \\$1\ \\*[li*c-mark]
2159 .\" determine where the text begins
2160 .nr li*text-begin \\n[li*tind]>?\w@\\*[li*c-mark]\ @
2161 .nr x \w@\\*[li*c-mark]\ @
2163 .\" determine where the mark begin
2164 .ie !\\n[li*pad] .nr li*in \\n[li*mind]
2165 .el .nr li*in \\n[li*text-begin]-\\n[li*pad]-\w@\\*[li*c-mark]@
2166 .if !\\n[li*in] .nr li*in 0
2169 .\" no indentation if hanging indent
2170 .if (\w@\\*[li*c-mark]@=0)&((\\n[.$]=0):(\w@\\$1@=0)) .nr li*text-begin 0
2171 \Z'\&\h'\\n[li*in]u'\\*[li*c-mark]'\h'\\n[li*text-begin]u'\&\c
2172 .if \\n[li*type]=-1 .br
2178 .misc@pop-nr cind li*tmp
2180 .misc@pop-nr tind li*tind
2181 .misc@pop-nr mind li*mind
2182 .misc@pop-nr pad li*pad
2183 .misc@pop-nr type li*type
2184 .misc@pop-nr li-spc li*li-spc
2185 .ds li*mark \\*[li*mark-list!\\n[li*lvl]]
2188 .if \\n[li*lvl]<1 .@error "LE:mismatched"
2190 .if '\\$1'1' .SP \\n[Lsp]u
2193 .\" list status clear.
2194 .\" terminate all lists to level i
2196 .ie \\n[.$]<1 .nr li*i 0
2198 .if \\n[li*i]>\\n[li*lvl] .@error "LC: incorrect argument: \\n[li*i] (too big)"
2199 .while \\n[li*lvl]>\\n[li*i] .li@pop
2204 .if \\n[.$]>3 .@error "AL: too many arguments"
2205 .if \\n[D]>2 .tm AL $*
2206 .ie \\n[.$]<=1 .LB \\n[Li] 0 2 1 "\\$1"
2208 . ie \\n[.$]=2 .LB 0\\$2 0 2 1 "\\$1"
2210 . ie !'\\$2'' .LB \\$2 0 2 1 "\\$1" 0 1
2211 . el .LB \\n[Li] 0 2 1 "\\$1" 0 1
2216 .if \\n[.$]>3 .@error "ML: too many arguments"
2217 .if \\n[D]>2 .tm ML $*
2218 .nr li*ml-width \w@\\$1@u+1n
2219 .if \\n[.$]<2 .LB \\n[li*ml-width]u 0 1 0 "\\$1"
2220 .if \\n[.$]=2 .LB 0\\$2 0 1 0 "\\$1"
2222 . ie '\\$2'' .LB \\n[li*ml-width]u 0 1 0 "\\$1" 0 1
2223 . el .LB \\n[Li] 0 1 0 "\\$1" 0 1
2227 .if \\n[D]>2 .tm VL $*
2228 .if \\n[.$]>3 .@error "VL: too many arguments"
2229 .if \\n[.$]<1 .@error "VL: missing text-indent"
2230 .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0
2231 .el .LB 0\\$1 0\\$2 0 0 \& 0 1
2233 .\" Bullet (for .BL)
2235 .if \\n[D]>2 .tm BL $*
2237 .if \\n[.$]>2 .@error "BL: too many arguments"
2238 .if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \\*[BU]
2239 .if \\n[.$]=1 .LB 0\\$1 0 1 0 \\*[BU]
2241 . ie '\\$1'' .LB \\n[Pi] 0 1 0 \\*[BU] 0 1
2242 . el .LB 0\\$1 0 1 0 \\*[BU] 0 1
2246 .if \\n[D]>2 .tm DL $*
2247 .if \\n[.$]>2 .@error "DL: too many arguments"
2248 .if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \(em
2249 .if \\n[.$]=1 .LB 0\\$1 0 1 0 \(em
2251 . ie '\\$1'' .LB \\n[Pi] 0 1 0 \(em 0 1
2252 . el .LB 0\\$1 0 1 0 \(em 0 1
2256 .if \\n[D]>2 .tm RL $*
2257 .if \\n[.$]>2 .@error "RL: too many arguments"
2258 .if \\n[.$]<1 .LB 6 0 2 4
2259 .if \\n[.$]=1 .LB 0\\$1 0 2 4
2261 . ie '\\$1'' .LB 6 0 2 4 1 0 1
2262 . el .LB 0\\$1 0 2 4 1 0 1
2265 .\" Broken Variable List. As .VL but text begin on the next line
2267 .if \\n[D]>2 .tm BVL $*
2268 .if \\n[.$]>3 .@error "BVL: too many arguments"
2269 .if \\n[.$]<1 .@error "BVL: missing text-indent"
2270 .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 -1
2271 .el .LB 0\\$1 0\\$2 0 -1 \& 0 1
2273 .\" ####### module tbl #######################################
2274 .\" This module is copied from groff_ms and modified for mgm.
2275 .\" Yes, it does not resemble the original anymore :-).
2276 .\" Don't know if I missed something important.
2277 .\" Groff_ms is written by James Clark.
2278 .nr tbl*have-header 0
2279 .nr tbl*header-written 0
2283 .if '\\$1'H' .di tbl*header-div
2286 .if \\n[tbl*have-header] \{\
2287 . ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl@print-header
2292 .if \\n[tbl*have-header] \{\
2294 .\" draw bottom and side lines of boxed tables.
2297 .nr tbl*header-written 0
2299 .de tbl@print-header
2305 .nr tbl*header-written 1
2308 .ie '\\n[.z]'tbl*header-div' \{\
2313 . nr tbl*header-ht \\n[dn]
2315 . nr tbl*have-header 1
2316 . ie '\\$1'N' .if !\\n[tbl*header-written] .tbl@print-header
2317 . el .tbl@print-header
2319 .el .@error ".TH without .TS H"
2322 .ie '\\n(.z'tbl*header-div' .@error ".TS H but no .TH before .TE"
2324 . nr tbl*have-header 0
2331 .\" ####### module pic #######################################
2336 .ie \\n[.$]<2 .@error "PS: bad arguments. Probably not processed with pic."
2338 . if !\\n[ds*lvl] .ne (u;\\$1)+1v
2339 .\" should be contained between .DS/.DE
2341 . if \\n[ds*lvl]&((\\n[ds*format]=2):(\\n[ds*format]=3)) \{\
2343 .\" . in +(u;\\n[.l]-\\n[.i]-\\$2/2)
2352 .\" ####### module eq #######################################
2360 .if !'\\*[eq*label]'' \{\
2362 . \" space down to middle of equation
2364 . ie (\\n[Eq]%2) \{\
2365 . \" label to the left
2369 . \" label to the right
2370 \h'|\\n[.l]u'\\*[eq*label]
2378 .\"########### module toc ###################
2379 .\" table of contents
2381 .nr toc*spacing \n[Lsp]u
2385 .\" Table of contents with friends (module lix)
2388 .\" print any pending displays and references
2390 .if \\n[ref*flag] .RP 0 1
2392 .if \w@\\$1@>0 .nr toc*slevel \\$1
2393 .if \w@\\$2@>0 .nr toc*spacing (u;\\$2*\\n[Lsp])
2394 .if \w@\\$3@>0 .nr toc*tlevel \\$3
2395 .if \w@\\$4@>0 .nr toc*tab \\$4
2396 .if \\n[pg*cols-per-page]>1 .1C
2397 .ds H1txt \\*[Licon]
2404 .if d Ci .toc@read-Ci \\*[Ci]
2407 .ie \\n[Oc] .hd@set-page 1
2412 . PF "''\\\\\\\\n[toc*pn]''"
2418 .while \\n+[toc*i]<10 \{\
2419 . if !'\\$\\n[toc*i]'' \{\
2425 .if \\n[.$]<=4 .if d TX .TX
2426 .ie d TY .if \\n[.$]<=4 .TY
2433 .if d toc*list .toc*list
2435 .\" print LIST OF XXX
2436 .if d lix*dsfg .lix@print-ds fg FG "\\*[Lf]" \\n[.$]
2437 .if d lix*dstb .lix@print-ds tb TB "\\*[Lt]" \\n[.$]
2438 .if d lix*dsec .lix@print-ds ec EC "\\*[Le]" \\n[.$]
2439 .if d lix*dsex .lix@print-ds ex EX "\\*[Lx]" \\n[.$]
2442 .\" .toc@read-Ci lev1 lev2 lev3 lev4 ... lev7
2445 .while \\n+[toc*i]<15 \{\
2446 . nr toc*hl!\\n[toc*i] \\$[\\n[toc*i]]
2452 . toc@save \\$1 "\\*[hd*mark]" "\\$2" \\*[hd*sect-pg]
2454 .el .toc@save \\$1 "\\*[hd*mark]" "\\$2" \\n[%]
2459 .\" collect maxsize of mark if string Ci don't exist.
2461 . if !r toc*hl!\\$1 .nr toc*hl!\\$1 0
2462 . if \\n[toc*hl!\\$1]<=\w@\\$2@ \{\
2463 . nr toc*hl!\\$1 \w@\\$2@u
2467 .\" .toc@set level headernumber text pagenr
2468 .toc@set \\$1 "\\$2" "\\$3" \\$4
2472 .\" level mark text pagenumber
2474 .if \\$1<=\\n[toc*slevel] .SP \\n[toc*spacing]u
2480 . nr toc*ind +\\n[toc*hl!\\$1]u
2483 . while \\n+[toc*i]<\\$1 \{\
2484 . nr toc*ind +\\n[toc*hl!\\n[toc*i]]u
2487 .nr toc*text \\n[toc*ind]u+\\n[toc*hl!\\$1]u
2489 .ti -\\n[toc*hl!\\$1]u
2491 .\" length of headernum space
2492 .nr toc*i \\n[toc*hl!\\$1]-\w@\\$2@
2494 .ll \\n[@ll]u-\w@\\$4@u-2m
2496 .\" ragged right ---------------------------------
2497 .ie \\$1>\\n[toc*tlevel] \{\
2504 . \" unnumbered heading --------------------
2509 . \" normal heading ------------------------
2517 . nr toc*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$4@)-1m
2518 \h'|\\n[.n]u'\l'\\n[toc*sep]u.'\h'1m'\\$4
2522 .\"########################### module lix ############################
2523 .\" LIST OF figures, tables, exhibits and equations
2534 .lix@print-line fg Lf \\n+[lix*fg-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2537 .lix@print-line tb Lt \\n+[lix*tb-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2540 .lix@print-line ec Le \\n+[lix*ec-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2543 .lix@print-line ex Lx \\n+[lix*ex-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2546 .\" print line with 'figure' in the text
2547 .\" type stringvar number text override flag refname
2551 .ie \\n[Sectf] .ds lix*numb \\n[H1]-\\$3
2552 .el .ds lix*numb \\$3
2554 .ie !\\n[Of] .ds lix*ds-form .\ \ \"
2555 .el .ds lix*ds-form "\ \(em\ \"
2557 .ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\*[lix*ds-form]
2559 . if !0\\$6 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*numb]\\*[lix*ds-form]
2560 . if 0\\$6=1 .ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\$5\\*[lix*ds-form]
2561 . if 0\\$6=2 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*ds-form]
2563 .\" print line if not between DS/DE
2564 .ie \\n[ds*lvl]<1&\\n[df*float]=0 \{\
2565 . lix@print-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7
2568 . lix@embedded-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7
2573 .\" label text type stringvar refname
2575 .ie \\n[Sectp] .ds lix*pgnr \\*[hd*sect-pg]
2576 .el .ds lix*pgnr \\n[%]
2581 .ie (\w@\\$1\\$2@)>(\\n[.l]-\\n[.i]) \{\
2589 .\" save line for LIST OF XXX, wth is the width of the label
2590 .if !r lix*wth\\$3 .nr lix*wth\\$3 0
2591 .\" find the maximum width
2592 .if \w@\\*[lix*label]@>\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@
2593 .if \\n[\\$4] .lix@ds-save \\$3 \\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]"
2594 .\" save reference to the figure
2595 .if !'\\$5'' .SETR \\$5 \\*[lix*numb]
2597 .\" hide printout until diversion is evaluated
2598 .de lix@embedded-text
2599 \!.ie \\\\n[Sectp] .ds lix*pgnr \\\\*[hd*sect-pg]
2600 \!.el .ds lix*pgnr \\\\n[%]
2606 \!.ie (\w@\\$1\\$2@)>(\\\\n[.l]-\\\\n[.i]) \{\
2617 .\" save line for LIST OF XXX, wth is the width of the label
2618 \!.if !r lix*wth\\$3 .nr lix*wth\\$3 0
2619 .\" find the maximum width
2620 \!.if \w@\\*[lix*label]@>\\\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@
2621 \!.if \\\\n[\\$4] .lix@ds-save \\$3 \\\\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]"
2622 .\" save reference to the figure
2623 \!.if !'\\$5'' .SETR \\$5 \\*[lix*numb]
2626 .\" print complete list of XXXX
2628 .\" arg: fg,tb,ec,ex text
2631 .if !\\n[Cp] .pg@next-page
2632 .\" print LIST OF XXXX
2633 .\" execute user-defined macros
2634 .if \\$4<=4 .if d TX\\$2 .TX\\$2
2635 .ie d TY\\$2 .if \\$4<=4 .TY\\$2
2641 .in \\n[lix*wth\\$1]u
2646 .\" save line of list in macro
2648 .\" type pagenumber text
2650 .lix@dsln \\$1 \\$2 "\\$3" "\\$4" \\$5
2654 .\" print appended macro
2655 .\" lix@dsln type pagenumber text headernr
2657 .nr lix*i \\n[lix*wth\\$1]-\w@\\$4@
2659 .ll \\n[@ll]u-\w@\\$4@u-\w@\\$2@u-2m
2660 .ti -\\n[lix*wth\\$1]u
2666 .nr lix*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$2@)-1m
2667 \h'|\\n[.n]u'\l'\\n[lix*sep]u.'\h'1m'\\$2
2668 .SP \\n[toc*spacing]u
2670 .\"########################### module fnt ############################
2671 .\" some font macros.
2680 .nr fnt*prev \\n[.f]
2682 .while \\n+[fnt*i]<=\\n[.$] \{\
2683 . if \\n[fnt*i]>3 .as fnt*tmp \,
2684 . ie (\\n[fnt*i]%2)=1 .as fnt*tmp \\$1\\$[\\n[fnt*i]]
2685 . el .as fnt*tmp \\$2\\$[\\n[fnt*i]]
2686 . if \\n[fnt*i]<\\n[.$] .as fnt*tmp \/
2688 \&\\*[fnt*tmp]\f[\\n[fnt*prev]]
2692 .ie \\n[.$] .fnt@switch \fB \f[\\n[.f]] \\$@
2696 .ie \\n[.$] .fnt@switch \fI \f[\\n[.f]] \\$@
2700 .if \\n[.$] .fnt@switch \fI \fB \\$@
2703 .if \\n[.$] .fnt@switch \fB \fI \\$@
2706 .if \\n[.$] .fnt@switch \fI \fR \\$@
2709 .if \\n[.$] .fnt@switch \fR \fI \\$@
2712 .if \\n[.$] .fnt@switch \fR \fB \\$@
2715 .if \\n[.$] .fnt@switch \fB \fR \\$@
2717 .\"########################### module box ############################
2718 .\" draw a box around some text. Text will be kept on the same page.
2721 .\" .B1 and .B2 works like .DS
2723 .if \\n[box*ll] .@error "B1: missing B2"
2726 .nr box*hyp \\n[.hy]
2727 .nr box*wid \\n[.l]-\\n[.i]
2729 .\" jump to new environment.
2735 .ll (u;\\n[box*wid]-1n)
2739 .if !\\n[box*ll] .@error "B2: missing B1"
2742 .nr box*height \\n[dn]
2746 .nr box*y-pos \\n[.d]u
2751 \D'l \\n[box*wid]u 0'\
2752 \D'l 0 -\\n[box*height]u'\
2753 \D'l -\\n[box*wid]u 0'\
2754 \D'l 0 \\n[box*height]u'
2764 .\"########################### module ref ############################
2768 .nr ref*flag 0 \" for end-of-text
2769 .ds Rf \v'-.4m'\s-3[\\n+[ref*nr]]\s0\v'.4m'
2774 .if !''\\$1' .ds \\$1 \v'-.4m'\s-3[\\n[ref*nr]]\s0\v'.4m'
2777 .ref@start-print \\n[ref*nr]
2792 .in \\n[ref*nr-width]u
2793 .ti -(\w@\\$1.@u+1n)
2806 .if \\n[Ls] .SP \\n[Lsp]u
2810 .if !d ref*mac .@error "RP: No references!"
2812 .if \\n[ref*i]<2 .SK
2815 .if 0\\$1<1 .nr ref*nr 0 1
2816 .if ((\\n[ref*i]=0):(\\n[ref*i]=2)) .SK
2819 .\" called by end-of-text!
2821 .\".if \\n[ref*flag] \{
2823 . if \\n[D]>2 .tm Print references, called by eot
2835 .\" prints the references
2837 .toc@save 1 "" "\\*[Rp]" \\n[%]
2842 .misc@ev-keep ref*ev
2851 .\"########################### module app ############################
2859 .\" name == "" -> autonumber
2861 .\" .if \\n[.$]<2 .@error "APP: too few arguments"
2867 .ie \\n[Aph] .app@header \\*[app*ind] "\\$2"
2869 .app@index "\\*[app*ind]" "\\$2"
2872 .\" .APPSK name pages text
2873 .\" name == "" -> autonumber
2875 .if \\n[.$]<2 .@error "APPSK: too few arguments"
2881 .ie \\n[Aph] .app@header \\*[app*ind] "\\$3"
2883 .app@index "\\*[app*ind]" "\\$3"
2888 .ie \w@\\$1@ .ds app*ind \\$1
2890 . if !\\n[app*flag] \{\
2896 . ds app*ind \\n+[app*nr]
2897 . nr H1 \\n+[app*dnr]
2898 . nr H1h \\n[app*dnr]
2900 .\" clear lower counters
2902 .while \\n+[app*i]<15 .nr H\\n[app*i] 0 1
2906 .toc@save 1 "" "\\*[App] \\$1: \\$2" \\n[%]
2909 .\" app@heaer name text
2914 \s+4\fB\\*[App]\ \\$1\fP\s0
2916 .if \w@\\$2@<\\n[.l] .ce 1
2920 .als APPX app@header
2921 .\"########################### module cov ############################
2922 .\" title stored in diversion cov*title
2923 .\" abstract stored in diversion cov*abstract
2924 .\" arg to abstract stored in cov*abs-arg
2925 .\" indent stored in cov*abs-ind
2926 .\" number of authors stored in cov*au
2927 .\" author(s) stored in cov*au!x!y
2928 .\" author(s) title stored in cov*at!x!y
2929 .\" x is the author-index [1-cov*au], y is the argument-index [1-9].
2930 .\" author(s) firm stored in cov*firm
2931 .\" new date (if .ND exists) is stored in cov*new-date
2934 .ds cov*abs-name ABSTRACT
2938 .rm IA IE WA WE LO LT
2939 .if \\n[.$]>0 .ds cov*title-charge-case \\$1
2940 .if \\n[.$]>1 .ds cov*title-file-case \\$2
2941 .pg@disable-top-trap
2945 .\"-------------------
2949 .\"-------------------
2950 .\" .AU name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]]
2953 .pg@disable-top-trap
2956 .ds cov*au!\\n[cov*au]!1
2957 .while \\n[.$]>=\\n+[cov*i] \{\
2958 . ds cov*au!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
2960 .if (\\n[.$]>=3)&(\w@\\$3@) \{\
2961 . if d cov*location-\\$3] \{\
2962 . ds cov*au!3!\\n[cov*au] \\*[cov*location-\\$3]
2966 .\"-------------------
2967 .\" .AT title1 [title2 [... [title9] ]]]]
2968 .\" Well, thats all that COVEND look for.
2969 .\" Must appear directly after .AU
2971 .if \\n[.$]<1 .@error "AT: no arguments"
2973 .while \\n[.$]>=\\n+[cov*i] \{\
2974 . ds cov*at!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
2977 .\"-------------------
2980 .if !''\\$1' .ds cov*firm \\$1
2983 .ds cov*abs-name \\$1
2986 .pg@disable-top-trap
2987 .if d cov*abstract .@error "AS: only one abstract allowed"
2988 .if !''\\n[.z]' .@error "AS: no diversion allowed (previous .AS?)"
2989 .nr cov*abs-arg 0\\$1
2990 .nr cov*abs-ind (n;0\\$2)
2995 .\" fixed for 2000, now uses \n[year].
2997 . \" support for ISO-date
3003 . ds cov*new-date \\*[MO\\n[mo]] \\n[dy], \\n[year]
3006 . ds cov*new-date \\n[year]-\\n[cov*mm]-\\n[cov*dd]
3010 .als DT cov*new-date
3012 .ds cov*new-date \\$1
3014 .\" switch to ISO-date if register Iso exist: YYYY-MM-DD
3015 .if r Iso .ISODATE 1
3016 .\"-------------------
3017 .\" save technical numbers.
3020 .while \\n[.$]>=\\n+[cov*i] .ds cov*mt-tm!\\n[cov*i] \\$[\\n[cov*i]]
3021 .nr cov*mt-tm-max \\n[.$]
3023 .\"-----------------------
3025 .\" the file must have the following last lines (somewhere):
3026 .\" .pg@enable-top-trap
3029 .ds cov*mt-file!0 0.MT
3030 .ds cov*mt-file!1 0.MT
3031 .ds cov*mt-file!2 0.MT
3032 .ds cov*mt-file!3 0.MT
3033 .ds cov*mt-file!4 4.MT
3034 .ds cov*mt-file!5 5.MT
3035 .ds cov*mt-file!6 0.MT
3039 . ie d cov*mt-file!\\$1 .ds cov*mt-type \\$1
3040 . el .ds cov*mt-type 6
3042 .el .ds cov*mt-type 1
3043 .ds cov*mt-addresse "\\$2
3044 .ds cov*mt-type-text "\\$1
3045 .ie d @language .ds cov*str mm/\\*[@language]_
3047 .mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]]
3050 .ie !\\n[.$] .ds cov*cov-type ms
3051 .el .ds cov*cov-type \\$1
3052 .pg@disable-top-trap
3053 .ie d @language .ds cov*str mm/\\*[@language]_\\*[cov*cov-type].cov
3054 .el .ds cov*str mm/\\*[cov*cov-type].cov
3057 .\"########################### module qrf ############################
3058 .\" forward and backward reference thru special files.
3060 .\" check if stderr-method is wanted
3061 .\" This was needed when I discovered that groff was considered unsafe
3062 .\" and groff -U didn't work. It's a workaround like the original
3063 .\" index method, but not in my view elegant enough.
3065 .\" init reference system
3067 .ds qrf*file \\$1.qrf
3069 .if \\n[D]>1 .tm INITR: source \\*[qrf*file]
3071 . tm .\\\\" Rfilename: \\*[qrf*file]
3073 .el 'so \\*[qrf*file]
3076 .\" set a reference.
3078 .if \\n[.$]<1 .@error "SETR:reference name missing"
3079 .if !r qrf*pass .tm "SETR: No .INITR in this file"
3081 . ds qrf*name qrf*ref-\\$1
3082 . if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd*mark],\\n[%]
3084 . ds \\*[qrf*name]-hn \\*[hd*mark]
3086 . ds \\*[qrf*name]-pn \\n[%]
3089 . tm .ds \\*[qrf*name]-hn \\*[hd*mark]
3090 . tm .ds \\*[qrf*name]-pn \\n[%]
3091 . if !'\\$2'' .tm .ds \\*[qrf*name]-xx \\$2
3097 .\" If two arg -> set var. arg to misc-string.
3099 .if \\n[.$]<1 .@error "GETST:reference name missing"
3100 .if !r qrf*pass .tm "GETST: No .INITR in this file"
3101 .ds qrf*name qrf*ref-\\$1
3102 . if d \\*[qrf*name]-xx \{\
3103 . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-xx]
3104 . el \\*[\\*[qrf*name]-xx]\c
3109 .\" get header-number
3110 .\" If two arg -> set var. arg to header-number.
3112 .if \\n[.$]<1 .@error "GETHN:reference name missing"
3113 .if !r qrf*pass .tm "GETHN: No .INITR in this file"
3114 .ds qrf*name qrf*ref-\\$1
3115 .if d \\*[qrf*name]-hn \{\
3116 . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-hn]
3117 . el \\*[\\*[qrf*name]-hn]\c
3122 .\" If two arg -> set var. arg to page-number.
3124 .if \\n[.$]<1 .@error "GETPN:reference name missing"
3125 .if !r qrf*pass .tm "GETPN: No .INITR in this file"
3126 .ds qrf*name qrf*ref-\\$1
3127 .if d \\*[qrf*name]-pn \{\
3128 . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-pn]
3129 . el \\*[\\*[qrf*name]-pn]\c
3134 .if \\n[.$]<1 .@error "GETR:reference name missing"
3136 . tm "GETR: No .INITR in this file"
3144 .\"########################### module ind ############################
3145 .\" Support for mgs-style indexing, borrowed from mgs.
3147 . tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[%]
3149 .\"--------------------
3150 .\" Another type of index system
3151 .\" INITI type filename [macro]
3153 .if \\n[.$]<1 .@error "INITI:type missing"
3154 .\" ignore if INITI has already been used
3156 . if d ind*file .@error "INITI:file already set"
3157 . ds ind*file \\$2.ind
3158 . if \\n[D]>1 .tm INITI: source \\*[ind*file]
3160 .if !d ind*file .@error "INITI:file not specified"
3163 . if \\n[.$]>2 .tm .\\\\" Imacro: \\$3
3168 .if !d ind*file .@error "IND: No active INITI"
3169 .if \\n[D]>1 .tm IND: type=\\*[ind*type]
3171 .if '\\*[ind*type]'N' .ds ind*ref \\n[%]
3172 .if '\\*[ind*type]'H' .ds ind*ref \\*[hd*mark]
3173 .if '\\*[ind*type]'B' .ds ind*ref \\*[hd*mark]\t\\n[%]
3174 .if '\\*[ind*ref]'' .@error "IND:wrong index type: \\*[ind*ref]"
3177 .while \\n[.$]>0 \{\
3179 . as ind*line \t\\$1
3181 .as ind*line \\*[ind*ref]
3182 .if \\n[Ref] .tm .\\\\" IND \\*[ind*line]
3186 .ie \\n[Ref] .tm .\\\\" Index: \\*[ind*file]
3188 . if !\\n[Cp] .pg@next-page
3190 . \" execute user-defined macros
3210 .\"########################### module let ############################
3212 .\"------------------------
3216 .ie \\n[.$] .ds let*i \\$1
3217 .el .ds let*i \\*[Letfc]
3218 .ie d let*type .let@fc_\\*[let*type] "\\*[let*i]" \\$@
3219 .el .let@mt-closing "\\*[let*i]" \\$@
3229 .\"------------------------
3232 .ie d let*type .let*lt-sign \\$@
3233 .el .let*mt-sign \\$@
3235 .\"------------------------
3237 .if !d let@sg_\\*[let*type] .@error "SG: letter type \\*[let*type] undefined"
3241 .while \\n+[let*i]<=\\n[let*wa-n] \{\
3242 .if \\n[let*i]=\\n[let*wa-n] .nr let*j 1
3243 .let@sg_\\*[let*type] "\\*[let*wa-name!\\n[let*i]]" "\\*[let*wa-title!\\n[let*i]]" \\n[let*i] \\n[let*j] \\$@
3246 .\"------------------------
3247 .\" Memorandum signature
3251 .ie \\n[.$]>1 .nr let*k 1
3252 .el .nr let*k \\n[cov*au]
3253 .ds let*tmp \\*[cov*au!\\n[let*k]!3]-\\*[cov*au!\\n[let*k]!4]-
3255 .while \\n+[let*i]<=\\n[cov*au] \{\
3256 . if \\n[let*i]>1 .as let*tmp /
3257 . as let*tmp \\*[cov*au!\\n[let*k]!2]
3259 .if !''\\$1' .as let*tmp -\\$1
3263 .while \\n+[let*i]<=\\n[cov*au] \{\
3265 . if \\n[let*i]=\\n[let*k] \{\
3266 \Z'\h'-(u;\\n[.l]/2)'\\*[let*tmp]'\c
3268 \\*[cov*au!\\n[let*i]!1]
3273 .\"------------------------
3274 .\" Approval signature
3279 .ie \\n[.$]<2 \\*[Letapp]
3282 .ie n ______________________________ ______________
3283 .el \D'l 25m 0'\h'4m'\D'l 12m 0'
3284 \Z'\\$1'\h'29m'\f[\\*[@sdf_font]]\\*[Letdate]\fP
3287 .\"------------------------
3288 .\" Letter signature
3293 .ie n ______________________________
3298 .\"------------------------
3300 .\" let@header is called from the header. It is supposed
3301 .\" to remove the alias itself.
3303 .rm AF AS AE AT AU CS OK TL MT
3307 .if !''\\$1' .ds let*type \\$1
3308 .if !d let@head_\\*[let*type] .@error "LT: unknown letter type \\$1"
3310 .als let@header let@head_\\*[let*type]
3311 .let@init_\\*[let*type] \\$@
3312 .if \n[D]>1 .tm Letter type \\*[let*type]
3331 .if \w'\\$5'&\\$4 \\$5
3334 .als let@fc_BL let@mt-closing
3336 .\" Semiblocked letter
3344 .als let@sg_SB let@sg_BL
3345 .als let@fc_SB let@mt-closing
3347 .\" Full-blocked letter
3361 .if \w'\\$5'&\\$4 \\$5
3370 .\" Simplified letter
3381 .misc@toupper "\\$1, \\$2"
3383 .if \w'\\$5'&\\$4 \\$5
3389 .\"--------------------------------------
3390 .\" Print the letter-head
3394 .if '1'\\$1' .in (u;\\n[.l]/2)
3396 .ie d let@wa-div .let@wa-div
3401 .if '1'\\$1' .if !d let*lo-CN .if !d let*lo-RN .sp 2
3402 .\" ---- Confidential
3405 . ie !''\\*[let*lo-CN]' \\*[let*lo-CN]
3411 \\*[LetRN] \\*[let*lo-RN]
3418 .while \\n+[let*i]<=\\n[let*ia-n] \{\
3419 \\*[let*ia-name!\\n[let*i]]
3420 \\*[let*ia-title!\\n[let*i]]
3422 .if d let@ia-div .let@ia-div
3426 \\*[LetAT] \\*[let*lo-AT]
3429 .if !'\\*[let*type]'SP' .if d let*lo-SA \{\
3432 . ie !''\\*[let*lo-SA]' \\*[let*lo-SA]
3437 . ie '\\*[let*type]'SP' \{\
3439 . misc@toupper \\*[let*lo-SJ]
3444 . if '\\*[let*type]'SB' .ti +5m
3445 \\*[LetSJ] \f[\\*[@sdf_font]]\\*[let*lo-SJ]\fP
3449 .\"-------------------
3450 .\" .IA [name [title]]
3453 .if \\n[.$] .ds let*ia-name!\\n+[let*ia-n] \\$1
3454 .if \\n[.$]>1 .ds let*ia-title!\\n[let*ia-n] \\$2
3466 .\"-------------------
3467 .\" .WA [name [title]]
3470 .if \\n[.$] .ds let*wa-name!\\n+[let*wa-n] \\$1
3471 .if \\n[.$]>1 .ds let*wa-title!\\n[let*wa-n] \\$2
3476 .it \\n[Letwam] let@wa-drain
3491 .if d let@wa-junk .rm let@wa-junk
3493 .\"-------------------
3497 .ie !''\\$2' .ds let*str \\$1
3500 . ie !\w'\\$1' .ds let*str \\*[Letns!\\*[Letnsdef]]
3502 . ie d Letns!\\$1 .ds let*str \\*[Letns!\\$1]
3503 . el .ds let*str \\*[Letns!copy](\\$1)\\*[Letns!to]
3506 . el .ds let*str \\*[Letns!\\*[Letnsdef]]
3515 .\"-------------------
3518 .rm AF AS AE AT AU CS OK TL MT
3519 .if ''\\$1' .@error "LO: missing option"
3520 .if !d Let\\$1 .@error "LO: unknown option (\\$1)"
3521 .ds let*lo-\\$1 \\$2
3522 .if \n[D]>1 .tm Letter option \\$1 \\$2
3524 .\"--------------------
3525 .\" Start with a clean slate