mooc/www/sys/fs/usr/share/groff/current/tmac/hdtbl.tmac

744 lines
17 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.\" -*- nroff -*-
.ig
hdtbl.tmac
This file is part of groff, the GNU roff type-setting system.
Copyright (C) 2005-2014 Free Software Foundation, Inc.
written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.
groff 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.
groff 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/>.
..
.\" *****************************************************************
.\" * hdtbl - Heidelberger table macros *
.\" * Vers. 0.91 December 2005 *
.\" *****************************************************************
.if d TBL \
. nx
.mso hdmisc.tmac
.mso 62bit.tmac
.\" *****************************************************************
.\" * default values for some arguments *
.\" *****************************************************************
.ds t*hl s\"
.ds t*vl s\"
.ds t*tal l\"
.ds t*hal b\"
.ds t*val t\"
.ds t*ff \\n[.fam]\"
.ds t*fst \\n[.f]\"
.ds t*fsz 1 1\"
.ds t*fgc red4\"
.ds t*bgc bisque\"
.ds t*bc red4\"
.nr t*cpd .5n
.nr t*csp .5n
.nr t*b .1n
.nr t*cols 1
.nr t*v \n[.v]
.nr t*s \n[.ps]
.nr t*hy \n[.hy]
.nr t*l \n[.ll]
.\" defaults for table captions
.nr t*cptn 0 1
.ds t*cptn "".sp .4" \
".t*pv 1.0 1.0" \
".ad l" \
"\m[\\*[t*fgc]]Table \\n+[t*cptn]:\0\c\k*"\"
.ds nth-1 st
.ds nth-2 nd
.ds nth-3 rd
.nr t*# 0
.nr t*numb 0 1
.ds *#trc*
.ie n \
.ds g tty:
.el \
.ds g ps: exec
.de TBL
.ds t*m\\n[t*#] \\n[.m]
.ie \\n[t*#] \
.br
.el \{\
.ds * \\n[.ev]
.ev t*tbl
.evc \\*[*]
.di t*tbl0
.sp .4
.nr t*i \\n[.i]
.ll -\\n[.i]u
.in 0
.\}
.nr t*# +1
.ds t*FN \\[.F]
.ds t*LN \\[.c]
.t*getarg cols \\$@
.ie "\\*[cols]"" \
.nr t*cols\\n[t*#] \\n[t*cols]
.el \{\
.ie \B\\*[cols] \
.nr t*cols\\n[t*#] \\*[cols]
.el \
.tm \\n[.F]:\\n[.c]: Invalid number of columns value `\\*[cols]'.
.\}
.t*getarg cpd \\*[args]
.ie "\\*[cpd]"" \
.nr t*cpd\\n[t*#] \\n[t*cpd]
.el \{\
.ie \B\\*[cpd] \
.nr t*cpd\\n[t*#] \\*[cpd]
.el \
.tm \\n[.F]:\\n[.c]: Invalid cell padding value `\\*[cpd]'.
.\}
.t*getarg csp \\*[args]
.ie "\\*[csp]"" \
.nr t*csp\\n[t*#] \\n[t*csp]
.el \{\
.ie \B\\*[csp] \
.nr t*csp\\n[t*#] \\*[csp]
.el \
.tm \\n[.F]:\\n[.c]: Invalid cell spacing value `\\*[csp]'.
.\}
.t*getarg border \\*[args]
.ie "\\*[border]"=" \
.nr t*b\\n[t*#] 0-1
.el \{\
.ie "\\*[border]"" \
.nr t*b\\n[t*#] \\n[t*b]
.el \{\
.ie \B\\*[border] \
.nr t*b\\n[t*#] \\*[border]
.el \
.tm \\n[.F]:\\n[.c]: Invalid border thickness value `\\*[border]'.
.\}\}
.t*getarg bc \\*[args]
.ds t*bc\\n[t*#] \\*[t*bc]
.if !"\\*[bc]"" \{\
.ie m\\*[bc] \
.ds t*bc\\n[t*#] \\*[bc]
.el \{\
.ie "\\*[bc]"=" \
.ds t*bc\\n[t*#] =
.el \
.tm \\n[.F]:\\n[.c]: Invalid border color `\\*[bc]'.
.\}\}
.ie "\\*[bc]"=" \
.ds t*bc\\n[t*#]
.el \{\
.ie "\\*[bc]"" \
.ds t*bc\\n[t*#] \\*[t*bc]
.el \
.ds t*bc\\n[t*#] \\*[bc]
.\}
.t*getarg width \\*[args]
.if "\\*[width]"=" \
.ds width
.nr b/2\\n[t*#] (\\n[t*b\\n[t*#]] / 2)
.nr cscp\\n[t*#] (\\n[t*csp\\n[t*#]] + \\n[t*cpd\\n[t*#]])
.t*getarg height \\*[args]
.ie "\\*[height]"" \
.nr t*height\\n[t*#] 0
.el \{\
.ie \B\\*[height] \
.nr t*height\\n[t*#] (\\*[height] \
- ((2 * \\n[cscp\\n[t*#]]) \
+ (3 * \\n[b/2\\n[t*#]])))
.el \
.tm \\n[.F]:\\n[.c]: Invalid height value `\\*[height]'.
.\}
.t*cl \\*[width]
.t*args \\n[t*#]
.t*getarg tal \\*[args]
.if "\\*[tal]"" \
.ds tal \\*[t*tal]
.ie "\\*[tal]"l" \
.nr in\\n[t*#] \\n[.i]
.el \{\
.ie "\\*[tal]"c" \
.nr in\\n[t*#] (\\n[.l] - \\n[ll\\n[t*#]]/2 + \\n[.i])
.el \{\
.ie "\\*[tal]"r" \
.nr in\\n[t*#] (\\n[.l] - \\n[ll\\n[t*#]] + \\n[.i])
.el \{\
.tmc \\n[.F]:\\n[.c]: Invalid horizontal table alignment `\\*[tal]':
.tm1 " must be `l', `c' or `r'.
.\}\}\}
.nr t*r#\\n[t*#] 0
.mk toptbl\\n[t*#]
.t*P1 \\*[args]
..
.de CPTN
.ft 1
.if "\\$0"CPTN" \
.if \\n[t*r#\\n[t*#]] \{\
.tmc \\n[.F]:\\n[.c]: Invalid placement of `.CPTN';
.tm1 " must be called immediately after `.TBL'.
.return
.\}
.t*getarg val \\$@
.ds args\\n[t*#] "\\*[args]
.t*index "\\*[args]" .TR
.ie \\n[t*index] \{\
.ds *a\\n[t*#] "\\*[args]
.substring args\\n[t*#] 0 \\n[t*index]
.substring *a\\n[t*#] \\n[t*index]-2 -1
.\}
.el \
.ds *a\\n[t*#]
.ie "\\*[val]"b" \{\
.de t*cptn\\n[t*#]
.*CPTN \\*[args\\n[t*#]]
.rm t*cptn\\n[t*#]
\\..
.\}
.el \{\
.ll (\\n[ll\\n[t*#]]u + \\n[in\\n[t*#]]u)
.in \\n[in\\n[t*#]]u
.t*P1 \\*[t*cptn]
' in +\\n[*]u
.t*P1 \\*[args\\n[t*#]]
.t*pv 1 1
.in
.mk toptbl\\n[t*#]
.\}
.t*P1 \\*[*a\\n[t*#]]
..
.als *CPTN CPTN
.de TR
.ft 1
.if !\\n[t*#] \{\
.tm \\n[.F]:\\n[.c]: Table row (.TR) without preceding table start (.TBL).
.return
.\}
.if \\n[t*r#\\n[t*#]] \
.t*dntr 1 \\n[c#\\*[#t#r]] \\n[t*cols\\n[t*#]] \\*[*#trc*]
.nr t*r#\\n[t*#] +1
.ds #t#r \\n[t*#]*\\n[t*r#\\n[t*#]]
.nr c#\\*[#t#r] 0 1
.nr dntr\\*[#t#r] 0 1
.t*getarg height \\$@
.ie "\\*[height]"" \
.nr t*height\\*[#t#r] 0
.el \{\
.ie \B\\*[height] \
.nr t*height\\*[#t#r] \\*[height]
.el \
.tm \\n[.F]:\\n[.c]: Invalid table row height `\\*[height]'.
.\}
.t*args \\*[#t#r] \\n[t*#]
.t*P1 \\*[args]
..
.de TH
.ft 1
.t*getarg hal \\$@
.if "\\*[hal]"" \
.ds hal c
.t*getarg val \\*[args]
.if "\\*[val]"" \
.ds val m
.t*getarg fst \\*[args]
.if "\\*[fst]"" \
.ds fst B
.TD hal=\\*[hal] val=\\*[val] fst=\\*[fst] \\*[args]
..
.de TD
.ft 1
.t*dntr 0 \\n[c#\\*[#t#r]]-1 \En[c#\\*[#t#r]] \\*[*#trc*]
.ds *#trc* \\*[#t#r]*\\n[c#\\*[#t#r]]
.t*getarg rowspan \\$@
.nr rowspan 1
.if !"\\*[rowspan]"" \{\
.ie \B\\*[rowspan] \{\
.nr rowspan (\\*[rowspan] >? 1)
.nr *rsp*\\*[*#trc*] (\\n[rowspan] - 1)
.\}
.el \
.tm \\n[.F]:\\n[.c]: Invalid value of `rowspan' keyword.
.\}
.t*getarg colspan \\*[args]
.nr colspan 1
.if !"\\*[colspan]"" \{\
.ie \B\\*[colspan] \
.nr colspan (\\*[colspan] >? 1)
.el \
.tm \\n[.F]:\\n[.c]: Invalid value of `colspan' keyword.
.\}
.t*args \\*[#trc] \\*[#t#r]
.nr in\\*[#trc] \\n[in\\n[t*#]*\\n[c#\\*[#t#r]]]
.nr *cl \\n[cll\\n[t*#]*\\n[c#\\*[#t#r]]]
.nr * 0 1
.nr *r \\n[t*r#\\n[t*#]]
.if (\\n[rowspan] - 1) \
.while (\\n+[*] <= \\n[rowspan]) \{\
.nr rspan\\n[t*#]*\\n[*r]*\\n[c#\\*[#t#r]] \\n[colspan]
.if (\\n[*] > 1) \
.nr cspan\\n[t*#]*\\n[*r]*\\n[c#\\*[#t#r]] \\n[colspan]
.nr *r +1
.\}
.nr * 1 1
.nr *c \\n[c#\\*[#t#r]]
.if (\\n[colspan] - 1) \{\
.nr vline\\*[*#trc*] 0-1
.while (\\n+[*] <= \\n[colspan]) \{\
.nr *c +1
.nr *cl +(2 * \\n[cscp\\n[t*#]] \
+ \\n[b/2\\n[t*#]] \
+ \\n[cll\\n[t*#]*\\n[*c]])
.nr c#\\*[#t#r] +1
.\}
.\}
.if (\\n[c#\\n[t*#]*\\n[t*r#\\n[t*#]]] > \\n[t*cols\\n[t*#]]) \{\
.ds * are
.ds ** columns
.if (\\n[c#\\*[#t#r]] == 1) \{\
.ds * is
.ds ** column
.\}
.tmc \\n[.F]:\\n[.c]: There \\*[*] \\n[c#\\*[#t#r]] table \\*[**] (.TD)
.ds * are
.if (\\n[t*cols\\n[t*#]] == 1) \
.ds * is
.tm1 " but only \\n[t*cols\\n[t*#]] \\*[*] expected.
.ds *
.length * \\n[.F]:\\n[.c]:
.while \\n-[*] \
.ds * " \\*[*]
.tm1 "\\*[*] Remaining .TDs and its contents are ignored.
.di *t*dummy*
.return
.\}
.di t*\\*[#trc]
.in 0
.nr cll\\*[#trc] \\n[*cl]
.ll \\n[*cl]u
.nr *cl\\n[t*#] \\n[.l]
.gcolor \\*[t*fgc\\*[#trc]]
.ad \\*[t*hal\\*[#trc]]
.fam \\*[t*ff\\*[#trc]]
.ft \\*[t*fst\\*[#trc]]
.t*pv \\*[t*fsz\\*[#trc]]
.t*P1 \\*[args]
..
.de ETB
.ie \\n[t*#] \
.if !\\n[t*r#\\n[t*#]] \{\
.tmc \\n[.F]:\\n[.c]: Each table (.TBL)
.tm1 " should contain at least one table row (.TR)!
.\}
.el \{\
.tmc \\n[.F]:\\n[.c]: Table end (.ETB)
.tm1 " without corresponding table start (.TBL)!
.\}
.ds #t#r \\n[t*#]*\\n[t*r#\\n[t*#]]
.t*dntr 2 \\n[c#\\*[#t#r]] \\n[t*cols\\n[t*#]] \\*[*#trc*]
.t*divs
.sp \\n[b/2\\n[t*#]]u
.t*cptn\\n[t*#]
.nr t*# -1
.ll \\n[*cl\\n[t*#]]u
.in 0
.gcolor \\*[t*m\\n[t*#]]
.t*getarg hold \\$@
.if !\\n[t*#] \{\
.sp .5
.di
.in \\n[t*i]u
.ie "\\*[hold]"" \{\
.ie (\\n[.t] - \\n[dn]) \
.t*DI t*tbl0
.el \{\
.rn t*tbl0 t*tbl\\n+[t*numb]
.ds t*kept \\*[t*kept] t*tbl\\n[t*numb] \\n[dn]
.\}
.\}
.el \{\
.rn t*tbl0 t*hold\\n+[t*numb]
.tm \\n[.F]:\\n[.c]: Table t*hold\\n[t*numb] held.
.ds t*held \\*[t*held] t*hold\\n[t*numb] \\n[dn]
.\}
.ev
.\}
.t*P1 \\*[args]
..
.de t*free
.if "\\$0"CPTN" \
.if \\n[t*r#\\n[t*#]] \{\
.tmc \\n[.F]:\\n[.c]: Invalid placement of `.t*free' within a table;
.tm1 " it must be called outside of any table.
.return
.\}
.if "\\*[t*held]"" \{\
.tm \\n[.F]:\\n[.c]: No held tables.
.return
.\}
.nr ** (\\$1 >? 1) 1
.while !""\\*[t*held]" \{\
.pops * t*held
.popr * t*held
.ie (\\n[.t] - \\n[*]) \{\
.ev t*tbl
.t*DI \\*[*]
.ev
.\}
.el \{\
.rn \\*[*] t*tbl\\n+[t*numb]
.ds t*kept \\*[t*kept] t*tbl\\n[t*numb] \\n[*]
.\}
.if !(\\n-[**] - 1) \
.return
.\}
..
.de t*divs
.ll (\\n[t*l]u + 1c)
.nf
.nr b/2 \\n[b/2\\n[t*#]]
.nr cscp \\n[cscp\\n[t*#]]
.nr cscpb (\\n[b/2] + \\n[cscp])
.nr topdiv (\\n[.d] + \\n[b/2] - \\n[cscp])
.nr cscpb2 (\\n[b/2] / 2 + \\n[cscp])
.nr #r 0 1
.while (\\n+[#r] <= \\n[t*r#\\n[t*#]]) \{\
.nr * (\\n[#r] - 1)
.nr topdiv +(\\n[dntr\\n[t*#]*\\n[*]] + \\n[cscp] + \\n[cscpb])
.if ((\\n[#r] == \\n[t*r#\\n[t*#]]) & \\n[t*height\\n[t*#]]) \
.nr dntr\\n[t*#]*\\n[#r] (\\n[cscpb] \
+ \\n[toptbl\\n[t*#]] \
+ \\n[t*height\\n[t*#]] \
- (\\n[topdiv] >? \\n[dntr\\n[t*#]*\\n[#r]]))
.nr #c 0 1
.while (\\n+[#c] <= \\n[t*cols\\n[t*#]]) \{\
.ds #trc \\n[t*#]*\\n[#r]*\\n[#c]
.if !d t*\\*[#trc] \
.continue
.sp |\\n[topdiv]u
.in (\\n[in\\n[t*#]]u + \\n[in\\*[#trc]]u)
.nr $1 \\n[dntr\\n[t*#]*\\n[#r]]
.if \\n[*rsp*\\*[#trc]] \{\
.nr * \\n[#r] 1
.nr rspan\\*[#trc] 0-1
.nr corr (\\n[dn\\*[#trc]] - \\n[dntr\\n[t*#]*\\n[#r]])
.while \\n[*rsp*\\*[#trc]] \{\
.nr *rsp*\\*[#trc] -1
.nr rspan\\n[t*#]*\\n+[*]*\\n[#c] 0
.nr ** (\\n[dntr\\n[t*#]*\\n[*]] + \\n[cscp] + \\n[cscpb])
.nr corr -\\n[**]
.nr $1 +\\n[**]
.\}
.if (\\n-[*] == \\n[t*r#\\n[t*#]]) \
.nr $1 ((\\n[t*height\\n[t*#]] \
- \\n[.d] \
+ \\n[toptbl\\n[t*#]] \
+ \\n[cscpb]) \
>? \\n[$1])
.nr dntr\\n[t*#]*\\n[*] +(\\n[corr] >? 0)
.\}
.nr * (2 * \\n[t*cpd\\n[t*#]] + \\n[cll\\*[#trc]])
.nr $1 (\\n[$1] >? \\n[dn\\*[#trc]])
.if !"\\*[t*bgc\\*[#trc]]"=" \{\
.nop \h'\\n[t*csp\\n[t*#]]u'\
\M[\\*[t*bgc\\*[#trc]]]\
\v'(-.67v - \\n[t*cpd\\n[t*#]]u)'\
\D'P \\n[*]u 0 \
0 (2u * \\n[t*cpd\\n[t*#]]u + \\n[$1]u) \
-\\n[*]u 0'\
\M[]
.sp -1
.\}
.nr *t (.1n >? \\n[b/2])
.in +\\n[cscp]u
.if (1 + \\n[t*b\\n[t*#]]) \{\
.if !"\\*[t*bc\\n[t*#]]"=" \{\
.if (\\n[t*r#\\n[t*#]] - \\n[#r] + \\n[rspan\\*[#trc]]) \{\
.if !"\\*[t*hl\\*[#trc]]"=" \{\
.sp \\n[$1]u
.nr * (\\n[cscp] + \\n[cscpb] + \\n[cll\\*[#trc]])
.nop \X'\*[g] 1 setlinecap'\
\h'(-\\n[cscpb2]u - \\n[*t]u)'\
\v'(\\n[cscpb2]u - .67v)'\
\m[\\*[t*bc\\n[t*#]]]\
\D't \\n[*t]u'\c
.ie "\\*[t*hl\\*[#trc]]"d" \
.nop \v'-\\n[*t]u'\
\D'l \\n[*]u 0'\
\v'(2u * \\n[*t]u)'\
\D'l -\\n[*]u 0'\
\D't 0'
.el \
.nop \D'l \\n[*]u 0'\
\D't 0'
.sp (-\\n[$1]u - 1v)
.\}\}
.nr rspan\\*[#trc] 0
.if (\\n[t*cols\\n[t*#]] - \\n[#c] + \\n[vline\\*[#trc]]) \{\
.if !"\\*[t*vl\\*[#trc]]"=" \{\
.nop \X'\*[g] 1 setlinecap'\
\v'(-\\n[cscpb2]u - .67v)'\
\m[\\*[t*bc\\n[t*#]]]\
\h'(\\n[cscpb2]u - \\n[*t]u + \\n[cll\\*[#trc]]u)'\c
.ie "\\*[t*vl\\*[#trc]]"d" \
.nop \h'-\\n[*t]u'\
\D't \\n[*t]u'\
\D'l 0 (2u * \\n[cscp]u + \\n[$1]u + (\\n[*t]u / 2u))'\
\h'(2u * \\n[*t]u)'\
\D'l 0 -(2u * \\n[cscp]u + \\n[$1]u + (\\n[*t]u / 2u))'\
\D't 0'
.el \
.nop \D't \\n[*t]u'\
\D'l 0 (2u * \\n[cscp]u + \\n[$1]u + (\\n[*t]u / 2u))'\
\D't 0'
.sp -1
.\}\}\}\}
.nr vline\\*[#trc] 0
.nr ** 0
.ie "\\*[t*val\\*[#trc]]"m" \
.nr ** ((\\n[$1] - \\n[dn\\*[#trc]]) / 2)
.el \
.if "\\*[t*val\\*[#trc]]"b" \
.nr ** (\\n[$1] - \\n[dn\\*[#trc]])
.sp \\n[**]u
.t*\\*[#trc]
.rm t*\\*[#trc]
.\}
.\}
.in \\n[in\\n[t*#]]u
.nr ** (\\n[topdiv] + \\n[dntr\\n[t*#]*\\n-[#r]])
.if \\n[t*b\\n[t*#]] \{\
.sp |(\\n[toptbl\\n[t*#]]u + \\n[b/2]u)
.nr $1 (\\n[toptbl\\n[t*#]] - \\n[**] - \\n[cscp])
.nr * (\\n[ll\\n[t*#]] - \\n[t*b\\n[t*#]])
.if !"\\*[t*bc\\n[t*#]]"=" \
.nop \X'\*[g] 0 setlinejoin 2 setlinecap'\
\v'-.67v'\
\h'-\\n[b/2]u'\
\m[\\*[t*bc\\n[t*#]]]\
\D't \\n[t*b\\n[t*#]]u'\
\D'l \\n[*]u 0'\
\D'l 0 -\\n[$1]u'\
\D'l -\\n[*]u 0'\
\D'l 0 \\n[$1]u'\
\D't 0'
.\}
.sp |(\\n[**]u + \\n[cscpb]u)
.fi
..
.de t*cl
.nr t*cols\\n[t*#] (\\n[.$] >? \\n[t*cols\\n[t*#]])
.nr ll\\n[t*#] 0
.nr ** (\\n[.l] / \\n[t*cols\\n[t*#]])
.nr * 0 1
.while (\\n[t*cols\\n[t*#]] >= \\n+[*]) \{\
.nr $\\n[*] \\n[**]
.if !"\\$[\\n[*]]"" \{\
.ds * \\$\\n[*]
.substring * -1 -1
.ie "\\*[*]"%" \{\
.ds ** \\$[\\n[*]]
.substring ** 0 -2
.ie \B\\*[**] \
.nr $\\n[*] (\\*[**] * \\n[.l] / 100)
.el \
.tm \\n[.F]:\\n[.c]: Invalid relative cell width `\\*[**]%'.
.\}
.el \{\
.ie \B\\$[\\n[*]] \
.nr $\\n[*] \\$[\\n[*]]
.el \
.tm \\n[.F]:\\n[.c]: Invalid cell width `\\$[\\n[*]]'.
.\}\}
.nr ll\\n[t*#] +\\n[$\\n[*]]
.nr ** \\n[$\\n[*]]
.\}
.if (\\n[ll\\n[t*#]] > \\n[.l]) \
.tm \\n[.F]:\\n[.c]: Table width larger than column width.
.nr ** (0 >? \\n[t*b\\n[t*#]])
.nr * 0 1
.while (\\n[t*cols\\n[t*#]] >= \\n+[*]) \{\
.if \\n[t*b\\n[t*#]] \{\
.nr #* (\\n[ll\\n[t*#]] - (3 * \\n[t*b\\n[t*#]] / 2))
.nr *** (\\n[ll\\n[t*#]] / 2)
.mult31by31 $\\n[*] #* ****
.add31to62 *** **** ****
.div62by31 **** ll\\n[t*#] $\\n[*]
.\}
.nr cll\\n[t*#]*\\n[*] (\\n[$\\n[*]] \
- (2 * \\n[cscp\\n[t*#]]) \
- \\n[b/2\\n[t*#]])
.if !\\n[cll\\n[t*#]*\\n[*]] \{\
.nr #* (\\n[ll\\n[t*#]] - (3 * \\n[t*b\\n[t*#]] / 2))
.nr *** (\\n[#*] / 2)
.nr *h (2 * \\n[cscp\\n[t*#]] + \\n[b/2\\n[t*#]])
.mult31by31 *h ll\\n[t*#] ****
.add31to62 *** **** ****
.div62by31 **** #* *h
.ds * \\n[*]th
.nr *** (\\n[*] % 10)
.if d nth-\\n[***] \
.ds * \\n[*]\\*[nth-\\n[***]]
.tmc \\n[.F]:\\n[.c]: The \\*[*] width value (\\$\\n[*]) is too small.
.tm1 " It should be greater than \\n[*h].
.\}
.nr in\\n[t*#]*\\n[*] \\n[**]
.nr ** +\\n[$\\n[*]]
.\}
..
.de t*dntr
.nr dn 0
.br
.if "\\n[.z]"*t*dummy*" \
.return
.ds #t#r \\n[t*#]*\\n[t*r#\\n[t*#]]
.if \\n[c#\\*[#t#r]] \{\
.di
.nr dn\\$4 \\n[dn]
.if !\\n[rspan\\*[#trc]] \{\
.nr dntr\\*[#t#r] (\\n[dntr\\*[#t#r]] >? \\n[dn])
.if \\$2 \
.nr dntr\\*[#t#r] ((\\n[t*height\\*[#t#r]] \
- (2 * \\n[cscp\\n[t*#]] + \\n[b/2\\n[t*#]])) \
>? \\n[dntr\\*[#t#r]])
.\}\}
.nr c#\\*[#t#r] +1
.nr * \\$2
.while (\\n+[*] <= \\$3) \{\
.if r cspan\\*[#t#r]*\\n[*] \
.nr c#\\*[#t#r] +\\n[cspan\\*[#t#r]*\\n[*]]
.nr cspan\\*[#t#r]*\\n[*] 0
.\}
.ds #trc \\*[#t#r]*\\n[c#\\*[#t#r]]
.if (\\$1 & (\\n[c#\\*[#t#r]] <= \\n[t*cols\\n[t*#]])) \{\
.ds * are
.ds ** columns
.if (\\n-[c#\\*[#t#r]] == 1) \{\
.ds * is
.ds ** column
.\}
.tmc \\n[.F]:\\n[.c]: There \\*[*] only \\n[c#\\*[#t#r]] \\*[**]
.nr * \\n[t*r#\\n[t*#]]
.ds * \\n[*]th
.nr *** (\\n[*] % 10)
.if d nth-\\n[***] \
.ds * \\n[*]\\*[nth-\\n[***]]
.tmc " in the \\*[*] row
.ds * are
.if (\\n[t*cols\\n[t*#]] == 1) \
.ds * is
.tm1 " but \\n[t*cols\\n[t*#]] \\*[*] expected.
.\}
..
.de t*args
.ds t*bgc\\$1 \\*[t*bgc\\$2]
.ds t*fgc\\$1 \\*[t*fgc\\$2]
.ds t*hl\\$1 \\*[t*hl\\$2]
.ds t*vl\\$1 \\*[t*vl\\$2]
.ds t*hal\\$1 \\*[t*hal\\$2]
.ds t*val\\$1 \\*[t*val\\$2]
.ds t*ff\\$1 \\*[t*ff\\$2]
.ds t*fst\\$1 \\*[t*fst\\$2]
.ds t*fsz\\$1 \\*[t*fsz\\$2]
.if "\\*[args]"" \
.return
.t*getarg bgc \\*[args]
.if !"\\*[bgc]"" \{\
.ie m\\*[bgc] \
.ds t*bgc\\$1 \\*[bgc]
.el \{\
.ie "\\*[bgc]"=" \
.ds t*bgc\\$1 =
.el \
.tm \\n[.F]:\\n[.c]: Invalid background color `\\*[bgc]'.
.\}\}
.if "\\*[args]"" \
.return
.t*getarg fgc \\*[args]
.if !"\\*[fgc]"" \{\
.ie m\\*[fgc] \
.ds t*fgc\\$1 \\*[fgc]
.el \{\
.ie "\\*[fgc]"=" \
.ds t*fgc\\$1 =
.el \
.tm \\n[.F]:\\n[.c]: Invalid foreground color `\\*[fgc]'.
.\}\}
.if "\\*[args]"" \
.return
.t*getarg hl \\*[args]
.if !"\\*[hl]"" \
.ds t*hl\\$1 \\*[hl]
.if "\\*[args]"" \
.return
.t*getarg vl \\*[args]
.if !"\\*[vl]"" \
.ds t*vl\\$1 \\*[vl]
.if "\\*[args]"" \
.return
.t*getarg hal \\*[args]
.if !"\\*[hal]"" \{\
.t*index bcrl \\*[hal]
.ie \\n[t*index] \
.ds t*hal\\$1 \\*[hal]
.el \{\
.tmc \\n[.F]:\\n[.c]: Invalid horizontal alignment `\\*[hal]':
.tm1 " must be `b', `c', `l' or `r'.
.\}\}
.if "\\*[args]"" \
.return
.t*getarg val \\*[args]
.if !"\\*[val]"" \{\
.t*index tmb \\*[val]
.ie \\n[t*index] \
.ds t*val\\$1 \\*[val]
.el \{\
.tmc \\n[.F]:\\n[.c]: Invalid vertical alignment `\\*[val]':
.tm1 " must be `t', `m' or `b'.
.\}\}
.if "\\*[args]"" \
.return
.t*getarg ff \\*[args]
.if !"\\*[ff]"" \
.ds t*ff\\$1 \\*[ff]
.if "\\*[args]"" \
.return
.t*getarg fst \\*[args]
.if !"\\*[fst]"" \
.ds t*fst\\$1 \\*[fst]
.if "\\*[args]"" \
.return
.t*getarg fsz \\*[args]
.if !"\\*[fsz]"" \
.ds t*fsz\\$1 \\*[fsz]
..
.de t*hm
.ev t*tbl
.nr ** \\n[.t]
.while !""\\*[t*kept]" \{\
.pops * t*kept
.popr * t*kept
.if (\\n[*] - \\n[**]) \{\
.tm \\n[.F]:\\n[.c]: Table \\*[*] higher than page -- ignored!
.break
.\}
.if (\\n[*] - \\n[.t]) \{\
.ds t*kept \\n[*] \\*[t*kept]
.ds t*kept \\*[*] \\*[t*kept]
.tmc \\n[.F]:\\n[.c]: Remaining table(s),
.tm1 " because not all fit onto this page.
.break
.\}
.t*DI \\*[*]
.\}
.ev
..