diff options
Diffstat (limited to '')
-rw-r--r-- | contrib/mm/m.tmac | 3734 |
1 files changed, 3734 insertions, 0 deletions
diff --git a/contrib/mm/m.tmac b/contrib/mm/m.tmac new file mode 100644 index 0000000..c679a70 --- /dev/null +++ b/contrib/mm/m.tmac @@ -0,0 +1,3734 @@ +.ig + +Copyright (C) 1991-2023 Free Software Foundation, Inc. +mm is written by Jörgen Hägg <jh@axis.com> + +mm 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 3 of the License, or +(at your option) any later version. + +mm 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 this program. If not, see <http://www.gnu.org/licenses/>. + +Please submit bug reports using groff's 'BUG-REPORT' file to +http://savannah.gnu.org/bugs/?group=groff. + +Naming convention adapted from groff ms. +Local names module*name +Extern names module@name +Env.var environ:name +Index array!index +.. +.if !\n(.g \ +. ab groff mm macros require groff extensions; aborting +. +.if \n(.C \ +. ab groff mm macros do not work in compatibility mode; aborting +. +.ds @mm m.tmac\" +. +.if (\n[.x]\n[.y] < 123) \{\ +. ds mm-msg \*[@mm]: groff mm macros require groff 1.23 or later,\" +. as mm-msg " but found groff \n[.x].\n[.y]; aborting\" +. ab \*[mm-msg] +.\} +. +.if d PH .nx +. +.mso devtag.tmac +.\" ######## init ####### +.\" create table of contents entry for headings of 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 before headings of level <= Ej +.nr Ej 0 +.\" Equation label adjust 0=left, 1=right +.nr Eq 0 +.\" Bullet string (for .BL) +.ie n .ds BU \[bu] +.el .ds BU \s-2\[bu]\s0 +.\" 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 +.\" break after headings of level <= Hb +.nr Hb 2 +.\" center headings of level <= Hc +.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 +.\" put vertical space of \n[Hss] after headings of level <= Hs +.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 indentation in ens, used by .AL +.nr Li 6 +.\" put vertical space before list items of nesting level <= Ls +.nr Ls 99 \" TODO: use \n[.R]; see Savannah #63587 +.\" 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 indentation in ens +.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 +.\" Reference page eject status +.nr Rpe 0 +.\" display indentation in ens +.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 +.\" +.ie t .ds Sm \v'-.4m'\s-3SM\s0\v'.4m'\" +.el \{\ +. ie c \[u2120] .ds Sm \[u2120]\" +. el .ds Sm (SM)\" +.\} +. +.ie t .ds Tm \v'-.4m'\s-3TM\s0\v'.4m'\" +.el \{\ +. ie c \[tm] .ds Tm \[tm]\" +. el .ds Tm (TM)\" +.\} +.\" +.\"--------------------------------------------- +.\" Internal global variables +.\" +.\" This is for cover macro .MT +.\" .ds @country +.\" +.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 +.\} +.\" +.\" Set the type size and vertical spacing. If given on the command +.\" line, these have already been converted to basic units. +.if !r S .nr S 10 +.ie (\n[S] >= 1000) .ps \n[S]z/1000u +.el .ps \n[S] +.nr *vs-default \n[.ps]*120/100 +.if !r V .nr V \n[*vs-default] +.ie (\n[V] >= 1000) .vs \n[V]p/1000u +.el .vs \n[V] +.rm *vs-default +.\" +.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 \{\ +. pl \n[L]u +.\} +.nr @pl \n[.p] +.\" +.\" line length +.ie r W \{\ +. 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 +.\" +.\" put vertical space of \n[Hps2] before headings of level <= Hps +.nr Hps 1 +.\" +.\" amount of vertical space before headings when level > Hps +.nr Hps1 0.5v +.if n .nr Hps1 1v +.\" +.\" amount of vertical space before headings 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 @country .msoquiet mm/\*[@country]_locale +.el .msoquiet mm/locale +.\"--------------------------------------------- +.\" ####### module init ###### +.\" reset all things +.\" XXX: Resets .cu and .ul but _not_ .ce or .rj. +.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 \\*[@mm]:\\n[.F]:\\n[.c]: warning: \\$* +.if \\n[D] .backtrace +.. +.\" All errors are fatal. +.de @error +.tm \\*[@mm]:\\n[.F]:\\n[.c]: error: \\$* +.if \\n[D] .backtrace +.ab +.. +. +.de @abort +.tm \\*[@mm]:\\n[.F]:\\n[.c]: internal error: \\$* +.backtrace +.ab +.. +.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*indentation-eligible 1 \" indent following P if Pt=2 +.nr par@suppress-indentation 0 +.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 +.if \\n[.$] \{\ +. ie !\B'\\$1' \{\ +. @warning \\$0: expected numeric argument, got '\\$1' +. shift +. \} +. el .if (\\$1 > 1) \ +. @warning \\$0: ignoring unsupported paragraph type \ +'\\$1' +.\} +.\" 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] +.\} +.nr par*indentation-eligible 1-\\n[par@suppress-indentation] +.par@doit \\$* +.if \\n[Np] \\n[H1].\\n+[par*number]\ \ \c +.. +.\"------------ +.de nP +.if \\n[D]>2 \{\ +. tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos] +. tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize] +.\} +.\" A first-line indentation is meaningless for a numbered paragraph. +.nr par*indentation-eligible 0 +.par@doit +\\n[H2].\\n+[par*number2]\ \ \c +.. +.\"------------ +.de par@doit +.SP (u;\\n[Ps]*\\n[Lsp]) +.nr par*do-indent 0 +.ie \\n[.$] \{\ +. if \\$1=1 .nr par*do-indent 1 +.\} +.el \{\ +. if \\n[Pt]=1 .nr par*do-indent 1 +. if (\\n[Pt]=2)&\\n[par*indentation-eligible] \ +. nr par*do-indent 1 +.\} +.if \\n[par*do-indent] .ti +\\n[Pi]n +.rr par*do-indent +.nr par@suppress-indentation 0 +.. +.\" ####### 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 ############### +.\" XXX: This register value is meaningless. +.\" .ad b +.\" .nr misc@adjust \n[.j] +.\" might be better... +.nr misc@adjust 14 +.de SA +.if \\n[.$] \{\ +. if ((\\$1 < 0) : (\\$1 > 1)) .@error \\$0: invalid argument \ +'\\$1' +.\" XXX: ...then... +.\" .ad l +.\" .nr misc@adjust \\n[.j] +. nr misc@adjust 0\\$1 +.\} +.\" XXX: ...and finally an unconditional. +.\" .ad \\n[.j] +.ie \\n[misc@adjust] 'ad +.el 'na +.. +.\"------------- +.\" switch environment, keep all important settings. +.de misc@ev-keep +.nr misc*ll \\n[.l] +.ds misc*fam \\n[.fam] +.ev \\$1 +.ll \\n[misc*ll]u +.lt \\n[misc*ll]u +.fam \\*[misc*fam] +.. +.\"------------- +.\" .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 .@abort 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 0\\*[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[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} +.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[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} +.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 +.if !''\\$3' \{\ +. di misc*rd2 +. ds \\$3 "\\*[misc*rd] +. br +. di +.\} +.if !''\\$2' .rn misc*rd \\$2 +.rm misc*rd misc*rd2 +.. +.\"------------ +.\" VERBON [flag [type-size [font]]] +.\" flag +.\" bit function +.\" 0 escape character disablement +.\" 1 add an empty line before verbose text +.\" 2 add an empty line after verbose text +.\" 3 number output lines using Verbnm string for .nm args +.\" 4 indent text by amount in register 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 +.. +.\" Wrapper to cancel the side effect of .tag + .br generating +.\" unwanted vertical space. +.de misc@tag +.\" This macro is currently used solely to give information to the +.\" HTML postprocessor. If for PostScript or PDF output macro .H +.\" had been followed by .DS both .H post-space and .DS pre-space +.\" had been output because of this macro. So it is now enabled +.\" only when postprocessor tags are required. +.if '\*[.T]'html' \{\ +.\" retain temporary indentation and horizontal position +.if !(\\n[.in]-\\n[.i]=0) .nr misc*ti \\n[.in] +.nr misc*.k \\n[.k] +.vpt 0 +.DEVTAG-\\$1 \\$2 +.br +.if r misc*ti \{\ +. ti \\n[misc*ti]u +. rr misc*ti +. sp -1 +.\} +.sp -1 +\h'\\n[misc*.k]u'\c +.rr misc*.k +.vpt 1 +.\} +.. +.\" ######## 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 \{\ +. if !\B'\\$1' .@error \\$0: width parameter is not \ +numeric; got '\\$1' +. nr pict*width (i;\\$1) +. shift +. \} +. if \\n[.$]>0 \{\ +. if !\B'\\$1' .@error \\$0: height parameter is not \ +numeric; got '\\$1' +. 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 pspic.tmac. +. \" 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 align +.de EPIC +.nr pict*adj 0 \" centered +.if '\\$1'-L' \{\ +. shift +. nr pict*adj 1 +.\} +.if \\n[.$]<2 \{\ +. @warning \\$0: ignoring; expected width and height arguments +. return +.\} +.\" Permit a document to start with EPIC. +.if \\n[nl]<0 \& +.ie \B'\\$1' .nr pict*w \\$1 +.el .@error \\$0: width parameter is not numeric; got '\\$1' +.ie \B'\\$2' .nr pict*h \\$2 +.el .@error \\$0: height parameter is not numeric; got '\\$2' +.\" XXX: This is kind of lame. It's also not localized. +.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 @disable +.ds @end \" empty +.while \\n[.$] \{\ +. rm \\$1 \" in case it's aliased +. de \\$1 @end +. @warning \\$1: ignoring; unavailable after \\*[@cover] +. @end +. shift +.\} +.. +.rm @end +. +.de CS +.@warning \\$0: not implemented except with ".MT 4" +.. +.de OK +.@warning \\$0: not implemented +.. +.de PM +.@warning \\$0: 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 variable index name val1 val2 ... +.de hd@split +.\" TODO: Verify that this isn't reachable due to ordinary user error; +.\" if it is, make it an @error. +.if \\$2>(\\n[.$]-3) .@abort \\$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 +.\" +.\" Break page before headings of level <= Ej. +.if ((\\n[hd*level]<=\\n[Ej])&(\\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] +.\" +.ds hd@mark-trimmed \\*[hd*mark]\" mark without spaces, for references +.as hd*mark \ \ \" add spaces between heading mark and title +.if !\\n[hd*arg1] .ds hd*mark \" empty; no mark for unnumbered heading +.\" +.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 \" empty +.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 \" do not adjust heading if not 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 \" space needed for a heading +.\" +.\" 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" +.\" HTML: mark beginning of heading +.misc@tag NH \\n[hd*level] +.\"-------------------------------------- +.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]) +.ie \\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@suppress-indentation 1 +.\} +.\" We're setting a run-in heading; the next paragraph is normal. +.el .nr par@suppress-indentation 0 +.\" +.\" 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] +.\" HTML: end of heading +.misc@tag EO-H +.. +.\"-------- +.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 ''- \\n[P] -'' +.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 }b pg*footer +.als }f pg*even-footer +.als }p pg*odd-footer +.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.]) +. if (u;(\\n[pg*header-size] + \\n[pg*extra-header-size] \ + + \\n[pg*footer-size] + \\n[pg*extra-footer-size] \ + + \\n[.V]) >= \\n[.p]) \{\ +. pl \\n[nl]u +. @error insufficient page length; aborting +. \} +.\} +.\" 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 +. ds hd*format \\g[P] +. af P 0 +. ie ((\\n[P]=1)&((\\n[N]=1):(\\n[N]=2))) .sp +. el .tl \\*[pg*header] +. af P \\*[hd*format] +. 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 occurred +.\} +.. +.\"--------------------------------------------------------- +.\" 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 +.vpt 0 +.\" user defined end-of-page macro +.ie d EOP .EOP +.el \{\ +. ie o .tl \\*[pg*odd-footer] +. el .tl \\*[pg*even-footer] +. ds hd*format \\g[P] +. af P 0 +. ie (\\n[P]=1)&(\\n[N]=1) .tl \\*[pg*header] +. el .tl \\*[pg*footer] +. af P \\*[hd*format] +. tl ''\\*[Pg_type!\\n[@copy_type]]'' +.\} +.vpt 1 +.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 +.if \\n[pg*cols-per-page]<=1 \{\ +. @warning \\$0: multicolumn mode not active +. return +.\} +.br +.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 \\$0: returning to single-column \ +layout with suppressed page break and footnote pending; output may be \ +messy +. \} +. \} +. if \\n[pg*last-ncol]>0 \{\ +. sp |\\n[pg*last-ncol]u +. nr pg*last-ncol 0 +. \} +.\} +.. +.de 2C +.if \\n[pg*cols-per-page]>1 .@error \\$0: multicolumn mode already \ +active +.br +.nr pg*head-mark \\n[nl]u +.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 +.if \\n[pg*cols-per-page]>1 .@error \\$0: multicolumn mode already \ +active +.br +.nr pg*head-mark \\n[nl]u +.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 \" temporarily invalid! +.nr pg*i \\n[pg*column-size] +.while \\n[pg*i]<=\\n[.l] \{\ +. nr pg*cols-per-page +1 +. nr pg*i \\n[pg*i]+\\n[pg*column-sep]+\\n[pg*column-size] +.\} +.if \\n[pg*cols-per-page]<0 .@abort \\n[pg*cols-per-page] columns in \ +page +.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 6 +.di pg*mul-div +.MULN +.. +.\"----------- +.de MULN +.if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@abort undefined column width \ +(pg*mul-x=\\n[pg*mul-x >= pg*mul-max-col=\\n[pg*mul-max]) +.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 +.aln :p ft*nr +.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. +.\" +.ie t .ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m' +.el .ds F [\\n+[ft*nr]] +.\" +.\"----------------- +.\" 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 6 +.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 \\$0: expected 1 or 2 arguments, got \\n[.$] +.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)*6 +. 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 \\$0: cannot nest; 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 \\$0: footnote bigger than page area +.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 \\$0: cannot nest floating keeps; use DS \ +within DF/DE +.ds ds@macro \\$0 +.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@suppress-indentation 1 \" no indentation after displays +.\" 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 .@abort invalid float type: 5 < Df (\\n[Df]) +.if !\\n[ds*float-busy] \{\ +. nr ds*float-busy 1 +.\" at .DE +. if \\n[D]>3 \{\ +. tmc print-float: .t=\\n[.t] +. if r df*height!\\n[df*o-fnr] \ +. tmc , h=\\n[df*height!\\n[df*o-fnr]] +. tm +. \} +. \" 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@macro]: unrecognized 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 +.if \\n[.$]>1 \{\ +. ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2] +. el .@error \\*[ds@macro]: unrecognized fill style '\\$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 +.ds ds@macro \\$0 +.br +.nr ds*lvl +1 +.ds@set-format \\$@ +.\" +.nr ds*old-ll \\n[.l] +.nr ds*old-in \\n[.i] +.misc@push ds-in \\n[ds*old-in] \" Saving indent and line length of +.misc@push ds-ll \\n[ds*old-ll] \" the text outside the display. +.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] +.\" +.nr ds*div-ll \\n[ds*old-ll] +.if \\n[ds*format]=1 .nr ds*div-ll -\\n[Si]n +.ds@set-new-ev \\n[ds*div-ll] +.nr df*float 0 +.. +.\"-------------------------------------------- +.de ds@end +.\" We hard-code the DE macro name here since this macro is internal but +.\" only DE calls it. We also know we're closing a static keep because +.\" df@end is called otherwise. See `DE`. +.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 \" Restore indent and +.misc@pop-nr ds-in ds*old-in \" line length +.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 +.\" +.\" Print static display +.nr ds*i \\n[Lsp] +.if r Dsp .nr ds*i \\n[Dsp] +.\" +.if \\n[Ds] .SP \\n[ds*i]u \" Space before display +.\" 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]) +.\" ********** +.\" +.ds*div!\\n[ds*snr] +.if \\n[Ds] .SP \\n[ds*i]u \" Space after display +.\" +.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@suppress-indentation 1 \" no indentation after displays +.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 \\$0: expected at least 4 arguments, got \\n[.$] +.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 \\$0: no list active; call AL, BL, BVL, ... \ +first +.if \\n[li*li-spc]&(\\n[li*lvl]<=\\n[Ls]) \ +. 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 +.if \\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]\ @ +.\" +.\" 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 \\$0: no list active; call AL, BL, BVL, ... \ +and LI first +.li@pop +.if '\\$1'1' .SP \\n[Lsp]u +.nr par@suppress-indentation 1 \" no indentation after lists +.. +.\"------------- +.\" list status clear. +.\" terminate all lists to level i +.de LC +.nr li*i 0 +.if \\n[.$] \{\ +. ie \B'\\$1' .nr li*i \\$1 +. el .@error \\$0: argument not numeric: '\\n[li*i]' +.\} +.if \\n[li*i]>\\n[li*lvl] .@error \\$0 invalid argument: \\n[li*i] \ +exceeds depth of nested lists (\\n[li*lvl]) +.while \\n[li*lvl]>\\n[li*i] .li@pop +.nr par@suppress-indentation 1 \" no indentation after lists +.. +.\"------------- +.de AL +.if \\n[.$]>3 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess arguments +.if \\n[.$]<1 .@error \\$0: expected 1 to 3 arguments, got \\n[.$] +.ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0 +.el .LB 0\\$1 0\\$2 0 0 \& 0 1 +.. +.de BL +.if \\n[D]>2 .tm BL $* +.if \\n[.$]>2 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess 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 .@warning \\$0: ignoring excess arguments +.if \\n[.$]<1 .@error \\$0: expected 1 to 3 arguments, got \\n[.$] +.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 mm. +.\" 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 \\$0: .TH without .TS H" +.. +.de TE +.ie '\\n[.z]'tbl*header-div' .@error \\$0: .TS H but no .TH before .TE +.el \{\ +. nr tbl*have-header 0 +.\} +.\" reset tabs +.TAB +.. +.de T& +.. +.\" ####### module pic ####################################### +.de PS +.if !\\n[.$]=2 \{\ +. ds pic*msg \\$0: expected 2 arguments, got \\n[.$]\" +. as pic*msg ; not preprocessed with pic?\" +. @error \\*[pic*msg] +.\} +.br +.SP .5 +.if r ds*format .if !\\n[ds*lvl] .ne (u;\\$1)+1v +.. +.de PY +.init@reset +.. +.de PE +.PY +.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-1v)/2) +. ie (\\n[Eq]%2) \{\ +. \" label to the left +\h'|0'\\*[eq*label] +. \} +. el \{\ +. \" label to the right, possibly compensating for +. \" indented display +. ie \\n[ds*format]=1 \ +\h'|\\n[.l]u-\w'\\*[eq*label]'u+\\n[Si]n'\\*[eq*label] +. el \h'|\\n[.l]u-\w'\\*[eq*label]'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[P] +.. +.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 pagenumber +.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 headernumber 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 +\f3\\$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 +\!\f3\\$1\fP\\$2 +\!.\} +\!.el \{\ +. ce 1 +\!\f3\\$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 headernumber +.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 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 \f3 \f[\\n[.f]] \\$@ +.el .ft 3 +.. +.de I +.ie \\n[.$] .fnt@switch \f2 \f[\\n[.f]] \\$@ +.el .ft 2 +.. +.de R +.ie \\n[.$] .fnt@switch \f1 \f[\\n[.f]] \\$@ +.el .ft 1 +.. +.de IB +.if \\n[.$] .fnt@switch \f2 \f3 \\$@ +.. +.de BI +.if \\n[.$] .fnt@switch \f3 \f2 \\$@ +.. +.de IR +.if \\n[.$] .fnt@switch \f2 \f1 \\$@ +.. +.de RI +.if \\n[.$] .fnt@switch \f1 \f2 \\$@ +.. +.de RB +.if \\n[.$] .fnt@switch \f1 \f3 \\$@ +.. +.de BR +.if \\n[.$] .fnt@switch \f3 \f1 \\$@ +.. +.\"########################### 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 \\$0: cannot nest; 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 \\$0: no corresponding 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 ############################ +.mso refer-mm.tmac +.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 \{\ +. @warning \\$0: ignoring; no references defined +. return +.\} +.ie !''\\$2' .nr ref*i 0\\$2 +.el .nr ref*i \\n[Rpe] +.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 +\f2\\*[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 \\$0: expected 2 or 3 arguments, got \\n[.$] +.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@header name text +.de app@header +.bp +.SP (u;\\n[Lsp]*4) +.ce 1 +\s+4\f3\\*[App]\ \\$1\fP\s0 +.SP (u;\\n[Lsp]*2) +.if \w@\\$2@<\\n[.l] .ce 1 +\f3\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 +.\" number of authors' titles stored in cov*at!x +.\" title(s) of author(s) 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 +.ds @cover \\$0 +.@disable IA IE WA WE LO LT \" can't use with LT and friends +.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 +.if !\\n[.$] .return \" AU is being used only to end a TL. +.pg@disable-top-trap +.nr cov*au +1 +.nr cov*at!\\n[cov*au] 0 \" no titles for this author yet +.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 title [...] +.\" Any quantity of titles may be declared. +.\" Must be called directly after the corresponding .AU. +.de AT +.if !\\n[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} +.nr cov*at!\\n[cov*au] \\n[.$] +.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 \\$0: only one abstract allowed +.if !''\\n[.z]' .@error \\$0: 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 memorandum numbers. +.de TM +.if !\\n[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} +.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 +.ds @cover \\$0 +.@disable COVER IA IE WA WE LO LT +.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-addressee "\\$2 +.ds cov*mt-type-text "\\$1 +.ie d @country .ds cov*str mm/\\*[@country]_ +.el .ds cov*str mm/ +.mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]] +.. +.de COVER +.ds @cover \\$0 +.@disable IA IE WA WE LO LT MT +.ie !\\n[.$] .ds cov*cov-type ms +.el .ds cov*cov-type \\$1 +.pg@disable-top-trap +.ie d @country .ds cov*str mm/\\*[@country]_\\*[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 \\$0: expected 1 or 2 arguments, got \\n[.$] +.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error? +.if \\n[Ref] \{\ +. ds qrf*name qrf*ref-\\$1 +. if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd@mark-trimmed],\\n[%] +. \" heading-number +. ds \\*[qrf*name]-hn \\*[hd@mark-trimmed] +. \" page-number +. ds \\*[qrf*name]-pn \\n[%] +. \" +. if \\n[Ref] \{\ +. tm .ds \\*[qrf*name]-hn \\*[hd@mark-trimmed] +. 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 \\$0: expected 1 or 2 arguments, got \\n[.$] +.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error? +.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 \\$0: expected 1 or 2 arguments, got \\n[.$] +.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error? +.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 \\$0: expected 1 or 2 arguments, got \\n[.$] +.if !r qrf*pass .tm \\$0: no .INITR in this file \" XXX: .@error? +.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 \\$0: expected an argument +.ie !r qrf*pass .tm \\$0: no .INITR in this file" \" XXX: .@error? +.el \{\ +. GETHN \\$1 Qrfh +. GETPN \\$1 Qrfp +\\*[Qrf] +.\} +.. +.\"########################### module ind ############################ +.\"-------------------- +.\" Another type of index system +.\" INITI type filename [macro] +.de INITI +.if \\n[.$]<2 .@error \\$0: expected 2 or 3 arguments, got \\n[.$] +.\" ignore if INITI has already been used +.if d ind*file .@error \\$0: index file name already set +.ds ind*file \\$2.ind +.if \\n[D]>1 .tm INITI: source \\*[ind*file] +.if !d ind*file .@error \\$0: index file name not specified +.ds ind*type \\$1 +.if \\n[Ref] \{\ +. if \\n[.$]>2 .tm .\\\\" Imacro: \\$3 +.\} +.. +.\"--------------- +.de IND +.if !d ind*file .@error \\$0: no active index; call INITI" +.if \\n[D]>1 .tm IND: type=\\*[ind*type] +.ds ind*ref \" empty +.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]'' .@abort invalid index type '\\*[ind*type]' +.\" +.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 +.\" We hard-code the SG macro name here since this macro is internal but +.\" only SG calls it. +.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 \" empty +.if d cov*au!\\n[let*k]!3 \{\ +. as let*tmp \\*[cov*au!\\n[let*k]!3]\" +. if d cov*au!\\n[let*k]!4 \ +. as let*tmp -\\*[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 /\" +. if d cov*au!\\n[let*i]!2 .as let*tmp \\*[cov*au!\\n[let*i]!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] \{\ +. ne 3v+\\n[cov*at!\\n[let*i]]v +. SP 3v +. if \\n[let*i]=\\n[let*k] \{\ +\Z'\h'-(u;\\n[.l]/2)'\\*[let*tmp]'\c +. \} +\\*[cov*au!\\n[let*i]!1] +. nr let*j 0 1 +. while \\n+[let*j]<=\\n[cov*at!\\n[let*i]] \{\ +\\*[cov*at!\\n[let*i]!\\n[let*j]] +. \} +.\} +.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 +.ds @cover LT +.@disable AF AS AE AT AU COVER CS OK TL MT \" same list as LO +.ds let*type BL +.nr Pi 5 +.nr Pt 0 +.if !''\\$1' .ds let*type \\$1 +.if !d let@head_\\*[let*type] .@error \\$0: 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 +.ie '\\$2'' .misc@toupper "\\$1" +.el .misc@toupper "\\$1, \\$2" +.if \\$4 .sp +.if \w'\\$5'&\\$4 \\$5 +.fi +.. +.de let@fc_SP +.\" Simplified letters have no formal closing, just space before SG. +.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 +.ds @cover \\$0 +.@disable AF AS AE AT AU COVER CS OK TL MT \" same list as LT +.if !\\n[.$] \{\ +. @warning \\$0: ignoring; no arguments specified +. return +.\} +.if !d Let\\$1 .@error \\$0: unrecognized option '\\$1' +.ds let*lo-\\$1 \\$2 +.if \n[D]>1 .tm Letter option \\$1 \\$2 +.. +.\"-------------------- +.\" Start with a clean slate +.init@reset +. +.\" Local Variables: +.\" mode: nroff +.\" fill-column: 72 +.\" End: +.\" vim: set filetype=groff textwidth=72: |