6 .\" $Id: m.tmac,v 2.36 2009/01/05 20:10:43 wl Exp $
7 .@revision $Revision: 2.36 $
10 Copyright (C) 1991-2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
11 Free Software Foundation, Inc.
12 mgm is written by Jörgen Hägg <jh@axis.com>
14 mgm is free software; you can redistribute it and/or modify it under
15 the terms of the GNU General Public License as published by the Free
16 Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
19 mgm is distributed in the hope that it will be useful, but WITHOUT ANY
20 WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24 You should have received a copy of the GNU General Public License
25 along with this program. If not, see <http://www.gnu.org/licenses/>.
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
40 .\" ######## init #######
41 .\" Contents level [0:14], contents saved if heading level <= Cl
43 .\" Eject page between LIST OF XXXX if Cp == 0
47 .\" Eject after floating display is output [0:1]
49 .\" Floating keep output [0;5]
51 .\" space before and after display if == 1 [0:1]
55 .\" Equation label adjust 0=left, 1=right
62 .\" H1-H7 heading counters
77 .\" Heading break level [0:14]
79 .\" heading centering level, [0:14]
82 .ds HF 2 2 2 2 2 2 2 2 2 2 2 2 2 2
83 .\" heading temp. indent [0:2]
84 .\" 0 -> 0 indent, left margin
85 .\" 1 -> indent to right , like .P 1
86 .\" 2 -> indent to line up with text part of preceding heading
89 .ds HP 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90 .\" heading space level [0:14]
92 .\" heading numbering type
93 .\" 0 -> multiple (1.1.1 ...)
96 .\" Unnumbered heading level
98 .\" hyphenation in body
99 .\" 0 -> no hyphenation
100 .\" 1 -> hyphenation 14 on
102 .\" text for toc, selfexplanatory. Look in the new variable section
103 .ds Lf LIST OF FIGURES
105 .ds Lt LIST OF TABLES
107 .ds Lx LIST OF EXHIBITS
109 .ds Le LIST OF EQUATIONS
111 .\" List indent, used by .AL
113 .\" List space, if listlevel > Ls then no spacing will occur around lists.
115 .\" Numbering style [0:5]
117 .\" numbered paragraphs
118 .\" 0 == not numbered
119 .\" 1 == numbered in first level headings.
121 .\" Format of figure,table,exhibit,equation titles.
124 .\" Table of contents page numbering style
126 .\" Page-number, normally same as %.
130 .\" paragraph spacing
133 .\" 0 == left-justified
135 .\" 2 == indented .P except after .H, .DE or .LE.
142 .\" Current state of TOC, empty outside TC, inside
143 .\" it will be set to co,fg,tb,ec,ex or ap.
148 .\"---------------------------------------------
149 .\" Internal global variables
151 .\" This is for cover macro .MT
155 .if r C .nr @copy_type \n[C]
156 .\" >0 if Subject/Date/From should be bold, roman otherwise
157 .ie n .ds @sdf_font R
159 .if \n[@copy_type]=4 \{\
167 . ie \n[E] .ds @sdf_font B
171 .\" Current pointsize and vertical space, always in points.
178 .if \n[D]>1 .tm @ps=\n[@ps], @vs=\n[@vs]
179 .if \n[D]>3 .tm INIT: l:\n[.l] p:\n[.p] o:\n[.o]
207 .\" non-zero if escape mechanism is turned off. Used by VERBON/OFF
209 .\"---------------------------------------------
214 .\" print appendixheader, 0 == don't
217 .\" Current appendix text
219 .\" Controls the space before and after static displays if defined.
220 .\" Lsp is used otherwise
223 .\" Add a dot after level one heading number if >0
226 .\" header prespace level. If level <= Hps, then two lines will be printed
227 .\" before the header instead of one.
230 .\" These variables controls the number of lines preceding .H.
231 .\" Hps1 is the number of lines when level > Hps
235 .\" Hps2 is the number of lines when level <= Hps
239 .\" Hss is the number of lines (Lsp) after the header.
242 .\" H1txt will be updated by .H and .HU, containing the heading text.
243 .\" Will also be updated in table of contents & friends
247 .\" header text for the index
249 .\" command to sort the index
253 .if !r Idxf .nr Idxf 0
254 .\" Change these in the national configuration file
260 .\" Flag for space between mark and prefix 1==space, 0==no space
261 .\" Can also be controlled by using '.LI mark 2'
264 .\" Lsp controls the height of an empty line. Normally 0.5v
265 .\" Normally used for nroff compatibility.
281 .ds Qrf See chapter \\*[Qrfh], page \\*[Qrfp].
283 .\" header- and footer-size will only change to the current
287 .\" section-page if Sectp > 0
289 .if (\n[N]=3):(\n[N]=5) \{\
293 .\" section-figure if Sectf > 0
295 .if \n[N]=5 .nr Sectf 1
297 .\" argument to .nm in .VERBON.
299 .\" indent for VERBON
303 .\" Formal closing (.FC)
304 .ds Letfc Yours very truly,
308 .\" Approval date-string
311 .ds LetCN CONFIDENTIAL\" Confidential default
312 .ds LetSA To Whom It May Concern:\" Salutation default
313 .ds LetAT ATTENTION:\" Attention string
314 .ds LetSJ SUBJECT:\" Subject string
315 .ds LetRN In reference to:\" Reference string
319 .ds Letns!copy Copy \" space!
322 .ds Letns!1 Copy (with att.) to
323 .ds Letns!2 Copy (without att.) to
328 .ds Letns!7 Under separate cover
329 .ds Letns!8 Letter to
330 .ds Letns!9 Memorandum to
331 .ds Letns!10 Copy (with atts.) to
332 .ds Letns!11 Copy (without atts.) to
333 .ds Letns!12 Abstract Only to
334 .ds Letns!13 Complete Memorandum to
337 .\" Text printed below the footer. Controlled by @copy_type (C).
339 .ds Pg_type!1 OFFICIAL FILE COPY
340 .ds Pg_type!2 DATE FILE COPY
341 .ds Pg_type!3 D\ R\ A\ F\ T
342 .ds Pg_type!4 D\ R\ A\ F\ T
343 .\" Max lines in return address
345 .\"--------------------------
346 .\" test for mgm macro. This can be used if the text must test
347 .\" what macros is used.
350 .\" Due to security problems with groff I had to rewrite
351 .\" the reference system. It's not as elegant as before, you
352 .\" have to run groff with '-z -rRef=1' and put stderr into the filename
355 .\" Output references to stderr if non-zero
361 .\"---------------------------------------------
362 .\" set local variables.
363 .ie d @country .mso mm/\*[@country]_locale
365 .\"---------------------------------------------
366 .if \n[D] .tm Groff mm, version \*[RE].
367 .\" ####### module init ######
370 .ie \\n[misc@adjust] 'ad
380 'tm WARNING:(\\n[.F]) input line \\n[.c]:\\$*
381 .if \\n[D] .backtrace
384 'tm ******************
385 'tm ERROR:(\\n[.F]) input line \\n[.c]:\\$*
386 .if \\n[D] .backtrace
387 'tm ******************
388 .ab "Input aborted, syntax error"
391 .tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
394 .tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz
397 .\" ####### module debug #################################
399 'tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s],\\n[.ps] \
400 in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%]
405 'tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s] in=\\n[.i]\
406 ad=\\n[.j] fi=\\n[.u] pl=\\n[.p] page=\\n[%] .o=\\n[.o]
407 'tm _______ .d=\\n[.d] .f=\\n[.f] .h=\\n[.h] .k=\\n[.k] .n=\\n[.n]\
408 .p=\\n[.p] .t=\\n[.t] .z=\\n[.z] nl=\\n[nl] dn=\\n[dn] n=\\n[debug*n]
410 .\" ####### module par #################################
411 .nr par@ind-flag 1 \" indent on following P if Pt=2
418 .nr par*num-count 0 1
420 .\" reset numbered paragraphs, arg1 = headerlevel
422 .if \\$1<3 .nr par*num-count 0
423 .if (\\$1=1)&(\\n[Np]=1) .nr par*number 0
428 .\" skip P if previous heading
430 . tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos]
431 . tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize]
433 .if !((\\n[nl]=\\n[hd*last-pos]):(\\n[hd*last-hsize]=\\n[.k])) \{\
434 . if \\n[D]>2 .tm Paragraph set ind-flag=1
436 . \" any collected unprinted text?
439 .if \\n[Np] \\n[H1].\\n+[par*number]\ \ \c
443 .\" skip P if previous heading
445 . tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos]
446 . tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize]
448 .if !((\\n[nl]=\\n[hd*last-pos]):(\\n[hd*last-hsize]=\\n[.k])) \{\
449 . if \\n[D]>2 .tm Paragraph set ind-flag=1
453 \\n[H2].\\n+[par*number2]\ \ \c
458 .SP (u;\\n[Ps]*\\n[Lsp])
460 . if \\$1=1 .ti +\\n[Pi]n
463 . if \\n[Pt]=1 .ti +\\n[Pi]n
464 . if (\\n[Pt]=2)&\\n[par@ind-flag] .ti +\\n[Pi]n
467 .\" ####### module line #######################################
470 .if !r line*lp\\n[.z] .nr line*lp\\n[.z] 0
471 .if !r line*ac\\n[.z] .nr line*ac\\n[.z] 0
472 .ie \\n[.$] .nr line*temp (v;\\$1)
475 .ie \\n[line*lp\\n[.z]]=\\n[.d] \{\
476 . \" go here if no output since the last .SP
477 . nr line*output \\n[line*temp]-\\n[line*ac\\n[.z]]
478 . if \\n[line*output]<0 .nr line*output 0
479 . nr line*ac\\n[.z] +\\n[line*output]
482 . nr line*ac\\n[.z] \\n[line*temp]
483 . nr line*output \\n[line*temp]
484 . \" no extra space in the beginning of a page
485 . if (\\n[.d]<0):(\\n[pg*head-mark]=\\n[.d]) .nr line*output 0
487 .if \\n[line*output] .sp \\n[line*output]u
488 .nr line*lp\\n[.z] \\n[.d]
490 .\" ######## module misc ###############
494 . if \\$1-1 .@error "SA: bad arg: \\$1"
495 . nr misc@adjust 0\\$1
497 .ie \\n[misc@adjust] 'ad
501 .\" switch environment, keep all important settings.
509 .\" .misc@push stackname value
511 .ie d misc*st-\\$1 .ds misc*st-\\$1 \\$2 \\*[misc*st-\\$1]
512 .el .ds misc*st-\\$1 \\$2
515 .\" .misc@pop stackname
516 .\" value returned in the string misc*pop
518 .misc@pop-set misc*st-\\$1 \\*[misc*st-\\$1]
522 .ds misc*st-name \\$1
524 .if \\n[.$]<1 .@error "stack \\*[misc*st-name] empty"
527 .ds \\*[misc*st-name] \\$*
530 .\" .misc@pop-nr stackname varname
533 .nr \\$2 \\*[misc*pop]
536 .\" .misc@pop-ds stackname varname
539 .ds \\$2 \\*[misc*pop]
547 .\" .PGFORM linelength [ pagelength [ pageoffset [1]]]
549 .\" Break here to avoid problems with new linesetting of the previous line.
550 .\" Hope this doesn't break anything else :-)
551 .\" Don't break if arg_4 is a '1'.
552 .if \\n[D]>2 .tm PGFORM: \\$*
554 .if \\n[D]>3 .tm PGFORM: IN l:\\n[.l] p:\\n[.p] o:\\n[.o]
558 . nr @cur-ll \\n[@ll]
577 .if \\n[D]>3 .tm PGFORM: OUT l:\\n[.l] p:\\n[.p] o:\\n[.o]
578 .if \\n[D]>2 .tm PGFORM: ll=\\n[@ll], pl=\\n[@pl], po=\\n[@po]
587 .\" .MOVE y [[x] linelength]
588 .\" move to line y, indent to x
590 .if !\\n[.$] .@error "MOVE y [x]: no arguments"
595 .ie \\n[.$]>2 .nr pg*i (n;\\$3)
597 . ie \\n[.$]>1 .nr pg*i (n;\\n[@ll]u-\\$2)
598 . el .nr pg*i \\n[@ll]u
600 .\" move to X-pos, if any
601 .if !''\\$2' .po \\$2
607 .if !\\n[.$] .@error "SM: no arguments"
608 .if \\n[.$]=1 \s-1\\$1\s0
609 .if \\n[.$]=2 \s-1\\$1\s0\\$2
610 .if \\n[.$]=3 \\$1\s-1\\$2\s0\\$3
613 .nr misc*S-ps \n[@ps]
614 .nr misc*S-vs \n[@vs]
615 .nr misc*S-ps1 \n[@ps]
616 .nr misc*S-vs1 \n[@vs]
625 . ie \\n[.$]=1 .ds misc*b D
627 . ie \w@\\$2@=0 .ds misc*b C
630 . ie \w@\\$1@=0 .ds misc*a C
635 .if !'\\*[misc*a]'C' \{\
636 . ie '\\*[misc*a]'P' .ps \\n[misc*S-ps]u
638 . ie '\\*[misc*a]'D' .ps \\n[S]
640 . if \\n[D]>2 .tm S: .ps \\*[misc*a]
644 .\" set vertical spacing
645 .if !'\\*[misc*b]'C' \{\
646 . ie '\\*[misc*b]'P' .vs \\n[misc*S-vs]u
648 . ie '\\*[misc*b]'D' .vs \\n[.ps]s+2p
650 . if \\n[D]>2 .tm S: .vs \\*[misc*b]
660 . tmc "S(\\$*): ma:\\*[misc*a], mb:\\*[misc*b]
661 . tm1 " => ps:\\n[.s]p (\\n[@psu]u), vs:\\n[@vsp]p (\\n[@vs]u) (res:\\n[@res])
663 .nr misc*S-ps \\n[misc*S-ps1]
664 .nr misc*S-vs \\n[misc*S-vs1]
665 .nr misc*S-ps1 \\n[@ps]
666 .nr misc*S-vs1 \\n[@vs]
690 . ds \\$3 "\\*[misc*rd]
694 .if !''\\$2' .rn misc*rd \\$2
698 .\" VERBON [flag [pointsize [font]]]
702 .\" 1 add an empty line before verbose text
703 .\" 2 add an empty line after verbose text
704 .\" 3 numbered lines (controlled by the string Verbnm)
705 .\" 4 indent text by the numbervariable Verbin.
709 .if (0\\n[misc*verb]%4)/2 .SP \\n[Lsp]u
710 .misc@ev-keep misc*verb-ev
712 .if (0\\n[misc*verb]%16)/8 .nm \\*[Verbnm]
713 .ie !'\\$3'' .ft \\$3
722 .if (0\\n[misc*verb]%32)/16 .in +\\n[Verbin]u
723 .if 0\\n[misc*verb]%2 \{\
725 . nr @verbose-flag 1 \" tell pageheader to set ec/eo
731 .if (0\\n[misc*verb]%8)/4 .SP \\n[Lsp]u
732 .if (0\\n[misc*verb]%16)/8 .nm
733 .if (0\\n[misc*verb]%32)/16 .in
737 .\" ######## module pict #################
743 .\" I assume that the number variable pict*id is the same
744 .\" between two runs.
766 . nr pict*ind (m;\\$2)
780 . nr pict*width (i;\\$1)
784 . nr pict*height (i;\\$1)
788 .\" let mmroff know the filename and id
790 . tm .\\\\" PIC id \\n[pict*id]
791 . tm .\\\\" PIC file \\*[pict*f]
793 .\" these are defined by mmroff in the second pass
794 .if d pict*file!\\n[pict*id] \{\
795 . ds pict*f \\*[pict*file!\\n[pict*id]]
796 . nr pict*llx \\n[pict*llx!\\n[pict*id]]
797 . nr pict*lly \\n[pict*lly!\\n[pict*id]]
798 . nr pict*urx \\n[pict*urx!\\n[pict*id]]
799 . nr pict*ury \\n[pict*ury!\\n[pict*id]]
801 . nr pict*w (p;\\n[pict*urx]-\\n[pict*llx])
802 . if \\n[pict*w]<0 .nr pict*w 0-\\n[pict*w]
803 . nr pict*h (p;\\n[pict*ury]-\\n[pict*lly])
804 . if \\n[pict*h]<0 .nr pict*h 0-\\n[pict*h]
805 . if \\n[pict*width]>0 \{\
806 . nr pict*rs (u;1000*\\n[pict*width]/\\n[pict*w])
807 . nr pict*w (u;\\n[pict*w]*\\n[pict*rs]/1000)
808 . nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000)
810 . if \\n[pict*height]>0 \{\
811 . nr pict*rs (u;1000*\\n[pict*height]/\\n[pict*h])
812 . nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000)
814 . if '0'\\n[pict*mode]' \{\
815 . nr pict*in \\n[.i]u
817 . if '1'\\n[pict*mode]' \{\
818 . nr pict*in (u;\\n[.l]-\\n[.i]-\\n[pict*w])
820 . if '2'\\n[pict*mode]' \{\
821 . nr pict*in \\n[pict*ind]u
823 . if '3'\\n[pict*mode]' \{\
824 . nr pict*in (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2)
827 . if \\n[pict*h]>0 .ds pict*h \\n[pict*h]
831 . \" these lines are copied and modified from pspic.tmac.
832 . \" Originally written by James Clark
834 . ie \\n[pict*box]>0 \{\
835 \v'-1v'\h'\\n[pict*in]u'\
836 \Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\
837 \v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \
838 \\n[pict*llx] \\n[pict*lly] \
839 \\n[pict*urx] \\n[pict*ury] \
840 \\n[pict*w] \\n[pict*h]'
843 \v'-1v'\h'\\n[pict*in]u'\
845 \Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\
847 \v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \
848 \\n[pict*llx] \\n[pict*lly] \
849 \\n[pict*urx] \\n[pict*ury] \
850 \\n[pict*w] \\n[pict*h]'
859 .if \\n[.$]<2 .@error "EPIC: Not enough arguments"
860 .nr pict*adj 0 \" centered
862 . shift 1 \" left adjust
868 .ds pict*name "External picture
869 .if !''$3' .ds pict*name \\$3
873 .if !\\n[pict*adj] .nr pict*ind (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2)
876 \D'l \\n[pict*w]u 0'\
877 \D'l 0 -\\n[pict*h]u'\
878 \D'l -\\n[pict*w]u 0'\
879 \D'l 0 \\n[pict*h]u'\
880 \v'-(u;\\n[pict*h]/2)'\
881 \h'(u;(\\n[pict*w]-\w'\\*[pict*name]'/2))'\\*[pict*name]
886 .\" ######## module acc #################
888 .\" accents. These are copied from mgs, written by James Clark.
890 .ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\
891 \h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2'
894 .ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2'
902 .acc@under-def , \(ac
903 .\" ######## module uni #################
904 .\" unimplemented macros
906 'tm "OK: not implemented"
909 'tm "PM: not implemented"
911 .\" ######## module hd #################
912 .\" support for usermacro
913 .nr hd*h1-page 1 \" last page-number for level 1 header.
924 .\" .hd@split varable index name val1 val2 ...
926 .if \\$2>(\\n[.$]-3) .@error "\\$3 must have at least \\$2 values (\\*[\\$3]).
928 .ds \\$1 \\$[\\n[hd*sp-tmp]]
935 .if !r hd*cur-bline .nr hd*cur-bline \\n[nl]
937 .df@print-float 2\" $$$ could be wrong...
938 .\" terminate all lists
943 .if !\\n[hd*level] .nr hd*level \\n[Hu]
945 .\" clear lower counters
947 .while \\n+[hd*i]<15 .if \\n[hd*level]<\\n[hd*i] .nr H\\n[hd*i] 0 1
949 .\" save last text for use in TP
950 .if \\n[hd*level]=1 .ds H1txt \\$2\\$3
952 .\" This is a little fix to be able to get correct H1 heading number
953 .\" in page headers. Special attention was needed when other formats are used.
955 . ds hd*format \\g[H1]
958 . af H1 \\*[hd*format]
960 .el .nr H1h \\n[H1] 1
961 .if \\n[hd*level]=1 .nr H1h +1
963 .\" Check if it's time for new page. Only if text has
965 .if \\n[Ej]&(\\n[Ej]>=\\n[hd*level])&(\\n[nl]>\\n[hd*cur-bline]) .pg@next-page
967 .\" increment current counter
968 .nr H\\n[hd*level] +1
970 .\" update pagenumber if section-page is used
971 .if (\\n[hd*level]=1)&(\\n[Sectp]>0) .hd@set-page 1
973 .\" hd*mark is the text written to the left of the header.
976 .if \\n[hd*level]>1 .as hd*mark \\n[H2]
979 .while \\n+[hd*i]<15 .if \\n[hd*level]>(\\n[hd*i]-1) .as hd*mark .\\n[H\\n[hd*i]]
980 .if \\n[Ht] .ds hd*mark \\n[H\\n[hd*level]].
982 .\" special case, no dot after level one heading if not H1dot true
983 .if (\\n[hd*level]=1)&(\\n[H1dot]=0) .ds hd*mark \\n[H1]
985 .as hd*mark \ \ \" add spaces between mark and heading
986 .if !\\n[hd*arg1] .ds hd*mark\" no mark for unnumbered
988 .if \\n[D]>1 .tm At header \\*[hd*mark] "\\$2"
989 .nr hd*htype 0 \" hd*htype = check break and space
990 . \" 0 = run-in, 1 = break only, 2 = space
991 .if \\n[hd*level]<=\\n[Hb] .nr hd*htype 1
992 .if \\n[hd*level]<=\\n[Hs] .nr hd*htype 2
993 . \" two spaces if hd*htype == 0
994 .ie (\\n[hd*htype]=0)&(\w@\\$2@) .ds hd*suf-space " \"
996 .nr hd*need 2v \" hd*need = header need space
997 .\"---------- user macro HX ------------
998 .\" User exit macro to override numbering.
999 .\" May change hd*mark (}0), hd*suf-space (}2) and hd*need (;3)
1000 .\" Can also change Hps1/2.
1001 .if d HX .HX \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
1002 .\"--------------------------------------
1004 .ie \\n[hd*level]<=\\n[Hps] .SP (u;\\n[Hps2])
1005 .el .SP (u;\\n[Hps1])
1007 .par@reset-num \\n[hd*level]\" reset numbered paragraph
1008 .\" start diversion to measure size of header
1010 \\*[hd*mark]\\$2\\$3\\*[hd*suf-space]
1014 .if \\n[hd*htype] .na \" no adjust if run-in
1015 .if \\n[hd*htype]<2 .nr hd*need +\\n[Lsp]u \" add some extra space
1016 .ne \\n[hd*need]u+\\n[dn]u+.5p-1v \" this is the needed space for a header
1018 .\" size and font calculations
1019 .hd@split hd*font \\n[hd*level] HF \\*[HF]\" get font for this level
1020 .ft \\*[hd*font]\" set new font
1021 .hd@split hd*new-ps \\n[hd*level] HP \\*[HP]\" get point size
1022 .ie (\\*[hd*new-ps]=0):(\w@\\*[hd*new-ps]@=0) \{\
1023 . if \\n[hd*htype] \{\
1024 . if '\\*[hd*font]'3' \{\
1028 . if '\\*[hd*font]'B' \{\
1036 . vs \\*[hd*new-ps]+2
1039 .\"---------- user macro HY -------------
1040 .\" user macro to reset indents
1041 .if d HY .HY \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
1042 .DEVTAG-NH \\n[hd*level] \" HTML: mark beginning of heading
1043 .\"--------------------------------------
1044 .nr hd*mark-size \w@\\*[hd*mark]@
1045 .if (\\n[hd*level]<=\\n[Hc])&\\n[hd*htype] .ce\" center if level<=Hc
1047 .\" finally, output the header
1049 .\" and the rest of the header
1050 .ie \\n[hd*htype] \{\
1054 .el \\$2\\$3\\*[hd*suf-space]\&\c
1056 .\" restore pointsize and vertical size.
1060 .\" table of contents
1061 .if (\\n[hd*level]<=\\n[Cl])&\w@\\$2@ .toc@entry \\n[hd*level] "\\$2"
1062 .\" set adjust to previous value
1064 .\" do break or space
1065 .if \\n[hd*htype] .br
1066 .if \\n[hd*htype]>1 .SP (u;\\n[Lsp]*\\n[Hss])
1067 .if \\n[hd*htype] \{\
1068 . \" indent if Hi=1 and Pt=1
1069 . if (\\n[Hi]=1)&(\\n[Pt]=1) .ti +\\n[Pi]n
1070 . \" indent size of mark if Hi=2
1071 . if \\n[hd*htype]&(\\n[Hi]>1) .ti +\\n[hd*mark-size]u
1073 .nr par@ind-flag 0 \" no indent on .P if Pt=2
1075 .\" check if it is time to reset footnotes
1076 .if (\\n[hd*level]=1)&\\n[ft*clear-at-header] .nr ft*nr 0 1
1078 .\" check if it is time to reset indexes
1079 .if (\\n[hd*level]=1)&\\n[Sectf] \{\
1085 .\"---------- user macro HZ ----------
1086 .if d HZ .HZ \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
1087 .nr hd*last-pos \\n[nl]
1088 .nr hd*last-hsize \\n[.k]
1090 .DEVTAG-EO-H \" HTML: end of heading
1095 .while \\n+[hd*i]<15 .af H\\n[hd*i] \\$[\\n[hd*i]] 1
1097 .\"----------------------
1098 .\" set page-nr, called from header
1102 .ie \\n[.$]>0 .nr P \\$1
1104 .\" Set section-page-string
1105 .ds hd*sect-pg \\n[H1]-\\n[P]
1106 .if \\n[Sectp]>1 .if '\\n[H1]'0' .ds hd*sect-pg "
1108 .\"########### module pg ####################
1109 .\" set end of text trap
1113 .ds pg*header ''- \\nP -''
1115 .if \n[N]=4 .ds pg*header ''''
1116 .if (\n[N]=3):(\n[N]=5) \{\
1118 . ds pg*footer ''\\*[hd*sect-pg]''
1126 .nr pg*foot-margin 0
1128 .nr pg*footer-size 5v\" 1v+footer+even/odd footer+2v
1129 .nr pg*header-size 7v\" 3v+header+even/odd header+2v
1130 .nr pg*extra-footer-size 0
1131 .nr pg*extra-header-size 0
1134 .nr pg*cols-per-page 1
1135 .nr pg*cur-po \n[@po]
1140 .\"-------------------------
1141 .\" footer TRAPS: set, enable and disable
1143 .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)
1145 .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]
1147 .\" last-pos points to the position of the footer and bottom
1148 .\" block below foot-notes.
1149 .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)
1150 .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]
1153 .\" Disable in HTML mode
1154 .if !'\*[.T]'html' \{\
1155 .wh \\n[pg*foot-trap]u pg@footer
1156 .if \\n[D]>2 .tm pg@enable-trap .t=\\n[.t] nl=\\n[nl]
1163 .\" move to new trap (if changed).
1169 .de pg@enable-top-trap
1170 .\" set trap for pageheader.
1171 .nr pg*top-enabled 1
1173 .de pg@disable-top-trap
1174 .\" remove trap for pageheader.
1175 .nr pg*top-enabled 0
1177 .\" no header on the next page
1179 .nr pg*top-enabled (-1)
1181 .\" set first trap for pagefooter
1185 .\"-------------------------
1186 .\" stop output and begin on next page. Fix footnotes and all that.
1189 .ne 999i \" activate trap
1192 .\"-------------------------
1193 .\" support for PX, TP and EOP.
1195 .als }e pg*even-header
1196 .als }o pg*odd-header
1198 .als TPeh pg*even-header
1199 .als TPoh pg*odd-header
1202 .als EOPef pg*even-footer
1203 .als EOPof pg*odd-footer
1204 .\"------------------------------------------------------------
1207 .\" Disable in HTML mode
1208 .if !'\*[.T]'html' \{\
1209 .if \\n[D]>1 .tm Page# \\n[%] (\\n[.F]:\\n[c.])
1210 .\" check if Hy has been changed
1214 .tl '<pagenr\ \\n[%]>'''
1216 .\" assign current page-number to P
1219 .nr line*lp\\n[.z] 0
1220 .nr line*ac\\n[.z] 0
1222 .\" suppress pageheader if pagenumber == 1 and N == [124]
1223 .if \\n[pg*top-enabled] \{\
1225 .\". pg@disable-top-trap
1226 . if \\n[pg*extra-header-size] 'sp \\n[pg*extra-header-size]u
1227 . if \\n[pg*top-margin] 'sp \\n[pg*top-margin]u
1230 . ie d let@header .let@header
1235 . ie ((\\n[P]=1)&((\\n[N]=1):(\\n[N]=2))) .sp
1236 . el .tl \\*[pg*header]
1237 . ie o .tl \\*[pg*odd-header]
1238 . el .tl \\*[pg*even-header]
1249 . \" check for pending footnotes
1252 . \" back to normal text processing
1254 . \" mark for multicolumn
1255 . nr pg*head-mark \\n[nl]u
1256 . \" reset NCOL pointer at each new page.
1258 . \" set multicolumn
1261 . \" print floating displays
1266 .if \\n[pg*top-enabled]<0 .nr pg*top-enabled 1
1267 .nr hd*cur-bline \\n[nl] \" .H needs to know if output has occured
1270 .\"---------------------------------------------------------
1274 .if \\n[D]>2 .tm Footer# \\n[%] (\\n[.F]:\\n[c.]) nl=\\n[nl]
1278 .\" increment pageoffset for MC
1279 .\" move to the exact start of footer.
1280 'sp |\\n[pg*foot-trap]u+1v
1282 .if \\n[D]>3 .tm FOOTER after .sp, nl=\\n[nl]
1284 .if d ft*div .ft@print
1287 .if !\\n[pg*cur-column] .pg@print-footer
1291 .if \\n[@verbose-flag] .eo \" to help VERBON/VERBOFF
1293 .\"-------------------------
1295 .\" jump to the position just below the foot-notes.
1296 'sp |\\n[pg*last-pos]u+1v
1297 .if \\n[D]>3 .tm print-footer nl=\\n[nl]
1298 .\" check if there are any bottom block
1299 .if d pg*block-div .pg@block
1301 .\" print the footer and eject new page
1304 .\" user defined end-of-page macro
1308 . ie o .tl \\*[pg*odd-footer]
1309 . el .tl \\*[pg*even-footer]
1310 . ie (\\n[P]=1)&(\\n[N]=1) .tl \\*[pg*header]
1311 . el .tl \\*[pg*footer]
1312 . tl ''\\*[Pg_type!\\n[@copy_type]]''
1316 .\" be sure that floating displays and footnotes will be
1317 .\" printed at the end of the document.
1318 .ie (\\n[df*fnr]>=\\n[df*o-fnr]):\\n[ft*exist] \{\
1325 .\"-------------------------
1327 .\" Initialize the title environment
1344 .\"-------------------------
1354 .ds pg*odd-header "\\$1
1358 .ds pg*even-header "\\$1
1362 .ds pg*odd-footer "\\$1
1366 .ds pg*even-footer "\\$1
1384 .\"-------------------------
1385 .\" end of page processing
1388 .\" output footnotes. set trap for block
1391 .\"-------------------------
1392 .\" print bottom block
1402 .\"-------------------------
1403 .\" define bottom block
1405 .misc@ev-keep pg*block-ev
1410 .\"-------------------------
1414 .nr pg*block-size \\n[dn]u
1418 .\"-------------------------
1419 .\" print out all pending text
1421 .if \\n[D]>2 .tm ---------- End of text processing ----------------
1425 .\"-------------------------
1426 .\" set top and bottom margins
1427 .\" -T sets pg*footer-size and pg*header-size instead
1432 . nr pg*footer-size 5v
1433 . nr pg*header-size 7v
1435 . if \\n[.$]>0 .nr pg*header-size (v;\\$1)
1436 . if \\n[.$]>1 .nr pg*footer-size (v;\\$2)
1440 . nr pg*extra-footer-size 0
1441 . nr pg*extra-header-size 0
1443 . if \\n[.$]>0 .nr pg*extra-header-size (v;\\$1)
1444 . if \\n[.$]>1 .nr pg*extra-footer-size (v;\\$2)
1446 . tm extra top \\n[pg*extra-footer-size]
1447 . tm extra bottom \\n[pg*extra-header-size]
1452 .\"---------------------
1453 .\" multicolumn output.
1455 .if \\n[pg*cols-per-page]>1 \{\
1456 . ll \\n[pg*column-size]u
1460 .if \\n[pg*cols-per-page]>1 \{\
1461 . ie \\n+[pg*cur-column]>=\\n[pg*cols-per-page] \{\
1462 . nr pg*cur-column 0 1
1463 . nr pg*cur-po \\n[@po]u
1468 . nr pg*cur-po +(\\n[pg*column-size]u+\\n[pg*column-sep]u)
1469 . po \\n[pg*cur-po]u
1470 ' sp |\\n[pg*head-mark]u
1475 .\" An argument disables the page-break.
1478 .if \\n[pg*cols-per-page]<=1 .@error "1C: multicolumn mode not active"
1479 .nr pg*cols-per-page 1
1481 .nr pg*column-size \\n[@ll]
1482 .nr pg*ncol-i \\n[pg*cur-column]\" temp variable
1483 .nr pg*cur-column 0 1
1484 .nr pg*cur-po \\n[@po]u
1489 . if \\n[pg*ncol-i]>0 \{\
1490 . @warning 1C: footnotes will be messy
1493 . if \\n[pg*last-ncol]>0 \{\
1494 . sp |\\n[pg*last-ncol]u
1501 .nr pg*head-mark \\n[nl]u
1502 .if \\n[pg*cols-per-page]>1 .@error "2C: multicolumn mode already active"
1503 .nr pg*cols-per-page 2
1504 .nr pg*column-sep \\n[@ll]/15
1505 .nr pg*column-size (\\n[@ll]u*7)/15
1506 .nr pg*cur-column 0 1
1507 .nr pg*cur-po \\n[@po]u
1508 .ll \\n[pg*column-size]u
1509 .\" .lt \\n[pg*column-size]u
1511 .\" MC column-size [ column-separation ]
1514 .nr pg*head-mark \\n[nl]u
1515 .if \\n[pg*cols-per-page]>1 .@error "MC: multicolumn mode already active"
1516 .ie ''\\$1' .nr pg*column-size \\n[.l]
1517 .el .nr pg*column-size (n;\\$1)
1518 .ie ''\\$2' .nr pg*column-sep \\n[pg*column-size]/15
1519 .el .nr pg*column-sep (n;\\$2)
1521 .\" calculate the number of columns/page
1522 .nr pg*cols-per-page 0
1523 .nr pg*i \\n[pg*column-size]
1524 .while \\n[pg*i]<=\\n[.l] \{\
1525 . nr pg*cols-per-page \\n[pg*cols-per-page]+1
1526 . nr pg*i \\n[pg*i]+\\n[pg*column-sep]+\\n[pg*column-size]
1528 .nr pg*cur-column 0 1
1529 .nr pg*cur-po \\n[@po]u
1530 .ll \\n[pg*column-size]u
1531 .\" .lt \\n[pg*column-size]u
1533 .\" begin a new column
1536 .if \\n[nl]>\\n[pg*last-ncol] .nr pg*last-ncol \\n[nl]
1544 .\" force new page by writing something invisible.
1545 .while \\n+[pg*i]<=(0\\$1) \{\
1550 .\"-------------------------------
1551 .\" MULB width1 space1 width2 space2 width3 space3 ...
1559 . nr pg*mul!\\n+[pg*i] (n;0\\$1)
1560 . nr pg*muls!\\n[pg*i] (n;0\\$2)
1563 .nr pg*mul-max-col \\n[pg*i]
1564 .ds pg*mul-fam \\n[.fam]
1565 .nr pg*mul-font \\n[.f]
1569 .fam \\*[pg*mul-fam]
1570 .ft \\n[pg*mul-font]
1578 .if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@error "MULN: Undefined columnwidth"
1580 .if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
1582 .in \\n[pg*mul-ind]u
1583 .ll (u;\\n[.i]+\\n[pg*mul!\\n+[pg*mul-x]])u
1584 .nr pg*mul-ind +(u;\\n[pg*mul!\\n[pg*mul-x]]+\\n[pg*muls!\\n[pg*mul-x]])
1590 .if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
1593 .ne \\n[pg*mul-last]u
1598 .sp \\n[pg*mul-last]u
1604 .ie o .if !\\n[pg*head-mark]=\\n[nl] \{\
1610 .\"########### module footnotes ###################
1615 .nr ft*hyphen 0\" hyphenation value
1616 .nr ft*adjust 1\" >0 if adjust true
1617 .nr ft*indent 1\" >0 if text indent true (not imp. $$$)
1618 .nr ft*just 0\" 0=left justification, 1=right (not imp. $$$)
1619 .nr ft*exist 0\" not zero if there are any footnotes to be printed
1620 .nr ft*clear-at-header 0\" >0 if footnotes should be reset at first level head.
1622 .ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m'
1624 .\"-----------------
1625 .\" init footnote environment
1627 .\" indentcontrol not implemented $$$
1628 .\" label justification not implemented $$$
1631 .ie \\n[ft*adjust] 'ad
1633 .ie \\n[ft*hyphen] 'hy 14
1640 .\"-----------------
1641 .\" set footnote format
1642 .\" no support for two column processing (yet). $$$
1644 .if \\n[.$]=0 .@error "FD: bad arg \\$1"
1645 .ie \\n[.$]=2 .nr ft*clear-at-header 1
1646 .el .nr ft*clear-at-header 0
1649 . ie \\$1>11 .nr ft*format 0
1650 . el .nr ft*format \\$1
1652 . nr ft*hyphen (\\n[ft*format]%2)*14
1653 . nr ft*format \\n[ft*format]/2
1655 . nr ft*adjust 1-(\\n[ft*format]%2)
1656 . nr ft*format \\n[ft*format]/2
1658 . nr ft*indent 1-(\\n[ft*format]%2)
1659 . nr ft*format \\n[ft*format]/2
1661 . nr ft*just \\n[ft*format]%2
1665 .\" Footnote and display width control $$$
1668 .while \\n+[ft*i]<=\\n[.$] \{\
1669 . ds ft*x \\$[\\n[ft*i]]
1670 . if '\\*[ft*x]'N' \{\
1674 . nr ds*float-break 1
1676 . if '\\*[ft*x]'-WF' .nr ft*wide 0
1677 . if '\\*[ft*x]'WF' .nr ft*wide 1
1678 . if '\\*[ft*x]'-FF' .nr ft*first-fn 0
1679 . if '\\*[ft*x]'FF' .nr ft*first-fn 1
1680 . if '\\*[ft*x]'-WD' \{\
1682 . if r ft*df-save \{\
1683 . nr Df \\n[ft*df-save]
1687 . if '\\*[ft*x]'WD' \{\
1689 . nr ft*df-save \\n[Df]
1692 . if '\\*[ft*x]'-FB' .nr ds*float-break 0
1693 . if '\\*[ft*x]'FB' .nr ds*float-break 1
1694 . if \\n[D]>1 .tm WC WF=\\n[ft*wide] WD=\\n[ds*wide]
1697 .\"-----------------
1699 .\" Change environment, switch to diversion and print the foot-note mark.
1701 .if \\n[ft*busy] .@error "FS: missing FE"
1705 .if !\\n[ft*wide] .pg@set-po
1707 .nr ft*space (u;\\n[Fs]*\\n[Lsp])
1710 .ie \\n[.$] .ds ft*mark \\$1
1711 .el .ds ft*mark \\n[ft*nr].
1717 .\"-----------------
1718 .\" init footnote diversion
1719 .de ft@init-footnote
1724 .nr ft*note-size \\n[dn]
1726 .\"-----------------
1728 .\" End the diversion, back to previous environment, and adjust
1729 .\" the trap to the new foot-note size.
1736 .if \\n[@pl]u<\\n[dn]u .@error "FE: too big footnote"
1737 .if !d ft*div .nr dn +1v
1738 .if \\n[D]>3 .tm FE: foot-trap=\\n[pg*foot-trap] .d=\\n[.d] dn=\\n[dn]
1739 .ie (\\n[pg*foot-trap]u-\\n[.d]u)<\\n[dn]u \{\
1746 . if !d ft*div .ft@init-footnote
1750 . nr ft*note-size +\\n[dn]
1756 .\"-----------------
1757 .\" print footnotes, see pg@footer
1770 .\"-----------------
1771 .\" check if any pending footnotes, see pg@header
1773 .if d ft*next-div \{\
1782 . nr ft*note-size +\\n[dn]
1789 .\"########### module display ###################
1790 .nr ds*wide 0\" >0 if wide displays wanted
1791 .nr df*fnr 0 1\" floating display counter
1792 .nr df*o-fnr 1\" floating display counter, already printed
1793 .nr ds*snr 0 1\" static display counter
1794 .nr ds*lvl 0 1\" display level
1795 .nr ds*float-busy 0\" >0 if printing float
1796 .nr df*float 0\" >0 if previous display was floating
1797 .\"--------------------------------------------
1799 .ie \\n[df*float] .df@end \\$@
1802 .\"--------------------------------------------
1803 .\" floating display start
1804 .\" nested DF/DE is not allowed.
1806 .if \\n[df*float] .@error "DF:nested floating is not allowed. Use DS."
1809 .nr df*old-ll \\n[.l]
1818 .ds@set-new-ev \\n[df*old-ll]
1822 .\"--------------------------------------------
1827 .nr df*width!\\n+[df*fnr] \\n[dl]
1828 .nr df*height!\\n[df*fnr] \\n[dn]
1829 .nr df*wide!\\n[df*fnr] \\n[ds*wide]
1830 .nr df*format!\\n[df*fnr] \\n[ds*format]
1832 .if \\n[D]>2 .tm DF:fnr=\\n[df*fnr] w=\\n[dl] h=\\n[dn] wide=\\n[ds*wide] \
1834 .\" move div to the floating display list
1835 .rn df*div df*fdiv!\\n[df*fnr]
1838 .\" print float if queue is empty and the display fits into
1839 .\" the current page
1840 .if ((\\n[df*fnr]>=\\n[df*o-fnr])&(\\n[dn]<\\n[.t])) .df@print-float 1
1844 .\" called by end-of-text
1847 .if \\n[df*o-fnr]<=\\n[df*fnr] \{\
1848 . if \\n[D]>2 .tm Print remaining displays.
1849 .\" still some floats left, make non-empty environment
1858 .\" print according to Df and De.
1859 .\" .df@print-float type
1860 .\" type called from
1862 .\" 2 end of section
1863 .\" 3 end of document
1864 .\" 4 beginning of new page
1867 .if \\n[Df]>5 .@error "Df=\\n[Df], max value is 5"
1868 .if !\\n[ds*float-busy] \{\
1869 . nr ds*float-busy 1
1871 . if \\n[D]>3 .tm print-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1873 . if (\\$1=1)&((\\n[Df]=1):(\\n[Df]=5)) \{\
1874 . if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\
1875 . \" Print only new displays.
1876 . if \\n[df*o-fnr]=\\n[df*fnr] \{\
1878 . ds@print-one-float
1883 . if (\\$1=1)&(\\n[Df]=3) \{\
1884 . if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\
1886 . ds@print-one-float
1889 .\" print all if Df<2 and end of section
1890 . if (\\$1=2)&(\\n[Sectp]>0)&(\\n[Df]<2) \{\
1892 . ds@print-all-floats
1894 .\" print all if end of document. Where should they go instead?
1897 . ds@print-all-floats
1900 . if (\\$1=4)&(\\n[Df]>1) \{\
1901 . if \\n[Df]=2 .ds@print-one-float
1902 . if \\n[Df]=3 .ds@print-one-float
1904 . ie \\n[De] .ds@print-all-floats
1905 . el .ds@print-this-page
1908 . nr ds*float-busy 0
1913 .\" print a floating diversion
1915 .nr df*old-ll \\n[.l]
1916 .nr df*old-in \\n[.i]
1919 .nr df*i \\n[df*o-fnr]
1920 .nr df*f \\n[df*format!\\n[df*i]]
1923 .if \\n[df*f]=1 'in +\\n[Si]n
1924 .if \\n[df*f]>=2 'in 0
1925 .if \\n[df*f]=2 'ce 9999
1926 .if \\n[df*f]=3 'in (u;(\\n[.l]-\\n[df*width!\\n[df*i]])/2)
1927 .if \\n[df*f]=4 'rj 9999
1928 .if \\n[df*f]=5 'in (u;\\n[.l]-\\n[df*width!\\n[df*i]])
1931 .df*fdiv!\\n[df*o-fnr]
1933 .if \\n[df*f]=2 'ce 0
1934 .if \\n[df*f]=4 'rj 0
1936 .rm df*fdiv!\\n[df*i]
1937 .rm df*height!\\n[df*i]
1938 .rm df*format!\\n[df*i]
1939 .if \\n[df*wide!\\n[df*i]] .nr pg*head-mark \\n[nl]u
1943 .\" print one floating display if there is one.
1944 .de ds@print-one-float
1945 .if \\n[df*o-fnr]<=\\n[df*fnr] \{\
1946 . if \\n[D]>3 .tm print-one-float: .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
1949 . if \\n[De] .pg@next-page
1953 .\" print all queued floats.
1954 .\" if De>0 do a page eject between the floats.
1955 .de ds@print-all-floats
1956 .while \\n[df*o-fnr]<=\\n[df*fnr] \{\
1957 . if \\n[D]>3 .tm print-all-floats: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1958 . if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .pg@next-page
1962 . if \\n[De] .pg@next-page
1966 .\" print as many floats as will fit on the current page
1967 .de ds@print-this-page
1968 .while \\n[df*o-fnr]<=\\n[df*fnr] \{\
1969 . if \\n[D]>3 .tm print-this-page: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
1970 . if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .break
1974 .\"---------------------------------------------------
1975 .\" get format of the display
1978 . ie r ds*format!\\$1 .nr ds*format \\n[ds*format!\\$1]
1979 . el .@error "DS/DF:wrong format:\\$1"
1982 .if \\n[D]>2 .tm set format=\\n[ds*format]
1983 .\" fill or not to fill, that is the...
1986 . ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2]
1987 . el .@error "\\*[ds*type]:wrong fill:\\$2"
1989 .if \\n[D]>2 .tm set fill=\\n[ds*fill]
1991 .if \\n[.$]>2 .nr ds*rindent \\$3
1992 .if \\n[D]>2 .tm set indent=\\n[ds*rindent]
1994 .\"-----------------------------
1995 .\" .ds@set-new-ev previous-line-length
1999 .if \\n[ds*rindent] \{\
2000 . ll -\\n[ds*rindent]n
2001 . lt -\\n[ds*rindent]n
2003 .if \\n[ds*wide] \{\
2008 .ie \\n[ds*fill] 'fi
2011 .\"--------------------------------------------------------
2012 .nr ds*format 0\" dummy value for .En/.EQ
2013 .nr ds*format! 0\" no indent
2014 .nr ds*format!0 0\" no indent
2015 .nr ds*format!L 0\" no indent
2016 .nr ds*format!I 1\" indent
2017 .nr ds*format!1 1\" indent
2018 .nr ds*format!C 2\" center each line
2019 .nr ds*format!2 2\" center each line
2020 .nr ds*format!CB 3\" center as block
2021 .nr ds*format!3 3\" center as block
2022 .nr ds*format!R 4\" right justify each line
2023 .nr ds*format!4 4\" right justify each line
2024 .nr ds*format!RB 5\" right justify as block
2025 .nr ds*format!5 5\" right justify as block
2027 .nr ds*fill! 0\" no fill
2028 .nr ds*fill!N 0\" no fill
2029 .nr ds*fill!0 0\" no fill
2030 .nr ds*fill!F 1\" fill on
2031 .nr ds*fill!1 1\" fill on
2032 .\"--------------------------------------------
2033 .\" static display start
2034 .\" nested DS/DE is allowed. No limit on depth.
2041 .nr ds*old-ll \\n[.l]
2042 .nr ds*old-in \\n[.i]
2043 .misc@push ds-ll \\n[.l]
2044 .misc@push ds-form \\n[ds*format]
2047 .misc@ev-keep ds*ev!\\n+[ds*snr]
2051 .\" indent in a diversion doesn't seem like a good idea.
2053 .di ds*div!\\n[ds*snr]
2055 .ds@set-new-ev \\n[ds*old-ll]
2058 .\"--------------------------------------------
2060 .if \\n-[ds*lvl]<0 .@error "DE: no corresponding DS"
2064 .nr ds*width \\n[dl]
2065 .nr ds*height \\n[dn]
2066 .misc@pop-nr ds-ll ds*old-ll
2067 .misc@pop-nr ds-form ds*format
2071 .\" calculate needed space
2072 .nr ds*need \\n[ds*height]
2073 .nr ds*i \\n[pg*foot-trap]-\\n[pg*header-size]u-\\n[pg*extra-header-size]u
2074 .if (\\n[ds*height]>\\n[ds*i])&(\\n[.t]<(\\n[ds*i]/2)) .nr ds*need \\n[.t]u+1v
2075 .if (\\n[ds*height]<\\n[ds*i])&(\\n[.t]<(\\n[ds*height])) .nr ds*need \\n[.t]u+1v
2076 .\" Eject page if display will fit one page and
2077 .\" there are less than half of the page left.
2078 .if \\n[ds*need] .ne \\n[ds*need]u
2080 .\" Print static display
2082 .if r Dsp .nr ds*i \\n[Dsp]
2084 .if \\n[Ds] .sp \\n[ds*i]u
2085 .\" check if pending equation label
2086 .eq@check \\n[ds*need]
2088 .if \\n[ds*format]=1 'in \\n[ds*old-in]u+\\n[Si]n
2089 .if \\n[ds*format]>=2 'in 0
2090 .if \\n[ds*format]=2 'ce 9999
2091 .if \\n[ds*format]=3 'in (u;(\\n[.l]-\\n[ds*width])/2)
2092 .if \\n[ds*format]=4 'rj 9999
2093 .if \\n[ds*format]=5 'in (u;\\n[.l]-\\n[ds*width])
2097 .if \\n[Ds] .sp \\n[ds*i]u
2099 .if \\n[ds*format]=2 'ce 0
2100 .if \\n[ds*format]=4 'rj 0
2101 .rm ds*div!\\n[ds*snr]
2106 .\"########### module list ###################
2107 .\" .LI text-indent mark-indent pad type [mark [LI-space [LB-space] ] ]
2118 .\"--------------------------
2119 .\" the major list-begin macro.
2120 .\" If type == -1 a 'break' will occur.
2122 .if \\n[.$]<4 .@error "LB: not enough arguments, min 4"
2123 .misc@push cind \\n[.i]
2124 .misc@push tind \\n[li*tind]
2125 .misc@push mind \\n[li*mind]
2126 .misc@push pad \\n[li*pad]
2127 .misc@push type \\n[li*type]
2128 .misc@push li-spc \\n[li*li-spc]
2129 .ds li*mark-list!\\n[li*lvl] \\*[li*mark]
2132 .nr li*tind (n;0\\$1)\" text-indent
2133 .nr li*mind (n;0\\$2)\" mark-indent
2134 .nr li*pad (n;0\\$3)\" pad
2135 .nr li*type 0\\$4\" type
2136 .ds li*mark \\$5\" mark
2137 .ie !'\\$6'' .nr li*li-spc \\$6\" LI-space
2139 .ie !'\\$7'' .nr li*lb-spc \\$7\" LB-space
2141 .\" init listcounter
2142 .nr li*cnt!\\n[li*lvl] 0 1
2144 .af li*cnt!\\n[li*lvl] 1
2145 .if \\n[li*type] .if !'\\*[li*mark]'' .af li*cnt!\\n[li*lvl] \\*[li*mark]
2147 .if \\n[li*lb-spc] .SP (u;\\n[li*lb-spc]*\\n[Lsp])
2152 .if \\n[li*lvl]<1 .@error "LI:no lists active"
2153 .if \\n[li*li-spc]&(\\n[Ls]>=\\n[li*lvl]) .SP (u;\\n[li*li-spc]*\\n[Lsp])
2156 .ds li*c-mark \\*[li*mark]
2157 .nr li*cnt!\\n[li*lvl] +1
2158 .if \\n[li*type]=1 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]].
2159 .if \\n[li*type]=2 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]])
2160 .if \\n[li*type]=3 .ds li*c-mark (\\n[li*cnt!\\n[li*lvl]])
2161 .if \\n[li*type]=4 .ds li*c-mark [\\n[li*cnt!\\n[li*lvl]]]
2162 .if \\n[li*type]=5 .ds li*c-mark <\\n[li*cnt!\\n[li*lvl]]>
2163 .if \\n[li*type]=6 .ds li*c-mark {\\n[li*cnt!\\n[li*lvl]]}
2164 .if \\n[.$]=1 .ds li*c-mark \\$1
2166 . ie (\\$2=2):(\\n[Limsp]=0) .ds li*c-mark \\$1\\*[li*c-mark]
2167 . el .ds li*c-mark \\$1\ \\*[li*c-mark]
2170 .\" determine where the text begins
2171 .nr li*text-begin \\n[li*tind]>?\w@\\*[li*c-mark]\ @
2173 .\" determine where the mark begin
2174 .ie !\\n[li*pad] .nr li*in \\n[li*mind]
2175 .el .nr li*in \\n[li*text-begin]-\\n[li*pad]-\w@\\*[li*c-mark]@
2176 .if !\\n[li*in] .nr li*in 0
2179 .\" no indentation if hanging indent
2180 .if (\w@\\*[li*c-mark]@=0)&((\\n[.$]=0):(\w@\\$1@=0)) .nr li*text-begin 0
2181 \Z'\&\h'\\n[li*in]u'\\*[li*c-mark]'\h'\\n[li*text-begin]u'\&\c
2182 .if \\n[li*type]=-1 .br
2188 .misc@pop-nr cind li*tmp
2190 .misc@pop-nr tind li*tind
2191 .misc@pop-nr mind li*mind
2192 .misc@pop-nr pad li*pad
2193 .misc@pop-nr type li*type
2194 .misc@pop-nr li-spc li*li-spc
2195 .ds li*mark \\*[li*mark-list!\\n[li*lvl]]
2198 .if \\n[li*lvl]<1 .@error "LE:mismatched"
2200 .if '\\$1'1' .SP \\n[Lsp]u
2203 .\" list status clear.
2204 .\" terminate all lists to level i
2206 .ie \\n[.$]<1 .nr li*i 0
2208 .if \\n[li*i]>\\n[li*lvl] .@error "LC: incorrect argument: \\n[li*i] (too big)"
2209 .while \\n[li*lvl]>\\n[li*i] .li@pop
2214 .if \\n[.$]>3 .@error "AL: too many arguments"
2215 .if \\n[D]>2 .tm AL $*
2216 .ie \\n[.$]<=1 .LB \\n[Li] 0 2 1 "\\$1"
2218 . ie \\n[.$]=2 .LB 0\\$2 0 2 1 "\\$1"
2220 . ie !'\\$2'' .LB \\$2 0 2 1 "\\$1" 0 1
2221 . el .LB \\n[Li] 0 2 1 "\\$1" 0 1
2226 .if \\n[.$]>3 .@error "ML: too many arguments"
2227 .if \\n[D]>2 .tm ML $*
2228 .nr li*ml-width \w@\\$1@u+1n
2229 .if \\n[.$]<2 .LB \\n[li*ml-width]u 0 1 0 "\\$1"
2230 .if \\n[.$]=2 .LB 0\\$2 0 1 0 "\\$1"
2232 . ie '\\$2'' .LB \\n[li*ml-width]u 0 1 0 "\\$1" 0 1
2233 . el .LB \\n[Li] 0 1 0 "\\$1" 0 1
2237 .if \\n[D]>2 .tm VL $*
2238 .if \\n[.$]>3 .@error "VL: too many arguments"
2239 .if \\n[.$]<1 .@error "VL: missing text-indent"
2240 .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0
2241 .el .LB 0\\$1 0\\$2 0 0 \& 0 1
2243 .\" Bullet (for .BL)
2245 .if \\n[D]>2 .tm BL $*
2247 .if \\n[.$]>2 .@error "BL: too many arguments"
2248 .if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \\*[BU]
2249 .if \\n[.$]=1 .LB 0\\$1 0 1 0 \\*[BU]
2251 . ie '\\$1'' .LB \\n[Pi] 0 1 0 \\*[BU] 0 1
2252 . el .LB 0\\$1 0 1 0 \\*[BU] 0 1
2256 .if \\n[D]>2 .tm DL $*
2257 .if \\n[.$]>2 .@error "DL: too many arguments"
2258 .if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \(em
2259 .if \\n[.$]=1 .LB 0\\$1 0 1 0 \(em
2261 . ie '\\$1'' .LB \\n[Pi] 0 1 0 \(em 0 1
2262 . el .LB 0\\$1 0 1 0 \(em 0 1
2266 .if \\n[D]>2 .tm RL $*
2267 .if \\n[.$]>2 .@error "RL: too many arguments"
2268 .if \\n[.$]<1 .LB 6 0 2 4
2269 .if \\n[.$]=1 .LB 0\\$1 0 2 4
2271 . ie '\\$1'' .LB 6 0 2 4 1 0 1
2272 . el .LB 0\\$1 0 2 4 1 0 1
2275 .\" Broken Variable List. As .VL but text begin on the next line
2277 .if \\n[D]>2 .tm BVL $*
2278 .if \\n[.$]>3 .@error "BVL: too many arguments"
2279 .if \\n[.$]<1 .@error "BVL: missing text-indent"
2280 .ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 -1
2281 .el .LB 0\\$1 0\\$2 0 -1 \& 0 1
2283 .\" ####### module tbl #######################################
2284 .\" This module is copied from groff_ms and modified for mgm.
2285 .\" Yes, it does not resemble the original anymore :-).
2286 .\" Don't know if I missed something important.
2287 .\" Groff_ms is written by James Clark.
2288 .nr tbl*have-header 0
2289 .nr tbl*header-written 0
2293 .if '\\$1'H' .di tbl*header-div
2296 .if \\n[tbl*have-header] \{\
2297 . ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl@print-header
2302 .if \\n[tbl*have-header] \{\
2304 .\" draw bottom and side lines of boxed tables.
2307 .nr tbl*header-written 0
2309 .de tbl@print-header
2315 .nr tbl*header-written 1
2318 .ie '\\n[.z]'tbl*header-div' \{\
2323 . nr tbl*header-ht \\n[dn]
2325 . nr tbl*have-header 1
2326 . ie '\\$1'N' .if !\\n[tbl*header-written] .tbl@print-header
2327 . el .tbl@print-header
2329 .el .@error ".TH without .TS H"
2332 .ie '\\n(.z'tbl*header-div' .@error ".TS H but no .TH before .TE"
2334 . nr tbl*have-header 0
2341 .\" ####### module pic #######################################
2346 .ie \\n[.$]<2 .@error "PS: bad arguments. Probably not processed with pic."
2348 . if !\\n[ds*lvl] .ne (u;\\$1)+1v
2349 .\" should be contained between .DS/.DE
2351 . if \\n[ds*lvl]&((\\n[ds*format]=2):(\\n[ds*format]=3)) \{\
2353 .\" . in +(u;\\n[.l]-\\n[.i]-\\$2/2)
2362 .\" ####### module eq #######################################
2370 .if !'\\*[eq*label]'' \{\
2372 . \" space down to middle of equation
2373 ' sp (u;(\\$1-1v)/2)
2374 . ie (\\n[Eq]%2) \{\
2375 . \" label to the left
2379 . \" label to the right
2380 \h'|\\n[.l]u-\w'\\*[eq*label]'u'\\*[eq*label]
2388 .\"########### module toc ###################
2389 .\" table of contents
2391 .nr toc*spacing \n[Lsp]u
2395 .\" Table of contents with friends (module lix)
2398 .\" print any pending displays and references
2400 .if \\n[ref*flag] .RP 0 1
2402 .if \w@\\$1@>0 .nr toc*slevel \\$1
2403 .if \w@\\$2@>0 .nr toc*spacing (u;\\$2*\\n[Lsp])
2404 .if \w@\\$3@>0 .nr toc*tlevel \\$3
2405 .if \w@\\$4@>0 .nr toc*tab \\$4
2406 .if \\n[pg*cols-per-page]>1 .1C
2407 .ds H1txt \\*[Licon]
2414 .if d Ci .toc@read-Ci \\*[Ci]
2417 .ie \\n[Oc] .hd@set-page 1
2422 . PF "''\\\\\\\\n[toc*pn]''"
2428 .while \\n+[toc*i]<10 \{\
2429 . if !'\\$\\n[toc*i]'' \{\
2435 .if \\n[.$]<=4 .if d TX .TX
2436 .ie d TY .if \\n[.$]<=4 .TY
2443 .if d toc*list .toc*list
2445 .\" print LIST OF XXX
2446 .if d lix*dsfg .lix@print-ds fg FG "\\*[Lf]" \\n[.$]
2447 .if d lix*dstb .lix@print-ds tb TB "\\*[Lt]" \\n[.$]
2448 .if d lix*dsec .lix@print-ds ec EC "\\*[Le]" \\n[.$]
2449 .if d lix*dsex .lix@print-ds ex EX "\\*[Lx]" \\n[.$]
2452 .\" .toc@read-Ci lev1 lev2 lev3 lev4 ... lev7
2455 .while \\n+[toc*i]<15 \{\
2456 . nr toc*hl!\\n[toc*i] \\$[\\n[toc*i]]
2462 . toc@save \\$1 "\\*[hd*mark]" "\\$2" \\*[hd*sect-pg]
2464 .el .toc@save \\$1 "\\*[hd*mark]" "\\$2" \\n[%]
2469 .\" collect maxsize of mark if string Ci don't exist.
2471 . if !r toc*hl!\\$1 .nr toc*hl!\\$1 0
2472 . if \\n[toc*hl!\\$1]<=\w@\\$2@ \{\
2473 . nr toc*hl!\\$1 \w@\\$2@u
2477 .\" .toc@set level headernumber text pagenr
2478 .toc@set \\$1 "\\$2" "\\$3" \\$4
2482 .\" level mark text pagenumber
2484 .if \\$1<=\\n[toc*slevel] .SP \\n[toc*spacing]u
2490 . nr toc*ind +\\n[toc*hl!\\$1]u
2493 . while \\n+[toc*i]<\\$1 \{\
2494 . nr toc*ind +\\n[toc*hl!\\n[toc*i]]u
2497 .nr toc*text \\n[toc*ind]u+\\n[toc*hl!\\$1]u
2499 .ti -\\n[toc*hl!\\$1]u
2501 .\" length of headernum space
2502 .nr toc*i \\n[toc*hl!\\$1]-\w@\\$2@
2504 .ll \\n[@ll]u-\w@\\$4@u-2m
2506 .\" ragged right ---------------------------------
2507 .ie \\$1>\\n[toc*tlevel] \{\
2514 . \" unnumbered heading --------------------
2519 . \" normal heading ------------------------
2527 . nr toc*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$4@)-1m
2528 \h'|\\n[.n]u'\l'\\n[toc*sep]u.'\h'1m'\\$4
2532 .\"########################### module lix ############################
2533 .\" LIST OF figures, tables, exhibits and equations
2544 .lix@print-line fg Lf \\n+[lix*fg-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2547 .lix@print-line tb Lt \\n+[lix*tb-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2550 .lix@print-line ec Le \\n+[lix*ec-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2553 .lix@print-line ex Lx \\n+[lix*ex-nr] "\\$1" "\\$2" "\\$3" "\\$4"
2556 .\" print line with 'figure' in the text
2557 .\" type stringvar number text override flag refname
2561 .ie \\n[Sectf] .ds lix*numb \\n[H1]-\\$3
2562 .el .ds lix*numb \\$3
2564 .ie !\\n[Of] .ds lix*ds-form .\ \ \"
2565 .el .ds lix*ds-form "\ \(em\ \"
2567 .ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\*[lix*ds-form]
2569 . if !0\\$6 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*numb]\\*[lix*ds-form]
2570 . if 0\\$6=1 .ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\$5\\*[lix*ds-form]
2571 . if 0\\$6=2 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*ds-form]
2573 .\" print line if not between DS/DE
2574 .ie (\\n[ds*lvl]<1)&(\\n[df*float]=0) \{\
2575 . lix@print-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7
2578 . lix@embedded-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7
2583 .\" label text type stringvar refname
2585 .ie \\n[Sectp] .ds lix*pgnr \\*[hd*sect-pg]
2586 .el .ds lix*pgnr \\n[%]
2591 .ie (\w@\\$1\\$2@)>(\\n[.l]-\\n[.i]) \{\
2599 .\" save line for LIST OF XXX, wth is the width of the label
2600 .if !r lix*wth\\$3 .nr lix*wth\\$3 0
2601 .\" find the maximum width
2602 .if \w@\\*[lix*label]@>\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@
2603 .if \\n[\\$4] .lix@ds-save \\$3 \\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]"
2604 .\" save reference to the figure
2605 .if !'\\$5'' .SETR \\$5 \\*[lix*numb]
2607 .\" hide printout until diversion is evaluated
2608 .de lix@embedded-text
2609 \!.ie \\\\n[Sectp] .ds lix*pgnr \\\\*[hd*sect-pg]
2610 \!.el .ds lix*pgnr \\\\n[%]
2616 \!.ie (\w@\\$1\\$2@)>(\\\\n[.l]-\\\\n[.i]) \{\
2627 .\" save line for LIST OF XXX, wth is the width of the label
2628 \!.if !r lix*wth\\$3 .nr lix*wth\\$3 0
2629 .\" find the maximum width
2630 \!.if \w@\\*[lix*label]@>\\\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@
2631 \!.if \\\\n[\\$4] .lix@ds-save \\$3 \\\\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]"
2632 .\" save reference to the figure
2633 \!.if !'\\$5'' .SETR \\$5 \\*[lix*numb]
2636 .\" print complete list of XXXX
2638 .\" arg: fg,tb,ec,ex text
2641 .if !\\n[Cp] .pg@next-page
2642 .\" print LIST OF XXXX
2643 .\" execute user-defined macros
2644 .if \\$4<=4 .if d TX\\$2 .TX\\$2
2645 .ie d TY\\$2 .if \\$4<=4 .TY\\$2
2651 .in \\n[lix*wth\\$1]u
2656 .\" save line of list in macro
2658 .\" type pagenumber text
2660 .lix@dsln \\$1 \\$2 "\\$3" "\\$4" \\$5
2664 .\" print appended macro
2665 .\" lix@dsln type pagenumber text headernr
2667 .nr lix*i \\n[lix*wth\\$1]-\w@\\$4@
2669 .ll \\n[@ll]u-\w@\\$4@u-\w@\\$2@u-2m
2670 .ti -\\n[lix*wth\\$1]u
2676 .nr lix*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$2@)-1m
2677 \h'|\\n[.n]u'\l'\\n[lix*sep]u.'\h'1m'\\$2
2678 .SP \\n[toc*spacing]u
2680 .\"########################### module fnt ############################
2681 .\" some font macros.
2690 .nr fnt*prev \\n[.f]
2692 .while \\n+[fnt*i]<=\\n[.$] \{\
2693 . if \\n[fnt*i]>3 .as fnt*tmp \,
2694 . ie (\\n[fnt*i]%2)=1 .as fnt*tmp \\$1\\$[\\n[fnt*i]]
2695 . el .as fnt*tmp \\$2\\$[\\n[fnt*i]]
2696 . if \\n[fnt*i]<\\n[.$] .as fnt*tmp \/
2698 \&\\*[fnt*tmp]\f[\\n[fnt*prev]]
2702 .ie \\n[.$] .fnt@switch \f3 \f[\\n[.f]] \\$@
2706 .ie \\n[.$] .fnt@switch \f2 \f[\\n[.f]] \\$@
2710 .if \\n[.$] .fnt@switch \f2 \f3 \\$@
2713 .if \\n[.$] .fnt@switch \f3 \f2 \\$@
2716 .if \\n[.$] .fnt@switch \f2 \f1 \\$@
2719 .if \\n[.$] .fnt@switch \f1 \f2 \\$@
2722 .if \\n[.$] .fnt@switch \f1 \f3 \\$@
2725 .if \\n[.$] .fnt@switch \f3 \f1 \\$@
2727 .\"########################### module box ############################
2728 .\" draw a box around some text. Text will be kept on the same page.
2731 .\" .B1 and .B2 works like .DS
2733 .if \\n[box*ll] .@error "B1: missing B2"
2736 .nr box*hyp \\n[.hy]
2737 .nr box*wid \\n[.l]-\\n[.i]
2739 .\" jump to new environment.
2745 .ll (u;\\n[box*wid]-1n)
2749 .if !\\n[box*ll] .@error "B2: missing B1"
2752 .nr box*height \\n[dn]
2756 .nr box*y-pos \\n[.d]u
2761 \D'l \\n[box*wid]u 0'\
2762 \D'l 0 -\\n[box*height]u'\
2763 \D'l -\\n[box*wid]u 0'\
2764 \D'l 0 \\n[box*height]u'
2774 .\"########################### module ref ############################
2778 .nr ref*flag 0 \" for end-of-text
2779 .ds Rf \v'-.4m'\s-3[\\n+[ref*nr]]\s0\v'.4m'
2784 .if !''\\$1' .ds \\$1 \v'-.4m'\s-3[\\n[ref*nr]]\s0\v'.4m'
2787 .ref@start-print \\n[ref*nr]
2802 .in \\n[ref*nr-width]u
2803 .ti -(\w@\\$1.@u+1n)
2816 .if \\n[Ls] .SP \\n[Lsp]u
2820 .if !d ref*mac .@error "RP: No references!"
2822 .if \\n[ref*i]<2 .SK
2825 .if 0\\$1<1 .nr ref*nr 0 1
2826 .if ((\\n[ref*i]=0):(\\n[ref*i]=2)) .SK
2829 .\" called by end-of-text!
2831 .\".if \\n[ref*flag] \{
2833 . if \\n[D]>2 .tm Print references, called by eot
2845 .\" prints the references
2847 .toc@save 1 "" "\\*[Rp]" \\n[%]
2852 .misc@ev-keep ref*ev
2861 .\"########################### module app ############################
2869 .\" name == "" -> autonumber
2871 .\" .if \\n[.$]<2 .@error "APP: too few arguments"
2877 .ie \\n[Aph] .app@header \\*[app*ind] "\\$2"
2879 .app@index "\\*[app*ind]" "\\$2"
2882 .\" .APPSK name pages text
2883 .\" name == "" -> autonumber
2885 .if \\n[.$]<2 .@error "APPSK: too few arguments"
2891 .ie \\n[Aph] .app@header \\*[app*ind] "\\$3"
2893 .app@index "\\*[app*ind]" "\\$3"
2898 .ie \w@\\$1@ .ds app*ind \\$1
2900 . if !\\n[app*flag] \{\
2906 . ds app*ind \\n+[app*nr]
2907 . nr H1 \\n+[app*dnr]
2908 . nr H1h \\n[app*dnr]
2910 .\" clear lower counters
2912 .while \\n+[app*i]<15 .nr H\\n[app*i] 0 1
2916 .toc@save 1 "" "\\*[App] \\$1: \\$2" \\n[%]
2919 .\" app@header name text
2924 \s+4\f3\\*[App]\ \\$1\fP\s0
2926 .if \w@\\$2@<\\n[.l] .ce 1
2930 .als APPX app@header
2931 .\"########################### module cov ############################
2932 .\" title stored in diversion cov*title
2933 .\" abstract stored in diversion cov*abstract
2934 .\" arg to abstract stored in cov*abs-arg
2935 .\" indent stored in cov*abs-ind
2936 .\" number of authors stored in cov*au
2937 .\" author(s) stored in cov*au!x!y
2938 .\" author(s) title stored in cov*at!x!y
2939 .\" x is the author-index [1-cov*au], y is the argument-index [1-9].
2940 .\" author(s) firm stored in cov*firm
2941 .\" new date (if .ND exists) is stored in cov*new-date
2944 .ds cov*abs-name ABSTRACT
2948 .rm IA IE WA WE LO LT
2949 .if \\n[.$]>0 .ds cov*title-charge-case \\$1
2950 .if \\n[.$]>1 .ds cov*title-file-case \\$2
2951 .pg@disable-top-trap
2955 .\"-------------------
2959 .\"-------------------
2960 .\" .AU name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]]
2963 .pg@disable-top-trap
2966 .ds cov*au!\\n[cov*au]!1
2967 .while \\n[.$]>=\\n+[cov*i] \{\
2968 . ds cov*au!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
2970 .if (\\n[.$]>=3)&(\w@\\$3@) \{\
2971 . if d cov*location-\\$3] \{\
2972 . ds cov*au!3!\\n[cov*au] \\*[cov*location-\\$3]
2976 .\"-------------------
2977 .\" .AT title1 [title2 [... [title9] ]]]]
2978 .\" Well, thats all that COVEND look for.
2979 .\" Must appear directly after .AU
2981 .if \\n[.$]<1 .@error "AT: no arguments"
2983 .while \\n[.$]>=\\n+[cov*i] \{\
2984 . ds cov*at!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
2987 .\"-------------------
2990 .if !''\\$1' .ds cov*firm \\$1
2993 .ds cov*abs-name \\$1
2996 .pg@disable-top-trap
2997 .if d cov*abstract .@error "AS: only one abstract allowed"
2998 .if !''\\n[.z]' .@error "AS: no diversion allowed (previous .AS?)"
2999 .nr cov*abs-arg 0\\$1
3000 .nr cov*abs-ind (n;0\\$2)
3005 .\" fixed for 2000, now uses \n[year].
3007 . \" support for ISO-date
3013 . ds cov*new-date \\*[MO\\n[mo]] \\n[dy], \\n[year]
3016 . ds cov*new-date \\n[year]-\\n[cov*mm]-\\n[cov*dd]
3020 .als DT cov*new-date
3022 .ds cov*new-date \\$1
3024 .\" switch to ISO-date if register Iso exist: YYYY-MM-DD
3025 .if r Iso .ISODATE 1
3026 .\"-------------------
3027 .\" save technical numbers.
3030 .while \\n[.$]>=\\n+[cov*i] .ds cov*mt-tm!\\n[cov*i] \\$[\\n[cov*i]]
3031 .nr cov*mt-tm-max \\n[.$]
3033 .\"-----------------------
3035 .\" the file must have the following last lines (somewhere):
3036 .\" .pg@enable-top-trap
3039 .ds cov*mt-file!0 0.MT
3040 .ds cov*mt-file!1 0.MT
3041 .ds cov*mt-file!2 0.MT
3042 .ds cov*mt-file!3 0.MT
3043 .ds cov*mt-file!4 4.MT
3044 .ds cov*mt-file!5 5.MT
3045 .ds cov*mt-file!6 0.MT
3049 . ie d cov*mt-file!\\$1 .ds cov*mt-type \\$1
3050 . el .ds cov*mt-type 6
3052 .el .ds cov*mt-type 1
3053 .ds cov*mt-addresse "\\$2
3054 .ds cov*mt-type-text "\\$1
3055 .ie d @country .ds cov*str mm/\\*[@country]_
3057 .mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]]
3060 .ie !\\n[.$] .ds cov*cov-type ms
3061 .el .ds cov*cov-type \\$1
3062 .pg@disable-top-trap
3063 .ie d @country .ds cov*str mm/\\*[@country]_\\*[cov*cov-type].cov
3064 .el .ds cov*str mm/\\*[cov*cov-type].cov
3067 .\"########################### module qrf ############################
3068 .\" forward and backward reference thru special files.
3070 .\" check if stderr-method is wanted
3071 .\" This was needed when I discovered that groff was considered unsafe
3072 .\" and groff -U didn't work. It's a workaround like the original
3073 .\" index method, but not in my view elegant enough.
3075 .\" init reference system
3077 .ds qrf*file \\$1.qrf
3079 .if \\n[D]>1 .tm INITR: source \\*[qrf*file]
3081 . tm .\\\\" Rfilename: \\*[qrf*file]
3083 .el 'so \\*[qrf*file]
3086 .\" set a reference.
3088 .if \\n[.$]<1 .@error "SETR:reference name missing"
3089 .if !r qrf*pass .tm "SETR: No .INITR in this file"
3091 . ds qrf*name qrf*ref-\\$1
3092 . if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd*mark],\\n[%]
3094 . ds \\*[qrf*name]-hn \\*[hd*mark]
3096 . ds \\*[qrf*name]-pn \\n[%]
3099 . tm .ds \\*[qrf*name]-hn \\*[hd*mark]
3100 . tm .ds \\*[qrf*name]-pn \\n[%]
3101 . if !'\\$2'' .tm .ds \\*[qrf*name]-xx \\$2
3107 .\" If two arg -> set var. arg to misc-string.
3109 .if \\n[.$]<1 .@error "GETST:reference name missing"
3110 .if !r qrf*pass .tm "GETST: No .INITR in this file"
3111 .ds qrf*name qrf*ref-\\$1
3112 . if d \\*[qrf*name]-xx \{\
3113 . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-xx]
3114 . el \\*[\\*[qrf*name]-xx]\c
3119 .\" get header-number
3120 .\" If two arg -> set var. arg to header-number.
3122 .if \\n[.$]<1 .@error "GETHN:reference name missing"
3123 .if !r qrf*pass .tm "GETHN: No .INITR in this file"
3124 .ds qrf*name qrf*ref-\\$1
3125 .if d \\*[qrf*name]-hn \{\
3126 . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-hn]
3127 . el \\*[\\*[qrf*name]-hn]\c
3132 .\" If two arg -> set var. arg to page-number.
3134 .if \\n[.$]<1 .@error "GETPN:reference name missing"
3135 .if !r qrf*pass .tm "GETPN: No .INITR in this file"
3136 .ds qrf*name qrf*ref-\\$1
3137 .if d \\*[qrf*name]-pn \{\
3138 . ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-pn]
3139 . el \\*[\\*[qrf*name]-pn]\c
3144 .if \\n[.$]<1 .@error "GETR:reference name missing"
3146 . tm "GETR: No .INITR in this file"
3154 .\"########################### module ind ############################
3155 .\" Support for mgs-style indexing, borrowed from mgs.
3157 . tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[%]
3159 .\"--------------------
3160 .\" Another type of index system
3161 .\" INITI type filename [macro]
3163 .if \\n[.$]<1 .@error "INITI:type missing"
3164 .\" ignore if INITI has already been used
3166 . if d ind*file .@error "INITI:file already set"
3167 . ds ind*file \\$2.ind
3168 . if \\n[D]>1 .tm INITI: source \\*[ind*file]
3170 .if !d ind*file .@error "INITI:file not specified"
3173 . if \\n[.$]>2 .tm .\\\\" Imacro: \\$3
3178 .if !d ind*file .@error "IND: No active INITI"
3179 .if \\n[D]>1 .tm IND: type=\\*[ind*type]
3181 .if '\\*[ind*type]'N' .ds ind*ref \\n[%]
3182 .if '\\*[ind*type]'H' .ds ind*ref \\*[hd*mark]
3183 .if '\\*[ind*type]'B' .ds ind*ref \\*[hd*mark]\t\\n[%]
3184 .if '\\*[ind*ref]'' .@error "IND:wrong index type: \\*[ind*ref]"
3187 .while \\n[.$]>0 \{\
3189 . as ind*line \t\\$1
3191 .as ind*line \\*[ind*ref]
3192 .if \\n[Ref] .tm .\\\\" IND \\*[ind*line]
3196 .ie \\n[Ref] .tm .\\\\" Index: \\*[ind*file]
3198 . if !\\n[Cp] .pg@next-page
3200 . \" execute user-defined macros
3220 .\"########################### module let ############################
3222 .\"------------------------
3226 .ie \\n[.$] .ds let*i \\$1
3227 .el .ds let*i \\*[Letfc]
3228 .ie d let*type .let@fc_\\*[let*type] "\\*[let*i]" \\$@
3229 .el .let@mt-closing "\\*[let*i]" \\$@
3239 .\"------------------------
3242 .ie d let*type .let*lt-sign \\$@
3243 .el .let*mt-sign \\$@
3245 .\"------------------------
3247 .if !d let@sg_\\*[let*type] .@error "SG: letter type \\*[let*type] undefined"
3251 .while \\n+[let*i]<=\\n[let*wa-n] \{\
3252 .if \\n[let*i]=\\n[let*wa-n] .nr let*j 1
3253 .let@sg_\\*[let*type] "\\*[let*wa-name!\\n[let*i]]" "\\*[let*wa-title!\\n[let*i]]" \\n[let*i] \\n[let*j] \\$@
3256 .\"------------------------
3257 .\" Memorandum signature
3261 .ie \\n[.$]>1 .nr let*k 1
3262 .el .nr let*k \\n[cov*au]
3263 .ds let*tmp \\*[cov*au!\\n[let*k]!3]-\\*[cov*au!\\n[let*k]!4]-
3265 .while \\n+[let*i]<=\\n[cov*au] \{\
3266 . if \\n[let*i]>1 .as let*tmp /
3267 . as let*tmp \\*[cov*au!\\n[let*k]!2]
3269 .if !''\\$1' .as let*tmp -\\$1
3273 .while \\n+[let*i]<=\\n[cov*au] \{\
3275 . if \\n[let*i]=\\n[let*k] \{\
3276 \Z'\h'-(u;\\n[.l]/2)'\\*[let*tmp]'\c
3278 \\*[cov*au!\\n[let*i]!1]
3283 .\"------------------------
3284 .\" Approval signature
3289 .ie \\n[.$]<2 \\*[Letapp]
3292 .ie n ______________________________ ______________
3293 .el \D'l 25m 0'\h'4m'\D'l 12m 0'
3294 \Z'\\$1'\h'29m'\f[\\*[@sdf_font]]\\*[Letdate]\fP
3297 .\"------------------------
3298 .\" Letter signature
3303 .ie n ______________________________
3308 .\"------------------------
3310 .\" let@header is called from the header. It is supposed
3311 .\" to remove the alias itself.
3313 .rm AF AS AE AT AU CS OK TL MT
3317 .if !''\\$1' .ds let*type \\$1
3318 .if !d let@head_\\*[let*type] .@error "LT: unknown letter type \\$1"
3320 .als let@header let@head_\\*[let*type]
3321 .let@init_\\*[let*type] \\$@
3322 .if \n[D]>1 .tm Letter type \\*[let*type]
3341 .if \w'\\$5'&\\$4 \\$5
3344 .als let@fc_BL let@mt-closing
3346 .\" Semiblocked letter
3354 .als let@sg_SB let@sg_BL
3355 .als let@fc_SB let@mt-closing
3357 .\" Full-blocked letter
3371 .if \w'\\$5'&\\$4 \\$5
3380 .\" Simplified letter
3391 .misc@toupper "\\$1, \\$2"
3393 .if \w'\\$5'&\\$4 \\$5
3399 .\"--------------------------------------
3400 .\" Print the letter-head
3404 .if '1'\\$1' .in (u;\\n[.l]/2)
3406 .ie d let@wa-div .let@wa-div
3411 .if '1'\\$1' .if !d let*lo-CN .if !d let*lo-RN .sp 2
3412 .\" ---- Confidential
3415 . ie !''\\*[let*lo-CN]' \\*[let*lo-CN]
3421 \\*[LetRN] \\*[let*lo-RN]
3428 .while \\n+[let*i]<=\\n[let*ia-n] \{\
3429 \\*[let*ia-name!\\n[let*i]]
3430 \\*[let*ia-title!\\n[let*i]]
3432 .if d let@ia-div .let@ia-div
3436 \\*[LetAT] \\*[let*lo-AT]
3439 .if !'\\*[let*type]'SP' .if d let*lo-SA \{\
3442 . ie !''\\*[let*lo-SA]' \\*[let*lo-SA]
3447 . ie '\\*[let*type]'SP' \{\
3449 . misc@toupper \\*[let*lo-SJ]
3454 . if '\\*[let*type]'SB' .ti +5m
3455 \\*[LetSJ] \f[\\*[@sdf_font]]\\*[let*lo-SJ]\fP
3459 .\"-------------------
3460 .\" .IA [name [title]]
3463 .if \\n[.$] .ds let*ia-name!\\n+[let*ia-n] \\$1
3464 .if \\n[.$]>1 .ds let*ia-title!\\n[let*ia-n] \\$2
3476 .\"-------------------
3477 .\" .WA [name [title]]
3480 .if \\n[.$] .ds let*wa-name!\\n+[let*wa-n] \\$1
3481 .if \\n[.$]>1 .ds let*wa-title!\\n[let*wa-n] \\$2
3486 .it \\n[Letwam] let@wa-drain
3501 .if d let@wa-junk .rm let@wa-junk
3503 .\"-------------------
3507 .ie !''\\$2' .ds let*str \\$1
3510 . ie !\w'\\$1' .ds let*str \\*[Letns!\\*[Letnsdef]]
3512 . ie d Letns!\\$1 .ds let*str \\*[Letns!\\$1]
3513 . el .ds let*str \\*[Letns!copy](\\$1)\\*[Letns!to]
3516 . el .ds let*str \\*[Letns!\\*[Letnsdef]]
3525 .\"-------------------
3528 .rm AF AS AE AT AU CS OK TL MT
3529 .if ''\\$1' .@error "LO: missing option"
3530 .if !d Let\\$1 .@error "LO: unknown option (\\$1)"
3531 .ds let*lo-\\$1 \\$2
3532 .if \n[D]>1 .tm Letter option \\$1 \\$2
3534 .\"--------------------
3535 .\" Start with a clean slate