/contrib/groff/contrib/mm/m.tmac
Unknown | 3536 lines | 3530 code | 6 blank | 0 comment | 0 complexity | bec6fe6abc9267b7102c33c011b42f2f MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-3-Clause, LGPL-2.0, LGPL-2.1, BSD-2-Clause, 0BSD, JSON, AGPL-1.0, GPL-2.0
- .\"
- .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 <jh@axis.com>
- 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 jh@axis.com.
- 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