\"
de @revision
ds RE \\$2
.
\"
\" Id: m.tmac,v 2.26 2005/05/26 06:28:38 wl Exp
@revision Revision: 2.26
ig

Copyright (C) 1991-2000, 2001, 2002, 2003, 2004, 2005
 Free Software Foundation, Inc.
mgm is written by J�rgen H�gg <[email protected]>

mgm is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.

mgm is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License along
with groff; see the file COPYING.  If not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

Please send bugreports with examples to [email protected].

Naming convention stolen from mgs.
Local names     module*name
Extern names    module@name
Env.var         environ:name
Index           array!index
.
if !\n(.g .ab These mm macros require groff.
do if d PH .nx
if \n(.C .ab The groff mm macros do not work in compatibility mode.
if (\n[.warn] == 65543) .warn
mso devtag.tmac
\" ######## init #######
\"      Contents level [0:14], contents saved if heading level <= Cl
nr Cl 2
\"      Eject page between LIST OF XXXX if Cp == 0
nr Cp 0
\"      Debugflag
if !r D .nr D 0
\"      Eject after floating display is output [0:1]
nr De 0
\"      Floating keep output [0;5]
nr Df 5
\"      space before and after display if == 1 [0:1]
nr Ds 1
\"      Eject page
nr Ej 0
\"      Equation label adjust 0=left, 1=right
nr Eq 0
\"      Em dash string
ie n .ds EM " --
el .ds EM \(em
\"      Footnote spacing
nr Fs 1
\"      H1-H7   heading counters
nr H1 0 1
nr H2 0 1
nr H3 0 1
nr H4 0 1
nr H5 0 1
nr H6 0 1
nr H7 0 1
nr H8 0 1
nr H9 0 1
nr H10 0 1
nr H11 0 1
nr H12 0 1
nr H13 0 1
nr H14 0 1
\"      Heading break level [0:14]
nr Hb 2
\"      heading centering level, [0:14]
nr Hc 0
\"      header format
ds HF 2 2 2 2 2 2 2 2 2 2 2 2 2 2
\"      heading temp. indent [0:2]
\"      0 -> 0 indent, left margin
\"      1 -> indent to right , like .P 1
\"      2 -> indent to line up with text part of preceding heading
nr Hi 1
\"      header pointsize
ds HP 0 0 0 0 0 0 0 0 0 0 0 0 0 0
\"      heading space level [0:14]
nr Hs 2
\"      heading numbering type
\"      0 -> multiple (1.1.1 ...)
\"      1 -> single
nr Ht 0
\"      Unnumbered heading level
nr Hu 2
\"      hyphenation in body
\"      0 -> no hyphenation
\"      1 -> hyphenation 14 on
nr Hy 0
\"      text for toc, selfexplanatory. Look in the new variable section
ds Lf LIST OF FIGURES
nr Lf 1
ds Lt LIST OF TABLES
nr Lt 1
ds Lx LIST OF EXHIBITS
nr Lx 1
ds Le LIST OF EQUATIONS
nr Le 0
\"      List indent, used by .AL
nr Li 6
\"      List space, if listlevel > Ls then no spacing will occur around lists.
nr Ls 99
\"      Numbering style [0:5]
if !r N .nr N 0
\"      numbered paragraphs
\"      0 == not numbered
\"      1 == numbered in first level headings.
nr Np 0
\"      Format of figure,table,exhibit,equation titles.
\"      0= ". ", 1=" - "
nr Of 0
\"      Table of contents page numbering style
nr Oc 0
\"      Page-number, normally same as %.
nr P 0
\"      paragraph indent
nr Pi 5
\"      paragraph spacing
nr Ps 1
\"      paragraph type
\"      0 == left-justified
\"      1 == indented .P
\"      2 == indented .P except after .H, .DE or .LE.
nr Pt 0
\"      Reference title
ds Rp REFERENCES
\"      Display indent
nr Si 5
\"
\" Current state of TOC, empty outside TC, inside
\" it will be set to co,fg,tb,ec,ex or ap.
ds Tcst
\"
ds Tm \(tm
\"
\"---------------------------------------------
\"      Internal global variables
\"
\" This is for cover macro .MT
\" .ds @language
\"
nr @copy_type 0
if r C .nr @copy_type \n[C]
\" >0 if Subject/Date/From should be bold, roman otherwise
ie n .ds @sdf_font R
el .ds @sdf_font B
if \n[@copy_type]=4 \{\
       ls 2
       nr Pi 10
       nr Pt 1
\}
\"
\"
if r E \{\
       ie \n[E] .ds @sdf_font B
       el .ds @sdf_font R
\}
\"
\"      Current pointsize and vertical space, always in points.
if !r S .nr S 10
ps \n[S]
vs \n[S]+2
\"
nr @ps \n[.ps]
nr @vs \n[.v]
if \n[D]>1 .tm @ps=\n[@ps], @vs=\n[@vs]
if \n[D]>3 .tm INIT: l:\n[.l] p:\n[.p] o:\n[.o]
\"
\"      Page length
if r L \{\
       ie n .pl \n[L]u
       el .pl \n[L]u
\}
nr @pl \n[.p]
\"
\"      page width
ie r W \{\
       ie n .ll \n[W]u
       el .ll \n[W]u
\}
el .ll 6i
nr @ll \n[.l]
nr @cur-ll \n[@ll]
lt \n[@ll]u
\"
\"      page offset
ie r O .po \n[O]u
el \{\
       ie n .po .75i
       el .po .963i
\}
\"
nr @po \n[.o]
\"
\" non-zero if escape mechanism is turned off. Used by VERBON/OFF
nr @verbose-flag 0
\"---------------------------------------------
\"      New variables
\"
\" Appendix name
ds App APPENDIX
\" print appendixheader, 0 == don't
nr Aph 1
\"
\" Current appendix text
ds Apptext
\" Controls the space before and after static displays if defined.
\" Lsp is used otherwise
\" .nr Dsp 1v
\"
\" Add a dot after level one heading number if >0
nr H1dot 1
\"
\" header prespace level. If level <= Hps, then two lines will be printed
\" before the header instead of one.
nr Hps 1
\"
\" These variables controls the number of lines preceding .H.
\" Hps1 is the number of lines when level > Hps
nr Hps1 0.5v
if n .nr Hps1 1v
\"
\" Hps2 is the number of lines when level <= Hps
nr Hps2 1v
if n .nr Hps2 2v
\"
\" Hss is the number of lines (Lsp) after the header.
nr Hss 1
\"
\" H1txt will be updated by .H and .HU, containing the heading text.
\" Will also be updated in table of contents & friends
\"
ds H1txt
\"
\" header text for the index
ds Index INDEX
\" command to sort the index
ds Indcmd sort
\"
\" flag for mkindex
if !r Idxf .nr Idxf 0
\"      Change these in the national configuration file
ds Lifg Figure
ds Litb TABLE
ds Liex Exhibit
ds Liec Equation
ds Licon CONTENTS
\" Flag for space between mark and prefix 1==space, 0==no space
\" Can also be controlled by using '.LI mark 2'
nr Limsp 1
\"
\" Lsp controls the height of an empty line. Normally 0.5v
\" Normally used for nroff compatibility.
nr Lsp 0.5v
if n .nr Lsp 1v
ds MO1 January
ds MO2 February
ds MO3 March
ds MO4 April
ds MO5 May
ds MO6 June
ds MO7 July
ds MO8 August
ds MO9 September
ds MO10 October
ds MO11 November
ds MO12 December
\" for GETR
ds Qrf See chapter \\*[Qrfh], page \\*[Qrfp].
\"
\" header- and footer-size will only change to the current
\" if Pgps is > 0.
nr Pgps 1
\"
\" section-page if Sectp > 0
nr Sectp 0
if (\n[N]=3):(\n[N]=5) \{\
       nr Sectp 1
       nr Ej 1
\}
\" section-figure if Sectf > 0
nr Sectf 0
if \n[N]=5 .nr Sectf 1
\"
\" argument to .nm in .VERBON.
ds Verbnm "1
\" indent for VERBON
nr Verbin 5n
\"
\" Letter section
\" Formal closing (.FC)
ds Letfc Yours very truly,
\"
\" Approval line
ds Letapp APPROVED:
\" Approval date-string
ds Letdate Date
\"
ds LetCN CONFIDENTIAL\"         Confidential default
ds LetSA To Whom It May Concern:\"      Salutation default
ds LetAT ATTENTION:\"                   Attention string
ds LetSJ SUBJECT:\"                     Subject string
ds LetRN In reference to:\"             Reference string
\"
\" Copy to (.NS)
ds Letnsdef 0
ds Letns!copy Copy \" space!
ds Letns!to " to
ds Letns!0 Copy to
ds Letns!1 Copy (with att.) to
ds Letns!2 Copy (without att.) to
ds Letns!3 Att.
ds Letns!4 Atts.
ds Letns!5 Enc.
ds Letns!6 Encs.
ds Letns!7 Under separate cover
ds Letns!8 Letter to
ds Letns!9 Memorandum to
ds Letns!10 Copy (with atts.) to
ds Letns!11 Copy (without atts.) to
ds Letns!12 Abstract Only to
ds Letns!13 Complete Memorandum to
ds Letns!14 CC:
\"
\" Text printed below the footer. Controlled by @copy_type (C).
ds Pg_type!0
ds Pg_type!1 OFFICIAL FILE COPY
ds Pg_type!2 DATE FILE COPY
ds Pg_type!3 D\ R\ A\ F\ T
ds Pg_type!4 D\ R\ A\ F\ T
\" Max lines in return address
nr Letwam 14
\"--------------------------
\"      test for mgm macro. This can be used if the text must test
\"      what macros is used.
nr .mgm 1
\"
\" Due to security problems with groff I had to rewrite
\" the reference system. It's not as elegant as before, you
\" have to run groff with '-z -rRef=1' and put stderr into the filename
\" for .INITR
\"
\" Output references to stderr if non-zero
ie !r Ref \{\
       nr Ref 0
\}
el .warn 0
\"
\"---------------------------------------------
\" set local variables.
ie d @language .mso mm/\*[@language]_locale
el .mso mm/locale
\"---------------------------------------------
if \n[D] .tm Groff mm, version \*[RE].
\" ####### module init ######
\"      reset all things
de init@reset
ie \\n[misc@adjust] 'ad
el 'na
ie \\n[Hy] 'hy 14
el 'nh
'in 0
'ti 0
ps \\n[@ps]u
vs \\n[@vs]u
.
de @warning
'tm WARNING:(\\n[.F]) input line \\n[.c]:\\$*
if \\n[D] .backtrace
.
de @error
'tm ******************
'tm ERROR:(\\n[.F]) input line \\n[.c]:\\$*
if \\n[D] .backtrace
'tm ******************
ab "Input aborted, syntax error"
.
de misc@toupper
tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
br
\\$1
tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz
br
.
\" ####### module debug #################################
de debug
'tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s],\\n[.ps] \
in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%]
.
de debug-all
nr debug*n 1n
nr debug*m 1m
'tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s] in=\\n[.i]\
ad=\\n[.j] fi=\\n[.u] pl=\\n[.p] page=\\n[%] .o=\\n[.o]
'tm _______ .d=\\n[.d] .f=\\n[.f] .h=\\n[.h] .k=\\n[.k] .n=\\n[.n]\
.p=\\n[.p] .t=\\n[.t] .z=\\n[.z] nl=\\n[nl] dn=\\n[dn] n=\\n[debug*n]
.
\" ####### module par #################################
nr par@ind-flag 1       \" indent on following P if Pt=2
nr hd*last-pos -1
nr hd*last-hsize -1
nr par*number 0 1
af par*number 01
nr par*number2 0 1
af par*number2 01
nr par*num-count 0 1
af par*num-count 01
\"      reset numbered paragraphs, arg1 = headerlevel
de par@reset-num
if \\$1<3 .nr par*num-count 0
if (\\$1=1)&(\\n[Np]=1) .nr par*number 0
.
\"------------
\" paragraph
de P
\"      skip P if previous heading
if \\n[D]>2 \{\
       tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos]
       tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize]
\}
if !((\\n[nl]=\\n[hd*last-pos]):(\\n[hd*last-hsize]=\\n[.k])) \{\
       if \\n[D]>2 .tm Paragraph set ind-flag=1
       nr par@ind-flag 1
\}
\" any collected unprinted text?
par@doit \\$*
if \\n[Np] \\n[H1].\\n+[par*number]\ \ \c
.
\"------------
de nP
\"      skip P if previous heading
if \\n[D]>2 \{\
       tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos]
       tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize]
\}
if !((\\n[nl]=\\n[hd*last-pos]):(\\n[hd*last-hsize]=\\n[.k])) \{\
       if \\n[D]>2 .tm Paragraph set ind-flag=1
       nr par@ind-flag 1
\}
par@doit \\$*
\\n[H2].\\n+[par*number2]\ \ \c
nr par@ind-flag 1
.
\"------------
de par@doit
SP (u;\\n[Ps]*\\n[Lsp])
ie  \\n[.$] \{\
       if \\$1=1 .ti +\\n[Pi]n
\}
el \{\
       if \\n[Pt]=1 .ti +\\n[Pi]n
       if (\\n[Pt]=2)&\\n[par@ind-flag] .ti +\\n[Pi]n
\}
.
\" ####### module line #######################################
de SP
br
if !r line*lp\\n[.z] .nr line*lp\\n[.z] 0
if !r line*ac\\n[.z] .nr line*ac\\n[.z] 0
ie \\n[.$] .nr line*temp (v;\\$1)
el .nr line*temp 1v
\"
ie \\n[line*lp\\n[.z]]=\\n[.d] \{\
       \" go here if no output since the last .SP
       nr line*output \\n[line*temp]-\\n[line*ac\\n[.z]]
       if \\n[line*output]<0 .nr line*output 0
       nr line*ac\\n[.z] +\\n[line*output]
\}
el \{\
       nr line*ac\\n[.z] \\n[line*temp]
       nr line*output \\n[line*temp]
       \" no extra space in the beginning of a page
       if (\\n[.d]<0):(\\n[pg*head-mark]=\\n[.d]) .nr line*output 0
\}
if \\n[line*output] .sp \\n[line*output]u
nr line*lp\\n[.z] \\n[.d]
.
\" ######## module misc ###############
nr misc@adjust 14
de SA
if \\n[.$] \{\
       if \\$1-1 .@error "SA: bad arg: \\$1"
       nr misc@adjust 0\\$1
\}
ie \\n[misc@adjust] 'ad
el 'na
.
\"-------------
\" switch environment, keep all important settings.
de misc@ev-keep
nr misc*ll \\n[.l]
ev \\$1
ll \\n[misc*ll]u
lt \\n[misc*ll]u
.
\"-------------
\" .misc@push stackname value
de misc@push
ie d misc*st-\\$1 .ds misc*st-\\$1 \\$2 \\*[misc*st-\\$1]
el .ds misc*st-\\$1 \\$2
.
\"-------------
\" .misc@pop stackname
\" value returned in the string misc*pop
de misc@pop
misc@pop-set misc*st-\\$1 \\*[misc*st-\\$1]
.
\"-------------
de misc@pop-set
ds misc*st-name \\$1
shift
if \\n[.$]<1 .@error "stack \\*[misc*st-name] empty"
ds misc*pop \\$1
shift
ds \\*[misc*st-name] \\$*
.
\"-------------
\" .misc@pop-nr stackname varname
de misc@pop-nr
misc@pop \\$1
nr \\$2 \\*[misc*pop]
.
\"-------------
\" .misc@pop-ds stackname varname
de misc@pop-ds
misc@pop \\$1
ds \\$2 \\*[misc*pop]
.
\"-----------
\" reset tabs
de TAB
ta T 5n
.
\"-------------
\" .PGFORM linelength [ pagelength [ pageoffset [1]]]
de PGFORM
\" Break here to avoid problems with new linesetting of the previous line.
\" Hope this doesn't break anything else :-)
\" Don't break if arg_4 is a '1'.
if \\n[D]>2 .tm PGFORM: \\$*
if ''\\$4' .br
if \\n[D]>3 .tm PGFORM: IN l:\\n[.l] p:\\n[.p] o:\\n[.o]
ie !''\\$1' \{\
       ll \\$1
       nr @ll \\n[.l]
       nr @cur-ll \\n[@ll]
       lt \\n[@ll]u
\}
el \{\
       ll \\n[@ll]u
       lt \\n[@ll]u
\}
\"
ie !''\\$2' \{\
       pl \\$2
       nr @pl \\n[.p]
\}
el .pl \\n[@pl]u
\"
ie !''\\$3' \{\
       po \\$3
       nr @po \\n[.o]
\}
el .po \\n[@po]u
if \\n[D]>3 .tm PGFORM: OUT l:\\n[.l] p:\\n[.p] o:\\n[.o]
if \\n[D]>2 .tm PGFORM: ll=\\n[@ll], pl=\\n[@pl], po=\\n[@po]
'in 0
pg@move-trap
if \\n[D]>2 \{\
       tm Traps:
       ptr
\}
.
\"-------------
\" .MOVE y [[x] linelength]
\" move to line y, indent to x
de MOVE
if !\\n[.$] .@error "MOVE y [x]: no arguments"
if \\n[nl]<0 \c
\" move to Y-pos
sp |(v;\\$1)
\" calc linelength
ie \\n[.$]>2 .nr pg*i (n;\\$3)
el \{\
       ie \\n[.$]>1 .nr pg*i (n;\\n[@ll]u-\\$2)
       el .nr pg*i \\n[@ll]u
\}
\" move to X-pos, if any
if !''\\$2' .po \\$2
\" set linelength
ll \\n[pg*i]u
.
\"-------------
de SM
if !\\n[.$] .@error "SM: no arguments"
if \\n[.$]=1 \s-1\\$1\s0
if \\n[.$]=2 \s-1\\$1\s0\\$2
if \\n[.$]=3 \\$1\s-1\\$2\s0\\$3
.
\"-------------
nr misc*S-ps \n[@ps]
nr misc*S-vs \n[@vs]
nr misc*S-ps1 \n[@ps]
nr misc*S-vs1 \n[@vs]
ds misc*a
ds misc*b
de S
ie !\\n[.$] \{\
       ds misc*a P
       ds misc*b P
\}
el \{\
       ie \\n[.$]=1 .ds misc*b D
       el \{\
               ie \w@\\$2@=0 .ds misc*b C
               el .ds misc*b \\$2
       \}
       ie \w@\\$1@=0 .ds misc*a C
       el .ds misc*a \\$1
\}
\"
\" set point size
if !'\\*[misc*a]'C' \{\
       ie '\\*[misc*a]'P' .ps \\n[misc*S-ps]u
       el \{\
               ie '\\*[misc*a]'D' .ps \\n[S]
               el .ps \\*[misc*a]
               if \\n[D]>2 .tm S: .ps \\*[misc*a]
       \}
\}
\"
\" set vertical spacing
if !'\\*[misc*b]'C' \{\
       ie '\\*[misc*b]'P' .vs \\n[misc*S-vs]u
       el \{\
               ie '\\*[misc*b]'D' .vs \\n[.ps]s+2p
               el .vs \\*[misc*b]
               if \\n[D]>2 .tm S: .vs \\*[misc*b]
       \}
\}
nr @ps \\n[.ps]
nr @psu \\n[.ps]s
nr @vs \\n[.v]
nr @vsp \\n[.v]u/1p
nr @res 1i
\"
if \\n[D]>1 \{\
       tmc "S(\\$*): ma:\\*[misc*a], mb:\\*[misc*b]
       tm1 " => ps:\\n[.s]p (\\n[@psu]u), vs:\\n[@vsp]p (\\n[@vs]u) (res:\\n[@res])
\}
nr misc*S-ps \\n[misc*S-ps1]
nr misc*S-vs \\n[misc*S-vs1]
nr misc*S-ps1 \\n[@ps]
nr misc*S-vs1 \\n[@vs]
pg@move-trap
.
\"------------
de HC
ev 0
hc \\$1
ev
ev 1
hc \\$1
ev
ev 2
hc \\$1
ev
.
\"------------
de RD
di misc*rd
'fl
rd \\$1\t
br
di
ie !''\\$3' \{\
       di misc*rd2
       ds \\$3 "\\*[misc*rd]
       br
       di
\}
if !''\\$2' .rn misc*rd \\$2
rm misc*rd misc*rd2
.
\"------------
\" VERBON [flag [pointsize [font]]]
\"      flag
\"      bit     function
\"      0       escape on
\"      1       add an empty line before verbose text
\"      2       add an empty line after verbose text
\"      3       numbered lines (controlled by the string Verbnm)
\"      4       indent text by the numbervariable Verbin.
de VERBON
br
nr misc*verb 0\\$1
if (0\\n[misc*verb]%4)/2 .SP \\n[Lsp]u
misc@ev-keep misc*verb-ev
nf
if (0\\n[misc*verb]%16)/8 .nm \\*[Verbnm]
ie !'\\$3'' .ft \\$3
el .ft CR
ie 0\\$2 \{\
       ss \\$2
       ps \\$2
       vs \\$2
\}
el .ss 12
ta T 8u*\w@n@u
if (0\\n[misc*verb]%32)/16 .in +\\n[Verbin]u
if 0\\n[misc*verb]%2 \{\
       eo
       nr @verbose-flag 1              \" tell pageheader to set ec/eo
\}
.
de VERBOFF
ec
br
if (0\\n[misc*verb]%8)/4 .SP \\n[Lsp]u
if (0\\n[misc*verb]%16)/8 .nm
if (0\\n[misc*verb]%32)/16 .in
ev
nr @verbose-flag 0
.
\" ######## module pict #################
nr pict*width 0
nr pict*height 0
nr pict*mode 0
nr pict*ind 0
nr pict*id 0 1
\" I assume that the number variable pict*id is the same
\" between two runs.
de PIC
br
nr pict*ind 0
nr pict*box 0
while \\n[.$]>0 \{\
       if '-B'\\$1' \{\
               nr pict*box 1
               shift
               continue
       \}
       if '-L'\\$1' \{\
               nr pict*mode 0
               shift
               continue
       \}
       if '-R'\\$1' \{\
               nr pict*mode 1
               shift
               continue
       \}
       if '-I'\\$1' \{\
               nr pict*ind (m;\\$2)
               nr pict*mode 2
               shift 2
               continue
       \}
       if '-C'\\$1' \{\
               nr pict*mode 3
               shift
               continue
       \}
       ds pict*f \\$1
       nr pict*id +1
       shift
       if \\n[.$]>0 \{\
               nr pict*width (i;\\$1)
               shift
       \}
       if \\n[.$]>0 \{\
               nr pict*height (i;\\$1)
               shift
       \}
\}
\" let mmroff know the filename and id
if \\n[Ref]>0 \{\
       tm .\\\\" PIC id \\n[pict*id]
       tm .\\\\" PIC file \\*[pict*f]
\}
\" these are defined by mmroff in the second pass
if d pict*file!\\n[pict*id] \{\
       ds pict*f \\*[pict*file!\\n[pict*id]]
       nr pict*llx \\n[pict*llx!\\n[pict*id]]
       nr pict*lly \\n[pict*lly!\\n[pict*id]]
       nr pict*urx \\n[pict*urx!\\n[pict*id]]
       nr pict*ury \\n[pict*ury!\\n[pict*id]]
       \"
       nr pict*w (p;\\n[pict*urx]-\\n[pict*llx])
       if \\n[pict*w]<0 .nr pict*w 0-\\n[pict*w]
       nr pict*h (p;\\n[pict*ury]-\\n[pict*lly])
       if \\n[pict*h]<0 .nr pict*h 0-\\n[pict*h]
       if \\n[pict*width]>0 \{\
               nr pict*rs (u;1000*\\n[pict*width]/\\n[pict*w])
               nr pict*w (u;\\n[pict*w]*\\n[pict*rs]/1000)
               nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000)
       \}
       if \\n[pict*height]>0 \{\
               nr pict*rs (u;1000*\\n[pict*height]/\\n[pict*h])
               nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000)
       \}
       if '0'\\n[pict*mode]' \{\
               nr pict*in \\n[.i]u
       \}
       if '1'\\n[pict*mode]' \{\
               nr pict*in (u;\\n[.l]-\\n[.i]-\\n[pict*w])
       \}
       if '2'\\n[pict*mode]' \{\
               nr pict*in \\n[pict*ind]u
       \}
       if '3'\\n[pict*mode]' \{\
               nr pict*in (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2)
       \}
       ds pict*h "
       if \\n[pict*h]>0 .ds pict*h \\n[pict*h]
       \"
       ne \\n[pict*h]u-1v
       \"
       \" these lines are copied and modified from tmac.pspic.
       \" Originally written by James Clark
       br
       ie \\n[pict*box]>0 \{\
\v'-1v'\h'\\n[pict*in]u'\
\Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\
\v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \
\\n[pict*llx] \\n[pict*lly] \
\\n[pict*urx] \\n[pict*ury] \
\\n[pict*w] \\n[pict*h]'
\}
       el \{\
\v'-1v'\h'\\n[pict*in]u'\
\X'ps: invis'\
\Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\
\X'ps: endinvis'\
\v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \
\\n[pict*llx] \\n[pict*lly] \
\\n[pict*urx] \\n[pict*ury] \
\\n[pict*w] \\n[pict*h]'
       \}
       br
       sp \\n[pict*h]u-1v
\}
.
\" external picture
\" -L   left adjust
de EPIC
if \\n[.$]<2 .@error "EPIC: Not enough arguments"
nr pict*adj 0           \" centered
if '\\$1'-L' \{\
       shift 1         \" left adjust
       nr pict*adj 1
\}
if \\n[nl]<0 \&
nr pict*w \\$1
nr pict*h \\$2
ds pict*name "External picture
if !''$3' .ds pict*name \\$3
ne \\n[pict*h]u
sp \\n[pict*h]u-1v
nr pict*ind 0
if !\\n[pict*adj] .nr pict*ind (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2)
mk
in +\\n[pict*ind]u
\D'l \\n[pict*w]u 0'\
\D'l 0 -\\n[pict*h]u'\
\D'l -\\n[pict*w]u 0'\
\D'l 0 \\n[pict*h]u'\
\v'-(u;\\n[pict*h]/2)'\
\h'(u;(\\n[pict*w]-\w'\\*[pict*name]'/2))'\\*[pict*name]
in
rt
sp 1v
.
\" ######## module acc #################
\"-----------
\" accents. These are copied from mgs, written by James Clark.
de acc@over-def
ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\
\h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2'
.
de acc@under-def
ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2'
.
acc@over-def ` \`
acc@over-def ' \'
acc@over-def ^ ^
acc@over-def ~ ~
acc@over-def : \(ad
acc@over-def ; \(ad
acc@under-def , \(ac
\" ######## module uni #################
\" unimplemented macros
de OK
'tm "OK: not implemented"
.
de PM
'tm "PM: not implemented"
.
\" ######## module hd #################
\" support for usermacro
nr hd*h1-page 1 \" last page-number for level 1 header.
nr hd*htype 0
ds hd*sect-pg
ds hd*mark
ds hd*suf-space
nr hd*need 0
aln ;0 hd*htype
als }0 hd*mark
als }2 hd*suf-space
aln ;3 hd*need
\"-------------
\" .hd@split varable index name val1 val2 ...
de hd@split
if \\$2>(\\n[.$]-3) .@error "\\$3 must have at least \\$2 values (\\*[\\$3]).
nr hd*sp-tmp \\$2+3
ds \\$1 \\$[\\n[hd*sp-tmp]]
.
de HU
H 0 "\\$1"
.
\"-------------
de H
if !r hd*cur-bline .nr hd*cur-bline \\n[nl]
br
df@print-float 2\"      $$$ could be wrong...
\" terminate all lists
LC
init@reset
nr hd*level 0\\$1
nr hd*arg1 0\\$1
if !\\n[hd*level] .nr hd*level \\n[Hu]
\"
\"      clear lower counters
nr hd*i 1 1
while \\n+[hd*i]<15 .if \\n[hd*level]<\\n[hd*i] .nr H\\n[hd*i] 0 1
\"
\" save last text for use in TP
if \\n[hd*level]=1 .ds H1txt \\$2\\$3
\"
\" This is a little fix to be able to get correct H1 heading number
\" in page headers. Special attention was needed when other formats are used.
ie !''\\g[H1]' \{\
       ds hd*format \\g[H1]
       af H1 0
       nr H1h \\n[H1] 1
       af H1 \\*[hd*format]
\}
el .nr H1h \\n[H1] 1
if \\n[hd*level]=1 .nr H1h +1
\"
\"      Check if it's time for new page. Only if text has
\"      appeared before.
if \\n[Ej]&(\\n[Ej]>=\\n[hd*level])&(\\n[nl]>\\n[hd*cur-bline]) .pg@next-page
\"
\" increment current counter
nr H\\n[hd*level] +1
\"
\" update pagenumber if section-page is used
if (\\n[hd*level]=1)&(\\n[Sectp]>0) .hd@set-page 1
\"
\" hd*mark is the text written to the left of the header.
ds hd*mark \\n[H1].
\"
if \\n[hd*level]>1 .as hd*mark \\n[H2]
\"
nr hd*i 2 1
while \\n+[hd*i]<15 .if \\n[hd*level]>(\\n[hd*i]-1) .as hd*mark .\\n[H\\n[hd*i]]
if \\n[Ht] .ds hd*mark \\n[H\\n[hd*level]].
\"
\" special case, no dot after level one heading if not H1dot true
if (\\n[hd*level]=1)&(\\n[H1dot]=0) .ds hd*mark \\n[H1]
\"
as hd*mark \ \ \"                       add spaces between mark and heading
if !\\n[hd*arg1] .ds hd*mark\"          no mark for unnumbered
\"
if \\n[D]>1 .tm At header \\*[hd*mark] "\\$2"
nr hd*htype 0                           \" hd*htype = check break and space
                                       \" 0 = run-in, 1 = break only, 2 = space
if \\n[hd*level]<=\\n[Hb] .nr hd*htype 1
if \\n[hd*level]<=\\n[Hs] .nr hd*htype 2
                                       \" two spaces if hd*htype == 0
ie (\\n[hd*htype]=0)&(\w@\\$2@) .ds hd*suf-space "  \"
el .ds hd*suf-space
nr hd*need 2v                           \" hd*need = header need space
\"---------- user macro HX ------------
\" User exit macro to override numbering.
\" May change hd*mark (}0), hd*suf-space (}2) and hd*need (;3)
\" Can also change Hps1/2.
if d HX .HX \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
\"--------------------------------------
\" pre-space
ie \\n[hd*level]<=\\n[Hps] .SP (u;\\n[Hps2])
el .SP (u;\\n[Hps1])
\"
par@reset-num \\n[hd*level]\"                   reset numbered paragraph
\" start diversion to measure size of header
di hd*div
\\*[hd*mark]\\$2\\$3\\*[hd*suf-space]
br
di
rm hd*div
if \\n[hd*htype] .na \"         no adjust if run-in
if \\n[hd*htype]<2 .nr hd*need +\\n[Lsp]u \"    add some extra space
ne \\n[hd*need]u+\\n[dn]u+.5p-1v \"     this is the needed space for a header
\"
\" size and font calculations
hd@split hd*font \\n[hd*level] HF \\*[HF]\"     get font for this level
ft \\*[hd*font]\"                       set new font
hd@split hd*new-ps \\n[hd*level] HP \\*[HP]\"   get point size
ie (\\*[hd*new-ps]=0):(\w@\\*[hd*new-ps]@=0) \{\
       if \\n[hd*htype] \{\
               if '\\*[hd*font]'3' \{\
                       ps -1
                       vs -1
               \}
               if '\\*[hd*font]'B' \{\
                       ps -1
                       vs -1
               \}
       \}
\}
el \{\
       ps \\*[hd*new-ps]
       vs \\*[hd*new-ps]+2
\}
\"
\"---------- user macro HY -------------
\"      user macro to reset indents
if d HY .HY \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
DEVTAG-NH \\n[hd*level]              \" HTML: mark beginning of heading
\"--------------------------------------
nr hd*mark-size \w@\\*[hd*mark]@
if (\\n[hd*level]<=\\n[Hc])&\\n[hd*htype] .ce\" center if level<=Hc
\"
\"      finally, output the header
\\*[hd*mark]\&\c
\"      and the rest of the header
ie \\n[hd*htype] \{\
\\$2\\$3
       br
\}
el \\$2\\$3\\*[hd*suf-space]\&\c
ft 1
\" restore pointsize and vertical size.
ps \\n[@ps]u
vs \\n[@vs]u
\"
\" table of contents
if (\\n[hd*level]<=\\n[Cl])&\w@\\$2@ .toc@entry \\n[hd*level] "\\$2"
\"      set adjust to previous value
SA
\"      do break or space
if \\n[hd*htype] .br
if \\n[hd*htype]>1 .SP (u;\\n[Lsp]*\\n[Hss])
if \\n[hd*htype] \{\
       \"      indent if Hi=1 and Pt=1
       if (\\n[Hi]=1)&(\\n[Pt]=1) .ti +\\n[Pi]n
       \"      indent size of mark if Hi=2
       if \\n[hd*htype]&(\\n[Hi]>1) .ti +\\n[hd*mark-size]u
\}
nr par@ind-flag 0                       \" no indent on .P if Pt=2
\"
\"      check if it is time to reset footnotes
if (\\n[hd*level]=1)&\\n[ft*clear-at-header] .nr ft*nr 0 1
\"
\"      check if it is time to reset indexes
if (\\n[hd*level]=1)&\\n[Sectf] \{\
       nr lix*fg-nr 0 1
       nr lix*tb-nr 0 1
       nr lix*ec-nr 0 1
       nr lix*ex-nr 0 1
\}
\"---------- user macro HZ ----------
if d HZ .HZ \\n[hd*level] \\n[hd*arg1] "\\$2\\$3"
nr hd*last-pos \\n[nl]
nr hd*last-hsize \\n[.k]
nr par@ind-flag 0
DEVTAG-EO-H  \" HTML: end of heading
.
\"--------
de HM
nr hd*i 0 1
while \\n+[hd*i]<15 .af H\\n[hd*i] \\$[\\n[hd*i]] 1
.
\"----------------------
\" set page-nr, called from header
\"
de hd@set-page
\"
ie \\n[.$]>0 .nr P \\$1
el .nr P +1
\" Set section-page-string
ds hd*sect-pg \\n[H1]-\\n[P]
if \\n[Sectp]>1 .if '\\n[H1]'0' .ds hd*sect-pg "
.
\"########### module pg ####################
\" set end of text trap
wh 0 pg@header
em pg@end-of-text
\"
ds pg*header ''- \\nP -''
ds pg*footer
if \n[N]=4 .ds pg*header ''''
if (\n[N]=3):(\n[N]=5) \{\
       ds pg*header ''''
       ds pg*footer ''\\*[hd*sect-pg]''
\}
ds pg*even-footer
ds pg*odd-footer
ds pg*even-header
ds pg*odd-header
\"
nr pg*top-margin 0
nr pg*foot-margin 0
nr pg*block-size 0
nr pg*footer-size 5v\"                   1v+footer+even/odd footer+2v
nr pg*header-size 7v\"                   3v+header+even/odd header+2v
nr pg*extra-footer-size 0
nr pg*extra-header-size 0
nr ft*note-size 0
nr pg*cur-column 0
nr pg*cols-per-page 1
nr pg*cur-po \n[@po]
nr pg*head-mark 0
\"
nr pg*ps \n[@ps]
nr pg*vs \n[@vs]
\"-------------------------
\" footer TRAPS: set, enable and disable
de pg@set-new-trap
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)
\"
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]
\"
\" last-pos points to the position of the footer and bottom
\" block below foot-notes.
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)
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]
.
de pg@enable-trap
\" Disable in HTML mode
if !'\*[.T]'html' \{\
wh \\n[pg*foot-trap]u pg@footer
if \\n[D]>2 .tm pg@enable-trap .t=\\n[.t] nl=\\n[nl]
if \\n[D]>2 .ptr
\}
.
de pg@disable-trap
ch pg@footer
.
\" move to new trap (if changed).
de pg@move-trap
pg@disable-trap
pg@set-new-trap
pg@enable-trap
.
de pg@enable-top-trap
\" set trap for pageheader.
nr pg*top-enabled 1
.
de pg@disable-top-trap
\" remove trap for pageheader.
nr pg*top-enabled 0
.
\" no header on the next page
de PGNH
nr pg*top-enabled (-1)
.
\" set first trap for pagefooter
pg@enable-top-trap
pg@set-new-trap
pg@enable-trap
\"-------------------------
\" stop output and begin on next page. Fix footnotes and all that.
de pg@next-page
\".debug next-page
ne 999i         \" activate trap
\" .pg@footer
.
\"-------------------------
\" support for PX, TP and EOP.
als }t pg*header
als }e pg*even-header
als }o pg*odd-header
als TPh pg*header
als TPeh pg*even-header
als TPoh pg*odd-header
\"
als EOPf pg*footer
als EOPef pg*even-footer
als EOPof pg*odd-footer
\"------------------------------------------------------------
\" HEADER
de pg@header
\" Disable in HTML mode
if !'\*[.T]'html' \{\
if \\n[D]>1 .tm Page# \\n[%] (\\n[.F]:\\n[c.])
\" check if Hy has been changed
ie \\n[Hy] 'hy 14
el 'nh
if \\n[Idxf] \{\
tl '<pagenr\ \\n[%]>'''
\}
\" assign current page-number to P
hd@set-page
\" reset spacing
nr line*lp\\n[.z] 0
nr line*ac\\n[.z] 0
\"
\" suppress pageheader if pagenumber == 1 and N == [124]
if \\n[pg*top-enabled] \{\
\"      must be fixed!!
\".     pg@disable-top-trap
       if \\n[pg*extra-header-size] 'sp \\n[pg*extra-header-size]u
       if \\n[pg*top-margin] 'sp \\n[pg*top-margin]u
       ev pg*tl-ev
       pg@set-env
       ie d let@header .let@header
       el \{\
               ie d TP .TP
               el \{\
'                       sp 3
                       ie ((\\n[%]=1)&((\\n[N]=1):(\\n[N]=2))) .sp
                       el .tl \\*[pg*header]
                       ie o .tl \\*[pg*odd-header]
                       el .tl \\*[pg*even-header]
'                       sp 2
               \}
       \}
       ev
       \" why no-space??
       if d PX \{\
               ns
               PX
               rs
       \}
       \" check for pending footnotes
       ft@check-old
       \"
       \" back to normal text processing
       pg@enable-trap
       \" mark for multicolumn
       nr pg*head-mark \\n[nl]u
       \" reset NCOL pointer at each new page.
       nr pg*last-ncol 0
       \" set multicolumn
       \"
       pg@set-po
       \" print floating displays
       df@print-float 4
       tbl@top-hook
       ns
\}
if \\n[pg*top-enabled]<0 .nr pg*top-enabled 1
nr hd*cur-bline \\n[nl] \" .H needs to know if output has occured
\}
.
\"---------------------------------------------------------
\" FOOTER
de pg@footer
ec
if \\n[D]>2 .tm Footer# \\n[%] (\\n[.F]:\\n[c.]) nl=\\n[nl]
pg@disable-trap
\".debug footer
tbl@bottom-hook
\" increment pageoffset for MC
\" move to the exact start of footer.
'sp |\\n[pg*foot-trap]u+1v
\"
if \\n[D]>3 .tm FOOTER after .sp, nl=\\n[nl]
\" print footnotes
if d ft*div .ft@print
\"
pg@inc-po
if !\\n[pg*cur-column] .pg@print-footer
\" next column
pg@set-po
pg@enable-trap
if \\n[@verbose-flag] .eo               \" to help VERBON/VERBOFF
.
\"-------------------------
de pg@print-footer
\" jump to the position just below the foot-notes.
'sp |\\n[pg*last-pos]u+1v
if \\n[D]>3 .tm print-footer nl=\\n[nl]
\" check if there are any bottom block
if d pg*block-div .pg@block
\"
\" print the footer and eject new page
ev pg*tl-ev
pg@set-env
\" user defined end-of-page macro
ie d EOP .EOP
el \{\
       ie o .tl \\*[pg*odd-footer]
       el .tl \\*[pg*even-footer]
       ie (\\n[%]=1)&(\\n[N]=1) .tl \\*[pg*header]
       el .tl \\*[pg*footer]
       tl ''\\*[Pg_type!\\n[@copy_type]]''
\}
ev
\" be sure that floating displays and footnotes will be
\" printed at the end of the document.
ie (\\n[df*fnr]>=\\n[df*o-fnr]):\\n[ft*exist] \{\
       ev ne
'       bp
       ev
\}
el 'bp
.
\"-------------------------
\"
\" Initialize the title environment
de pg@set-env
'na
'nh
'in 0
'ti 0
ie \\n[Pgps] \{\
       ps \\n[@ps]u
       vs \\n[@vs]u
\}
el \{\
       ps \\n[pg*ps]u
       vs \\n[pg*vs]u
\}
lt \\n[@ll]u
ll \\n[@ll]u
.
\"-------------------------
de PH
ds pg*header "\\$1
pg@set-new-size
.
de PF
ds pg*footer "\\$1
pg@set-new-size
.
de OH
ds pg*odd-header "\\$1
pg@set-new-size
.
de EH
ds pg*even-header "\\$1
pg@set-new-size
.
de OF
ds pg*odd-footer "\\$1
pg@set-new-size
.
de EF
ds pg*even-footer "\\$1
pg@set-new-size
.
de pg@clear-hd
ds pg*even-header
ds pg*odd-header
ds pg*header
.
de pg@clear-ft
ds pg*even-footer
ds pg*odd-footer
ds pg*footer
.
de pg@set-new-size
nr pg*ps \\n[@ps]
nr pg*vs \\n[@vs]
pg@move-trap
.
\"-------------------------
\" end of page processing
de pg@footnotes
\".debug footnotes
\" output footnotes. set trap for block
\"
.
\"-------------------------
\" print bottom block
de pg@block
ev pg*block-ev
'nf
'in 0
ll 100i
pg*block-div
br
ev
.
\"-------------------------
\" define bottom block
de BS
misc@ev-keep pg*block-ev
init@reset
br
di pg*block-div
.
\"-------------------------
de BE
br
di
nr pg*block-size \\n[dn]u
ev
pg@move-trap
.
\"-------------------------
\" print out all pending text
de pg@end-of-text
if \\n[D]>2 .tm ---------- End of text processing ----------------
df@eot-print
ref@eot-print
.
\"-------------------------
\" set top and bottom margins
\" -T   sets pg*footer-size and pg*header-size instead
de VM
ie '\\$1'-T' \{\
       shift
       if \\n[.$]=0 \{\
               nr pg*footer-size 5v
               nr pg*header-size 7v
       \}
       if \\n[.$]>0 .nr pg*header-size (v;\\$1)
       if \\n[.$]>1 .nr pg*footer-size (v;\\$2)
\}
el \{\
       if \\n[.$]=0 \{\
               nr pg*extra-footer-size 0
               nr pg*extra-header-size 0
       \}
       if \\n[.$]>0 .nr pg*extra-header-size (v;\\$1)
       if \\n[.$]>1 .nr pg*extra-footer-size (v;\\$2)
       if \\n[D]>2 \{\
               tm extra top \\n[pg*extra-footer-size]
               tm extra bottom \\n[pg*extra-header-size]
       \}
\}
pg@move-trap
.
\"---------------------
\" multicolumn output.
de pg@set-po
if \\n[pg*cols-per-page]>1 \{\
       ll \\n[pg*column-size]u
\}
.
de pg@inc-po
if \\n[pg*cols-per-page]>1 \{\
       ie \\n+[pg*cur-column]>=\\n[pg*cols-per-page] \{\
               nr pg*cur-column 0 1
               nr pg*cur-po \\n[@po]u
               po \\n[@po]u
               ll \\n[@ll]u
       \}
       el \{\
               nr pg*cur-po +(\\n[pg*column-size]u+\\n[pg*column-sep]u)
               po \\n[pg*cur-po]u
'               sp |\\n[pg*head-mark]u
               tbl@top-hook
       \}
\}
.
\" An argument disables the page-break.
de 1C
br
if \\n[pg*cols-per-page]<=1 .@error "1C: multicolumn mode not active"
nr pg*cols-per-page 1
nr pg*column-sep 0
nr pg*column-size \\n[@ll]
nr pg*ncol-i \\n[pg*cur-column]\"       temp variable
nr pg*cur-column 0 1
nr pg*cur-po \\n[@po]u
PGFORM
ie !'\\$1'1' .SK
el \{\
       if d ft*div \{\
               if \\n[pg*ncol-i]>0 \{\
                       @warning 1C: footnotes will be messy
               \}
       \}
       if \\n[pg*last-ncol]>0 \{\
               sp |\\n[pg*last-ncol]u
               nr pg*last-ncol 0
       \}
\}
.
de 2C
br
nr pg*head-mark \\n[nl]u
if \\n[pg*cols-per-page]>1 .@error "2C: multicolumn mode already active"
nr pg*cols-per-page 2
nr pg*column-sep \\n[@ll]/15
nr pg*column-size (\\n[@ll]u*7)/15
nr pg*cur-column 0 1
nr pg*cur-po \\n[@po]u
ll \\n[pg*column-size]u
\" .lt \\n[pg*column-size]u
.
\" MC column-size [ column-separation ]
de MC
br
nr pg*head-mark \\n[nl]u
if \\n[pg*cols-per-page]>1 .@error "MC: multicolumn mode already active"
ie ''\\$1' .nr pg*column-size \\n[.l]
el .nr pg*column-size (n;\\$1)
ie ''\\$2' .nr pg*column-sep \\n[pg*column-size]/15
el .nr pg*column-sep (n;\\$2)
\"
\" calculate the number of columns/page
nr pg*cols-per-page 0
nr pg*i \\n[pg*column-size]
while \\n[pg*i]<=\\n[.l] \{\
       nr pg*cols-per-page \\n[pg*cols-per-page]+1
       nr pg*i \\n[pg*i]+\\n[pg*column-sep]+\\n[pg*column-size]
\}
nr pg*cur-column 0 1
nr pg*cur-po \\n[@po]u
ll \\n[pg*column-size]u
\" .lt \\n[pg*column-size]u
.
\" begin a new column
de NCOL
br
if \\n[nl]>\\n[pg*last-ncol] .nr pg*last-ncol \\n[nl]
pg@footer
.
\" skip pages
de SK
br
bp
nr pg*i 0 1
\" force new page by writing something invisible.
while \\n+[pg*i]<=(0\\$1) \{\
\&
       bp
\}
.
\"-------------------------------
\" MULB width1 space1 width2 space2 width3 space3 ...
de MULB
br
nr pg*i 0 1
nr pg*mul-x 0 1
nr pg*mul-ind 0
nr pg*mul-last 0
while \\n[.$] \{\
       nr pg*mul!\\n+[pg*i] (n;0\\$1)
       nr pg*muls!\\n[pg*i] (n;0\\$2)
       shift 2
\}
nr pg*mul-max-col \\n[pg*i]
ds pg*mul-fam \\n[.fam]
nr pg*mul-font \\n[.f]
ev pg*mul-ev
ps \\n[@ps]u
vs \\n[@vs]u
fam \\*[pg*mul-fam]
ft \\n[pg*mul-font]
fi
hy 14
di pg*mul-div
MULN
.
\"-----------
de MULN
if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@error "MULN: Undefined columnwidth"
br
if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
rt +0
in \\n[pg*mul-ind]u
ll (u;\\n[.i]+\\n[pg*mul!\\n+[pg*mul-x]])u
nr pg*mul-ind +(u;\\n[pg*mul!\\n[pg*mul-x]]+\\n[pg*muls!\\n[pg*mul-x]])
.
\"-----------
\" MULE
de MULE
br
if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d]
di
ev
ne \\n[pg*mul-last]u
nf
mk
pg*mul-div
rt
sp \\n[pg*mul-last]u
fi
.
\"-----------
de OP
br
ie o .if !\\n[pg*head-mark]=\\n[nl] \{\
       bp +1
       bp +1
\}
el .bp
.
\"########### module footnotes ###################
nr ft*note-size 0
nr ft*busy 0
nr ft*nr 0 1
nr ft*wide 0
nr ft*hyphen 0\"        hyphenation value
nr ft*adjust 1\"        >0 if adjust true
nr ft*indent 1\"        >0 if text indent true (not imp. $$$)
nr ft*just 0\"  0=left justification, 1=right (not imp. $$$)
nr ft*exist 0\" not zero if there are any footnotes to be printed
nr ft*clear-at-header 0\" >0 if footnotes should be reset at first level head.
\"
ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m'
\"
\"-----------------
\" init footnote environment
de ft@init
\" indentcontrol not implemented $$$
\" label justification not implemented $$$
'in 0
'fi
ie \\n[ft*adjust] 'ad
el 'na
ie \\n[ft*hyphen] 'hy 14
el 'hy 0
ll \\n[@cur-ll]u
lt \\n[@cur-ll]u
ps (p;\\n[@ps]u-2)
vs (p;\\n[@vs]u-1)
.
\"-----------------
\" set footnote format
\" no support for two column processing (yet). $$$
de FD
if \\n[.$]=0 .@error "FD: bad arg \\$1"
ie \\n[.$]=2 .nr ft*clear-at-header 1
el .nr ft*clear-at-header 0
\"
if !'\\$1'' \{\
       ie \\$1>11 .nr ft*format 0
       el .nr ft*format \\$1
       \"
       nr ft*hyphen (\\n[ft*format]%2)*14
       nr ft*format \\n[ft*format]/2
       \"
       nr ft*adjust 1-(\\n[ft*format]%2)
       nr ft*format \\n[ft*format]/2
       \"
       nr ft*indent 1-(\\n[ft*format]%2)
       nr ft*format \\n[ft*format]/2
       \"
       nr ft*just \\n[ft*format]%2
\}
.
\"---------------
\" Footnote and display width control $$$
de WC
nr ft*i 0 1
while \\n+[ft*i]<=\\n[.$] \{\
       ds ft*x \\$[\\n[ft*i]]
       if '\\*[ft*x]'N' \{\
               nr ft*wide 0
               nr ft*first-fn 0
               nr ds*wide 0
               nr ds*float-break 1
       \}
       if '\\*[ft*x]'-WF' .nr ft*wide 0
       if '\\*[ft*x]'WF' .nr ft*wide 1
       if '\\*[ft*x]'-FF' .nr ft*first-fn 0
       if '\\*[ft*x]'FF' .nr ft*first-fn 1
       if '\\*[ft*x]'-WD' \{\
               nr ds*wide 0
               if r ft*df-save \{\
                       nr Df \\n[ft*df-save]
                       rm ft*df-save
               \}
       \}
       if '\\*[ft*x]'WD' \{\
               nr ds*wide 1
               nr ft*df-save \\n[Df]
               nr Df 4
       \}
       if '\\*[ft*x]'-FB' .nr ds*float-break 0
       if '\\*[ft*x]'FB' .nr ds*float-break 1
       if \\n[D]>1 .tm WC WF=\\n[ft*wide] WD=\\n[ds*wide]
\}
.
\"-----------------
\" begin footnote
\" Change environment, switch to diversion and print the foot-note mark.
de FS
if \\n[ft*busy] .@error "FS: missing FE"
nr ft*busy 1
ev ft*ev
ft@init
if !\\n[ft*wide] .pg@set-po
di ft*tmp-div
nr ft*space (u;\\n[Fs]*\\n[Lsp])
sp \\n[ft*space]u
\" print mark
ie \\n[.$] .ds ft*mark \\$1
el .ds ft*mark \\n[ft*nr].
\\*[ft*mark]
in +.75c
sp -1
nr ft*exist 1
.
\"-----------------
\" init footnote diversion
de ft@init-footnote
di ft*div
\l'20n'
br
di
nr ft*note-size \\n[dn]
.
\"-----------------
\" end footnote
\" End the diversion, back to previous environment, and adjust
\" the trap to the new foot-note size.
de FE
nr ft*busy 0
br
di
'in 0
'nf
if \\n[@pl]u<\\n[dn]u .@error "FE: too big footnote"
if !d ft*div .nr dn +1v
if \\n[D]>3 .tm FE: foot-trap=\\n[pg*foot-trap] .d=\\n[.d] dn=\\n[dn]
ie (\\n[pg*foot-trap]u-\\n[.d]u)<\\n[dn]u \{\
       da ft*next-div
       ft*tmp-div
       br
       di
\}
el \{\
       if !d ft*div .ft@init-footnote
       da ft*div
       ft*tmp-div
       di
       nr ft*note-size +\\n[dn]
\}
rm ft*tmp-div
ev
pg@move-trap
.
\"-----------------
\" print footnotes, see pg@footer
de ft@print
ev ft*print-ev
'nf
'in 0
ll 100i
ft*div
br
ev
rm ft*div
nr ft*note-size 0
pg@move-trap
.
\"-----------------
\" check if any pending footnotes, see pg@header
de ft@check-old
if d ft*next-div \{\
       ev ft*ev
       ft@init
       ft@init-footnote
       nf
       in 0
       da ft*div
       ft*next-div
       di
       nr ft*note-size +\\n[dn]
       rm ft*next-div
       ev
       nr ft*exist 0
       pg@move-trap
\}
.
\"########### module display ###################
nr ds*wide 0\"          >0 if wide displays wanted
nr df*fnr 0 1\" floating display counter
nr df*o-fnr 1\" floating display counter, already printed
nr ds*snr 0 1\" static display counter
nr ds*lvl 0 1\" display level
nr ds*float-busy 0\"    >0 if printing float
nr df*float 0           >0 if previous display was floating
\"--------------------------------------------
de DE
ie \\n[df*float] .df@end \\$@
el .ds@end \\$@
.
\"--------------------------------------------
\" floating display start
\" nested DF/DE is not allowed.
de DF
if \\n[df*float] .@error "DF:nested floating is not allowed. Use DS."
ds@set-format \\$@
\"
nr df*old-ll \\n[.l]
nr ds*ftmp \\n[.f]
misc@ev-keep df*ev
ft \\n[ds*ftmp]
\"
init@reset
di df*div
'in 0
\"
ds@set-new-ev \\n[df*old-ll]
SP \\n[Lsp]u
nr df*float 1
.
\"--------------------------------------------
de df@end
br
SP \\n[Lsp]u
di
nr df*width!\\n+[df*fnr] \\n[dl]
nr df*height!\\n[df*fnr] \\n[dn]
nr df*wide!\\n[df*fnr] \\n[ds*wide]
nr df*format!\\n[df*fnr] \\n[ds*format]
ev
if \\n[D]>2 .tm DF:fnr=\\n[df*fnr] w=\\n[dl] h=\\n[dn] wide=\\n[ds*wide] \
form=\\n[ds*format]
\"      move div to the floating display list
rn df*div df*fdiv!\\n[df*fnr]
\"
nr par@ind-flag 0
\" print float if queue is empty and the display fits into
\" the current page
if ((\\n[df*fnr]>=\\n[df*o-fnr])&(\\n[dn]<\\n[.t])) .df@print-float 1
nr df*float 0
.
\"-------------
\" called by end-of-text
de df@eot-print
br
if \\n[df*o-fnr]<=\\n[df*fnr] \{\
       if \\n[D]>2 .tm Print remaining displays.
\" still some floats left, make non-empty environment
       misc@ev-keep ne
       init@reset
\c
       df@print-float 3
       ev
\}
.
\"---------------
\" print according to Df and De.
\" .df@print-float type
\"      type    called from
\"      1       .DE
\"      2       end of section
\"      3       end of document
\"      4       beginning of new page
\"
de df@print-float
if \\n[Df]>5 .@error "Df=\\n[Df], max value is 5"
if !\\n[ds*float-busy] \{\
       nr ds*float-busy 1
\" at .DE
       if \\n[D]>3 .tm print-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
       \" Df = 1 or 5
       if (\\$1=1)&((\\n[Df]=1):(\\n[Df]=5)) \{\
               if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\
                       \" Print only new displays.
                       if \\n[df*o-fnr]=\\n[df*fnr] \{\
                               br
                               ds@print-one-float
                       \}
               \}
       \}
       \" Df = 3
       if (\\$1=1)&(\\n[Df]=3) \{\
               if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\
                       br
                       ds@print-one-float
               \}
       \}
\" print all if Df<2 and end of section
       if (\\$1=2)&(\\n[Sectp]>0)&(\\n[Df]<2) \{\
               br
               ds@print-all-floats
       \}
\" print all if end of document. Where should they go instead?
       if \\$1=3 \{\
               br
               ds@print-all-floats
\}
\" new page
       if (\\$1=4)&(\\n[Df]>1) \{\
               if \\n[Df]=2 .ds@print-one-float
               if \\n[Df]=3 .ds@print-one-float
               if \\n[Df]>3 \{\
                       ie \\n[De] .ds@print-all-floats
                       el .ds@print-this-page
               \}
       \}
       nr ds*float-busy 0
\}
.
\"---------------
\" DF out
\" print a floating diversion
de ds@output-float
nr df*old-ll \\n[.l]
nr df*old-in \\n[.i]
ev ds*fev
nf
nr df*i \\n[df*o-fnr]
nr df*f \\n[df*format!\\n[df*i]]
\"
in \\n[df*old-in]u
if \\n[df*f]=1 'in +\\n[Si]n
if \\n[df*f]>=2 'in 0
if \\n[df*f]=2 'ce 9999
if \\n[df*f]=3 'in (u;(\\n[.l]-\\n[df*width!\\n[df*i]])/2)
if \\n[df*f]=4 'rj 9999
if \\n[df*f]=5 'in (u;\\n[.l]-\\n[df*width!\\n[df*i]])
\"
\"
df*fdiv!\\n[df*o-fnr]
\"
if \\n[df*f]=2 'ce 0
if \\n[df*f]=4 'rj 0
ev
rm df*fdiv!\\n[df*i]
rm df*height!\\n[df*i]
rm df*format!\\n[df*i]
if \\n[df*wide!\\n[df*i]] .nr pg*head-mark \\n[nl]u
nr df*o-fnr +1
.
\"---------------
\" print one floating display if there is one.
de ds@print-one-float
if \\n[df*o-fnr]<=\\n[df*fnr] \{\
       if \\n[D]>3 .tm print-one-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
       if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .pg@next-page
       ds@output-float
       if \\n[De] .pg@next-page
\}
.
\"---------------
\" print all queued floats.
\" if De>0 do a page eject between the floats.
de ds@print-all-floats
while \\n[df*o-fnr]<=\\n[df*fnr] \{\
       if \\n[D]>3 .tm print-all-floats: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
       if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .pg@next-page
       br
\c
       ds@output-float
       if \\n[De] .pg@next-page
\}
.
\"---------------
\" print as many floats as will fit on the current page
de ds@print-this-page
while \\n[df*o-fnr]<=\\n[df*fnr] \{\
       if \\n[D]>3 .tm print-this-page: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]]
       if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .break
       ds@output-float
\}
.
\"---------------------------------------------------
\" get format of the display
de ds@set-format
ie \\n[.$] \{\
       ie r ds*format!\\$1 .nr ds*format \\n[ds*format!\\$1]
       el .@error "DS/DF:wrong format:\\$1"
\}
el .nr ds*format 0
if \\n[D]>2 .tm set format=\\n[ds*format]
\" fill or not to fill, that is the...
nr ds*fill 0
ie \\n[.$]>1 \{\
       ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2]
       el .@error "\\*[ds*type]:wrong fill:\\$2"
\}
if \\n[D]>2 .tm set fill=\\n[ds*fill]
nr ds*rindent 0
if \\n[.$]>2 .nr ds*rindent \\$3
if \\n[D]>2 .tm set indent=\\n[ds*rindent]
.
\"-----------------------------
\" .ds@set-new-ev previous-line-length
de ds@set-new-ev
ll \\$1u
lt \\$1u
if \\n[ds*rindent] \{\
       ll -\\n[ds*rindent]n
       lt -\\n[ds*rindent]n
\}
if \\n[ds*wide] \{\
       ll \\n[@ll]u
       lt \\n[@ll]u
\}
\"
ie \\n[ds*fill] 'fi
el 'nf
.
\"--------------------------------------------------------
nr ds*format 0\"        dummy value for .En/.EQ
nr ds*format! 0\"       no indent
nr ds*format!0 0\"      no indent
nr ds*format!L 0\"      no indent
nr ds*format!I 1\"      indent
nr ds*format!1 1\"      indent
nr ds*format!C 2\"      center each line
nr ds*format!2 2\"      center each line
nr ds*format!CB 3\"     center as block
nr ds*format!3 3\"      center as block
nr ds*format!R 4\"      right justify each line
nr ds*format!4 4\"      right justify each line
nr ds*format!RB 5\"     right justify as block
nr ds*format!5 5\"      right justify as block
\"---------------
nr ds*fill! 0\" no fill
nr ds*fill!N 0\"        no fill
nr ds*fill!0 0\"        no fill
nr ds*fill!F 1\"        fill on
nr ds*fill!1 1\"        fill on
\"--------------------------------------------
\" static display start
\" nested DS/DE is allowed. No limit on depth.
de DS
br
nr XXX \\n[nl]
nr ds*lvl +1
ds@set-format \\$@
\"
nr ds*old-ll \\n[.l]
nr ds*old-in \\n[.i]
misc@push ds-ll \\n[.l]
misc@push ds-form \\n[ds*format]
nr ds*i \\n[.i]
nr ds*ftmp \\n[.f]
misc@ev-keep ds*ev!\\n+[ds*snr]
ft \\n[ds*ftmp]
\"
init@reset
\" indent in a diversion doesn't seem like a good idea.
'in 0
di ds*div!\\n[ds*snr]
\"
ds@set-new-ev \\n[ds*old-ll]
nr df*float 0
.
\"--------------------------------------------
de ds@end
if \\n-[ds*lvl]<0 .@error "DE: no corresponding DS"
br
di
\" **********
nr ds*width \\n[dl]
nr ds*height \\n[dn]
misc@pop-nr ds-ll ds*old-ll
misc@pop-nr ds-form ds*format
\"
\" **********
'nf
\" calculate needed space
nr ds*need \\n[ds*height]
nr ds*i \\n[pg*foot-trap]-\\n[pg*header-size]u-\\n[pg*extra-header-size]u
if (\\n[ds*height]>\\n[ds*i])&(\\n[.t]<(\\n[ds*i]/2)) .nr ds*need \\n[.t]u+1v
if (\\n[ds*height]<\\n[ds*i])&(\\n[.t]<(\\n[ds*height])) .nr ds*need \\n[.t]u+1v
\"      Eject page if display will fit one page and
\"      there are less than half of the page left.
if \\n[ds*need] .ne \\n[ds*need]u
\"
\" check if pending equation label
eq@check \\n[ds*need]
'in \\n[ds*old-in]u
if \\n[ds*format]=1 'in \\n[ds*old-in]u+\\n[Si]n
if \\n[ds*format]>=2 'in 0
if \\n[ds*format]=2 'ce 9999
if \\n[ds*format]=3 'in (u;(\\n[.l]-\\n[ds*width])/2)
if \\n[ds*format]=4 'rj 9999
if \\n[ds*format]=5 'in (u;\\n[.l]-\\n[ds*width])
\" **********
\"
\"      Print static display
nr ds*i \\n[Lsp]
if r Dsp .nr ds*i \\n[Dsp]
\"
if \\n[Ds] .sp \\n[ds*i]u
ds*div!\\n[ds*snr]
if \\n[Ds] .sp \\n[ds*i]u
\"
if \\n[ds*format]=2 'ce 0
if \\n[ds*format]=4 'rj 0
rm ds*div!\\n[ds*snr]
nr ds*snr -1
nr par@ind-flag 0
ev
.
\"########### module list ###################
\" .LI text-indent mark-indent pad type [mark [LI-space [LB-space] ] ]
\"
nr li*tind 0
nr li*mind 0
nr li*pad 0
nr li*type 0
ds li*mark 0
nr li*li-spc 0
nr li*lvl 0 1
aln :g li*lvl
nr li*cur-vpos 0
\"--------------------------
\"      the major list-begin macro.
\"      If type == -1 a 'break' will occur.
de LB
if \\n[.$]<4 .@error "LB: not enough arguments, min 4"
misc@push cind \\n[.i]
misc@push tind \\n[li*tind]
misc@push mind \\n[li*mind]
misc@push pad \\n[li*pad]
misc@push type \\n[li*type]
misc@push li-spc \\n[li*li-spc]
ds li*mark-list!\\n[li*lvl] \\*[li*mark]
nr li*lvl +1
\"
nr li*tind (n;0\\$1)\"                  text-indent
nr li*mind (n;0\\$2)\"                  mark-indent
nr li*pad (n;0\\$3)\"                   pad
nr li*type 0\\$4\"                      type
ds li*mark \\$5\"                       mark
ie !'\\$6'' .nr li*li-spc \\$6\"        LI-space
el .nr li*li-spc 1
ie !'\\$7'' .nr li*lb-spc \\$7\"        LB-space
el .nr li*lb-spc 0
\" init listcounter
nr li*cnt!\\n[li*lvl] 0 1
\" assign format
af li*cnt!\\n[li*lvl] 1
if \\n[li*type] .if !'\\*[li*mark]'' .af li*cnt!\\n[li*lvl] \\*[li*mark]
\"
if \\n[li*lb-spc] .SP (u;\\n[li*lb-spc]*\\n[Lsp])
in +\\n[li*tind]u
.
\"---------------
de LI
if \\n[li*lvl]<1 .@error "LI:no lists active"
if \\n[li*li-spc]&(\\n[Ls]>=\\n[li*lvl]) .SP (u;\\n[li*li-spc]*\\n[Lsp])
ne 2v
\"
ds li*c-mark \\*[li*mark]
nr li*cnt!\\n[li*lvl] +1
if \\n[li*type]=1 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]].
if \\n[li*type]=2 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]])
if \\n[li*type]=3 .ds li*c-mark (\\n[li*cnt!\\n[li*lvl]])
if \\n[li*type]=4 .ds li*c-mark [\\n[li*cnt!\\n[li*lvl]]]
if \\n[li*type]=5 .ds li*c-mark <\\n[li*cnt!\\n[li*lvl]]>
if \\n[li*type]=6 .ds li*c-mark {\\n[li*cnt!\\n[li*lvl]]}
if \\n[.$]=1 .ds li*c-mark \\$1
ie \\n[.$]=2 \{\
       ie (\\$2=2):(\\n[Limsp]=0) .ds li*c-mark \\$1\\*[li*c-mark]
       el .ds li*c-mark \\$1\ \\*[li*c-mark]
\}
\"
\" determine where the text begins
nr li*text-begin \\n[li*tind]>?\w@\\*[li*c-mark]\ @
nr x \w@\\*[li*c-mark]\ @
\"
\" determine where the mark begin
ie !\\n[li*pad] .nr li*in \\n[li*mind]
el .nr li*in \\n[li*text-begin]-\\n[li*pad]-\w@\\*[li*c-mark]@
if !\\n[li*in] .nr li*in 0
\"
ti -\\n[li*tind]u
\" no indentation if hanging indent
if (\w@\\*[li*c-mark]@=0)&((\\n[.$]=0):(\w@\\$1@=0)) .nr li*text-begin 0
\Z'\&\h'\\n[li*in]u'\\*[li*c-mark]'\h'\\n[li*text-begin]u'\&\c
if \\n[li*type]=-1 .br
.
\"
\"-------------
de li@pop
nr li*lvl -1
misc@pop-nr cind li*tmp
in \\n[li*tmp]u
misc@pop-nr tind li*tind
misc@pop-nr mind li*mind
misc@pop-nr pad li*pad
misc@pop-nr type li*type
misc@pop-nr li-spc li*li-spc
ds li*mark \\*[li*mark-list!\\n[li*lvl]]
.
de LE
if \\n[li*lvl]<1 .@error "LE:mismatched"
li@pop
if '\\$1'1' .SP \\n[Lsp]u
.
\"-------------
\"      list status clear.
\"      terminate all lists to level i
de LC
ie \\n[.$]<1 .nr li*i 0
el .nr li*i \\$1
if \\n[li*i]>\\n[li*lvl] .@error "LC: incorrect argument: \\n[li*i] (too big)"
while \\n[li*lvl]>\\n[li*i] .li@pop
nr par@ind-flag 0
.
\"-------------
de AL
if \\n[.$]>3 .@error "AL: too many arguments"
if \\n[D]>2 .tm AL $*
ie \\n[.$]<=1 .LB \\n[Li] 0 2 1 "\\$1"
el \{\
       ie \\n[.$]=2 .LB 0\\$2 0 2 1 "\\$1"
       el \{\
               ie !'\\$2'' .LB \\$2 0 2 1 "\\$1" 0 1
               el .LB \\n[Li] 0 2 1 "\\$1" 0 1
       \}
\}
.
de ML
if \\n[.$]>3 .@error "ML: too many arguments"
if \\n[D]>2 .tm ML $*
nr li*ml-width \w@\\$1@u+1n
if \\n[.$]<2 .LB \\n[li*ml-width]u 0 1 0 "\\$1"
if \\n[.$]=2 .LB 0\\$2 0 1 0 "\\$1"
if \\n[.$]=3 \{\
       ie '\\$2'' .LB \\n[li*ml-width]u 0 1 0 "\\$1" 0 1
       el .LB \\n[Li] 0 1 0 "\\$1" 0 1
\}
.
de VL
if \\n[D]>2 .tm VL $*
if \\n[.$]>3 .@error "VL: too many arguments"
if \\n[.$]<1 .@error "VL: missing text-indent"
ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0
el .LB 0\\$1 0\\$2 0 0 \& 0 1
.
\"      Bullet (for .BL)
de BL
if \\n[D]>2 .tm BL $*
ds BU \s-2\(bu\s0
if \\n[.$]>2 .@error "BL: too many arguments"
if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \\*[BU]
if \\n[.$]=1 .LB 0\\$1 0 1 0 \\*[BU]
if \\n[.$]=2 \{\
       ie '\\$1'' .LB \\n[Pi] 0 1 0 \\*[BU] 0 1
       el .LB 0\\$1 0 1 0 \\*[BU] 0 1
\}
.
de DL
if \\n[D]>2 .tm DL $*
if \\n[.$]>2 .@error "DL: too many arguments"
if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \(em
if \\n[.$]=1 .LB 0\\$1 0 1 0 \(em
if \\n[.$]=2 \{\
       ie '\\$1'' .LB \\n[Pi] 0 1 0 \(em 0 1
       el .LB 0\\$1 0 1 0 \(em 0 1
\}
.
de RL
if \\n[D]>2 .tm RL $*
if \\n[.$]>2 .@error "RL: too many arguments"
if \\n[.$]<1 .LB 6 0 2 4
if \\n[.$]=1 .LB 0\\$1 0 2 4
if \\n[.$]=2 \{\
       ie '\\$1'' .LB 6 0 2 4 1 0 1
       el .LB 0\\$1 0 2 4 1 0 1
\}
.
\" Broken Variable List. As .VL but text begin on the next line
de BVL
if \\n[D]>2 .tm BVL $*
if \\n[.$]>3 .@error "BVL: too many arguments"
if \\n[.$]<1 .@error "BVL: missing text-indent"
ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 -1
el .LB 0\\$1 0\\$2 0 -1 \& 0 1
.
\" ####### module tbl #######################################
\" This module is copied from groff_ms and modified for mgm.
\" Yes, it does not resemble the original anymore :-).
\" Don't know if I missed something important.
\" Groff_ms is written by James Clark.
nr tbl*have-header 0
nr tbl*header-written 0
de TS
br
if ''\\n[.z]' .SP
if '\\$1'H' .di tbl*header-div
.
de tbl@top-hook
if \\n[tbl*have-header] \{\
       ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl@print-header
       el .sp \\n[.t]u
\}
.
de tbl@bottom-hook
if \\n[tbl*have-header] \{\
       nr T. 1
\" draw bottom and side lines of boxed tables.
       T#
\}
nr tbl*header-written 0
.
de tbl@print-header
ev tbl*ev
'nf
tbl*header-div
ev
mk #T
nr tbl*header-written 1
.
de TH
ie '\\n[.z]'tbl*header-div' \{\
       nr T. 0
       T#
       br
       di
       nr tbl*header-ht \\n[dn]
       ne \\n[dn]u+1v
       nr tbl*have-header 1
       ie '\\$1'N' .if !\\n[tbl*header-written] .tbl@print-header
       el .tbl@print-header
\}
el .@error ".TH without .TS H"
.
de TE
ie '\\n(.z'tbl*header-div' .@error ".TS H but no .TH before .TE"
el \{\
       nr tbl*have-header 0
\}
\" reset tabs
TAB
.
de T&
.
\" ####### module pic #######################################
de PS
nr pic*in 0
br
SP .5
ie \\n[.$]<2 .@error "PS: bad arguments. Probably not processed with pic."
el \{\
       if !\\n[ds*lvl] .ne (u;\\$1)+1v
\" should be contained between .DS/.DE
if r ds*format \{\
               if \\n[ds*lvl]&((\\n[ds*format]=2):(\\n[ds*format]=3)) \{\
                       nr pic*in \\n[.i]
\" .            in +(u;\\n[.l]-\\n[.i]-\\$2/2)
               \}
       \}
\}
.
de PE
init@reset
SP .5
.
\" ####### module eq #######################################
\"
nr eq*number 0 1
ds eq*label
de EQ
ds eq*label "\\$1
.
de eq@check
if !'\\*[eq*label]'' \{\
       mk
       \" space down to middle of equation
'       sp (u;\\$1/2)
       ie (\\n[Eq]%2) \{\
               \"      label to the left
\h'|0'\\*[eq*label]
       \}
       el \{\
               \"      label to the right
\h'|\\n[.l]u'\\*[eq*label]
       \}
       rt
\}
ds eq*label
.
de EN
.
\"########### module toc ###################
\" table of contents
nr toc*slevel 1
nr toc*spacing \n[Lsp]u
nr toc*tlevel 2
nr toc*tab 0
\"-----------
\" Table of contents with friends (module lix)
de TC
br
\" print any pending displays and references
df@print-float 3
if \\n[ref*flag] .RP 0 1
\"
if \w@\\$1@>0 .nr toc*slevel \\$1
if \w@\\$2@>0 .nr toc*spacing (u;\\$2*\\n[Lsp])
if \w@\\$3@>0 .nr toc*tlevel \\$3
if \w@\\$4@>0 .nr toc*tab \\$4
if \\n[pg*cols-per-page]>1 .1C
ds H1txt \\*[Licon]
ds Tcst co
pg@clear-hd
EF ""
OF ""
pg@next-page
\"-------------
if d Ci .toc@read-Ci \\*[Ci]
nf
in 0
ie \\n[Oc] .hd@set-page 1
el \{\
       nr toc*pn 1 1
       af toc*pn i
       aln ;g toc*pn
       PF "''\\\\\\\\n[toc*pn]''"
       am pg@header
               nr toc*pn +1
\\..
\}
nr toc*i 4 1
while \\n+[toc*i]<10 \{\
       if !'\\$\\n[toc*i]'' \{\
               ce
\\$\\n[toc*i]
               br
       \}
\}
if \\n[.$]<=4 .if d TX .TX
ie d TY .if \\n[.$]<=4 .TY
el \{\
       ce
\\*[Licon]
       br
       SP 3
\}
if d toc*list .toc*list
br
\" print LIST OF XXX
if d lix*dsfg .lix@print-ds fg FG "\\*[Lf]" \\n[.$]
if d lix*dstb .lix@print-ds tb TB "\\*[Lt]" \\n[.$]
if d lix*dsec .lix@print-ds ec EC "\\*[Le]" \\n[.$]
if d lix*dsex .lix@print-ds ex EX "\\*[Lx]" \\n[.$]
.
\"-----------
\" .toc@read-Ci lev1 lev2 lev3 lev4 ... lev7
de toc@read-Ci
nr toc*i 0 1
while \\n+[toc*i]<15 \{\
       nr toc*hl!\\n[toc*i] \\$[\\n[toc*i]]
\}
.
\"-----------
de toc@entry
ie \\n[Sectp] \{\
       toc@save \\$1 "\\*[hd*mark]" "\\$2" \\*[hd*sect-pg]
\}
el .toc@save \\$1 "\\*[hd*mark]" "\\$2" \\n[%]
.
als )E toc@entry
\"-----------
de toc@save
\" collect maxsize of mark if string Ci don't exist.
if !d Ci \{\
       if !r toc*hl!\\$1 .nr toc*hl!\\$1 0
       if \\n[toc*hl!\\$1]<=\w@\\$2@ \{\
               nr toc*hl!\\$1 \w@\\$2@u
       \}
\}
am toc*list
\" .toc@set level headernumber text pagenr
toc@set \\$1 "\\$2" "\\$3" \\$4
\\..
.
\"-----------
\" level mark text pagenumber
de toc@set
if \\$1<=\\n[toc*slevel] .SP \\n[toc*spacing]u
na
fi
nr toc*ind 0
nr toc*i 0 1
ie d Ci \{\
       nr toc*ind +\\n[toc*hl!\\$1]u
\}
el \{\
       while \\n+[toc*i]<\\$1 \{\
               nr toc*ind +\\n[toc*hl!\\n[toc*i]]u
       \}
\}
nr toc*text \\n[toc*ind]u+\\n[toc*hl!\\$1]u
in \\n[toc*text]u
ti -\\n[toc*hl!\\$1]u
\"
\" length of headernum space
nr toc*i \\n[toc*hl!\\$1]-\w@\\$2@
\"
ll \\n[@ll]u-\w@\\$4@u-2m
ne 2v
\" ragged right ---------------------------------
ie \\$1>\\n[toc*tlevel] \{\
\\$2
       sp -1
\\$3\ \ \ \\$4
       br
\}
el \{\
       \" unnumbered heading --------------------
       ie '\\$2'' \{\
               in \\n[toc*ind]u
\\$3\h'1m'
       \}
       \" normal heading ------------------------
       el \{\
\\$2
               sp -1
\\$3\h'1m'
       \}
       ll \\n[@ll]u
       sp -1
       nr toc*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$4@)-1m
\h'|\\n[.n]u'\l'\\n[toc*sep]u.'\h'1m'\\$4
\}
ll \\n[@ll]u
.
\"########################### module lix ############################
\" LIST OF figures, tables, exhibits and equations
nr lix*fg-nr 0 1
nr lix*tb-nr 0 1
nr lix*ec-nr 0 1
nr lix*ex-nr 0 1
aln Fg lix*fg-nr
aln Tb lix*tb-nr
aln Ec lix*ec-nr
aln Ex lix*ex-nr
\"------------
de FG
lix@print-line fg Lf \\n+[lix*fg-nr] "\\$1" "\\$2" "\\$3" "\\$4"
.
de TB
lix@print-line tb Lt \\n+[lix*tb-nr] "\\$1" "\\$2" "\\$3" "\\$4"
.
de EC
lix@print-line ec Le \\n+[lix*ec-nr] "\\$1" "\\$2" "\\$3" "\\$4"
.
de EX
lix@print-line ex Lx \\n+[lix*ex-nr] "\\$1" "\\$2" "\\$3" "\\$4"
.
\"------------
\" print line with 'figure' in the text
\" type stringvar number text override flag refname
de lix@print-line
ds lix*text "\\$4
\"
ie \\n[Sectf] .ds lix*numb \\n[H1]-\\$3
el .ds lix*numb \\$3
\"
ie !\\n[Of] .ds lix*ds-form .\ \ \"
el .ds lix*ds-form "\ \(em\ \"
nr lix*in \\n[.i]
ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\*[lix*ds-form]
if !'\\$5'' \{\
       if !0\\$6 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*numb]\\*[lix*ds-form]
       if 0\\$6=1 .ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\$5\\*[lix*ds-form]
       if 0\\$6=2 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*ds-form]
\}
\" print line if not between DS/DE
ie \\n[ds*lvl]<1&\\n[df*float]=0 \{\
       lix@print-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7
\}
el \{\
       lix@embedded-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7
\}
\"
.
\"-----------
\" label text type stringvar refname
de lix@print-text
ie \\n[Sectp] .ds lix*pgnr \\*[hd*sect-pg]
el .ds lix*pgnr \\n[%]
SP \\n[Lsp]u
misc@ev-keep lix
init@reset
br
ie (\w@\\$1\\$2@)>(\\n[.l]-\\n[.i]) \{\
       in +\w@\\$1@u
       ti 0
\}
el .ce 1
\fB\\$1\fP\\$2
br
ev
\" save line for LIST OF XXX, wth is the width of the label
if !r lix*wth\\$3 .nr lix*wth\\$3 0
\" find the maximum width
if \w@\\*[lix*label]@>\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@
if \\n[\\$4] .lix@ds-save \\$3 \\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]"
\" save reference to the figure
if !'\\$5'' .SETR \\$5 \\*[lix*numb]
.
\" hide printout until diversion is evaluated
de lix@embedded-text
\!.ie \\\\n[Sectp] .ds lix*pgnr \\\\*[hd*sect-pg]
\!.el .ds lix*pgnr \\\\n[%]
\!.SP \\\\n[Lsp]u
\!.misc@ev-keep lix
\!.ll \\n[.l]u
\!.init@reset
\!.fi
\!.ie (\w@\\$1\\$2@)>(\\\\n[.l]-\\\\n[.i]) \{\
       in +\w@\\$1@u
\!.     ti 0
\!\fB\\$1\fP\\$2
\!.\}
\!.el \{\
       ce 1
\!\fB\\$1\fP\\$2
\!.\}
\!.br
\!.ev
\" save line for LIST OF XXX, wth is the width of the label
\!.if !r lix*wth\\$3 .nr lix*wth\\$3 0
\" find the maximum width
\!.if \w@\\*[lix*label]@>\\\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@
\!.if \\\\n[\\$4] .lix@ds-save \\$3 \\\\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]"
\" save reference to the figure
\!.if !'\\$5'' .SETR \\$5 \\*[lix*numb]
.
\"------------
\" print complete list of XXXX
de lix@print-ds
\" arg: fg,tb,ec,ex text
ds H1txt \\$3
ds Tcst \\$1
if !\\n[Cp] .pg@next-page
\" print LIST OF XXXX
\" execute user-defined macros
if \\$4<=4 .if d TX\\$2 .TX\\$2
ie d TY\\$2 .if \\$4<=4 .TY\\$2
el \{\
       ce
\\$3
       SP 3
\}
in \\n[lix*wth\\$1]u
fi
lix*ds\\$1
.
\"------------
\" save line of list in macro
de lix@ds-save
\" type pagenumber text
am lix*ds\\$1
lix@dsln \\$1 \\$2 "\\$3" "\\$4" \\$5
\\..
.
\"------------
\" print appended macro
\" lix@dsln type pagenumber text headernr
de lix@dsln
nr lix*i \\n[lix*wth\\$1]-\w@\\$4@
ne 4v
ll \\n[@ll]u-\w@\\$4@u-\w@\\$2@u-2m
ti -\\n[lix*wth\\$1]u
\\$4
sp -1
\\$3\h'1m'
sp -1
ll
nr lix*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$2@)-1m
\h'|\\n[.n]u'\l'\\n[lix*sep]u.'\h'1m'\\$2
SP \\n[toc*spacing]u
.
\"########################### module fnt ############################
\" some font macros.
de R
ft R
ul 0
.
\"-----------
de fnt@switch
ul 0
ds fnt*tmp
nr fnt*prev \\n[.f]
nr fnt*i 2 1
while \\n+[fnt*i]<=\\n[.$] \{\
       if \\n[fnt*i]>3 .as fnt*tmp \,
       ie (\\n[fnt*i]%2)=1 .as fnt*tmp \\$1\\$[\\n[fnt*i]]
       el .as fnt*tmp \\$2\\$[\\n[fnt*i]]
       if \\n[fnt*i]<\\n[.$] .as fnt*tmp \/
\}
\&\\*[fnt*tmp]\f[\\n[fnt*prev]]
.
\"-----------
de B
ie \\n[.$] .fnt@switch \fB \f[\\n[.f]] \\$@
el .ft B
.
de I
ie \\n[.$] .fnt@switch \fI \f[\\n[.f]] \\$@
el .ft I
.
de IB
if \\n[.$] .fnt@switch \fI \fB \\$@
.
de BI
if \\n[.$] .fnt@switch \fB \fI \\$@
.
de IR
if \\n[.$] .fnt@switch \fI \fR \\$@
.
de RI
if \\n[.$] .fnt@switch \fR \fI \\$@
.
de RB
if \\n[.$] .fnt@switch \fR \fB \\$@
.
de BR
if \\n[.$] .fnt@switch \fB \fR \\$@
.
\"########################### module box ############################
\" draw a box around some text. Text will be kept on the same page.
\"
nr box*ll 0
\" .B1 and .B2 works like .DS
de B1
if \\n[box*ll] .@error "B1: missing B2"
nr box*ll \\n[.l]
nr box*ind \\n[.i]
nr box*hyp \\n[.hy]
nr box*wid \\n[.l]-\\n[.i]
\"
\" jump to new environment.
ev box*ev
di box*div
ps \\n[@ps]u
vs \\n[@vs]u
in 1n
ll (u;\\n[box*wid]-1n)
hy \\n[.hy]
.
de B2
if !\\n[box*ll] .@error "B2: missing B1"
br
di
nr box*height \\n[dn]
ne \\n[dn]u+1v
ll \\n[box*ll]u
in \\n[box*ind]u
nr box*y-pos \\n[.d]u
nf
box*div
fi
\v'-1v+.25m'\
\D'l \\n[box*wid]u 0'\
\D'l 0 -\\n[box*height]u'\
\D'l -\\n[box*wid]u 0'\
\D'l 0 \\n[box*height]u'
br
sp -1
ev
sp .20v
in \\n[box*ind]u
ll \\n[box*ll]u
rm box*div
nr box*ll 0
.
\"########################### module ref ############################
nr ref*nr 0 1
aln :R ref*nr
nr ref*nr-width 5n
nr ref*flag 0           \" for end-of-text
ds Rf \v'-.4m'\s-3[\\n+[ref*nr]]\s0\v'.4m'
\"
\" start reference
\"------------
de RS
if !''\\$1' .ds \\$1 \v'-.4m'\s-3[\\n[ref*nr]]\s0\v'.4m'
nr ref*flag 1
am ref*mac
ref@start-print \\n[ref*nr]
\\..
eo
am ref*mac RF
.
\"------------
de RF
ec
am ref*mac
ref@stop-print
\\..
.
\"------------
de ref@start-print
di ref*div
in \\n[ref*nr-width]u
ti -(\w@\\$1.@u+1n)
\\$1.
sp -1
.
de ref@stop-print
br
di
ne \\n[dn]u
ev ref*ev2
nf
ref*div
ev
rm ref*div
if \\n[Ls] .SP \\n[Lsp]u
.
\"-----------
de RP
if !d ref*mac .@error "RP: No references!"
nr ref*i 0\\$2
if \\n[ref*i]<2 .SK
SP 2
ref@print-refs
if 0\\$1<1 .nr ref*nr 0 1
if ((\\n[ref*i]=0):(\\n[ref*i]=2)) .SK
.
\"-----------
\" called by end-of-text!
de ref@eot-print
\".if \\n[ref*flag] \{
if d ref*mac \{\
       if \\n[D]>2 .tm Print references, called by eot
       nr ref*flag 0
       br
       misc@ev-keep ne
       init@reset
\c
'       bp
       ev
       ref@print-refs
\}
.
\"-----------
\" prints the references
de ref@print-refs
toc@save 1 "" "\\*[Rp]" \\n[%]
ce
\fI\\*[Rp]\fP
sp
nr ref*ll \\n[.l]
misc@ev-keep ref*ev
ll \\n[ref*ll]u
in 0
ref*mac
in
rm ref*mac
ev
nr ref*flag 0 1
.
\"########################### module app ############################
\"
nr app*nr 0 1
af app*nr A
nr app*dnr 0 1
nr app*flag 0
\"------------
\" .APP name text
\" name == "" -> autonumber
de APP
\" .if \\n[.$]<2 .@error "APP: too few arguments"
app@set-ind "\\$1"
\"
ds Tcst ap
ds Apptxt \\$2
\"
ie \\n[Aph] .app@header \\*[app*ind] "\\$2"
el .bp
app@index "\\*[app*ind]" "\\$2"
.
\"------------
\" .APPSK name pages text
\" name == "" -> autonumber
de APPSK
if \\n[.$]<2 .@error "APPSK: too few arguments"
app@set-ind "\\$1"
\"
ds Tcst ap
ds Apptxt \\$3
\"
ie \\n[Aph] .app@header \\*[app*ind] "\\$3"
el .bp
app@index "\\*[app*ind]" "\\$3"
pn +\\$2
.
\"------------
de app@set-ind
ie \w@\\$1@ .ds app*ind \\$1
el \{\
       if !\\n[app*flag] \{\
               nr H1 0 1
               af H1 A
               af H1h A
               nr app*flag 1
       \}
       ds app*ind \\n+[app*nr]
       nr H1 \\n+[app*dnr]
       nr H1h \\n[app*dnr]
\}
\"      clear lower counters
nr app*i 1 1
while \\n+[app*i]<15 .nr H\\n[app*i] 0 1
.
\"------------
de app@index
toc@save 1 "" "\\*[App] \\$1: \\$2" \\n[%]
.
\"------------
\" app@heaer name text
de app@header
bp
SP (u;\\n[Lsp]*4)
ce 1
\s+4\fB\\*[App]\ \\$1\fP\s0
SP (u;\\n[Lsp]*2)
if \w@\\$2@<\\n[.l] .ce 1
\fB\s+2\\$2\s0\fP
SP (u;\\n[Lsp]*4)
.
als APPX app@header
\"########################### module cov ############################
\" title stored in diversion cov*title
\" abstract stored in diversion cov*abstract
\"      arg to abstract stored in cov*abs-arg
\"      indent stored in cov*abs-ind
\" number of authors stored in cov*au
\" author(s) stored in cov*au!x!y
\" author(s) title stored in cov*at!x!y
\"      x is the author-index [1-cov*au], y is the argument-index [1-9].
\" author(s) firm stored in cov*firm
\" new date (if .ND exists) is stored in cov*new-date
\"
\"
ds cov*abs-name ABSTRACT
\"
nr cov*au 0
de TL
rm IA IE WA WE LO LT
if \\n[.$]>0 .ds cov*title-charge-case \\$1
if \\n[.$]>1 .ds cov*title-file-case \\$2
pg@disable-top-trap
eo
de cov*title AU
.
\"-------------------
de cov@title-end
ec
.
\"-------------------
\" .AU name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]]
de AU
cov@title-end
pg@disable-top-trap
nr cov*au +1
nr cov*i 0 1
ds cov*au!\\n[cov*au]!1
while \\n[.$]>=\\n+[cov*i] \{\
       ds cov*au!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
\}
if (\\n[.$]>=3)&(\w@\\$3@) \{\
       if d cov*location-\\$3] \{\
               ds cov*au!3!\\n[cov*au] \\*[cov*location-\\$3]
       \}
\}
.
\"-------------------
\" .AT title1 [title2 [... [title9] ]]]]
\" Well, thats all that COVEND look for.
\" Must appear directly after .AU
de AT
if \\n[.$]<1 .@error "AT: no arguments"
nr cov*i 0 1
while \\n[.$]>=\\n+[cov*i] \{\
       ds cov*at!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]]
\}
.
\"-------------------
de AF
cov@title-end
if !''\\$1' .ds cov*firm \\$1
.
de AST
ds cov*abs-name \\$1
.
de AS
pg@disable-top-trap
if d cov*abstract .@error "AS: only one abstract allowed"
if !''\\n[.z]' .@error "AS: no diversion allowed (previous .AS?)"
nr cov*abs-arg 0\\$1
nr cov*abs-ind (n;0\\$2)
de cov*abstract AE
.
de AE
.
\" fixed for 2000, now uses \n[year].
de ISODATE
       \" support for ISO-date
       nr cov*mm \\n[mo]
       nr cov*dd \\n[dy]
       af cov*mm 01
       af cov*dd 01
       ie '0'\\$1' \{\
               ds cov*new-date \\*[MO\\n[mo]] \\n[dy], \\n[year]
       \}
       el \{\
               ds cov*new-date \\n[year]-\\n[cov*mm]-\\n[cov*dd]
       \}
.
ISODATE 0
als DT cov*new-date
de ND
ds cov*new-date \\$1
.
\" switch to ISO-date if register Iso exist: YYYY-MM-DD
if r Iso .ISODATE 1
\"-------------------
\" save technical numbers.
de TM
nr cov*i 0 1
while \\n[.$]>=\\n+[cov*i] .ds cov*mt-tm!\\n[cov*i] \\$[\\n[cov*i]]
nr cov*mt-tm-max \\n[.$]
.
\"-----------------------
\" cover sheet
\" the file must have the following last lines (somewhere):
\" .pg@enable-top-trap
\" .bp 1
\" .pg@enable-trap
ds cov*mt-file!0 0.MT
ds cov*mt-file!1 0.MT
ds cov*mt-file!2 0.MT
ds cov*mt-file!3 0.MT
ds cov*mt-file!4 4.MT
ds cov*mt-file!5 5.MT
ds cov*mt-file!6 0.MT
\"------------
de MT
ie \\n[.$] \{\
       ie d cov*mt-file!\\$1 .ds cov*mt-type \\$1
       el .ds cov*mt-type 6
\}
el .ds cov*mt-type 1
ds cov*mt-addresse "\\$2
ds cov*mt-type-text "\\$1
ie d @language .ds cov*str mm/\\*[@language]_
el .ds cov*str mm/
mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]]
.
de COVER
ie !\\n[.$] .ds cov*cov-type ms
el .ds cov*cov-type \\$1
pg@disable-top-trap
ie d @language .ds cov*str mm/\\*[@language]_\\*[cov*cov-type].cov
el .ds cov*str mm/\\*[cov*cov-type].cov
mso \\*[cov*str]
.
\"########################### module qrf ############################
\" forward and backward reference thru special files.
\"
\" check if stderr-method is wanted
\" This was needed when I discovered that groff was considered unsafe
\" and groff -U didn't work. It's a workaround like the original
\" index method, but not in my view elegant enough.
\"
\" init reference system
de INITR
ds qrf*file \\$1.qrf
nr qrf*pass 2
if \\n[D]>1 .tm INITR: source \\*[qrf*file]
ie \\n[Ref] \{\
       tm .\\\\" Rfilename: \\*[qrf*file]
\}
el 'so  \\*[qrf*file]
.
\"---------------
\" set a reference.
de SETR
if \\n[.$]<1 .@error "SETR:reference name missing"
if !r qrf*pass .tm "SETR: No .INITR in this file"
if \\n[Ref] \{\
       ds qrf*name qrf*ref-\\$1
       if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd*mark],\\n[%]
       \" heading-number
       ds \\*[qrf*name]-hn \\*[hd*mark]
       \" page-number
       ds \\*[qrf*name]-pn \\n[%]
       \"
       if \\n[Ref] \{\
               tm .ds \\*[qrf*name]-hn \\*[hd*mark]
               tm .ds \\*[qrf*name]-pn \\n[%]
               if !'\\$2'' .tm .ds \\*[qrf*name]-xx \\$2
       \}
\}
.
\"---------------
\" get misc-string
\" If two arg -> set var. arg to misc-string.
de GETST
if \\n[.$]<1 .@error "GETST:reference name missing"
if !r qrf*pass .tm "GETST: No .INITR in this file"
ds qrf*name qrf*ref-\\$1
       if d \\*[qrf*name]-xx \{\
               ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-xx]
               el \\*[\\*[qrf*name]-xx]\c
       \}
\}
.
\"---------------
\" get header-number
\" If two arg -> set var. arg to header-number.
de GETHN
if \\n[.$]<1 .@error "GETHN:reference name missing"
if !r qrf*pass .tm "GETHN: No .INITR in this file"
ds qrf*name qrf*ref-\\$1
if d \\*[qrf*name]-hn \{\
       ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-hn]
       el \\*[\\*[qrf*name]-hn]\c
\}
.
\"---------------
\" get page-number
\" If two arg -> set var. arg to page-number.
de GETPN
if \\n[.$]<1 .@error "GETPN:reference name missing"
if !r qrf*pass .tm "GETPN: No .INITR in this file"
ds qrf*name qrf*ref-\\$1
if d \\*[qrf*name]-pn \{\
       ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-pn]
       el \\*[\\*[qrf*name]-pn]\c
\}
.
\"----------
de GETR
if \\n[.$]<1 .@error "GETR:reference name missing"
ie !r qrf*pass \{\
       tm "GETR: No .INITR in this file"
\}
el \{\
       GETHN \\$1 Qrfh
       GETPN \\$1 Qrfp
\\*[Qrf]
\}
.
\"########################### module ind ############################
\" Support for mgs-style indexing, borrowed from mgs.
de IX
       tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[%]
.
\"--------------------
\" Another type of index system
\" INITI type filename [macro]
de INITI
if \\n[.$]<1 .@error "INITI:type missing"
\" ignore if INITI has already been used
if \\n[.$]>1 \{\
       if d ind*file .@error "INITI:file already set"
       ds ind*file \\$2.ind
       if \\n[D]>1 .tm INITI: source \\*[ind*file]
\}
if !d ind*file .@error "INITI:file not specified"
ds ind*type \\$1
if \\n[Ref] \{\
       if \\n[.$]>2 .tm .\\\\" Imacro: \\$3
\}
.
\"---------------
de IND
if !d ind*file .@error "IND: No active INITI"
if \\n[D]>1 .tm IND: type=\\*[ind*type]
ds ind*ref
if '\\*[ind*type]'N' .ds ind*ref \\n[%]
if '\\*[ind*type]'H' .ds ind*ref \\*[hd*mark]
if '\\*[ind*type]'B' .ds ind*ref \\*[hd*mark]\t\\n[%]
if '\\*[ind*ref]'' .@error "IND:wrong index type: \\*[ind*ref]"
\"
ds ind*line \\$1
while \\n[.$]>0 \{\
       shift
       as ind*line \t\\$1
\}
as ind*line \\*[ind*ref]
if \\n[Ref] .tm .\\\\" IND \\*[ind*line]
.
\" print index
de INDP
ie \\n[Ref] .tm .\\\\" Index: \\*[ind*file]
el \{\
       if !\\n[Cp] .pg@next-page
       \" print INDEX
       \" execute user-defined macros
       if d TXIND .TXIND
       ie d TYIND .TYIND
       el \{\
               SK
               ce
\\*[Index]
               SP 3
               2C
               nf
       \}
'       so  \\*[ind*file]
       ie d TZIND .TZIND
       el \{\
               fi
               1C
       \}
\}
rm ind*file
.
\"########################### module let ############################
\" Letter macros
\"------------------------
\" Formal closing
de FC
df@print-float 3
ie \\n[.$] .ds let*i \\$1
el .ds let*i \\*[Letfc]
ie d let*type .let@fc_\\*[let*type] "\\*[let*i]" \\$@
el .let@mt-closing "\\*[let*i]" \\$@
.
\"-------
de let@mt-closing
ne 5v
in (u;\\n[.l]/2)
sp
\\$1
in
.
\"------------------------
\" Signature line
de SG
ie d let*type .let*lt-sign \\$@
el .let*mt-sign \\$@
.
\"------------------------
de let*lt-sign
if !d let@sg_\\*[let*type] .@error "SG: letter type \\*[let*type] undefined"
df@print-float 3
nr let*i 0 1
nr let*j 0
while \\n+[let*i]<=\\n[let*wa-n] \{\
if \\n[let*i]=\\n[let*wa-n] .nr let*j 1
let@sg_\\*[let*type] "\\*[let*wa-name!\\n[let*i]]" "\\*[let*wa-title!\\n[let*i]]" \\n[let*i] \\n[let*j] \\$@
\}
.
\"------------------------
\" Memorandum signature
de let*mt-sign
df@print-float 3
ne \\n[cov*au]u*4v
ie \\n[.$]>1 .nr let*k 1
el .nr let*k \\n[cov*au]
ds let*tmp \\*[cov*au!\\n[let*k]!3]-\\*[cov*au!\\n[let*k]!4]-
nr let*i 0 1
while \\n+[let*i]<=\\n[cov*au] \{\
       if \\n[let*i]>1 .as let*tmp /
       as let*tmp \\*[cov*au!\\n[let*k]!2]
\}
if !''\\$1' .as let*tmp -\\$1
in (u;\\n[.l]/2)
nf
nr let*i 0 1
while \\n+[let*i]<=\\n[cov*au] \{\
       SP 3v
       if \\n[let*i]=\\n[let*k] \{\
\Z'\h'-(u;\\n[.l]/2)'\\*[let*tmp]'\c
       \}
\\*[cov*au!\\n[let*i]!1]
\}
fi
in
.
\"------------------------
\" Approval signature
de AV
ne 6v
nf
sp
ie \\n[.$]<2 \\*[Letapp]
el .sp
sp 2
ie n ______________________________      ______________
el \D'l 25m 0'\h'4m'\D'l 12m 0'
\Z'\\$1'\h'29m'\f[\\*[@sdf_font]]\\*[Letdate]\fP
fi
.
\"------------------------
\" Letter signature
de AVL
ne 6v
nf
sp 3
ie n ______________________________
el \D'l 25m 0'
\Z'\\$1'
fi
.
\"------------------------
\" Letter type
\" let@header is called from the header. It is supposed
\" to remove the alias itself.
de LT
rm AF AS AE AT AU CS OK TL MT
ds let*type BL
nr Pi 5
nr Pt 0
if !''\\$1' .ds let*type \\$1
if !d let@head_\\*[let*type] .@error "LT: unknown letter type \\$1"
shift
als let@header let@head_\\*[let*type]
let@init_\\*[let*type] \\$@
if \n[D]>1 .tm Letter type \\*[let*type]
.
\"-----------
\" Blocked letter
de let@init_BL
.
de let@head_BL
rm let@header
let@print-head 1
.
de let@sg_BL
ne 5v
nf
in (u;\\n[.l]/2)
sp 3v
\\$1
\\$2
in
if \\$4 .sp
if \w'\\$5'&\\$4 \\$5
fi
.
als let@fc_BL let@mt-closing
\"-----------
\" Semiblocked letter
de let@init_SB
nr Pt 1
.
de let@head_SB
rm let@header
let@print-head 1
.
als let@sg_SB let@sg_BL
als let@fc_SB let@mt-closing
\"-----------
\" Full-blocked letter
de let@init_FB
.
de let@head_FB
rm let@header
let@print-head
.
de let@sg_FB
ne 5v
nf
sp 3v
\\$1
\\$2
if \\$4 .sp
if \w'\\$5'&\\$4 \\$5
fi
.
de let@fc_FB
ne 5v
sp
\\$1
.
\"-----------
\" Simplified letter
de let@init_SP
.
de let@head_SP
rm let@header
let@print-head
.
de let@sg_SP
nf
if \\$3=1 .sp
sp
misc@toupper "\\$1, \\$2"
if \\$4 .sp
if \w'\\$5'&\\$4 \\$5
fi
.
de let@fc_SP
sp 2
.
\"--------------------------------------
\" Print the letter-head
de let@print-head
nf
sp |11
if '1'\\$1' .in (u;\\n[.l]/2)
\" ---- WA
ie d let@wa-div .let@wa-div
el .sp 3
\" ---- datum
\\*[cov*new-date]
sp
if '1'\\$1' .if !d let*lo-CN .if !d let*lo-RN .sp 2
\" ---- Confidential
if d let*lo-CN \{\
       ti 0
       ie !''\\*[let*lo-CN]' \\*[let*lo-CN]
       el \\*[LetCN]
       sp
\}
\" ---- Reference
if d let*lo-RN \{\
\\*[LetRN] \\*[let*lo-RN]
       sp
\}
\" ---- IA
sp
in 0
nr let*i 0 1
while \\n+[let*i]<=\\n[let*ia-n] \{\
\\*[let*ia-name!\\n[let*i]]
\\*[let*ia-title!\\n[let*i]]
\}
if d let@ia-div .let@ia-div
\" ---- Attention
if d let*lo-AT \{\
       sp
\\*[LetAT] \\*[let*lo-AT]
\}
\" ---- Salutation
if !'\\*[let*type]'SP' .if d let*lo-SA \{\
       sp
       ti 0
       ie !''\\*[let*lo-SA]' \\*[let*lo-SA]
       el \\*[LetSA]
\}
\" ---- Subject
if d let*lo-SJ \{\
       ie '\\*[let*type]'SP' \{\
               sp 2
               misc@toupper \\*[let*lo-SJ]
               sp
       \}
       el \{\
               sp
               if '\\*[let*type]'SB' .ti +5m
\\*[LetSJ] \f[\\*[@sdf_font]]\\*[let*lo-SJ]\fP
       \}
\}
.
\"-------------------
\" .IA [name [title]]
nr let*ia-n 0 1
de IA
if \\n[.$] .ds let*ia-name!\\n+[let*ia-n] \\$1
if \\n[.$]>1 .ds let*ia-title!\\n[let*ia-n] \\$2
ev let@ev
init@reset
'nf
di let@ia-div
eo
.
de IE
di
ec
ev
.
\"-------------------
\" .WA [name [title]]
nr let*wa-n 0 1
de WA
if \\n[.$] .ds let*wa-name!\\n+[let*wa-n] \\$1
if \\n[.$]>1 .ds let*wa-title!\\n[let*wa-n] \\$2
ev let@ev
init@reset
'nf
di let@wa-div
it \\n[Letwam] let@wa-drain
eo
.
\"------
de let@wa-drain
it
di
di let@wa-junk
.
\"------
de WE
it
ec
di
ev
if d let@wa-junk .rm let@wa-junk
.
\"-------------------
\" Copy to
de NS
sp
ie !''\\$2' .ds let*str \\$1
el \{\
       ie \\n[.$]>0 \{\
               ie !\w'\\$1' .ds let*str \\*[Letns!\\*[Letnsdef]]
               el \{\
                       ie d Letns!\\$1 .ds let*str \\*[Letns!\\$1]
                       el .ds let*str \\*[Letns!copy](\\$1)\\*[Letns!to]
               \}
       \}
       el .ds let*str \\*[Letns!\\*[Letnsdef]]
\}
ne 2
nf
\\*[let*str]
.
de NE
fi
.
\"-------------------
\" Letter options
de LO
rm AF AS AE AT AU CS OK TL MT
if ''\\$1' .@error "LO: missing option"
if !d Let\\$1 .@error "LO: unknown option (\\$1)"
ds let*lo-\\$1 \\$2
if \n[D]>1 .tm Letter option \\$1 \\$2
.
\"--------------------
\" Start with a clean slate
init@reset