summaryrefslogtreecommitdiffstats
path: root/contrib/groff/tmac
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/groff/tmac')
-rw-r--r--contrib/groff/tmac/Makefile.sub97
-rw-r--r--contrib/groff/tmac/X.tmac48
-rw-r--r--contrib/groff/tmac/Xps.tmac46
-rw-r--r--contrib/groff/tmac/a4.tmac12
-rw-r--r--contrib/groff/tmac/an-old.tmac478
-rw-r--r--contrib/groff/tmac/an.tmac3
-rw-r--r--contrib/groff/tmac/andoc.tmac14
-rw-r--r--contrib/groff/tmac/doc-common1258
-rw-r--r--contrib/groff/tmac/doc-ditroff550
-rw-r--r--contrib/groff/tmac/doc-nroff426
-rw-r--r--contrib/groff/tmac/doc-old.tmac1858
-rw-r--r--contrib/groff/tmac/doc-syms880
-rw-r--r--contrib/groff/tmac/doc.tmac6189
-rw-r--r--contrib/groff/tmac/dvi.tmac147
-rw-r--r--contrib/groff/tmac/e.tmac1663
-rw-r--r--contrib/groff/tmac/fixmacros.sed1
-rw-r--r--contrib/groff/tmac/groff_man.man82
-rw-r--r--contrib/groff/tmac/groff_mdoc.man4257
-rw-r--r--contrib/groff/tmac/groff_me.man16
-rw-r--r--contrib/groff/tmac/groff_ms.man17
-rw-r--r--contrib/groff/tmac/groff_mwww.man275
-rw-r--r--contrib/groff/tmac/groff_tmac.man116
-rw-r--r--contrib/groff/tmac/html.tmac47
-rw-r--r--contrib/groff/tmac/hyphen.us4449
-rw-r--r--contrib/groff/tmac/latin1.tmac103
-rw-r--r--contrib/groff/tmac/lbp.tmac15
-rw-r--r--contrib/groff/tmac/lj4.tmac20
-rw-r--r--contrib/groff/tmac/man.local4
-rw-r--r--contrib/groff/tmac/man.tmac3
-rw-r--r--contrib/groff/tmac/mandoc.tmac3
-rw-r--r--contrib/groff/tmac/mdoc.local2
-rw-r--r--contrib/groff/tmac/mdoc.tmac3
-rw-r--r--contrib/groff/tmac/me.tmac3
-rw-r--r--contrib/groff/tmac/ms.tmac3
-rw-r--r--contrib/groff/tmac/mwww.tmac3
-rw-r--r--contrib/groff/tmac/pic.tmac12
-rw-r--r--contrib/groff/tmac/ps.tmac54
-rw-r--r--contrib/groff/tmac/psatk.tmac63
-rw-r--r--contrib/groff/tmac/psfig.tmac89
-rw-r--r--contrib/groff/tmac/psold.tmac61
-rw-r--r--contrib/groff/tmac/pspic.tmac60
-rw-r--r--contrib/groff/tmac/s.tmac1934
-rw-r--r--contrib/groff/tmac/safer.tmac5
-rw-r--r--contrib/groff/tmac/strip.sed10
-rw-r--r--contrib/groff/tmac/trace.tmac29
-rw-r--r--contrib/groff/tmac/troffrc28
-rw-r--r--contrib/groff/tmac/troffrc-end17
-rw-r--r--contrib/groff/tmac/tty-char.tmac204
-rw-r--r--contrib/groff/tmac/tty.tmac50
-rw-r--r--contrib/groff/tmac/www.tmac211
50 files changed, 24456 insertions, 1462 deletions
diff --git a/contrib/groff/tmac/Makefile.sub b/contrib/groff/tmac/Makefile.sub
index be06cc7..954e177 100644
--- a/contrib/groff/tmac/Makefile.sub
+++ b/contrib/groff/tmac/Makefile.sub
@@ -4,24 +4,34 @@ MAN7=\
groff_ms.n \
groff_man.n \
groff_me.n \
- groff_msafer.n \
groff_mdoc.n \
- groff_mdoc.samples.n \
- groff_markup.n
+ groff_mwww.n
NORMALFILES=\
- tmac.mandoc tmac.andoc tmac.pic tmac.ps tmac.psnew tmac.psold tmac.pspic \
- tmac.psatk tmac.dvi tmac.tty tmac.tty-char tmac.X tmac.Xps tmac.latin1 \
- tmac.lj4 eqnrc troffrc troffrc-end tmac.safer tmac.html tmac.markup \
- tmac.arkup tmac.a4 tmac.trace tmac.me tmac.mdoc
-SPECIALFILES=tmac.an tmac.s tmac.man tmac.ms
-STRIPFILES=tmac.e tmac.doc tmac.doc.old
+ mandoc.tmac andoc.tmac an-old.tmac \
+ me.tmac \
+ mdoc.tmac \
+ pic.tmac \
+ a4.tmac \
+ safer.tmac \
+ trace.tmac \
+ ps.tmac psold.tmac pspic.tmac psatk.tmac \
+ dvi.tmac \
+ tty.tmac tty-char.tmac latin1.tmac \
+ X.tmac Xps.tmac \
+ lj4.tmac \
+ html.tmac mwww.tmac www.tmac \
+ eqnrc \
+ troffrc troffrc-end \
+ hyphen.us
+SPECIALFILES=an.tmac man.tmac s.tmac ms.tmac
+STRIPFILES=e.tmac doc.tmac doc-old.tmac
MDOCFILES=doc-common doc-ditroff doc-nroff doc-syms
mdocdir=$(tmacdir)/mdoc
CLEANADD=\
- stamp-strip stamp-wrap stamp-sed tmac.e-s tmac.doc-s tmac.doc.old-s \
- doc-common-s doc-ditroff-s doc-nroff-s doc-syms-s *-wrap \
- tmac.man-sed tmac.ms-sed
+ stamp-wrap stamp-sed *-wrap man.tmac-sed ms.tmac-sed \
+ stamp-strip e.tmac-s doc.tmac-s doc-old.tmac-s \
+ doc-common-s doc-ditroff-s doc-nroff-s doc-syms-s mdoc.local-s
tmac_s_prefix=
tmac_an_prefix=
tmac_wrap=
@@ -29,26 +39,28 @@ sys_tmac_prefix=
all: stamp-strip stamp-wrap stamp-sed
-install_data: $(NORMALFILES) $(SPECIALFILES) \
- stamp-wrap stamp-strip stamp-sed man.local
+install_data: $(NORMALFILES) $(SPECIALFILES) man.local \
+ stamp-strip stamp-wrap stamp-sed
-test -d $(tmacdir) || $(mkinstalldirs) $(tmacdir)
+ -test -d $(systemtmacdir) || $(mkinstalldirs) $(systemtmacdir)
+ -test -d $(localtmacdir) || $(mkinstalldirs) $(localtmacdir)
if test -n "$(tmac_wrap)"; then \
for m in ""$(tmac_wrap); do \
- $(INSTALL_DATA) $$m-wrap $(tmacdir)/tmac.$$m; \
+ $(INSTALL_DATA) $$m-wrap $(systemtmacdir)/$$m.tmac; \
done; \
fi
for f in $(NORMALFILES); do \
rm -f $(tmacdir)/$$f; \
$(INSTALL_DATA) $(srcdir)/$$f $(tmacdir)/$$f; \
done
- -rm -f $(tmacdir)/tmac.$(tmac_s_prefix)s
- $(INSTALL_DATA) $(srcdir)/tmac.s $(tmacdir)/tmac.$(tmac_s_prefix)s
- -rm -f $(tmacdir)/tmac.ms
- $(INSTALL_DATA) tmac.ms-sed $(tmacdir)/tmac.ms
- -rm -f $(tmacdir)/tmac.$(tmac_an_prefix)an
- $(INSTALL_DATA) $(srcdir)/tmac.an $(tmacdir)/tmac.$(tmac_an_prefix)an
- -rm -f $(tmacdir)/tmac.man
- $(INSTALL_DATA) tmac.man-sed $(tmacdir)/tmac.man
+ -rm -f $(tmacdir)/$(tmac_s_prefix)s.tmac
+ $(INSTALL_DATA) $(srcdir)/s.tmac $(tmacdir)/$(tmac_s_prefix)s.tmac
+ -rm -f $(tmacdir)/ms.tmac
+ $(INSTALL_DATA) ms.tmac-sed $(tmacdir)/ms.tmac
+ -rm -f $(tmacdir)/$(tmac_an_prefix)an.tmac
+ $(INSTALL_DATA) $(srcdir)/an.tmac $(tmacdir)/$(tmac_an_prefix)an.tmac
+ -rm -f $(tmacdir)/man.tmac
+ $(INSTALL_DATA) man.tmac-sed $(tmacdir)/man.tmac
for f in $(STRIPFILES); do \
rm -f $(tmacdir)/$$f; \
$(INSTALL_DATA) $$f-s $(tmacdir)/$$f; \
@@ -58,12 +70,13 @@ install_data: $(NORMALFILES) $(SPECIALFILES) \
rm -f $(mdocdir)/$$f; \
$(INSTALL_DATA) $$f-s $(mdocdir)/$$f; \
done
- -test -f $(tmacdir)/man.local || \
- $(INSTALL_DATA) $(srcdir)/man.local $(tmacdir)/man.local
- -rm -f temp
+ -test -f $(localtmacdir)/man.local || \
+ $(INSTALL_DATA) $(srcdir)/man.local $(localtmacdir)/man.local
+ -test -f $(localtmacdir)/mdoc.local || \
+ $(INSTALL_DATA) mdoc.local-s $(localtmacdir)/mdoc.local
-stamp-strip: $(STRIPFILES) $(MDOCFILES)
- for f in $(STRIPFILES) $(MDOCFILES); do \
+stamp-strip: $(STRIPFILES) $(MDOCFILES) mdoc.local
+ for f in $(STRIPFILES) $(MDOCFILES) mdoc.local; do \
rm -f $$f-s; \
sed -f $(srcdir)/strip.sed $(srcdir)/$$f >$$f-s; \
done
@@ -73,14 +86,17 @@ stamp-wrap:
if test -n "$(tmac_wrap)"; then \
for m in ""$(tmac_wrap); do \
rm -f $$m-wrap; \
- echo .cp 1 >$$m-wrap; \
+ if test "$$m" = an; then \
+ echo .do mso andoc.tmac >>$$m-wrap; \
+ fi; \
+ echo .cp 1 >>$$m-wrap; \
echo .so $(sys_tmac_prefix)$$m >>$$m-wrap; \
done; \
fi
touch $@
-stamp-sed: tmac.man tmac.ms
- for f in tmac.man tmac.ms; do \
+stamp-sed: man.tmac ms.tmac
+ for f in man.tmac ms.tmac; do \
rm -f $$f-sed; \
sed -e "s;@TMAC_AN_PREFIX@;$(tmac_an_prefix);g" \
-e "s;@TMAC_S_PREFIX@;$(tmac_s_prefix);g" \
@@ -91,15 +107,20 @@ stamp-sed: tmac.man tmac.ms
uninstall_sub:
-if test -n "$(tmac_wrap)"; then \
for m in ""$(tmac_wrap); do \
- rm -f $(tmacdir)/tmac.$$m; \
+ rm -f $(systemtmacdir)/$$m.tmac; \
done; \
fi
- -for f in $(NORMALFILES) $(STRIPFILES); do rm -f $(tmacdir)/$$f; done
- -rm -f $(tmacdir)/tmac.$(tmac_s_prefix)s
- -rm -f $(tmacdir)/tmac.$(tmac_an_prefix)an
- -rm -f $(tmacdir)/tmac.man $(tmacdir)/tmac.ms
- -if cmp -s $(tmacdir)/man.local $(srcdir)/man.local; then \
- rm -f $(tmacdir)/man.local; \
+ -for f in $(NORMALFILES) $(STRIPFILES); do \
+ rm -f $(tmacdir)/$$f; \
+ done
+ -rm -f $(tmacdir)/$(tmac_s_prefix)s.tmac
+ -rm -f $(tmacdir)/$(tmac_an_prefix)an.tmac
+ -rm -f $(tmacdir)/man.tmac $(tmacdir)/ms.tmac
+ -if cmp -s $(localtmacdir)/man.local $(srcdir)/man.local; then \
+ rm -f $(localtmacdir)/man.local; \
+ fi
+ -if cmp -s $(localtmacdir)/mdoc.local $(srcdir)/mdoc.local; then \
+ rm -f $(localtmacdir)/mdoc.local; \
fi
-for f in $(MDOCFILES); do rm -f $(mdocdir)/$$f; done
-rmdir $(mdocdir)
diff --git a/contrib/groff/tmac/X.tmac b/contrib/groff/tmac/X.tmac
new file mode 100644
index 0000000..464770c
--- /dev/null
+++ b/contrib/groff/tmac/X.tmac
@@ -0,0 +1,48 @@
+.\" X.tmac
+.\"
+.nr _C \n(.C
+.cp 0
+.ftr CW CR
+.ftr C CR
+.ftr CO CI
+.ftr CX CBI
+.ftr H HR
+.ftr HO HI
+.ftr HX HBI
+.ftr NX NBI
+.char \(ru \D'l .5m 0'
+.char \(ul \v'.25m'\D'l .5m 0'\v'-.25m'
+.char \(br \v'.25m'\D'l 0 -1m'\v'.75m'
+.char \(rn \v'-.75m'\D'l .5m 0'\v'.75m'
+.char ~ \v'-.55m'\\s[\\n(.s/2u]\v'.2m'\(ti\v'-.2m'\s0\v'.55m'
+.char ^ \v'-.55m'\\s[\\n(.s/2u]\v'.3m'\(ha\v'-.3m'\s0\v'.55m'
+.if !c\(va .char \(va \o'\(ua\(da'
+.if !c\(em .char \(em --
+.if !c\(en .char \(en \-
+.if !c\(fi .char \(fi fi
+.if !c\(fl .char \(fl fl
+.if !c\(ff .char \(ff ff
+.if !c\(Fi .char \(Fi ffi
+.if !c\(Fl .char \(Fl ffl
+.if !c\(ci .char \(ci \v'-.25m'\h'.05m'\D'c .5m'\h'.05m'\v'.25m'
+.if !c\(sq .char \(sq \h'.05m'\D'l .5m 0'\D'l 0 -.5m'\D'l -.5m 0'\D'l 0 .5m'\h'.55m'
+.if !c\(ga .char \(ga \Z'\v'-.7m'\D'l .22m .18m''\h'.33m'
+.if !c\(dg .char \(dg \Z'\h'.25m'\v'.15m'\D'l 0 -.8m'\v'.2m'\h'-.195m'\
+\D'l .39m 0''\h'.5m'
+.if !c\(dd .char \(dd \Z'\h'.25m'\v'.15m'\D'l 0 -.8m'\v'.2m'\h'-.195m'\
+\D'l .39m 0'\v'.4m'\D'l -.39m 0''\h'.5m'
+.if !c\(lq .char \(lq ``
+.if !c\(rq .char \(rq ''
+.if !c\(Bq .char \(Bq ,,
+.if !c\(OE .char \(OE O\h'-.25m'E
+.if !c\(oe .char \(oe o\h'-.14m'e
+.if !c\(ah .char \(ah \v'-.55m'\s[\En[.s]/2u]v\s0\v'.55m'
+.if !c\(ao .char \(ao \v'-.55m'\s[\En[.s]*6u/10u]\D'c .25m'\s0\v'.55m'
+.if !c\(ho .char \(ho \s[\En[.s]/2u]\v'.4m'c\v'-.4m'\s0
+.if !c\(lh .tr \(lh\(lA
+.if !c\(rh .tr \(rh\(rA
+.if !c\(bq .tr \(bq,
+.if !c\(aq .tr \(aq'
+.if '\*(.T'X100' .char \[radicalex] \h'-\w'\(sr'u'\[radicalex]\h'\w'\(sr'u'
+.if !\n(_C .mso pspic.tmac
+.cp \n(_C
diff --git a/contrib/groff/tmac/Xps.tmac b/contrib/groff/tmac/Xps.tmac
new file mode 100644
index 0000000..ddb037a
--- /dev/null
+++ b/contrib/groff/tmac/Xps.tmac
@@ -0,0 +1,46 @@
+.\" Xps.tmac
+.\"
+.do mso ps.tmac
+.nr _C \n(.C
+.cp 0
+.de Xps-char
+.char \\$1 \Z"\X'ps: invis'\\$2\X'ps: endinvis'"\\$1
+..
+.Xps-char \(bu \fS\(bu\fP
+.Xps-char \(em "\v'-.25m'\h'.05m'\D'l .9m 0'\h'.05m'"
+.Xps-char \(aq '
+.Xps-char \(bq ,
+.Xps-char \(Bq ,,
+.Xps-char \(lq ``
+.Xps-char \(rq ''
+.Xps-char \(OE OE
+.Xps-char \(oe oe
+.Xps-char \(Fn \fS\(Fn\fP
+.Xps-char \(vS \o'\(ahS'
+.Xps-char \(vs \o'\(ahs'
+.Xps-char \(vZ \o'\(ahZ'
+.Xps-char \(vz \o'\(ahz'
+.Xps-char \(/L \o'/L'
+.Xps-char \(/l \o'/l'
+.Xps-char \(:Y \o'\(adY'
+.Xps-char \(a" \(sd
+.Xps-char \(a. \v'-.6m'.
+.Xps-char \(ga "\Z'\v'-.7m'\D'l .22m .18m''\h'.33m'"
+.Xps-char \(ab \v'-.55m'\s'\\\\n(.s*6u/10u'u\s0
+.Xps-char \(ah \v'-.55m'\s[\En[.s]/2u]v\s0\v'.55m'
+.Xps-char \(ao "\v'-.55m'\s[\En[.s]*6u/10u]\D'c .25m'\s0\v'.55m'"
+.Xps-char \(ho \s[\En[.s]/2u]\v'.4m'c\v'-.4m'\s0
+.Xps-char \(.i i
+.Xps-char \(fo <
+.Xps-char \(fc >
+.Xps-char \(OK \s'\\\\n(.s*6u/10u'\e\s0/
+.Xps-char \(tm \v'-.3m'\s'\\\\n(.s*6u/10u'TM\s0\v'.3m'
+.Xps-char \(dd "\Z'\h'.25m'\v'.15m'\D'l 0 -.8m'\v'.2m'\h'-.195m'\
+\D'l .39m 0'\v'.4m'\D'l -.39m 0''\h'.5m'"
+.Xps-char \(dg "\Z'\h'.25m'\v'.15m'\D'l 0 -.8m'\v'.2m'\h'-.195m'\
+\D'l .39m 0''\h'.5m'"
+.Xps-char \(en \-
+.Xps-char \(%0 %\s'\\\\n(.s*6u/10u'\fI0\fP\s0
+.Xps-char \(lh \(->
+.Xps-char \(rh \(<-
+.cp \n(_C
diff --git a/contrib/groff/tmac/a4.tmac b/contrib/groff/tmac/a4.tmac
new file mode 100644
index 0000000..5001939
--- /dev/null
+++ b/contrib/groff/tmac/a4.tmac
@@ -0,0 +1,12 @@
+.\" a4.tmac
+.\"
+.\" Set up groff for A4 paper. Must be called before any other macro
+.\" package. For correct PS output, you must also set the
+.\" `paperlength' keyword in devps/DESC to 841890 in case groff hasn't
+.\" guessed it correctly during configuration.
+.
+.pl 29.7c
+.ll 21c-2i
+.
+.\" for ms
+.if !rLL .nr LL \n[.l]u
diff --git a/contrib/groff/tmac/an-old.tmac b/contrib/groff/tmac/an-old.tmac
new file mode 100644
index 0000000..9ef041f
--- /dev/null
+++ b/contrib/groff/tmac/an-old.tmac
@@ -0,0 +1,478 @@
+.\" an-old.tmac
+.\"
+.\" Copyright (C) 1989, 1990, 1991, 1992, 2001 Free Software Foundation, Inc.
+.\" Written by James Clark (jjc@jclark.com)
+.\"
+.\" This file is part of groff.
+.\"
+.\" 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 2, 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 groff; see the file COPYING. If not, write to the Free Software
+.\" Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+.\"
+.\" -rcR=1 => Create a single, very long page instead of multiple pages.
+.\" Useful for online display. Default in nroff mode.
+.\" Desactivate with -rcR=0.
+.\" -rC1 => Number pages continuously, rather than start each at 1.
+.\" -rD1 => Double-sided printing, ie different odd and even page footers.
+.\" -rPnnn => Number first page nnn.
+.\" -rSxx => Use size `xx'pt (either 10, 11, or 12) for document rather
+.\" than the default size of 10pt.
+.\" -rXnnn => Number pages after nnn as nnna, nnnb, nnnc, ...
+.\"
+.\" The file man.local is loaded at the end. Put local additions there.
+.\" If you need to add things to TH, use `.am TH'.
+.\"
+.
+.if !\n(.g .ab These man macros work only with groff.
+.
+.nr _C \n[.C]
+.cp 0
+.
+.if !r D .nr D 0
+.if !r C .nr C 0
+.if !r S .nr S 10
+.\" we must use consecutive page numbers when using postscript to generate
+.\" html images, and we must not reset the page number at the beginning
+.\" (the `ps4html' register is automatically added to the command line by
+.\" the pre-html preprocessor)
+.if !r ps4html \
+. if r P .pn 0\n[P]
+.if !r cR \{\
+. ie n .nr cR 1
+. el .nr cR 0
+.\}
+.
+.nr an-html 0
+.if '\*(.T'html' .nr an-html 1
+.if \n[an-html] .nr C 1
+.if r ps4html .nr C 1
+.
+.de set-an-margin
+. nr an-margin \\n[IN]
+..
+.
+.\" .TH title section extra1 extra2 extra3
+.de TH
+. if \\n[an-html] \{\
+. HTML-TAG ".tl"
+\\$1
+. \}
+. cp 0
+.
+. de an-init \" We have to do it like this to get multiple man pages right.
+. ds an-title "\\$1
+. ds an-section "\\$2
+. ds an-extra1 "\\$3
+. ie (\\n[.$] > 3) .ds an-extra2 "\\$4
+. el .ds an-extra2 \"Sun Release 4.0
+. ie (\\n[.$] > 4) .ds an-extra3 "\\$5
+. el .ds an-extra3 \"System Programmer's Manual
+. ds an-init
+\\..
+.
+. DT
+.
+. nr PS 10z \" default point size
+. nr PS-SS 10z
+. nr PS-SH 10.95z
+. nr VS 12p
+.
+. \" use sizes similar to LaTeX
+. if t \{\
+. ie (\\n[S] == 11) \{\
+. nr PS 10.95z
+. nr PS-SS 10.95z
+. nr PS-SH 12z
+. nr VS 13.6p
+. \}
+. el \{\
+. if (\\n[S] == 12) \{\
+. nr PS 12z
+. nr PS-SS 12z
+. nr PS-SH 14.4z
+. nr VS 14.5p
+. \}
+. \}
+. \}
+.
+. ps \\n[PS]u
+. vs \\n[VS]u
+.
+. nr IN 7.2n
+. PD
+. nr SN 3n \" the indentation of sub-sub-headings relative to sub-headings
+. nr an-level 1
+. set-an-margin
+. nr an-prevailing-indent \\n[IN]
+. nr an-tag-sep 1n
+.
+. nr an-no-space-flag 0
+. nr an-break-flag 0
+. nr an-div? 0
+.
+. ie \\n[cR] \
+. an-header
+. el \{\
+. wh 0 an-header
+. wh -1i an-footer
+. wh -.5i an-p-footer
+.
+. if (\\n[nl] > 0) \{\
+. ie \\n[C] .bp (\\n[%] + 1)
+. el .bp 1
+. \}
+. \}
+..
+.
+.de DT
+. ta T .5i \" This sets tabs every .5 inches
+..
+.
+.de PD
+. ie \\n[.$] .nr PD (v;\\$1)
+. el .nr PD (.4v >? \n[.V])
+..
+.
+.de an-header
+. an-init
+. ev 1
+. ps \\n[PS]u
+. vs \\n[VS]u
+. ie \\n[an-html] \
+. tl ''''
+. el \{\
+. if !\\n[cR] \
+. sp .5i
+. tl '\\*[an-title](\\*[an-section])'\\*[an-extra3]'\\*[an-title](\\*[an-section])'
+. ie !\\n[cR] \
+. sp |1i
+. el \
+. sp .5i
+. \}
+. ev
+. ns
+..
+.
+.de an-footer
+' bp
+..
+.
+.af an-page-letter a
+.
+.de an-p-footer
+. ev 1
+. ps \\n[PS]u
+. vs \\n[VS]u
+. ie \\n[an-html] \{\
+. ds an-page-string
+. ds an-extra1
+. ds an-extra2
+. \}
+. el \{\
+. ie r X \{\
+. if (\\n[%] > \\n[X]) \{\
+. nr an-page-letter (\\n[%] - \\n[X])
+. ds an-page-string \\n[X]\\n[an-page-letter]
+. \}
+. \}
+. el \{\
+. ie \\n[cR] \
+. ds an-page-string "\\*[an-title](\\*[an-section])
+. el \
+. ds an-page-string \\n[%]
+. \}
+. \}
+. ie \\n[D] \{\
+. if o .tl '\\*[an-extra2]'\\*[an-extra1]'\\*[an-page-string]'
+. if e .tl '\\*[an-page-string]'\\*[an-extra1]'\\*[an-extra2]'
+. \}
+. el \
+. tl '\\*[an-extra2]'\\*[an-extra1]'\\*[an-page-string]'
+. ev
+..
+.
+.de an-end
+. nr % 1
+. pl +3v
+. fl
+. sp 3
+. an-p-footer
+. pl \\n[nl]u
+..
+.
+.if \n[cR] .em an-end
+.
+.de SH
+. sp \\n[PD]u
+. nr an-level 1
+. set-an-margin
+. nr an-prevailing-indent \\n[IN]
+. fi
+. in \\n[an-margin]u
+. ti 0
+. HTML-TAG ".NH \\n[an-level]"
+. it 1 an-trap
+. nr an-no-space-flag 1
+. nr an-break-flag 1
+. ps \\n[PS-SH]u
+. ft B
+. if !\\n[cR] .ne (2v + 1u)
+. if \\n[.$] \&\\$*
+..
+.
+.de SS
+. sp \\n[PD]u
+. nr an-level 1
+. set-an-margin
+. nr an-prevailing-indent \\n[IN]
+. fi
+. in \\n[IN]u
+. ti \\n[SN]u
+. it 1 an-trap
+. nr an-no-space-flag 1
+. nr an-break-flag 1
+. ps \\n[PS-SS]u
+. ft B
+. if !\\n[cR] .ne (2v + 1u)
+. if \\n[.$] \&\\$*
+..
+.
+.de B
+. it 1 an-trap
+. ft B
+. if \\n[.$] \&\\$*
+..
+.
+.de I
+. it 1 an-trap
+. ft I
+. if \\n[.$] \&\\$*
+..
+.
+.de SM
+. it 1 an-trap
+. ps -1
+. if \\n[.$] \&\\$*
+..
+.
+.de SB
+. it 1 an-trap
+. ps -1
+. ft B
+. if \\n[.$] \&\\$*
+..
+.
+.de TP
+. sp \\n[PD]u
+. if \\n[.$] .nr an-prevailing-indent (n;\\$1)
+. it 1 an-trap
+. if !\\n[an-div?] .di an-div
+. ie \\n[an-html] .in \\n[an-margin]u
+. el \{\
+. in 0
+. ll -\\n[an-margin]u
+. \}
+. nr an-div? 1
+..
+.
+.de an-trap
+. ft R
+. ps \\n[PS]u
+. vs \\n[VS]u
+. if \\n[an-break-flag] \{\
+. br
+. nr an-break-flag 0
+. \}
+. if \\n[an-no-space-flag] \{\
+. ns
+. nr an-no-space-flag 0
+. \}
+. if \\n[an-div?] .an-do-tag
+..
+.
+.de an-do-tag
+. nr an-div? 0
+. br
+. ll
+. di
+. ie (\\n[dl] + \\n[an-tag-sep] > \\n[an-prevailing-indent]) \{\
+. in \\n[an-margin]u
+. if !\\n[cR] .ne (2v + 1u)
+. an-div
+. br
+. in (\\n[an-margin]u + \\n[an-prevailing-indent]u)
+. \}
+. el \{\
+. in (\\n[an-margin]u + \\n[an-prevailing-indent]u)
+. ti -\\n[an-prevailing-indent]u
+. chop an-div
+. if !\\n[cR] .ne (1v + 1u)
+\\*[an-div]\\h'|\\n[an-prevailing-indent]u'\c
+. \}
+..
+.
+.de LP
+. br
+. sp \\n[PD]u
+. ps \\n[PS]u
+. vs \\n[VS]u
+. ft R
+. in \\n[an-margin]u
+. nr an-prevailing-indent \\n[IN]
+..
+.
+.als PP LP
+.als P LP
+.
+.de IP
+. ie !\\n[.$] \{\
+. ps \\n[PS]u
+. vs \\n[VS]u
+. ft R
+. sp \\n[PD]u
+. if !\\n[cR] .ne (1v + 1u)
+. in (\\n[an-margin]u + \\n[an-prevailing-indent]u)
+. \}
+. el \{\
+. ie (\\n[.$] - 1) .TP "\\$2"
+. el .TP
+\&\\$1
+. \}
+..
+.
+.de HP
+. ps \\n[PS]u
+. vs \\n[VS]u
+. ft R
+. sp \\n[PD]u
+. if !\\n[cR] .ne (1v + 1u)
+. if \\n[.$] .nr an-prevailing-indent (n;\\$1)
+. in (\\n[an-margin]u + \\n[an-prevailing-indent]u)
+. ti \\n[an-margin]u
+..
+.
+.ds an-empty \" this is referenced to avoid looping on eg .RB ( \\ )
+.
+.de RI
+. if \\n[.$] \{\
+. ds an-result \&\\$1
+. shift
+. while (\\n[.$] >= 2) \{\
+. as an-result \,\f[I]\\$1\f[R]\/\\$2\\*[an-empty]
+. shift 2
+. \}
+. if \\n[.$] .as an-result \,\f[I]\\$1\f[R]
+\\*[an-result]
+. \}
+..
+.
+.de IR
+. if \\n[.$] \{\
+. ds an-result \&\f[I]\\$1\f[R]
+. shift
+. while (\\n[.$] >= 2) \{\
+. as an-result \/\\$1\f[I]\,\\$2\f[R]
+. shift 2
+. \}
+. if \\n[.$] .as an-result \/\\$1
+\\*[an-result]
+. \}
+..
+.
+.de IB
+. if \\n[.$] \{\
+. ds an-result \&\f[I]\\$1
+. shift
+. while (\\n[.$] >= 2) \{\
+. as an-result \/\f[B]\\$1\f[I]\,\\$2\\*[an-empty]
+. shift 2
+. \}
+. if \\n[.$] .as an-result \/\f[B]\\$1
+\\*[an-result]
+. ft R
+. \}
+..
+.
+.de BI
+. if \\n[.$] \{\
+. ds an-result \&\f[B]\\$1
+. shift
+. while (\\n[.$] >= 2) \{\
+. as an-result \,\f[I]\\$1\f[B]\/\\$2\\*[an-empty]
+. shift 2
+. \}
+. if \\n[.$] .as an-result \,\f[I]\\$1
+\\*[an-result]
+. ft R
+. \}
+..
+.
+.de RB
+. ds an-result \&
+. while (\\n[.$] >= 2) \{\
+. as an-result \f[R]\\$1\f[B]\\$2\\*[an-empty]
+. shift 2
+. \}
+. if \\n[.$] .as an-result \f[R]\\$1
+\\*[an-result]
+. ft R
+..
+.
+.de BR
+. ds an-result \&
+. while (\\n[.$] >= 2) \{\
+. as an-result \f[B]\\$1\f[R]\\$2\\*[an-empty]
+. shift 2
+. \}
+. if \\n[.$] .as an-result \f[B]\\$1
+\\*[an-result]
+. ft R
+..
+.
+.de RS
+. br
+. nr an-saved-margin\\n[an-level] \\n[an-margin]
+. nr an-saved-prevailing-indent\\n[an-level] \\n[an-prevailing-indent]
+. ie \\n[.$] .nr an-margin +(n;\\$1)
+. el .nr an-margin +\\n[an-prevailing-indent]
+. in \\n[an-margin]u
+. nr an-prevailing-indent \\n[IN]
+. nr an-level +1
+..
+.
+.de RE
+. br
+. ie \\n[.$] .nr an-level ((;\\$1) <? \\n[an-level])
+. el .nr an-level -1
+. nr an-level (1 >? \\n[an-level])
+. nr an-margin \\n[an-saved-margin\\n[an-level]]
+. nr an-prevailing-indent \\n[an-saved-prevailing-indent\\n[an-level]]
+. in \\n[an-margin]u
+..
+.
+.ds S \s[\\n[PS]]
+.ie c\[rg] .ds R \[rg]
+.el .ds R (Reg.)
+.ie c\[tm] .ds Tm \[tm]
+.el .ds Tm (TM)
+.ds lq \(lq
+.ds rq \(rq
+.
+.if !\n[an-html] .hy 14
+.
+.\" Load local modifications.
+.mso man.local
+.
+.cp \n[_C]
+.
+.\" end of an-old.tmac
diff --git a/contrib/groff/tmac/an.tmac b/contrib/groff/tmac/an.tmac
new file mode 100644
index 0000000..2e3c243
--- /dev/null
+++ b/contrib/groff/tmac/an.tmac
@@ -0,0 +1,3 @@
+.\" an.tmac
+.\"
+.do mso andoc.tmac
diff --git a/contrib/groff/tmac/andoc.tmac b/contrib/groff/tmac/andoc.tmac
new file mode 100644
index 0000000..f6a16db
--- /dev/null
+++ b/contrib/groff/tmac/andoc.tmac
@@ -0,0 +1,14 @@
+.\" andoc.tmac
+.\"
+.\" Load either an-old.tmac or doc.tmac.
+.if !\n(.g .ab These macros require groff.
+.de Dd
+.rm Dd
+.do mso doc.tmac
+\\*(Dd\\
+..
+.de TH
+.rm TH
+.do mso an-old.tmac
+\\*(TH\\
+..
diff --git a/contrib/groff/tmac/doc-common b/contrib/groff/tmac/doc-common
index 1be1959..8e788eb 100644
--- a/contrib/groff/tmac/doc-common
+++ b/contrib/groff/tmac/doc-common
@@ -1,5 +1,5 @@
-.\" Copyright (c) 1991 The Regents of the University of California.
-.\" All rights reserved.
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
@@ -11,8 +11,8 @@
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
@@ -29,422 +29,988 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)doc-common 5.7 (Berkeley) 8/5/91
+.\" @(#)doc-common 8.1 (Berkeley) 06/08/93
.\"
.\" %beginstrip%
+.
+.
+.\" Macro Identifiers. For each user macro a corresponding register with
+.\" the same name must exist. Its value must not be zero.
+.
.nr %A 1
+.nr %B 1
+.nr %D 1
.nr %J 1
.nr %N 1
.nr %O 1
+.nr %P 1
+.nr %Q 1
.nr %R 1
.nr %T 1
.nr %V 1
-.nr Ad 12n
.nr Ac 3
+.nr Ad 12n
+.nr An 12n
.nr Ao 12n
.nr Ap 2
-.nr An 12n
.nr Aq 12n
.nr Ar 12n
+.nr At 1
.nr Bc 3
+.nr Bf 8n\" ?
+.nr Bk 8n\" ?
.nr Bl 1
.nr Bo 12n
.nr Bq 12n
-.nr Bx 12n
+.nr Brc 3
+.nr Bro 12n
+.nr Brq 12n
+.nr Bsx 1
+.nr Bt 8n\" ?
+.nr Bx 1
.nr Cd 12n
.nr Cm 10n
-.nr Co 15n
-.nr Cx 20n
+.nr D1 8n\" ?
.nr Dc 3
-.nr Do 10n
-.nr Dq 12n
-.nr Ds 6n
+.nr Dl 8n\" ?
+.nr Dt 8n\" ?
+.nr Do 12n
.nr Dq 12n
+.nr Ds 6n\" many manpages still use this as a -width value
.nr Dv 12n
-.nr tI \n(Dsu
.nr Ec 3
+.nr Ef 8n\" ?
+.nr Ek 8n\" ?
.nr El 1
+.nr Em 10n
+.nr En 12n
.nr Eo 12n
.nr Eq 12n
-.nr Em 10n
-.nr Er 12n
+.nr Er 17n
+.nr Es 12n
.nr Ev 15n
-.nr Ex 10n
.nr Fa 12n
-.nr Fl 10n
.nr Fc 3
-.nr Fo 16n
+.nr Fd 12n\" ?
+.nr Fl 10n
.nr Fn 16n
-.nr Hl 1
-.nr I1 6n
-.nr I2 12n
-.nr I3 18n
+.nr Fo 16n
+.nr Fr 12n\" ?
+.nr Ft 8n\" ?
+.nr Fx 1
.nr Ic 10n
+.nr In 12n\" ?
+.nr It 8n\" ?
+.nr Lb 11n
.nr Li 16n
+.nr Lk 6n\" ?
+.nr Lp 8n\" ?
+.nr Me 6n
.nr Ms 6n
+.nr Mt 6n\" ?
+.nr Nd 8n\" ?
.nr Nm 10n
.nr No 12n
.nr Ns 2
-.nr Oo 10n
+.nr Nx 1
.nr Oc 3
+.nr Oo 10n
.nr Op 14n
+.nr Os 6n\" ?
+.nr Ox 1
.nr Pa 32n
-.nr Pf 12n
.nr Pc 3
+.nr Pf 12n
.nr Po 12n
+.nr Pp 8n\" ?
.nr Pq 12n
-.nr Ql 16n
.nr Qc 3
+.nr Ql 16n
.nr Qo 12n
.nr Qq 12n
+.nr Rv 1
.nr Sc 3
+.nr Sh 8n
+.nr Sm 8n\" ?
.nr So 12n
.nr Sq 12n
-.nr Sy 6n
+.nr Ss 8n
+.nr St 8n\" ?
.nr Sx 16n
-.nr Ra 1
-.nr Rj 1
-.nr Rn 1
-.nr Ro 1
-.nr Rr 1
-.nr Rt 1
-.nr Rv 1
+.nr Sy 6n
+.nr Ta 2
.nr Tn 10n
-.nr Ta 1
-.nr Tv 1
-.nr Tx 22n
-.nr Ux 10n
+.nr Ud 8n\" ?
+.nr Ux 1
.nr Va 12n
+.nr Vt 8n\" ?
.nr Xc 3
.nr Xo 1
.nr Xr 10n
-.nr Yr \n(yr+1900
-.ds sV \& \&
-.ds hV \&\ \&
-.ds iV \& \&
-.ds tV \&\\t\&
-.\" Punctuation values (3 = closing punctuation, 4 = opening)
-.nr z. 3
-.nr z, 3
-.nr z: 3
-.nr z; 3
-.nr z( 4
-.nr z) 3
-.nr z[ 4
-.nr z] 3
-.\" Matching pairs
-.ds z( z)
-.ds z[ z]
-.ds z< z>
-.\" This is disgusting, troff not parse ``if'' stmt properly
-.nr z0 0
-.nr z1 0
-.nr z2 0
-.nr z3 0
-.nr z4 0
-.nr z5 0
-.nr z6 0
-.nr z7 0
-.nr z8 0
-.nr z9 0
-.nr z# 0
-.\" Header assembly macros
+.
+.
+.\" requests which must be processed after the closing delimiter of `Op'
+.\" and friends
+.ds doc-after-Ao
+.ds doc-after-Bo
+.ds doc-after-Bro
+.ds doc-after-Do
+.ds doc-after-Eo
+.ds doc-after-Fo
+.ds doc-after-Ns
+.ds doc-after-Oo
+.ds doc-after-Po
+.ds doc-after-Qo
+.ds doc-after-So
+.ds doc-after-Xo
+.
+.
+.nr doc-display-indent 6n
+.
+.
+.\" space strings
+.
+.ds doc-soft-space " \"
+.ds doc-hard-space \~
+.ds doc-tab \t
+.
+.
+.eo
+.
+.
+.\" punctuation values (suffix=3, prefix = 4)
+.
+.nr doc-punct. 3
+.nr doc-punct, 3
+.nr doc-punct: 3
+.nr doc-punct; 3
+.nr doc-punct( 4
+.nr doc-punct) 3
+.nr doc-punct[ 4
+.nr doc-punct] 3
+.nr doc-punct? 3
+.nr doc-punct! 3
+.
+.
+.\" header assembly macros
+.
+.\" NS doc-document-title global string
+.\" NS the title of the manual page
+.
+.ds doc-document-title UNTITLED
+.
+.
+.\" NS doc-volume global string
+.\" NS the volume where the manual page belongs to
+.
+.ds doc-volume LOCAL
+.
+.
+.\" NS doc-section global string
+.\" NS the manual section
+.
+.ds doc-section Null
+.
+.
+.\" NS Dt user macro (not parsed, not callable)
+.\" NS document title
+.\" NS
+.\" NS modifies:
+.\" NS doc-document-title
+.\" NS doc-section
+.\" NS doc-volume
+.\" NS
+.\" NS local variables:
+.\" NS doc-volume-as-XXX
+.\" NS doc-volume-ds-XXX
+.\" NS
+.\" NS width register `Dt' set above
+.
+.\" an alternative, more detailed scheme for naming the manual sections
+.\"
+.ds doc-volume-ds-1 System General Commands Manual
+.ds doc-volume-ds-2 System Calls Manual
+.ds doc-volume-ds-3 System Library Functions Manual
+.ds doc-volume-ds-4 System Kernel Interfaces Manual
+.ds doc-volume-ds-5 System File Formats Manual
+.ds doc-volume-ds-6 System Games Manual
+.ds doc-volume-ds-7 System Miscellaneous Information Manual
+.ds doc-volume-ds-8 System Manager's Manual
+.ds doc-volume-ds-9 System Kernel Developer's Manual
+.
+.ds doc-volume-ds-USD System User's Supplementary Documents
+.ds doc-volume-ds-PS1 System Programmer's Supplementary Documents
+.ds doc-volume-ds-AMD System Ancestral Manual Documents
+.ds doc-volume-ds-SMM System Manager's Manual
+.ds doc-volume-ds-URM System Reference Manual
+.ds doc-volume-ds-PRM System Programmer's Manual
+.ds doc-volume-ds-KM System Kernel Manual
+.ds doc-volume-ds-IND System Manual Master Index
+.ds doc-volume-ds-LOCAL System Local Manual
+.ds doc-volume-ds-CON System Contributed Software Manual
+.
+.als doc-volume-ds-MMI doc-volume-ds-IND
+.als doc-volume-ds-LOC doc-volume-ds-LOCAL
+.
+.ds doc-volume-as-alpha (Alpha Architecture)
+.als doc-volume-as-Alpha doc-volume-as-alpha
+.ds doc-volume-as-amiga (Amiga Architecture)
+.ds doc-volume-as-arc (Arc Architecture)
+.ds doc-volume-as-arm26 (ARM26 Architecture)
+.ds doc-volume-as-arm32 (ARM32 Architecture)
+.ds doc-volume-as-atari (Atari Architecture)
+.ds doc-volume-as-bebox (BEbox Architecture)
+.ds doc-volume-as-cobalt (Cobalt Architecture)
+.ds doc-volume-as-evbsh3 (Evbsh3 Architecture)
+.ds doc-volume-as-hp300 (HP300 Architecture)
+.ds doc-volume-as-hpcmips (HPcmips Architecture)
+.ds doc-volume-as-i386 (i386 Architecture)
+.ds doc-volume-as-luna68k (luna68k Architecture)
+.ds doc-volume-as-m68k (m68k Architecture)
+.ds doc-volume-as-mac68k (mac68k Architecture)
+.ds doc-volume-as-macppc (macppc Architecture)
+.ds doc-volume-as-mips (MIPS Architecture)
+.ds doc-volume-as-mmeye (mmeye Architecture)
+.ds doc-volume-as-mvme68k (mvme68k Architecture)
+.ds doc-volume-as-news68k (news68k Architecture)
+.ds doc-volume-as-newsmips (newsmips Architecture)
+.ds doc-volume-as-next68k (next68k Architecture)
+.ds doc-volume-as-ofppc (ofppc Architecture)
+.ds doc-volume-as-pc532 (pc532 Architecture)
+.ds doc-volume-as-pmax (pmax Architecture)
+.ds doc-volume-as-powerpc (powerpc Architecture)
+.ds doc-volume-as-prep (prep Architecture)
+.ds doc-volume-as-sgimips (sgimips Architecture)
+.ds doc-volume-as-sh3 (sh3 Architecture)
+.ds doc-volume-as-sparc (SPARC Architecture)
+.ds doc-volume-as-sparc64 (sparc64 Architecture)
+.ds doc-volume-as-sun3 (sun3 Architecture)
+.ds doc-volume-as-tahoe (Tahoe Architecture)
+.ds doc-volume-as-vax (VAX Architecture)
+.ds doc-volume-as-x68k (x68k Architecture)
+.
.de Dt
-.ds dT UNTITLED
-.ds vT LOCAL
-.ds cH Null
-.if !"\\$1"" .ds dT \\$1
-.if !"\\$2"" \{\
-. ds cH \\$2
-.\" . if "\\$3"" \{\
-. if \\$2>=1 .if \\$2<=8 \{\
-. ds vT System Reference Manual
-. if \\$2>1 .if \\$2<6 .ds vT System Programmer's Manual
-. if "\\$2"8" .ds vT System Manager's Manual
-. nr sN \\$2
-. \}
-. if "\\$2"unass" .ds vT DRAFT
-. if "\\$2"draft" .ds vT DRAFT
-. if "\\$2"paper" .ds vT UNTITLED
-.\" . \}
-.\}
-.if !"\\$3"" \{\
-. if "\\$3"USD" .ds vT User's Supplementary Documents
-. if "\\$3"PS1" .ds vT Programmers's Supplementary Documents
-. if "\\$3"AMD" .ds vT Ancestral Manual Documents
-. if "\\$3"SMM" .ds vT System Manager's Manual
-. if "\\$3"URM" .ds vT Reference Manual
-. if "\\$3"PRM" .ds vT Programmers's Manual
-. if "\\$3"IND" .ds vT Manual Master Index
-.\" . if "\\$3"CON" .ds vT Contributed Software Manual
-.\" . if "\\$3"IMP" .ds vT Implementation Notes
-.\" . if "\\$3"HOW" .ds vT How Pocket Manual
-. if "\\$3"LOCAL" .ds vT Local Manual
-. if "\\$3"tahoe" .as vT \ (Tahoe Architecture)
-. if "\\$3"vax" .as vT \ (VAX Architecture)
-. if "\\$3"hp300" .as vT \ (HP300 Architecture)
-. if "\\*(vT"LOCAL" .ds vT \\$3
-.\}
+. \" reset default arguments
+. ds doc-document-title UNTITLED
+. ds doc-volume LOCAL
+. ds doc-section Null
+.
+. if !"\$1"" \
+. ds doc-document-title "\$1
+.
+. if !"\$2"" \{\
+. ds doc-section \$2
+. ie \B\$2 \{\
+. if ((\$2 >= 1) & (\$2 <= 9)) \{\
+. ds doc-volume "\*[doc-volume-ds-URM]
+. ie d doc-volume-ds-\$2 \
+. ds doc-volume "\*[doc-volume-ds-\$2]
+. el \{ .ie ((\$2 > 1) & (\$2 < 6)) \
+. ds doc-volume "\*[doc-volume-ds-PRM]
+. el \{ .ie (\$2 == 8) \
+. ds doc-volume "\*[doc-volume-ds-SMM]
+. el \{ .if (\$2 == 9) \
+. ds doc-volume "\*[doc-volume-ds-KM]
+. \}\}\}\}\}
+. el \{ .ie "\$2"unass" .ds doc-volume DRAFT
+. el \{ .ie "\$2"draft" .ds doc-volume DRAFT
+. el \{ .ie "\$2"paper" .ds doc-volume UNTITLED
+. el \
+. tm mdoc warning: .Dt: unknown section `\$2' (#\n[.c])
+. \}\}\}\}
+.
+. if \A\$3 \{\
+. if d doc-volume-ds-\$3 \
+. ds doc-volume "\*[doc-volume-ds-\$3]
+.
+. if d doc-volume-as-\$3 \
+. as doc-volume " \*[doc-volume-as-\$3]
+. \}
+.
+. if !"\$3"" \
+. if "\*[doc-volume]"LOCAL" \
+. ds doc-volume \$3
..
-.\" NS Os macro - Operating System (behaviour changes after first call)
-.\" . ds vT \f(CODRAFT\fP\ \ \-\-\ \ \\*(vT\ \ \-\-\ \ \f(CODRAFT
-.\" . ds dD \f(CODRAFT\fP\ \ \-\-\ \ \\*(dD\ \ \-\-\ \ \f(CODRAFT
-.\" .ds vT \s+4\f(CODRAFT\fP\s-4\ \ \-\-\ \ \\*(vT\ \ \-\-\ \ \s+4\f(CODRAFT\s-4
-.\" .ds dD \s+4\f(CODRAFT\fP\s-4\ \ \-\-\ \ \\*(dD\ \ \-\-\ \ \s+4\f(CODRAFT\s-4
+.
+.
+.\" NS doc-operating-system global string
+.\" NS the exact version of the operating system
+.\" NS
+.\" NS override this in `mdoc.local', if necessary
+.
+.ds doc-operating-system BSD
+.
+.
+.\" NS Os user macro (not parsed, not callable)
+.\" NS operating system
+.\" NS
+.\" NS modifies:
+.\" NS doc-operating-system
+.\" NS
+.\" NS local variables:
+.\" NS doc-operating-system-XXX-XXX
+.\" NS
+.\" NS width register `Os' set above
+.
+.ds doc-operating-system-ATT-7 7th\~Edition
+.als doc-operating-system-ATT-7th doc-operating-system-ATT-7
+.ds doc-operating-system-ATT-3 System\~III
+.als doc-operating-system-ATT-III doc-operating-system-ATT-3
+.ds doc-operating-system-ATT-V System\~V
+.ds doc-operating-system-ATT-V.2 System\~V Release\~2
+.ds doc-operating-system-ATT-V.3 System\~V Release\~3
+.ds doc-operating-system-ATT-V.4 System\~V Release\~4
+.
+.ds doc-operating-system-BSD-3 3rd\~Berkeley Distribution
+.ds doc-operating-system-BSD-4 4th\~Berkeley Distribution
+.ds doc-operating-system-BSD-4.1 4.1\~Berkeley Distribution
+.ds doc-operating-system-BSD-4.2 4.2\~Berkeley Distribution
+.ds doc-operating-system-BSD-4.3 4.3\~Berkeley Distribution
+.ds doc-operating-system-BSD-4.3T 4.3-Tahoe Berkeley Distribution
+.ds doc-operating-system-BSD-4.3R 4.3-Reno Berkeley Distribution
+.als doc-operating-system-BSD-4.3t doc-operating-system-BSD-4.3T
+.als doc-operating-system-BSD-4.3r doc-operating-system-BSD-4.3R
+.ds doc-operating-system-BSD-4.4 4.4BSD
+.
+.ds doc-operating-system-NetBSD-0.8 0.8
+.ds doc-operating-system-NetBSD-0.8a 0.8A
+.ds doc-operating-system-NetBSD-0.9 0.9
+.ds doc-operating-system-NetBSD-0.9a 0.9A
+.ds doc-operating-system-NetBSD-1.0 1.0
+.ds doc-operating-system-NetBSD-1.0a 1.0A
+.ds doc-operating-system-NetBSD-1.1 1.1
+.ds doc-operating-system-NetBSD-1.2 1.2
+.ds doc-operating-system-NetBSD-1.2a 1.2A
+.ds doc-operating-system-NetBSD-1.2b 1.2B
+.ds doc-operating-system-NetBSD-1.2c 1.2C
+.ds doc-operating-system-NetBSD-1.2d 1.2D
+.ds doc-operating-system-NetBSD-1.2e 1.2E
+.ds doc-operating-system-NetBSD-1.3 1.3
+.ds doc-operating-system-NetBSD-1.3a 1.3A
+.ds doc-operating-system-NetBSD-1.4 1.4
+.ds doc-operating-system-NetBSD-1.5 1.5
+.
+.ds doc-operating-system-FreeBSD-1.0 1.0
+.ds doc-operating-system-FreeBSD-1.1 1.1
+.ds doc-operating-system-FreeBSD-1.1.5 1.1.5
+.ds doc-operating-system-FreeBSD-1.1.5.1 1.1.5.1
+.ds doc-operating-system-FreeBSD-2.0 2.0
+.ds doc-operating-system-FreeBSD-2.0.5 2.0.5
+.ds doc-operating-system-FreeBSD-2.1 2.1
+.ds doc-operating-system-FreeBSD-2.1.5 2.1.5
+.ds doc-operating-system-FreeBSD-2.1.6 2.1.6
+.ds doc-operating-system-FreeBSD-2.1.7 2.1.7
+.ds doc-operating-system-FreeBSD-2.2 2.2
+.ds doc-operating-system-FreeBSD-2.2.1 2.2.1
+.ds doc-operating-system-FreeBSD-2.2.2 2.2.2
+.ds doc-operating-system-FreeBSD-2.2.5 2.2.5
+.ds doc-operating-system-FreeBSD-2.2.6 2.2.6
+.ds doc-operating-system-FreeBSD-2.2.7 2.2.7
+.ds doc-operating-system-FreeBSD-2.2.8 2.2.8
+.ds doc-operating-system-FreeBSD-3.0 3.0
+.ds doc-operating-system-FreeBSD-3.1 3.1
+.ds doc-operating-system-FreeBSD-3.2 3.2
+.ds doc-operating-system-FreeBSD-3.3 3.3
+.ds doc-operating-system-FreeBSD-3.4 3.4
+.ds doc-operating-system-FreeBSD-3.5 3.5
+.ds doc-operating-system-FreeBSD-4.0 4.0
+.ds doc-operating-system-FreeBSD-4.1 4.1
+.ds doc-operating-system-FreeBSD-4.1.1 4.1.1
+.ds doc-operating-system-FreeBSD-4.2 4.2
+.ds doc-operating-system-FreeBSD-4.3 4.3
+.ds doc-operating-system-FreeBSD-5.0 5.0
+.
.de Os
-.ds oS Null
-.if "\\$1"" \{\
-. ds oS BSD Experimental
-.\}
-.if "\\$2"" \{\
-. ds aa Non-Null
-.\}
-.if "\\$1"ATT" \{\
-. ds oS AT&T
-. if "\\$2"" .as oS \0UNIX
-. if "\\$2"7th" .as oS \07th Edition
-. if "\\$2"7" .as oS \07th Edition
-. if "\\$2"III" .as oS \0System III
-. if "\\$2"3" .as oS \0System III
-. if "\\$2"V" .as oS \0System V
-. if "\\$2"V.2" .as oS \0System V Release 2
-. if "\\$2"V.3" .as oS \0System V Release 3
-. if "\\$2"V.4" .as oS \0System V Release 4
-.\}
-.if "\\$1"BSD" \{\
-. if "\\$2"3" .ds oS 3rd Berkeley Distribution
-. if "\\$2"4" .ds oS 4th Berkeley Distribution
-. if "\\$2"4.1" .ds oS 4.1 Berkeley Distribution
-. if "\\$2"4.2" .ds oS 4.2 Berkeley Distribution
-. if "\\$2"4.3" .ds oS 4.3 Berkeley Distribution
-. if "\\$2"4.3T" .ds oS 4.3-Tahoe Berkeley Distribution
-. if "\\$2"4.3R" .ds oS 4.3-Reno Berkeley Distribution
-. if "\\$2"4.3t" .ds oS 4.3-Tahoe Berkeley Distribution
-. if "\\$2"4.3r" .ds oS 4.3-Reno Berkeley Distribution
-. if "\\$2"4.4" .ds oS BSD Experimental
-.\}
-.if "\\*(oS"Null" .ds oS \0\\$1
-.if "\\*(aa"Non-Null" .as oS \0\\$2
-.rm aa
+. if "\$1"" \
+. return
+.
+. ie "\$1"ATT" \{\
+. ds doc-operating-system AT&T
+. if \A\$2 \{\
+. ie d doc-operating-system-ATT-\$2 \
+. as doc-operating-system " \*[doc-operating-system-ATT-\$2]
+. el \
+. as doc-operating-system " UNIX
+. \}\}
+. el \{ .ie "\$1"BSD" \{\
+. if \A\$2 \{\
+. ie d doc-operating-system-BSD-\$2 \
+. ds doc-operating-system "\*[doc-operating-system-BSD-\$2]
+. el \
+. tm mdoc warning: .Os: Unknown BSD version `\$2' (#\n[.c])
+. \}\}
+. el \{ .ie "\$1"FreeBSD" \{\
+. ds doc-operating-system FreeBSD
+. if \A\$2 \{\
+. ie d doc-operating-system-FreeBSD-\$2 \
+. as doc-operating-system \~\*[doc-operating-system-FreeBSD-\$2]
+. el \
+. tm mdoc warning: .Os: Unknown FreeBSD version `\$2' (#\n[.c])
+. \}\}
+. el \{ .ie "\$1"NetBSD" \{\
+. ds doc-operating-system NetBSD
+. if \A\$2 \{\
+. ie d doc-operating-system-NetBSD-\$2 \
+. as doc-operating-system \~\*[doc-operating-system-NetBSD-\$2]
+. el \
+. tm mdoc warning: .Os: Unknown NetBSD version `\$2' (#\n[.c])
+. \}\}
+. el \{\
+. ds doc-operating-system \$1
+. if !"\$2"" \
+. as doc-operating-system " \$2
+. \}\}\}\}
..
+.
+.
+.\" NS doc-date-string global string
+.\" NS the manual page date as set by `Dd'
+.
+.ds doc-date-string
+.
+.
+.\" NS Dd user macro (not parsed, not callable)
+.\" NS set document date
+.\" NS
+.\" NS modifies:
+.\" NS doc-date-string
+.\" NS
+.\" NS local variables:
+.\" NS doc-date-XXX
+.\" NS
+.\" NS width register `Dd' set above
+.
+.ds doc-date-1 January
+.ds doc-date-2 February
+.ds doc-date-3 March
+.ds doc-date-4 April
+.ds doc-date-5 May
+.ds doc-date-6 June
+.ds doc-date-7 July
+.ds doc-date-8 August
+.ds doc-date-9 September
+.ds doc-date-10 October
+.ds doc-date-11 November
+.ds doc-date-12 December
+.
.de Dd
-.if !"\\*(dD"" .nr gX 1
-.ie \\n(.$>0 \{\
-. ie \\n(.$==3 \{\
-. ds dD \\$1 \\$2 \\$3
-. \}
-. el \{\
-. if "\\n(mo"1" .ds dD January
-. if "\\n(mo"2" .ds dD February
-. if "\\n(mo"3" .ds dD March
-. if "\\n(mo"4" .ds dD April
-. if "\\n(mo"5" .ds dD May
-. if "\\n(mo"6" .ds dD June
-. if "\\n(mo"7" .ds dD July
-. if "\\n(mo"8" .ds dD August
-. if "\\n(mo"9" .ds dD September
-. if "\\n(mo"10" .ds dD October
-. if "\\n(mo"11" .ds dD November
-. if "\\n(mo"12" .ds dD December
-. as dD \&\ \\n(dy, \\n(Yr
-. \}
-.\}
-.el \{\
-. ds dD Epoch
-.\}
-..
-.de hM
-.ev 1
-.pL
-.if !\\n(cR 'sp \\n(Hmu
-.tl @\\*(Hs\\*(hT\fP@\\*(Vs\\*(vT\fP@\\*(Hs\\*(hT\fP@
-'sp \\n(Hmu
-.ev
+. \" XXX: why do we need gX?
+. if "\*[doc-date-string]"" \
+. nr gX 1
+.
+. ie \n[.$] \{\
+. ie (\n[.$] == 3) \
+. ds doc-date-string \$1\~\$2 \$3
+. el \{\
+. ds doc-date-string "\*[doc-date-\n[mo]]
+. as doc-date-string \~\n[dy], \n[year]
+. \}
+. \}
+. el \
+. ds doc-date-string Epoch
..
-.de fM
-.ie \\n(cR 'br
-.el \{\
-. ev 1
-. pL
-. if !\\n(cR \{\
-' sp \\n(Fmu
-. tl @\\*(Hs\\*(oS\fP@\\*(Vs\\*(dD\fP@%@
-' bp
-. \}
-. ev
-.\}
-.\" .tm IN 444 fM .k == \\n(.k and nl == \\n(nl
+.
+.
+.\" NS doc-hyphen-flags global register
+.\" NS the parameter for the `.hy' request
+.\" NS
+.\" NS override this in `mdoc.local', if necessary.
+.
+.nr doc-hyphen-flags 12
+.
+.
+.\" NS doc-header macro
+.\" NS print page header
+.
+.de doc-header
+. ev doc-env-dh
+. doc-setup-page-layout
+. if !\n[cR] \
+' sp \n[doc-header-space]u
+. tl \*[doc-caption-font]\*[doc-header-string]\f[P]\*[doc-caption-font2]\*[doc-volume]\f[P]\*[doc-caption-font]\*[doc-header-string]\f[P]
+' sp \n[doc-header-space]u
+. ev
..
-.de lM
-.fl
-.if \\n(cR \{\
-' sp
-. tl @\\*(Hs\\*(oS\fP@\\*(Vs\\*(dD\fP@%@
-. pl \\n(nlu
-.\}
+.
+.
+.\" NS doc-footer macro
+.\" NS print page footer
+.
+.de doc-footer
+. ie \n[cR] \
+' br
+. el \{\
+. ev doc-caption-enviroment
+. doc-setup-page-layout
+' sp \n[doc-footer-space]u
+. ie \n[D] \{\
+. ie o \
+. tl %\*[doc-caption-font2]\*[doc-date-string]\f[P]\*[doc-caption-font]\*[doc-operating-system]\f[P]
+. el \
+. tl \*[doc-caption-font]\*[doc-operating-system]\f[P]\*[doc-caption-font2]\*[doc-date-string]\f[P]%
+. \}
+. el \
+. tl \*[doc-caption-font]\*[doc-operating-system]\f[P]\*[doc-caption-font2]\*[doc-date-string]\f[P]%
+' bp
+. ev
+. \}
..
-.de Pp
-.sp \\n(Ppu
-.ne 2
-.ns
+.
+.
+.\" NS doc-end-macro macro
+.\" NS finish output
+.
+.de doc-end-macro
+. \" We may still have a partial line in the environment. If this is the
+. \" case, and we happen to be on the last line of the page, the `.fl'
+. \" request will cause the page to be ejected and troff will immediately
+. \" exit. If we are in nroff mode, this would be unfortunate, since we
+. \" would never get a chance to output the footer. So we fudge the page
+. \" length to make sure that the last page is never ejected until we want
+. \" it to be.
+.
+. if \n[cR] \
+. pl +3v
+. fl
+.
+. if \n[doc-list-depth] \
+. tm mdoc warning: list open at EOF! A .Bl directive has no matching .El
+.
+. if \n[cR] \{\
+' sp
+. tl \*[doc-caption-font]\*[doc-operating-system]\f[P]\*[doc-caption-font2]\*[doc-date-string]\f[P]\*[doc-caption-font]\*[doc-operating-system]\f[P]
+. \" suppress empty lines after the footer
+. pl \n[nl]u
+. \}
..
-.de Lp
-.Pp
+.
+.
+.\" NS doc-paragraph macro
+.\" NS insert a paragraph
+.
+.de doc-paragraph
+. sp \n[doc-paragraph-space]u
+. if !\n[cR] \
+. ne 2
+. ns
..
+.
+.
+.\" NS Pp user macro (not parsed, not callable)
+.\" NS new paragraph
+.\" NS
+.\" NS width register `Pp' set above
+.
+.als Pp doc-paragraph
+.
+.
+.\" NS Lp user macro (not parsed, not callable)
+.\" NS same as .Pp
+.\" NS
+.\" NS width register `Lp' set above
+.
+.als Lp doc-paragraph
+.
+.
.de LP
-.tm Not a \-mdoc command: .LP
+. tm Not a \-mdoc command: .LP (#\n[.c])
..
+.
+.
.de PP
-.tm Not a \-mdoc command: .PP
+. tm Not a \-mdoc command: .PP (#\n[.c])
..
+.
+.
.de pp
-.tm Not a \-mdoc command: .pp
+. tm Not a \-mdoc command: .pp (#\n[.c])
..
+.
+.
+.de SH
+. tm Not a \-mdoc command: .SH (#\n[.c])
+..
+.
+.
+.\" NS Nd user macro (not parsed, not callable)
+.\" NS print name description
+.\" NS
+.\" NS width register `Nd' set above
+.
.de Nd
-\&\-\& \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. nop \- \$*
+..
+.
+.
+.\" NS doc-in-synopsis-section global register (bool)
+.\" NS whether we are in the `synopsis' section
+.
+.nr doc-in-synopsis-section 0
+.
+.
+.\" NS doc-in-see-also-section global register (bool)
+.\" NS whether we are in the `see also' section
+.
+.nr doc-in-see-also-section 0
+.
+.
+.\" NS doc-in-files-section global register (bool)
+.\" NS whether we are in the `files' section
+.
+.nr doc-in-files-section 0
+.
+.
+.\" NS doc-in-authors-section global register (bool)
+.\" NS whether we are in the `authors' section
+.
+.nr doc-in-authors-section 0
+.
+.
+.\" NS doc-first-parameter macro
+.\" NS return first parameter
+.\" NS
+.\" NS local variables:
+.\" NS doc-str-dfp
+.
+.de doc-first-parameter
+. ds doc-str-dfp "\$1
+..
+.
+.
+.\" NS Sh user macro (not callable)
+.\" NS section headers
+.\" NS
+.\" NS modifies:
+.\" NS doc-func-args-processed
+.\" NS doc-func-count
+.\" NS doc-in-authors-section
+.\" NS doc-in-files-section
+.\" NS doc-in-see-also-section
+.\" NS doc-in-synopsis-section
+.\" NS doc-indent-synopsis
+.\" NS doc-indent-synopsis-active
+.\" NS doc-is-func
+.\" NS doc-num-func-args
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Sh
+.\" NS doc-reg-Sh1
+.\" NS doc-section-XXX
+.\" NS
+.\" NS width register `Sh' set in doc-common
+.
+.ds doc-section-name NAME
+.ds doc-section-synopsis SYNOPSIS
+.ds doc-section-description DESCRIPTION
+.ds doc-section-see-also SEE
+.ds doc-section-files FILES
+.ds doc-section-authors AUTHORS
+.
+.de Sh
+. ie \n[doc-arg-limit] \{\
+. \" we only allow `Sh' within `Sh'; it will change the font back to
+. \" `doc-Sh-font'
+. ie "\*[doc-macro-name]"Sh" \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Sh-font]\c
+. doc-print-recursive
+. \}
+. el \{\
+. tm Usage: .Sh section_name ... (#\n[.c])
+. doc-reset-args
+. \}\}
+. el \{\
+. tm Usage: .Sh not callable by other macros (#\n[.c])
+. doc-reset-args
+. \}\}
+. el \{\
+. if !\n[.$] \{\
+. tm Usage: .Sh section_name ... (#\n[.c])
+. return
+. \}
+.
+. ds doc-macro-name Sh
+. doc-parse-args \$@
+.
+. if t \
+' ad
+.
+. \" this resolves e.g. `.Sh "SEE ALSO"'
+. doc-first-parameter \$*
+.
+. ie "\*[doc-str-dfp]"\*[doc-section-name]" \{\
+. doc-setup-header
+' in 0
+. \}
+. el \{\
+. nr doc-in-synopsis-section 0
+. nr doc-in-see-also-section 0
+. nr doc-in-files-section 0
+. nr doc-in-authors-section 0
+.
+. ie "\*[doc-str-dfp]"\*[doc-section-synopsis]" \{\
+. if t \
+. na
+. nr doc-in-synopsis-section 1
+. nr doc-indent-synopsis 0
+. nr doc-indent-synopsis-active 0
+. \}
+. el \{ .ie "\*[doc-str-dfp]"\*[doc-section-description]" \{\
+. nr doc-is-func 0
+. nr doc-func-count 0
+. nr doc-func-args-processed 0
+. nr doc-num-func-args 0
+. \}
+. el \{ .ie "\*[doc-str-dfp]"\*[doc-section-see-also]" \{\
+. if t \
+. na
+. nr doc-in-see-also-section 1
+. \}
+. el \{ .ie "\*[doc-str-dfp]"\*[doc-section-files]" \
+. nr doc-in-files-section 1
+. el .if "\*[doc-str-dfp]"\*[doc-section-authors]" \
+. nr doc-in-authors-section 1
+. \}\}\}
+.
+. in 0
+. nr doc-have-author 0
+. \}
+.
+. doc-setup-page-layout
+' sp
+. ns
+. ta T .5i
+. if !\n[cR] \
+. ne 3
+' fi
+.
+. if t \{\
+. nr doc-reg-Sh \n[.ss]
+. nr doc-reg-Sh1 \n[.sss]
+. ss (\n[.ss] * 5 / 3) (\n[.sss] * 5 / 3)
+. \}
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Sh-font]\c
+. doc-print-recursive
+.
+. if t \
+. ss \n[doc-reg-Sh] \n[doc-reg-Sh1]
+.
+. in +\n[doc-subheader-indent]u
+. ns
+. \}
..
+.
+.
+.\" NS Ss user macro (not callable)
+.\" NS subsection
+.\" NS
+.\" NS local variable:
+.\" NS doc-reg-Ss
+.\" NS doc-reg-Ss1
+.\" NS
+.\" NS width register `Ss' set above
+.
.de Ss
-.sp
-.ne 2
-.ti -.25i
-\&\\*(sH\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 \|\\$7 \|\\$8 \|\\$9
-\&\fP\s0
-.ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
-.if !\\n(cR .ne 2
-.br
+. ie \n[doc-arg-limit] \{\
+. \" we only allow `Ss' within `Ss'; it will change the font back to
+. \" `doc-Sh-font'
+. ie "\*[doc-macro-name]"Ss" \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Sh-font]\c
+. doc-print-recursive
+. \}
+. el \{\
+. tm Usage: .Ss subsection_name ... (#\n[.c])
+. doc-reset-args
+. \}\}
+. el \{\
+. tm Usage: .Ss not callable by other macros (#\n[.c])
+. doc-reset-args
+. \}\}
+. el \{\
+. if !\n[.$] \{\
+. tm Usage: .Ss subsection_name ... (#\n[.c])
+. return
+. \}
+.
+. ds doc-macro-name Ss
+. doc-parse-args \$@
+.
+. sp
+. if !\n[cR] \
+. ne 3
+. ti -.25i
+.
+. nr doc-reg-Ss \n[.ss]
+. nr doc-reg-Ss1 \n[.sss]
+. ss (\n[.ss] * 5 / 4) (\n[.sss] * 5 / 4)
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Sh-font]\c
+. doc-print-recursive
+.
+. ss \n[doc-reg-Ss] \n[doc-reg-Ss1]
+.
+. ta T .5i
+. if !\n[cR] \
+. ne 2
+. br
+. \}
..
+.
+.
+.\" NS Rd macro (not parsed, not callable)
+.\" NS print global register dump to stderr
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Rd
+.
.de Rd
-.tm MDOC REGISTER DUMP
-.tm Db==\\n(Db register DEBUG MODE
-.tm L[0-9] registers - stack of list types
-.tm L0==\\n(L0
-.tm L1==\\n(L1
-.tm L2==\\n(L2
-.tm L3==\\n(L3
-.tm L4==\\n(L4
-.tm L5==\\n(L5
-.tm L6==\\n(L6
-.tm L7==\\n(L7
-.tm L8==\\n(L8
-.tm L9==\\n(L9
-.tm O[0-9] registers - stack of indent
-.tm O0==\\n(O0
-.tm O1==\\n(O1
-.tm O2==\\n(O2
-.tm O3==\\n(O3
-.tm O4==\\n(O4
-.tm O5==\\n(O5
-.tm O6==\\n(O6
-.tm O7==\\n(O7
-.tm O8==\\n(O8
-.tm O9==\\n(O9
-.tm aC==\\n(aC register argument counter (aV/fV)
-.tm aJ==\\n(aJ register (for vR)
-.tm aN==\\n(aN register
-.tm aP==\\n(aP register argument pointer (aV)
-.tm aT==\\n(aT register argument type
-.tm aa==\\n(aa local register
-.tm bK==\\n(bK register - Book Name flag
-.tm cF==\\n(cF register save current font
-.tm cI==\\n(cI register - column indent width
-.tm cZ==\\n(cZ register save current font size
-.tm dK==\\n(dK register - Date flag
-.tm d[0-9] registers - display-type stack
-.tm d0==\\n(d0
-.tm d1==\\n(d1
-.tm d2==\\n(d2
-.tm d3==\\n(d3
-.tm d4==\\n(d4
-.tm d5==\\n(d5
-.tm d6==\\n(d6
-.tm d7==\\n(d7
-.tm d8==\\n(d8
-.tm d9==\\n(d9
-.tm dZ==\\n(dZ register diversion count
-.tm fD==\\n(fD register subroutine test (in synopsis only)
-.tm fV==\\n(fV register argument counter (must set to \\n(.$ prior to
-.tm fY==\\n(fY register - dick with old style function declarations (fortran)
-.tm fZ==\\n(fZ register also subroutine count (in synopsis only)
-.tm h[0-9] register horizontal tag stack (continuous if 1, break if
-.tm h0==\\n(h0
-.tm h1==\\n(h1
-.tm h2==\\n(h2
-.tm h3==\\n(h3
-.tm h4==\\n(h4
-.tm h5==\\n(h5
-.tm h6==\\n(h6
-.tm h7==\\n(h7
-.tm h8==\\n(h8
-.tm h9==\\n(h9
-.tm iD==\\n(iD local register
-.tm iI==\\n(iI local register (indent for inline debug mode)
-.tm iN==\\n(iN register DEBUG MODE (inline if 1, to stderr if
-.tm iS==\\n(iS register - indent second command line in a synopsis
-.tm jK==\\n(jK register - [reference] Journal Name flag
-.tm jM==\\n(jM local register
-.tm jN==\\n(jN local register
-.tm lC==\\n(lC register - list type stack counter
-.tm lK==\\n(lK register count of lines read from input file
-.tm nK==\\n(nK register - [reference] issue number flag
-.tm nU==\\n(nU register count
-.tm oK==\\n(oK register - [reference] optional information flag
-.tm oM==\\n(oM register (extension possible)
-.tm o[0-9] register offset stack (nested tags)
-.tm o0==\\n(o0
-.tm o1==\\n(o1
-.tm o2==\\n(o2
-.tm o3==\\n(o3
-.tm o4==\\n(o4
-.tm o5==\\n(o5
-.tm o6==\\n(o6
-.tm o7==\\n(o7
-.tm o8==\\n(o8
-.tm o9==\\n(o9
-.tm oM==\\n(oM register open ended line flag
-.tm pK==\\n(pK register - [reference] page number flag
-.tm qK==\\n(qK register - Corporate or Foreign Author flag
-.tm rK==\\n(rK register - [reference] report flag
-.tm rS==\\n(rS register - Reference Start flag
-.tm sM==\\n(sM register - default is one (space mode on)
-.tm tK==\\n(tK register - reference title flag
-.tm tP==\\n(tP register tag flag (for diversions)
-.tm tX==\\n(tX register (initial class)
-.tm tY==\\n(tY register (next possible lC value)
-.tm t[0-9] register tag string stack (nested tags)
-.tm t0==\\n(t0
-.tm t1==\\n(t1
-.tm t2==\\n(t2
-.tm t3==\\n(t3
-.tm t4==\\n(t4
-.tm t5==\\n(t5
-.tm t6==\\n(t6
-.tm t7==\\n(t7
-.tm t8==\\n(t8
-.tm t9==\\n(t9
-.tm uK==\\n(uK register - reference author(s) counter
-.tm vK==\\n(vK register - reference volume flag
-.tm v[0-9] register vertical tag break stack
-.tm v0==\\n(v0
-.tm v1==\\n(v1
-.tm v2==\\n(v2
-.tm v3==\\n(v3
-.tm v4==\\n(v4
-.tm v5==\\n(v5
-.tm v6==\\n(v6
-.tm v7==\\n(v7
-.tm v8==\\n(v8
-.tm v9==\\n(v9
-.tm w[0-9] register tag stack (nested tags)
-.tm w0==\\n(w0
-.tm w1==\\n(w1
-.tm w2==\\n(w2
-.tm w3==\\n(w3
-.tm w4==\\n(w4
-.tm w5==\\n(w5
-.tm w6==\\n(w6
-.tm w7==\\n(w7
-.tm w8==\\n(w8
-.tm w9==\\n(w9
-.tm xX==\\n(xX local register
-.tm END OF REGISTER DUMP
+. tm MDOC GLOBAL REGISTER DUMP
+. tm doc-macro-name == `\*[doc-macro-name]'
+. tm doc-arg-limit == \n[doc-arg-limit]
+. tm doc-num-args == \n[doc-num-args]
+. tm doc-arg-ptr == \n[doc-arg-ptr]
+.
+. nr doc-reg-Rd 1
+. while (\n[doc-reg-Rd] <= \n[doc-arg-limit]) \{\
+. tm doc-arg\n[doc-reg-Rd] == `\*[doc-arg\n[doc-reg-Rd]]'
+. tm doc-type\n[doc-reg-Rd] == \n[doc-type\n[doc-reg-Rd]]
+. tm doc-space\n[doc-reg-Rd] == `\*[doc-space\n[doc-reg-Rd]]'
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-curr-font == \n[doc-curr-font]
+. tm doc-curr-size == \n[doc-curr-size]
+. tm doc-indent-synopsis == \n[doc-indent-synopsis]
+. tm doc-indent-synopsis-active == \n[doc-indent-synopsis-active]
+. tm doc-have-decl == \n[doc-have-decl]
+. tm doc-have-var == \n[doc-have-var]
+. tm doc-command-name == `\*[doc-command-name]'
+. tm doc-quote-left == `\*[doc-quote-left]'
+. tm doc-quote-right == `\*[doc-quote-right]'
+. tm doc-nesting-level == \n[doc-nesting-level]
+. tm doc-in-list == \n[doc-in-list]
+. tm doc-space == `\*[doc-space]'
+. tm doc-saved-space == `\*[doc-saved-space]'
+. tm doc-space-mode == \n[doc-space-mode]
+. tm doc-have-space == \n[doc-have-space]
+. tm doc-have-slot == \n[doc-have-slot]
+. tm doc-keep-type == \n[doc-keep-type]
+. tm doc-display-depth == \n[doc-display-depth]
+. tm doc-is-compact == \n[doc-is-compact]
+.
+. nr doc-reg-Rd 0
+. while (\n[doc-reg-Rd] <= \n[doc-display-depth]) \{\
+. tm doc-display-type-stack\n[doc-reg-Rd] == `\*[doc-display-type-stack\n[doc-reg-Rd]]'
+. tm doc-display-indent-stack\n[doc-reg-Rd] == \n[doc-display-indent-stack\n[doc-reg-Rd]]
+. tm doc-display-ad-stack\n[doc-reg-Rd] == \n[doc-display-ad-stack\n[doc-reg-Rd]]
+. tm doc-display-fi-stack\n[doc-reg-Rd] == \n[doc-display-fi-stack\n[doc-reg-Rd]]
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-fontmode-depth == \n[doc-fontmode-depth]
+.
+. nr doc-reg-Rd 1
+. while (\n[doc-reg-Rd] <= \n[doc-fontmode-depth]) \{\
+. tm doc-fontmode-font-stack\n[doc-reg-Rd] == `\n[doc-fontmode-font-stack\n[doc-reg-Rd]]'
+. tm doc-fontmode-size-stack\n[doc-reg-Rd] == `\n[doc-fontmode-size-stack\n[doc-reg-Rd]]'
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-list-depth == \n[doc-list-depth]
+.
+. nr doc-reg-Rd 1
+. while (\n[doc-reg-Rd] <= \n[doc-list-depth]) \{\
+. tm doc-list-type-stack\n[doc-reg-Rd] == `\*[doc-list-type-stack\n[doc-reg-Rd]]'
+. tm doc-list-have-indent-stack\n[doc-reg-Rd] == \n[doc-list-have-indent-stack\n[doc-reg-Rd]]
+. tm doc-list-indent-stack\n[doc-reg-Rd] == \n[doc-list-indent-stack\n[doc-reg-Rd]]
+. tm doc-compact-list-stack\n[doc-reg-Rd] == \n[doc-compact-list-stack\n[doc-reg-Rd]]
+. tm doc-tag-prefix-stack\n[doc-reg-Rd] == `\*[doc-tag-prefix-stack\n[doc-reg-Rd]]'
+. tm doc-tag-width-stack\n[doc-reg-Rd] == `\*[doc-tag-width-stack\n[doc-reg-Rd]]'
+. tm doc-list-offset-stack\n[doc-reg-Rd] == \n[doc-list-offset-stack\n[doc-reg-Rd]]
+. tm doc-enum-list-count-stack\n[doc-reg-Rd] == \n[doc-enum-list-count-stack\n[doc-reg-Rd]]
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-saved-Pa-font == `\*[doc-saved-Pa-font]'
+. tm doc-curr-type == \n[doc-curr-type]
+. tm doc-curr-arg == `\*[doc-curr-arg]'
+. tm doc-diag-list-input-line-count == \n[doc-diag-list-input-line-count]
+. tm doc-num-columns == \n[doc-num-columns]
+. tm doc-column-indent-width == \n[doc-column-indent-width]
+. tm doc-is-func == \n[doc-is-func]
+. tm doc-have-old-func == \n[doc-have-old-func]
+. tm doc-func-arg-count == \n[doc-func-arg-count]
+. tm doc-func-arg == `\*[doc-func-arg]'
+. tm doc-num-func-args == \n[doc-num-func-args]
+. tm doc-func-args-processed == \n[doc-func-args-processed]
+. tm doc-have-func == \n[doc-have-func]
+. tm doc-is-reference == \n[doc-is-reference]
+. tm doc-reference-count == \n[doc-reference-count]
+. tm doc-author-count == \n[doc-author-count]
+.
+. nr doc-reg-Rd 0
+. while (\n[doc-reg-Rd] <= \n[doc-author-count]) \{\
+. tm doc-author-name\n[doc-reg-Rd] == `\*[doc-author-name\n[doc-reg-Rd]]'
+. nr doc-reg-Rd +1
+. \}
+.
+. tm doc-book-count == \n[doc-book-count]
+. tm doc-book-name == `\*[doc-book-name]'
+. tm doc-date-count == \n[doc-date-count]
+. tm doc-date == `\*[doc-date]'
+. tm doc-publisher-count == \n[doc-publisher-count]
+. tm doc-publisher-name == `\*[doc-publisher-name]'
+. tm doc-journal-count == \n[doc-journal-count]
+. tm doc-journal-name == `\*[doc-journal-name]'
+. tm doc-issue-count == \n[doc-issue-count]
+. tm doc-issue-name == `\*[doc-issue-name]'
+. tm doc-optional-count == \n[doc-optional-count]
+. tm doc-optional-string == `\*[doc-optional-string]'
+. tm doc-page-number-count == \n[doc-page-number-count]
+. tm doc-page-number-string == `\*[doc-page-number-string]'
+. tm doc-corporate-count == \n[doc-corporate-count]
+. tm doc-corporate-name == `\*[doc-corporate-name]'
+. tm doc-report-count == \n[doc-report-count]
+. tm doc-report-name == `\*[doc-report-name]'
+. tm doc-reference-title-count == \n[doc-reference-title-count]
+. tm doc-reference-title-name == `\*[doc-reference-title-name]'
+. tm doc-reference-title-name-for-book == `\*[doc-reference-title-name-for-book]'
+. tm doc-volume-count == \n[doc-volume-count]
+. tm doc-volume-name == `\*[doc-volume-name]'
+. tm doc-have-author == \n[doc-have-author]
+.
+. tm doc-document-title == `\*[doc-document-title]'
+. tm doc-volume == `\*[doc-volume]'
+. tm doc-section == `\*[doc-section]'
+. tm doc-operating-system == `\*[doc-operating-system]'
+. tm doc-date-string == `\*[doc-date-string]'
+. tm doc-header-space == \n[doc-header-space]
+. tm doc-footer-space == \n[doc-footer-space]
+. tm doc-display-vertical == \n[doc-display-vertical]
+. tm doc-header-string == `\*[doc-header-string]'
+. tm doc-in-synopsis-section == \n[doc-in-synopsis-section]
+. tm doc-in-see-also-section == \n[doc-in-see-also-section]
+. tm doc-in-files-section == \n[doc-in-files-section]
+. tm doc-in-authors-section == \n[doc-in-authors-section]
+.
+. tm END OF GLOBAL REGISTER DUMP
..
+.
+.
+.ec
+.
+.\" EOF
diff --git a/contrib/groff/tmac/doc-ditroff b/contrib/groff/tmac/doc-ditroff
index 039db7d..dff5537 100644
--- a/contrib/groff/tmac/doc-ditroff
+++ b/contrib/groff/tmac/doc-ditroff
@@ -1,5 +1,5 @@
-.\" Copyright (c) 1991 The Regents of the University of California.
-.\" All rights reserved.
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
@@ -11,8 +11,8 @@
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
@@ -29,253 +29,319 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)doc-ditroff 5.8 (Berkeley) 8/5/91
+.\" @(#)doc-ditroff 8.1 (Berkeley) 06/08/93
.\"
-.\" tmac.mdoc-ditroff
.\" %beginstrip%
-.\"
-.\" -rC1 numbers pages continuously; initialize to avoid warnings
-.if \n(.g .if !rC .nr C 0
-.ds aD \fI\s10
-.ds aR \f(CO\s10
-.ds cM \f(CB\s10
-.ds dF \fR\s10
-.ds eM \fI\s10
-.ds eR \fC\s10
-.ds eV \fC\s10
-.ds fA \f(CO\s10
-.ds fD \f(CB\s10
-.ds fL \f(CB\s10
-.ds fN \f(CB\s10
-.ds fP \fP\s0
-.ds fS \s0
-.ds fT \f(CO\s10
-.ds Hs \fR\s10
-.ds iC \f(CB\s10
-.ds lI \fC
-.ds lP \fR\|(\|\fP\s10
-.ds lp \fR(\fP\s10
-.ds rP \fR\|)\|\fP\s10
-.ds rp \fR)\fP\s10
-.ds lB \fR\^[\^\fP\s10
-.ds rB \fR\^]\fP\s10
-.ds mL \fB\s10
-.ds nM \f(CB\s10
-.ds nO \fR\s10
-.ds nT \s0
-.ds pA \fC\s10
-.ds Pu \fR{\ .\ ,\ :\ ;\ (\ )\ [\ ]\ \fR}
-.ds rA \fR\s10
-.ds rT \f(CO\s10
-.ds sH \fB\s10
-.ds sP \s0
-.ds sY \fB\s10
-.ds sX \fR\s10
-.ds tF \fR
-.ds tN \s9
-.ds vA \fI\s10
-.ds Vs \fR\s10
-.ds vT \f(CB\s10
-.ds xR \fC\s10
-.tr *\(**
-.nr sI \w\fC,u*5
-.nr Ti \n(sIu
-.nr Pp .5v
-.ds lS \0
-.nr lS \w'\0'u
-.nr dI 6n
-.de pL
-.nr Hm .5i
-.nr Fm .5i
-.nr ll 6.5i
-.ll 6.5i
-.nr lt 6.5i
-.lt 6.5i
-.nr po 1i
-.po 1.i
-.nr dV .5v
-..
-.ds <= \(<=
-.ds >= \(>=
-.ie \n(.g \{\
-. ds Lq \(lq
-. ds Rq \(rq
+.
+.
+.eo
+.
+.\" use -rC=1 to number pages continuously
+.
+.if !r C .nr C 0
+.
+.\" use -rD=1 for double-sided printing
+.
+.if !r D .nr D 0
+.
+.\" use -rcR=1 to force the creation of a single, very long page
+.
+.if !r cR .nr cR 0
+.
+.\" use -rS={11,12} to change the font size from 10pt to 11pt or 12pt.
+.
+.if !r S .nr S 10
+.
+.
+.ec
+.
+.
+.ie (\n[S] == 11) \{\
+. ps 10.95z
+. vs 13.6p
.\}
-.el \{\
-. ds Lq \&``
-. ds Rq \&''
+.el \{ .ie (\n[S] == 12) \{\
+. ps 12z
+. vs 14.5p
.\}
-.ds ua \(ua
-.ds aa \(aa
-.ds ga \(ga
-.ds sR \&'
-.ds sL \&`
-.ds q \&"
-.\" Math stuff
-.ds Pi \(*p
-.ds Ne \(!=
-.ds Le \(<=
-.ds Ge \(>=
+.el \{\
+. ps 10z
+. vs 12p
+.\}\}
+.
+.
+.\" the `doc-xx-font' strings must not be empty!
+.
+.ds doc-caption-font \f[R]\s[\n[.ps]u]
+.ds doc-caption-font2 \f[R]\s[\n[.ps]u]
+.ds doc-Ad-font \f[I]\s[\n[.ps]u]
+.ds doc-Ar-font \f[CO]\s[\n[.ps]u]
+.ds doc-Cm-font \f[CB]\s[\n[.ps]u]
+.ds doc-Em-font \f[I]\s[\n[.ps]u]
+.ds doc-Er-font \f[C]\s[\n[.ps]u]
+.ds doc-Ev-font \f[C]\s[\n[.ps]u]
+.ds doc-Fa-font \f[CO]\s[\n[.ps]u]
+.ds doc-Fd-font \f[CB]\s[\n[.ps]u]
+.ds doc-Fl-font \f[CB]\s[\n[.ps]u]
+.ds doc-Fn-font \f[CB]\s[\n[.ps]u]
+.ds doc-Ft-font \f[CO]\s[\n[.ps]u]
+.ds doc-Ic-font \f[CB]\s[\n[.ps]u]
+.ds doc-Li-font \f[C]
+.ds doc-Me-font \f[B]\s[\n[.ps]u]
+.ds doc-Nm-font \f[CB]\s[\n[.ps]u]
+.ds doc-No-font \f[R]\s[\n[.ps]u]
+.ds doc-Pa-font \f[C]\s[\n[.ps]u]
+.ds doc-Sh-font \f[B]\s[\n[.ps]u]
+.ds doc-Sy-font \f[B]\s[\n[.ps]u]
+.ds doc-Sx-font \f[B]\s[\n[.ps]u]
+.ds doc-Tn-font-shape \f[R]
+\# XXX: adapt to discrete LaTeX font sizes
+.ds doc-Tn-font-size \s[(\n[.ps]u - 1z)]
+.ds doc-Va-font \f[I]\s[\n[.ps]u]
+.ds doc-Xr-font \f[C]\s[\n[.ps]u]
+.
+.ds doc-left-parenthesis \f[R]\|(\|\f[P]\s[\n[.ps]u]
+.ds doc-right-parenthesis \f[R]\|)\|\f[P]\s[\n[.ps]u]
+.ds lp \f[R](\f[P]\s[\n[.ps]u]
+.ds rp \f[R])\f[P]\s[\n[.ps]u]
+.ds doc-left-bracket \f[R]\^[\^\f[P]\s[\n[.ps]u]
+.ds doc-right-bracket \f[R]\^]\f[P]\s[\n[.ps]u]
+.
+.tr *\[**]
+.
+.\" miscellaneous
+.nr doc-subheader-indent (\w\f[C],u * 5u)
+.nr doc-paragraph-space .5v
+.
+.nr doc-digit-width \w'\0'u
+.nr doc-fixed-width \w\f[C]0
+.
+.eo
+.
+.
+.\" NS doc-header-space global register
+.\" NS the space between header and body
+.
+.nr doc-header-space 0
+.
+.
+.\" NS doc-footer-space global register
+.\" NS the space between body and footer
+.
+.nr doc-footer-space 0
+.
+.
+.\" NS doc-display-vertical global register
+.\" NS vertical space between list elements etc.
+.
+.nr doc-display-vertical 0
+.
+.
+.\" NS doc-setup-page-layout macro
+.\" NS set up page layout
+.\" NS
+.\" NS modifies:
+.\" NS doc-display-vertical
+.\" NS doc-footer-space
+.\" NS doc-header-space
+.
+.de doc-setup-page-layout
+. nr doc-header-space .5i
+. nr doc-footer-space .5i
+.
+. ll 6.5i
+. lt 6.5i
+. po 1i
+.
+. nr doc-display-vertical .5v
+..
+.
+.
+.ds doc-left-singlequote \[oq]
+.ds doc-right-singlequote \[cq]
+.
+.\" the following strings are `official'
+.ds <= \[<=]
+.ds >= \[>=]
+.ds Lq \[lq]
+.ds Rq \[rq]
+.ds ua \[ua]
+.ds aa \[aa]
+.ds ga \[ga]
+.ds q \[dq]
+.ds Pi \[*p]
+.ds Ne \[!=]
+.ds Le \[<=]
+.ds Ge \[>=]
.ds Lt <
.ds Gt >
-.ds Pm \(+-
-.ds If \(if
-.ds Na \fINaN\fP
-.ds Ba \fR\&|\fP
-.\"
-.nr gX 0
-.de hK
-.ds hT \\*(dT
-.if !"\\*(cH"Null" \{\
-. ie !"\\*(gP"Null" .as hT \|(\|\\*(cH\\*(gP\|)
-. el .as hT \\|(\\|\\*(cH\\|)
-.\}
-.if "\\*(cH"Null" \{\
-. if !"\\*(gP"Null" .as hT \&\|(\|\\*(gP\|)
-.\}
-.wh 0 hM
-.wh -1.25i fM
-.nr nL \\n(nl
-.ie \\n(gX==1 \{\
-. rm n1
-. bp
-.\}
-.el \{\
-' bp
-.\}
-.\" Don't set the page number if this is the first page,
-.\" in case the user has used -n.
-.if \\n(nL>0 \{\
-. if !\\nC \{\
-. nr % 1
-. \}
-.\}
+.ds Pm \[+-]
+.ds If \[if]
+.ds Na \f[I]NaN\f[P]
+.ds Ba \f[R]|\f[P]
+.
.nr gX 0
-.em lM
+.
+.
+.\" NS doc-header-string global string
+.\" NS the final string used for the manual page header
+.
+.ds doc-header-string
+.
+.
+.\" NS doc-setup-header macro
+.\" NS install and initialize header and footer support
+.\" NS
+.\" NS modifies:
+.\" NS doc-header-string
+.
+.de doc-setup-header
+. ds doc-header-string "\*[doc-document-title]
+. if !"\*[doc-section]"Null" \
+. as doc-header-string \|(\*[doc-section])
+.
+. wh 0 doc-header
+. wh -1.25i doc-footer
+.
+. nr nL \n[nl]
+. if \n[gX] \
+. ds doc-command-name
+.
+. br
+.
+. \" Don't set the page number if this is the first page,
+. \" in case the user has used -n.
+. if \n[nL] \
+. if !\n[C] \
+. nr % 1
+.
+. nr gX 0
+. e@ doc-end-macro
..
-.\"
-.nr fW \w\fC0
-.de sW
-.nr sW \w\fC\\$1
-.ie \\n(sW>=\\n(fW \{\
-. ie \\n(sW%\\n(fW .nr sW (\\n(sW/\\n(fW)+1
-. el .nr sW \\n(sW/\\n(fW
-.\}
-.el \{\
-. ie \\n(sW>0 .nr sW 1
-. el .nr sW 0
-.\}
+.
+.
+.\" NS doc-get-width macro
+.\" NS computes the width of a string as a multiple of `doc-fixed-width':
+.\" NS `.doc-get-width string'
+.\" NS
+.\" NS modifies:
+.\" NS doc-width
+.
+.de doc-get-width
+. nr doc-width \w\f[C]\$1
+. ie (\n[doc-width] >= \n[doc-fixed-width]) \{\
+. ie (\n[doc-width] % \n[doc-fixed-width]) \
+. nr doc-width ((\n[doc-width] / \n[doc-fixed-width]) + 1)
+. el \
+. nr doc-width (\n[doc-width] / \n[doc-fixed-width])
+. \}
+. el \{\
+. ie \n[doc-width] \
+. nr doc-width 1
+. el \
+. nr doc-width 0
+. \}
..
-.\"
-.de aW
-.nr sW \w\fC\\*(A\\$1
-.ie \\n(sW>=\\n(fW \{\
-. ie \\n(sW%\\n(fW .nr sW (\\n(sW/\\n(fW)+1
-. el .nr sW \\n(sW/\\n(fW
-.\}
-.el \{\
-. ie \\n(sW>0 .nr sW 1
-. el .nr sW 0
-.\}
+.
+.
+.\" NS doc-get-arg-width macro
+.\" NS computes the width of an argument as a multiple of
+.\" NS `doc-fixed-width': `.doc-get-arg-width arg-index'
+.\" NS
+.\" NS modifies:
+.\" NS doc-width
+.
+.de doc-get-arg-width
+. nr doc-width \w\f[C]\*[doc-arg\$1]
+. ie (\n[doc-width] >= \n[doc-fixed-width]) \{\
+. ie (\n[doc-width] % \n[doc-fixed-width]) \
+. nr doc-width ((\n[doc-width] / \n[doc-fixed-width]) + 1)
+. el \
+. nr doc-width (\n[doc-width] / \n[doc-fixed-width])
+. \}
+. el \{\
+. ie \n[doc-width] \
+. nr doc-width 1
+. el \
+. nr doc-width 0
+. \}
..
-.\" NS Ql macro - Quoted literal define
+.
+.
+.\" NS Ql user macro
+.\" NS quoted literal define
+.\" NS
+.\" NS modifies:
+.\" NS doc-argXXX
+.\" NS doc-arg-limit
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS doc-spaceXXX
+.\" NS doc-typeXXX
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Ql
+.\" NS doc-reg-Ql1
+.\" NS doc-reg-Ql2
+.\" NS
+.\" NS width register `Ql' set in doc-common
+.
.de Ql
-.if \\n(aC==0 \{\
-. ds mN Ql
-. ds A1 \\$1
-. ds A2 \\$2
-. ds A3 \\$3
-. ds A4 \\$4
-. ds A5 \\$5
-. ds A6 \\$6
-. ds A7 \\$7
-. ds A8 \\$8
-. nr fV \\n(.$
-. fV
-.\}
-.nr aP \\n(aP+1
-.aW \\n(aP
-.nr aP \\n(aP-1
-.if \\n(sW>2 .Li
-.if \\n(sW<=2 \{\
-.\" Db on
-. if (\\n(aP>0) \{\
-. ds A\\n(aP Li
-. nr aP \\n(aP -1
-. \}
-. if (\\n(aP==0) \{\
-. rm C0 C1 C2 C3 C4 C5 C6 C7 C8 C9
-. rm S1 S2 S3 S4 S5 S6 S7 S8 S9
-. rn A8 A9
-. rn A7 A8
-. rn A6 A7
-. rn A5 A6
-. rn A4 A5
-. rn A3 A4
-. rn A2 A3
-. rn A1 A2
-. ds A1 Li
-. nr fV \\n(aC+1
-. nr aC 0
-. fV
-. \}
-. ds qL \&\\*(sL
-. ds qR \&\\*(sR
-. En
-.\" Db off
-.\}
-..
-.\" NS Sh macro - Section Headers
-.\" NS nS register - Section Header SYNOPSIS flag
-.\" NS nF register - Section Header FILES flag
-.\" NS nA register - Section Header SEE ALSO flag
-.\" NS nT register - Section Header STANDARDS flag
-.de Sh
-.nr nS 0
-.nr sE 0
-.nr iS 0
-'ad
-.ie "\\$1"NAME" \{\
-. hK
-' in 0
-.\}
-.el \{\
-. nr nS 0
-. nr nA 0
-. nr nF 0
-. nr nT 0
-. nr nY 0
-. nr oT 0
-. if "\\$1"SYNOPSIS" \{\
-. na
-. nr nS 1
-. \}
-. if "\\$1"DESCRIPTION" \{\
-. nr fY 0
-. nr fZ 0
-. nr fB 0
-. nr Fb 0
-. ds Fb
-. \}
-. if "\\$1"SEE" \{\
-. nr nA 1
-. na
-. \}
-. if "\\$1"FILES" .nr nF 1
-. if "\\$1"STANDARDS" .nr nT 1
-. if "\\$1"AUTHORS" .nr nY 1
-. if "\\$1"SEE" .nr sE 1
-. in 0
-. nr aN 0
-.\}
-.pL
-'sp
-.ns
-.ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
-.if !\\n(cR .ne 3
-'fi
-\&\\*(sH\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 \|\\$7 \|\\$8 \|\\$9
-\&\fP\s0\&
-.in \\n(.iu+\\n(Tiu
-.ns
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Ql
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Ql argument ... (#\n[.c])
+. \}
+.
+. nr doc-reg-Ql (\n[doc-arg-ptr] + 1)
+. doc-get-arg-width \n[doc-reg-Ql]
+.
+. \" don't use quotes if we have more than two succeeding string arguments
+. nr doc-reg-Ql +1
+. if (\n[doc-arg-limit] >= \n[doc-reg-Ql]) \
+. if (\n[doc-type\n[doc-reg-Ql]] == 2) \
+. nr doc-width 3
+.
+. \" make a difference in quotation style for strings longer
+. \" than two characters
+. ie (\n[doc-width] > 2) \
+. Li
+. el \{\
+. ie \n[doc-arg-ptr] \{\
+. \" we replace `Ql' with `Li'
+. ds doc-arg\n[doc-arg-ptr] Li
+. nr doc-arg-ptr -1
+. \}
+. el \{\
+. \" if .Ql has been called directly, we must shift all elements in
+. \" the argument vector to the right so that we can insert `Li'
+. nr doc-reg-Ql \n[doc-arg-limit]
+. nr doc-reg-Ql1 (\n[doc-arg-limit] + 1)
+. while \n[doc-reg-Ql] \{\
+. rn doc-arg\n[doc-reg-Ql] doc-arg\n[doc-reg-Ql1]
+. rnn doc-type\n[doc-reg-Ql] doc-type\n[doc-reg-Ql1]
+. rn doc-space\n[doc-reg-Ql] doc-space\n[doc-reg-Ql1]
+. nr doc-reg-Ql -1
+. nr doc-reg-Ql1 -1
+. \}
+. ds doc-arg1 Li
+. nr doc-type1 1
+. ds doc-space1
+. nr doc-arg-limit +1
+. \}
+.
+. ds doc-quote-left "\*[doc-left-singlequote]
+. ds doc-quote-right "\*[doc-right-singlequote]
+. doc-enclose-string
+. \}
..
+.
+.
+.ec
+.
+.\" EOF
diff --git a/contrib/groff/tmac/doc-nroff b/contrib/groff/tmac/doc-nroff
index c036f21..ce4e987 100644
--- a/contrib/groff/tmac/doc-nroff
+++ b/contrib/groff/tmac/doc-nroff
@@ -1,5 +1,5 @@
-.\" Copyright (c) 1991 The Regents of the University of California.
-.\" All rights reserved.
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
@@ -11,8 +11,8 @@
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
@@ -29,197 +29,253 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)doc-nroff 5.6 (Berkeley) 8/5/91
+.\" @(#)doc-nroff 8.1 (Berkeley) 06/08/93
.\"
-.\" tmac.mdoc-nroff
.\" %beginstrip%
-.\"
-.ds aD \fI
-.ds aR \fI
-.ds cM \fB
-.ds dF \fR
-.ds eM \fI
-.ds eR \fR
-.ds eV \fR
-.ds fA \fI
-.ds fD \fB
-.ds fL \fB
-.ds fN \fB
-.ds fP \fP
-.ds fS
-.ds fT \fI
-.ds Hs \fR
-.ds iC \fB
-.ds lI \fR
-.ds lP \fR\|(\fP
-.ds rP \fR\|)\fP
-.ds lp \fR\|(\fP
-.ds rp \fR\|)\fP
-.ds lB \fR\|[\|\fP
-.ds rB \fR\|]\fP
-.ds mL \fB
-.ds nM \fB
-.ds nO \fR
-.ds pA \fI
-.ds Pu {\ .\ ,\ ;\ :\ (\ )\ [\ ]}
-.ds rA \fR
-.ds rT \fI
-.ds sH \fB
-.ds sP
-.ds sY \fB
-.ds sX \fI
-.ds tF \fR
-.ds tN
-.ds vA \fI
-.ds Vs \fR
-.ds vT \fB
-.ds xR \fR
-.\" MISCELLANEOUS
-.nr sI .5i
-.nr Ti .5i
-.nr cR 1
-.nr Pp 1v
-.ds lS \0\0
-.nr lS \w'\0\0'u
-.nr dI 6n
-.\"
-.de pL
-.ie \\n(cR .nr Hm 0
-.el .nr Hm .5i
-.nr Fm .5i
-.nr ll 78n
-.ll 78n
-.nr lt 78n
-.lt 78n
-.nr po 0i
-.po 0i
-.nr dV 1v
-.ad l
-.na
+.
+.
+.eo
+.
+.\" use -rD=1 for double-sided printing
+.
+.if !r D .nr D 0
+.
+.\" use -rcR=0 to have multiple pages instead of a single, very long page
+.
+.if !r cR .nr cR 1
+.
+.\" the following switches are ignored in nroff mode
+.
+.nr S 10
+.nr C 0
+.
+.\" the `doc-xx-font' strings must not be empty!
+.
+.ds doc-caption-font \f[R]
+.ds doc-caption-font2 \f[R]
+.ds doc-Ad-font \f[I]
+.ds doc-Ar-font \f[I]
+.ds doc-Cm-font \f[B]
+.ds doc-Em-font \f[I]
+.ds doc-Er-font \f[R]
+.ds doc-Ev-font \f[R]
+.ds doc-Fa-font \f[I]
+.ds doc-Fd-font \f[B]
+.ds doc-Fl-font \f[B]
+.ds doc-Fn-font \f[B]
+.ds doc-Ft-font \f[I]
+.ds doc-Ic-font \f[B]
+.ds doc-Li-font \f[R]
+.ds doc-Me-font \f[B]
+.ds doc-Nm-font \f[B]
+.ds doc-No-font \f[R]
+.ds doc-Pa-font \f[I]
+.ds doc-Sh-font \f[B]
+.ds doc-Sy-font \f[B]
+.ds doc-Sx-font \f[I]
+.ds doc-Tn-font-shape \f[R]
+.ds doc-Tn-font-size
+.ds doc-Va-font \f[I]
+.ds doc-Xr-font \f[R]
+.
+.ds doc-left-parenthesis \f[R](\f[P]
+.ds doc-right-parenthesis \f[R])\f[P]
+.ds lp \f[R](\f[P]
+.ds rp \f[R])\f[P]
+.ds doc-left-bracket \f[R][\f[P]
+.ds doc-right-bracket \f[R]]\f[P]
+.
+.\" miscellaneous
+.nr doc-subheader-indent .5i
+.nr doc-paragraph-space 1v
+.
+.ec
+.nr doc-digit-width \w'\0\0'u
+.nr doc-fixed-width \w'0'
+.eo
+.
+.
+.\" NS doc-header-space global register
+.\" NS the space between header and body
+.
+.nr doc-header-space 0
+.
+.
+.\" NS doc-footer-space global register
+.\" NS the space between body and footer
+.
+.nr doc-footer-space 0
+.
+.
+.\" NS doc-display-vertical global register
+.\" NS vertical space between list elements etc.
+.
+.nr doc-display-vertical 0
+.
+.
+.\" NS doc-setup-page-layout macro
+.\" NS set up page layout
+.\" NS
+.\" NS modifies:
+.\" NS doc-display-vertical
+.\" NS doc-footer-space
+.\" NS doc-header-space
+.
+.de doc-setup-page-layout
+. ie \n[cR] \
+. nr doc-header-space 0
+. el \
+. nr doc-header-space .5i
+. nr doc-footer-space .5i
+.
+. ll 78n
+. lt 78n
+. po 0i
+.
+. nr doc-display-vertical 1v
+. ad l
+. na
..
-.ds <= \&<\&=
-.ds >= \&>\&=
-.ds Rq ''
-.ds Lq ``
-.ds ua ^
-.ds aa \'
-.ds ga \`
-.ds sL `
-.ds sR '
-.ds q \&"
-.\" Math stuff
-.ds Pi pi
-.ds Ne !=
-.ds Le <=
-.ds Ge >=
+.
+.
+.ec
+.
+.ds doc-left-singlequote \[oq]
+.ds doc-right-singlequote \[cq]
+.
+.\" the following strings are `official'
+.ds <= \[<=]
+.ds >= \[>=]
+.ds aa \[aa]
+.ds ga \[ga]
+.ds q \[dq]
+.ds Ne \[!=]
+.ds Le \[<=]
+.ds Ge \[>=]
.ds Lt <
.ds Gt >
-.ds Pm +-
-.ds If infinity
-.ds Na \fINaN\fP
-.ds Ba \fR\&|\fP
-
-.\"
-.de hK
-.nr % 1
-.ds hT \\*(dT
-.if !"\\*(cH"Null" \{\
-. ie !"\\*(gP"Null" .as hT \|(\|\\*(cH\\*(gP\|)
-. el .as hT \\|(\\|\\*(cH\\|)
-.\}
-.if "\\*(cH"Null" .if !"\\*(gP"Null" .as hT \&\|(\|\\*(gP\|)
-.ie \\n(cR \{\
-. hM
-. wh -1v fM
+.ds Pm \[+-]
+.ds Na \f[I]NaN\f[P]
+.ds Ba \f[R]|\f[P]
+.
+.\" Unicode TTYs have all glyph forms; for other TTY character sets we need
+.\" character representations which are different from GNU troff's standard
+.\" forms.
+.ie '\*[.T]'utf8' \{\
+. ds Rq \[rq]
+. ds Lq \[lq]
+. ds ua \[ua]
+. ds Pi \[*p]
+. ds If \[if]
.\}
.el \{\
-. wh 0 hM
-. wh -1.167i fM
+. ds Rq ''
+. ds Lq ``
+. ds ua ^
+. ds Pi pi
+. ds If infinity
.\}
-.if \\n(nl==0:\\n(nl==-1 'bp
-.em lM
+.
+.eo
+.
+.
+.\" NS doc-header-string global string
+.\" NS the final string used for the manual page header
+.
+.ds doc-header-string
+.
+.
+.\" NS doc-setup-header macro
+.\" NS install and initialize header and footer support
+.\" NS
+.\" NS modifies:
+.\" NS doc-header-string
+.
+.de doc-setup-header
+. nr % 1
+. ds doc-header-string "\*[doc-document-title]
+. if !"\*[doc-section]"Null" \
+. as doc-header-string (\*[doc-section])
+.
+. ie \n[cR] \
+. doc-header
+. el \{\
+. wh 0 doc-header
+. wh -1.167i doc-footer
+. \}
+.
+. if ((\n[nl] == 0) : (\n[nl] == -1)) \
+' bp
+.
+. e@ doc-end-macro
..
-.nr fW \w'0'
-.de sW
-.nr sW \w\\$1
-.ie \\n(sW>=\\n(fW \{\
-. ie \\n(sW%\\n(fW .nr sW (\\n(sW/\\n(fW)+1
-. el .nr sW \\n(sW/\\n(fW
-.\}
-.el .nr sW 0
+.
+.
+.\" NS doc-get-width macro
+.\" NS computes the width of a string as a multiple of `doc-fixed-width':
+.\" NS `.doc-get-width string'
+.\" NS
+.\" NS modifies:
+.\" NS doc-width
+.
+.de doc-get-width
+. nr doc-width \w\$1
+. ie (\n[doc-width] >= \n[doc-fixed-width]) \{\
+. ie (\n[doc-width] % \n[doc-fixed-width]) \
+. nr doc-width ((\n[doc-width] / \n[doc-fixed-width]) + 1)
+. el \
+. nr doc-width (\n[doc-width] / \n[doc-fixed-width])
+. \}
+. el \
+. nr doc-width 0
..
-.de aW
-.nr sW \w\\*(A\\$1
-.ie \\n(sW>=\\n(fW \{\
-. ie \\n(sW%\\n(fW .nr sW (\\n(sW/\\n(fW)+1
-. el .nr sW \\n(sW/\\n(fW
-.\}
-.el .nr sW 0
+.
+.
+.\" NS doc-get-arg-width macro
+.\" NS computes the width of an argument as a multiple of
+.\" NS `doc-fixed-width': `.doc-get-arg-width arg-index'
+.\" NS
+.\" NS modifies:
+.\" NS doc-width
+.
+.de doc-get-arg-width
+. nr doc-width \w\*[doc-arg\$1]
+. ie (\n[doc-width] >= \n[doc-fixed-width]) \{\
+. ie (\n[doc-width] % \n[doc-fixed-width]) \
+. nr doc-width ((\n[doc-width] / \n[doc-fixed-width]) + 1)
+. el \
+. nr doc-width (\n[doc-width] / \n[doc-fixed-width])
+. \}
+. el \
+. nr doc-width 0
..
-.\" NS Ql macro - Quoted literal define
+.
+.
+.\" NS Ql user macro
+.\" NS quoted literal define
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Ql' set in doc-common
+.
.de Ql
-.if \\n(aC==0 \{\
-. ds mN Ql
-. ds A1 \\$1
-. ds A2 \\$2
-. ds A3 \\$3
-. ds A4 \\$4
-. ds A5 \\$5
-. ds A6 \\$6
-. ds A7 \\$7
-. ds A8 \\$8
-. ds A9 \\$9
-. nr fV \\n(.$
-. fV
-.\}
-.ds qL \&\\*(sL
-.ds qR \&\\*(sR
-.En \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
-..
-.\" NS Sh macro - Section Headers
-.\" NS nS register - Section Header SYNOPSIS flag
-.\" NS nF register - Section Header FILES flag
-.\" NS nA register - Section Header SEE ALSO flag
-.\" NS nT register - Section Header STANDARDS flag
-.de Sh
-.nr nS 0
-.nr sE 0
-.nr iS 0
-.ie "\\$1"NAME" \{\
-. hK
-' in 0
-.\}
-.el \{\
-. nr nS 0
-. nr nA 0
-. nr nF 0
-. nr nT 0
-. nr nY 0
-. nr aN 0
-. nr oT 0
-. if "\\$1"SEE" .nr nA 1
-. if "\\$1"FILES" .nr nF 1
-. if "\\$1"STANDARDS" .nr nT 1
-. if "\\$1"SYNOPSIS" .nr nS 1
-. if "\\$1"DESCRIPTION" \{\
-. rr fB
-. rr Fb
-. ds Fb
-. nr fY 0
-. nr fZ 0
-. \}
-. if "\\$1"AUTHORS" .nr nY 1
-. in 0
-.\}
-.pL
-'sp
-.ns
-.ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
-.if !\\n(cR .ne 3
-'fi
-\&\\*(sH\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 \|\\$7 \|\\$8 \|\\$9
-\&\fP\s0\&
-.in \\n(.iu+\\n(Tiu
-.if "\\$1"SEE" .nr sE 1
-.ns
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \
+. ds doc-macro-name Ql
+. el \
+. tm Usage: .Ql argument ... (#\n[.c])
+. \}
+.
+. ds doc-quote-left "\*[doc-left-singlequote]
+. ds doc-quote-right "\*[doc-right-singlequote]
+.
+. doc-enclose-string \$@
..
+.
+.
+.ec
+.
+.\" EOF
diff --git a/contrib/groff/tmac/doc-old.tmac b/contrib/groff/tmac/doc-old.tmac
new file mode 100644
index 0000000..5e5db59
--- /dev/null
+++ b/contrib/groff/tmac/doc-old.tmac
@@ -0,0 +1,1858 @@
+.\"
+.\" Copyright (c) 1990 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)doc-old.tmac 5.2 (Berkeley) 3/13/91
+.\" Slightly modified by jjc@jclark.com to work with groff as well.
+.\"
+.\" Assume nroff on crt's only if cR==1
+.if n .nr cR 1
+.\" STRING CONSTANTS
+.\" DITROFF
+.if t \{\
+.\" Address Style
+.ds aD \fI
+.\" Argument Reference Style
+.ds aR \f(CO
+.\" Interactive Comand Modifier (flag)
+.ds cM \f(CB
+.\" Emphasis (in the English sense - usually italics)
+.ds eM \fI
+.\" Errno Style
+.ds eR \fC
+.\" Environment Variable Style
+.ds eV \fC
+.\" Command Line Flag Style
+.ds fL \f(CB
+.\" Header String Style
+.ds Hs \fR
+.\" Interactive Command Style
+.ds iC \f(CB
+.\" Literal Style
+.ds lI \fC
+.\" Left Parenthesis Style
+.ds lP \fR\|(\|\fP
+.\" Right Parenthesis Style
+.ds rP \fR\|)\|\fP
+.\" Options Open Bracket Style
+.ds lB \fR\^[\^\fP
+.\" Options Open Bracket Style
+.ds rB \fR\^]\fP
+.\" Name (subject of manpage) Style
+.ds nM \f(CB
+.\" Pathname Style
+.ds pA \fC
+.\" Accepted punctuation string for -mdoc syntax
+.ds Pu \fR[.,:;(\^)[\^]\fR]
+.\" Section Header Style
+.ds Sp \s12\fB
+.\" .ds sT \s-2\fR
+.\" Symbolic Emphasis (boldface)
+.ds sY \f(CB
+.\" Generic Variable Style
+.ds vA \fI
+.\" Volume Title Style
+.ds Vs \fR
+.\" Cross Reference STyle (man page only)
+.ds xR \fC
+.\" Math *
+.tr *\(**
+.\}
+.\" NROFF
+.if n \{\
+.\" Address Style
+.ds aD \fI
+.\" Argument Reference Style
+.ds aR \fI
+.\" Interactive Command Modifier (flag)
+.ds cM \fB
+.\" Emphasis (in the English sense - usually italics)
+.ds eM \fI
+.\" Errno Style
+.ds eR \fR
+.\" Environment Variable Style
+.ds eV \fR
+.\" Command Line Flag Style
+.ds fL \fB
+.\" Header String Style
+.ds Hs \fR
+.\" Interactive Command Style
+.ds iC \fB
+.\" Literal Style
+.ds lI \fR
+.\" Left Parenthesis Style
+.ds lP \fR\|(\fP
+.\" Right Parenthesis Style
+.ds rP \fR\|)\fP
+.\" Options Open Bracket Style
+.ds lB \fR\|[\|\fP
+.\" Options Open Bracket Style
+.ds rB \fR\|]\fP
+.\" Name (subject of manpage) Style
+.ds nM \fB
+.\" Pathname Style
+.ds pA \fI
+.\" Accepted punctuation string for -mdoc syntax
+.ds Pu [.,;:()[]]
+.\" Section Header Style
+.ds Sp \s12\fB
+.\" .ds sT \s-2\fR
+.\" .ds sT \s-2\fR
+.\" Symbol, Mode or Mask Style
+.ds sY \fB
+.\" Generic Variable Style
+.ds vA \fI
+.\" Volume Title Style
+.ds Vs \fR
+.\" Cross Reference Style (man page only)
+.ds xR \fR
+.\}
+.\" INDENTS - Subheaders(sI), Text(Ti) between Section Headers and Subsects
+.if t \{\
+. nr sI \w'\fC,'u*5
+. nr Ti \n(sIu
+.\}
+.if n \{\
+. nr sI .5i
+. nr Ti .5i
+.\}
+.\" Flags for macros names which are used only for .Ds
+.nr dI 6n
+.nr dC 1
+.nr dL 1
+.nr dR 1
+.\" INDENT WIDTHS (for Lists)
+.\" Width Needed for Address Tag (indented amount)
+.nr Ad 12n
+.\" Angle Quote Width
+.nr Aq 12n
+.\" Width Needed for Argument
+.nr Ar 12n
+.\" Width Needed for Column offset
+.nr Cl 15n
+.\" Width neeeded for Interactive Command Modifier
+.nr Cm 10n
+.\" Width Needed for Complex Expressions
+.nr Cx 20n
+.\" Indent Width Needed for Display (right and left margins)
+.nr Ds 6n
+.\" Double Quote Width
+.nr Dq 12n
+.\" tI is dependent on Ds and used by .Dp
+.nr tI \n(Dsu
+.\" Width Needed for Display
+.nr Em 10n
+.\" Width Needed for Errno Types
+.nr Er 15n
+.\" Width Needed for Environment Variables
+.nr Ev 15n
+.\" Width Needed for Example Indent
+.nr Ex 10n
+.\" Width Needed for Flag
+.nr Fl 10n
+.\" Width Needed for Function
+.nr Fn 16n
+.\" Width neeeded for Interactive Command Name
+.nr Ic 10n
+.\" Width Needed for Constant
+.nr Li 16n
+.\" Width Needed for Math Symbol ? not sure if needed
+.nr Ms 6n
+.\" Width Needed for Name
+.nr Nm 10n
+.\" Width Needed for Option Begin
+.nr Ob 14n
+.\" Width Needed for Option End
+.nr Oe 14n
+.\" Width Needed for Option (one line)
+.nr Op 14n
+.\" Width Needed for Pathname
+.nr Pa 32n
+.\" Parenthesis Quote Width
+.nr Pq 12n
+.\" Single Quote Width
+.nr Sq 12n
+.\" Width Needed for Symbols, Modes or Masks
+.nr Sy 6n
+.\" Width needed for default or unknown text width
+.nr Tx 22n
+.\" Width Needed for Generic Variable
+.nr Va 12n
+.\" Width Needed for Cross Reference, should the cross ref be annotated.
+.nr Xr 10n
+.\" PARAGRAPH SPACE
+.if t \{\
+. nr Pp .5v
+.\}
+.if n \{\
+. nr Pp 1v
+.\}
+.\" PAGE LAYOUT
+.\" .Li Tagged Paragraph Style - zero if break on oversized tag
+.\" one if add em space and continue filling line.
+.nr tP 0
+.\" Page Layout Macro
+.de pL
+.\" DITROFF
+.ie t \{\
+.\" Header Margin
+. nr Hm .5i
+.\" Footer Margin
+. nr Fm .5i
+.\" Line length
+. nr ll 5.5i
+.\" Line length
+. ll 5.5i
+.\" Title length
+. nr lt 5.5i
+.\" Title length
+. lt 5.5i
+.\" Page offset
+. nr po 1.56i
+.\" Page offset
+. po 1.56i
+.\" Vertical space distance (from Section headers/Lists/Subsections)
+. nr vV .5v
+.\" em space
+. ds tP \|\|\|\|\|\|
+.\}
+.el \{\
+.\" Line length
+. nr ll 78n
+. ll 78n
+.\" Title length
+. nr lt 78n
+.\" Title length
+. lt 78n
+.\" Page offset
+. nr po 0i
+.\" Page offset
+. po 0i
+.\" Vertical space distance (from Section headers/Lists/Subsections)
+. nr vV 1v
+.\" em space
+. ds tP \0\0
+.\" Test for crt
+. ie \\n(cR .nr Hm 0
+. el .nr Hm .5i
+.\" Footer Margin
+. nr Fm .5i
+.\}
+..
+.\" Adjustment mode
+.if n \{\
+.ad l
+.na
+..
+.\}
+.\" PREDEFINED STRINGS
+.if t \{\
+. ds <= \(<=
+. ds >= \(>=
+. ds Lq \&``
+. ds Rq \&''
+. ds ua \(ua
+. ds aa \(aa
+. ds ga \(ga
+. ds sR \(aa
+. ds sL \(ga
+.\}
+.if n \{\
+. ds <= \&<\&=
+. ds >= \&>\&=
+. ds Rq ''
+. ds Lq ``
+. ds ua ^
+. ds aa '
+. ds ga `
+. ds sL `
+. ds sR '
+.\}
+.\" Note: The distances from the bottom or top of the page are set
+.\" in headers (macro .hK): to -1.25 for troff, and -1.167 for nroff
+.\" bottoms, and top is 0.
+.\"
+.\" .Dt Document/manpage_title section/chapter volume
+.\" The \{ and \} is necessary as roff doesn't nest if-elses
+.\" properly, especially with .ds.
+.\" TODO: separate Dt into Dt, Ch and Vt for supp docs.
+.de Dt
+.ds dT UNTITLED
+.ds vT Local
+.ds cH Null
+.\" Volume and Section Number or Chapter Number
+.if !"\\$1"" .ds dT \\$1
+.if !"\\$2"" \{\
+. ds cH \\$2
+. if "\\$3"" \{\
+. \" Volume Title if none given
+. if \\$2>=1 .if \\$2<=8 \{\
+. ds vT UNIX Reference Manual
+. if \\$2>1 .if \\$2<6 .ds vT UNIX Programmer's Manual
+. if "\\$2"8" .ds vT UNIX System Manager's Manual
+. \}
+. if "\\$2"unass" .ds vT DRAFT
+. if "\\$2"draft" .ds vT DRAFT
+. if "\\$2"paper" .ds vT Null
+. \}
+.\}
+.if !"\\$3"" \{\
+. \" Volume Title if given
+. if "\\$3"USD" .ds vT UNIX User's Supplementary Documents
+. if "\\$3"PS1" .ds vT UNIX Programmers's Supplementary Documents
+. if "\\$3"AMD" .ds vT UNIX Ancestral Manual Documents
+. if "\\$3"SMM" .ds vT UNIX System Manager's Manual
+. if "\\$3"URM" .ds vT UNIX Reference Manual
+. if "\\$3"PRM" .ds vT UNIX Programmers's Manual
+. if "\\$3"IND" .ds vT UNIX Manual Master Index
+. if "\\$3"CON" .ds vT UNIX Contributed Software Manual
+. if "\\$3"IMP" .ds vT UNIX Implementation Notes
+. if "\\$3"HOW" .ds vT UNIX How Pocket Manual
+. if "\\$3"LOCAL" .ds vT UNIX Local Manual
+. if "\\*(vT"Local" .ds vT \\$3
+.\}
+..
+.\"
+.\" .Os Operating System/Standard and Release or Version Number
+.\"
+.de Os
+.ds oS Null
+.if "\\$1"" \{\
+. ds oS \fIBSD Experimental\fP
+.\" . ds oS (\fIBag o' Bits\fP)
+.\}
+.if "\\$2"" \{\
+. ds o1 Non-Null
+.\}
+.if "\\$1"ATT" \{\
+. ds oS AT&T
+. if "\\$2"" .as oS \0UNIX
+. if "\\$2"7th" .as oS \07th Edition
+. if "\\$2"7" .as oS \07th Edition
+. if "\\$2"III" .as oS \0System III
+. if "\\$2"3" .as oS \0System III
+. if "\\$2"V" .as oS \0System V
+. if "\\$2"V.2" .as oS \0System V Release 2
+. if "\\$2"V.3" .as oS \0System V Release 3
+. if "\\$2"V.4" .as oS \0System V Release 4
+.\}
+.if "\\$1"BSD" \{\
+. if "\\$2"3" .ds oS 3rd Berkeley Distribution
+. if "\\$2"4" .ds oS 4th Berkeley Distribution
+. if "\\$2"4.1" .ds oS 4.1 Berkeley Distribution
+. if "\\$2"4.2" .ds oS 4.2 Berkeley Distribution
+. if "\\$2"4.3" .ds oS 4.3 Berkeley Distribution
+. if "\\$2"4.3+" .ds oS 4.3+tahoe Berkeley Distribution
+.\}
+.if "\\*(oS"Null" .ds oS \\$1
+.if "\\*(o1"Non-Null" .as oS \0\\$2
+.rm o1
+..
+.\"
+.\" Standards
+.\"
+.\" .de St
+.\" .ds sT Null
+.\" .if "\\$1"POSIX" \{\
+.\" . ds sT IEEE Standard POSIX
+.\" . if \\$2 .as sT \0\\$2
+.\" .\}
+.\" .if "\\$1"ANSI" \{\
+.\" . ds sT ANSI Standard
+.\" . if \\$2 .as sT \0\\$2
+.\" .\}
+.\" .if "\\$1"ISO" \{\
+.\" . ds sT ISO Standard
+.\" . if \\$2 .as sT \0\\$2
+.\" .\}
+.\" .if "\\*(sT"Null" .ds sR \\$3
+.\" ..
+.\"
+.\" .de Gp
+.\" .ie !"\\$1"" .ds gP \&\\$1 \\$2 \\$3 \\$4 \\$5
+.\" .el .ds gP Null
+.\" ..
+.\"
+.\"
+.de Dd
+.nr aa 0
+.ie \\n(.$>0 \{\
+. ie \\n(.$<4 \{\
+. ds dD \\$1 \\$2 \\$3
+. \}
+. el .tm Usage: .Dd Month Day, Year (e.g July 4, 1977).
+.\}
+.el \{\
+. ds dD Epoch
+.\}
+..
+.\"
+.\" House Keeping Macro - Make sense of dT, cH, vT, sT, gP and dS
+.\" TODO: Try to get else's for efficiency
+.\" TODO: GET RID OF .wh -1.167i (its in v7)
+.\"
+.\"
+.de hK
+.nr % 1
+.ds hT \\*(dT
+.if !"\\*(cH"Null" \{\
+. ie !"\\*(gP"Null" .as hT \|(\|\\*(cH\\*(gP\|)
+. el .as hT \\|(\\|\\*(cH\\|)
+.\}
+.if "\\*(cH"Null" .if !"\\*(gP"Null" .as hT \&\|(\|\\*(gP\|)
+.if t \{\
+. wh 0 hM
+. wh -1.25i fM
+.\}
+.if n \{\
+. ie \\n(cR \{\
+. hM
+. wh -0v fM
+. \}
+. el \{\
+. wh 0 hM
+. wh -1.167i fM
+. \}
+.\}
+.if n \{\
+. if \\n(nl==0:\\n(nl==-1 'bp
+.\}
+.if t 'bp
+.em lM
+..
+.\" Header Macro
+.\"
+.de hM
+.ev 1
+.pL
+.if !\\n(cR 'sp \\n(Hmu
+.tl @\\*(Hs\\*(hT\fP@\\*(Vs\\*(vT\fP@\\*(Hs\\*(hT\fP@
+'sp \\n(Hmu
+.ev
+..
+.\"
+.de fM
+.ev 1
+.pL
+.if !\\n(cR \{\
+' sp \\n(Fmu
+. tl @\\*(Hs\\*(oS\fP@\\*(Vs\\*(dD\fP@%@
+' bp
+.\}
+.if \\n(cR \{\
+.\" . tl @\\*(Hs\\*(oS\fP@\\*(Vs\\*(dD\fP@%@
+.\" ' bp
+.\}
+.ev
+..
+.de lM
+.fl
+.if \\n(cR \{\
+. fM
+. pl \\n(nlu
+.\}
+..
+.de Pp
+.sp \\n(Ppu
+.ne 2
+.ns
+..
+.de Lp
+.Pp
+..
+.de LP
+.tm Not a \-mdoc command: .LP
+..
+.de PP
+.tm Not a \-mdoc command: .PP
+..
+.de pp
+.tm Not a \-mdoc command: .pp
+..
+.de Co
+.tm Not a \-mdoc command: .Co
+..
+.nr z. 1
+.nr z, 1
+.nr z: 1
+.nr z; 1
+.nr z) 1
+.nr z( 1
+.nr z[ 1
+.nr z] 1
+.\" This is disgusting, troff not parse if stmt properly
+.nr z1 0
+.nr z2 0
+.nr z3 0
+.nr z4 0
+.nr z5 0
+.nr z6 0
+.nr z7 0
+.nr z8 0
+.nr z9 0
+.nr z0 0
+.nr z# 0
+.\"
+.de Ad
+.ie \\n(.$==0 \{\
+. tm Usage: .Ad address [...] \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(aD
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.\" Command Line Argument Macro
+.\"
+.de Ar
+.ie \\n(.$==0 \{\
+. ie !"\\*(iM"" .as f1 \&[\|\\*(aRfile\ ...\fP\|]
+. el \&[\|\\*(aRfile\ ...\fP\|]
+.\}
+.el \{\
+. ds sV \\*(aR
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Em
+.ie \\n(.$==0 \{\
+. tm Usage: .Em text ... \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(eM
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Er
+.ie \\n(.$==0 \{\
+. tm Usage: .Er ERRNOTYPE ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(eR
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Ev
+.ie \\n(.$==0 \{\
+. tm Usage: .Ev ENVIRONMENT_VARIABLE(s) ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(eV
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.\" Flag Name Macro
+.\"
+.de Fl
+.ie \\n(.$==0 \{\
+. ie !"\\*(iM"" .as f1 \&\\*(fL\-\fP
+. el \&\\*(fL\-\fP
+.\}
+.el \{\
+. nr rZ 0
+. sW \\$1
+. if (\\n(sW==1&\\n(.$==1) .rZ \\$1
+. ds sV \\*(fL
+. nr cF \\n(.f
+. ie \\n(rZ \{\
+. ie "\\*(iM"" .ds f1 \&\\*(sV\-\f\\n(cF\\$1
+. el \&\\*(sV\-\f\\n(cF\\$1
+. \}
+. el \{\
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. fB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+. \}
+.\}
+..
+.\" Interactive Commands Macro
+.\"
+.de Ic
+.ie \\n(.$==0 \{\
+. tm Usage: .Ic Interactive Commands(s) ... \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(iC
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.\" Interactive Command Modifiers (flags)
+.\"
+.de Cm
+.ie \\n(.$==0 \{\
+. tm Usage: .Cm Interactive Command Modifier(s) ... \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(cM
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Li
+.ie \\n(.$==0 \{\
+. tm Usage: .Li literal ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(lI
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\" If in nroff or any other case where the default font
+.\" is constant width, and literal means zilch, single quote instead.
+.ie n \{\
+.de Ql
+. ie \\n(.$==0 \{\
+. tm Usage: .Ql literal ... \\*(Pu
+. \}
+. el \{\
+. Sq \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+..
+.\}
+.el \{\
+.de Ql
+. ie \\n(.$==0 \{\
+. tm Usage: .Ql literal ... \\*(Pu
+. \}
+. el \{\
+. Li \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+..
+.\}
+.\"
+.de Nm
+.ie \\n(.$==0 \{\
+. if "\\*(n1"" .tm Usage: .Nm Name(s) ... \\*(Pu
+. ie !"\\*(iM"" .as f1 \&\\*(nM\\*(n1\\$1\fP
+. el \&\\*(nM\\*(n1\\$1\fP
+.\}
+.el \{\
+. ds sV \\*(nM
+. nr cF \\n(.f
+. if \\n(nS \{\
+. rs
+. in -\\n(iSu
+. ie \\n(nS>1 .br
+. el \{\
+. sW \\$1
+. nr iS ((\\n(sW+1)*\\n(fW)u
+. \}
+. in +\\n(iSu
+. ti -\\n(iSu
+. nr nS \\n(nS+1
+. \}
+. if "\\*(n1"" .ds n1 \\$1
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Pa
+.ie \\n(.$==0 \{\
+\&\\*(pA~\fP
+.\}
+.el \{\
+. ds sV \\*(pA
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Sy
+.ie \\n(.$==0 \{\
+. tm Usage: .Sy Symbolic Text ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(sY
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Ms
+.ie \\n(.$==0 \{\
+. tm Usage: .Ms Math Symbol ... \\*(Pu
+. \}
+.el \{\
+. ds sV \\*(sY
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de Va
+.ie \\n(.$==0 \{\
+. tm Usage: .Va variable_name(s) ... \\*(Pu
+.\}
+.el \{\
+. ds sV \\*(vA
+. nr cF \\n(.f
+. ie "\\*(iM"" .ds f1 \&\\*(sV
+. el .as f1 \&\\*(sV
+. nB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+.\}
+..
+.\"
+.de nB
+.hy 0
+.if \\n(.$==0 .tm Usage error: called with empty arguments (empty quotes)?
+.ie \\n(.$>1 \{\
+. rZ \\$1
+. ie \\n(rZ .as f1 \&\f\\n(cF\\$1\fP
+. el .as f1 \&\\$1
+. rZ \\$2
+. if !\\n(rZ \{\
+. ie !"\\*(iM""\{\
+.\" I surrender
+. if "\\*(iM"Tp" .as f1 \&\ \&
+. if "\\*(iM"Dp" .as f1 \&\ \&
+. if "\\*(iM"Op" .as f1 \&\ \&
+. if "\\*(iM"Cx" .as f1 \&\ \&
+. if "\\*(iM"Dq" .as f1 \& \&
+. if "\\*(iM"Sq" .as f1 \& \&
+. if "\\*(iM"Pq" .as f1 \& \&
+. if "\\*(iM"Aq" .as f1 \& \&
+. \}
+. el .as f1 \& \&
+. \}
+. nB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.\}
+.el \{\
+. rZ \\$1
+. ie \\n(rZ .as f1 \&\f\\n(cF\\$1
+. el .as f1 \&\\$1\f\\n(cF
+. if "\\*(iM"" \{\&\\*(f1
+. ds f1
+. \}
+. hy
+.\}
+..
+.de fB
+.hy 0
+.if \\n(.$==0 .tm Usage error: called with empty arguments (empty quotes)?
+.ie \\n(.$>1 \{\
+. rZ \\$1
+. ie \\n(rZ .as f1 \&\f\\n(cF\\$1\fP
+. el \{\
+. ie "\\$1"-" .as f1 \&\-\-
+. el .as f1 \&\-\\$1
+. \}
+. rZ \\$2
+. if !\\n(rZ \{\
+. ie !"\\*(iM""\{\
+.\" I surrender
+. if "\\*(iM"Tp" .as f1 \&\ \&
+. if "\\*(iM"Dp" .as f1 \&\ \&
+. if "\\*(iM"Op" .as f1 \&\ \&
+. if "\\*(iM"Cx" .as f1 \&\ \&
+. if "\\*(iM"Dq" .as f1 \& \&
+. if "\\*(iM"Sq" .as f1 \& \&
+. if "\\*(iM"Pq" .as f1 \& \&
+. if "\\*(iM"Aq" .as f1 \& \&
+. \}
+. el .as f1 \& \&
+. \}
+. fB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.\}
+.el \{\
+. rZ \\$1
+. ie \\n(rZ .as f1 \&\f\\n(cF\\$1
+. el \{\
+. ie "\\$1"-" .as f1 \&\-\-\f\\n(cF
+. el .as f1 \&\-\\$1\f\\n(cF
+. \}
+. if "\\*(iM"" \{\&\\*(f1
+. ds f1
+. \}
+. hy
+.\}
+..
+.\"
+.\" Single quoted Items
+.\" eF, sB g[0-9] and f2
+.de Sq
+.nr eF 0
+.ie \\n(.$==0 \{\
+. ie "\\*(iM"" \&\\*(sL\&\\*sR
+. el .as f1 \&\\*(sL\&\\*(sR
+.\}
+.el \{\
+. ie "\\*(iM"" \{\
+. ds f1 \&\\*(sL
+. ds iM Sq
+. \}
+. el .as f1 \&\\*(sL
+. sB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ie \\n(eF>0 .\\*(g1 \\*(g2 \\*(g3 \\*(g4 \\*(g5 \\*(g6 \\*(g7 \\*(g8
+. el .as f1 \\*(g0
+. as f1 \\*(sR
+. if !"\\*(f2"" .as f1 \\*(f2
+. if "\\*(iM"Sq" \{\
+\&\\*(f1
+. ds f1
+. ds iM
+. \}
+. ds f2
+. rm g0 g1 g2 g3 g4 g5 g6 g7 g8 g9
+. nr eF 0
+.\}
+..
+.\"
+.\" Double quoted Items
+.de Dq
+.nr Ef 0
+.ie \\n(.$==0 \{\
+. ie "\\*(iM"" \&\\*(Lq\&\\*(Rq
+. el .as f1 \&\\*(Lq\&\\*(Rq
+.\}
+.el \{\
+. ie "\\*(iM"" \{\
+. ds f1 \&\\*(Lq
+. ds iM Dq
+. \}
+. el .as f1 \&\\*(Lq
+. Sb \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ie \\n(Ef>0 .\\*(k1 \\*(k2 \\*(k3 \\*(k4 \\*(k5 \\*(k6 \\*(k7 \\*(k8
+. el .as f1 \\*(k0
+. as f1 \\*(Rq
+. if !"\\*(f4"" .as f1 \\*(f4
+. if "\\*(iM"Dq" \{\
+\&\\*(f1
+. ds f1
+. ds iM
+. \}
+. ds f4
+. rm k0 k1 k2 k3 k4 k5 k6 k7 k8 k9
+. nr Ef 0
+.\}
+..
+.\"
+.\" Parenthesis quoted Items
+.de Pq
+.nr pQ 0
+.ie \\n(.$==0 \{\
+. ie "\\*(iM"" \&(\&)
+. el .as f1 \&(\&)
+.\}
+.el \{\
+. ie "\\*(iM"" \{\
+. ds f1 \&(
+. ds iM Pq
+. \}
+. el .as f1 \&(
+. pB \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ie \\n(pQ>0 .\\*(y1 \\*(y2 \\*(y3 \\*(y4 \\*(y5 \\*(y6 \\*(y7 \\*(y8
+. el .as f1 \\*(y0
+. as f1 \&)
+. if !"\\*(f3"" .as f1 \\*(f3
+. if "\\*(iM"Pq" \{\
+\&\\*(f1
+. ds f1
+. ds iM
+. \}
+. ds f3
+. rm y0 y1 y2 y3 y4 y5 y6 y7 y8 y9
+. nr pQ 0
+.\}
+..
+.\" eF, sB g[0-9] and f2
+.de sB
+.hy 0
+.ie \\n(.$==0 .tm Sick Logic: macro sB
+.el \{\
+. ie \\n(eF>=1 .nr eF \\n(eF+1
+. el \{\
+. mN \\$1
+. if \\n(mN .nr eF \\n(eF+1
+. \}
+. rZ \\$1
+. ie \\n(rZ .as f2 \\$1
+. el \{\
+. ie \\n(eF<1 .as g\\n(eF \\$1
+. el .as g\\n(eF \\$1
+. \}
+. if \\n(.$>1 \{\
+. rZ \\$2
+. if \\n(rZ==0 \{\
+. if \\n(eF<1 \{\
+. as g\\n(eF \& \&
+. \}
+. \}
+. sB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.de Sb
+.hy 0
+.ie \\n(.$==0 .tm Sick Logic: macro Sb
+.el \{\
+. ie \\n(Ef>=1 .nr Ef \\n(Ef+1
+. el \{\
+. mN \\$1
+. if \\n(mN .nr Ef \\n(Ef+1
+. \}
+. rZ \\$1
+. ie \\n(rZ .as f4 \\$1
+. el \{\
+. ie \\n(Ef<1 .as k\\n(Ef \\$1
+. el .as k\\n(Ef \\$1
+. \}
+. if \\n(.$>1 \{\
+. rZ \\$2
+. if \\n(rZ==0 \{\
+. if \\n(Ef<1 \{\
+. as k\\n(Ef \& \&
+. \}
+. \}
+. Sb \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.de pB
+.hy 0
+.ie \\n(.$==0 .tm Sick Logic: macro pB
+.el \{\
+. ie \\n(pQ>=1 .nr pQ \\n(pQ+1
+. el \{\
+. mN \\$1
+. if \\n(mN .nr pQ \\n(pQ+1
+. \}
+. rZ \\$1
+. ie \\n(rZ .as f3 \\$1
+. el \{\
+. ie \\n(pQ<1 .as y\\n(pQ \\$1
+. el .as y\\n(pQ \\$1
+. \}
+. if \\n(.$>1 \{\
+. rZ \\$2
+. if \\n(rZ==0 \{\
+. if \\n(pQ<1 \{\
+. as y\\n(pQ \& \&
+. \}
+. \}
+. pB \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.de aQ
+.hy 0
+.ie \\n(.$==0 .tm Bad Syntax: .Aq
+.el \{\
+. ie \\n(aQ>=1 .nr aQ \\n(aQ+1
+. el \{\
+. mN \\$1
+. if \\n(mN .nr aQ \\n(aQ+1
+. \}
+. rZ \\$1
+. ie \\n(rZ .as aZ \\$1
+. el \{\
+. ie \\n(aQ<1 .as a\\n(aQ \\$1
+. el .as a\\n(aQ \\$1
+. \}
+. if \\n(.$>1 \{\
+. rZ \\$2
+. if \\n(rZ==0 \{\
+. if \\n(aQ<1 \{\
+. as a\\n(aQ \& \&
+. \}
+. \}
+. aQ \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.\" Angle Bracket Quoted Items
+.de Aq
+.nr aQ 0
+.ie \\n(.$==0 \{\
+. ie "\\*(iM"" \&<\&>
+. el .as f1 \&<\&>
+.\}
+.el \{\
+. ie "\\*(iM"" \{\
+. ds f1 \&<
+. ds iM Aq
+. \}
+. el .as f1 \&<
+. aQ \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+. ie \\n(aQ>0 .\\*(a1 \\*(a2 \\*(a3 \\*(a4 \\*(a5 \\*(a6 \\*(a7 \\*(a8
+. el .as f1 \\*(a0
+. as f1 \&>
+. if !"\\*(aZ"" .as f1 \\*(aZ
+. if "\\*(iM"Aq" \{\
+\&\\*(f1
+. ds f1
+. ds iM
+. \}
+. ds aZ
+. rm a0 a1 a2 a3 a4 a5 a6 a7 a8
+. nr aQ 0
+.\}
+..
+.\" macro Name test, return macro register value if true
+.if \n(.g .ig
+.de mN
+.nr mN 0
+.sW \\$1
+.if \\n(sW==2 \{\
+. if \\n(\\$1 .nr mN \\n(\\$1
+.\}
+..
+.if !\n(.g .ig
+.de mN
+.nr mN 0
+.if \A'\\$1' \{\
+. sW \\$1
+. if \\n(sW==2 \{\
+. if \\n(\\$1 .nr mN \\n(\\$1
+. \}
+.\}
+..
+.\" Punctuation test (using z registers), return 1 if true
+.if \n(.g .ig
+.de rZ
+.nr rZ 0
+.sW \\$1
+.if \\n(sW==1 \{\
+. if \\n(z\\$1==1 \{\
+. nr rZ 1
+. \}
+.\}
+..
+.if !\n(.g .ig
+.de rZ
+.nr rZ 0
+.if \A'\\$1' \{\
+. sW \\$1
+. if \\n(sW==1 \{\
+. if \\n(z\\$1==1 \{\
+. nr rZ 1
+. \}
+. \}
+.\}
+..
+.\"
+.\" sW returns number of characters in a string
+.if t \{\
+.nr fW \w'\fC,'
+.de sW
+.nr sW \w'\fC\\$1'
+.\}
+.if n \{\
+.nr fW \w'0'
+.de sW
+.nr sW \w'\\$1'
+.\}
+.ie \\n(sW>=\\n(fW \{\
+. ie \\n(sW%\\n(fW .nr sW (\\n(sW/\\n(fW)+1
+. el .nr sW \\n(sW/\\n(fW
+.\}
+.el .nr sW 0
+..
+.\" Option Expression -
+.\" TODO - add line overflow check (right!)
+.nr eP 0
+.ds e1
+.nr oE 0
+.nr hP 0
+.ds hP
+.nr Ep 0
+.de Op
+.hy 0
+.if "\\*(iM"" \{\
+. ds iM Op
+. ds f1 \&
+.\}
+.as f1 \&\\*(lB
+.\" .tm Op: \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.dO \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.ie !"\\$1"Cx" .oE
+.el .nr oE \\n(oE+1
+..
+.\"
+.\" just for mike, with every bite of garlic in mind (oops, i mean burp).
+.\" dO: go dOwn an argument vector and test each argument to see if
+.\" a macro name or punctuation. stash in respective place along
+.\" with its arguments.
+.nr oO 0
+.nr oP 0
+.nr aO 0
+.de dO
+.mN \\$1
+.ie \\n(mN \{\
+. if \\n(oP \{\
+. if \\n(hP \{\
+. nr oZ 1
+. oZ
+. Oz
+. \}
+. if \\n(e1==1 \{\
+.\\*(e1 \\*(e2 \\*(e3 \\*(e4 \\*(e5 \\*(e6 \\*(e7 \\*(e8 \\*(e9
+. \}
+. uO
+. if !(\\n(oO:\\n(aO) .as f1 \& \&
+. \}
+. ie "\\$1"Op" \{\
+. as f1 \&\\*(lB
+. nr aO \\n(aO+1
+. \}
+. el \{\
+. nr eP \\n(eP+1
+. ds e\\n(eP \\$1
+. nr e\\n(eP 1
+. \}
+.\}
+.el \{\
+.\" .tm dO: $1: \\$1: eP \\n(eP e[\\n(eP]: \\*(e\\n(ePEE
+. rZ \\$1
+. ie \\n(rZ \{\
+.\" .tm dO:rZ: $1: \\$1: eP \\n(eP e[\\n(eP]: \\*(e\\n(eP
+. nr hP \\n(hP+1
+. ds h\\n(hP \\$1
+. \}
+. el \{\
+.\" .tm dO:word $1: \\$1: eP \\n(eP e[\\n(eP]: \\*(e\\n(ePEE
+. if \\n(eP==0:\\n(e\\n(eP==1 .nr eP \\n(eP+1
+. if \\n(eZ .as e\\n(eP \& \&
+. as e\\n(eP " \&\\$1
+.\" . ds e\\n(eP \&\\$1
+. nr eZ \\n(eZ+1
+. \}
+.\}
+.nr oP 1
+.ie \\n(.$>1 \{\
+. dO \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.\}
+.el \{\
+. ie \\n(e1 \{\
+.\\*(e1 \\*(e2 \\*(e3 \\*(e4 \\*(e5 \\*(e6 \\*(e7 \\*(e8 \\*(e9
+. \}
+. el \{\
+. as f1 \\*(e1
+. \}
+.\}
+..
+.\" handle old style arguments such as the arg -Idir
+.\" in adb, .Oo is a toggle.
+.de Oo
+.ie \\n(oO .nr oO 0
+.el .nr oO 1
+..
+.\" stash punctuation
+.de oZ
+.if \\n(hP>=\\n(oZ \{\
+. nr eP \\n(eP+1
+. ds e\\n(eP \\*(h\\n(oZ
+. nr oZ \\n(oZ+1
+. oZ
+.\}
+..
+.\" clean up punctuation vector
+.de Oz
+.if \\n(hP>0 \{\
+. rm h\\n(hP
+. nr hP \\n(hP-1
+. Oz
+.\}
+..
+.\" uO: go back up created vector cleaning it up along the way
+.de uO
+.if \\n(eP>0 \{\
+. rm e\\n(eP
+. rr e\\n(eP
+. nr eP \\n(eP-1
+. nr oP 0
+. nr eZ 0
+. uO
+.\}
+..
+.\" option end
+.de oE
+.uO
+.ie \\n(hP \{\
+. as f1 \\*(rB\\*(h1\\*(h2\\*(h3
+. Oz
+. nr oZ 0
+.\}
+.el \{\
+. as f1 \\*(rB
+.\}
+.ie "\\*(iM"Op" \{\
+. if \\n(aO .aO
+.if t \{\
+. if (\\n(.lu-\\n(.ku-\\n(.ou-(2*\\n(fWu))<\w'\fC\\*(f1'u .br
+.\}
+.if n \{\
+. nr aa \w'\\*(f1'u
+.\" . nr qq \\n(.lu-\\n(.ku-\\n(.ou
+.\" \&aa == \\n(aa, f1==\\*(f1, qq==\\n(qq
+. if (\\n(.lu-\\n(.ku-\\n(.ou-\\n(aau)<=(8*\\n(fWu) .br
+.\}
+\&\\*(f1
+. ds iM
+. ds f1
+. hy
+.\}
+.el .nr oE \\n(oE-1
+..
+.de aO
+.as f1 \\*(rB
+.nr aO \\n(aO-1
+.if \\n(aO >0 .aO
+..
+.\"
+.de Xr
+.if \\n(.$<=1 \{\
+. ie \\n(.$==1 \{\
+. if !"\\*(iM"" .as f1 \&\\*(xR\\$1\fP
+. if "\\*(iM"" \&\\*(xR\\$1\fP
+. \}
+. el .tm Xr Usage: .Xr manpage_name [section#] \\*(Pu
+.\}
+.if \\n(.$==2 \{\
+. rZ \\$2
+. ie "\\*(iM"" \{\
+. ie \\n(rZ \&\\*(xR\\$1\fP\\$2
+. el \&\\*(xR\\$1\fP(\\$2)
+. \}
+. el \{\
+. ie \\n(rZ .as f1 \&\\*(xR\\$1\fP\\$2
+. el .as f1 \&\\*(xR\\$1\fP(\\$2)
+. \}
+.\}
+.if \\n(.$>=3 \{\
+. rZ \\$2
+. ie \\n(rZ \{\
+. ie !"\\*(iM"" .as f1 \&\\*(xR\\$1\fP\\$2\\$3\\$4\\$5\\$6\\$7\\$8
+. el \&\\*(xR\\$1\fP\\$2\\$3\\$4\\$5\\$6\\$7\\$8
+. \}
+. el \{\
+. rZ \\$3
+. ie \\n(rZ \{\
+. if !"\\*(iM"" \{\
+. as f1 \&\\*(xR\\$1\fP(\\$2)\\$3\\$4\\$5\\$6\\$7\\$8
+. \}
+. if "\\*(iM"" \{\
+\&\\*(xR\\$1\fP(\\$2)\\$3\\$4\\$5\\$6\\$7\\$8
+. \}
+. \}
+. el \{\
+. tm rZ = \\n(rZ the arg is \\$3
+. tm Xr-XX Usage: .Xr manpage_name [section#] \\*(Pu
+. \}
+. \}
+.\}
+..
+.\"
+.\"
+.de Ex
+.tm Ex defunct, Use .Dl: \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+..
+.\" Display (one) Line of text.
+.de Dl
+.ie "\\*(iM"" \{\
+' ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
+. in \\n(.iu+\\n(Dsu
+. mN \\$1
+. ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. el \{\
+. nr cF \\n(.f
+.\" Literal font is none specified
+\&\\*(lI\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. ft \\n(cF
+. \}
+. in \\n(.iu-\\n(Dsu
+.\}
+.el \{\
+. mN \\$1
+. ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+. el \{\
+. nr cF \\n(.f
+. ds f1 \&\\*(lI\\&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+. as f1 \&\f\\n(cF
+. \}
+.\}
+..
+.\"
+.\"
+.\" user set Tagged Paragraph Width (used in both Dp and Tp)
+.de Tw
+.ie \\n(.$==0 \{\
+. nr aa 0
+.\}
+.el \{\
+. mN \\$1
+. ie \\n(sW>2 \{\
+. nr tW (\\n(sW+3)*\\n(fWu)
+. \}
+. el \{\
+. ie \\n(mN .nr tW \\n(mN
+. el .nr tW \\$1
+. \}
+. nr tF 1
+.\}
+..
+.\"
+.de Dw
+.Tw \\$1
+..
+.\"
+.de Di
+.ie \\n(.$==0 \{\
+. nr tI \\n(Dsu
+.\}
+.el \{\
+. sW \\$1
+. if \\n(sW>=2 \{\
+. nr tI \\$1u
+. \}
+. if \\n(sW<2 \{\
+. if "\\$1"L" \{\
+. nr tI 0
+. \}
+. \}
+.\}
+..
+.\" tagged paragraph
+.\" initialize baby stack variables
+.nr np 0
+.nr p1 0
+.ds s\n(np
+.\"
+.de Tp
+.ie "\\$1"" .pE p s np
+.el \{\
+. ds iM Tp
+. mN \\$1
+. ie \\n(tF \{\
+. ds tC Tw
+. nr tC 1
+. nr tF 0
+. \}
+. el \{\
+. if !"Tw"\\*(s\\n(np" \{\
+. ie \\n(mN \{\
+. ds tC \\$1
+. nr tW \\n(mN
+. \}
+. el \{\
+. ds tC Tx
+. nr tW \\n(Tx
+. \}
+. if !"\\*(tC"\\*(s\\n(np" .nr tC 1
+. \}
+. \}
+. sp \\n(vVu
+. if !\\n(cR .ne 2
+. if \\n(tC \{\
+. nr np \\n(np+1
+. nr p\\n(np \\n(tW
+. ds s\\n(np \\*(tC
+. nr tC 0
+. ds tC
+. in \\n(.iu+\\n(p\\n(npu
+. \}
+. ie \\n(mN \{\
+. ds f1
+. \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. if !"\\$1"Cx" .pT st p np
+. \}
+. el \{\
+. br
+. ev 1
+. fi
+. di Td
+\&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. br
+. di
+. ev
+. na
+. ds tD \\*(Td\\
+. pT di p np
+. \}
+.\}
+..
+.\"
+.\"
+.\" Complex Expression Macro
+.\"
+.\" TODO: add length across line boundary check (like Li)
+.de Cx
+.hy 0
+.ie \\n(.$==0 \{\
+. if "\\*(iM"Cx" \{\
+. ds iM
+. if \\n(oE .oE
+\&\\*(f1
+. ds f1
+. \}
+. if "\\*(iM"Tp" .pT st p np
+. if "\\*(iM"Dp" .pT st q mp
+.\}
+.el \{\
+. if "\\*(iM"" \{\
+. ds iM Cx
+. ds f1 \&
+. \}
+. mN \\$1
+.\" Here are the args: `\\$1' `\\$2' `\\$3' `\\$4'
+. ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. el \{\
+. as f1 \&\\$1
+. if \\n(.$>1 .Cx \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.\" Prefix string in default font to content specified string
+.de Pf
+.Cx \\$1
+.\\$2 \\$3 \\$4 \\$5
+.Cx
+..
+.\" Suffix string in default font to content specified string
+.de Sf
+.Cx \\$1 \\$2
+.Cx \\$3
+.Cx
+..
+.\" Simple Option Begin
+.de Ob
+.hy 0
+.ie "\\*(iM"" \{\
+. ev 2
+. fi
+. di oB
+.\}
+.el \{\
+.tm shouldn't be here
+. as f1 \&[
+. mN \\$1
+. ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. el \{\
+. as f1 \&\\$1
+. if \\n(.$>1 .Oc \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+.\}
+..
+.de Oc
+.as f1 \&\\$1
+.if \\n(.$>1 .Oc \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+..
+.de Oe
+.hy 0
+.ie "\\*(iM"" \{\
+. br
+. di
+. ev
+. ds bO \\*(oB\\
+\&[\\*(bO\&]
+.\}
+.el \{\
+. as f1 \&]
+.\}
+..
+.\" White space for Cx
+.de Ws
+.Cx \&\ \&
+..
+.\" tagged paragraph
+.\" initialize baby stack variables
+.nr mp 0
+.nr q1 0
+.ds r\n(np
+.\"
+.\" Complex Dp tag
+.de Dc
+.Dp Cx \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+..
+.\" Complex Tp tag
+.de Tc
+.Tp Cx \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+..
+.\" Tag with a flag and an argument with a space
+.de Ta
+.if "\\$2"" \{\
+. Tp Fl \\$1
+.\}
+.el \{\
+. Tp Fl \\$1
+. Cx \&\ \&
+. Ar \\$2 \\$3
+. Cx
+.\}
+..
+.de Da
+.Dp Cx Fl \\$1
+.Ws
+.Ar \\$2 \\$3
+.Cx
+..
+.de To
+.Tp Cx Fl \\$1
+.Ar \\$2 \\$3
+.Cx
+..
+.de Do
+.Dp Cx Fl \\$1
+.Ar \\$2 \\$3
+.Cx
+..
+.\" Blended tag toggle
+.de Bt
+.ie \\n(tP==0 .nr tP 1
+.el .nr tP 0
+..
+.\" Bullet paragraph
+.de Bu
+.Tp Sy \&\(bu
+..
+.\" Display tagged paragraph
+.de Dp
+.ie "\\$1"" \{\
+. pE q r mp
+. sp \\n(vVu
+.\}
+.el \{\
+. ds iM Dp
+. mN \\$1
+. ie \\n(tF \{\
+. ds tC Tw
+. nr tC 1
+. nr tF 0
+. \}
+. el \{\
+. if !"Tw"\\*(r\\n(mp" \{\
+. ie \\n(mN \{\
+. ds tC \\$1
+. nr tW \\n(mN
+. \}
+. el \{\
+. ds tC Tx
+. nr tW \\n(Tx
+. \}
+. if !"\\*(tC"\\*(r\\n(mp" .nr tC 1
+. \}
+. \}
+. if !\\n(cR .ne 2
+. if \\n(tC \{\
+. nr mp \\n(mp+1
+. nr q\\n(mp \\n(tW
+. ds r\\n(mp \\*(tC
+. nr tC 0
+. ds tC
+. ie \\n(tIu==\\n(Dsu .nr i\\n(mp \\n(Dsu
+. el \{\
+. nr i\\n(mp \\n(tIu
+. nr tI \\n(Dsu
+. \}
+. in \\n(.iu+\\n(i\\n(mpu
+. sp \\n(vVu
+. in \\n(.iu+\\n(\\q\\n(mpu
+. \}
+. ie \\n(mN \{\
+. \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. if !"\\$1"Cx" .pT st q mp
+. \}
+. el \{\
+. br
+. ev 1
+. fi
+. di Td
+\&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. br
+. di
+. ev
+. na
+. ds tD \\*(Td\\
+. pT di q mp
+. \}
+.\}
+..
+.\"
+.\" .pE number_stack string_stack counter
+.de pE
+.ie "\\$3"mp" \{\
+. in \\n(.iu-(\\n(\\$1\\n(\\$3u)-(\\n(i\\n(mpu)
+. rr i\\n(mp
+.\}
+.el .in \\n(.iu-\\n(\\$1\\n(\\$3u
+.\" .in \\n(.iu-\\n(\\$1\\n(\\$3u
+.if \\n(\\$3<=0 .tm Extraneous call .Tp or .Dp
+.rr \\$1\\n(\\$3
+.rm \\$2\\n(\\$3
+.nr \\$3 \\n(\\$3-1
+.ds iM
+..
+.\"
+.\" .pT [st or di] number_stack counter
+.de pT
+.ie "\\$1"st" \{\
+. nr bb \\n(\\$2\\n(\\$3u
+. ti -\\n(bbu
+. ie (\\n(\\$2\\n(\\$3u-2n)<=\w'\\*(f1'u \{\&\\*(f1\\*(tP
+. if \\n(tP==0 .br
+. \}
+. el \\*(f1\h'|\\n(\\$2\\n(\\$3u'\c
+.\}
+.el \{\
+. ti -\\n(\\$2\\n(\\$3u
+. ie (\\n(\\$2\\n(\\$3u-2n)<=\\n(dlu \{\&\\*(tD\\*(tP
+. if !\\n(tP .br
+. \}
+. el \\*(tD\h'|\\n(\\$2\\n(\\$3u'\c
+. if t 'ad
+.\}
+. ds iM
+. ds f1
+'fi
+..
+.\"
+.\" The new SH
+.\"
+.de Sh
+.\" set Sh state off, check for list state before calling indent (.In)
+.nr nS 0
+.nr sE 0
+.ie "\\$1"NAME" \{\
+.\" name state on, housekeep (headers & footers)
+. hK
+' in 0
+.\}
+.el \{\
+. if "\\$1"SYNOPSIS" .nr nS 1
+. in 0
+.\}
+.pL
+'sp
+.ns
+.ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
+.if !\\n(cR .ne 3
+'fi
+\&\fB\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 \|\\$7 \|\\$8 \|\\$9
+\&\fP\&
+.in \\n(.iu+\\n(Tiu
+.if "\\$1"SEE" .nr sE 1
+.ns
+..
+.\"
+.\" Nd minus sign for an en dash used in .Sh Name
+.de Nd
+\&\-\& \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+..
+.de Ss
+.sp
+.ti -.25i
+\&\fB\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6 \|\\$7 \|\\$8 \|\\$9
+\&\fP\&
+.ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
+.if !\\n(cR .ne 2
+.br
+..
+.\" .if "\\$1"Ss" .in \\n(.iu+\\n(sIu
+.\"..
+.\"
+.\"
+.\" Column Macro
+.\"
+.hy 0
+.de Cw
+.ie \\n(.$==0 \{\
+. br
+. in \\n(.iu-\\n(eWu
+. ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
+.\}
+.el \{\
+. Pp
+. if \\n(.$==1 \{\
+. ta \w'\\$1 'u
+. nr eW \w'\\$1 'u
+' in \\n(.iu+\\n(eWu
+. \}
+. if \\n(.$==2 \{\
+. ta \w'\\$1 'u +\w'\\$2 'u
+. nr eW \w'\\$1 'u+\w'\\$2 'u
+' in \\n(.iu+\\n(eWu
+. \}
+. if \\n(.$==3 \{\
+. ta \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u
+. nr eW \w'\\$1 'u+\w'\\$2 'u+\w'\\$3 'u
+' in \\n(.iu+\\n(eWu
+. \}
+. if \\n(.$==4 \{\
+. ta \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u +\w'\\$4 'u
+. nr eW \w'\\$1 'u+\w'\\$2 'u+\w'\\$3 'u +\w'\\$4 'u
+' in \\n(.iu+\\n(eWu
+. \}
+. if \\n(.$==5 \{\
+.ta \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u +\w'\\$4 'u +\w'\\$5 'u
+.nr eW \w'\\$1 'u +\w'\\$2 'u +\w'\\$3 'u +\w'\\$4 'u +\w'\\$5 'u
+' in \\n(.iu+\\n(eWu
+. \}
+.\}
+..
+.de Cl
+.ti -\\n(eWu
+.mN \\$1
+.ie \\n(mN .\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.el \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+..
+.nr dQ 0
+.de Ds
+.ie !"\\$1"" \{\
+. mN d\\$1
+. if \\n(mN \{\
+. nr dQ \\n(dQ+1
+. d\\$1
+. \}
+.\}
+.el .br
+.nf
+..
+.de Df
+.ie !"\\$1"" \{\
+. mN d\\$1
+. if \\n(mN \{\
+. nr dQ \\n(dQ+1
+. d\\$1
+. \}
+.\}
+.el .br
+..
+.de Dn
+\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+.nf
+..
+.de dI
+.nr d\\n(dQ \\n(dIu
+.in \\n(.iu+\\n(dIu
+..
+.de dC
+.nr d\\n(dQ (\\n(.l-\\n(.i)/4u
+.in \\n(.iu+\\n(d\\n(dQu
+..
+.de dR
+.nr d\\n(dQ (\\n(.l/3)u
+.in \\n(.iu+\\n(d\\n(dQu
+..
+.de dL
+.nr aa 0
+..
+.de De
+.br
+.if \\n(d\\n(dQ \{\
+. in \\n(.iu-\\n(d\\n(dQu
+. rr d\\n(dQ
+. nr dQ \\n(dQ-1
+.\}
+.fi
+..
+.\"
+.de Fn
+.ie \\n(.$==0 \{\
+. tm Usage: .Fn function_name function_arg(s) ... \\*(Pu
+.\}
+.el \{\
+. nr cF \\n(.f
+. ie \\n(.$==1 .ds f1 \&\\*(nM\\$1\fP\\*(lP\fP\\*(rP\fP
+. el \{\
+. ds f1 \\*(nM\\$1\fP\\*(lP
+. nr aa 0
+. rC \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
+. \}
+. if "\\*(iM"" \{\\&\\*(f1
+. ds f1
+. \}
+.\}
+..
+.\"
+.de rC
+.rZ \\$1
+.ie \\n(rZ \{\
+. as f1 \f\\n(cF\\*(rP\f\\n(cF\\$1\\$2\\$3\\$4\\$5\\$6\\$7
+.\}
+.el \{\
+. ie \\n(aa .as f1 \fP, \\*(aR\\$1
+. el .as f1 \\*(aR\\$1
+. nr aa 1
+. ie \\n(.$>1 .rC \\$2 \\$3 \\$4 \\$5 \\$6 \\$7
+. el .as f1 \fP\\*(rP\fP
+.\}
+..
diff --git a/contrib/groff/tmac/doc-syms b/contrib/groff/tmac/doc-syms
index 57e682a..5cf30ee 100644
--- a/contrib/groff/tmac/doc-syms
+++ b/contrib/groff/tmac/doc-syms
@@ -1,5 +1,5 @@
-.\" Copyright (c) 1991 The Regents of the University of California.
-.\" All rights reserved.
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
@@ -11,8 +11,8 @@
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
@@ -29,208 +29,700 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)doc-syms 5.6 (Berkeley) 8/5/91
+.\" @(#)doc-syms 8.1 (Berkeley) 06/08/93
.\"
.\" %beginstrip%
-.\" NS Ux macro - UNIX
+.
+.
+.eo
+.
+.\" NS Ux user macro
+.\" NS print UNIX
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Ux
+.\" NS
+.\" NS width register `Ux' defined in doc-common
+.
.de Ux
-.nr cF \\n(.f
-.nr cZ \\n(.s
-.ds aa \&\f\\n(cF\s\\n(cZ
-.as b1 \&\\*(tNUNIX\\*(aa
-.rm aa
-.if \\n(aC==0 \{\
-. if \\n(.$>0 .aV \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
-.\}
-.ie \\n(aC>\\n(aP \{\
-. nr aP \\n(aP+1
-. ie \\n(C\\n(aP==1 \{\
-. \\*(A\\n(aP
-. \}
-. el .nR
-.\}
-.el .aZ
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ds doc-str-Ux \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]
+.
+. if !\n[doc-arg-limit] \
+. if \n[.$] \{\
+. ds doc-macro-name Ux
+. doc-parse-args \$@
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] \*[doc-Tn-font-size]UNIX\*[doc-str-Ux]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
..
-.\" NS Bx macro -BSD UNIX (fix smaller nroff version)
+.
+.
+.\" NS Bx user macro
+.\" NS print BSD (fix smaller nroff version)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Bx
+.\" NS doc-str-Bx1
+.\" NS doc-str-Bx-XXX
+.\" NS
+.\" NS width register `Bx' defined in doc-common
+.
+.ds doc-str-Bx-Reno \-Reno
+.ds doc-str-Bx-reno \-Reno
+.ds doc-str-Bx-Tahoe \-Tahoe
+.ds doc-str-Bx-tahoe \-Tahoe
+.ds doc-str-Bx-Lite \-Lite
+.ds doc-str-Bx-lite \-Lite
+.ds doc-str-Bx-Lite2 \-Lite2
+.ds doc-str-Bx-lite2 \-Lite2
+.
.de Bx
-.nr cF \\n(.f
-.nr cZ \\n(.s
-.ds aa \&\f\\n(cF\s\\n(cZ
-.if \\n(aC==0 \{\
-. ie \\n(.$==0 \&\\*(tNBSD\\*(aa \\*(tNUNIX\\*(aa
-. el .aV \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
-.\}
-.if "\\$1"-alpha" \{\
-\&currently in alpha test.
-. aY
-.\}
-.if "\\$1"-beta" \{\
-\&currently in beta test.
-. aY
-.\}
-.if "\\$1"-devel" \{\
-\&currently under development.
-. aY
-.\}
-.if \\n(aC>\\n(aP \{\
-. nr aP \\n(aP+1
-. ie \\n(C\\n(aP==2 \{\
-. as b1 \&\\*(A\\n(aP\&\\*(tNBSD\\*(aa
-. ie \\n(aC>\\n(aP \{\
-. nr jj \\n(aP+1
-. ie \\n(C\\n(jj==2 \{\
-. if "\\*(A\\n(jj"Reno" \{\
-. nr aP \\n(aP+1
-. as b1 \&\-\\*(A\\n(jj
-. \}
-. if "\\*(A\\n(jj"reno" \{\
-. nr aP \\n(aP+1
-. as b1 \&\-Reno
-. \}
-. if "\\*(A\\n(jj"Tahoe" \{\
-. nr aP \\n(aP+1
-. as b1 \&\-\\*(A\\n(jj
-. \}
-. if "\\*(A\\n(jj"tahoe" \{\
-. nr aP \\n(aP+1
-. as b1 \&\-Tahoe
-. \}
-. ie \\n(aC>\\n(aP \{\
-. nr aP \\n(aP+1
-. nR
-. \}
-. el .aZ
-. \}
-. el \{\
-. nr aP \\n(aP+1
-. nR
-. \}
-. rr jj
-. \}
-. el .aZ
-. \}
-. el \{\
-. as b1 \&\\*(tNBSD\\*(aa U\\*(tNNIX\\*(aa
-. nR
-. \}
-.\}
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ds doc-str-Bx \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]
+.
+. \" default value if no argument
+. ds doc-str-Bx1 \*[doc-Tn-font-size]BSD\*[doc-str-Bx]
+.
+. if !\n[doc-arg-limit] \
+. if \n[.$] \{\
+. ds doc-macro-name Bx
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie "\*[doc-arg\n[doc-arg-ptr]]"-alpha" \
+. as doc-str-Bx1 " (currently in alpha test)
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-beta" \
+. as doc-str-Bx1 " (currently in beta test)
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-devel" \
+. as doc-str-Bx1 " (currently under development)
+. el \{\
+. ds doc-str-Bx1 \&\*[doc-arg\n[doc-arg-ptr]]\^\*[doc-Tn-font-size]
+. as doc-str-Bx1 BSD\*[doc-str-Bx]
+.
+. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie d doc-str-Bx-\*[doc-arg\n[doc-arg-ptr]] \
+. as doc-str-Bx1 "\*[doc-str-Bx-\*[doc-arg\n[doc-arg-ptr]]]
+. el \
+. nr doc-arg-ptr -1
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}\}\}\}\}
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Bx1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
..
-.\" Ns Ud macro - prints "currently under development" (HISTORY section)
+.
+.
+.\" NS Ud user macro (not parsed, not callable)
+.\" NS print "currently under development" (HISTORY section)
+.\" NS
+.\" NS width register `Ud' defined in doc-common
+.
.de Ud
-\&currently under development.
+. nop \&currently under development.
..
-.\" Ns At macro - AT&T UNIX
+.
+.
+.\" NS At user macro
+.\" NS print AT&T UNIX
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-At
+.\" NS doc-str-At1
+.\" NS doc-str-At-XXX
+.\" NS
+.\" NS width register `At' defined in doc-common
+.
+.ds doc-str-At-32v \&Version\~32V
+.as doc-str-At-32v " \*[doc-Tn-font-size]AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v1 \&Version\~1
+.as doc-str-At-v1 " \*[doc-Tn-font-size]AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v2 \&Version\~2
+.as doc-str-At-v2 " \*[doc-Tn-font-size]AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v3 \&Version\~3
+.as doc-str-At-v3 " \*[doc-Tn-font-size]AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v4 \&Version\~4
+.as doc-str-At-v4 " \*[doc-Tn-font-size]AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v5 \&Version\~5
+.as doc-str-At-v5 " \*[doc-Tn-font-size]AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v6 \&Version\~6
+.as doc-str-At-v6 " \*[doc-Tn-font-size]AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-v7 \&Version\~7
+.as doc-str-At-v7 " \*[doc-Tn-font-size]AT&T UNIX\*[doc-str-At]
+.ds doc-str-At-V \*[doc-Tn-font-size]AT&T\*[doc-str-At] System\~V
+.as doc-str-At-V " \*[doc-Tn-font-size]UNIX\*[doc-str-At]
+.ds doc-str-At-V.1 \*[doc-Tn-font-size]AT&T\*[doc-str-At] System\~V.1
+.as doc-str-At-V.1 " \*[doc-Tn-font-size]UNIX\*[doc-str-At]
+.ds doc-str-At-V.2 \*[doc-Tn-font-size]AT&T\*[doc-str-At] System\~V.2
+.as doc-str-At-V.2 " \*[doc-Tn-font-size]UNIX\*[doc-str-At]
+.ds doc-str-At-V.4 \*[doc-Tn-font-size]AT&T\*[doc-str-At] System\~V.4
+.as doc-str-At-V.4 " \*[doc-Tn-font-size]UNIX\*[doc-str-At]
+.
.de At
-.nr cF \\n(.f
-.nr cZ \\n(.s
-.ds aa \&\f\\n(cF\s\\n(cZ
-.if \\n(.$==2 \{\
-. if "\\$1"32v" \&Version 32V \\*(tNAT&T UNIX\\*(aa\\$2
-. if "\\$1"v6" \&Version 6 \\*(tNAT&T UNIX\\*(aa\\$2
-. if "\\$1"v7" \&Version 7 \\*(tNAT&T UNIX\\*(aa\\$2
-. if "\\$1"V" \&\\*(tNAT&T\\*(aa System V \\*(tNUNIX\\*(aa\\$2
-. if "\\$1"V.1" \&\\*(tNAT&T\\*(aa System V.1 \\*(tNUNIX\\*(aa\\$2
-. if "\\$1"V.4" \&\\*(tNAT&T\\*(aa System V.4 \\*(tNUNIX\\*(aa\\$2
-.\}
-.if \\n(.$==1 \{\
-. if "\\$1"32v" \&Version 32V \\*(tNAT&T UNIX\\*(aa
-. if "\\$1"v6" \&Version 6 \\*(tNAT&T UNIX\\*(aa
-. if "\\$1"v7" \&Version 7 \\*(tNAT&T UNIX\\*(aa
-. if "\\$1"V" \&\\*(tNAT&T\\*(aa System V \\*(tNUNIX\\*(aa
-. if "\\$1"V.1" \&\\*(tNAT&T\\*(aa System V.1 \\*(tNUNIX\\*(aa
-. if "\\$1"V.4" \&\\*(tNAT&T\\*(aa System V.4 \\*(tNUNIX\\*(aa
-.\}
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ds doc-str-At \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]
+.
+. \" default value if no argument
+. ds doc-str-At1 \*[doc-Tn-font-size]AT&T UNIX\*[doc-str-At]
+.
+. if !\n[doc-arg-limit] \
+. if \n[.$] \{\
+. ds doc-macro-name At
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie \A\*[doc-arg\n[doc-arg-ptr]] \{\
+. ie d doc-str-At-\*[doc-arg\n[doc-arg-ptr]] \
+. ds doc-str-At1 "\*[doc-str-At-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc mdoc warning: .At: Unknown AT&T UNIX version
+. tm1 " `\*[doc-arg\n[doc-arg-ptr]]' (#\n[.c])
+. nr doc-arg-ptr -1
+. \}\}
+. el \
+. nr doc-arg-ptr -1
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-At1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
..
+.
+.
+.\" NS Fx user macro
+.\" NS print FreeBSD
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Fx
+.\" NS doc-str-Fx1
+.\" NS
+.\" NS width register `Fx' defined in doc-common
+.
+.\" we use the doc-operating-system-FreeBSD-* strings defined in doc-common
+.
+.de Fx
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ds doc-str-Fx \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]
+.
+. \" default value if no argument
+. ds doc-str-Fx1 \*[doc-Tn-font-size]\%FreeBSD\*[doc-str-Fx]
+.
+. if !\n[doc-arg-limit] \
+. if \n[.$] \{\
+. ds doc-macro-name Fx
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie \A\*[doc-arg\n[doc-arg-ptr]] \{\
+. ie d doc-operating-system-FreeBSD-\*[doc-arg\n[doc-arg-ptr]] \
+. as doc-str-Fx1 \~\*[doc-operating-system-FreeBSD-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc mdoc warning: .Fx: Unknown FreeBSD version
+. tm1 " `\*[doc-arg\n[doc-arg-ptr]]' (#\n[.c])
+. as doc-str-Fx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}\}
+. el \
+. as doc-str-Fx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Fx1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.
+.
+.\" NS Nx user macro
+.\" NS print NetBSD
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Nx
+.\" NS doc-str-Nx1
+.\" NS
+.\" NS width register `Nx' defined in doc-common
+.
+.\" we use the doc-operating-system-NetBSD-* strings defined in doc-common
+.
+.de Nx
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ds doc-str-Nx \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]
+.
+. \" default value if no argument
+. ds doc-str-Nx1 \*[doc-Tn-font-size]\%N\s[\n[doc-curr-size]u]et
+. as doc-str-Nx1 \*[doc-Tn-font-size]BSD\*[doc-str-Nx]
+.
+. if !\n[doc-arg-limit] \
+. if \n[.$] \{\
+. ds doc-macro-name Nx
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie \A\*[doc-arg\n[doc-arg-ptr]] \{\
+. ie d doc-operating-system-NetBSD-\*[doc-arg\n[doc-arg-ptr]] \
+. as doc-str-Nx1 \~\*[doc-operating-system-NetBSD-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc mdoc warning: .Nx: Unknown NetBSD version
+. tm1 " `\*[doc-arg\n[doc-arg-ptr]]' (#\n[.c])
+. as doc-str-Nx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}\}
+. el \
+. as doc-str-Nx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Nx1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.
+.
+.\" NS Ox user macro
+.\" NS print OpenBSD
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Ox
+.\" NS doc-str-Ox1
+.\" NS
+.\" NS width register `Ox' defined in doc-common
+.
+.de Ox
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ds doc-str-Ox \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]
+.
+. \" default value if no argument
+. ds doc-str-Ox1 \*[doc-Tn-font-size]\%OpenBSD\*[doc-str-Ox]
+.
+. if !\n[doc-arg-limit] \
+. if \n[.$] \{\
+. ds doc-macro-name Ox
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \
+. as doc-str-Ox1 \~\*[doc-arg\n[doc-arg-ptr]]
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Ox1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.
+.
+.\" NS Bsx user macro
+.\" NS print BSD/OS
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Bsx
+.\" NS doc-str-Bsx1
+.\" NS
+.\" NS width register `Bsx' defined in doc-common
+.
+.de Bsx
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ds doc-str-Bsx \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]
+.
+. \" default value if no argument
+. ds doc-str-Bsx1 \*[doc-Tn-font-size]BSD/OS\*[doc-str-Bsx]
+.
+. if !\n[doc-arg-limit] \
+. if \n[.$] \{\
+. ds doc-macro-name Bsx
+. doc-parse-args \$@
+. \}
+.
+. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \
+. as doc-str-Bsx1 \~\*[doc-arg\n[doc-arg-ptr]]
+. el \
+. nr doc-arg-ptr -1
+. \}
+.
+. \" replace current argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Bsx1]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. doc-print-recursive
+..
+.
+.
.\" The Bt macro should go away now
-.\" Ns Bt macro - prints "is currently in beta test." (HISTORY section)
+.
+.\" NS Bt user macro (not parsed, not callable)
+.\" NS print "is currently in beta test." (HISTORY section)
+.\" NS
+.\" NS width register `Bt' defined in doc-common
+.
.de Bt
-\&is currently in beta test.
+. nop \&is currently in beta test.
..
-.\" NS St macro - standards (posix, ansi - formal standard names)
-.ds Px \\*(tNPOSIX
-.ds Ai \\*(tNANSI
+.
+.
+.\" NS Px user macro
+.\" NS print POSIX
+.
+.ds Px \*[doc-Tn-font-size]\%POSIX
+.
+.
+.\" NS Ai user macro
+.\" NS print ANSI
+.
+.ds Ai \*[doc-Tn-font-size]\%ANSI
+.
+.
+.\" NS St user macro
+.\" NS standards (posix, ansi - formal standard names)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-reg-St
+.\" NS doc-str-St
+.\" NS doc-str-St1
+.\" NS doc-str-St-XXX
+.\" NS
+.\" NS width register `St' defined in doc-common
+.
+.\" ANSI/ISO C
+.ds doc-str-St--ansiC-89 \*[Ai] \*[doc-str-St]X\^3.159-1989
+.as doc-str-St--ansiC-89 " (\*[Lq]\)\*[Ai]\~C\*[doc-str-St]\*[Rq])
+.als doc-str-St--ansiC doc-str-St--ansiC-89
+.ds doc-str-St--isoC \*[doc-Tn-font-size]ISO/IEC\*[doc-str-St] 9899:1990
+.as doc-str-St--isoC " (\*[Lq]\*[doc-Tn-font-size]ISO\~C\^89\*[doc-str-St]\*[Rq])
+.ds doc-str-St--isoC-99 \*[doc-Tn-font-size]ISO/IEC\*[doc-str-St] 9899:1999
+.as doc-str-St--isoC-99 " (\*[Lq]\*[doc-Tn-font-size]ISO\~C\^99\*[doc-str-St]\*[Rq])
+.
+.\" POSIX Part 1: System API
+.ds doc-str-St--p1003.1 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.1
+.as doc-str-St--p1003.1 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1-88 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.1-1988
+.as doc-str-St--p1003.1-88 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1-90 \*[doc-Tn-font-size]ISO/IEC\*[doc-str-St] 9945-1:1990
+.as doc-str-St--p1003.1-90 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.als doc-str-St--iso9945-1-90 doc-str-St--p1003.1-90
+.ds doc-str-St--p1003.1b-93 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.1b-1993
+.as doc-str-St--p1003.1b-93 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1c-95 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.1c-1995
+.as doc-str-St--p1003.1c-95 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1i-95 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.1i-1995
+.as doc-str-St--p1003.1i-95 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.ds doc-str-St--p1003.1-96 \*[doc-Tn-font-size]ISO/IEC\*[doc-str-St] 9945-1:1996
+.as doc-str-St--p1003.1-96 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.als doc-str-St--iso9945-1-96 doc-str-St--p1003.1-96
+.ds doc-str-St--p1003.1g-2000 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.1g-2000
+.as doc-str-St--p1003.1g-2000 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq])
+.
+.\" POSIX Part 2: Shell and Utilities
+.ds doc-str-St--p1003.2 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.2
+.as doc-str-St--p1003.2 " (\*[Lq]\)\*[Px]\*[doc-str-St].2\*[Rq])
+.ds doc-str-St--p1003.2-92 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.2-1992
+.as doc-str-St--p1003.2-92 " (\*[Lq]\)\*[Px]\*[doc-str-St].2\*[Rq])
+.ds doc-str-St--p1003.2a-92 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.2a-1992
+.as doc-str-St--p1003.2a-92 " (\*[Lq]\)\*[Px]\*[doc-str-St].2\*[Rq])
+.ds doc-str-St--iso9945-2-93 \*[doc-Tn-font-size]ISO/IEC\*[doc-str-St] 9945-2:1993
+.as doc-str-St--iso9945-2-93 " (\*[Lq]\)\*[Px]\*[doc-str-St].2\*[Rq])
+.
+.\" X/Open
+.ds doc-str-St--susv2 Version\~2 of the Single \*[doc-Tn-font-size]UNIX\*[doc-str-St] Specification
+.as doc-str-St--susv2 " (\*[Lq]\*[doc-Tn-font-size]SUSv2\*[doc-str-St]\*[Rq])
+.ds doc-str-St--svid4 System\~V Interface Definition, Fourth Edition
+.as doc-str-St--svid4 " (\*[Lq]\*[doc-Tn-font-size]SVID\*[doc-str-St]\^4\*[Rq])
+.ds doc-str-St--xbd5 \*[doc-Tn-font-size]X/Open\*[doc-str-St] System Interface Definitions Issue\~5
+.as doc-str-St--xbd5 " (\*[Lq]\*[doc-Tn-font-size]XBD\*[doc-str-St]\^5\*[Rq])
+.ds doc-str-St--xcu5 \*[doc-Tn-font-size]X/Open\*[doc-str-St] Commands and Utilities Issue\~5
+.as doc-str-St--xcu5 " (\*[Lq]\*[doc-Tn-font-size]XCU\*[doc-str-St]\^5\*[Rq])
+.ds doc-str-St--xcurses4.2 \*[doc-Tn-font-size]X/Open\*[doc-str-St] Curses Issue\~4.2
+.as doc-str-St--xcurses4.2 " (\*[Lq]\*[doc-Tn-font-size]XCURSES\*[doc-str-St]\^4.2\*[Rq])
+.ds doc-str-St--xns5 \*[doc-Tn-font-size]X/Open\*[doc-str-St] Networking Services Issue\~5
+.as doc-str-St--xns5 " (\*[Lq]\*[doc-Tn-font-size]XNS\*[doc-str-St]\^5\*[Rq])
+.ds doc-str-St--xns5.2 \*[doc-Tn-font-size]X/Open\*[doc-str-St] Networking Services Issue\~5.2
+.as doc-str-St--xns5.2 " (\*[Lq]\*[doc-Tn-font-size]XNS\*[doc-str-St]\^5.2\*[Rq])
+.ds doc-str-St--xpg3 \*[doc-Tn-font-size]X/Open\*[doc-str-St] Portability Guide Issue\~3
+.as doc-str-St--xpg3 " (\*[Lq]\*[doc-Tn-font-size]XPG\*[doc-str-St]\^3\*[Rq])
+.ds doc-str-St--xpg4 \*[doc-Tn-font-size]X/Open\*[doc-str-St] Portability Guide Issue\~4
+.as doc-str-St--xpg4 " (\*[Lq]\*[doc-Tn-font-size]XPG\*[doc-str-St]\^4\*[Rq])
+.ds doc-str-St--xpg4.2 \*[doc-Tn-font-size]X/Open\*[doc-str-St] Portability Guide Issue\~4.2
+.as doc-str-St--xpg4.2 " (\*[Lq]\*[doc-Tn-font-size]XPG\*[doc-str-St]\^4.2\*[Rq])
+.ds doc-str-St--xsh5 \*[doc-Tn-font-size]X/Open\*[doc-str-St] System Interfaces and Headers Issue\~5
+.as doc-str-St--xsh5 " (\*[Lq]\*[doc-Tn-font-size]XSH\*[doc-str-St]\^5\*[Rq])
+.
+.\" Miscellaneous
+.ds doc-str-St--ieee754 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 754-1985
+.ds doc-str-St--iso8802-3 \*[doc-Tn-font-size]ISO/IEC\*[doc-str-St] 8802-3:1989
+.
.de St
-.if \\n(aC==0 \{\
-. ie \\n(.$==0 \{\
-.tm Usage: .St [-p1003.1-88 | -p1003.2 | -ansiC-89 | -iso ] \\*(Pu ... (#\\n(.c)
-. \}
-. el \{\
-. ds mN St
-. nr aP 0
-. ds A1 \\$1
-. ds A2 \\$2
-. ds A3 \\$3
-. ds A4 \\$4
-. ds A5 \\$5
-. ds A6 \\$6
-. ds A7 \\$7
-. ds A8 \\$8
-. ds A9 \\$9
-. nr fV \\n(.$
-. fV
-. \}
-.\}
-.if \\n(aC>\\n(aP \{\
-. nr cF \\n(.f
-. nr cZ \\n(.s
-. ds aa \&\f\\n(cF\s\\n(cZ
-. nr aP \\n(aP+1
-. if "\\*(A\\n(aP"-p1003.1-88" \{\
-. ie \\n(sT==1 \{\
-. ds b1 \&\\*(tNIEEE Std\\*(aa1003.1-1988\\*(sV
-. as b1 (``\\*(tN\\*(Px\\*(aa'')
-. \}
-. el \{\
-. ds b1 \&\\*(tNIEEE Std\\*(aa1003.1-1988\\*(sV
-. as b1 (``\\*(tN\\*(Px\\*(aa'')
-. \}
-. \}
-. if "\\*(A\\n(aP"-p1003.2" \{\
-. ie \\n(sT==1 \{\
-. ds b1 \&\\*(tNIEEE Std\\*(aa1003.2
-. as b1 (``\\*(tN\\*(Px\\*(aa'')
-. \}
-. el \{\
-. ds b1 \&\\*(tNIEEE Std\\*(aa1003.2\\*(sV
-. as b1 (``\\*(tN\\*(Px\\*(aa'')
-. \}
-. \}
-. if "\\*(A\\n(aP"-ansiC" \{\
-. ie \\n(sT==1 \{\
-. ds b1 \&\\*(tNANSI C\\*(aa3.159-1989\\*(sV
-. as b1 (``\\*(tNANSI C\\*(aa'')
-. \}
-. el \{\
-. ds b1 \&\\*(tNANSI C\\*(aa3.159-1989\\*(sV
-. as b1 (``\\*(tNANSI C\\*(aa'')
-. \}
-. \}
-. if "\\*(A\\n(aP"-ansiC-89" \{\
-. ie \\n(sT==1 \{\
-. ds b1 \&\\*(tNANSI C\\*(aa3.159-1989\\*(sV
-. as b1 (``\\*(tNANSI C\\*(aa'')
-. \}
-. el \{\
-. ds b1 \&\\*(tNANSI C\\*(aa3.159-1989\\*(sV
-. as b1 (``\\*(tNANSI C\\*(aa'')
-. \}
-. \}
-. if "\\*(A\\n(aP"-iso8802-3" \{\
-. ie \\n(sT==1 \{\
-. ds b1 \&\\*(tNISO \\*(aa8802-3: 1989
-.\" . ds b1 \&\\*(tNISO \\*(aa8802-3: 1989\\*(sV
-.\" . as b1 (``\\*(tNANSI C\\*(aa'')
-. \}
-. el \{\
-. ds b1 \&\\*(tNISO \\*(aa8802-3: 1989
-.\" . ds b1 \&\\*(tNISO \\*(aa8802-3: 1989\\*(sV
-.\" . as b1 (``\\*(tNANSI C\\*(aa'')
-. \}
-. \}
-. ie \\n(aC>\\n(aP \{\
-. nr aP \\n(aP+1
-. nR
-. \}
-. el .aZ
-.\}
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name St
+. doc-parse-args \$@
+. \}
+. el \
+. doc-St-usage
+. \}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ds doc-str-St \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]
+.
+. ds doc-str-St1
+. ie \A\*[doc-arg\n[doc-arg-ptr]] \{\
+. ie d doc-str-St-\*[doc-arg\n[doc-arg-ptr]] \
+. ds doc-str-St1 "\*[doc-str-St-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc "mdoc warning: .St: Unknown standard abbreviation
+. tm1 " `\*[doc-arg\n[doc-arg-ptr]]' (#\n[.c])
+. tm1 " Please refer to the groff_mdoc(7) manpage for a
+. tm1 " list of available standard abbreviations.
+. \}\}
+. el \
+. doc-St-usage
+.
+. \" replacing argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-St1]
+.
+. doc-print-recursive
+. \}
+. el \{\
+. doc-St-usage
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS doc-St-usage macro
+.
+.de doc-St-usage
+. tm1 "Usage: .St standard (#\n[.c])
+. tm1 " Please refer to the groff_mdoc(7) manpage for a list of
+. tm1 " available standard abbreviations.
+..
+.
+.
+.\" NS Lb user macro
+.\" NS formal library names for LIBRARY sections
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-reg-Lb
+.\" NS doc-str-Lb
+.\" NS doc-str-Lb-XXX
+.\" NS
+.\" NS width register `Lb' defined in doc-common
+.
+.ds doc-str-Lb-libarm32 ARM32 Architecture Library (libarm32, \-larm32)
+.ds doc-str-Lb-libc Standard C\~Library (libc, \-lc)
+.ds doc-str-Lb-libcompat Compatibility Library (libcompat, \-lcompat)
+.ds doc-str-Lb-libcrypt Crypt Library (libcrypt, \-lcrypt)
+.ds doc-str-Lb-libcurses Curses Library (libcurses, \-lcurses)
+.ds doc-str-Lb-libedit Command Line Editor Library (libedit, \-ledit)
+.ds doc-str-Lb-libi386 i386 Architecture Library (libi386, \-li386)
+.ds doc-str-Lb-libipsec IPsec Policy Control Library (libipsec, \-lipsec)
+.ds doc-str-Lb-libkvm Kernel Data Access Library (libkvm, \-lkvm)
+.ds doc-str-Lb-libm Math Library (libm, \-lm)
+.ds doc-str-Lb-libmenu Curses Menu Library (libmenu, \-lmenu)
+.ds doc-str-Lb-libossaudio OSS Audio Emulation Library (libossaudio, \-lossaudio)
+.ds doc-str-Lb-libposix \*[Px] Compatibility Library (libposix, \-lposix)
+.ds doc-str-Lb-libresolv DNS Resolver Library (libresolv, \-lresolv)
+.ds doc-str-Lb-libtermcap Termcap Access Library (libtermcap, \-ltermcap)
+.ds doc-str-Lb-libutil System Utilities Library (libutil, \-lutil)
+.ds doc-str-Lb-libz Compression Library (libz, \-lz)
+.
+.de Lb
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Lb
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Lb library_name ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. ie d doc-str-Lb-\*[doc-arg\n[doc-arg-ptr]] \
+. ds doc-str-Lb "\*[doc-str-Lb-\*[doc-arg\n[doc-arg-ptr]]]
+. el \{\
+. tmc "mdoc warning: .Lb: no description for library
+. tm1 " `\*[doc-arg\n[doc-arg-ptr]]' available (#\n[.c])
+. ds doc-str-Lb library \*[Lq]\*[doc-arg\n[doc-arg-ptr]]\*[Rq]
+. \}
+.
+. \" replacing argument with result
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Lb]
+.
+. doc-print-recursive
+. \}
+. el \{\
+. tm Usage: .Lb library_name ... (#\n[.c])
+. doc-reset-args
+. \}
..
+.
+.
+.ec
+.
+.\" EOF
diff --git a/contrib/groff/tmac/doc.tmac b/contrib/groff/tmac/doc.tmac
new file mode 100644
index 0000000..815e3d4
--- /dev/null
+++ b/contrib/groff/tmac/doc.tmac
@@ -0,0 +1,6189 @@
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)doc 8.1 (Berkeley) 06/08/93
+.\"
+.\" Modified by jjc@jclark.com as follows: the doc-* files are assumed to be
+.\" installed as mdoc/doc-* rather than tmac.doc-* (the filename
+.\" `tmac.doc-common' would be too long); when using groff, the doc-* files
+.\" are loaded using the `mso' request.
+.\"
+.\" Modified by
+.\"
+.\" Werner LEMBERG <wl@gnu.org> and
+.\" Ruslan Ermilov <ru@freebsd.org>
+.\"
+.\" to make it more readable: using long names and many groff features,
+.\" updating and extending documentation, etc.
+.\"
+.\" %beginstrip%
+.
+.
+.if !\n(.g \
+. ab This version of mdoc can be run with GNU troff only!
+.
+.
+.cp 0
+.
+.
+.if ((\n[.x] == 0) : ((\n[.x] == 1) & (\n[.y] < 17))) \
+. ab You need GNU troff version 1.17 or higher to run this version of mdoc!
+.
+.
+.\" Load start-up files
+.ie t \
+. mso mdoc/doc-ditroff
+.el \
+. mso mdoc/doc-nroff
+.
+.mso mdoc/doc-common
+.mso mdoc/doc-syms
+.
+.
+.eo
+.
+.
+.\" NS doc-macro-name global string
+.\" NS name of calling request (set in each user-requestable macro)
+.
+.ds doc-macro-name
+.als doc-arg0 doc-macro-name
+.
+.
+.\" NS doc-arg-limit global register
+.\" NS total number of arguments
+.
+.nr doc-arg-limit 0
+.
+.
+.\" NS doc-num-args global register
+.\" NS number of arguments to handle (must be set to \n[.$] prior to
+.\" NS `doc-parse-arg-vector' request)
+.
+.nr doc-num-args 0
+.
+.
+.\" NS doc-arg-ptr global register
+.\" NS argument pointer
+.
+.nr doc-arg-ptr 0
+.
+.
+.\" NS doc-argXXX global string
+.\" NS argument vector
+.\" NS
+.\" NS limit:
+.\" NS doc-arg-limit
+.
+.ds doc-arg1
+.
+.
+.\" NS doc-typeXXX global register
+.\" NS argument type vector (macro=1, string=2, punctuation suffix=3,
+.\" NS punctuation prefix=4)
+.\" NS
+.\" NS limit:
+.\" NS doc-arg-limit
+.
+.nr doc-type1 0
+.
+.
+.\" NS doc-spaceXXX global string
+.\" NS space vector
+.\" NS
+.\" NS limit:
+.\" NS doc-arg-limit
+.
+.ds doc-space1
+.
+.
+.\" NS doc-parse-args macro
+.\" NS parse arguments (recursively) (`.doc-parse-args arg ...')
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-limit
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-spaceXXX
+.\" NS doc-typeXXX
+.\" NS doc-arg-ptr
+.\" NS doc-have-space
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dpa
+.\" NS doc-reg-dpa1
+.\" NS doc-str-dpa
+.
+.de doc-parse-args
+. if !\n[doc-arg-limit] \
+. doc-set-spacing-1
+.
+. nr doc-have-space 0
+.
+. if !\n[.$] \
+. return
+.
+. nr doc-arg-limit +1
+.
+. \" handle `|' and `...' specially
+. ie "\$1"|" \
+. ds doc-arg\n[doc-arg-limit] \f[R]|\f[P]
+. el \{ .ie "\$1"..." \
+. ds doc-arg\n[doc-arg-limit] \|.\|.\|.
+. el \
+. ds doc-arg\n[doc-arg-limit] "\$1
+. \}
+.
+. \" get argument type and set spacing
+. doc-get-arg-type* \n[doc-arg-limit]
+. nr doc-type\n[doc-arg-limit] \n[doc-arg-type]
+. doc-set-spacing-\n[doc-arg-type]
+.
+. \" check whether we have processed the last parameter
+. ie (\n[.$] == 1) \
+. nr doc-arg-ptr 0
+. el \{\
+. shift
+. doc-parse-args \$@
+. \}
+.
+. nh
+..
+.
+.
+.\" NS doc-parse-arg-vector macro
+.\" NS parse argument vector (recursive)
+.\" NS
+.\" NS cf. comments in doc-parse-args
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-limit
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-num-args
+.\" NS doc-spaceXXX
+.\" NS doc-typeXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dpav
+.\" NS doc-reg-dpav1
+.\" NS doc-str-dpav
+.
+.de doc-parse-arg-vector
+. if !\n[doc-arg-limit] \
+. doc-set-spacing-1
+.
+. nr doc-arg-limit +1
+.
+. ie "\*[doc-arg\n[doc-arg-limit]]"|" \
+. ds doc-arg\n[doc-arg-limit] \f[R]|\f[P]
+. el \{ .if "\*[doc-arg\n[doc-arg-limit]]"..." \
+. ds doc-arg\n[doc-arg-limit] \|.\|.\|.
+. \}
+.
+. doc-get-arg-type* \n[doc-arg-limit]
+. nr doc-type\n[doc-arg-limit] \n[doc-arg-type]
+. doc-set-spacing-\n[doc-arg-type]
+.
+. ie (\n[doc-num-args] == 1) \{\
+. nr doc-arg-ptr 0
+. nr doc-num-args 0
+. \}
+. el \{\
+. nr doc-num-args -1
+. doc-parse-arg-vector
+. \}
+.
+. nh
+..
+.
+.
+.\" NS doc-parse-space-vector macro
+.\" NS parse space vector (recursive)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-limit
+.\" NS doc-num-args
+.\" NS doc-spaceXXX
+.
+.de doc-parse-space-vector
+. nr doc-arg-limit +1
+.
+. doc-set-spacing-\n[doc-type\n[doc-arg-limit]]
+.
+. ie (\n[doc-num-args] == 1) \
+. nr doc-num-args 0
+. el \{\
+. nr doc-num-args -1
+. doc-parse-space-vector
+. \}
+..
+.
+.
+.\" NS doc-remaining-args macro
+.\" NS output remaining arguments as-is, separated by spaces (until
+.\" NS `doc-num-args' is exhausted)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-num-args
+.
+.de doc-remaining-args
+. nr doc-arg-ptr +1
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\c
+.
+. ie (\n[doc-num-args] == 1) \{\
+. nr doc-arg-ptr 0
+. nr doc-num-args 0
+. \}
+. el \{\
+. nop \)\*[doc-space]\c
+. nr doc-num-args -1
+. doc-remaining-args
+. \}
+..
+.
+.
+.\" NS doc-append-arg macro
+.\" NS append one argument to argument vector:
+.\" NS `.doc-append-arg [arg] [type]'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-limit
+.\" NS doc-argXXX
+.\" NS doc-typeXXX
+.
+.de doc-append-arg
+. nr doc-arg-limit +1
+. ds doc-arg\n[doc-arg-limit] "\$1
+. nr doc-type\n[doc-arg-limit] \$2
+. doc-set-spacing-\$2
+..
+.
+.
+.\" NS doc-print-and-reset macro
+.\" NS finish input line and clean up argument vectors
+.
+.de doc-print-and-reset
+. if \n[doc-space-mode] \
+. nop \)
+. doc-reset-args
+..
+.
+.
+.\" NS doc-reset-args macro
+.\" NS reset argument counters
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-limit
+.\" NS doc-arg-ptr
+.\" NS doc-have-slot
+.
+.de doc-reset-args
+. nr doc-arg-limit 0
+. nr doc-arg-ptr 0
+. nr doc-have-slot 0
+.
+. hy \n[doc-hyphen-flags]
+..
+.
+.
+.ec
+.
+.\" NS doc-curr-font global register
+.\" NS saved current font
+.
+.nr doc-curr-font \n[.f]
+.
+.
+.\" NS doc-curr-size global register
+.\" NS saved current font size
+.
+.nr doc-curr-size \n[.ps]
+.
+.eo
+.
+.
+.\" NS Fl user macro
+.\" NS handle flags (appends `-' and prints flags): `.Fl [arg ...]'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Fl (for communication with doc-flag-recursion)
+.\" NS
+.\" NS width register `Fl' set in doc-common
+.
+.de Fl
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Fl-font]\c
+.
+. if !\n[doc-arg-limit] \{\
+. ds doc-macro-name Fl
+. doc-parse-args \$@
+.
+. if !\n[.$] \{\
+. \" no arguments
+. nop \|\-\|\f[P]\s[0]
+. \}\}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
+. \" last argument
+. nop \|\-\f[P]\s[0]\c
+. doc-print-and-reset
+. \}
+. el \{\
+. ie (\n[doc-type\n[doc-arg-ptr]] == 1) \{\
+. nop \|\-\f[P]\s[0]\c
+. \*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \{\
+. if (\n[doc-type\n[doc-arg-ptr]] == 3) \
+. nop \|\-\|\c
+.
+. nr doc-reg-Fl 1
+. doc-flag-recursion
+. \}\}
+..
+.
+.
+.\" NS doc-flag-recursion macro
+.\" NS `Fl' flag recursion routine (special handling)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dfr
+.\" NS doc-reg-dfr1
+.\" NS doc-str-dfr
+.
+.de doc-flag-recursion
+. nr doc-reg-dfr1 \n[doc-type\n[doc-arg-ptr]]
+. ds doc-str-dfr "\*[doc-arg\n[doc-arg-ptr]]
+.
+. ie (\n[doc-reg-dfr1] == 1) \{\
+. nop \f[P]\s[0]\c
+. \*[doc-str-dfr]
+. \}
+. el \{\
+. nr doc-reg-dfr \n[doc-arg-ptr]
+.
+. ie (\n[doc-reg-dfr1] == 2) \{\
+. \" handle vertical bar -- doc-reg-Fl is set for the first call of
+. \" doc-flag-recursion only; we need this to make `.Fl | ...' work
+. \" correctly
+. ie "\*[doc-str-dfr]"\*[Ba]" \{\
+. if \n[doc-reg-Fl] \
+. nop \|\-\*[doc-space]\c
+. nop \)\*[Ba]\c
+. \}
+. el \{\
+. ie "\*[doc-str-dfr]"\f[R]|\f[P]" \{\
+. if \n[doc-reg-Fl] \
+. nop \|\-\*[doc-space]\c
+. nop \f[R]|\f[P]\c
+. \}
+. el \{\
+. \" two consecutive hyphen characters?
+. ie "\*[doc-str-dfr]"-" \
+. nop \|\-\^\-\|\c
+. el \
+. nop \|\%\-\*[doc-str-dfr]\c
+. \}\}\}
+. el \{\
+. nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
+. nop \)\*[doc-str-dfr]\f[P]\s[0]\c
+. \}
+.
+. ie (\n[doc-arg-limit] == \n[doc-arg-ptr]) \{\
+. \" last argument
+. if (\n[doc-reg-dfr1] == 4) \
+. nop \|\-\c
+. nop \f[P]\s[0]\c
+. doc-print-and-reset
+. \}
+. el \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-type\n[doc-arg-ptr]] == 3) \{\
+. ie (\n[doc-type\n[doc-reg-dfr]] == 4) \
+. nop \|\-\c
+. el \
+. nop \)\*[doc-space\n[doc-reg-dfr]]\c
+. \}
+. el \
+. nop \)\*[doc-space\n[doc-reg-dfr]]\c
+.
+. shift
+. nr doc-reg-Fl 0
+. doc-flag-recursion \$@
+. \}\}
+..
+.
+.
+.\" NS doc-print-recursive macro
+.\" NS general name recursion routine (print remaining arguments)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dpr
+.\" NS doc-reg-dpr1
+.\" NS doc-str-dpr
+.
+.de doc-print-recursive
+. nr doc-reg-dpr1 \n[doc-type\n[doc-arg-ptr]]
+. ds doc-str-dpr "\*[doc-arg\n[doc-arg-ptr]]
+.
+. ie (\n[doc-reg-dpr1] == 1) \{\
+. nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
+. \*[doc-str-dpr]
+. \}
+. el \{\
+. nr doc-reg-dpr \n[doc-arg-ptr]
+.
+. ie (\n[doc-reg-dpr1] == 2) \
+. \" the `\%' prevents hyphenation on a dash (`-')
+. nop \%\*[doc-str-dpr]\&\c
+. el \{\
+. \" punctuation character
+. nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
+. nop \)\*[doc-str-dpr]\f[P]\s[0]\c
+. \}
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
+. \" last argument
+. nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
+. doc-print-and-reset
+. \}
+. el \{\
+. nop \)\*[doc-space\n[doc-reg-dpr]]\c
+. doc-print-recursive
+. \}\}
+..
+.
+.
+.\" NS doc-print-prefixes macro
+.\" NS print leading prefixes
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.
+.de doc-print-prefixes
+. while (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. if !(\n[doc-type\n[doc-arg-ptr]] == 4) \
+. break
+. nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\f[P]\s[0]\c
+. nr doc-arg-ptr +1
+. \}
+..
+.
+.
+.\" NS doc-generic-macro macro
+.\" NS this is the skeleton for most simple macros
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.
+.de doc-generic-macro
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name \$0
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .\$0 \*[doc-\$0-usage] ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. if (\n[doc-type\n[doc-arg-ptr]] == 1) \{\
+. tm Usage: .\$0 \*[doc-\$0-usage] ... (#\n[.c])
+.
+. \" the right action here would be to reset the argument counters
+. \" and bail out -- unfortunately, a small number of manual pages
+. \" (less than 2% for FreeBSD which has been used for testing)
+. \" relied on the old behaviour (silently ignore this error),
+. \" so it is commented out
+.
+.\" doc-reset-args
+. \}
+.\" el \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-\$0-font]\c
+. doc-print-recursive
+.\" \}
+. \}
+. el \{\
+. tm Usage: .\$0 \*[doc-\$0-usage] ... (#\n[.c])
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS Ar user macro
+.\" NS command line `argument' macro: `.Ar [args ...]'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variable:
+.\" NS doc-str-Ar-default
+.\" NS
+.\" NS width register `Ar' set in doc-common
+.
+.ds doc-str-Ar-default "file\ .\|.\|.
+.
+.de Ar
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Ar-font]\c
+.
+. if !\n[doc-arg-limit] \{\
+. ds doc-macro-name Ar
+. doc-parse-args \$@
+.
+. if !\n[.$] \{\
+. \" no argument
+. nop \)\*[doc-str-Ar-default]\&\f[P]\s[0]
+. \}\}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
+. nop \)\*[doc-str-Ar-default]\&\f[P]\s[0]\c
+. doc-print-and-reset
+. \}
+. el \{\
+. if !(\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. \" replace previous argument (Ar) with default value
+. nr doc-arg-ptr -1
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Ar-default]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. doc-parse-space-vector
+. \}
+. doc-print-recursive
+. \}
+..
+.
+.
+.\" NS Ad user macro
+.\" NS Addresses
+.\" NS
+.\" NS width register `Ad' set in doc-common
+.
+.als Ad doc-generic-macro
+.ds doc-Ad-usage address
+.
+.
+.\" NS doc-indent-synopsis global register
+.\" NS indentation in synopsis
+.
+.nr doc-indent-synopsis 0
+.
+.
+.\" NS doc-indent-synopsis-active global register (bool)
+.\" NS indentation in synopsis active
+.
+.nr doc-indent-synopsis-active 0
+.
+.
+.\" NS Cd user macro
+.\" NS config declaration (for section 4 SYNOPSIS)
+.\" NS
+.\" NS this function causes a break; it uses the `Nm' font
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-indent-synopsis
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Cd' set in doc-common
+.
+.de Cd
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Cd
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Cd configuration_file_declaration ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. ie \n[doc-in-synopsis-section] \{\
+. if "\*[doc-macro-name]"Cd" \{\
+. br
+. if !\n[doc-indent-synopsis] \
+. nr doc-indent-synopsis \n[doc-display-indent]u
+. if !\n[doc-indent-synopsis-active] \
+. in +\n[doc-indent-synopsis]u
+. ti -\n[doc-indent-synopsis]u
+. nop \*[doc-Nm-font]\c
+. doc-print-recursive
+. if !\n[doc-indent-synopsis-active] \
+. in -\n[doc-indent-synopsis]u
+. \}\}
+. el \{\
+. nop \*[doc-Nm-font]\c
+. doc-print-recursive
+. \}\}
+. el \{\
+. tm Usage: .Cd configuration_file_declaration ... (#\n[.c])
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS Cm user macro
+.\" NS interactive command modifier (flag)
+.\" NS
+.\" NS width register `Cm' set in doc-common
+.
+.als Cm doc-generic-macro
+.ds doc-Cm-usage interactive_command_modifier
+.
+.
+.\" NS Dv user macro
+.\" NS defined variable
+.\" NS
+.\" NS this function uses the `Er' font
+.\" NS
+.\" NS width register `Dv' set in doc-common
+.
+.als Dv doc-generic-macro
+.ds doc-Dv-usage defined_variable
+.als doc-Dv-font doc-Er-font
+.
+.
+.\" NS Em user macro
+.\" NS emphasis
+.\" NS
+.\" NS width register `Em' set in doc-common
+.
+.als Em doc-generic-macro
+.ds doc-Em-usage text
+.
+.
+.\" NS Er user macro
+.\" NS errno type
+.\" NS
+.\" NS width register `Er' set in doc-common
+.
+.als Er doc-generic-macro
+.ds doc-Er-usage text
+.
+.
+.\" NS Ev user macro
+.\" NS environment variable
+.\" NS
+.\" NS width register `Ev' set in doc-common
+.
+.als Ev doc-generic-macro
+.ds doc-Ev-usage text
+.
+.
+.\" NS doc-have-decl global register (bool)
+.\" NS subroutine test (in synopsis only)
+.
+.nr doc-have-decl 0
+.
+.
+.\" NS doc-have-var global register (bool)
+.\" NS whether last type is a variable type
+.
+.nr doc-have-var 0
+.
+.
+.\" NS doc-do-func-decl macro
+.\" NS do someting special while in SYNOPSIS
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-have-decl
+.\" NS doc-have-var
+.
+.de doc-do-func-decl
+. if \n[doc-in-synopsis-section] \{\
+. \" if a variable type was the last thing given, want vertical space
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+. \" if a subroutine was the last thing given, want vertical space
+. if \n[doc-have-func] \{\
+. ie \n[doc-have-decl] \
+. br
+. el \
+. doc-paragraph
+. \}
+. nr doc-have-decl 1
+. \}
+.
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+..
+.
+.
+.\" NS Fd user macro
+.\" NS function declaration -- not callable
+.\" NS
+.\" NS this function causes a break
+.\" NS
+.\" NS width register `Fd' set in doc-common
+.
+.de Fd
+. ie ((\n[.$] >= 1) & (\n[doc-arg-limit] == 0)) \{\
+. doc-do-func-decl
+. nop \*[doc-Fd-font]\$*
+. br
+. ft \n[doc-curr-font]
+. ps \n[doc-curr-size]u
+. \}
+. el \{\
+. tm Usage: .Fd function_declaration -- Fd is not callable (#\n[.c])
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS In user macro
+.\" NS #include statement - not callable
+.\" NS
+.\" NS this function causes a break; it uses the `Fd' font
+.\" NS
+.\" NS width register `In' set in doc-common
+.
+.de In
+. ie ((\n[.$] == 1) & (\n[doc-arg-limit] == 0)) \{\
+. doc-do-func-decl
+. nop \*[doc-Fd-font]#include <\$1>
+. br
+. ft \n[doc-curr-font]
+. ps \n[doc-curr-size]u
+. \}
+. el \{\
+. tm Usage: .In include_file -- In is not callable (#\n[.c])
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS Fr user macro
+.\" NS function return value
+.\" NS
+.\" NS this function uses the `Ar' font
+.\" NS
+.\" NS width register `Fr' set in doc-common
+.
+.als Fr doc-generic-macro
+.ds doc-Fr-usage function_return_value
+.als doc-Fr-font doc-Ar-font
+.
+.
+.\" NS Ic user macro
+.\" NS interactive command
+.\" NS
+.\" NS width register `Ic' set in doc-common
+.
+.als Ic doc-generic-macro
+.ds doc-Ic-usage interactive_command
+.
+.
+.\" NS Li user macro
+.\" NS literals
+.\" NS
+.\" NS width register `Li' set in doc-common
+.
+.als Li doc-generic-macro
+.ds doc-Li-usage argument
+.
+.
+.\" NS Ms user macro
+.\" NS math symbol
+.\" NS
+.\" NS this function uses the `Sy' font
+.\" NS
+.\" NS width register `Ms' set in doc-common
+.
+.als Ms doc-generic-macro
+.ds doc-Ms-usage math_symbol
+.als doc-Ms-font doc-Sy-font
+.
+.
+.\" NS doc-command-name global string
+.\" NS save first invocation of .Nm
+.
+.ds doc-command-name
+.
+.
+.\" NS Nm user macro
+.\" NS name of command or page topic
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-command-name
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-indent-synopsis
+.\" NS doc-indent-synopsis-active
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Nm' set in doc-common
+.
+.de Nm
+. if !\n[doc-arg-limit] \{\
+. ds doc-macro-name Nm
+. ie \n[.$] \
+. doc-parse-args \$@
+. el \{\
+. ie "\*[doc-command-name]"" \
+. tm Usage: .Nm name ... (#\n[.c])
+. el \
+. doc-parse-args \*[doc-command-name]
+. \}\}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
+. \" last argument
+. ie "\*[doc-command-name]"" \{\
+. tm Usage: .Nm name ... (#\n[.c])
+. doc-reset-args
+. \}
+. el \{\
+. nop \*[doc-Nm-font]\*[doc-command-name]\f[P]\s[0]\c
+. doc-print-and-reset
+. \}\}
+. el \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. ie !(\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. ie "\*[doc-command-name]"" \
+. tm Usage: .Nm name ... (#\n[.c])
+. el \{\
+. \" replace previous argument (Nm) with default value
+. nr doc-arg-ptr -1
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-Nm-font]\*[doc-command-name]\f[P]\s[0]
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. doc-parse-space-vector
+. \}\}
+. el \{\
+. \" handle `.Nm ...' in SYNOPSIS
+. if \n[doc-in-synopsis-section] \{\
+. if "\*[doc-macro-name]"Nm" \{\
+. br
+. if !\n[doc-indent-synopsis] \{\
+. doc-get-width "\*[doc-arg\n[doc-arg-ptr]]"
+. nr doc-indent-synopsis ((\n[doc-width]u + 1u) * \n[doc-fixed-width]u)
+. \}
+. if !\n[doc-indent-synopsis-active] \{\
+. in +\n[doc-indent-synopsis]u
+. nr doc-indent-synopsis-active 1
+. \}
+. ti -\n[doc-indent-synopsis]u
+. \}\}
+. if "\*[doc-command-name]"" \
+. ds doc-command-name "\*[doc-arg\n[doc-arg-ptr]]
+.
+. nop \*[doc-Nm-font]\c
+. \}
+. doc-print-recursive
+. \}
+..
+.
+.
+.\" NS Pa user macro
+.\" NS pathname: `.Pa [arg ...]'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Pa' set in doc-common
+.
+.de Pa
+. if !\n[doc-arg-limit] \{\
+. ds doc-macro-name Pa
+. doc-parse-args \$@
+.
+. if !\n[.$] \{\
+. \" default value
+. nop \*[doc-Pa-font]~\f[P]\s[0]
+. \}\}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Pa-font]\c
+. if !(\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. \" replace previous argument (Pa) with default value
+. nr doc-arg-ptr -1
+. ds doc-arg\n[doc-arg-ptr] ~
+. nr doc-type\n[doc-arg-ptr] 2
+. ds doc-space\n[doc-arg-ptr] "\*[doc-space]
+.
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. doc-parse-space-vector
+. \}
+. doc-print-recursive
+. \}
+. el \{\
+. nop \*[doc-Pa-font]~\f[P]\s[0]\c
+. doc-print-and-reset
+. \}
+..
+.
+.
+.\" NS Sy user macro
+.\" NS symbolics
+.\" NS
+.\" NS width register `Sy' set in doc-common
+.
+.als Sy doc-generic-macro
+.ds doc-Sy-usage symbolic_text
+.
+.
+.\" NS Me user macro
+.\" NS menu entries
+.\" NS
+.\" NS width register `Me' set in doc-common
+.
+.als Me doc-generic-macro
+.ds doc-Me-usage menu_entry
+.
+.
+.\" NS Tn user macro
+.\" NS trade name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Tn' set in doc-common
+.
+.de Tn
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Tn
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Tn trade_name ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \)\*[doc-Tn-font-size]\c
+. ie !\n[doc-is-reference] \{\
+. nop \)\*[doc-Tn-font-shape]\c
+. doc-print-recursive
+. \}
+. el \
+. doc-do-references
+. \}
+. el \{\
+. tm Usage: .Tn trade_name ... (#\n[.c])
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS Va user macro
+.\" NS variable name
+.\" NS
+.\" NS width register `Va' set in doc-common
+.
+.als Va doc-generic-macro
+.ds doc-Va-usage variable_name
+.
+.
+.\" NS No user macro
+.\" NS normal text macro (default text style if mess up)
+.\" NS
+.\" NS width register `No' set in doc-common
+.
+.als No doc-generic-macro
+.ds doc-No-usage normal_text
+.
+.
+.\" NS doc-quote-left global string
+.\" NS left quotation character for `doc-enclose-string' and
+.\" NS `doc-enclose-open'
+.
+.ds doc-quote-left
+.
+.
+.\" NS doc-quote-right global string
+.\" NS right quotation character for `doc-enclose-string' and
+.\" NS `doc-enclose-close'
+.
+.ds doc-quote-right
+.
+.
+.\" NS Op user macro
+.\" NS option expression (i.e., enclose string in square brackets)
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Op' set in doc-common
+.
+.de Op
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Op
+.
+. ds doc-quote-left "\*[doc-left-bracket]
+. ds doc-quote-right "\*[doc-right-bracket]
+.
+. doc-enclose-string \$@
+..
+.
+.
+.\" NS Aq user macro
+.\" NS enclose string in angle brackets
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Aq' set in doc-common
+.
+.de Aq
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Aq
+.
+. ds doc-quote-left \[la]
+. ds doc-quote-right \[ra]
+.
+. doc-enclose-string \$@
+..
+.
+.
+.\" NS Bq user macro
+.\" NS enclose string in square brackets
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Bq' set in doc-common
+.
+.de Bq
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Bq
+.
+. ds doc-quote-left "\*[doc-left-bracket]
+. ds doc-quote-right "\*[doc-right-bracket]
+.
+. doc-enclose-string \$@
+..
+.
+.
+.\" NS Brq user macro
+.\" NS enclose string in braces
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Brq' set in doc-common
+.
+.de Brq
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Brq
+.
+. ds doc-quote-left {
+. ds doc-quote-right }
+.
+. doc-enclose-string \$@
+..
+.
+.
+.\" NS Dq user macro
+.\" NS enclose string in double quotes
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Dq' set in doc-common
+.
+.de Dq
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Dq
+.
+. ds doc-quote-left "\*[Lq]
+. ds doc-quote-right "\*[Rq]
+.
+. doc-enclose-string \$@
+..
+.
+.
+.\" NS Eq user macro
+.\" NS enclose string in user-defined quotes (args 1 and 2)
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Eq' set in doc-common
+.
+.de Eq
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Eq
+.
+. ds doc-quote-left "\$1
+. ds doc-quote-right "\$2
+.
+. shift 2
+. doc-enclose-string \$@
+..
+.
+.
+.\" NS Pq user macro
+.\" NS enclose string in parentheses
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Pq' set in doc-common
+.
+.de Pq
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Pq
+.
+. ds doc-quote-left "\*[doc-left-parenthesis]
+. ds doc-quote-right "\*[doc-right-parenthesis]
+.
+. doc-enclose-string \$@
+..
+.
+.
+.\" NS Ql user macro
+.\" NS quoted literal
+.\"
+.\" is in file doc-[dit|n]roff
+.
+.
+.\" NS Qq user macro
+.\" NS enclose string in straight double quotes
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Qq' set in doc-common
+.
+.de Qq
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Qq
+.
+. ds doc-quote-left "\*[q]
+. ds doc-quote-right "\*[q]
+.
+. doc-enclose-string \$@
+..
+.
+.
+.\" NS Sq user macro
+.\" NS enclose string in single quotes
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Sq' set in doc-common
+.
+.de Sq
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Sq
+.
+. ds doc-quote-left "\*[doc-left-singlequote]
+. ds doc-quote-right "\*[doc-right-singlequote]
+.
+. doc-enclose-string \$@
+..
+.
+.
+.\" NS Es user macro
+.\" NS set up arguments (i.e., the left and right quotation character as
+.\" NS first and second argument) for .En call
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.
+.de Es
+. if !\n[doc-arg-limit] \{\
+. ie (\n[.$] > 2) \{\
+. ds doc-macro-name Es
+. doc-parse-args \$@
+. \}
+. el \{\
+. ds doc-quote-left "\$1
+. ds doc-quote-right "\$2
+. \}\}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. ds doc-quote-left "\*[doc-arg\n[doc-arg-ptr]]
+. nr doc-arg-ptr +1
+. ds doc-quote-right "\*[doc-arg\n[doc-arg-ptr]]
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+. el \
+. doc-print-and-reset
+..
+.
+.
+.\" NS doc-have-slot global register (bool)
+.\" NS set if `doc-enclose-string' has created a slot for closing
+.\" NS delimiter
+.
+.nr doc-have-slot 0
+.
+.
+.\" NS doc-enclose-string macro
+.\" NS enclose string with given args (e.g. [ and ])
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-have-slot
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-des
+.\" NS doc-reg-des1
+.\" NS doc-reg-des2
+.\" NS
+.\" NS requires:
+.\" NS doc-quote-left
+.\" NS doc-quote-right
+.
+.de doc-enclose-string
+. if \n[doc-in-synopsis-section] \
+. doc-set-hard-space
+.
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \
+. doc-parse-args \$@
+. el \{\
+. nop \)\*[doc-quote-left]\*[doc-quote-right]
+. \}\}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. \" the final `\)' prevents hyphenation in case the next character is `\%'
+. nop \)\*[doc-quote-left]\)\c
+. ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
+. \" last argument
+. nop \)\*[doc-quote-right]\)\c
+. doc-print-and-reset
+. \}
+. el \{\
+. \" test whether last arguments are of type closing punctuation
+. \" resp. suffix
+. ie (\n[doc-type\n[doc-arg-limit]] == 3) \{\
+. nr doc-reg-des (\n[doc-arg-limit] - 1)
+. while (\n[doc-type\n[doc-reg-des]] == 3) \
+. nr doc-reg-des -1
+.
+. \" prepend closing delimiter
+. nr doc-reg-des +1
+. ds doc-arg\n[doc-reg-des] "\*[doc-quote-right]\)\*[doc-arg\n[doc-reg-des]]
+. \}
+. el \{\
+. \" test whether last arguments are macros which continue the line
+. \" logically
+. nr doc-reg-des \n[doc-arg-limit]
+. while (\n[doc-reg-des] >= \n[doc-arg-ptr]) \{\
+. if !\A\*[doc-arg\n[doc-reg-des]] \
+. break
+. if !d doc-after-\*[doc-arg\n[doc-reg-des]] \
+. break
+. nr doc-reg-des -1
+. \}
+.
+. \" if there are no trailing macros to be skipped, append argument
+. ie (\n[doc-reg-des] == \n[doc-arg-limit]) \
+. doc-append-arg "\)\*[doc-quote-right]\)" 3
+. el \{\
+. \" if a previous call to `doc-enclose-string' has already created
+. \" a slot, prepend argument
+. ie \n[doc-have-slot] \
+. ds doc-arg\n[doc-reg-des] "\*[doc-quote-right]\)\*[doc-arg\n[doc-reg-des]]
+. el \{\
+. \" we have to shift all arguments to the right
+. nr doc-reg-des +1
+. nr doc-reg-des1 \n[doc-arg-limit]
+. nr doc-reg-des2 (\n[doc-arg-limit] + 1)
+. while (\n[doc-reg-des1] >= \n[doc-reg-des]) \{\
+. rn doc-arg\n[doc-reg-des1] doc-arg\n[doc-reg-des2]
+. rnn doc-type\n[doc-reg-des1] doc-type\n[doc-reg-des2]
+. rn doc-space\n[doc-reg-des1] doc-space\n[doc-reg-des2]
+. nr doc-reg-des1 -1
+. nr doc-reg-des2 -1
+. \}
+. nr doc-arg-limit +1
+.
+. \" finally, insert closing delimiter into the freed slot and
+. \" recompute spacing vector
+. ds doc-arg\n[doc-reg-des] "\)\*[doc-quote-right]\)
+. nr doc-type\n[doc-reg-des] 3
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-reg-des] + 1)
+. nr doc-arg-limit (\n[doc-reg-des] - 1)
+. doc-parse-space-vector
+. nr doc-have-slot 1
+. \}\}\}
+.
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+. \}
+.
+. if \n[doc-in-synopsis-section] \
+. doc-set-soft-space
+..
+.
+.
+.\" NS En user macro
+.\" NS enclose arguments with quotation characters set up with `.Es'
+.
+.als En doc-enclose-string
+.
+.
+.\" NS Ao user macro
+.\" NS angle open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Ao' set in doc-common
+.
+.de Ao
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Ao
+.
+. ds doc-quote-left \[la]
+.
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Ac user macro
+.\" NS angle close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Ac' set in doc-common
+.
+.de Ac
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Ac
+.
+. ds doc-quote-right \[ra]
+.
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS Bo user macro
+.\" NS bracket open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Bo' set in doc-common
+.
+.de Bo
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Bo
+.
+. ds doc-quote-left "\*[doc-left-bracket]
+.
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Bc user macro
+.\" NS bracket close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Bc' set in doc-common
+.
+.de Bc
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Bc
+.
+. ds doc-quote-right "\*[doc-right-bracket]
+.
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS Bro user macro
+.\" NS brace open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Bro' set in doc-common
+.
+.de Bro
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Bo
+.
+. ds doc-quote-left {
+.
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Brc user macro
+.\" NS brace close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Brc' set in doc-common
+.
+.de Brc
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Bc
+.
+. ds doc-quote-right }
+.
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS Do user macro
+.\" NS double quote open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Do' set in doc-common
+.
+.de Do
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Do
+.
+. ds doc-quote-left "\*[Lq]
+.
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Dc user macro
+.\" NS double quote close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Dc' set in doc-common
+.
+.de Dc
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Dc
+.
+. ds doc-quote-right "\*[Rq]
+.
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS Eo user macro
+.\" NS enclose open (using first argument as beginning of enclosure)
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Eo' set in doc-common
+.
+.de Eo
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Eo
+.
+. ds doc-quote-left "\$1
+.
+. shift
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Ec user macro
+.\" NS enclose close (using first argument as end of enclosure)
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Ec' set in doc-common
+.
+.de Ec
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Ec
+.
+. ds doc-quote-right "\$1
+.
+. shift
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS Oo user macro
+.\" NS option open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Oo' set in doc-common
+.
+.de Oo
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Oo
+.
+. ds doc-quote-left [
+.
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Oc user macro
+.\" NS option close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Oc' set in doc-common
+.
+.de Oc
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Oc
+.
+. ds doc-quote-right ]
+.
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS Po user macro
+.\" NS parenthesis open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Po' set in doc-common
+.
+.de Po
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Po
+.
+. ds doc-quote-left "\*[doc-left-parenthesis]
+.
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Pc user macro
+.\" NS parenthesis close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Pc' set in doc-common
+.
+.de Pc
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Pc
+.
+. ds doc-quote-right "\*[doc-right-parenthesis]
+.
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS Qo user macro
+.\" NS straight double quote open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Qo' set in doc-common
+.
+.de Qo
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Qo
+.
+. ds doc-quote-left "\*[q]
+.
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Qc user macro
+.\" NS straight double quote close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Qc' set in doc-common
+.
+.de Qc
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Qc
+.
+. ds doc-quote-right "\*[q]
+.
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS So user macro
+.\" NS single quote open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `So' set in doc-common
+.
+.de So
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name So
+.
+. ds doc-quote-left "\*[doc-left-singlequote]
+.
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Sc user macro
+.\" NS single quote close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Sc' set in doc-common
+.
+.de Sc
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Sc
+.
+. ds doc-quote-right "\*[doc-right-singlequote]
+.
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS Xo user macro
+.\" NS extend open
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Xo' set in doc-common
+.
+.de Xo
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Xo
+.
+. ds doc-quote-left
+.
+. doc-enclose-open \$@
+..
+.
+.
+.\" NS Xc user macro
+.\" NS extend close
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS doc-quote-right
+.\" NS
+.\" NS width register `Xc' set in doc-common
+.
+.de Xc
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Xc
+.
+. ds doc-quote-right
+.
+. doc-enclose-close \$@
+..
+.
+.
+.\" NS doc-nesting-level global register
+.\" NS used by `doc-enclose-open' and `doc-enclose-close'
+.
+.nr doc-nesting-level 0
+.
+.
+.\" NS doc-in-list global register (bool)
+.\" NS whether we are in (logical) .It
+.
+.nr doc-in-list 0
+.
+.
+.\" NS doc-enclose-open macro
+.\" NS enclose string open
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-nesting-level
+.
+.de doc-enclose-open
+. if !\n[doc-arg-limit] \
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. nr doc-arg-ptr -1
+.
+. nop \)\*[doc-quote-left]\)\c
+.
+. \" start enclosure box
+. box doc-enclosure-box\n[doc-nesting-level]
+. ev doc-enclosure-env\n[doc-nesting-level]
+. evc 0
+. in 0
+. nf
+. \" we insert something to make .chop always work
+. nop \&\c
+.
+. \" increase nesting level *after* parsing of arguments
+. nr doc-nesting-level +1
+.
+. if \n[doc-arg-limit] \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
+. doc-print-recursive
+. el \
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS doc-enclose-close macro
+.\" NS enclose string close
+.\" NS
+.\" NS modifies:
+.\" NS doc-nesting-level
+.
+.de doc-enclose-close
+. nr doc-nesting-level -1
+.
+. \" finish enclosure box
+. br
+. ev
+. box
+. chop doc-enclosure-box\n[doc-nesting-level]
+. unformat doc-enclosure-box\n[doc-nesting-level]
+.
+. nh
+. nop \*[doc-enclosure-box\n[doc-nesting-level]]\c
+. nop \)\*[doc-quote-right]\)\c
+.
+. if !\n[doc-arg-limit] \{\
+. doc-parse-args \$@
+.
+. if !\n[.$] \
+. doc-print-and-reset
+. \}
+.
+. if \n[doc-arg-limit] \{\
+. ie (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
+. nop \)\*[doc-space\n[doc-arg-ptr]]\c
+. nr doc-arg-ptr +1
+. doc-print-recursive
+. \}
+. el \
+. doc-print-and-reset
+. \}
+.
+. \" shall we finish .It request?
+. if !"\*[doc-macro-name]"It" \
+. if \n[doc-in-list] \
+. if !\n[doc-nesting-level] \
+. doc-\*[doc-list-type-stack\n[doc-list-depth]]
+..
+.
+.
+.\" NS Pf user macro
+.\" NS prefix: `.Pf prefix arg ...'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS doc-quote-left
+.\" NS
+.\" NS width register `Pf' set in doc-common
+.
+.de Pf
+. if !\n[doc-arg-limit] \
+. ds doc-macro-name Pf
+.
+. ie \n[doc-arg-limit] \{\
+. ie ((\n[doc-arg-limit] - \n[doc-arg-ptr]) > 1) \{\
+. nr doc-arg-ptr +1
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\c
+. \}
+. el \
+. tm mdoc warning: .Pf: trailing prefix (#\n[.c])
+. \}
+. el \{\
+. nop \)\$1\)\c
+. shift
+. ie \n[.$] \
+. doc-parse-args \$@
+. el \{\
+. tm mdoc warning: .Pf: missing arguments (#\n[.c])
+. nop \)
+. \}\}
+.
+. if \n[doc-arg-limit] \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \
+. doc-print-and-reset
+. el \
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+. \}
+..
+.
+.
+.\" NS Ns user macro
+.\" NS remove space (space removal done by `doc-parse-args')
+.\" NS
+.\" NS modifies:
+.\" NS doc-argXXX
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Ns' set in doc-common
+.
+.de Ns
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Ns
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Ns must be called with arguments (#\n[.c])
+. \}
+.
+. if \n[doc-arg-limit] \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
+. doc-print-recursive
+. el \
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS Ap user macro
+.\" NS append an apostrophe
+.\" NS
+.\" NS width register `Ap' set in doc-common
+.
+.de Ap
+. ie !\n[doc-arg-limit] \
+. tm Usage: `Ap' cannot be first request on a line (no `.Ap') (#\n[.c])
+. el \{\
+. nop \)'\)\c
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
+. doc-print-recursive
+. el \
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS doc-space global string
+.\" NS current inter-argument space
+.
+.ds doc-space "\*[doc-soft-space]
+.
+.
+.\" NS doc-soft-space constant string
+.\" NS soft (stretchable) space (defined in doc-common)
+.
+.
+.\" NS doc-hard-space constant string
+.\" NS hard (unpaddable) space (defined in doc-common)
+.
+.
+.\" NS doc-set-hard-space macro
+.\" NS set current space string to hard (unpaddable) space.
+.\" NS
+.\" NS modifies:
+.\" NS doc-saved-space
+.\" NS doc-space
+.
+.de doc-set-hard-space
+. ie "\*[doc-space]"" \
+. ds doc-saved-space "\*[doc-hard-space]
+. el \
+. ds doc-space "\*[doc-hard-space]
+..
+.
+.
+.\" NS doc-set-soft-space macro
+.\" NS set current space string to soft space
+.\" NS
+.\" NS modifies:
+.\" NS doc-saved-space
+.\" NS doc-space
+.
+.de doc-set-soft-space
+. ie "\*[doc-space]"" \
+. ds doc-saved-space "\*[doc-soft-space]
+. el \
+. ds doc-space "\*[doc-soft-space]
+..
+.
+.
+.\" NS doc-space-mode global register (bool)
+.\" NS default is one (space mode on)
+.
+.nr doc-space-mode 1
+.
+.
+.\" NS doc-saved-space global string
+.\" NS saved value of `doc-space'
+.
+.ds doc-saved-space "\*[doc-space]
+.
+.
+.\" NS doc-have-space global register (bool)
+.\" NS set if last command was horizontal space
+.
+.nr doc-have-space 0
+.
+.
+.\" NS Sm user macro
+.\" NS space mode (`.Sm'/`.Sm on'/`.Sm off')
+.\" NS
+.\" NS without argument, toggle space mode
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-limit
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-macro-name
+.\" NS doc-num-args
+.\" NS doc-saved-space
+.\" NS doc-space
+.\" NS doc-space-mode
+.\" NS doc-spaceXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Sm
+.\" NS
+.\" NS width register `Sm' set in doc-common
+.
+.de Sm
+. ie \n[doc-have-space] \
+. nr doc-reg-Sm 0
+. el \
+. nr doc-reg-Sm 1
+.
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Sm
+. doc-parse-args \$@
+. \}
+. el \{\
+. ie \n[doc-space-mode] \
+. nr doc-space-mode 0
+. el \
+. nr doc-space-mode 1
+. \}\}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+.
+. \" avoid a warning message in case `Sm' is the last parameter
+. if !d doc-arg\n[doc-arg-ptr] \
+. ds doc-arg\n[doc-arg-ptr]
+.
+. ie "\*[doc-arg\n[doc-arg-ptr]]"on" \{\
+. ds doc-space "\*[doc-saved-space]
+. nr doc-space-mode 1
+. \}
+. el \{\
+. ie "\*[doc-arg\n[doc-arg-ptr]]"off" \{\
+. ds doc-saved-space "\*[doc-space]
+. ds doc-space
+. nr doc-space-mode 0
+. \}
+. el \{\
+. \" no argument for Sm
+. nr doc-arg-ptr -1
+. ie \n[doc-space-mode] \
+. nr doc-space-mode 0
+. el \
+. nr doc-space-mode 1
+. \}\}
+.
+. ie \n[doc-space-mode] \{\
+. \" recompute space vector for remaining arguments
+. nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
+. nr doc-arg-limit \n[doc-arg-ptr]
+. if \n[doc-num-args] \
+. doc-parse-space-vector
+.
+. \" finish line only if it is interrupted and `doc-have-space'
+. \" isn't set
+. if \n[doc-reg-Sm] \
+. if \n[.int] \
+. nop \)
+. \}
+. el \{\
+. \" reset remaining space vector elements
+. nr doc-reg-Sm (\n[doc-arg-ptr] + 1)
+. while (\n[doc-reg-Sm] <= \n[doc-arg-limit]) \{\
+. ds doc-space\n[doc-reg-Sm]
+. nr doc-reg-Sm +1
+. \" the body of a `while' request must end with the fitting `\}'!
+. \}
+. \}
+.
+. \" do we have parameters to print?
+. ie (\n[doc-arg-limit] <= \n[doc-arg-ptr]) \{\
+. \" ignore `.Sm on' and `.Sm off' without additional parameters
+. ie (\n[doc-arg-ptr] > 1) \
+. doc-print-and-reset
+. el \
+. doc-reset-args
+. \}
+. el \{\
+. \" skip `Sm' argument
+. nr doc-arg-ptr +1
+. doc-print-recursive
+. \}
+..
+.
+.
+.\" NS doc-arg-type immediate register
+.\" NS argument type (macro=1, string=2, punctuation suffix=3,
+.\" NS punctuation prefix=4)
+.
+.nr doc-arg-type 0
+.
+.
+.\" NS doc-get-arg-type macro
+.\" NS get argument type
+.\" NS
+.\" NS this macro expects the width of the argument in `doc-width'
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-type
+.
+.de doc-get-arg-type
+. nr doc-arg-type 2
+.
+. if ((\n[doc-width] < 4) & \A\$1) \{\
+. ie (\n[doc-width] == 1) \{\
+. if r doc-punct\$1 \
+. nr doc-arg-type \n[doc-punct\$1]
+. \}
+. el \
+. if r \$1 \
+. if d \$1 \
+. nr doc-arg-type 1
+. \}
+..
+.
+.
+.\" NS doc-get-arg-type* macro
+.\" NS similar to as `doc-get-arg-type' but uses doc-argXXX strings
+.\" NS
+.\" NS this macro sets the `doc-width' register using the `length' request
+.\" NS to get the number of characters in a string literally
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-type
+.\" NS doc-width
+.
+.de doc-get-arg-type*
+. nr doc-arg-type 2
+. length doc-width "\*[doc-arg\$1]
+.
+. if ((\n[doc-width] < 4) & \A\*[doc-arg\$1]) \{\
+. ie (\n[doc-width] == 1) \{\
+. if r doc-punct\*[doc-arg\$1] \
+. nr doc-arg-type \n[doc-punct\*[doc-arg\$1]]
+. \}
+. el \
+. if r \*[doc-arg\$1] \
+. if d \*[doc-arg\$1] \
+. nr doc-arg-type 1
+. \}
+..
+.
+.
+.\" NS doc-set-spacing-1 macro
+.\" NS set spacing for macros
+.\" NS
+.\" NS modifies:
+.\" NS doc-spaceXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dssfm
+.\" NS doc-reg-dssfm1
+.
+.de doc-set-spacing-1
+. nr doc-reg-dssfm1 \n[\*[doc-arg\n[doc-arg-limit]]]
+.
+. \" closing macros like .Ac, Bc., etc. have value 3 (remove space before
+. \" argument)
+. ie (\n[doc-reg-dssfm1] == 3) \{\
+. if \n[doc-arg-limit] \{\
+. nr doc-reg-dssfm (\n[doc-arg-limit] - 1)
+. ds doc-space\n[doc-reg-dssfm]
+. \}
+. ds doc-space\n[doc-arg-limit] "\*[doc-space]
+. \}
+. el \{\
+. \" macros like .Ap and .Ns have value 2 (remove space before and after
+. \" argument)
+. ie (\n[doc-reg-dssfm1] == 2) \{\
+. if \n[doc-arg-limit] \{\
+. nr doc-reg-dssfm (\n[doc-arg-limit] - 1)
+. ds doc-space\n[doc-reg-dssfm]
+. \}
+. ds doc-space\n[doc-arg-limit]
+. \}
+. el \
+. ds doc-space\n[doc-arg-limit]
+. \}
+..
+.
+.
+.\" NS doc-set-spacing-2 macro
+.\" NS set spacing for strings
+.\" NS
+.\" NS modifies:
+.\" NS doc-spaceXXX
+.
+.de doc-set-spacing-2
+. ds doc-space\n[doc-arg-limit] "\*[doc-space]
+..
+.
+.
+.\" NS doc-set-spacing-3 macro
+.\" NS set spacing for punctuation suffixes
+.\" NS
+.\" NS modifies:
+.\" NS doc-spaceXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dssfps
+.
+.de doc-set-spacing-3
+. if \n[doc-arg-limit] \{\
+. nr doc-reg-dssfps (\n[doc-arg-limit] - 1)
+. ds doc-space\n[doc-reg-dssfps]
+. \}
+.
+. ds doc-space\n[doc-arg-limit] "\*[doc-space]
+..
+.
+.
+.\" NS doc-set-spacing-4 macro
+.\" NS set spacing for punctuation prefixes
+.\" NS
+.\" NS modifies:
+.\" NS doc-spaceXXX
+.
+.de doc-set-spacing-4
+. ds doc-space\n[doc-arg-limit]
+..
+.
+.
+.\" type switches (on current argument doc-arg-ptr)
+.
+.
+.\" NS doc-do-1 macro
+.\" NS call request if macro
+.
+.de doc-do-1
+. \*[doc-arg\n[doc-arg-ptr]]
+..
+.
+.
+.\" NS doc-do-2 macro
+.\" NS call .doc-print-recursive if string
+.
+.als doc-do-2 doc-print-recursive
+.
+.
+.\" NS doc-do-3 macro
+.\" NS call .doc-print-recursive if punctuation suffix
+.
+.als doc-do-3 doc-print-recursive
+.
+.
+.\" NS doc-do-4 macro
+.\" NS call .doc-print-recursive if punctuation prefix
+.
+.als doc-do-4 doc-print-recursive
+.
+.
+.\" NS doc-fontmode-depth global register
+.\" NS font mode level
+.
+.nr doc-fontmode-depth 0
+.
+.
+.\" NS doc-fontmode-font-stackXXX global register
+.\" NS stack of saved current font values from `Bf' request
+.\" NS
+.\" NS limit:
+.\" NS doc-fontmode-depth
+.
+.nr doc-fontmode-font-stack0 0
+.
+.
+.\" NS doc-fontmode-size-stackXXX global register
+.\" NS stack of saved current size values from `Bf' request
+.\" NS
+.\" NS limit:
+.\" NS doc-fontmode-depth
+.
+.nr doc-fontmode-size-stack0 0
+.
+.
+.\" NS Bf user macro
+.\" NS begin font mode (will be begin-mode/end-mode in groff & TeX)
+.\" NS
+.\" NS modifies:
+.\" NS doc-fontmode-depth
+.\" NS doc-fontmode-font-stackXXX
+.\" NS doc-fontmode-size-stackXXX
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Bf' set in doc-common
+.
+.de Bf
+. ds doc-macro-name Bf
+.
+. ie \n[.$] \{\
+. nr doc-fontmode-depth +1
+.
+. \" save current font and size
+. nr doc-fontmode-font-stack\n[doc-fontmode-depth] \n[.f]
+. nr doc-fontmode-size-stack\n[doc-fontmode-depth] \n[.ps]
+.
+. ie "\$1"Em" \
+. nop \*[doc-Em-font]\c
+. el \{ .ie "\$1"Li" \
+. nop \*[doc-Li-font]\c
+. el \{ .ie "\$1"Sy" \
+. nop \*[doc-Sy-font]\c
+. el \{ .ie "\$1"-emphasis" \
+. nop \*[doc-Em-font]\c
+. el \{ .ie "\$1"-literal" \
+. nop \*[doc-Li-font]\c
+. el \{ .ie "\$1"-symbolic" \
+. nop \*[doc-Sy-font]\c
+. el \{\
+. tmc mdoc warning: Unknown keyword `\$1' in .Bf request
+. tm1 " (#\n[.c])
+. \}\}\}\}\}\}\}
+. el \
+. tm Usage: .Bf [Em | -emphasis | Li | -literal | Sy | -symbolic] (#\n[.c])
+..
+.
+.
+.\" NS Ef user macro
+.\" NS end font mode
+.\" NS
+.\" NS modifies:
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Ef' set in doc-common
+.
+.de Ef
+. ds doc-macro-name Ef
+.
+. ie \n[doc-fontmode-depth] \{\
+. \" restore saved font and size
+. nop \)\f[\n[doc-fontmode-font-stack\n[doc-fontmode-depth]]]\c
+. nop \)\s[\n[doc-fontmode-size-stack\n[doc-fontmode-depth]]u]\c
+.
+. nr doc-fontmode-font-stack\n[doc-fontmode-depth] 0
+. nr doc-fontmode-size-stack\n[doc-fontmode-depth] 0
+. nr doc-fontmode-depth -1
+. \}
+. el \
+. tm mdoc warning: Extraneous .Ef (#\n[.c])
+..
+.
+.
+.\" NS doc-keep-type global register
+.\" NS current keep type; 1 is `-words', 2 is `-lines', 3 is unknown
+.
+.nr doc-keep-type 0
+.
+.
+.\" NS Bk user macro
+.\" NS begin keep
+.\" NS
+.\" NS modifies:
+.\" NS doc-keep-type
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Bk' set in doc-common
+.
+.de Bk
+. ds doc-macro-name Bk
+.
+. if \n[doc-keep-type] \
+. tm .Bk: nesting keeps not implemented yet. (#\n[.c])
+.
+. ie "\$1"-lines" \{\
+. nr doc-keep-type 2
+. tm .Bk -lines: Not implemented yet. (#\n[.c])
+. \}
+. el \{ .ie "\$1"-words" \{\
+. nr doc-keep-type 1
+. doc-set-hard-space
+. \}
+. el \{ .ie "\$1"" \{\
+. \" default
+. nr doc-keep-type 1
+. doc-set-hard-space
+. \}
+. el \{\
+. tm mdoc warning: Unknown keyword `\$1' in .Bk request (#\n[.c])
+. nr doc-keep-type 3
+. \}\}\}
+.
+\#. nr doc-nesting-level +1
+..
+.
+.
+.\" NS Ek user macro
+.\" NS end keep
+.\" NS
+.\" NS modifies:
+.\" NS doc-keep-type
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Ek' set in doc-common
+.
+.de Ek
+. ds doc-macro-name Ek
+.
+\#. nr doc-nesting-level -1
+.
+. ie \n[.$] \
+. tm Usage: .Ek (does not take arguments) (#\n[.c])
+. el \{\
+. if !\n[doc-keep-type] \
+. tm mdoc warning: .Ek found without .Bk before (#\n[.c])
+.
+. ie (\n[doc-keep-type] == 1) \
+. doc-set-soft-space
+. el \{ .if (\n[doc-keep-type] == 2) \
+. tm .Bk -lines: Not implemented yet. (#\n[.c])
+. \}\}
+.
+. nr doc-keep-type 0
+.
+\#. if !"\*[doc-out-string]"" \
+\#. doc-print-out-string
+..
+.
+.
+.\" NS doc-display-depth global register
+.\" NS display level
+.
+.nr doc-display-depth 0
+.
+.
+.\" NS doc-is-compact global register (bool)
+.\" NS set if the `compact' keyword is given
+.
+.nr doc-is-compact 0
+.
+.
+.\" NS doc-display-type-stackXXX global string
+.\" NS the display type stack
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.ds doc-display-type-stack0
+.
+.
+.\" NS doc-display-indent-stackXXX global register
+.\" NS stack of display indentation values
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.nr doc-display-indent-stack0 0
+.
+.
+.\" NS doc-display-ad-stackXXX global register
+.\" NS stack of saved adjustment modes
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.nr doc-display-ad-stack0 0
+.
+.
+.\" NS doc-display-fi-stackXXX global register
+.\" NS stack of saved fill modes
+.\" NS
+.\" NS limit:
+.\" NS doc-display-depth
+.
+.nr doc-display-fi-stack0 0
+.
+.
+.\" NS Bd user macro
+.\" NS begin display
+.\" NS
+.\" NS width register `Bd' set in doc-common
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-display-depth
+.\" NS doc-display-ad-stackXXX
+.\" NS doc-display-fi-stackXXX
+.\" NS doc-display-file
+.\" NS doc-display-indent-stackXXX
+.\" NS doc-display-type-stackXXX
+.\" NS doc-is-compact
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Bd
+.
+.de Bd
+. ds doc-macro-name Bd
+.
+. if !\n[.$] \{\
+. tm1 "Usage: .Bd {-literal | -filled | -ragged | -centered | -unfilled}
+. tm1 " [-offset [string]] [-compact] [-file name] (#\n[.c])
+. return
+. \}
+.
+. nr doc-is-compact 0
+. ds doc-display-file
+. nr doc-reg-Bd 1
+. nr doc-display-depth +1
+.
+. \" save current adjustment and fill modes
+. nr doc-display-ad-stack\n[doc-display-depth] \n[.j]
+. nr doc-display-fi-stack\n[doc-display-depth] \n[.u]
+.
+. ie "\$1"-literal" \{\
+. ds doc-display-type-stack\n[doc-display-depth] literal
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. ie t \{\
+. nop \*[doc-Li-font]\c
+' ta T 9n
+. \}
+. el \
+' ta T 8n
+. nf
+. \}
+. el \{ .ie "\$1"-filled" \{\
+. ds doc-display-type-stack\n[doc-display-depth] filled
+. ad b
+. fi
+. \}
+. el \{ .ie "\$1"-ragged" \{\
+. ds doc-display-type-stack\n[doc-display-depth] ragged
+. na
+. fi
+. \}
+. el \{ .ie "\$1"-centered" \{\
+. ds doc-display-type-stack\n[doc-display-depth] centered
+. ad c
+. fi
+. \}
+. el \{ .ie "\$1"-unfilled" \{\
+. ds doc-display-type-stack\n[doc-display-depth] unfilled
+. nf
+. \}
+. el \{\
+. tm1 "mdoc warning: Unknown keyword `\$1' (or missing display type)
+. tm1 " in .Bd request (#\n[.c])
+. nr doc-reg-Bd 0
+. \}\}\}\}\}
+.
+. \" have we seen an argument?
+. if \n[doc-reg-Bd] \{\
+. shift
+. \" check other arguments
+. if \n[.$] \
+. doc-do-Bd-args \$@
+. \}
+.
+. \" avoid warning about non-existent register
+. if !r doc-display-indent-stack\n[doc-display-depth] \
+. nr doc-display-indent-stack\n[doc-display-depth] 0
+.
+. if \n[doc-display-indent-stack\n[doc-display-depth]] \
+' in +\n[doc-display-indent-stack\n[doc-display-depth]]u
+.
+. if !\n[doc-is-compact] \{\
+. if !\n[doc-in-synopsis-section] \{\
+. ie "\*[doc-display-type-stack\n[doc-display-depth]]"ragged" \
+. sp \n[doc-display-vertical]u
+. el \
+' sp \n[doc-display-vertical]u
+. \}\}
+.
+. if !\n[cR] \
+. ne 2v
+.
+. if !"\*[doc-display-file]"" \
+. so \*[doc-display-file]
+.
+. nr doc-is-compact 0
+. ds doc-display-file
+..
+.
+.
+.\" NS doc-do-Bd-args macro
+.\" NS resolve remaining .Bd arguments
+.\" NS
+.\" NS modifies:
+.\" NS doc-display-file
+.\" NS doc-display-indent-stackXXX
+.\" NS doc-is-compact
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-ddBa
+.\" NS doc-reg-ddBa1
+.\" NS doc-reg-ddBa2
+.\" NS doc-reg-ddBa3
+.\" NS doc-reg-ddBa4
+.\" NS doc-str-ddBa
+.
+.de doc-do-Bd-args
+. nr doc-reg-ddBa 1
+.
+. ie "\$1"-offset" \{\
+. nr doc-reg-ddBa 2
+.
+. ie "\$2"left" \
+. nr doc-display-indent-stack\n[doc-display-depth] 0
+. el \{ .ie "\$2"right" \
+. nr doc-display-indent-stack\n[doc-display-depth] (\n[.l]u / 3u)
+. el \{ .ie "\$2"center" \
+. nr doc-display-indent-stack\n[doc-display-depth] ((\n[.l]u - \n[.i]u) / 4u)
+. el \{ .ie "\$2"indent" \
+. nr doc-display-indent-stack\n[doc-display-depth] \n[doc-display-indent]u
+. el \{ .ie "\$2"indent-two" \
+. nr doc-display-indent-stack\n[doc-display-depth] (\n[doc-display-indent]u + \n[doc-display-indent]u)
+. el \
+. nr doc-reg-ddBa 1
+. \}\}\}\}
+.
+. \" not a known keyword
+. if (\n[doc-reg-ddBa] == 1) \{\
+. nr doc-reg-ddBa 2
+.
+. nr doc-reg-ddBa1 0
+. if \B(\$2) \{\
+. \" disable warnings related to scaling indicators (32)
+. nr doc-reg-ddBa2 \n[.warn]
+. warn (\n[.warn] - (\n[.warn] / 32 % 2 * 32))
+.
+. \" values without a scaling indicator are taken as strings;
+. \" we test whether the parameter string with and without the last
+. \" character yields identical numerical results (ignoring the
+. \" scaling indicator)
+. ds doc-str-ddBa "\$2
+. substring doc-str-ddBa 1 -1
+. if \B(\*[doc-str-ddBa]) \{\
+. nr doc-reg-ddBa3 (;(\$2))
+. nr doc-reg-ddBa4 (\*[doc-str-ddBa])
+. if (\n[doc-reg-ddBa3] == \n[doc-reg-ddBa4]) \
+. nr doc-reg-ddBa1 1
+. \}
+.
+. \" enable all warnings again
+. warn \n[doc-reg-ddBa2]
+. \}
+.
+. ie \n[doc-reg-ddBa1] \
+. nr doc-display-indent-stack\n[doc-display-depth] \$2
+. el \{\
+. doc-get-width "\$2"
+. ie (\n[doc-width] <= 3) \{\
+. \" if the offset parameter is a macro, use the macro's
+. \" width as specified in doc-common
+. doc-get-arg-type "\$2"
+. ie (\n[doc-arg-type] == 1) \
+. nr doc-display-indent-stack\n[doc-display-depth] \n[\$2]
+. el \
+. nr doc-display-indent-stack\n[doc-display-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}
+. el \
+. nr doc-display-indent-stack\n[doc-display-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}\}
+. \}
+. el \{ .ie "\$1"-compact" \
+. nr doc-is-compact 1
+. el \{ .ie "\$1"-file" \{\
+. ie !"\$2"" \{\
+. ds doc-display-file "\$2
+. nr doc-reg-ddBa 2
+. \}
+. el \
+. tm mdoc warning: .Bd `-file' keyword requires argument (#\n[.c])
+. \}
+. el \
+. tm mdoc warning: Unknown keyword `\$1' in .Bd request (#\n[.c])
+. \}\}
+.
+. if (\n[doc-reg-ddBa] < \n[.$]) \{\
+. shift \n[doc-reg-ddBa]
+. doc-do-Bd-args \$@
+. \}
+..
+.
+.
+.\" NS Ed user macro
+.\" NS end display
+.\" NS
+.\" NS modifies:
+.\" NS doc-display-depth
+.\" NS doc-display-indent-stackXXX
+.\" NS doc-display-type-stackXXX
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Ed' set in doc-common
+.
+.de Ed
+. ds doc-macro-name Ed
+.
+. br
+.
+. if !\n[doc-display-depth] \{\
+. tm mdoc warning: Extraneous .Ed (#\n[.c])
+. nr doc-display-depth 1
+. \}
+.
+. if "\*[doc-display-type-stack\n[doc-display-depth]]"literal" \{\
+. ft \n[doc-curr-font]
+. ps \n[doc-curr-size]u
+. \}
+.
+. in -\n[doc-display-indent-stack\n[doc-display-depth]]u
+.
+. \" restore saved adjustment and fill modes
+. ie \n[doc-display-fi-stack\n[doc-display-depth]] \
+. fi
+. el \
+. nf
+. ad \n[doc-display-ad-stack\n[doc-display-depth]]
+.
+. nr doc-display-indent-stack\n[doc-display-depth] 0
+. ds doc-display-type-stack\n[doc-display-depth]
+. nr doc-display-depth -1
+..
+.
+.
+.\" NS doc-list-type-stackXXX global string
+.\" NS stack of list types
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.ds doc-list-type-stack1
+.
+.
+.\" NS doc-list-indent-stackXXX global register
+.\" NS stack of list indentation values
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-list-indent-stack1 0
+.
+.
+.\" NS doc-list-have-indent-stackXXX global register (bool)
+.\" NS an indentation value is active
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-list-have-indent-stack1 0
+.
+.
+.\" NS Bl user macro
+.\" NS begin list
+.\" NS
+.\" NS width register `Bl' set in doc-common
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-list-depth
+.\" NS doc-list-have-indent-stackXXX
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-list-type-stackXXX
+.\" NS doc-macro-name
+.\" NS doc-num-args
+.\" NS doc-num-columns
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Bl
+.
+.de Bl
+. if !\n[.$] \{\
+. doc-Bl-usage
+. return
+. \}
+.
+. ds doc-macro-name Bl
+. nr doc-list-depth +1
+. nr doc-arg-ptr 1
+.
+. ie "\$1"-hang" \{\
+. ds doc-list-type-stack\n[doc-list-depth] hang-list
+. nr doc-list-indent-stack\n[doc-list-depth] 6n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-tag" \{\
+. ds doc-list-type-stack\n[doc-list-depth] tag-list
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-item" \{\
+. ds doc-list-type-stack\n[doc-list-depth] item-list
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-enum" \{\
+. ds doc-list-type-stack\n[doc-list-depth] enum-list
+. nr doc-list-indent-stack\n[doc-list-depth] 3n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-bullet" \{\
+. ds doc-list-type-stack\n[doc-list-depth] bullet-list
+. nr doc-list-indent-stack\n[doc-list-depth] 2n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-dash" \{\
+. ds doc-list-type-stack\n[doc-list-depth] dash-list
+. nr doc-list-indent-stack\n[doc-list-depth] 2n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-hyphen" \{\
+. ds doc-list-type-stack\n[doc-list-depth] dash-list
+. nr doc-list-indent-stack\n[doc-list-depth] 2n
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-inset" \{\
+. ds doc-list-type-stack\n[doc-list-depth] inset-list
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-diag" \{\
+. ds doc-list-type-stack\n[doc-list-depth] diag-list
+. \}
+. el \{ .ie "\$1"-ohang" \{\
+. ds doc-list-type-stack\n[doc-list-depth] ohang-list
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. el \{ .ie "\$1"-column" \{\
+. ds doc-list-type-stack\n[doc-list-depth] column-list
+. linetabs 1
+. \}
+. el \{\
+. tm1 "mdoc warning: Unknown list type `\$1' (or missing list type)
+. tm1 " in .Bl request
+. tm
+. nr doc-arg-ptr 0
+. \}\}\}\}\}\}\}\}\}\}\}
+.
+. \" we have seen a list type
+. if !\n[doc-arg-ptr] \{\
+. doc-Bl-usage
+. doc-reset-args
+. nr doc-list-depth -1
+. return
+. \}
+.
+. shift
+.
+. \" fill argument vector
+. nr doc-reg-Bl 1
+. while (\n[doc-reg-Bl] <= \n[.$]) \{\
+. ds doc-arg\n[doc-reg-Bl] "\$[\n[doc-reg-Bl]]
+. nr doc-reg-Bl +1
+. \}
+.
+. doc-increment-list-stack
+.
+. if \n[.$] \{\
+. nr doc-arg-limit \n[.$]
+. nr doc-arg-ptr 0
+. doc-do-Bl-args
+.
+. in +\n[doc-list-offset-stack\n[doc-list-depth]]u
+.
+. \" initialize column list
+. if "\*[doc-list-type-stack\n[doc-list-depth]]"column-list" \{\
+. doc-set-column-tab \n[doc-num-columns]
+' in -\n[doc-column-indent-width]u
+. if !\n[doc-compact-list-stack\n[doc-list-depth]] \
+. sp \n[doc-display-vertical]u
+.
+. nf
+. nr doc-num-columns 0
+. \}\}
+.
+. doc-reset-args
+..
+.
+.
+.\" NS doc-Bl-usage macro
+.
+.de doc-Bl-usage
+. tm1 "Usage: .Bl {-hang | -ohang | -tag | -diag | -inset}
+. tm1 " [-width <string>] [-xwidth <command>]
+. tm1 " [-offset <string>] [-compact]
+. tm1 " .Bl -column [-offset <string>] <string1> <string2> ...
+. tm1 " .Bl {-item | -enum [-nested] | -bullet | -hyphen | -dash}
+. tm1 " [-offset <string>] [-compact] (#\n[.c])
+..
+.
+.
+.\" NS doc-do-Bl-args macro
+.\" NS resolve remaining .Bl arguments
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-compact-list-stackXXX
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-list-offset-stackXXX
+.\" NS doc-num-columns
+.\" NS doc-tag-prefix-stackXXX
+.\" NS doc-tag-width-stackXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-box-dBla
+.\" NS doc-env-dBla
+.\" NS doc-reg-dBla
+.\" NS doc-reg-dBla1
+.\" NS doc-reg-dBla2
+.\" NS doc-reg-dBla3
+.\" NS doc-reg-dBla4
+.\" NS doc-str-dBla
+.\" NS doc-str-dBla1
+.
+.de doc-do-Bl-args
+. nr doc-arg-ptr +1
+.
+. if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \
+. return
+.
+. \" avoid a warning message in case e.g. `-offset' has no parameter
+. nr doc-reg-dBla (\n[doc-arg-ptr] + 1)
+. if !d doc-arg\n[doc-reg-dBla] \
+. ds doc-arg\n[doc-reg-dBla]
+.
+. nr doc-reg-dBla 1
+.
+. ie "\*[doc-arg\n[doc-arg-ptr]]"-compact" \
+. nr doc-compact-list-stack\n[doc-list-depth] 1
+.
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-nested" \{\
+. ie (\n[doc-list-depth] > 1) \{\
+. nr doc-reg-dBla1 (\n[doc-list-depth] - 1)
+. ds doc-tag-prefix-stack\n[doc-list-depth] "\*[doc-tag-prefix-stack\n[doc-reg-dBla1]]
+. as doc-tag-prefix-stack\n[doc-list-depth] \n[doc-enum-list-count-stack\n[doc-reg-dBla1]].
+. length doc-reg-dBla1 "\*[doc-tag-prefix-stack\n[doc-list-depth]]
+. nr doc-list-indent-stack\n[doc-list-depth] +\n[doc-reg-dBla1]n
+. \}
+. el \
+. tm mdoc warning: `-nested' allowed with nested .Bl requests only (#\n[.c])
+. \}
+.
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-width" \{\
+. nr doc-arg-ptr +1
+. ds doc-tag-width-stack\n[doc-list-depth] TagwidtH
+. ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
+.
+. \" test whether argument is a valid numeric expression
+. nr doc-reg-dBla1 0
+. if \B(\*[doc-str-dBla]) \{\
+. \" disable warnings related to scaling indicators (32)
+. nr doc-reg-dBla2 \n[.warn]
+. warn (\n[.warn] - (\n[.warn] / 32 % 2 * 32))
+.
+. \" values without a scaling indicator are taken as strings;
+. \" we test whether the parameter string with and without the last
+. \" character yields identical numerical results (ignoring the
+. \" scaling indicator)
+. ds doc-str-dBla1 "\*[doc-str-dBla]
+. substring doc-str-dBla1 1 -1
+. if \B(\*[doc-str-dBla1]) \{\
+. nr doc-reg-dBla3 (;(\*[doc-str-dBla]))
+. nr doc-reg-dBla4 (\*[doc-str-dBla1])
+. if (\n[doc-reg-dBla3] == \n[doc-reg-dBla4]) \
+. nr doc-reg-dBla1 1
+. \}
+.
+. \" enable all warnings again
+. warn \n[doc-reg-dBla2]
+. \}
+.
+. ie \n[doc-reg-dBla1] \
+. nr doc-list-indent-stack\n[doc-list-depth] (\*[doc-str-dBla])
+. el \{\
+. doc-get-arg-width \n[doc-arg-ptr]
+. ie (\n[doc-width] == 2) \{\
+. \" if the width parameter is a macro, use the macro's
+. \" width as specified in doc-common
+. doc-get-arg-type \*[doc-str-dBla]
+. ie (\n[doc-arg-type] == 1) \
+. nr doc-list-indent-stack\n[doc-list-depth] \n[\*[doc-str-dBla]]
+. el \
+. nr doc-list-indent-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}
+. el \
+. nr doc-list-indent-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}\}
+.
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-xwidth" \{\
+. nr doc-arg-ptr +1
+. ds doc-tag-width-stack\n[doc-list-depth] TagwidtH
+.
+. ds doc-str-dBla \*[doc-arg\n[doc-arg-ptr]]
+. substring doc-str-dBla 1 2
+. if .\*[doc-str-dBla] \{\
+. \" execute string in a box to get the width of the diversion
+. ds doc-str-dBla \*[doc-arg\n[doc-arg-ptr]]
+. doc-save-global-vars
+. doc-reset-args
+. box doc-box-dBla
+. ev doc-env-dBla
+. evc 0
+. in 0
+. nf
+. nop \*[doc-str-dBla]
+. br
+. ev
+. box
+. doc-restore-global-vars
+. doc-get-width \h'\n[dl]u'
+. \}
+. nr doc-list-indent-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}
+.
+. el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-offset" \{\
+. nr doc-arg-ptr +1
+.
+. ie "\*[doc-arg\n[doc-arg-ptr]]"indent" \
+. nr doc-list-offset-stack\n[doc-list-depth] \n[doc-display-indent]u
+. el \{\
+. ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
+. nr doc-reg-dBla1 0
+. if \B(\*[doc-str-dBla]) \{\
+. nr doc-reg-dBla2 \n[.warn]
+. warn (\n[.warn] - (\n[.warn] / 32 % 2 * 32))
+.
+. ds doc-str-dBla1 "\*[doc-str-dBla]
+. substring doc-str-dBla1 1 -1
+. if \B(\*[doc-str-dBla1]) \{\
+. nr doc-reg-dBla3 (;(\*[doc-str-dBla]))
+. nr doc-reg-dBla4 (\*[doc-str-dBla1])
+. if (\n[doc-reg-dBla3] == \n[doc-reg-dBla4]) \
+. nr doc-reg-dBla1 1
+. \}
+.
+. warn \n[doc-reg-dBla2]
+. \}
+.
+. ie \n[doc-reg-dBla1] \
+. nr doc-list-offset-stack\n[doc-list-depth] \*[doc-str-dBla]
+. el \{\
+. doc-get-arg-width \n[doc-arg-ptr]
+. ie (\n[doc-width] <= 3) \{\
+. \" if the offset parameter is a macro, use the macro's
+. \" width as specified in doc-common
+. doc-get-arg-type \*[doc-str-dBla]
+. ie (\n[doc-arg-type] == 1) \
+. nr doc-list-offset-stack\n[doc-list-depth] \n[\*[doc-str-dBla]]
+. el \
+. nr doc-list-offset-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}
+. el \
+. nr doc-list-offset-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
+. \}\}\}
+. el \
+. nr doc-reg-dBla 0
+. \}\}\}\}
+.
+. \" not a known keyword, so it specifies the width of the next column
+. \" (if it is a column list)
+. if !\n[doc-reg-dBla] \{\
+. ie "\*[doc-list-type-stack\n[doc-list-depth]]"column-list" \{\
+. nr doc-num-columns +1
+. ds doc-arg\n[doc-num-columns] "\*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \{\
+. tmc mdoc warning: Unknown keyword `\*[doc-arg\n[doc-arg-ptr]]'
+. tm1 " in .Bl request (#\n[.c])
+. \}\}
+.
+. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \
+. doc-do-Bl-args
+..
+.
+.
+.\" NS doc-save-global-vars macro
+.\" NS save all global variables
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dsgv
+.
+.de doc-save-global-vars
+. ds doc-macro-name-saved "\*[doc-macro-name]
+. nr doc-arg-limit-saved \n[doc-arg-limit]
+. nr doc-num-args-saved \n[doc-num-args]
+. nr doc-arg-ptr-saved \n[doc-arg-ptr]
+.
+. nr doc-reg-dsgv 1
+. while (\n[doc-reg-dsgv] <= \n[doc-arg-limit]) \{\
+. ds doc-arg\n[doc-reg-dsgv]-saved "\*[doc-arg\n[doc-reg-dsgv]]
+. nr doc-type\n[doc-reg-dsgv]-saved \n[doc-type\n[doc-reg-dsgv]]
+. ds doc-space\n[doc-reg-dsgv]-saved "\*[doc-space\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. nr doc-curr-font-saved \n[doc-curr-font]
+. nr doc-curr-size-saved \n[doc-curr-size]
+. nr doc-in-synopsis-section-saved \n[doc-in-synopsis-section]
+. nr doc-indent-synopsis-saved \n[doc-indent-synopsis]
+. nr doc-indent-synopsis-active-saved \n[doc-indent-synopsis-active]
+. nr doc-have-decl-saved \n[doc-have-decl]
+. nr doc-have-var-saved \n[doc-have-var]
+. ds doc-command-name-saved "\*[doc-command-name]
+. ds doc-quote-left-saved "\*[doc-quote-left]
+. ds doc-quote-right-saved "\*[doc-quote-right]
+. nr doc-nesting-level-saved \n[doc-nesting-level]
+. nr doc-in-list-saved \n[doc-in-list]
+. ds doc-space-saved "\*[doc-space]
+. ds doc-saved-space-saved "\*[doc-saved-space]
+. nr doc-space-mode-saved \n[doc-space-mode]
+. nr doc-have-space-saved \n[doc-have-space]
+. nr doc-have-slot-saved \n[doc-have-slot]
+. nr doc-keep-type-saved \n[doc-keep-type]
+. nr doc-display-depth-saved \n[doc-display-depth]
+. nr doc-is-compact-saved \n[doc-is-compact]
+.
+. nr doc-reg-dsgv 0
+. while (\n[doc-reg-dsgv] <= \n[doc-display-depth]) \{\
+. ds doc-display-type-stack\n[doc-reg-dsgv]-saved "\*[doc-display-type-stack\n[doc-reg-dsgv]]
+. nr doc-display-indent-stack\n[doc-reg-dsgv]-saved \n[doc-display-indent-stack\n[doc-reg-dsgv]]
+. nr doc-display-ad-stack\n[doc-reg-dsgv]-saved \n[doc-display-ad-stack\n[doc-reg-dsgv]]
+. nr doc-display-fi-stack\n[doc-reg-dsgv]-saved \n[doc-display-fi-stack\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. nr doc-fontmode-depth-saved \n[doc-fontmode-depth]
+.
+. nr doc-reg-dsgv 1
+. while (\n[doc-reg-dsgv] <= \n[doc-fontmode-depth]) \{\
+. nr doc-fontmode-font-stack\n[doc-reg-dsgv]-saved \n[doc-fontmode-font-stack\n[doc-reg-dsgv]]
+. nr doc-fontmode-size-stack\n[doc-reg-dsgv]-saved \n[doc-fontmode-size-stack\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. nr doc-list-depth-saved \n[doc-list-depth]
+.
+. nr doc-reg-dsgv 1
+. while (\n[doc-reg-dsgv] <= \n[doc-list-depth]) \{\
+. ds doc-list-type-stack\n[doc-reg-dsgv]-saved "\*[doc-list-type-stack\n[doc-reg-dsgv]]
+. nr doc-list-have-indent-stack\n[doc-reg-dsgv]-saved \n[doc-list-have-indent-stack\n[doc-reg-dsgv]]
+. nr doc-list-indent-stack\n[doc-reg-dsgv]-saved \n[doc-list-indent-stack\n[doc-reg-dsgv]]
+. nr doc-compact-list-stack\n[doc-reg-dsgv]-saved \n[doc-compact-list-stack\n[doc-reg-dsgv]]
+. ds doc-tag-prefix-stack\n[doc-reg-dsgv]-saved "\*[doc-tag-prefix-stack\n[doc-reg-dsgv]]
+. ds doc-tag-width-stack\n[doc-reg-dsgv]-saved "\*[doc-tag-width-stack\n[doc-reg-dsgv]]
+. nr doc-list-offset-stack\n[doc-reg-dsgv]-saved \n[doc-list-offset-stack\n[doc-reg-dsgv]]
+. nr doc-enum-list-count-stack\n[doc-reg-dsgv]-saved \n[doc-enum-list-count-stack\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. ds doc-saved-Pa-font-saved "\*[doc-saved-Pa-font]
+. nr doc-curr-type-saved \n[doc-curr-type]
+. ds doc-curr-arg-saved "\*[doc-curr-arg]
+. nr doc-diag-list-input-line-count-saved \n[doc-diag-list-input-line-count]
+. nr doc-num-columns-saved \n[doc-num-columns]
+. nr doc-column-indent-width-saved \n[doc-column-indent-width]
+. nr doc-is-func-saved \n[doc-is-func]
+. nr doc-have-old-func-saved \n[doc-have-old-func]
+. nr doc-func-arg-count-saved \n[doc-func-arg-count]
+. ds doc-func-arg-saved "\*[doc-func-arg]
+. nr doc-num-func-args-saved \n[doc-num-func-args]
+. nr doc-func-args-processed-saved \n[doc-func-args-processed]
+. nr doc-have-func-saved \n[doc-have-func]
+. nr doc-is-reference-saved \n[doc-is-reference]
+. nr doc-reference-count-saved \n[doc-reference-count]
+. nr doc-author-count-saved \n[doc-author-count]
+.
+. nr doc-reg-dsgv 0
+. while (\n[doc-reg-dsgv] <= \n[doc-author-count]) \{\
+. ds doc-author-name\n[doc-reg-dsgv]-saved "\*[doc-author-name\n[doc-reg-dsgv]]
+. nr doc-reg-dsgv +1
+. \}
+.
+. nr doc-book-count-saved \n[doc-book-count]
+. ds doc-book-name-saved "\*[doc-book-name]
+. nr doc-date-count-saved \n[doc-date-count]
+. ds doc-date-saved "\*[doc-date]
+. nr doc-publisher-count-saved \n[doc-publisher-count]
+. ds doc-publisher-name-saved "\*[doc-publisher-name]
+. nr doc-journal-count-saved \n[doc-journal-count]
+. ds doc-journal-name-saved "\*[doc-journal-name]
+. nr doc-issue-count-saved \n[doc-issue-count]
+. ds doc-issue-name-saved "\*[doc-issue-name]
+. nr doc-optional-count-saved \n[doc-optional-count]
+. ds doc-optional-string-saved "\*[doc-optional-string]
+. nr doc-page-number-count-saved \n[doc-page-number-count]
+. ds doc-page-number-string-saved "\*[doc-page-number-string]
+. nr doc-corporate-count-saved \n[doc-corporate-count]
+. ds doc-corporate-name-saved "\*[doc-corporate-name]
+. nr doc-report-count-saved \n[doc-report-count]
+. ds doc-report-name-saved "\*[doc-report-name]
+. nr doc-reference-title-count-saved \n[doc-reference-title-count]
+. ds doc-reference-title-name-saved "\*[doc-reference-title-name]
+. ds doc-reference-title-name-for-book-saved "\*[doc-reference-title-name-for-book]
+. nr doc-volume-count-saved \n[doc-volume-count]
+. ds doc-volume-name-saved "\*[doc-volume-name]
+. nr doc-have-author-saved \n[doc-have-author]
+.
+. ds doc-document-title-saved "\*[doc-document-title]
+. ds doc-volume-saved "\*[doc-volume]
+. ds doc-section-saved "\*[doc-section]
+. ds doc-operating-system-saved "\*[doc-operating-system]
+. ds doc-date-string-saved "\*[doc-date-string]
+. nr doc-header-space-saved \n[doc-header-space]
+. nr doc-footer-space-saved \n[doc-footer-space]
+. nr doc-display-vertical-saved \n[doc-display-vertical]
+. ds doc-header-string-saved "\*[doc-header-string]
+. nr doc-in-see-also-section-saved \n[doc-in-see-also-section]
+. nr doc-in-files-section-saved \n[doc-in-files-section]
+. nr doc-in-authors-section-saved \n[doc-in-authors-section]
+..
+.
+.
+.\" NS doc-restore-global-vars macro
+.\" NS restore all global variables
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-drgv
+.
+.de doc-restore-global-vars
+. ds doc-macro-name "\*[doc-macro-name-saved]
+. nr doc-arg-limit \n[doc-arg-limit-saved]
+. nr doc-num-args \n[doc-num-args-saved]
+. nr doc-arg-ptr \n[doc-arg-ptr-saved]
+.
+. nr doc-reg-drgv 1
+. while (\n[doc-reg-drgv] <= \n[doc-arg-limit]) \{\
+. ds doc-arg\n[doc-reg-drgv] "\*[doc-arg\n[doc-reg-drgv]-saved]
+. nr doc-type\n[doc-reg-drgv] \n[doc-type\n[doc-reg-drgv]-saved]
+. ds doc-space\n[doc-reg-drgv] "\*[doc-space\n[doc-reg-drgv]-saved]
+. nr doc-reg-drgv +1
+. \}
+.
+. nr doc-curr-font \n[doc-curr-font-saved]
+. nr doc-curr-size \n[doc-curr-size-saved]
+. nr doc-in-synopsis-section \n[doc-in-synopsis-section-saved]
+. nr doc-indent-synopsis \n[doc-indent-synopsis-saved]
+. nr doc-indent-synopsis-active \n[doc-indent-synopsis-active-saved]
+. nr doc-have-decl \n[doc-have-decl-saved]
+. nr doc-have-var \n[doc-have-var-saved]
+. ds doc-command-name "\*[doc-command-name-saved]
+. ds doc-quote-left "\*[doc-quote-left-saved]
+. ds doc-quote-right "\*[doc-quote-right-saved]
+. nr doc-nesting-level \n[doc-nesting-level-saved]
+. nr doc-in-list \n[doc-in-list-saved]
+. ds doc-space "\*[doc-space-saved]
+. ds doc-saved-space "\*[doc-saved-space-saved]
+. nr doc-space-mode \n[doc-space-mode-saved]
+. nr doc-have-space \n[doc-have-space-saved]
+. nr doc-have-slot \n[doc-have-slot-saved]
+. nr doc-keep-type \n[doc-keep-type-saved]
+. nr doc-display-depth \n[doc-display-depth-saved]
+. nr doc-is-compact \n[doc-is-compact-saved]
+.
+. nr doc-reg-drgv 0
+. while (\n[doc-reg-drgv] <= \n[doc-display-depth]) \{\
+. ds doc-display-type-stack\n[doc-reg-drgv] "\*[doc-display-type-stack\n[doc-reg-drgv]-saved]
+. nr doc-display-indent-stack\n[doc-reg-drgv] \n[doc-display-indent-stack\n[doc-reg-drgv]-saved]
+. nr doc-display-ad-stack\n[doc-reg-drgv] \n[doc-display-ad-stack\n[doc-reg-drgv]-saved]
+. nr doc-display-fi-stack\n[doc-reg-drgv] \n[doc-display-fi-stack\n[doc-reg-drgv]-saved]
+. nr doc-reg-drgv +1
+. \}
+.
+. nr doc-fontmode-depth \n[doc-fontmode-depth-saved]
+.
+. nr doc-reg-drgv 1
+. while (\n[doc-reg-drgv] <= \n[doc-fontmode-depth]) \{\
+. nr doc-fontmode-font-stack\n[doc-reg-drgv] \n[doc-fontmode-font-stack\n[doc-reg-drgv]]-saved
+. nr doc-fontmode-size-stack\n[doc-reg-drgv] \n[doc-fontmode-size-stack\n[doc-reg-drgv]]-saved
+. nr doc-reg-drgv +1
+. \}
+.
+. nr doc-list-depth \n[doc-list-depth-saved]
+.
+. nr doc-reg-drgv 1
+. while (\n[doc-reg-drgv] <= \n[doc-list-depth]) \{\
+. ds doc-list-type-stack\n[doc-reg-drgv] "\*[doc-list-type-stack\n[doc-reg-drgv]-saved]
+. nr doc-list-have-indent-stack\n[doc-reg-drgv] \n[doc-list-have-indent-stack\n[doc-reg-drgv]-saved]
+. nr doc-list-indent-stack\n[doc-reg-drgv] \n[doc-list-indent-stack\n[doc-reg-drgv]-saved]
+. nr doc-compact-list-stack\n[doc-reg-drgv] \n[doc-compact-list-stack\n[doc-reg-drgv]-saved]
+. ds doc-tag-prefix-stack\n[doc-reg-drgv] "\*[doc-tag-prefix-stack\n[doc-reg-drgv]-saved]
+. ds doc-tag-width-stack\n[doc-reg-drgv] "\*[doc-tag-width-stack\n[doc-reg-drgv]-saved]
+. nr doc-list-offset-stack\n[doc-reg-drgv] \n[doc-list-offset-stack\n[doc-reg-drgv]-saved]
+. nr doc-enum-list-count-stack\n[doc-reg-drgv] \n[doc-enum-list-count-stack\n[doc-reg-drgv]-saved]
+. nr doc-reg-drgv +1
+. \}
+.
+. ds doc-saved-Pa-font "\*[doc-saved-Pa-font-saved]
+. nr doc-curr-type \n[doc-curr-type-saved]
+. ds doc-curr-arg "\*[doc-curr-arg-saved]
+. nr doc-diag-list-input-line-count \n[doc-diag-list-input-line-count-saved]
+. nr doc-num-columns \n[doc-num-columns-saved]
+. nr doc-column-indent-width \n[doc-column-indent-width-saved]
+. nr doc-is-func \n[doc-is-func-saved]
+. nr doc-have-old-func \n[doc-have-old-func-saved]
+. nr doc-func-arg-count \n[doc-func-arg-count-saved]
+. ds doc-func-arg "\*[doc-func-arg-saved]
+. nr doc-num-func-args \n[doc-num-func-args-saved]
+. nr doc-func-args-processed \n[doc-func-args-processed-saved]
+. nr doc-have-func \n[doc-have-func-saved]
+. nr doc-is-reference \n[doc-is-reference-saved]
+. nr doc-reference-count \n[doc-reference-count-saved]
+. nr doc-author-count \n[doc-author-count-saved]
+.
+. nr doc-reg-drgv 0
+. while (\n[doc-reg-drgv] <= \n[doc-author-count]) \{\
+. ds doc-author-name\n[doc-reg-drgv] "\*[doc-author-name\n[doc-reg-drgv]-saved]
+. nr doc-reg-drgv +1
+. \}
+.
+. nr doc-book-count \n[doc-book-count-saved]
+. ds doc-book-name "\*[doc-book-name-saved]
+. nr doc-date-count \n[doc-date-count-saved]
+. ds doc-date "\*[doc-date-saved]
+. nr doc-publisher-count \n[doc-publisher-count-saved]
+. ds doc-publisher-name "\*[doc-publisher-name-saved]
+. nr doc-journal-count \n[doc-journal-count-saved]
+. ds doc-journal-name "\*[doc-journal-name-saved]
+. nr doc-issue-count \n[doc-issue-count-saved]
+. ds doc-issue-name "\*[doc-issue-name-saved]
+. nr doc-optional-count \n[doc-optional-count-saved]
+. ds doc-optional-string "\*[doc-optional-string-saved]
+. nr doc-page-number-count \n[doc-page-number-count-saved]
+. ds doc-page-number-string "\*[doc-page-number-string-saved]
+. nr doc-corporate-count \n[doc-corporate-count-saved]
+. ds doc-corporate-name "\*[doc-corporate-name-saved]
+. nr doc-report-count \n[doc-report-count-saved]
+. ds doc-report-name "\*[doc-report-name-saved]
+. nr doc-reference-title-count \n[doc-reference-title-count-saved]
+. ds doc-reference-title-name "\*[doc-reference-title-name-saved]
+. ds doc-reference-title-name-for-book "\*[doc-reference-title-name-for-book-saved]
+. nr doc-volume-count \n[doc-volume-count-saved]
+. ds doc-volume-name "\*[doc-volume-name-saved]
+. nr doc-have-author \n[doc-have-author-saved]
+.
+. ds doc-document-title "\*[doc-document-title-saved]
+. ds doc-volume "\*[doc-volume-saved]
+. ds doc-section "\*[doc-section-saved]
+. ds doc-operating-system "\*[doc-operating-system-saved]
+. ds doc-date-string "\*[doc-date-string-saved]
+. nr doc-header-space \n[doc-header-space-saved]
+. nr doc-footer-space \n[doc-footer-space-saved]
+. nr doc-display-vertical \n[doc-display-vertical-saved]
+. ds doc-header-string "\*[doc-header-string-saved]
+. nr doc-in-see-also-section \n[doc-in-see-also-section-saved]
+. nr doc-in-files-section \n[doc-in-files-section-saved]
+. nr doc-in-authors-section \n[doc-in-authors-section-saved]
+..
+.
+.
+.\" NS El user macro
+.\" NS end list
+.\" NS
+.\" NS modifies:
+.\" NS doc-list-depth
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variables:
+.\" NS doc-str-El
+.\" NS
+.\" NS width register `El' set in doc-common
+.
+.de El
+. if \n[.$] \{\
+. tm Usage: .El (does not take arguments) (#\n[.c])
+. return
+. \}
+.
+. ds doc-macro-name El
+. ds doc-str-El \*[doc-list-type-stack\n[doc-list-depth]]
+.
+. ie "\*[doc-str-El]"diag-list" \
+. doc-end-list 0
+. el \{ .ie "\*[doc-str-El]"column-list" \
+. doc-end-column-list
+. el \{ .ie "\*[doc-str-El]"item-list" \
+. doc-end-list 0
+. el \{ .ie "\*[doc-str-El]"ohang-list" \
+. doc-end-list 0
+. el \{ .ie "\*[doc-str-El]"inset-list" \
+. doc-end-list 0
+. el \
+. doc-end-list 1
+. \}\}\}\}
+.
+. br
+..
+.
+.
+.\" NS doc-saved-Pa-font global string
+.\" NS saved doc-Pa-font string for section FILES (no underline if
+.\" NS nroff)
+.
+.ds doc-saved-Pa-font
+.
+.
+.\" NS doc-curr-type global register
+.\" NS current argument type
+.
+.nr doc-curr-type 0
+.
+.
+.\" NS doc-curr-arg global string
+.\" NS current argument
+.
+.ds doc-curr-arg
+.
+.
+.\" NS doc-item-boxXXX global box
+.\" NS item boxes associated list depth
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.
+.\" NS It user macro
+.\" NS list item
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-curr-arg
+.\" NS doc-curr-type
+.\" NS doc-in-list
+.\" NS doc-macro-name
+.\" NS doc-num-args
+.\" NS doc-saved-Pa-font
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-It
+.\" NS doc-str-It
+.\" NS doc-XXX-list-type
+.\" NS
+.\" NS width register `It' set in doc-common
+.
+.nr doc-bullet-list-type 1
+.nr doc-column-list-type 0
+.nr doc-dash-list-type 1
+.nr doc-diag-list-type 0
+.nr doc-enum-list-type 1
+.nr doc-hang-list-type 2
+.nr doc-inset-list-type 2
+.nr doc-item-list-type 1
+.nr doc-ohang-list-type 2
+.nr doc-tag-list-type 2
+.
+.de It
+. ds doc-str-It \*[doc-list-type-stack\n[doc-list-depth]]
+.
+. if "\*[doc-str-It]"" \
+. tm mdoc error: .It without preceding .Bl (#\n[.c])
+.
+. if \n[doc-nesting-level] \{\
+. tmc "mdoc error: .It found in enclosing (e.g. .Ac ... .It ... .Ao)
+. tm1 " (#\n[.c])
+. \}
+.
+. br
+. if !\n[cR] \
+. ne 3v
+.
+. if \n[.$] \{\
+. ds doc-macro-name It
+.
+. \" fill argument vector
+. nr doc-reg-It 1
+. while (\n[doc-reg-It] <= \n[.$]) \{\
+. ds doc-arg\n[doc-reg-It] "\$[\n[doc-reg-It]]
+. nr doc-reg-It +1
+. \}
+.
+. nr doc-num-args \n[.$]
+. nr doc-arg-ptr 0
+. \}
+.
+. nr doc-reg-It \n[doc-\*[doc-str-It]-type]
+.
+. if \n[doc-reg-It] \{\
+. \" start item box
+. box doc-item-box\n[doc-list-depth]
+. ev doc-item-env\n[doc-list-depth]
+. evc 0
+. in 0
+. nf
+. \}
+.
+. ie (\n[doc-reg-It] == 1) \{\
+. if \n[.$] \{\
+. tm1 "mdoc warning: .It requests in lists of type `\*[doc-str-It]'
+. tm1 " don't take arguments (#\n[.c])
+. \}\}
+. el \{\
+. ie \n[.$] \{\
+. if (\n[doc-reg-It] == 2) \{\
+. \" handle list types with arguments
+. doc-parse-arg-vector
+.
+. nr doc-in-list 1
+. nr doc-arg-ptr 1
+. nr doc-curr-type \n[doc-type1]
+. ds doc-curr-arg "\*[doc-arg1]
+.
+. if \n[doc-in-files-section] \{\
+. ds doc-saved-Pa-font "\*[doc-Pa-font]
+. if n \
+. ds doc-Pa-font "\*[doc-No-font]
+. \}
+.
+. ie (\n[doc-type1] == 1) \
+. \*[doc-arg1]
+. el \{\
+. nr doc-arg-ptr 1
+. doc-print-recursive
+. \}\}\}
+. el \{\
+. tm1 "mdoc warning: .It requests in lists of type `\*[doc-str-It]'
+. tm1 " require arguments (#\n[.c])
+. \}
+. \}
+.
+. \" the previous call of `.doc-print-recursive' can contain calls to
+. \" opening requests like `.Ao'; we then defer the call of `doc-xxx-list'
+. if !\n[doc-nesting-level] \
+. doc-\*[doc-str-It]
+..
+.
+.
+.\" NS doc-inset-list macro
+.\" NS .It item of list-type inset
+.\" NS
+.\" NS modifies:
+.\" NS doc-in-list
+.
+.de doc-inset-list
+. \" finish item box
+. br
+. ev
+. box
+. unformat doc-item-box\n[doc-list-depth]
+.
+. doc-set-vertical-and-indent 0
+. br
+.
+. nh
+. doc-item-box\n[doc-list-depth]
+.
+. nr doc-in-list 0
+. doc-reset-args
+..
+.
+.
+.\" NS doc-hang-list macro
+.\" NS .It item of list-type hanging tag (as opposed to tagged)
+.\" NS
+.\" NS modifies:
+.\" NS doc-have-space
+.\" NS doc-in-list
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dhl
+.\" NS doc-reg-dhl1
+.
+.de doc-hang-list
+. \" finish item box
+. br
+. ev
+. box
+. unformat doc-item-box\n[doc-list-depth]
+.
+. doc-set-vertical-and-indent 1
+. nr doc-reg-dhl (\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
+. ti -\n[doc-reg-dhl]u
+.
+. nh
+. ie (\n[dl]u > \n[doc-list-indent-stack\n[doc-list-depth]]u) \
+. doc-item-box\n[doc-list-depth]
+. el \{\
+. chop doc-item-box\n[doc-list-depth]
+. nr doc-reg-dhl1 \n[.k]u
+. nop \*[doc-item-box\n[doc-list-depth]]\c
+. nop \h'|(\n[doc-reg-dhl1]u - \n[.k]u + \n[doc-reg-dhl]u)'\c
+. nr doc-have-space 1
+. \}
+.
+. nr doc-in-list 0
+. doc-reset-args
+..
+.
+.
+.\" NS doc-ohang-list macro
+.\" NS .It item of list-type overhanging tag
+.\" NS
+.\" NS modifies:
+.\" NS doc-in-list
+.
+.de doc-ohang-list
+. \" finish item box
+. br
+. ev
+. box
+. unformat doc-item-box\n[doc-list-depth]
+.
+. doc-set-vertical-and-indent 0
+. nh
+. doc-item-box\n[doc-list-depth]
+. br
+.
+. nr doc-in-list 0
+. doc-reset-args
+..
+.
+.
+.\" NS doc-item-list macro
+.\" NS .It item of list-type [empty tag]
+.
+.de doc-item-list
+. \" finish (dummy) item box
+. br
+. ev
+. box
+.
+. doc-set-vertical-and-indent 0
+. br
+.
+. doc-reset-args
+..
+.
+.
+.\" NS doc-enum-list-count-stackXXX global register
+.\" NS stack of current enum count values
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-enum-list-count-stack1 0
+.
+.
+.\" NS doc-enum-list macro
+.\" NS enumerated list
+.\" NS
+.\" NS modifies:
+.\" NS doc-enum-list-count-stackXXX
+.\" NS doc-in-list
+.
+.de doc-enum-list
+. nr doc-in-list 1
+. nr doc-enum-list-count-stack\n[doc-list-depth] +1
+\# XXX
+\#.ll \n[doc-list-indent-stack\n[doc-list-depth]]u
+\#.rj
+. nop \*[doc-tag-prefix-stack\n[doc-list-depth]]\c
+. nop \n[doc-enum-list-count-stack\n[doc-list-depth]].\&
+. doc-do-list
+..
+.
+.
+.\" NS doc-bullet-list macro
+.\" NS bullet paragraph list
+.\" NS
+.\" NS modifies:
+.\" NS doc-in-list
+.
+.de doc-bullet-list
+. nr doc-in-list 1
+. nop \)\*[doc-Sy-font]\[bu]\f[P]
+. doc-do-list
+..
+.
+.
+.\" NS doc-dash-list macro
+.\" NS hyphen paragraph list (sub bullet list)
+.\" NS
+.\" NS modifies:
+.\" NS doc-in-list
+.
+.de doc-dash-list
+. nr doc-in-list 1
+. nop \)\*[doc-Sy-font]\-\f[P]
+. doc-do-list
+..
+.
+.
+.\" NS doc-do-list macro
+.\" NS .It item of list-type enum/bullet/hyphen
+.
+.als doc-do-list doc-hang-list
+.
+.
+.\" NS doc-diag-list-input-line-count global register
+.\" NS saved line number to be checked in next diag-list item
+.
+.nr doc-diag-list-input-line-count 0
+.
+.
+.\" NS doc-diag-list macro
+.\" NS .It item of list-type diagnostic-message
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-diag-list-input-line-count
+.
+.de doc-diag-list
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. ie ((\n[.c] - \n[doc-diag-list-input-line-count]) > 1) \{\
+. ie !\n[doc-compact-list-stack\n[doc-list-depth]] \
+. doc-paragraph
+. el \
+. br
+. \}
+. el \
+. br
+. nr doc-diag-list-input-line-count \n[.c]
+.
+. nh
+. nop \*[doc-Sy-font]\c
+. if \n[doc-num-args] \
+. doc-remaining-args
+. nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\*[doc-hard-space]\c
+.
+. doc-print-and-reset
+..
+.
+.
+.\" NS doc-tag-list macro
+.\" NS .It item of list-type `tag'
+.\" NS
+.\" NS modifies:
+.\" NS doc-have-space
+.\" NS doc-in-list
+.\" NS
+.\" NS local variables:
+.\" NS doc-box-dtl
+.\" NS doc-reg-dtl
+.\" NS doc-reg-dtl1
+.
+.de doc-tag-list
+. \" finish item box
+. br
+. ev
+. box
+. unformat doc-item-box\n[doc-list-depth]
+.
+. \" we use a box without `.nf' to compute the tag width (via `dl' register)
+. box doc-box-dtl
+. ev doc-env-dtl
+. evc 0
+. fi
+. ad 0
+. in 0
+. doc-item-box\n[doc-list-depth]
+. br
+. ev
+. box
+.
+. if !"TagwidtH"\*[doc-tag-width-stack\n[doc-list-depth]]" \{\
+. if !\n[doc-list-have-indent-stack\n[doc-list-depth]] \{\
+. in -(\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
+. nr doc-list-have-indent-stack\n[doc-list-depth] 1
+. \}
+. doc-get-tag-width
+. \}
+. doc-set-vertical-and-indent 1
+. nr doc-reg-dtl (\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
+. ti -\n[doc-reg-dtl]u
+.
+. nh
+. ie (\n[dl]u > \n[doc-list-indent-stack\n[doc-list-depth]]u) \{\
+. doc-item-box\n[doc-list-depth]
+. br
+. \}
+. el \{\
+. chop doc-item-box\n[doc-list-depth]
+. nr doc-reg-dtl1 \n[.k]u
+. nop \*[doc-item-box\n[doc-list-depth]]\c
+. nop \h'|(\n[doc-reg-dtl1]u - \n[.k]u + \n[doc-reg-dtl]u)'\c
+. nr doc-have-space 1
+. \}
+.
+. if \n[doc-in-files-section] \
+. if n \
+. ds doc-Pa-font "\*[doc-saved-Pa-font]
+.
+. nr doc-in-list 0
+. doc-reset-args
+..
+.
+.
+.\" NS doc-get-tag-width macro
+.\" NS resolve unknown tag width (`tag' list-type only)
+.\" NS
+.\" NS modifies:
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-tag-width-stackXXX
+.\" NS
+.\" NS requires:
+.\" NS doc-curr-arg
+.\" NS doc-curr-type
+.
+.de doc-get-tag-width
+. ie (\n[doc-curr-type] == 1) \{\
+. ds doc-tag-width-stack\n[doc-list-depth] \*[doc-curr-arg]
+. nr doc-list-indent-stack\n[doc-list-depth] \n[\*[doc-curr-arg]]
+. \}
+. el \{\
+. ds doc-tag-width-stack\n[doc-list-depth] No
+. nr doc-list-indent-stack\n[doc-list-depth] \n[No]
+. \}
+..
+.
+.
+.\" NS doc-set-vertical-and-indent macro
+.\" NS set up vertical spacing (if not compact) and indentation (with
+.\" NS offset if argument is non-zero)
+.\" NS
+.\" NS modifies:
+.\" NS doc-list-have-indent-stackXXX
+.
+.de doc-set-vertical-and-indent
+. if !\n[doc-compact-list-stack\n[doc-list-depth]] \
+. sp \n[doc-display-vertical]u
+.
+. if \n[doc-list-have-indent-stack\n[doc-list-depth]] \{\
+. nr doc-list-have-indent-stack\n[doc-list-depth] 0
+. if \$1 \
+. in +(\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
+. \}
+.
+. if !\n[cR] \
+. ne 2v
+..
+.
+.
+.\" NS doc-list-depth global register
+.\" NS list type stack counter
+.
+.nr doc-list-depth 0
+.
+.
+.\" NS doc-num-columns global register
+.\" NS number of columns
+.
+.nr doc-num-columns 0
+.
+.
+.\" NS doc-compact-list-stackXXX global register (bool)
+.\" NS stack of flags to indicate whether a particular list is compact
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-compact-list-stack1 0
+.
+.
+.\" NS doc-tag-prefix-stackXXX global string
+.\" NS stack of tag prefixes (currently used for -nested -enum lists)
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.ds doc-tag-prefix-stack1
+.
+.
+.\" NS doc-tag-width-stackXXX global string
+.\" NS stack of strings indicating how to set up current element of
+.\" NS doc-list-indent-stackXXX -- if set to TagwidtH, user has set it
+.\" NS directly; if it is a macro name, use the macro's width value;
+.\" NS otherwise, `doc-get-tag-width' uses width value of `No'.
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.ds doc-tag-width-stack0
+.ds doc-tag-width-stack1
+.
+.
+.\" NS doc-list-offset-stackXXX global register
+.\" NS stack of list offsets
+.\" NS
+.\" NS limit:
+.\" NS doc-list-depth
+.
+.nr doc-list-offset-stack1 0
+.
+.
+.\" NS doc-end-list macro
+.\" NS list end function; resets indentation (and offset if argument is
+.\" NS non-zero)
+.\" NS
+.\" NS modifies:
+.\" NS doc-list-depth
+.\" NS doc-list-offset-stackXXX
+.
+.de doc-end-list
+. if \$1 \
+' in -(\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
+.
+' in -\n[doc-list-offset-stack\n[doc-list-depth]]u
+.
+. if (\n[doc-list-depth] <= 0) \
+. tm mdoc warning: extraneous .El call (#\n[.c])
+.
+. doc-decrement-list-stack
+. nr doc-list-depth -1
+..
+.
+.
+.\" NS doc-increment-list-stack macro
+.\" NS set up next block for list
+.\" NS
+.\" NS modifies:
+.\" NS doc-compact-list-stackXXX
+.\" NS doc-list-have-indent-stackXXX
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-list-offset-stackXXX
+.\" NS doc-list-type-stackXXX
+.\" NS doc-tag-prefix-stackXXX
+.\" NS doc-tag-width-stackXXX
+.\" NS doc-enum-list-count-stackXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dils
+.
+.de doc-increment-list-stack
+. nr doc-reg-dils (\n[doc-list-depth] + 1)
+. nr doc-list-have-indent-stack\n[doc-reg-dils] 0
+. nr doc-list-indent-stack\n[doc-reg-dils] 0
+. nr doc-list-offset-stack\n[doc-reg-dils] 0
+. ds doc-tag-prefix-stack\n[doc-reg-dils]
+. ds doc-tag-width-stack\n[doc-reg-dils] \*[doc-tag-width-stack\n[doc-list-depth]]
+. ds doc-list-type-stack\n[doc-reg-dils]
+. nr doc-compact-list-stack\n[doc-reg-dils] 0
+. nr doc-enum-list-count-stack\n[doc-reg-dils] 0
+..
+.
+.
+.\" NS doc-decrement-list-stack macro
+.\" NS decrement stack
+.\" NS
+.\" NS modifies:
+.\" NS doc-compact-list-stackXXX
+.\" NS doc-list-have-indent-stackXXX
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-list-offset-stackXXX
+.\" NS doc-list-type-stackXXX
+.\" NS doc-tag-prefix-stackXXX
+.\" NS doc-tag-width-stackXXX
+.\" NS doc-enum-list-count-stackXXX
+.
+.de doc-decrement-list-stack
+. ds doc-list-type-stack\n[doc-list-depth]
+. nr doc-list-have-indent-stack\n[doc-list-depth] 0
+. nr doc-list-indent-stack\n[doc-list-depth] 0
+. nr doc-list-offset-stack\n[doc-list-depth] 0
+. ds doc-tag-prefix-stack\n[doc-list-depth]
+. ds doc-tag-width-stack\n[doc-list-depth]
+. nr doc-compact-list-stack\n[doc-list-depth] 0
+. nr doc-enum-list-count-stack\n[doc-list-depth] 0
+..
+.
+.
+.\" NS Xr user macro
+.\" NS cross reference (for man pages only)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Xr
+.\" NS
+.\" NS width register `Xr' set in doc-common
+.
+.de Xr
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Xr
+. doc-parse-args \$@
+. \}
+. el \
+. doc-Xr-usage
+. \}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. \" first argument must be a string
+. ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ds doc-arg\n[doc-arg-ptr] \*[doc-Xr-font]\*[doc-arg\n[doc-arg-ptr]]\f[P]\s[0]
+.
+. if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
+. nr doc-reg-Xr (\n[doc-arg-ptr] + 1)
+. \" modify second argument if it is a string and
+. \" remove space inbetween
+. if (\n[doc-type\n[doc-reg-Xr]] == 2) \{\
+. ds doc-arg\n[doc-reg-Xr] \*[lp]\*[doc-arg\n[doc-reg-Xr]]\*[rp]
+. ds doc-space\n[doc-arg-ptr]
+. \}
+. \}
+. doc-print-recursive
+. \}
+. el \
+. doc-Xr-usage
+. \}
+. el \
+. doc-Xr-usage
+..
+.
+.
+.\" NS doc-Xr-usage macro
+.
+.de doc-Xr-usage
+. tm Usage: .Xr manpage_name [section#] ... (#\n[.c])
+. doc-reset-args
+..
+.
+.
+.\" NS Sx user macro
+.\" NS cross section reference
+.\" NS
+.\" NS width register `Sx' set in doc-common
+.
+.als Sx doc-generic-macro
+.ds doc-Sx-usage section_header
+.
+.
+.\" NS doc-end-column-list macro
+.\" NS column-list end-list
+.\" NS
+.\" NS modifies:
+.\" NS doc-list-depth
+.
+.de doc-end-column-list
+. linetabs 0
+' in -(\n[doc-list-offset-stack\n[doc-list-depth]]u + \n[doc-list-indent-stack\n[doc-list-depth]]u)
+. ta T .5i
+. fi
+. doc-decrement-list-stack
+. nr doc-list-depth -1
+..
+.
+.
+.\" NS doc-column-indent-width global register
+.\" NS holds the indent width for a column list
+.
+.nr doc-column-indent-width 0
+.
+.
+.\" NS doc-set-column-tab macro
+.\" NS establish tabs for list-type column: `.doc-set-column-tab num_cols'
+.\" NS
+.\" NS modifies:
+.\" NS doc-column-indent-width
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dsct
+.\" NS doc-str-dsct
+.\" NS doc-str-dsct1
+.
+.de doc-set-column-tab
+. ds doc-str-dsct
+. nr doc-reg-dsct 1
+. nr doc-column-indent-width 0
+.
+. ie (\$1 < 5) \
+. ds doc-str-dsct1 " \"
+. el \{\
+. ie (\$1 == 5) \
+. ds doc-str-dsct1 " \"
+. el \{\
+. \" XXX: this is packed abnormally close -- intercolumn width
+. \" should be configurable
+. ds doc-str-dsct1 " \"
+. \}\}
+.
+. while (\n[doc-reg-dsct] <= \$1) \{\
+. as doc-str-dsct " +\w\*[doc-arg\n[doc-reg-dsct]]\*[doc-str-dsct1]u
+. nr doc-column-indent-width +\w\*[doc-arg\n[doc-reg-dsct]]\*[doc-str-dsct1]u
+. nr doc-reg-dsct +1
+. \}
+.
+. ta \*[doc-str-dsct]
+' in +\n[doc-column-indent-width]u
+..
+.
+.
+.\" NS doc-column-list macro
+.\" NS column items
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-list-indent-stackXXX
+.\" NS doc-spaceXXX
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dcl
+.
+.de doc-column-list
+. if \n[doc-num-args] \
+. doc-parse-arg-vector
+. nr doc-arg-ptr +1
+.
+. if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
+. tm Usage: .It column_string [Ta [column_string ...] ] (#\n[.c])
+. return
+. \}
+.
+. if "\*[doc-arg\n[doc-arg-ptr]]"Ta" \{\
+. nr doc-reg-dcl (\n[doc-arg-ptr] - 1)
+. ds doc-space\n[doc-reg-dcl]
+. \}
+.
+. if !\n[doc-list-indent-stack\n[doc-list-depth]] \
+. nr doc-list-indent-stack\n[doc-list-depth] \n[doc-column-indent-width]u
+. if !\n[.u] \{\
+. fi
+' in +\n[doc-column-indent-width]u
+. \}
+. ti -\n[doc-column-indent-width]u
+.
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+..
+.
+.
+.\" NS Ta user macro
+.\" NS append tab (\t)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS
+.\" NS width register `Ta' set in doc-common
+.
+.de Ta
+. ie \n[doc-arg-limit] \{\
+. nr doc-arg-ptr +1
+. nop \*[doc-tab]\c
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
+. doc-do-\n[doc-type\n[doc-arg-ptr]]
+. el \
+. doc-reset-args
+. \}
+. el \{\
+. tm1 "Usage: Ta must follow column entry: e.g.
+. tm1 " .It column_string [Ta [column_string ...]] (#\n[.c])
+. \}
+..
+.
+.
+.\" NS Dl user macro
+.\" NS display (one line) literal
+.\" NS
+.\" NS this function uses the `Li' font
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Dl' set in doc-common
+.
+.de Dl
+' ta T .5i
+. in +\n[doc-display-indent]u
+.
+. ie \n[doc-arg-limit] \{\
+. tm Usage: .Dl not callable by other macros (#\n[.c])
+. doc-reset-args
+. \}
+. el \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Dl
+. doc-parse-args \$@
+. nr doc-arg-ptr 1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Li-font]\c
+. doc-print-recursive
+. \}
+. el \
+. tm Usage: .Dl argument ... (#\n[.c])
+. \}
+.
+. in -\n[doc-display-indent]u
+..
+.
+.
+.\" NS D1 user macro
+.\" NS display (one line)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `D1' set in doc-common
+.
+.de D1
+' ta T .5i
+. in +\n[doc-display-indent]u
+.
+. ie \n[doc-arg-limit] \{\
+. tm Usage: .D1 not callable by other macros (#\n[.c])
+. doc-reset-args
+. \}
+. el \{\
+. ie \n[.$] \{\
+. ds doc-macro-name D1
+. doc-parse-args \$@
+. nr doc-arg-ptr 1
+. doc-print-recursive
+. \}
+. el \
+. tm Usage: .D1 argument ... (#\n[.c])
+. \}
+.
+. in -\n[doc-display-indent]u
+..
+.
+.
+.\" NS Vt user macro
+.\" NS variable type (for forcing old style variable declarations);
+.\" NS this is not done in the same manner as .Ot for fortrash --
+.\" NS clean up later
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-have-decl
+.\" NS doc-have-var
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Vt' set in doc-common
+.
+.de Vt
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Vt
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Vt variable_type ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
+. tm Usage: .Vt variable_type ... (#\n[.c])
+. doc-reset-args
+. return
+. \}
+.
+. if \n[doc-in-synopsis-section] \{\
+. \" if a function declaration was the last thing given,
+. \" want vertical space
+. if \n[doc-have-decl] \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. \}
+.
+. \" if a subroutine was the last thing given, want vertical space
+. if \n[doc-have-func] \{\
+. ie \n[doc-have-var] \
+. br
+. el \
+. doc-paragraph
+. \}
+.
+. nr doc-have-var 1
+. \}
+.
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Ft-font]\c
+. doc-print-recursive
+.
+. if \n[doc-in-synopsis-section] \{\
+. ie \n[doc-have-old-func] \
+. nop \*[doc-soft-space]\c
+. el \
+. br
+. \}
+..
+.
+.
+.\" NS doc-is-func global register (bool)
+.\" NS set if subroutine (in synopsis only) (fortran only)
+.
+.nr doc-is-func 0
+.
+.
+.\" NS Ft user macro
+.\" NS function type
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-have-decl
+.\" NS doc-have-var
+.\" NS doc-is-func
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Ft' set in doc-common
+.
+.de Ft
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Ft
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Ft function_type ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. nr doc-arg-ptr +1
+. if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
+. tm Usage: .Ft function_type ... (#\n[.c])
+. doc-reset-args
+. return
+. \}
+.
+. if \n[doc-in-synopsis-section] \{\
+. if (\n[doc-have-func] : \n[doc-have-decl]) \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. nr doc-have-var 0
+. \}
+.
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+.
+. nr doc-is-func 1
+. \}
+.
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Ft-font]\c
+. doc-print-recursive
+..
+.
+.
+.\" NS doc-have-old-func global register (bool)
+.\" NS set if `Ot' has been called
+.
+.nr doc-have-old-func 0
+.
+.
+.\" NS Ot user macro
+.\" NS old function type (fortran -- no newline)
+.\" NS
+.\" NS modifies:
+.\" NS doc-have-decl
+.\" NS doc-have-old-func
+.\" NS doc-have-var
+.\" NS doc-is-func
+.\" NS
+.\" NS width register `Ot' set in doc-common
+.
+.de Ot
+. nr doc-have-old-func 1
+.
+. if \n[doc-in-synopsis-section] \{\
+. if (\n[doc-have-func] : \n[doc-have-decl]) \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. nr doc-have-var 0
+. \}
+.
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+.
+. nr doc-is-func 1
+. \}
+.
+. if \n[.$] \
+. nop \*[doc-Ft-font]\$*\c
+. nop \ \f[P]\c
+..
+.
+.
+.\" NS Fa user macro
+.\" NS function arguments
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Fa' set in doc-common
+.
+.de Fa
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Fa
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Fa function_arguments ... (#\n[.c])
+. \}
+.
+. ie \n[doc-func-arg-count] \
+. doc-do-func
+. el \{\
+. nr doc-arg-ptr +1
+. if (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Fa-font]\c
+. doc-print-recursive
+.
+. if \n[doc-in-synopsis-section] \
+. if \n[doc-have-func] \
+. br
+. \}\}
+..
+.
+.
+.\" NS doc-func-arg-count global register
+.\" NS how many function arguments have been processed so far
+.
+.nr doc-func-arg-count 0
+.
+.
+.\" NS doc-func-arg global string
+.\" NS work buffer for function name strings
+.
+.ds doc-func-arg
+.
+.
+.\" NS doc-num-func-args global register
+.\" NS number of function arguments
+.
+.nr doc-num-func-args 0
+.
+.
+.\" NS doc-func-args-processed global register
+.\" NS function arguments processed so far
+.
+.nr doc-func-args-processed 0
+.
+.
+.\" NS doc-do-func macro
+.\" NS internal .Fa for .Fc
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-func-arg
+.\" NS doc-func-arg-count
+.\" NS doc-func-args-processed
+.\" NS doc-num-func-args
+.
+.de doc-do-func
+. if (\n[doc-arg-limit] <= \n[doc-arg-ptr]) \{\
+. doc-reset-args
+. return
+. \}
+.
+. nr doc-arg-ptr +1
+.
+. ds doc-func-arg
+. nr doc-num-func-args 0
+. nr doc-func-args-processed 0
+.
+. doc-build-func-string \*[doc-arg\n[doc-arg-ptr]]
+. if (\n[doc-num-func-args] > 1) \
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-func-arg]
+.
+. if (\n[doc-func-arg-count] > 1) \{\
+. nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\|,\)\c
+. nop \)\*[doc-space\n[doc-arg-ptr]]\*[doc-Fa-font]\c
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\f[P]\s[0]\c
+. \}
+.
+. if (\n[doc-func-arg-count] == 1) \{\
+. nop \|\*[doc-Fa-font]\*[doc-arg\n[doc-arg-ptr]]\c
+. nop \f[P]\s[0]\c
+. \}
+. nr doc-func-arg-count +1
+. doc-do-func
+..
+.
+.
+.\" NS doc-have-func global register (bool)
+.\" NS whether we have more than one function in synopsis
+.
+.nr doc-have-func 0
+.
+.
+.\" NS Fn user macro
+.\" NS functions
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-have-decl
+.\" NS doc-have-func
+.\" NS doc-have-var
+.\" NS doc-indent-synopsis
+.\" NS doc-is-func
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Fn' set in doc-common
+.
+.de Fn
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Fn
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Fn function_name [function_arg] ... (#\n[.c])
+. \}
+.
+. if !\n[doc-arg-limit] \
+. return
+.
+. if \n[doc-in-synopsis-section] \{\
+. \" if there is/has been more than one subroutine declaration
+. ie \n[doc-is-func] \{\
+. br
+. nr doc-have-var 0
+. nr doc-have-decl 0
+. nr doc-is-func 0
+. \}
+. el \{\
+. if \n[doc-have-func] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. nr doc-have-decl 0
+. \}\}
+.
+. if \n[doc-have-decl] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+.
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. \}
+.
+. nr doc-have-func 1
+. nr doc-is-func 0
+.
+. br
+. if !\n[doc-indent-synopsis] \
+. nr doc-indent-synopsis (8u * \n[doc-fixed-width]u)
+. if !\n[doc-indent-synopsis-active] \
+. in +\n[doc-indent-synopsis]u
+. ti -\n[doc-indent-synopsis]u
+. \}
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
+. tm Usage: .Fn function_name [function_arg] ... (#\n[.c])
+. doc-reset-args
+. return
+. \}
+.
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. nop \*[doc-Fn-font]\*[doc-arg\n[doc-arg-ptr]]\c
+. nop \f[P]\s[0]\*[lp]\)\c
+.
+. nr doc-arg-ptr +1
+. if (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. if (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. nop \*[doc-Fa-font]\c
+. doc-do-func-args
+. nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
+. \}\}
+.
+. nop \)\*[rp]\)\c
+. if \n[doc-in-synopsis-section] \
+. nop \);\)\c
+.
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. \" output the space (if needed)
+. nr doc-arg-ptr -1
+. nop \)\*[doc-space\n[doc-arg-ptr]]\c
+. nr doc-arg-ptr +1
+.
+. doc-print-recursive
+. \}
+. el \
+. doc-print-and-reset
+.
+. if \n[doc-in-synopsis-section] \
+. if !\n[doc-indent-synopsis-active] \
+. in -\n[doc-indent-synopsis]u
+..
+.
+.
+.\" NS doc-do-func-args macro
+.\" NS handle function arguments
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-argXXX
+.\" NS doc-func-arg
+.\" NS doc-func-args-processed
+.\" NS doc-num-func-args
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-ddfa
+.
+.de doc-do-func-args
+. if \n[doc-in-synopsis-section] \{\
+. ds doc-func-arg
+. nr doc-num-func-args 0
+. nr doc-func-args-processed 0
+.
+. doc-build-func-string \*[doc-arg\n[doc-arg-ptr]]
+. if (\n[doc-num-func-args] > 1) \
+. ds doc-arg\n[doc-arg-ptr] "\*[doc-func-arg]
+. \}
+.
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\c
+. nr doc-arg-ptr +1
+.
+. if (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. if (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
+. nr doc-reg-ddfa (\n[doc-arg-ptr] - 1)
+. nop \|\f[\n[doc-curr-font]]\s[\n[doc-curr-size]u],\)\c
+. nop \)\*[doc-space\n[doc-reg-ddfa]]\f[P]\s[0]\|\c
+. doc-do-func-args
+. \}\}
+..
+.
+.
+.\" NS doc-saved-nesting-level global register
+.
+.nr doc-saved-nesting-level 0
+.
+.
+.\" NS doc-in-func-enclosure global register (bool)
+.
+.nr doc-in-func-enclosure 0
+.
+.
+.\" NS Fo user macro
+.\" NS function open
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-func-arg-count
+.\" NS doc-have-decl
+.\" NS doc-have-func
+.\" NS doc-have-var
+.\" NS doc-in-func-enclosure
+.\" NS doc-indent-synopsis
+.\" NS doc-is-func
+.\" NS doc-macro-name
+.\" NS doc-saved-nesting-level
+.\" NS
+.\" NS width register `Fo' set in doc-common
+.
+.de Fo
+. if (\n[doc-in-func-enclosure]) \{\
+. tm mdoc error: .Fo/.Fc can't be nested (#\n[.c])
+. return
+. \}
+.
+. nr doc-saved-nesting-level \n[doc-nesting-level]
+. nr doc-in-func-enclosure 1
+.
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ds doc-macro-name Fo
+. doc-parse-args \$@
+. \}
+. el \
+. tm Usage: .Fo function_name (#\n[.c])
+. \}
+.
+. if \n[doc-in-synopsis-section] \{\
+. \" if there is/has been more than one subroutine declaration
+. ie \n[doc-is-func] \{\
+. br
+. nr doc-have-var 0
+. nr doc-have-decl 0
+. nr doc-is-func 0
+. \}
+. el \{\
+. if \n[doc-have-func] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. nr doc-have-decl 0
+. \}\}
+.
+. if \n[doc-have-decl] \{\
+. doc-paragraph
+. nr doc-have-var 0
+. \}
+.
+. if \n[doc-have-var] \{\
+. doc-paragraph
+. nr doc-have-decl 0
+. \}
+.
+. nr doc-have-func 1
+. nr doc-is-func 0
+.
+. br
+. if !\n[doc-indent-synopsis] \
+. nr doc-indent-synopsis (8u * \n[doc-fixed-width]u)
+. \}
+.
+. \" start function box
+. box doc-func-box
+. ev doc-func-env
+. evc 0
+. in 0
+. nf
+.
+. nr doc-arg-ptr +1
+. doc-print-prefixes
+. if (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-func-arg-count 1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. nop \*[doc-Fn-font]\*[doc-arg\n[doc-arg-ptr]]\c
+. nop \f[P]\s[0]\*[lp]\)\c
+. doc-reset-args
+. \}
+..
+.
+.
+.\" NS Fc user macro
+.\" NS function close
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-func-arg-count
+.\" NS doc-in-func-enclosure
+.\" NS doc-saved-nesting-level
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `Fc' set in doc-common
+.
+.de Fc
+. if !\n[doc-in-func-enclosure] \{\
+. tm mdoc warning: Extraneous .Fc (#\n[.c])
+. return
+. \}
+.
+. if \n[.$] \{\
+. ds doc-macro-name Fc
+. \" the first (dummy) argument is used to get the correct spacing
+. doc-parse-args \) \$@
+. \}
+.
+. if !(\n[doc-saved-nesting-level] == \n[doc-nesting-level]) \
+. tm mdoc warning: Unbalanced enclosure commands within .Fo/.Fc
+.
+. nr doc-func-arg-count 0
+. nr doc-in-func-enclosure 0
+.
+. ie \n[doc-in-synopsis-section] \
+. nop \|\*[rp];\)
+. el \
+. nop \|\*[rp]\)
+.
+. \" finish function box
+. br
+. ev
+. box
+. chop doc-func-box
+. unformat doc-func-box
+.
+. if \n[doc-in-synopsis-section] \{\
+. if !\n[doc-indent-synopsis-active] \
+. in +\n[doc-indent-synopsis]u
+. ti -\n[doc-indent-synopsis]u
+. \}
+.
+. nh
+. nop \*[doc-func-box]\c
+.
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. doc-print-recursive
+. \}
+. el \
+. doc-print-and-reset
+.
+. if \n[doc-in-synopsis-section] \
+. if !\n[doc-indent-synopsis-active] \
+. in -\n[doc-indent-synopsis]u
+..
+.
+.
+.\" NS doc-build-func-string macro
+.\" NS collect function arguments and set hard spaces inbetween
+.\" NS
+.\" NS modifies:
+.\" NS doc-func-arg
+.\" NS doc-func-args-processed
+.\" NS doc-num-func-args
+.
+.de doc-build-func-string
+. if !\n[doc-num-func-args] \{\
+. nr doc-num-func-args \n[.$]
+. nr doc-func-args-processed 0
+. ds doc-func-arg
+. \}
+.
+. nr doc-func-args-processed +1
+. as doc-func-arg "\$1
+.
+. if (\n[doc-func-args-processed] < \n[doc-num-func-args]) \{\
+. as doc-func-arg "\*[doc-hard-space]
+.
+. shift
+. doc-build-func-string \$@
+. \}
+..
+.
+.
+.\" Very crude references: Stash all reference info into boxes, print out
+.\" reference on .Re request and clean up. Ordering very limited, no fancy
+.\" citations, but can do articles, journals, and books -- need to add
+.\" several missing options (like city etc). Should be able to grab a refer
+.\" entry, massage it a wee bit (prefix a `.' to the %[A-Z]) and not worry
+.\" (ha!).
+.
+.
+.\" NS doc-is-reference global register (bool)
+.\" NS set if in reference
+.
+.nr doc-is-reference 0
+.
+.
+.\" NS doc-reference-count global register
+.\" NS reference element counter
+.
+.nr doc-reference-count 0
+.
+.
+.\" NS Rs user macro
+.\" NS reference start
+.\" NS
+.\" NS modifies:
+.\" NS doc-is-reference
+.\" NS doc-reference-count
+.\" NS
+.\" NS width register `Rs' set in doc-common
+.
+.de Rs
+. ie \n[.$] \
+. tm Usage: .Rs (does not take arguments) (#\n[.c])
+. el \{\
+. nr doc-is-reference 1
+. doc-reset-reference
+. if \n[doc-in-see-also-section] \
+. doc-paragraph
+. nr doc-reference-count 0
+. \}
+..
+.
+.
+.\" NS Re user macro
+.\" NS reference end
+.\" NS
+.\" NS modifies:
+.\" NS doc-is-reference
+.\" NS
+.\" NS width register `Re' set in doc-common
+.
+.de Re
+. ie \n[.$] \
+. tm Usage: .Re (does not take arguments) (#\n[.c])
+. el \{\
+. doc-print-reference
+. doc-reset-reference
+. nr doc-is-reference 0
+. \}
+..
+.
+.
+.\" NS doc-reset-reference macro
+.\" NS reference cleanup
+.\" NS
+.\" NS modifies:
+.\" NS doc-author-count
+.\" NS doc-author-nameXXX
+.\" NS doc-book-count
+.\" NS doc-book-name
+.\" NS doc-corporate-count
+.\" NS doc-corporate-name
+.\" NS doc-date
+.\" NS doc-date-count
+.\" NS doc-issue-count
+.\" NS doc-issue-name
+.\" NS doc-journal-count
+.\" NS doc-journam-name
+.\" NS doc-optional-count
+.\" NS doc-optional-string
+.\" NS doc-page-number-count
+.\" NS doc-page-number-string
+.\" NS doc-reference-title-count
+.\" NS doc-reference-title-name
+.\" NS doc-reference-title-name-for-book
+.\" NS doc-report-count
+.\" NS doc-report-name
+.\" NS doc-volume-count
+.\" NS doc-volume-name
+.
+.de doc-reset-reference
+. while (\n[doc-author-count]) \{\
+. ds doc-author-name\n[doc-author-count]
+. nr doc-author-count -1
+. \}
+. nr doc-journal-count 0
+. nr doc-issue-count 0
+. nr doc-optional-count 0
+. nr doc-corporate-count 0
+. nr doc-report-count 0
+. nr doc-reference-title-count 0
+. nr doc-volume-count 0
+. nr doc-date-count 0
+. nr doc-page-number-count 0
+. nr doc-book-count 0
+.
+. ds doc-journal-name
+. ds doc-issue-name
+. ds doc-optional-string
+. ds doc-corporate-name
+. ds doc-report-name
+. ds doc-reference-title-name
+. ds doc-reference-title-name-for-book
+. ds doc-volume-name
+. ds doc-date
+. ds doc-page-number-string
+. ds doc-book-name
+..
+.
+.
+.\" NS doc-finish-reference macro
+.\" NS auxiliary macro for doc-print-reference
+.\" NS
+.\" NS modifies:
+.\" NS doc-reference-count
+.
+.de doc-finish-reference
+. nr doc-reference-count -1
+. ie \n[doc-reference-count] \
+. nop \),
+. el \
+. nop \).
+..
+.
+.
+.\" NS doc-print-reference macro
+.\" NS reference print
+.\" NS
+.\" NS modifies:
+.\" NS doc-reference-count
+.
+.de doc-print-reference
+.
+. nh
+.
+. if \n[doc-author-count] \{\
+. doc-print-reference-authors
+. nr doc-reference-count -\n[doc-author-count]
+. \}
+.
+. if \n[doc-reference-title-count] \{\
+. unformat doc-reference-title-name
+. chop doc-reference-title-name
+. unformat doc-reference-title-name-for-book
+. chop doc-reference-title-name-for-book
+. ie ((\n[doc-journal-count] == 1) : (\n[doc-book-count] == 1)) \{\
+. nop \)\*[q]\)\*[doc-reference-title-name-for-book]\)\*[q]\c
+. doc-finish-reference
+. \}
+. el \{\
+. nop \*[doc-reference-title-name]\c
+. doc-finish-reference
+. \}\}
+.
+. if \n[doc-book-count] \{\
+. unformat doc-book-name
+. chop doc-book-name
+. nop \*[doc-book-name]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-publisher-count] \{\
+. unformat doc-publisher-name
+. chop doc-publisher-name
+. nop \*[doc-publisher-name]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-journal-count] \{\
+. unformat doc-journal-name
+. chop doc-journal-name
+. nop \*[doc-journal-name]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-report-count] \{\
+. unformat doc-report-name
+. chop doc-report-name
+. nop \*[doc-report-name]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-issue-count] \{\
+. unformat doc-issue-name
+. chop doc-issue-name
+. nop \*[doc-issue-name]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-volume-count] \{\
+. unformat doc-volume-name
+. chop doc-volume-name
+. nop \*[doc-volume-name]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-page-number-count] \{\
+. unformat doc-page-number-string
+. chop doc-page-number-string
+. nop \*[doc-page-number-string]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-corporate-count] \{\
+. unformat doc-corporate-name
+. chop doc-corporate-name
+. nop \*[doc-corporate-name]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-date-count] \{\
+. unformat doc-date
+. chop doc-date
+. nop \*[doc-date]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-optional-count] \{\
+. unformat doc-optional-string
+. chop doc-optional-string
+. nop \*[doc-optional-string]\c
+. doc-finish-reference
+. \}
+.
+. if \n[doc-reference-count] \
+. tm mdoc warning: unresolved reference problem
+.
+. hy \n[doc-hyphen-flags]
+..
+.
+.
+.\" NS doc-print-reference-authors macro
+.\" NS print out reference authors
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-dpra
+.\" NS doc-str-dpra
+.
+.ds doc-str-dpra "and
+.
+.de doc-print-reference-authors
+. nr doc-reg-dpra 1
+.
+. while (\n[doc-reg-dpra] < \n[doc-author-count]) \{\
+. unformat doc-author-name\n[doc-reg-dpra]
+. chop doc-author-name\n[doc-reg-dpra]
+. ie (\n[doc-author-count] > 2) \
+. nop \)\*[doc-author-name\n[doc-reg-dpra]],
+. el \
+. nop \)\*[doc-author-name\n[doc-reg-dpra]]
+. nr doc-reg-dpra +1
+. \}
+.
+. unformat doc-author-name\n[doc-reg-dpra]
+. chop doc-author-name\n[doc-reg-dpra]
+. if (\n[doc-author-count] > 1) \
+. nop \)\*[doc-str-dpra]
+. nop \)\*[doc-author-name\n[doc-reg-dpra]],
+..
+.
+.
+.\" NS doc-author-count global register
+.\" NS counter of author references
+.
+.nr doc-author-count 0
+.
+.
+.\" NS doc-author-nameXXX global box
+.\" NS array of author names
+.\" NS
+.\" NS limit:
+.\" NS doc-author-count
+.
+.ds doc-author-name0
+.
+.
+.\" NS %A user macro
+.\" NS reference author(s)
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-author-count
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%A
+.\" NS
+.\" NS width register `%A' set in doc-common
+.
+.de %A
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%A author_name ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-author-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %A
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" save to reference box
+. box doc-author-name\n[doc-author-count]
+. ev doc-env-%A
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.
+.
+.\" NS doc-book-count global register
+.\" NS counter of book references
+.
+.nr doc-book-count 0
+.
+.
+.\" NS doc-book-name global box
+.\" NS string of collected book references
+.
+.ds doc-book-name
+.
+.
+.\" NS %B user macro
+.\" NS [reference] book name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-book-count
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%B
+.\" NS
+.\" NS width register `%B' set in doc-common
+.
+.de %B
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%B book_name ... (#\n[.c])
+. return
+. \}
+.
+. if \n[doc-is-reference] \{\
+. nr doc-book-count +1
+. nr doc-reference-count +1
+. \}
+.
+. ds doc-macro-name %B
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. ie \n[doc-is-reference] \{\
+. \" append to reference box
+. boxa doc-book-name
+. ev doc-env-%B
+. evc 0
+. in 0
+. nf
+. nop \*[doc-Em-font]\c
+. doc-do-references
+. \}
+. el \{\
+. nop \*[doc-Em-font]\c
+. doc-print-recursive
+. \}
+..
+.
+.
+.\" NS doc-date-count global register
+.\" NS counter of date references
+.
+.nr doc-date-count 0
+.
+.
+.\" NS doc-date global box
+.\" NS string of collected date references
+.
+.ds doc-date
+.
+.
+.\" NS %D user macro
+.\" NS [reference] date
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-date-count
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%D
+.\" NS
+.\" NS width register `%D' set in doc-common
+.
+.de %D
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%D date ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-date-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %D
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" append to reference box
+. boxa doc-date
+. ev doc-env-%D
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.
+.
+.\" NS doc-publisher-count global register
+.\" NS counter of publisher references
+.
+.nr doc-publisher-count 0
+.
+.
+.\" NS doc-publisher-name global box
+.\" NS string of collected publisher references
+.
+.ds doc-publisher-name
+.
+.
+.\" NS %I user macro
+.\" NS [reference] issuer/publisher name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS doc-publisher-count
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%I
+.\" NS
+.\" NS width register `%I' set in doc-common
+.
+.de %I
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%I issuer/publisher_name ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-publisher-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %I
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" append to reference box
+. boxa doc-publisher-name
+. ev doc-env-%I
+. evc 0
+. in 0
+. nf
+. nop \*[doc-Em-font]\c
+. doc-do-references
+..
+.
+.
+.\" NS doc-journal-count global register
+.\" NS counter of journal references
+.
+.nr doc-journal-count 0
+.
+.
+.\" NS doc-journal-name global box
+.\" NS string of collected journal references
+.
+.ds doc-journal-name
+.
+.
+.\" NS %J user macro
+.\" NS [reference] Journal Name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-journal-count
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%J
+.\" NS
+.\" NS width register `%J' set in doc-common
+.
+.de %J
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%J journal_name ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-journal-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %J
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" append to reference box
+. boxa doc-journal-name
+. ev doc-env-%J
+. evc 0
+. in 0
+. nf
+. nop \*[doc-Em-font]\c
+. doc-do-references
+..
+.
+.
+.\" NS doc-issue-count global register
+.\" NS counter of issue number references
+.
+.nr doc-issue-count 0
+.
+.
+.\" NS doc-issue-name global box
+.\" NS string of collected issue number references
+.
+.ds doc-issue-name
+.
+.
+.\" NS %N user macro
+.\" NS [reference] issue number
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-issue-count
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%N
+.\" NS
+.\" NS width register `%N' set in doc-common
+.
+.de %N
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%N issue_number ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-issue-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %N
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" append to reference box
+. boxa doc-issue-name
+. ev doc-env-%N
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.
+.
+.\" NS doc-optional-count global register
+.\" NS counter of optional information references
+.
+.nr doc-optional-count 0
+.
+.
+.\" NS doc-optional-string global box
+.\" NS string of collected optional information references
+.
+.ds doc-optional-string
+.
+.
+.\" NS %O user macro
+.\" NS [reference] optional information
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS doc-optional-count
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%O
+.\" NS
+.\" NS width register `%O' set in doc-common
+.
+.de %O
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%O optional_information ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-optional-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %O
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" append to reference box
+. boxa doc-optional-string
+. ev doc-env-%O
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.
+.
+.\" NS doc-page-number-count global register
+.\" NS counter of page number references
+.
+.nr doc-page-number-count 0
+.
+.
+.\" NS doc-page-number-string global box
+.\" NS string of collected page number references
+.
+.ds doc-page-number-string
+.
+.
+.\" NS %P user macro
+.\" NS [reference] page numbers
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS doc-page-number-count
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%P
+.\" NS
+.\" NS width register `%P' set in doc-common
+.
+.de %P
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%P page_number ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-page-number-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %P
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" append to reference box
+. boxa doc-page-number-string
+. ev doc-env-%P
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.
+.
+.\" NS doc-corporate-count global register
+.\" NS counter of corporate references
+.
+.nr doc-corporate-count 0
+.
+.
+.\" NS doc-corporate-name global box
+.\" NS string of collected corporate references
+.
+.ds doc-corporate-name
+.
+.
+.\" NS %Q user macro
+.\" NS corporate or foreign author
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-corporate-count
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%Q
+.\" NS
+.\" NS width register `%Q' set in doc-common
+.
+.de %Q
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%Q corporate_or_foreign_author ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-corporate-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %Q
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" append to reference box
+. boxa doc-corporate-name
+. ev doc-env-%Q
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.
+.
+.\" NS doc-report-count global register
+.\" NS counter of report references
+.
+.nr doc-report-count 0
+.
+.
+.\" NS doc-report-name global box
+.\" NS string of collected report references
+.
+.ds doc-report-name
+.
+.
+.\" NS %R user macro
+.\" NS [reference] report name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS doc-reference-count
+.\" NS doc-report-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%R
+.\" NS
+.\" NS width register `%R' set in doc-common
+.
+.de %R
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%R reference_report ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-report-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %R
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" append to reference box
+. boxa doc-report-name
+. ev doc-env-%R
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.
+.
+.\" NS doc-reference-title-count global register
+.\" NS counter of reference title references
+.
+.nr doc-reference-title-count 0
+.
+.
+.\" NS doc-reference-title-name global box
+.\" NS string of collected reference title references
+.
+.ds doc-reference-title-name
+.
+.
+.\" NS doc-reference-title-name-for-book global box
+.\" NS string of collected reference title references
+.\" NS (saved with another font; this is a shortcoming of groff)
+.
+.ds doc-reference-title-name-for-book
+.
+.
+.\" NS %T user macro
+.\" NS reference title
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS doc-reference-title-count
+.\" NS doc-report-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%T
+.\" NS
+.\" NS width register `%T' set in doc-common
+.
+.de %T
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%T reference_title ... (#\n[.c])
+. return
+. \}
+.
+. if \n[doc-is-reference] \{\
+. nr doc-reference-title-count +1
+. nr doc-reference-count +1
+. \}
+.
+. ds doc-macro-name %T
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. ie \n[doc-is-reference] \{\
+. \" append to reference box
+. boxa doc-reference-title-name-for-book
+. ev doc-env-%T
+. evc 0
+. in 0
+. nf
+. nop \*[doc-No-font]\c
+. doc-do-references
+.
+. \" do it a second time with another font
+. ds doc-macro-name %T
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. boxa doc-reference-title-name
+. ev doc-env-%T
+. evc 0
+. in 0
+. nf
+. nop \*[doc-Em-font]\c
+. doc-do-references
+. \}
+. el \{\
+. nop \*[doc-Em-font]\c
+. doc-print-recursive
+. \}
+..
+.
+.
+.\" NS doc-volume-count global register
+.\" NS counter of reference title references
+.
+.nr doc-volume-count 0
+.
+.
+.\" NS doc-volume-name global box
+.\" NS string of collected volume references
+.
+.ds doc-volume-name
+.
+.
+.\" NS %V user macro
+.\" NS reference volume
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-macro-name
+.\" NS doc-reference-title-count
+.\" NS doc-volume-count
+.\" NS
+.\" NS local variables:
+.\" NS doc-env-%V
+.\" NS
+.\" NS width register `%V' set in doc-common
+.
+.de %V
+. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
+. tm Usage: .%V volume ... (#\n[.c])
+. return
+. \}
+.
+. nr doc-volume-count +1
+. nr doc-reference-count +1
+.
+. ds doc-macro-name %V
+. doc-parse-args \$@
+.
+. nr doc-arg-ptr +1
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+.
+. \" append to reference box
+. boxa doc-volume-name
+. ev doc-env-%V
+. evc 0
+. in 0
+. nf
+. doc-do-references
+..
+.
+.
+.\" NS doc-do-references macro
+.\" NS reference recursion routine
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-ddr
+.\" NS doc-reg-ddr1
+.
+.de doc-do-references
+. if !\n[doc-is-reference] \
+. tm mdoc error: .\*[doc-macro-name] found outside of .Rs ... .Re (#\n[.c])
+.
+. nr doc-reg-ddr1 \n[doc-type\n[doc-arg-ptr]]
+.
+. ie (\n[doc-reg-ddr1] == 1) \{\
+. \" .nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
+. doc-append-arg \c 3
+. \*[doc-arg\n[doc-arg-ptr]]
+. \}
+. el \{\
+. nop \)\*[doc-arg\n[doc-arg-ptr]]\c
+.
+. ie (\n[doc-arg-limit] == \n[doc-arg-ptr]) \{\
+. \" finish reference box
+. br
+. ev
+. boxa
+.
+. doc-reset-args
+. \}
+. el \{\
+. nr doc-reg-ddr \n[doc-arg-ptr]
+. nr doc-arg-ptr +1
+. nop \)\*[doc-space\n[doc-reg-ddr]]\c
+. doc-do-references
+. \}\}
+..
+.
+.
+.\" NS Hf user macro
+.\" NS source include header files.
+.\" NS
+.\" NS modifies:
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS
+.\" NS width register `Hf' set in doc-common
+.
+.de Hf
+. ie ((\n[.$] == 1) & (\n[doc-arg-limit] == 0)) \{\
+. doc-paragraph
+. nop File:
+. Pa \$1
+.
+. Bd -literal
+. so \$1
+. Ed
+.
+. doc-paragraph
+. \}
+. el \
+. Usage: .Hf file (#\n[.c])
+..
+.
+.
+.\" NS doc-have-author global register (bool)
+.\" NS set in `An'
+.
+.nr doc-have-author 0
+.
+.
+.\" NS An user macro
+.\" NS author name
+.\" NS
+.\" NS modifies:
+.\" NS doc-arg-ptr
+.\" NS doc-curr-font
+.\" NS doc-curr-size
+.\" NS doc-have-author
+.\" NS doc-macro-name
+.\" NS
+.\" NS width register `An' set in doc-common
+.
+.de An
+. if !\n[doc-arg-limit] \{\
+. ie \n[.$] \{\
+. ie "\$1"-nosplit" \
+. nr doc-in-authors-section 0
+. el \{ .ie "\$1"-split" \
+. nr doc-in-authors-section 1
+. el \{\
+. ds doc-macro-name An
+. doc-parse-args \$@
+. \}\}\}
+. el \{\
+. tm1 "Usage: .An {-nosplit | -split}
+. tm1 .An author_name ... (#\n[.c])
+. \}\}
+.
+. if \n[doc-in-authors-section] \{\
+. ie \n[doc-have-author] \
+. br
+. el \
+. nr doc-have-author 1
+. \}
+.
+. if \n[doc-arg-limit] \{\
+. nr doc-arg-ptr +1
+. ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
+. nr doc-curr-font \n[.f]
+. nr doc-curr-size \n[.ps]
+. doc-print-recursive
+. \}
+. el \{\
+. tm Usage: .An author_name ... (#\n[.c])
+. doc-reset-args
+. \}\}
+..
+.
+.
+.\" NS Rv user macro
+.\" NS return values
+.\" NS
+.\" NS width register `Rv' set in doc-common
+.\" NS
+.\" NS local variables:
+.\" NS doc-str-Rv-prefix
+.\" NS doc-str-Rv-suffix
+.
+.ds doc-str-Rv-prefix "The
+.ds doc-str-Rv-suffix "function returns the value\~0 if successful;
+.as doc-str-Rv-suffix " otherwise the value\~-1 is returned and
+.as doc-str-Rv-suffix " the global variable \*[doc-Va-font]errno\f[P]
+.as doc-str-Rv-suffix " is set to indicate the error.
+.
+.de Rv
+.
+.\" XXX: what does this function without `-std'?
+.
+. if !\n[.$] \{\
+. tm Usage: .Rv [-std] (#\n[.c])
+. return
+. \}
+.
+. \" .ds doc-macro-name Rv
+. \" .nr doc-arg-ptr 0
+. \" .nr lR +1
+. \" .ds doc-arg1 \$2
+. \" .ds doc-arg2 \$3
+. \" .ds doc-arg3 \$4
+. \" .ds doc-arg4 \$5
+. \" .ds doc-arg5 \$6
+. \" .ds doc-arg6 \$7
+. \" .ds doc-arg7 \$8
+. \" .ds doc-arg8 \$9
+. \" .
+. \" .nr doc-num-args (\n[.$] - 1)
+.
+. if "\$1"-std" \{\
+. nr doc-reg-Rv \*[doc-section]
+. if ((\n[doc-reg-Rv] < 2) : (\n[doc-reg-Rv] > 3)) \
+. tm Usage: .Rv -std in sections 2 and 3 only (#\n[.c])
+. br
+. nop \)\*[doc-str-Rv-prefix]
+. Fn \$2
+. nop \)\*[doc-str-Rv-suffix]
+. \}
+..
+.
+.
+.\" NS Mt user macro
+.\" NS mailto (for conversion to HTML)
+.
+.de Mt
+. \" XXX: error handling missing
+. Pa \$@
+..
+.
+.
+.\" NS Lk user macro
+.\" NS link (for conversion to HTML)
+.\" NS
+.\" NS local variables:
+.\" NS doc-reg-Lk
+.\" NS doc-str-Lk
+.
+.de Lk
+. ds doc-str-Lk Sy \$@
+.
+. ie (\n[.$] > 1) \{\
+. doc-get-arg-type \$2
+. ie (\n[doc-arg-type] < 3) \{\
+. Em \)\$2:
+. ds doc-str-Lk Sy "\$1"
+. doc-get-width "\$1"
+. shift 2
+. if \n[.$] \
+. as doc-str-Lk " \$@
+. \}
+. el \
+. doc-get-width "\$1"
+. \}
+. el \
+. doc-get-width "\$1"
+.
+. ie n \
+. nr doc-reg-Lk 26
+. el \
+. nr doc-reg-Lk 38
+. ie (\n[doc-width] >= \n[doc-reg-Lk]) \
+. D1 \*[doc-str-Lk]
+. el \
+. \*[doc-str-Lk]
+..
+.
+.
+.\" NS doc-defunct-macro macro
+.\" NS this is the skeleton for defunct macros
+.\" NS
+.
+.de doc-defunct-macro
+. tmc mdoc error: .\$0 defunct
+. if d doc-\$0-usage \
+. tmc , \*[doc-\$0-usage]
+. tm1 " (#\n[.c])
+..
+.
+.
+.\" obsolete macros
+.
+.als Db doc-defunct-macro
+.
+.als Ds doc-defunct-macro
+.
+.als Ex doc-defunct-macro
+.ds doc-Ex-usage use .D1
+.
+.als Or doc-defunct-macro
+.ds doc-Or-usage use `|'
+.
+.als Sf doc-defunct-macro
+.ds doc-Sf-usage use .Pf or .Ns
+.
+.
+.rn em e@
+.
+.de em
+. tm1 "mdoc error: end-macro (.em) respecification is not allowed. (#\n[.c])
+. tm1 " Should this have been `.Em ...'?
+. ab
+..
+.
+.
+.\" NS doc-empty-line macro
+.\" NS emit warning and print empty line
+.
+.de doc-empty-line
+. if !\n[doc-display-depth] \
+. tm mdoc warning: Empty input line #\n[.c]
+. sp
+..
+.
+.blm doc-empty-line
+.
+.
+.ec
+.
+.
+.\" load local modifications
+.mso mdoc.local
+.
+.\" EOF
diff --git a/contrib/groff/tmac/dvi.tmac b/contrib/groff/tmac/dvi.tmac
new file mode 100644
index 0000000..5fec427
--- /dev/null
+++ b/contrib/groff/tmac/dvi.tmac
@@ -0,0 +1,147 @@
+.\" dvi.tmac
+.\"
+.nr _C \n(.C
+.cp 0
+.ftr CR CW
+.ftr C CW
+.ftr CO CWI
+.ftr CI CWI
+.ftr TT CW
+.ftr HR H
+.\" This uses the dvi-char_1 string in font CW, dvi-char_0 otherwise.
+.char _ \R'dvi-char_ \\n(.f=\f(CW\\n(.f\fP'\\*[dvi-char_\\n[dvi-char_]]
+.char \[ul] \R'dvi-char_ \w'M'=\w'i''\\*[dvi-char_\\n[dvi-char_]]
+.\" Normally use a rule.
+.\" This is designed so that \(ul, \(rn and \(br form corners.
+.ds dvi-char_0 \Z'\v'.23m'\D'R .54m .04m''\h'.5m'
+.\" In font CW use a real _ character.
+.ds dvi-char_1 _
+.if !c\[radicalex] .char \[radicalex] \D'R .5m -.04m'\v'.04m'
+.if !c\[br] .char \[br] \Z'\v'.25m'\D'R .04m -1m''
+.if !c\[ru] .char \[ru] \Z'\v'-.02m'\D'R .54m .04m''\h'.5m'
+.if !c\[rn] .char \[rn] \Z'\v'-.77m'\D'R .54m .04m''\h'.5m'
+.if !c\[co] .char \[co] \
+\z\s-2\(ci\s0\
+\h'\w'\s-2\(ci\s0'u-\w'\s-4C\s0'u/2u'\
+\s-4C\s0\
+\h'\w'\s-2\(ci\s0'u-\w'\s-4C\s0'u/2u'
+.if !c\[rg] .char \[rg] \
+\z\s-2\(ci\s0\
+\h'\w'\s-2\(ci\s0'u-\w'\s-4R\s0'u/2u'\
+\s-4R\s0\
+\h'\w'\s-2\(ci\s0'u-\w'\s-4R\s0'u/2u'
+.if !c\[fm] .char \[fm] \v'-.35m'\s[\\n(.s*7u/10u]\[prime]\s0\v'.35m'
+.if !c\[de] .char \[de] \h'.05m'\v'-.54m'\D'c .3m'\v'.54m'\h'.05m'
+.if !c\[ct] .char \[ct] \o'c/'
+.if !c\[sq] .char \[sq] \Z'\h'.05m'\D'R .4m -.04m'\v'.04m'\h'-.04m'\
+\D'R .04m -.4m'\v'.04m'\D'R -.4m -.04m'\D'R .04m .4m''\h'.5m'
+.\"char \[sq] \h'.05m'\D'l .4m 0'\D'l 0 -.4m'\D'l -.4m 0'\D'l 0 .4m'\h'.45m'
+.if !c\[!=] .char \[!=] \[slashnot]\(eq
+.if !c\[tm] .char \[tm] \v'-.3m'\s[\\n(.s/2u]TM\s0\v'.3m'
+.if !c\[aq] .char \[aq] '
+.if !c\[bq] .char \[bq] ,
+.if !c\[Bq] .char \[Bq] ,\h'\w'\(rq'u-(2u*\w"'"u)',
+.if !c\[ho] .char \[ho] \s[\En[.s]/2u]\v'.4m'c\v'-.4m'\s0
+.if !c\[-D] .char \[-D] \Z'\v'-.1m'\h'.05m'-'D
+.if !c\[Sd] .char \[Sd] \Z'\v'-.3m'\h'.35m'-'\(pd
+.if !c\[TP] .char \[TP] I\h'-.25m'\v'-.33m'\s[\En[.s]*6u/10u]\v'.33m'D\
+\v'-.33m'\s0\v'.33m'
+.if !c\[Tp] .char \[Tp] \zlp
+.if !c\[nb] .char \[nb] \[slashnot]\(sb
+.cflags 8 \(an
+.if !c\[an] .char \[an] \h'-.167m'\(mi\h'-.167m'
+.\" Define some fractions.
+.de dvi-frac
+.if !c\[\\$1\\$2] .char \[\\$1\\$2] \
+\v'-.25m'\s[\\\\n(.s*7u/10u]\\$1\s0\v'.25m'\h'-.2m'\
+/\h'-.2m'\v'.25m'\s[\\\\n(.s*7u/10u]\\$2\s0\v'-.25m'
+..
+.dvi-frac 1 2
+.dvi-frac 3 4
+.dvi-frac 1 4
+.dvi-frac 1 8
+.dvi-frac 3 8
+.dvi-frac 5 8
+.dvi-frac 7 8
+.\" support for ISO Latin-1
+.if !c\[S1] .char \[S1] \v'-.2m'\s-31\s+3\v'+.2m'
+.if !c\[S2] .char \[S2] \v'-.2m'\s-32\s+3\v'+.2m'
+.if !c\[S3] .char \[S3] \v'-.2m'\s-33\s+3\v'+.2m'
+.if !c\[Of] .char \[Of] \v'-.2m'\s'\En(.s*6u/10u'\o'_a'\s0\v'.2m'
+.if !c\[Om] .char \[Om] \v'-.2m'\s'\En(.s*6u/10u'\o'_o'\s0\v'.2m'
+.if !c\[Fo] .char \[Fo] <<
+.if !c\[Fc] .char \[Fc] >>
+.if !c\[bb] .char \[bb] |
+.if !c\[Ye] .char \[Ye] \o'-Y'
+.if !c\[Cs] .char \[Cs] \o'\[mu]o'
+.de dvi-achar
+.\" Note that character definitions are always interpreted with
+.\" compatibility mode off.
+.if !c\\$1 \{\
+.char \\$1 \\$3\
+\k[acc]\
+\h'(u;-\w'\\$2'-\w'\\$3'/2+\\\\n[skw]+(\w'x'*0)-\\\\n[skw])'\
+\v'(u;\w'x'*0+\\\\n[rst]+(\w'\\$3'*0)-\\\\n[rst])'\
+\\$2\
+\v'(u;\w'x'*0-\\\\n[rst]+(\w'\\$3'*0)+\\\\n[rst])'\
+\h'|\\\\n[acc]u'
+.\}
+.hcode \\$1\\$4
+..
+.dvi-achar \(`A \` A a
+.dvi-achar \('A \' A a
+.dvi-achar \(^A ^ A a
+.dvi-achar \(~A ~ A a
+.dvi-achar \(:A \(ad A a
+.dvi-achar \(oA \(ao A a
+.dvi-achar \(`E \` E e
+.dvi-achar \('E \' E e
+.dvi-achar \(^E ^ E e
+.dvi-achar \(:E \(ad E e
+.dvi-achar \(`I \` I i
+.dvi-achar \('I \' I i
+.dvi-achar \(^I ^ I i
+.dvi-achar \(:I \(ad I i
+.dvi-achar \(~N ~ N n
+.dvi-achar \(`O \` O o
+.dvi-achar \('O \' O o
+.dvi-achar \(^O ^ O o
+.dvi-achar \(~O ~ O o
+.dvi-achar \(:O \(ad O o
+.dvi-achar \(`U \` U u
+.dvi-achar \('U \' U u
+.dvi-achar \(^U ^ U u
+.dvi-achar \(:U \(ad U u
+.dvi-achar \('Y \' Y y
+.dvi-achar \(`a \` a a
+.dvi-achar \('a \' a a
+.dvi-achar \(^a ^ a a
+.dvi-achar \(~a ~ a a
+.dvi-achar \(:a \(ad a a
+.dvi-achar \(oa \(ao a a
+.dvi-achar \(`e \` e e
+.dvi-achar \('e \' e e
+.dvi-achar \(^e ^ e e
+.dvi-achar \(:e \(ad e e
+.dvi-achar \(`i \` \(.i i
+.dvi-achar \('i \' \(.i i
+.dvi-achar \(^i ^ \(.i i
+.dvi-achar \(:i \(ad \(.i i
+.dvi-achar \(~n ~ n n
+.dvi-achar \(`o \` o o
+.dvi-achar \('o \' o o
+.dvi-achar \(^o ^ o o
+.dvi-achar \(~o ~ o o
+.dvi-achar \(:o \(ad o o
+.dvi-achar \(`u \` u u
+.dvi-achar \('u \' u u
+.dvi-achar \(^u ^ u u
+.dvi-achar \(:u \(ad u u
+.dvi-achar \('y \' y y
+.dvi-achar \(:y \(ad y y
+.if !c\(,C .char \(,C \o'\(acC'
+.hcode \(,Cc
+.if !c\(,c .char \(,c \o'\(acc'
+.hcode \(,cc
+.cp \n(_C
+.do mso latin1.tmac
diff --git a/contrib/groff/tmac/e.tmac b/contrib/groff/tmac/e.tmac
new file mode 100644
index 0000000..8ea4074
--- /dev/null
+++ b/contrib/groff/tmac/e.tmac
@@ -0,0 +1,1663 @@
+.\" @(#)e.tmac 2.31 (Berkeley) 5/21/88
+.\" Modified by James Clark for use with groff.
+.\"
+.\" Copyright (c) 1988 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms are permitted
+.\" provided that this notice is preserved and that due credit is given
+.\" to the University of California at Berkeley. The name of the University
+.\" may not be used to endorse or promote products derived from this
+.\" software without specific prior written permission. This software
+.\" is provided ``as is'' without express or implied warranty.
+.\" %beginstrip%
+.\"
+.\"**********************************************************************
+.\"* *
+.\"* ****** - M E N R O F F / T R O F F M A C R O S ****** *
+.\"* *
+.\"* Produced for your edification and enjoyment by: *
+.\"* Eric Allman *
+.\"* Electronics Research Laboratory *
+.\"* U.C. Berkeley. *
+.\"* current address: *
+.\"* Britton-Lee, Inc. *
+.\"* 1919 Addison Street Suite 105 *
+.\"* Berkeley, California 94704 *
+.\"* *
+.\"* VERSION 2.31 First Release: 11 Sept 1978 *
+.\"* *
+.\"* Documentation is available. *
+.\"* *
+.\"**********************************************************************
+.\"
+.\" Code on .de commands:
+.\" *** a user interface macro.
+.\" &&& a user interface macro which is redefined
+.\" when used to be the real thing.
+.\" $$$ a macro which may be redefined by the user
+.\" to provide variant functions.
+.\" --- an internal macro.
+.\"
+.if !\n(.g .ig
+.de @R \" --- initialize number register to 0, if undefined
+.if !r\\$1 .nr \\$1 0
+..
+.@R pf
+.if \n(pf .nx
+.if !\n(.g .ig
+.de @S \" --- initialize string/macro to empty, if undefined
+.if !d\\$1 .ds \\$1 \" empty
+..
+.@R @\" \" debugging level
+.\" *** INTERNAL GP MACROS ***
+.de @C \" --- change ev's, taking info with us
+.nr _S \\n(.s
+.nr _V \\n(.v
+.nr _F \\n(.f
+.do ds _A \\n[.fam]
+.nr _I \\n(.i
+.ev \\$1
+.ps \\n(_S
+.vs \\n(_Vu
+.ft \\n(_F
+.do @fam \\*(_A
+'in \\n(_Iu
+.xl \\n($lu
+.lt \\n($lu
+.rr _S
+.rr _V
+.rr _F
+.rr _I
+.ls 1
+'ce 0
+..
+.de @D \" --- determine display type (Indent, Left, Center)
+.ds |p "\\$3
+.nr _d 0
+.if "\\$2"C" \
+. nr _d 1
+.if "\\$2"L" \
+. nr _d 2
+.if "\\$2"I" \
+. nr _d 3
+.if "\\$2"M" \
+. nr _d 4
+.if !\\n(_d \{\
+. nr _d \\$1
+. ds |p "\\$2
+.\}
+..
+.de @z \" --- end macro
+.if \n@>1 .tm >> @z, .z=\\n(.z ?a=\\n(?a
+.if !"\\n(.z"" \
+\{\
+. tm Line \\n(c. -- Unclosed block, footnote, or other diversion (\\n(.z)
+. di
+. ex
+.\}
+.if \\n(?a \
+. bp \" force out final table
+.ds bp
+.ds @b\" \" don't start another page
+.br
+.if \n@>1 .tm << @z
+..
+.\" *** STANDARD HEADERS AND FOOTERS ***
+.ie \n(.g .ds $* \\\\$*
+.el .ds $* \\\\$1 \\\\$2 \\\\$3 \\\\$4 \\\\$5 \\\\$6 \\\\$7 \\\\$8 \\\\$9
+.de he \" *** define header
+.ie !\\n(.$ \
+\{\
+. rm |4
+. rm |5
+.\}
+.el \
+\{\
+. ds |4 "\*($*
+. ds |5 "\*($*
+.\}
+..
+.de eh \" *** define even header
+.ie !\\n(.$ \
+. rm |4
+.el \
+. ds |4 "\*($*
+..
+.de oh \" *** define odd header
+.ie !\\n(.$ \
+. rm |5
+.el \
+. ds |5 "\*($*
+..
+.de fo \" *** define footer
+.ie !\\n(.$ \
+\{\
+. rm |6
+. rm |7
+.\}
+.el \
+\{\
+. ds |6 "\*($*
+. ds |7 "\*($*
+.\}
+..
+.de ef \" *** define even foot
+.ie !\\n(.$ \
+. rm |6
+.el \
+. ds |6 "\*($*
+..
+.de of \" *** define odd footer
+.ie !\\n(.$ \
+. rm |7
+.el \
+. ds |7 "\*($*
+..
+.de ep \" *** end page (must always be followed by a .bp)
+.if \\n(nl>0 \
+\{\
+. wh 0
+. rs
+. @b
+.\}
+..
+.\" *** INTERNAL HEADER AND FOOTER MACROS ***
+.de @h \" --- header
+.if \n@>1 .tm >> @h %=\\n% ?a=\\n(?a ?b=\\n(?b ?w=\\n(?w
+.if (\\n(.i+\\n(.o)>=\\n(.l \
+. tm Line \\n(c. -- Offset + indent exceeds line length
+.\" initialize a pile of junk
+.nr ?h \\n(?H \" transfer "next page" to "this page"
+.nr ?H 0
+.nr ?c \\n(?C
+.nr ?C 0
+.rn |4 |0
+.rn |5 |1
+.rn |6 |2
+.rn |7 |3
+.nr _w 0 \" reset max footnote width
+.nr ?W 0 \" no wide floats this page (yet)
+.nr ?I 1
+.\" begin actual header stuff
+.ev 2
+.rs
+.if \\n(hm>0 \
+. sp |\\n(hmu \" move to header position
+.@t $h \" output header title
+.if \\n(tm<=0 \
+. nr tm \n(.Vu
+.sp |\\n(tmu \" move to top of text
+.ev
+.mk _k \" for columned output
+.if \\n(?n .nm 1 \" restore line numbering if n1 mode
+.nr $c 1 \" set first column
+.if \n@>4 .tm -- @h >> .ns nl=\\n(nl %=\\n% _k=\\n(_k tm=\\n(tm
+.ie \\n(?s \
+\{\
+. nr ?s 0
+. rs
+' @b
+.\}
+.el \
+. @n \" begin the column
+.if \n@>2 .tm << @h
+..
+.de @n \" --- new column or page
+.if \n@>3 .tm >> @n nl=\\n(nl %=\\n% ?f=\\n(?f ?o=\\n(?o
+.if \\n(bm<=0 \
+. nr bm \\n(.Vu
+.if (\\n(_w<=\\n($l)&(\\n(?W=0) \
+\{\
+. nr _b (\\n(ppp*\\n($vu)/200u \" compute fudge factor (must be < 1P)
+. if \\n(_bu>((\\n(bmu-\\n(fmu-((\\n(tpp*\\n($vu)/100u))/2u) \
+. nr _b (\\n(ppp*\\n($vu)/100u-\n(.Vu
+. nr _b +\\n(bmu
+.\}
+.nr _B \\n(_bu
+.ch @f
+.wh -\\n(_bu @f
+.nr _b +(\\n(ppp*\\n($vu)/100u \" add 1 paragraph v in case of sweep past
+.if \n@>2 .tm @n .p=\\n(.p bm=\\n(bm _b=\\n(_b _B=\\n(_B
+.nr ?f 0 \" reset footnote flag
+.if \\n(?o \
+\{\
+. (f _ \" reprocess footnotes which run off page
+. nf
+. |o
+. fi
+. )f
+. rm |o
+.\}
+.nr ?o 0
+.if \\n(?T \
+\{\
+. nr _i \\n(.i
+. in 0
+. |h \" output the table header
+. in \\n(_iu
+. rr _i
+. mk #T \" for tbl commands
+. ns
+.\}
+.if (\\n(?a)&((\\n($c<2):(\\n(?w=0)) \
+\{\
+. nr ?a 0 \" output floating keep
+. @k |t
+. if \\n(?w \
+. mk _k \" don't overstrike wide keeps
+. nr ?w 0
+.\}
+.os
+.$H \" special column header macro
+.ns
+..
+.de @f \" --- footer
+.if \n@>1 .tm >> @f %=\\n% nl=\\n(nl ?a=\\n(?a ?b=\\n(?b ?f=\\n(?f
+.if \n@>2 .nr VL \\n(.pu-\\n(nlu
+.if \n@>2 .tm @f bm=\\n(bm _B=\\n(_B _b=\\n(_b .p-nl=\\n(VL
+.ec
+.if \\n(?T \
+\{\
+. nr T. 1 \" for tbl commands (to output bottom line)
+. T# 1 \" output the sides and bottom lines
+. br
+.\}
+.ev 2
+.ce 0
+.if \\n(?b \
+\{\
+. nr ?b 0
+. @k |b\" \" output bottom of page tables
+.\}
+.if \\n(?f \
+. @o \" output footnote if present
+.ie \\n($c<\\n($m \
+. @c \" handle new column
+.el \
+. @e \" new page
+.ev
+.if \n@>2 .tm << @f
+..
+.de @o \" --- output footnote
+.nf
+.ls 1
+.in 0
+.if \n@>2 .tm @o last printed text = \\n(nl placing @r trap at -\\n(_B
+.wh -\\n(_Bu @r
+.|f
+.fi
+.if \n@>2 .tm @o triggered @r (?o) = \\n(?o
+.if \\n(?o \
+\{\
+. di \" just in case triggered @r
+. if \\n(dn=0 \
+\{\
+. rm |o
+. nr ?o 0
+. \}
+. nr dn \\n(_D
+. rr _D
+.\}
+.rm |f
+.ch @r
+..
+.de @c \" --- new column
+.if \n@>2 .tm >> @c %=\\n%
+.rs
+.sp |\\n(_ku
+.@O +\\n($lu+\\n($su
+.nr $c +1
+.@n
+..
+.de @e \" --- end page
+.if \n@>2 .tm >> @e
+.@O \\n(_ou
+.rs
+.sp |\\n(.pu-\\n(fmu-((\\n(tpp*\\n($vu)/100u) \" move to footer position
+.@t $f \" output footer title
+.nr ?h 0
+.bp
+..
+.de @t \" --- output header or footer title
+.if !\\n(?h \
+\{\
+. sz \\n(tp \" set header/footer type fonts, etc.
+. @F \\n(tf
+. lt \\n(_Lu \" make title span entire page
+. nf
+. \\$1
+. br
+.\}
+..
+.de $h \" $$$ print header
+.ds |z
+.if !\\n(?c \
+\{\
+. if e .ds |z "\\*(|0
+. if o .ds |z "\\*(|1
+.\}
+.if !\(ts\\*(|z\(ts\(ts \
+' tl \\*(|z
+.rm |z
+..
+.de $f \" $$$ print footer
+.ds |z
+.if \\n(?c \
+\{\
+. if e .ds |z "\\*(|0
+. if o .ds |z "\\*(|1
+.\}
+.if \(ts\\*(|z\(ts\(ts \
+\{\
+. if e .ds |z "\\*(|2
+. if o .ds |z "\\*(|3
+.\}
+.if !\(ts\\*(|z\(ts\(ts \
+' tl \\*(|z
+.rm |z
+..
+.de @r \" --- reprocess overflow footnotes
+.if \n@>3 .tm >> @r .z=\\n(.z ?f=\\n(?f ?a=\\n(?a ?b=\\n(?b _b=\\n(_b
+.di |o \" save overflow footnote
+.nr ?o 1
+.nr _D \\n(dn
+.ns
+..
+.\" *** COMMANDS WITH VARIANT DEFINITIONS ***
+.rn bp @b \" --- begin page
+.de bp \" *** begin new page (overrides columns)
+.nr $c \\n($m \" force new page, not new column
+.ie \\n(nl>0 \
+. @b \\$1
+.el \
+\{\
+. if \\n(.$>0 \
+. pn \\$1
+. if \\n(?I \
+. @h \" 'spring' the header trap
+.\}
+.br
+.wh 0 @h \" reset header
+..
+.rn ll xl \" *** special line length (local)
+.de ll \" *** line length (global to environments)
+.xl \\$1
+.lt \\$1
+.nr $l \\n(.l
+.if (\\n($m<=1):(\\n($l>\\n(_L) \
+. nr _L \\n(.l
+..
+.rn po @O \" --- local page offset
+.de po \" *** page offset
+.@O \\$1
+.nr _o \\n(.o
+..
+.\" Redefine the fam request to set the family in
+.\" environment 2 as well as the current environment.
+.if !\n(.g .ig
+.do rn fam @fam \" --- set family in current environment
+.do de fam \" *** set font family in ev 2 and current ev
+.do @fam \\$1
+.ev 2
+.do @fam \\$1
+.ev
+..
+.\" *** MISCELLANEOUS ROFF COMMANDS ***
+.de hx \" *** suppress headers and footers next page
+.nr ?H 1
+..
+.de ix \" *** indent, no break
+'in \\$1
+..
+.de bl \" *** contiguous blank lines
+.br
+.ne \\$1
+.rs
+.sp \\$1
+..
+.de n1 \" *** line numbering 1
+.nm 1
+.xl -\w'0000'u
+.nr ?n 1
+..
+.de n2 \" *** line numbering 2
+.nm \\$1
+.ie \\n(.$ \
+. xl -\w'0000'u
+.el \
+. xl \\n($lu
+..
+.de pa \" *** new page
+.bp \\$1
+..
+.de ro \" *** roman page numbers
+.af % i
+..
+.de ar \" *** arabic page numbers
+.af % 1
+..
+.de m1 \" *** position one space
+.nr _0 \\n(hmu
+.nr hm \\$1v
+.nr tm +\\n(hmu-\\n(_0u
+.rr _0
+..
+.de m2 \" *** position two space
+.nr tm \\n(hmu+\\n(tpp+\\$1v
+..
+.de m3 \" *** position three space
+.nr bm \\n(fmu+\\n(tpp+\\$1v
+..
+.de m4 \" *** position four space
+.nr _0 \\n(fmu
+.nr fm \\$1v
+.nr bm +\\n(fmu-\\n(_0u
+..
+.de sk \" *** leave a blank page (next page)
+.if \\n(.$>0 \
+. tm Line \\n(c. -- I cannot skip multiple pages
+.nr ?s 1
+..
+.\" *** MISCELLANEOUS USER SUPPORT COMMANDS ***
+.if !\n(.g .ig
+.de re \" *** reset tabs (TROFF defines 15 stops default)
+.ta T 0.5i
+..
+.if \n(.g .ig
+.de re
+.ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
+..
+.de ba \" *** set base indent
+.ie \\n(.$ \
+. nr $i \\$1n
+.el \
+. nr $i \\n(siu*\\n($0u
+..
+.de hl \" *** draw horizontal line
+.br
+.ie \n(.g .do nr _I \\n[.in]
+.el .nr _I \\n(.i
+\l'\\n(.lu-\\n(_Iu'
+.sp
+..
+.\" *** PARAGRAPHING ***
+.de pp \" *** paragraph
+.lp \\n(piu
+..
+.de lp \" *** left aligned paragraph
+.@p
+.if \\n(.$ \
+. ti +\\$1
+.nr $p 0 1
+..
+.de ip \" *** indented paragraph w/ optional tag
+.if (\\n(ii>0)&(\\n(ii<1n) \
+. nr ii \\n(iin
+.nr _0 \\n(ii
+.if \\n(.$>1 \
+. nr _0 \\$2n
+.@p \\n(_0u
+.nr _I \\n(.iu
+.in 0
+.di |i
+\&\\$1
+.br
+.di
+.in \\n(_Iu
+.ds |j \\*(|i\\
+.if \\w"\\*(|j" \
+\{\
+. ti -\\n(_0u
+. ie \\w"\\*(|j">=\\n(_0 \
+\{\
+\\*(|j
+. br
+. \}
+. el \\*(|j\h'|\\n(_0u'\c
+.\}
+.rr _0
+.rm |i |j
+..
+.de np \" *** numbered paragraph
+.\" use string comparison in case user has changed format of $p
+.if '\\n($p'-1' \
+. nr $p 0 \" reset number after .bu
+.nr $p +1 \" increment paragraph number
+.@p \w'\0(000)\0'u
+.ti -\w'\0(000)\0'u
+\0(\\n($p)\h'|\w'\0(000)\0'u'\c
+..
+.de bu \" *** bulleted paragraph
+.br
+.\" use string comparison in case user has changed format of $p
+.if '\\n($p'-1' \
+. ns \" don't space between .bu paragraphs
+.nr $p 0-1 \" mark "bulleted paragraph" mode
+.@p \w'\0\(bu\0'u
+.ti -\w'\0\(bu\0'u
+\0\(bu\0\c
+..
+.de @p \" --- initialize for paragraph
+.if "\\n(.z"|e" .tm Line \\n(c. -- Unmatched continued equation
+.in \\n($iu+\\n(pou
+.if \\n(.$ \
+. in +\\$1n
+.ce 0
+.fi
+.@F \\n(pf
+.sz \\n(pp
+.sp \\n(psu
+.ne \\n(.Lv+\\n(.Vu
+.ns
+..
+.\" *** SECTION HEADINGS ***
+.de sh \" *** section heading
+.fi
+.if (\\n(si>0)&(\\n(si<1n) \
+. nr si \\n(sin
+.ce 0
+.@d "\\$1" +1 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
+.if !"\\$2"_" \
+\{\
+. ds |n \&\\$2
+. $p "\\*(|n" "\\*($n" \\n($0
+. $0 "\\*(|n" "\\*($n" \\n($0
+. rm |n
+.\}
+.nr $p 0 1 \" reset .np count
+..
+.de @d \" --- change section depth
+.if !""\\$1" \
+. nr $0 \\$1
+.if \\n($0&(\\n(.$>1) \
+. nr $\\n($0 \\$2
+.ds $n \&\"
+.ie \\n($0>=1 \
+\{\
+. if '\\n($1'0' \
+. nr $1 1
+. if (\\n(.$>=3) .if !"\\$3"-" \
+. nr $1 \\$3
+. as $n \\n($1
+.\}
+.el \
+. nr $1 0
+.ie \\n($0>=2 \
+\{\
+. if '\\n($2'0' \
+. nr $2 1
+. if (\\n(.$>=4) .if !"\\$4"-" \
+. nr $2 \\$4
+. as $n .\\n($2
+.\}
+.el \
+. nr $2 0
+.ie \\n($0>=3 \
+\{\
+. if '\\n($3'0' \
+. nr $3 1
+. if (\\n(.$>=5) .if !"\\$5"-" \
+. nr $3 \\$5
+. as $n .\\n($3
+.\}
+.el \
+. nr $3 0
+.ie \\n($0>=4 \
+\{\
+. if '\\n($4'0' \
+. nr $4 1
+. if (\\n(.$>=6) .if !"\\$6"-" \
+. nr $4 \\$6
+. as $n .\\n($4
+.\}
+.el \
+. nr $4 0
+.ie \\n($0>=5 \
+\{\
+. if '\\n($5'0' \
+. nr $5 1
+. if (\\n(.$>=7) .if !"\\$7"-" \
+. nr $5 \\$7
+. as $n .\\n($5
+.\}
+.el \
+. nr $5 0
+.ie \\n($0>=6 \
+\{\
+. if '\\n($6'0' \
+. nr $6 1
+. if (\\n(.$>=8) .if !"\\$8"-" \
+. nr $6 \\$8
+. as $n .\\n($6
+.\}
+.el \
+. nr $6 0
+..
+.de sx \" *** heading up, no increment (2.1.1 -> 2.1)
+.ce 0
+.ul 0
+.nr _0 \\n($0-1
+.if \\n(.$ .nr _0 +1
+.if \\n(.$ .nr _0 \\$1
+.@d \\n(_0
+.rr _0
+.$p "" "" \\n($0
+.nr $p 0 1 \" reset .np count
+..
+.de uh \" *** unnumbered section heading
+.$p "\\$1"
+.$0 "\\$1"
+..
+.de $p \" $$$ print section heading
+.if (\\n(si>0)&(\\n(.$>2) \
+. nr $i \\$3*\\n(si
+.in \\n($iu
+.ie !"\\$1\\$2"" \
+\{\
+. sp \\n(ssu \" one of them is non-null
+. ne \\n(.Lv+\\n(.Vu+\\n(psu+((\\n(spp*\\n($vu*\\n(.Lu)/100u)
+. \" exdent if \\$3 > 0
+. ie 0\\$3 \
+. ti -(\\n(siu-\\n(sou)
+. el \
+. ti +\\n(sou
+. @F \\n(sf
+. sz \\n(sp
+. if 0\\$3 \
+. $\\$3
+. if \w"\\$2">0 \\$2.
+. if \w"\\$1">0 \\$1\f1\ \ \&
+.\}
+.el \
+. sp \\n(psu
+.@F \\n(pf
+.sz \\n(pp
+..
+.\" *** COLUMNNED OUTPUT ***
+.de 2c \" *** double columned output
+.br
+.if \\n($m>1 \
+. 1c \" revert to 1c if already 2c
+.nr $c 1
+.nr $m 2
+.if \\n(.$>1 \
+. nr $m \\$2
+.if \\n(.$>0 \
+. nr $s \\$1n \" param 1: column seperation
+.nr $l (\\n(.l-((\\n($m-1)*\\n($s))/\\n($m
+.xl \\n($lu
+.mk _k
+.ns
+..
+.de 1c \" *** single columned output
+.br
+.nr $c 1
+.nr $m 1
+.ll \\n(_Lu \" return to normal output
+.sp |\\n(.hu
+.@O \\n(_ou
+..
+.de bc \" *** begin column
+.sp 24i
+..
+.\" *** FLOATING TABLES AND NONFLOATING BLOCKS ***
+.de (z \" *** begin floating keep
+.if \n@>4 .tm >> (z, .z=\n(.z
+.@D 4 \\$1 \\$2
+.@(
+..
+.de )z \" *** end floating keep
+.if \n@>4 .tm >> )z, .z=\n(.z
+.sp \\n(zsu
+.@)
+.if \n@>4 .tm -- )z << @), .z=\n(.z
+.rr _0
+.if !\\n(?b \
+. nr dn +(\\n(ppp*\\n($vu)/200u+\\n(zsu
+.nr dl -\n(.H \" fudge factor necessary to make it work
+.ie ((\\n(dn+\n(.V)>=\\n(.t):(\\n(?a):((\\n(dl>\\n($l)&(\\n($c>1)) \
+\{\
+. nr ?a 1
+. if (\\n(dl>\\n($l)&(\\n($m>1) \
+. nr ?w 1 \" mark wider than one column (top)
+. ds |x |t
+.\}
+.el \
+\{\
+. nr ?b 1
+. if (\\n(dl>\\n($l)&(\\n($m>1) \
+. nr ?W 1 \" mark wider than one column (bottom)
+. nr _b +\\n(dnu
+. \" avoid moving @f back past the current position
+. if \\n(.p-\\n(nl-\n(.V<\\n(_b \
+. nr _b \\n(.p-\\n(nl-\n(.V
+. ch @f -\\n(_bu
+. ds |x |b
+.\}
+.da \\*(|x \" copy to save macro
+.nf
+.ls 1
+.nr ?k 1
+.if \n@>4 .tm -- )z >> \\*(|x
+\!.if \\\\n(nl>(\\\\n(tm+2v) .ne \\n(dnu-\\n(zsu
+.|k\" \" and the body
+.ec
+.if \n@>4 .tm -- )z << \\*(|x, .z=\\n(.z
+.nr ?k 0
+.rm |k\" \" remove the temp macro
+.da
+.in 0
+.ls 1
+.xl \\n($lu
+.ev
+.if \n@>4 .tm << )z, .z=\\n(.z
+..
+.de @k \" --- output floating keep
+.if \n@>4 .tm >> @k, $1=\\$1, .z=\\n(.z
+.ev 1
+.nf
+.ls 1
+.in 0
+.sp \\n(zsu
+.\\$1
+.ec
+.br
+.rm \\$1
+.ev
+..
+.de (t \" XXX temp ref to (z
+.(z \\$1 \\$2
+..
+.de )t \" XXX temp ref to )t
+.)z \\$1 \\$2
+..
+.de (b \" *** begin block
+.br
+.@D 3 \\$1 \\$2
+.sp \\n(bsu
+.@(
+..
+.de )b \" *** end block
+.br
+.@)
+.if (\\n(bt=0):(\\n(.t<\\n(bt) \
+. ne \\n(dnu \" make it all on one page
+.ls 1
+.nf
+.|k
+.ec
+.fi
+.in 0
+.xl \\n($lu
+.ev
+.rm |k
+.sp \\n(bsu+\\n(.Lv-1v
+..
+.de @( \" --- begin keep
+.if !"\\n(.z"" .tm Line \\n(c. -- Illegal nested keep \\n(.z
+.@M
+.di |k
+\!'rs
+..
+.de @M \" --- set modes for display
+.nr ?k 1
+.@C 1
+.@F \\n(df
+.if \\n($R .@V
+.vs \\n(.sp*\\n($Vu/100u
+.nf
+.if "\\*(|p"F" \
+. fi \" set fill mode if "F" parameter
+.if \\n(_d=4 \
+. in 0
+.if \\n(_d=3 \
+\{\
+. in +\\n(biu
+. xl -\\n(biu
+.\}
+.if \\n(_d=1 \
+. ce 10000
+..
+.de @) \" --- end keep
+.br
+.if !"\\n(.z"|k" .tm Line \\n(c. -- Close of a keep which has never been opened
+.nr ?k 0
+.di
+.in 0
+.ce 0
+..
+.de (c \" *** begin block centered text
+.if "\\n(.z"|c" .tm Line \\n(c. -- Nested .(c requests
+.di |c
+..
+.de )c \" *** end block centered text
+.if !"\\n(.z"|c" .tm Line \\n(c. -- Unmatched .)c
+.br \" force out final line
+.di
+.if \n@>4 .tm >> .)c .l=\\n(.l .i=\\n(.i $i=\\n($i dl=\\n(dl
+.ev 1
+.ls 1
+.in (\\n(.lu-\\n(.iu-\\n(dlu)/2u
+.if \n@>4 .tm -- .)c << .in .l=\\n(.l .i=\\n(.i dl=\\n(dl
+.nf
+.|c
+.ec
+.in
+.ls
+.ev
+.rm |c
+..
+.\" *** BLOCK QUOTES (OR WHATEVER) AND LISTS ***
+.de (q \" *** begin block quote
+.br
+.@C 1
+.fi
+.sp \\n(qsu
+.in +\\n(qiu
+.xl -\\n(qiu
+.sz \\n(qp
+..
+.de )q \" *** end block quote
+.br
+.ev
+.sp \\n(qsu+\\n(.Lv-1v
+.nr ?k 0
+..
+.de (l \" *** begin list
+.br
+.sp \\n(bsu
+.@D 3 \\$1 \\$2
+.@M
+..
+.de )l \" *** end list
+.br
+.ev
+.sp \\n(bsu+\\n(.Lv-1v
+.nr ?k 0
+..
+.\" *** PREPROCESSOR SUPPORT ***
+.\"
+.\" EQN
+.\"
+.de EQ \" *** equation start
+.ec
+.if !\\n(?e \
+\{\
+. if "\\n(.z"|e" .tm Line \\n(c. -- Nested .EQ request
+. @D 1 "\\$1" "\\$2"
+. @C 2
+. di |e
+.\}
+.ls 1
+.in 0
+.nf
+..
+.de EN \" *** equation end
+.br
+.ie "\\$1"C" \
+\{\
+. nr ?e 1
+. sp \\n(esu
+.\}
+.el \
+\{\
+. nr ?e 0
+. di
+. if \\n(dn \
+. @q \" actual equation output
+. rm |e
+. ev
+.\}
+..
+.de @q \" --- equation output
+.nr _Q \\n(dnu
+.ev
+.sp \\n(esu \" output rest of preceeding text
+.if !"\\n(.z"" \!.ne \\n(_Qu
+.ne \\n(_Qu+\n(.Vu \" keep it on one page
+.@C 2 \" .ev 2 may be jumbled from header
+.if \\n(_d=1 \
+. in (\\n(.lu+\\n($iu-\\n(dlu)/2u
+.if \\n(_d=2 \
+. in \\n($iu
+.if \\n(_d=3 \
+. in \\n(biu+\\n($iu
+.if \\n(_d=4 \
+. in 0
+.mk _q
+.if \n@>1 .tm --@e: _Q=\\n(_Q _q=\\n(_q nl=\\n(nl |p=\\*(|p
+.if !"\\*(|p"" \
+\{\
+. rs
+. sp (\\n(_Qu-\\n(.vu)/2u
+. tl """\\*(|p"
+. rt \\n(_qu
+.\}
+.|e
+.sp |\\n(_qu+\\n(_Qu
+.sp \\n(esu+\\n(.Lv-1v
+.rr _q
+.rr _Q
+..
+.\"
+.\" TBL
+.\"
+.de TS \" *** table start
+.sp \\n(bsu
+.@C 1
+.fi \" drop into fill mode for text boxes
+.if "\\$1"H" \
+\{\
+. di |h \" save header part
+. nr ?T 1
+.\}
+.ls 1
+.ch @f -(\\n(_bu+1v) \" set pseudo-trap for bottom line
+.if \\n(.p-\\n(_b-1v<=\\n(nl \
+. ch @f \\n(nlu+\n(.Vu
+..
+.de TH \" *** end header part of table
+.nr T. 0
+.T# 0
+.di
+.nr _T \\n(?T
+.nr ?T 0
+.ne \\n(dnu+1v
+.nr ?T \\n(_T
+.nr _i \\n(.i
+.in 0
+.|h \" put in the initial header
+.in \\n(_iu
+.rr _i
+.mk #T
+..
+.de TE \" *** table end
+.nr ?T 0
+.ch @f -\\n(_bu \" reset pseudo-trap
+.if \\n(.p-\\n(_b<=\\n(nl \
+. ch @f \\n(nlu+\n(.Vu
+.ev
+.sp \\n(bsu+\\n(.Lv-1v
+.re
+..
+.de T&
+..
+.\"
+.\" REFER
+.\"
+.de ][ \" *** refer output
+.if \\$1>5 .tm Bad arg to []
+.[\\$1
+..
+.de [0 \" --- other
+.(f
+.ip "\\*([F.\0"
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\f2\\*([T\\f1\c
+.if !"\\*([T"" .if !"\\*([O"" ,\ \"
+.ie !"\\*([O"" \\*([O
+.el .if !"\\*([T"" \&.
+.if !"\\*([D"" \\*([D.
+.@p
+.)f
+..
+.de [1 \" --- journal article
+.(f
+.ip "\\*([F.\0"
+\\*([A,
+.if !"\\*([T"" \\*(lq\\*([T,\\*(rq
+.if "\\*([V"" \\f2\\*([J\\f1,
+.if !"\\*([V"" \\f2\\*([J\\f1
+.if !"\\*([V"" \\f3\\*([V\\f1\c
+.if !"\\*([N"" (\\*([N)\c
+.if !"\\*([P"" \
+\{\
+. ie \\n([P>0 \ pp.\&
+. el \ p.\&
+\\*([P
+.\}
+.if !"\\*([I"" .if "\\*([R"" \\*([I,
+(\\*([D).
+.if !"\\*([O"" \\*([O
+.)f
+..
+.de [2 \" --- book
+.(f
+.ip "\\*([F.\0"
+\\*([A, \\f2\\*([T,\\f1
+\\*([I\c
+.if !"\\*([C"" , \\*([C\c
+ (\\*([D).
+.if !"\\*([G"" Gov't. ordering no. \\*([G
+.if !"\\*([O"" \\*([O
+.)f
+..
+.de [3 \" --- article in book
+.(f
+.ip "\\*([F.\0"
+\\*([A, \\*(lq\\*([T,\\*(rq
+.if !"\\*([P"" pp. \\*([P
+in \\f2\\*([B\\f1, \c
+.if !"\\*([E"" ed. \\*([E, \c
+.if !"\\*([I"" \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+ (\\*([D).
+.if !"\\*([O"" \\*([O
+.)f
+..
+.de [4 \" --- report
+.(f
+.ip "\\*([F.\0"
+\\*([A, \\*(lq\\*([T,\\*(rq
+\\*([R\c
+.if !"\\*([G"" \& (\\*([G)\c
+.if !"\\*([I"" , \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+ (\\*([D).
+.if !"\\*([O"" \\*([O
+.)f
+..
+.de [5 \" --- tm style
+.(f
+.ip "\\*([F.\0"
+\\*([A, \\f2\\*([T\\f1,
+.ie \\n(TN \\*([M.
+.el Bell Laboratories internal memorandum (\\*([D).
+.)f
+..
+.de ]<
+.$p References
+.lp
+.rm (f )f
+..
+.de ]>
+.sp
+..
+.de ]-
+.rm [V [P [A [T [N [C [B [O [R [I [E [D
+..
+.ie \n(.V<1v \
+\{\
+. ds [. \s-2\v'-.4m'\f1
+. ds .] \v'.4m'\s+2\fP
+.\}
+.el \
+\{\
+. ds [. " [
+. ds .] ]
+.\}
+.\"
+.\" IDEAL
+.\"
+.de IS \" *** start ideal picture
+.nr g7 \\n(.u
+.ls 1
+..
+.de IF
+.if \\n(g7 .fi
+.ls
+..
+.de IE \" *** end ideal picture
+.if \\n(g7 .fi
+.ls
+..
+.\"
+.\" PIC
+.\"
+.de PS \" *** start picture: $1=height, $2=width in units or inches
+.sp 0.3
+.nr g7 \\$2
+.in (u;\\n(.l-\\n(g7>?0/2)
+.ne \\$1u
+.nr g7 \\n(.u
+.ls 1
+..
+.de PE \" *** end picture
+.ls
+.in
+.if \\n(g7 .fi
+.sp .6
+..
+.\"
+.\" GREMLIN
+.\"
+.de GS \" *** start gremlin picture
+.nr g7 (\\n(.lu-\\n(g1u)/2u
+.if "\\$1"L" .nr g7 \\n(.iu
+.if "\\$1"R" .nr g7 \\n(.lu-\\n(g1u
+.in \\n(g7u
+.nr g7 \\n(.u
+.ls 1
+.nf
+.ne \\n(g2u
+..
+.de GE \" *** end gremlin picture
+.GF
+.sp .6
+..
+.de GF \" *** finish gremlin picture; stay at top
+.ls
+.in
+.if \\n(g7 .fi
+..
+.\" *** FONT AIDS ***
+.de sz \" *** set point size and vertical spacing
+.ps \\$1
+.if \\n($r .@v
+.vs \\n(.sp*\\n($vu/100u \" default vs at pointsize + 20%
+..
+.de @v \" --- possibly set $v from $r
+.if (1i>=240u)&(1p<=\\n($r)&(\\n($r<=4p) .nr $v \\n($r00/1p
+..
+.de @V \" --- possibly set $V from $R
+.if (1i>=240u)&(1p<=\\n($R)&(\\n($R<=4p) .nr $V \\n($R00/1p
+..
+.de @E \" --- store in _F argument to \f for restoring font
+.ie \\n(.f<10 \
+. ds _F \\n(.f
+.el \
+\{\
+. ie \\n(.f<100&\n(.g \
+. ds _F (\\n(.f
+. el \
+. ds _F P
+.\}
+..
+.de r \" *** enter roman font
+.@E
+.ft 1
+.if \\n(.$ \&\\$1\f\\*(_F\\$2
+..
+.de i \" *** enter italic
+.@E
+.ft 2
+.if \\n(.$ \&\\$1\f\\*(_F\\$2
+..
+.de b \" *** enter boldface
+.@E
+.ft 3
+.if \\n(.$ \&\\$1\f\\*(_F\\$2
+..
+.de rb \" *** enter real boldface
+.@E
+.ft 3
+.if \\n(.$ \&\\$1\f\\*(_F\\$2
+..
+.de bi \" *** enter bold italic
+.@E
+.ft 4
+.if \\n(.$ \&\\$1\f\\*(_F\\$2
+..
+.de u \" *** enter underlined word
+\&\\$1\l'|0\(ul'\\$2
+..
+.\" a better version of u
+.if !\n(.g .ig
+.de u
+\Z'\\$1'\v'.25m'\D'l \w'\\$1'u 0'\v'-.25m'\\$2
+..
+.de q \" *** enter quoted word
+\&\\*(lq\\$1\\*(rq\\$2
+..
+.de bx \" *** enter boxed word
+\k~\(br\|\\$1\|\(br\l'|\\n~u\(rn'\l'|\\n~u\(ul'\^\\$2
+..
+.de sm \" *** print in smaller font
+\s-1\\$1\\s0\\$2
+..
+.de @F \" --- change font (0 -> no change)
+.nr ~ \\$1
+.if \\n~>0 \
+. ft \\n~
+.rr ~
+..
+.\" *** FOOTNOTING ***
+.de (f \" *** begin footnote
+.ec
+.if "\\n(.z"|f" .tm Line \\n(c. -- Illegal footnote nesting
+.ie "\\n(.z"" \
+\{\
+. nr _D \\n(dn
+. nr _0 1v+\\n(nlu
+. ev 2
+. da |f
+. in 0
+. xl \\n($lu-\\n(fuu
+. @F \\n(ff
+. sz \\n(fp
+. vs \\n(.sp*\\n($Vu/100u
+. if !\\n(?f \
+\{\
+. nr _b +1v \" allow space for $s
+. $s
+. \}
+. br
+. if \\n(.p-\\n(_b-\\n(_0-\\n(.h-1v-\\n(fs<0 \
+\{\
+. da\" \" won't fit on page at all
+. bc
+. if !\\n(?f \
+. rm |f
+. da |f
+.\" next five lines could be dropped if headers had their own environment
+. in 0 \" reset everything from .bc
+. xl \\n($lu-\\n(fuu
+. @F \\n(ff
+. sz \\n(fp
+. vs \\n(.sp*\\n($Vu/100u
+. if !\\n(?f \
+. $s
+. br
+. \}
+. rr _0
+. sp \\n(fsu
+. nr ?f 1
+. fi
+. if !"\\$1"_" \
+. ti \\n(fiu
+. if \n@>2 .tm << (f $f=\\n($f
+.\}
+.el \
+\{\
+. ev 2
+. in 0
+. xl \\n($lu-\\n(fuu
+. @F \\n(ff
+. sz \\n(fp
+. vs \\n(.sp*\\n($Vu/100u
+. fi
+\!.(f \\$1
+\!.@N
+.\}
+..
+.de @N \" --- set no fill mode in the top-level diversion
+.ie "\\n(.z"" .nf
+.el \!.@N
+..
+.de )f \" *** end footnote
+.ie "\\n(.z"|f" \
+\{\
+. if \\n* \
+. nr $f +1
+. ds * \\*{\\n($f\\*}\k*
+. nr * 0
+. in 0
+. da
+. ev
+. if \\n(_w<\\n(dl \
+. nr _w \\n(dl \" compute maximum fn width
+. nr _b +\\n(dn
+. ch @f -\\n(_bu
+. if \\n(.p-\\n(_b<=\\n(nl \
+. ch @f \\n(nlu+\n(.Vu
+. nr dn \\n(_D
+. rr _D
+.\}
+.el \
+\{\
+. br
+\!.)f
+. ev
+.\}
+..
+.@R ff
+.if \n(ff<=0 \
+. nr ff 1 \" footnote font: Times Roman
+.@R fp
+.if \n(fp<=0 \
+. nr fp 8 \" footnote pointsize
+.de $s \" $$$ footnote separator
+\l'2i'
+..
+.\" *** DELAYED TEXT ***
+.de (d \" *** begin delayed text
+.am |d )d
+.sp \\n(bsu
+..
+.de )d \" *** end delayed text
+.if \\n# \
+. nr $d +1
+.ds # [\\n($d]\k#
+.rr #
+..
+.de pd \" *** print delayed text
+.|d
+.rm |d
+.nr $d 1 1
+.ds # [1]\k#
+..
+.\" *** INDEXES (TABLE OF CONTENTS) ***
+.nr _x 0 1
+.af _x a
+.de (x \" *** begin index entry
+.if \n@>4 .tm >> (x, .z=\\n(.z
+.ds |X x
+.if \\n(.$>0 \
+. ds |X \\$1
+.ie "\\n(.z"" \
+. nr _z 0
+.el \
+. nr _z 1
+.@\\n(_z
+..
+.de @0 \" --- finish (x if no current diversion
+.am %\\*(|X )x
+.sp \\n(xsu
+.ti -\\n(piu
+..
+.de @1 \" --- finish (x if current diversion
+.if "\\n(_x"z" .nr _x 0
+.de =\\n+(_x )x
+..
+.de )x \" *** end index entry
+.if \n@>4 .tm >> )x, .z=\\n(.z
+.ie "\\n(.z"" \
+\{\
+. ds |x \\n%
+. if \\n(.$>0 \
+. ds |x \\$1
+. if "\\*(|x"_" \
+. ig ..
+. am %\\*(|X ..
+. if \w"\\$2">(\\n(.l-\\n(.i-\\n(.k) \
+. ti +\\n(xuu
+\\\\a\\\\t\\$2\\*(|x
+...
+. rm |x
+. rm |X
+.\}
+.el \
+\{\
+\!.(x \\*(|X
+\!\\\\*(=\\n(_x\\\\
+\!.)x \\$1 \\$2
+\!.rm =\\n(_x
+.\}
+..
+.de xp \" *** print the index
+.br
+.@C 2
+.ls 1
+.vs \\n(.sp*\\n($Vu/100u
+.fi
+.in +\\n(piu
+.ds |X x
+.if \\n(.$>0 \
+. ds |X \\$1
+.xl -(\\n(xuu+\w'...'u)
+.di |x
+.%\\*(|X
+.br
+.di
+.rm %\\*(|X
+.xl \\n($lu
+.rm |X
+.ev
+.nf
+.in 0
+.ta \\n(.lu-\\n(xuuR \\n(.luR
+.|x
+.fi
+.in
+.rm |x
+..
+.de +c \" *** begin chapter
+.ep \" force out footnotes
+.if \\n(?o:\\n(?a \
+\{\
+. bp \" force out a table or more footnote
+. rs
+. ep
+.\}
+.nr ?C 1
+.nr $f 1 1
+.ds * \\*{1\\*}\k*
+.if \\n(?R \
+. pn 1
+.bp
+.in \\n($iu \" reset the indent
+.rs
+.ie \\n(.$ \
+. $c "\\$1"
+.el \
+. sp 3
+..
+.de ++ \" *** declare chapter type
+.nr _0 0
+.if "\\$1"C" \
+. nr _0 1 \" chapter
+.if "\\$1"RC" \
+. nr _0 11 \" renumbered chapter
+.if "\\$1"A" \
+. nr _0 2 \" appendix
+.if "\\$1"RA" \
+. nr _0 12 \" renumbered appendix
+.if "\\$1"P" \
+. nr _0 3 \" preliminary material
+.if "\\$1"B" \
+. nr _0 4 \" bibliographic material
+.if "\\$1"AB" \
+. nr _0 5 \" abstract
+.if \\n(_0=0 \
+. tm Line \\n(c. -- Bad mode to .++
+.nr ?R 0
+.if \\n(_0>10 \
+.\{
+. nr ?R 1
+. nr _0 -10
+.\}
+.nr ch 0 1
+.if (\\n(_0=3):(\\n(_0=5) \
+. pn 1 \" must do before .ep
+.if !\\n(_0=\\n(_M .if \\n(_M=3 \
+. pn 1 \" must do before .ep
+.ep \" end page for correct page number types
+.if \\n(_0=1 \
+\{\
+. af ch 1
+. af % 1
+.\}
+.if \\n(_0=2 \
+\{\
+. af ch A
+. af % 1
+.\}
+.if \\n(_0=3 \
+. af % i
+.if \\n(_0=4 \
+. af % 1
+.if \\n(_0=5 \
+. af % 1
+.if \\n(.$>1 \
+. he \\$2
+.nr _M \\n(_0
+.rr _0
+..
+.de $c \" $$$ print chapter title
+.sz 12
+.ft 3
+.ce 1000
+.if \\n(_M<3 \
+. nr ch +1
+.ie \\n(_M=1 CHAPTER\ \ \\n(ch
+.el .if \\n(_M=2 APPENDIX\ \ \\n(ch
+.if \w"\\$1" .sp 3-\\n(.L
+.if \w"\\$1" \\$1
+.if (\\n(_M<3):(\w"\\$1") \
+. sp 4-\\n(.L
+.ce 0
+.ft
+.sz
+.ie \\n(_M=1 \
+. $C Chapter \\n(ch "\\$1"
+.el .if \\n(_M=2 \
+. $C Appendix \\n(ch "\\$1"
+..
+.de tp \" *** title page
+.hx
+.bp
+.br
+.rs
+.pn \\n%
+..
+.\" *** DATES ***
+.if \n(mo=1 .ds mo January
+.if \n(mo=2 .ds mo February
+.if \n(mo=3 .ds mo March
+.if \n(mo=4 .ds mo April
+.if \n(mo=5 .ds mo May
+.if \n(mo=6 .ds mo June
+.if \n(mo=7 .ds mo July
+.if \n(mo=8 .ds mo August
+.if \n(mo=9 .ds mo September
+.if \n(mo=10 .ds mo October
+.if \n(mo=11 .ds mo November
+.if \n(mo=12 .ds mo December
+.if \n(dw=1 .ds dw Sunday
+.if \n(dw=2 .ds dw Monday
+.if \n(dw=3 .ds dw Tuesday
+.if \n(dw=4 .ds dw Wednesday
+.if \n(dw=5 .ds dw Thursday
+.if \n(dw=6 .ds dw Friday
+.if \n(dw=7 .ds dw Saturday
+.nr y2 \n(yr%100
+.af y2 00
+.nr y4 \n(yr+1900
+.ds td \*(mo \n(dy, \n(y4
+.\" *** PARAMETRIC INITIALIZATIONS ***
+.rr x
+.nr $v \n(.v00+\n(.sp-1/\n(.sp \" vs as percentage of ps for .sz request
+.nr $V \n($v \" same for displays & footnotes
+.nr hm 4v \" header margin
+.nr tm 7v \" top margin
+.nr bm 6v \" bottom margin
+.nr fm 3v \" footer margin
+.nr tf 3 \" title font: (real) Times Bold
+.nr tp 10 \" title point size
+.hy 14
+.nr bi 4m \" indent for blocks
+.nr pi 5n \" indent for paragraphs
+.nr pf 1 \" normal text font
+.nr pp 10 \" normal text point size
+.nr qi 4n \" indent for quotes
+.nr qp -1 \" down one point
+.nr ii 5n \" indent for .ip's and .np's
+.nr $m 1 \" max number of columns
+.nr $s 4n \" column separation
+.nr sf 3 \" section font -- Times Bold
+.nr sp 10 \" section title pointsize
+.nr ss 12p \" section prespacing
+.nr si 0 \" section indent
+.\" *** OTHER INITIALIZATION ***
+.\" GNU pic sets this register to 1, to indicate that \x should not be used.
+.@R 0x
+.ds { \v'-0.4m'\x'\\n(0x=0*-0.2m'\s-3
+.ds } \s0\v'0.4m'
+.\" for compatibility with traditional -me
+.\" (the first will work only in compatibility mode)
+.ds [ \*{
+.ds ] \*}
+.ds < \v'0.4m'\x'\\n(0x=0*0.2m'\s-3
+.ds > \s0\v'-0.4m'
+.ds - \(em
+.\" Avoid warnings from groff -ww.
+.@S |0
+.@S |1
+.@S |2
+.@S |3
+.@S $H
+.@S $0
+.@S $1
+.@S $2
+.@S $3
+.@S $4
+.@S $5
+.@S $6
+.@S $7
+.@S $8
+.@S $9
+.@S ..
+.@R po\" \" simulated page offset
+.@R $0\" \" section depth
+.@R $i\" \" paragraph base indent
+.@R $p\" \" numbered paragraph number
+.@R $r\" \" ratio of vs to ps (may override $v)
+.@R $R\" \" same for displays (may override $V)
+.@R df\" \" display font: same as surrounding text
+.@R so\" \" additional section title offset
+.@R fu\" \" footnote undent
+.@R bt\" \" block keep threshold
+.@R *\" \" has \** been referenced?
+.@R ?a\" \" pending floating keep at page top?
+.@R ?b\" \" pending floating keep at page bottom?
+.@R ?C\" \" at chapter header?
+.@R ?e\" \" in equation?
+.@R ?H\" \" suppress headers and footers next page?
+.@R ?I\" \" has the header trap been sprung?
+.@R ?n\" \" n1 mode?
+.@R ?o\" \" footnote overflow?
+.@R ?R\" \" renumbered chapter?
+.@R ?s\" \" skip next page?
+.@R ?T\" \" inside .TS H?
+.@R ?W\" \" wide floating keep at page bottom?
+.@R ?w\" \" wide floating keep at page top?
+.nr fi 0.3i
+.nr _o \n(.o
+.nr $b 3 \" bold
+.nr ps 0.35v
+.if \n(ps<\n(.V .nr ps \n(.V
+.nr bs \n(ps \" block pre/post spacing
+.nr qs \n(ps \" quote pre/post spacing
+.nr zs 1v \" float-block pre/postspacing
+.nr xs 0.2v \" index prespacing
+.nr xu 0.5i \" index undent
+.nr fs 0.2v \" footnote prespacing
+.nr es 0.5v \" equation pre/postspacing
+.if \n(es<\n(.V .nr es \n(.V
+.wh 0 @h \" set header
+.nr $l \n(.lu \" line length
+.nr _L \n(.lu \" line length of page
+.nr $c 1 \" current column number
+.nr $f 1 1 \" footnote number
+.ds * \*{1\*}\k*\" \" footnote "name"
+.nr $d 1 1 \" delayed text number
+.ds # [1]\k#\" \" delayed text "name"
+.nr _M 1 \" chapter mode is chapter
+.ds lq \(lq\" \" left quote
+.ds rq \(rq\" \" right quote
+.em @z
+.\" *** FOREIGN LETTERS AND SPECIAL CHARACTERS ***
+.ds #h ((1u-(\\\\n(.fu%2u))*0.13m)
+.ds #v 0.6m
+.\" \" accents
+.ds ' \k_\h'-(\\n(.wu*8/10-\*(#h)'\(aa\h'|\\n_u'
+.ds ` \k_\h'-(\\n(.wu*7/10-\*(#h)'\(ga\h'|\\n_u'
+.\" \" umlaut
+.ds : \k_\h'-(\\n(.wu*8/10-\*(#h+0.1m)'\v'-\*(#v'\z.\h'0.2m'.\h'|\\n_u'\v'\*(#v'
+.\" \" circumflex and tilde
+.ds ^ \k_\h'-(\\n(.wu-\*(#h-0.05m)'^\h'|\\n_u'
+.ds ~ \k_\h'-(\\n(.wu-\*(#h-0.05m)'~\h'|\\n_u'
+.\" \" cedilla and czech
+.ds , \k_\h'-(\\n(.wu)',\h'|\\n_u'
+.ds v \k_\h'-(\\n(.wu*9/10-\*(#h)'\v'-\*(#v'\s-4v\s0\v'\*(#v'\h'|\\n_u'
+.\" \" Norwegian A or angstrom
+.ds o \k_\h'-(\\n(.wu+\w'\(de'u-\*(#h)/2u'\v'-0.4n'\z\(de\v'0.4n'\h'|\\n_u'
+.\" \" there exists, for all
+.ds qe \s-2\v'0.45m'\z\(em\v'-0.625m'\z\(em\v'-0.625m'\(em\v'0.8m'\s0\h'-0.1m'\v'-0.05m'\(br\v'0.05m'\h'0.1m'
+.ds qa \z\e\h'0.35m'\z\(sl\h'-0.33m'\v'-0.3m'\s-4\(em\s0\v'0.3m'\h'0.15m'
+.rm #h #v
+.ll 6.0i
+.lt 6.0i
+.de @U
+.tm The \\$1 macro has been removed from this version of the -me macros.
+..
+.de lo
+.@U lo
+..
+.de th
+.@U th
+..
+.de ac
+.@U ac
+..
diff --git a/contrib/groff/tmac/fixmacros.sed b/contrib/groff/tmac/fixmacros.sed
index 63cce22..56caf9f 100644
--- a/contrib/groff/tmac/fixmacros.sed
+++ b/contrib/groff/tmac/fixmacros.sed
@@ -1,3 +1,4 @@
+# try to fix macros for AT&T troff so that they work without groff's -C switch
s/^\([.'][ ]*[^\\ ][^ \\]\)\([^ ]\)/\1 \2/
s/^\(\\![.'][ ]*[^\\ ][^ \\]\)\([^ ]\)/\1 \2/
s/\([.'][ ]*i[ef] *[^ ]* [.'][ ]*[^\\0-9 ][^ \\]\)\([^ ]\)/\1 \2/
diff --git a/contrib/groff/tmac/groff_man.man b/contrib/groff/tmac/groff_man.man
index 14bd3b0..e35acab 100644
--- a/contrib/groff/tmac/groff_man.man
+++ b/contrib/groff/tmac/groff_man.man
@@ -30,7 +30,16 @@ groff_man \- groff `man' macros to support generation of man pages
.SH SYNOPSIS
.
.B groff
-.B \-m@TMAC_AN_PREFIX@an
+.B \-man
+[
+.IR options .\|.\|.
+]
+[
+.IR files .\|.\|.
+]
+.br
+.B groff
+.B \-m\ man
[
.IR options .\|.\|.
]
@@ -40,11 +49,11 @@ groff_man \- groff `man' macros to support generation of man pages
.
.SH DESCRIPTION
.
-The
-.B tmac.@TMAC_AN_PREFIX@an
-macros used to generate man pages with
+The
+.B man
+macros used to generate man pages with
.I groff
-were written by James Clark.
+were written by James Clark.
This document provides a brief summary of the use of each macro in that
package.
.
@@ -55,6 +64,13 @@ The
macros understand the following command line options (which define various
registers).
.TP
+.B \-rcR=1
+This option (the default if in nroff mode) will create a single, very long
+page instead of multiple pages.
+Say
+.B \-rcR=0
+to disable it.
+.TP
.B \-rC1
If more than one manual page is given on the command line, number the
pages continuously, rather than starting each at\ 1.
@@ -91,11 +107,12 @@ For example, the option `\-rX2' will produce the following page numbers:
This section describes the available macros for manual pages.
For further customization, put additional macros and requests into the file
.B man.local
-which will be loaded immediately after
-.BR tmac.@TMAC_AN_PREFIX@an .
+which will be loaded immediately after the
+.B man
+package.
.TP
.BI .TH " title section " [ extra1 "] [" extra2 "] [" extra3 ]
-Sets the title of the man page to
+Sets the title of the man page to
.I title
and the section to
.IR section ,
@@ -154,7 +171,7 @@ value.
.TP
.BI ".TP [" nnn ]
Sets up an indented paragraph with label.
-The indentation is set to
+The indentation is set to
.I nnn
if that argument is supplied (the default unit is `n' if omitted), otherwise
it is set to the default indentation value.
@@ -188,8 +205,8 @@ The font size and shape are reset to the default value (10pt resp. Roman).
Finally, the current left margin is restored.
.TP
.BI ".IP [" designator "] [" nnn ]
-Sets up an indented paragraph, using
-.I designator
+Sets up an indented paragraph, using
+.I designator
as a tag to mark its beginning.
The indentation is set to
.I nnn
@@ -205,9 +222,9 @@ designator, using `.IP\ \\(bu\ 4':
.RS
.IP \(bu 4
.B IP
-is one of the three macros used in
-.B tmac.@TMAC_AN_PREFIX@an
-to format lists.
+is one of the three macros used in the
+.B man
+package to format lists.
.IP \(bu 4
.B HP
is another.
@@ -345,7 +362,7 @@ of the next line appears in italic.
.
The default indentation is 7.2n for all output devices except for
.B grohtml
-which uses 1.2i instead.
+which ignores indentation.
.TP
.B .DT
Sets tabs every 0.5 inches.
@@ -413,15 +430,38 @@ Modern implementations of the
program read this first line and automatically call the right
preprocessor(s).
.
+.SH FILES
+.TP
+.B man.tmac
+.TQ
+.B an.tmac
+These are wrapper files to call
+.BR andoc.tmac .
+.TP
+.B andoc.tmac
+This file checks whether the
+.B man
+macros or the
+.B mdoc
+package should be used.
+.TP
+.B an-old.tmac
+All
+.B man
+macros are contained in this file.
+.TP
+.B man.local
+Local changes and customizations should be put into this file.
+.
.SH "SEE ALSO"
.
-Since the
-.B tmac.@TMAC_AN_PREFIX@an
-macros consist of groups of
-.I groff
+Since the
+.B man
+macros consist of groups of
+.I groff
requests, one can, in principle, supplement the functionality of the
-.B tmac.@TMAC_AN_PREFIX@an
-macros with individual
+.B man
+macros with individual
.I groff
requests where necessary.
A complete list of these requests is available on the WWW at
diff --git a/contrib/groff/tmac/groff_mdoc.man b/contrib/groff/tmac/groff_mdoc.man
index 2112eba..1144636 100644
--- a/contrib/groff/tmac/groff_mdoc.man
+++ b/contrib/groff/tmac/groff_mdoc.man
@@ -1,7 +1,15 @@
-.\" $NetBSD: mdoc.7,v 1.14 1999/08/30 00:41:28 ross Exp $
+.\" groff_mdoc.man
.\"
-.\" Copyright (c) 1991, 1993
-.\" The Regents of the University of California. All rights reserved.
+.\" A complete reference of the mdoc macro package for GNU troff.
+.\"
+.\" Based on NetBSD's mdoc.samples.7, version 1.21.
+.\"
+.\"
+.\" Warning: You can't format this file with the old mdoc macros!
+.\"
+.\"
+.\" Copyright (c) 1990, 1993
+.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
@@ -13,8 +21,8 @@
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
@@ -31,392 +39,3909 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)mdoc.7 8.2 (Berkeley) 12/30/93
+.\" @(#)mdoc.samples.7 8.2 (Berkeley) 12/30/93
.\"
-.Dd November 24, 1997
+.\" This reference invokes every macro in the package several
+.\" times and is guaranteed to give a worst case performance
+.\" for an already extremely slow package.
+.\"
+.
+.Dd April 10, 2001
.Os
-.Dt MDOC 7
+.Dt GROFF_MDOC 7
+.
+.
.Sh NAME
-.Nm mdoc
-.Nd quick reference guide for the
-.Nm \-mdoc
-macro package
+.
+.Nm groff_mdoc
+.Nd reference for groff's mdoc implementation
+.
+.
.Sh SYNOPSIS
-.Nm groff
-.Fl m Ns Ar doc
-.Ar files ...
+.
+.Nm groff Fl m Ns Cm doc Ar
+.
+.
.Sh DESCRIPTION
+.
+A complete reference for writing
+.Ux
+manual pages with the
+.Nm \-mdoc
+macro package; a
+.Em content Ns -based
+and
+.Em domain Ns -based
+formatting package for
+.Tn GNU
+.Xr troff 1 .
+Its predecessor, the
+.Xr \-man 7
+package, addressed page layout leaving the manipulation of fonts and other
+typesetting details to the individual author.
+In
+.Nm \-mdoc ,
+page layout macros make up the
+.Em "page structure domain"
+which consists of macros for titles, section headers, displays and lists
+\- essentially items which affect the physical position of text on a
+formatted page.
+In addition to the page structure domain, there are two more domains, the
+.Em manual
+domain and the
+.Em general
+text domain.
+The general text domain is defined as macros which perform tasks such as
+quoting or emphasizing pieces of text.
+The manual domain is defined as macros that are a subset of the day to day
+informal language used to describe commands, routines and related
+.Ux
+files.
+Macros in the manual domain handle command names, command line arguments and
+options, function names, function parameters, pathnames, variables, cross
+references to other manual pages, and so on.
+These domain items have value for both the author and the future user of the
+manual page.
+It is hoped the consistency gained across the manual set will provide easier
+translation to future documentation tools.
+.Pp
+Throughout the
+.Ux
+manual pages, a manual entry is simply referred to as a man page, regardless
+of actual length and without sexist intention.
+.
+.
+.Sh "GETTING STARTED"
+.
+The material presented in the remainder of this document is outlined
+as follows:
+.
+.Bl -enum -width 3n -offset indent
+. It
+. Tn "TROFF IDIOSYNCRASIES"
+.
+. Bl -tag -width 2n -compact
+. It "Macro Usage"
+. It "Passing Space Characters in an Argument"
+. It "Trailing Blank Space Characters"
+. It "Escaping Special Characters"
+. It "Other Possible Pitfalls"
+. El
+.
+. It
+. Tn "A MANUAL PAGE TEMPLATE"
+.
+. It
+. Tn "CONVENTIONS"
+.
+. It
+. Tn "TITLE MACROS"
+.
+. It
+. Tn "INTRODUCTION OF MANUAL AND GENERAL TEXT DOMAINS"
+.
+. Bl -tag -width 2n -compact
+. It "What's in a Name" Ns ...
+. It "General Syntax"
+. El
+.
+. It
+. Tn "MANUAL DOMAIN"
+.
+. Bl -tag -width 2n -compact
+. It "Addresses"
+. It "Author Name"
+. It "Arguments"
+. It "Configuration Declarations (Section Four Only)"
+. It "Command Modifiers"
+. It "Defined Variables"
+. It "Errno's"
+. It "Environment Variables"
+. It "Flags"
+. It "Function Declarations"
+. It "Function Types"
+. It "Functions (Library Routines)"
+. It "Function Arguments"
+. It "Return Values"
+. \" .It "Header File (including source code)"
+. It "Interactive Commands"
+. It "Library Names"
+. It "Literals"
+. It "Names"
+. It "Options"
+. It "Pathnames"
+. It "Standards"
+. It "Variable Types"
+. It "Variables"
+. It "Manual Page Cross References"
+. El
+.
+. It
+. Tn "GENERAL TEXT DOMAIN"
+.
+. Bl -tag -width 2n -compact
+. It "AT&T Macro"
+. It "BSD Macro"
+. It "NetBSD Macro"
+. It "FreeBSD Macro"
+. It "OpenBSD Macro"
+. It "BSD/OS Macro"
+. It "UNIX Macro"
+. It "Emphasis Macro"
+. It "Font Mode"
+. It "Enclosure and Quoting Macros"
+. It "No-Op or Normal Text Macro"
+. It "No-Space Macro"
+. It "Section Cross References"
+. It "Symbolics"
+. It "Mathematical Symbols"
+. It "References and Citations"
+. It "Trade Names (or Acronyms and Type Names)"
+. It "Extended Arguments"
+. El
+.
+. It
+. Tn "PAGE STRUCTURE DOMAIN"
+.
+. Bl -tag -width 2n -compact
+. It "Section Headers"
+. It "Subsection Headers"
+. It "Paragraphs and Line Spacing"
+. It "Keeps"
+. It "Examples and Displays"
+. It "Lists and Columns"
+. El
+.
+. It
+. Tn "MISCELLANEOUS MACROS"
+.
+. It
+. Tn "PREDEFINED STRINGS"
+.
+. It
+. Tn "DIAGNOSTICS"
+.
+. It
+. Tn "FORMATTING WITH GROFF, TROFF, AND NROFF"
+.
+. It
+. Tn "FILES"
+.
+. It
+. Tn "SEE ALSO"
+.
+. It
+. Tn "BUGS"
+.El
+.
+.\" XXX
+.ne 7
+.
+.
+.Sh "TROFF IDIOSYNCRASIES"
+.
The
.Nm \-mdoc
-package is a set of content-based and domain-based macros
-used to format the
-.Bx
-man pages.
-The macro names and their meanings are
-listed below for quick reference; for
-a detailed explanation on using the package,
-see the tutorial sampler
-.Xr mdoc.samples 7 .
-.Pp
-The macros are described in two groups, the first
-includes the structural and physical page layout macros.
-The second contains the manual and general text domain
-macros which differentiate the
-.Nm -\mdoc
-package from other
+package attempts to simplify the process of writing a man page.
+Theoretically, one should not have to learn the dirty details of
+.Tn GNU
+.Xr troff 1
+to use
+.Nm \-mdoc ;
+however, there are a few limitations which are unavoidable and best gotten
+out of the way.
+And, too, be forewarned, this package is
+.Em not
+fast.
+.
+.Ss "Macro Usage"
+.
+As in
+.Tn GNU
+.Xr troff 1 ,
+a macro is called by placing a
+.Ql .\&
+(dot character) at the beginning of a line followed by the two-character
+(or three-character) name for the macro.
+There can be space characters between the dot and the macro name (but
+.Em no
+tabs).
+Arguments may follow the macro separated by spaces (again, no tabs).
+It is the dot character at the beginning of the line which causes
+.Tn GNU
+.Xr troff 1
+to interpret the next two (or more) characters as a macro name.
+A single starting dot followed by nothing is ignored.
+To place a
+.Ql .\&
+(dot character) at the beginning of an input line in some context other than
+a macro invocation, precede the
+.Ql .\&
+(dot) with the
+.Ql \e&
+escape sequence.
+The
+.Ql \e&
+translates literally to a zero-width space, and is never displayed in
+the output.
+.Pp
+In general,
+.Tn GNU
+.Xr troff 1
+macros accept an unlimited number of arguments (contrary to other versions
+of troff which can't handle more than nine arguments).
+In limited cases, arguments may be continued or extended on the next
+line (See
+.Sx Extended Arguments
+below).
+Almost all macros handle quoted arguments (see
+.Sx Passing Space Characters in an Argument
+below).
+.Pp
+Most of the
+.Nm \-mdoc
+general text domain and manual domain macros are special in that their
+argument lists are
+.Em parsed
+for callable macro names.
+This means an argument on the argument list which matches a general text or
+manual domain macro name and is determined to be callable will be executed
+or called when it is processed.
+In this case the argument, although the name of a macro, is not preceded by
+a
+.Ql .\&
+(dot).
+It is in this manner that many macros are nested; for example the
+option macro,
+.Ql .Op ,
+may
+.Em call
+the flag and argument macros,
+.Ql \&Fl
+and
+.Ql \&Ar ,
+to specify an optional flag with an argument:
+.
+.Bl -tag -xwidth ".Op Fl s Ar bytes" -offset indent
+.It Op Fl s Ar bytes
+is produced by
+.Ql ".Op Fl s Ar bytes"
+.El
+.
+.Pp
+To prevent a string from being interpreted as a macro name, precede the
+string with the escape sequence
+.Ql \e& :
+.
+.Bl -tag -xwidth ".Op \&Fl s \&Ar bytes" -offset indent
+.It Op \&Fl s \&Ar bytes
+is produced by
+.Ql ".Op \e&Fl s \e&Ar bytes"
+.El
+.
+.Pp
+Here the strings
+.Ql \&Fl
+and
+.Ql \&Ar
+are not interpreted as macros.
+Macros whose argument lists are parsed for callable arguments are referred
+to as
+.Em parsed
+and macros which may be called from an argument list are referred to as
+.Em callable
+throughout this document.
+This is a technical
+.Em faux pas
+as almost all of the macros in
+.Nm \-mdoc
+are parsed, but as it was cumbersome to constantly refer to macros as
+being callable and being able to call other macros, the term parsed
+has been used.
+.
+.Ss "Passing Space Characters in an Argument"
+.
+Sometimes it is desirable to give as an argument a string containing one or
+more blank space characters.
+This may be necessary to specify arguments to macros which expect particular
+arrangement of items in the argument list. Additionally, it makes
+.Nm \-mdoc
+working faster.
+For example, the function macro
+.Ql .Fn
+expects the first argument to be the name of a function and any remaining
+arguments to be function parameters.
+As
+.Tn ANSI\~C
+stipulates the declaration of function parameters in the parenthesized
+parameter list, each parameter is guaranteed to be at minimum a two word
+string.
+For example,
+.Fa int foo .
+.Pp
+There are two possible ways to pass an argument which contains
+an embedded space.
+One way of passing a string containing blank spaces is to use the hard or
+unpaddable space character
+.Ql \e\ ,
+that is, a blank space preceded by the escape character
+.Ql \e .
+This method may be used with any macro but has the side effect of
+interfering with the adjustment of text over the length of a line.
+.Xr Troff
+sees the hard space as if it were any other printable character and cannot
+split the string into blank or newline separated pieces as one would expect.
+This method is useful for strings which are not expected to overlap a line
+boundary.
+An alternative is to use
+.Ql \e~ ,
+a paddable (i.e.\& stretchable), unbreakable space (this is a
+.Tn GNU
+.Xr troff 1
+extension).
+The second method is to enclose the string with double quotes.
+.Pp
+For example:
+.
+.Bl -tag -xwidth ".Fn fetch char\ *str" -offset indent
+.It Fn fetch char\ *str
+is created by
+.Ql ".Fn fetch char\e *str"
+.It Fn fetch "char *str"
+can also be created by
+.Ql ".Fn fetch \*[q]char *str\*[q]"
+.El
+.
+.Pp
+If the
+.Ql \e
+before the space resp.\& the double quotes were omitted,
+.Ql .Fn
+would see three arguments, and the result would be:
+.Pp
+.Dl Fn fetch char *str
+.Pp
+.\" For an example of what happens when the parameter list overlaps a newline
+.\" boundary, see the
+.\" .Sx BUGS
+.\" section.
+.
+.Ss "Trailing Blank Space Characters"
+.
+.Xr Troff
+can be confused by blank space characters at the end of a line.
+It is a wise preventive measure to globally remove all blank spaces
+from
+.Ao blank-space Ac Ns Ao end-of-line Ac
+character sequences.
+Should the need arise to force a blank character at the end of a line, it
+may be forced with an unpaddable space and the
+.Ql \e&
+escape character.
+For example,
+.Ql string\e\ \e& .
+.
+.Ss "Escaping Special Characters"
+.
+Special characters like the newline character
+.Ql \en
+are handled by replacing the
+.Ql \e
+with
+.Ql \ee
+(e.g.\&
+.Ql \een )
+to preserve the backslash.
+.
+.Ss "Other Possible Pitfalls"
+.
+A warning is emitted when an empty input line is found outside of displays
+(see below).
+Use
+.Ql .sp
+instead.
+(Well, it is even better to use
+.Nm \-mdoc
+macros to avoid the usage of low-level commands.)
+.Pp
+Leading spaces will cause a break and are output directly.
+Avoid this behaviour if possible.
+Similarly, do not use more than one space character between words in an
+ordinary text line; contrary to other text formatters, they are
+.Em not
+replaced with a single space.
+.Pp
+You can't pass
+.Ql \*[q]
+directly as an argument.
+Use
+.Ql \e*[q]
+(or
+.Ql \e*q )
+instead.
+.Pp
+By default,
+.Xr troff 1
+inserts two space characters after a punctuation mark closing a sentence;
+characters like
+.Ql \&)
+or
+.Ql \&'
+are treated transparently, not influencing the sentence-ending behaviour.
+To change this, insert
+.Ql \e&
+before or after the dot:
+.
+.Bd -literal -offset indent
+The
+\&.Ql .
+character.
+\&.Pp
+The
+\&.Ql \e&.
+character.
+\&.Pp
+\&.No test .
+test
+\&.Pp
+\&.No test.
+test
+.Ed
+.Pp
+.
+gives
+.
+.Bd -filled -offset indent
+The
+.Ql .
+character
+.Pp
+The
+.Ql \&.
+character.
+.Pp
+.No test .
+test
+.Pp
+.No test.
+test
+.Ed
+.Pp
+.
+As can be seen in the first and third line,
+.Nm \-mdoc
+handles punctuation characters specially in macro arguments.
+This will be explained in section
+.Sx General Syntax
+below.
+In the same way, you have to protect trailing full stops of abbreviations
+with a trailing zero-width space:
+.Ql e.g.\e& .
+.Pp
+A comment in the source file of a man page can be either started with
+.Ql .\e"
+on a single line,
+.Ql \e"
+after some input, or
+.Ql \e#
+anywhere (the latter is a
+.Tn GNU
+.Xr troff 1
+extension); the rest of such a line is ignored.
+.
+.
+.Sh "A MANUAL PAGE TEMPLATE"
+.
+The body of a man page is easily constructed from a basic template:
+.
+.Bd -literal -offset indent
+\&.\e" The following requests are required for all man pages.
+\&.Dd Month day, year
+\&.Os [OPERATING_SYSTEM] [version/release]
+\&.Dt DOCUMENT_TITLE [section number] [architecture/volume]
+\&.Sh NAME
+\&.Nm name
+\&.Nd one line description of name
+\&.\e" This next request is for sections 2 and 3 only.
+\&.\e" .Sh LIBRARY
+\&.Sh SYNOPSIS
+\&.Sh DESCRIPTION
+\&.\e" The following requests should be uncommented and
+\&.\e" used where appropriate.
+\&.\e" .Sh IMPLEMENTATION NOTES
+\&.\e" This next request is for sections 2, 3 and 9 function
+\&.\e" return values only.
+\&.\e" .Sh RETURN VALUES
+\&.\e" This next request is for sections 1, 6, 7 and 8 only.
+\&.\e" .Sh ENVIRONMENT
+\&.\e" .Sh FILES
+\&.\e" .Sh EXAMPLES
+\&.\e" This next request is for sections 1, 6, 7, 8 and 9 only
+\&.\e" (command return values (to shell) and
+\&.\e" fprintf/stderr type diagnostics).
+\&.\e" .Sh DIAGNOSTICS
+\&.\e" .Sh COMPATIBILITY
+\&.\e" This next request is for sections 2, 3 and 9 error
+\&.\e" and signal handling only.
+\&.\e" .Sh ERRORS
+\&.\e" .Sh SEE ALSO
+\&.\e" .Sh STANDARDS
+\&.\e" .Sh HISTORY
+\&.\e" .Sh AUTHORS
+\&.\e" .Sh BUGS
+.Ed
+.Pp
+.
+The first items in the template are the macros
+.Ql .Dd ,
+.Ql .Os ,
+and
+.Ql .Dt ;
+the document date, the operating system the man page or subject source is
+developed or modified for, and the man page title (in
+.Em upper case )
+along with the section of the manual the page belongs in.
+These macros identify the page and are discussed below in
+.Sx TITLE MACROS .
+.Pp
+The remaining items in the template are section headers
+.Pf ( Li .Sh ) ;
+of which
+.Sx NAME ,
+.Sx SYNOPSIS ,
+and
+.Sx DESCRIPTION
+are mandatory.
+The headers are discussed in
+.Sx "PAGE STRUCTURE DOMAIN" ,
+after presentation of
+.Sx "MANUAL DOMAIN" .
+Several content macros are used to demonstrate page layout macros; reading
+about content macros before page layout macros is recommended.
+.
+.
+.Sh CONVENTIONS
+.
+In the description of all macros below, optional arguments are put into
+brackets.
+An ellipsis
+.Pf ( Sq ... )
+represents zero or more additional arguments.
+Alternative values for a parameter are separated with
+.Ql | .
+If there are alternative values for a mandatory parameter, braces are used
+(together with
+.Ql | )
+to enclose the value set.
+Meta-variables are specified within angles.
+.Pp
+Example:
+.
+.Bl -tag -width 6n -offset indent
+.It Li .Xx Xo
+.Aq foo
+.Brq bar1 | bar2
+.Op \-test1 Op \-test2 | \-test3
+.No ...
+.Xc
+.El
+.
+.Pp
+Except stated explicitly, all macros are parsed and callable.
+.Pp
+Most macros have a default width value which can be used to specify a label
+width
+.Pf ( Fl width )
+or offset
+.Pf ( Fl offset )
+for the
+.Ql .Bl
+and
+.Ql .Bd
+macros.
+It is recommended not to use this rather obscure feature to avoid
+dependencies on local modifications of the
+.Nm \-mdoc
+package.
+.
+.
+.Sh "TITLE MACROS"
+.
+The title macros are part of the page structure domain but are presented
+first and separately for someone who wishes to start writing a man page
+yesterday.
+Three header macros designate the document title or manual page title, the
+operating system, and the date of authorship.
+These macros are called once at the very beginning of the document and are
+used to construct headers and footers only.
+.
+.Bl -tag -width 6n
+.It Li .Dt Xo
+.Op Aq document title
+.Op Aq section number
+.Op Aq volume
+.Xc
+The document title is the subject of the man page and must be in
+.Tn CAPITALS
+due to troff limitations.
+If omitted,
+.Sq Tn UNTITLED
+is used.
+The section number may be a number in the range
+.No 1,\~ Ns ... Ns ,\~9
+or
+.Ql unass ,
+.Ql draft ,
+or
+.Ql paper .
+If it is specified, and no volume name is given, a default volume name is
+used.
+.
+.Pp
+Under
+.Tn \*[operating-system] ,
+the following sections are defined:
+.Pp
+.Bl -column LOCAL -offset indent -compact
+.It Li 1 Ta "\*[volume-ds-1]"
+.It Li 2 Ta "\*[volume-ds-2]"
+.It Li 3 Ta "\*[volume-ds-3]"
+.It Li 4 Ta "\*[volume-ds-4]"
+.It Li 5 Ta "\*[volume-ds-5]"
+.It Li 6 Ta "\*[volume-ds-6]"
+.It Li 7 Ta "\*[volume-ds-7]"
+.It Li 8 Ta "\*[volume-ds-8]"
+.It Li 9 Ta "\*[volume-ds-9]"
+.El
+.Pp
+.
+A volume name may be arbitrary or one of the following:
+.
+.Pp
+.Bl -column LOCAL -offset indent -compact
+.It Li USD Ta "\*[volume-ds-USD]"
+.It Li PS1 Ta "\*[volume-ds-PS1]"
+.It Li AMD Ta "\*[volume-ds-AMD]"
+.It Li SMM Ta "\*[volume-ds-SMM]"
+.It Li URM Ta "\*[volume-ds-URM]"
+.It Li PRM Ta "\*[volume-ds-PRM]"
+.It Li KM Ta "\*[volume-ds-KM]"
+.It Li IND Ta "\*[volume-ds-IND]"
+.It Li LOCAL Ta "\*[volume-ds-LOCAL]"
+.It Li CON Ta "\*[volume-ds-CON]"
+.El
+.Pp
+.
+For compatibility,
+.Ql MMI
+can be used for
+.Ql IND ,
+and
+.Ql LOC
+for
+.Ql LOCAL .
+Values from the previous table will specify a new volume name.
+If the third parameter is a keyword designating a computer architecture,
+its value is appended to the volume name as specified by the second
+parameter. By default, the following architecture keywords are defined:
+.
+\# we use `No' to avoid hyphenation
+.Bd -ragged -offset indent
+.No alpha , amiga , arc , arm26 , arm32 , atari , bebox , cobalt , evbsh3 ,
+.No hp300 , hpcmips , i386 , luna68k , m68k , mac68k , macppc , mips ,
+.No mmeye , mvme68k , news68k , newsmips , next68k , ofppc , pc532 , pmax ,
+.No powerpc , prep , sgimips , sh3 , sparc , sparc64 , sun3 , tahoe , vax ,
+.No x68k
+.Ed
+.Pp
+.
+In the following examples, the left (which is identical to the right) and
+the middle part of the manual page header strings are shown.
+.
+.Bd -ragged
+.Bl -tag -xwidth ".Li .Dt\ FOO\ 2\ mac68k" -compact -offset indent
+.It Li ".Dt FOO 7"
+.Ql FOO(7)
+.Ql System Reference Manual
+.It Li ".Dt FOO 2 mac68k"
+.Ql FOO(2)
+.Ql System Programmer's Manual (mac68k Architecture)
+.It Li ".Dt FOO \*[q]\*[q] bar"
+.Ql FOO
+.Ql bar
+.El
+.Ed
+.Pp
+.
+Local, OS-specific additions might be found in the file
+.Pa mdoc.local ;
+look for strings named
+.Ql volume-ds-XXX
+(for the former type) and
+.Ql volume-as-XXX
+(for the latter type);
+.Ql XXX
+then denotes the keyword to be used with the
+.Ql .Dt
+macro.
+.Pp
+This macro is neither callable nor parsed.
+.
+.It Li .Os Xo
+.Op Aq operating system
+.Op Aq release
+.Xc
+If the first parameter is empty,
+the default
+.Sq Tn "\*[operating-system]"
+is used.
+This may be overridden in the local configuration file,
+.Pa mdoc.local .
+In general, the name of the operating system should be the common acronym,
+e.g.\&
+.Tn BSD
+or
+.Tn ATT .
+The release should be the standard release nomenclature for the system
+specified.
+In the following table, the possible second arguments for some predefined
+operating systems are listed.
+Similar to
+.Ql .Dt ,
+local additions might be defined in
+.Pa mdoc.local ;
+look for strings named
+.Ql operating-system-XXX-YYY ,
+where
+.Ql XXX
+is the acronym for the operating system and
+.Ql YYY
+the release ID.
+.
+.Bd -ragged -compact
+.Bl -tag -xwidth ".No FreeBSD" -offset indent
+.It ATT
+7th, 7, III, 3, V, V.2, V.3, V.4
+.It BSD
+3, 4, 4.1, 4.2, 4.3, 4.3t, 4.3T, 4.3r, 4.3R, 4.4
+.It NetBSD
+0.8, 0.8a, 0.9, 0.9a, 1.0, 1.0a, 1.1, 1.2, 1.2a, 1.2b, 1.2c, 1.2d, 1.2e,
+1.3, 1.3a, 1.4, 1.5
+.It FreeBSD
+1.0, 1.1, 1.1.5, 1.1.5.1, 2.0, 2.0.5, 2.1, 2.1.5, 2.1.6, 2.1.7, 2.2, 2.2.1,
+2.2.2, 2.2.5, 2.2.6, 2.2.7, 2.2.8, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 4.0, 4.1,
+4.2, 5.0
+.El
+.Ed
+.Pp
+.
+For
+.Tn ATT ,
+an unknown second parameter will be replaced with the string
+.Tn UNIX ;
+for the other predefined acronyms it will be ignored and a warning message
+emitted.
+Unrecognized arguments are displayed as given in the page footer.
+For instance, a typical footer might be:
+.Pp
+.Dl .Os BSD 4.3
+.Pp
+giving
+.Ql 4.3\~Berkeley Distribution ,
+or for a locally produced set
+.Pp
+.Dl .Os CS Department
+.Pp
+which will produce
+.Ql CS\~Department .
+.Pp
+If the
+.Ql .Os
+macro is not present, the bottom left corner of the manual page will be
+ugly.
+.Pp
+This macro is neither callable nor parsed.
+.
+.It Li .Dd Oo
+.Aq month
+.Aq day ,
+.Aq year
+.Oc
+If
+.Ql Dd
+has no arguments,
+.Ql Epoch
+is used for the date string.
+If it has exactly three arguments, they are concatenated, separated with
+unbreakable space:
+.Pp
+.Dl .Dd January 25, 2001
+.Pp
+Otherwise, the current date is used, ignoring the parameters.
+.Pp
+This macro is neither callable nor parsed.
+.El
+.
+.
+.Sh "INTRODUCTION OF MANUAL AND GENERAL TEXT DOMAINS"
+.
+.Ss "What's in a Name" Ns ...
+.
+The manual domain macro names are derived from the day to day informal
+language used to describe commands, subroutines and related files.
+Slightly different variations of this language are used to describe the
+three different aspects of writing a man page.
+First, there is the description of
+.Nm \-mdoc
+macro request usage.
+Second is the description of a
+.Ux
+command
+.Em with
+.Nm \-mdoc
+macros, and third, the description of a command to a user in the verbal
+sense; that is, discussion of a command in the text of a man page.
+.Pp
+In the first case,
+.Xr troff 1
+macros are themselves a type of command; the general syntax for a troff
+command is:
+.
+.Bd -filled -offset indent
+.Li ".Xx argument1 argument2" ...
+.Ed
+.Pp
+.
+.Ql .Xx
+is a macro command or request, and anything following it are arguments to
+be processed.
+In the second case, the description of a
+.Ux
+command using the content macros is a bit more involved; a typical
+.Sx SYNOPSIS
+command line might be displayed as:
+.
+.Bd -filled -offset indent
+.Nm filter
+.Op Fl flag
+.Ao Ar infile Ac Ao Ar outfile Ac
+.Ed
+.Pp
+.
+Here,
+.Nm filter
+is the command name and the
+bracketed string
+.Fl flag
+is a
+.Em flag
+argument designated as optional by the option brackets.
+In
+.Nm \-mdoc
+terms,
+.Ao Ar infile Ac
+and
+.Ao Ar outfile Ac
+are called
+.Em meta arguments ;
+in this example, the user has to replace the meta expressions given in angle
+brackets with real file names.
+Note that in this document meta arguments are used to describe
+.Nm \-mdoc
+commands; in most man pages, meta variables are not specifically written
+with angle brackets.
+The macros which formatted the above example:
+.
+.Bd -literal -offset indent
+\&.Nm filter
+\&.Op Fl flag
+\&.Ao Ar infile Ac Ao Ar outfile Ac
+.Ed
+.Pp
+.
+In the third case, discussion of commands and command syntax includes both
+examples above, but may add more detail.
+The arguments
+.Ao Ar infile Ac
+and
+.Ao Ar outfile Ac
+from the example above might be referred to as
+.Em operands
+or
+.Em file arguments .
+Some command line argument lists are quite long:
+.
+.Bd -ragged
+.Bl -tag -xwidth ".Nm make" -offset indent -compact
+.It Nm make
+.Op Fl eiknqrstv
+.Op Fl D Ar variable
+.Op Fl d Ar flags
+.Op Fl f Ar makefile
+.Op Fl I Ar directory
+.Op Fl j Ar max_jobs
+.Op Ar variable Ns = Ns Ar value
+.Bk
+.Op Ar target ...
+.Ek
+.El
+.Ed
+.Pp
+.
+Here one might talk about the command
+.Nm make
+and qualify the argument,
+.Ar makefile ,
+as an argument to the flag,
+.Fl f ,
+or discuss the optional file operand
+.Ar target .
+In the verbal context, such detail can prevent confusion, however the
+.Nm \-mdoc
+package does not have a macro for an argument
+.Em to
+a flag.
+Instead the
+.Ql \&Ar
+argument macro is used for an operand or file argument like
+.Ar target
+as well as an argument to a flag like
+.Ar variable .
+The make command line was produced from:
+.
+.Bd -literal -offset indent
+\&.Nm make
+\&.Op Fl eiknqrstv
+\&.Op Fl D Ar variable
+\&.Op Fl d Ar flags
+\&.Op Fl f Ar makefile
+\&.Op Fl I Ar directory
+\&.Op Fl j Ar max_jobs
+\&.Op Ar variable Ns = Ns Ar value
+\&.Bk
+\&.Op Ar target ...
+\&.Ek
+.Ed
+.Pp
+.
+The
+.Ql .Bk
+and
+.Ql .Ek
+macros are explained in
+.Sx Keeps .
+.
+.Ss "General Syntax"
+.
+The manual domain and general text domain macros share a similar syntax with
+a few minor deviations; most notably,
+.Ql .Ar ,
+.Ql .Fl ,
+.Ql .Nm ,
+and
+.Ql .Pa
+differ only when called without arguments; and
+.Ql .Fn
+and
+.Ql .Xr
+impose an order on their argument lists.
+All content macros are capable of recognizing and properly handling
+punctuation, provided each punctuation character is separated by a leading
+space.
+If a request is given:
+.Pp
+.Dl \&.Ar sptr, ptr),
+.Pp
+The result is:
+.Pp
+.Dl Ar sptr, ptr),
+.Pp
+The punctuation is not recognized and all is output in the
+font used by
+.Ql .Ar .
+If the punctuation is separated by a leading white space:
+.Pp
+.Dl \&.Ar "sptr , ptr ) ,"
+.Pp
+The result is:
+.Pp
+.Dl Ar sptr , ptr ) ,
+.Pp
+The punctuation is now recognized and output in the default font
+distinguishing it from the argument strings.
+To remove the special meaning from a punctuation character escape it with
+.Ql \e& .
+.Pp
+.Xr Troff
+is limited as a macro language, and has difficulty when presented with a
+string containing a member of the mathematical, logical or quotation set:
+.
+.Bd -literal -offset indent-two
+{+,\-,/,*,%,<,>,<=,>=,=,==,&,`,',"}
+.Ed
+.Pp
+.
+The problem is that
.Xr troff
-formatting packages.
-.Sh PAGE STRUCTURE DOMAIN
-.Ss Title Macros
-To create a valid manual page, these three macros, in this order,
-are required:
-.Bl -tag -width "xxxx.Os OPERATINGxSYSTEM [version/release]" -compact
-.It Li "\&.Dd " Ar "Month day, year"
-Document date.
-.It Li "\&.Dt " Ar "DOCUMENT_TITLE [section] [volume]"
-Title, in upper case.
-.It Li "\&.Os " Ar "OPERATING_SYSTEM [version/release]"
-Operating system
-.Pq Tn BSD .
-.El
-.Ss Page Layout Macros
-Section headers, paragraph breaks, lists and displays.
+may assume it is supposed to actually perform the operation or evaluation
+suggested by the characters.
+To prevent the accidental evaluation of these characters, escape them with
+.Ql \e& .
+Typical syntax is shown in the first content macro displayed below,
+.Ql .Ad .
+.
+.
+.Sh "MANUAL DOMAIN"
+.
+.Ss Addresses
+.
+The address macro identifies an address construct.
+.Pp
+.Dl Usage: .Ad Ao address Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Ad\ f1\ ,\ f2\ ,\ f3\ :" -compact -offset 15n
+.It Li ".Ad addr1"
+.Ad addr1
+.It Li ".Ad addr1 ."
+.Ad addr1 .
+.It Li ".Ad addr1 , file2"
+.Ad addr1 , file2
+.It Li ".Ad f1 , f2 , f3 :"
+.Ad f1 , f2 , f3 :
+.It Li ".Ad addr ) ) ,"
+.Ad addr ) ) ,
+.El
+.Pp
+.
+The default width is 12n.
+.
+.Ss "Author Name"
+.
+The
+.Ql .An
+macro is used to specify the name of the author of the item being
+documented, or the name of the author of the actual manual page.
+.Pp
+.Dl Usage: .An Ao author name Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .An\ \*[q]Joe\ Author\*[q]\ )\ )\ ," -offset 15n
+.It Li ".An \*[q]Joe Author\*[q]"
+.An "Joe Author"
+.It Li ".An \*[q]Joe Author\*[q] ,"
+.An "Joe Author" ,
+.It Li ".An \*[q]Joe Author\*[q] Aq nobody@FreeBSD.org"
+.An "Joe Author" Aq nobody@FreeBSD.org
+.It Li ".An \*[q]Joe Author\*[q] ) ) ,"
+.An "Joe Author" ) ) ,
+.El
+.Pp
+.
+The default width is 12n.
+.Pp
+In the
+.Sx AUTHORS
+section, the
+.Ql .An
+request causes a line break allowing each new name to appear on its own
+line.
+If this is not desirable,
+.
+.Bd -literal -offset indent
+\&.An -nosplit
+.Ed
+.Pp
+.
+call will turn this off.
+To turn splitting back on, write
+.
+.Bd -literal -offset indent
+\&.An -split
+.Ed
+.
+.Ss "Arguments"
+.
+The
+.Li .Ar
+argument macro may be used whenever an argument is referenced.
+If called without arguments, the
+.Sq Ar
+string is output.
+.Pp
+.Dl Usage: .Ar Oo Ao argument Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Ar\ file1\ file2" -compact -offset 15n
+.It Li .Ar
+.Ar
+.It Li ".Ar file1"
+.Ar file1
+.It Li ".Ar file1 ."
+.Ar file1 .
+.It Li ".Ar file1 file2"
+.Ar file1 file2
+.It Li ".Ar f1 f2 f3 :"
+.Ar f1 f2 f3 :
+.It Li ".Ar file ) ) ,"
+.Ar file ) ) ,
+.El
+.Pp
+.
+The default width is 12n.
+.
+.Ss "Configuration Declaration (Section Four Only)"
+.
+The
+.Ql .Cd
+macro is used to demonstrate a
+.Xr config 8
+declaration for a device interface in a section four manual.
+.Pp
+.Dl Usage: .Cd Ao argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Cd\ Xdevice\ le0\ at\ scode?X" -offset 15n
+.It Li ".Cd \*[q]device le0 at scode?\*[q]"
+.Cd "device le0 at scode?"
+.El
+.Pp
+In the
+.Sx SYNOPSIS
+section a
+.Ql .Cd
+request causes a line break before and after its arguments are printed.
+.Pp
+.
+The default width is 12n.
+.
+.Ss "Command Modifiers"
+.
+The command modifier is identical to the
+.Ql .Fl
+(flag) command with the exception that the
+.Ql .Cm
+macro does not assert a dash in front of every argument.
+Traditionally flags are marked by the preceding dash, however, some commands
+or subsets of commands do not use them.
+Command modifiers may also be specified in conjunction with interactive
+commands such as editor commands.
+See
+.Sx Flags .
+.Pp
+The default width is 10n.
+.
+.Ss "Defined Variables"
+.
+A variable (or constant) which is defined in an include file
+is specified by the macro
+.Ql .Dv .
+.Pp
+.Dl Usage: .Dv Ao defined variable Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Dv\ MAXHOSTNAMELEN" -compact -offset 15n
+.It Li ".Dv MAXHOSTNAMELEN"
+.Dv MAXHOSTNAMELEN
+.It Li ".Dv TIOCGPGRP )"
+.Dv TIOCGPGRP )
+.El
+.Pp
+.
+The default width is 12n.
+.
+.Ss Errno's
+.
+The
+.Ql .Er
+errno macro specifies the error return value for section 2, 3, and\~9 library
+routines.
+The second example below shows
+.Ql .Er
+used with the
+.Ql .Bq
+general text domain macro, as it would be used in a section two manual page.
+.Pp
+.Dl Usage: .Er Ao errno type Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Bq\ Er\ ENOTDIR" -compact -offset 15n
+.It Li ".Er ENOENT"
+.Er ENOENT
+.It Li ".Er ENOENT ) ;"
+.Er ENOENT ) ;
+.It Li ".Bq Er ENOTDIR"
+.Bq Er ENOTDIR
+.El
+.Pp
+.
+The default width is 17n.
+.
+.Ss "Environment Variables"
+.
+The
+.Ql .Ev
+macro specifies an environment variable.
+.Pp
+.Dl Usage: .Ev Ao argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Ev\ PRINTER\ )\ )\ ," -compact -offset 15n
+.It Li ".Ev DISPLAY"
+.Ev DISPLAY
+.It Li ".Ev PATH ."
+.Ev PATH .
+.It Li ".Ev PRINTER ) ) ,"
+.Ev PRINTER ) ) ,
+.El
+.Pp
+.
+The default width is 15n.
+.
+.Ss Flags
+.
+The
+.Ql .Fl
+macro handles command line flags.
+It prepends a dash,
+.Ql \- ,
+to the flag.
+For interactive command flags, which are not prepended with a dash, the
+.Ql .Cm
+(command modifier)
+macro is identical, but without the dash.
+.Pp
+.Dl Usage: .Fl Ao argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Fl\ xyz\ )\ ," -compact -offset 15n
+.It Li .Fl
+.Fl
+.It Li ".Fl cfv"
+.Fl cfv
+.It Li ".Fl cfv ."
+.Fl cfv .
+.It Li ".Cm cfv ."
+.Cm cfv .
+.It Li ".Fl s v t"
+.Fl s v t
+.It Li ".Fl \- ,"
+.Fl \- ,
+.It Li ".Fl xyz ) ,"
+.Fl xyz ) ,
+.It Li ".Fl |"
+.Fl |
+.El
+.Pp
+The
+.Ql .Fl
+macro without any arguments results in a dash representing stdin/stdout.
+Note that giving
+.Ql .Fl
+a single dash will result in two dashes.
+.Pp
+The default width is 12n.
+.
+.Ss "Function Declarations"
+.
+The
+.Ql .Fd
+macro is used in the
+.Sx SYNOPSIS
+section with section two or three functions.
+It is neither callable nor parsed.
+.Pp
+.Dl Usage: .Fd Ao argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Fd\ X#include\ <sys/types.h>X" -compact -offset 15n
+.It Li ".Fd \*[q]#include <sys/types.h>\*[q]"
+.Fd "#include <sys/types.h>"
+.El
+.Pp
+In the
+.Sx SYNOPSIS
+section a
+.Ql .Fd
+request causes a line break if a function has already been presented and a
+break has not occurred.
+This leaves a nice vertical space in between the previous function call and
+the declaration for the next function.
+.
+.Pp
+The
+.Ql .In
+.Li ( #include
+statement)
+macro is the short form of the above example.
+It specifies the C\~header file as being included in a C\~program.
+It also causes a line break, and is neither callable nor parsed.
+.Pp
+.Dl Usage: .In Ao header file Ac
+.Pp
+.Bl -tag -xwidth ".Li .In\ stdio.h" -compact -offset 15n
+.It Li ".In stdio.h"
+.In stdio.h
+.El
+.
+.Ss "Function Types"
+.
+This macro is intended for the
+.Sx SYNOPSIS
+section.
+It may be used anywhere else in the man page without problems, but its main
+purpose is to present the function type in kernel normal form for the
+.Sx SYNOPSIS
+of sections two and three (it causes a line break, allowing the function
+name to appear on the next line).
+.Pp
+.Dl Usage: .Ft Ao type Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Ft\ struct\ stat" -compact -offset 15n
+.It Li ".Ft struct stat"
+.Ft struct stat
+.El
+.
+.Ss "Functions (Library Routines)"
+.
+The
+.Ql .Fn
+macro is modeled on
+.Tn ANSI\~C
+conventions.
+.Pp
+.Dl Usage: .Fn Ao function Ac Oo Ao parameter Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Fn\ align\ Xchar\ *ptrX\ ," -compact -offset 15n
+.It Li ".Fn getchar"
+.Fn getchar
+.It Li ".Fn strlen ) ,"
+.Fn strlen ) ,
+.It Li ".Fn align \*[q]char *ptr\*[q] ,"
+.Fn align "char *ptr" ,
+.El
+.Pp
+Note that any call to another macro signals the end of the
+.Ql .Fn
+call (it will insert a closing parenthesis at that point).
+.Pp
+For functions with many parameters (which is rare), the macros
+.Ql .Fo
+(function open)
+and
+.Ql .Fc
+(function close)
+may be used with
+.Ql .Fa
+(function argument).
+.Pp
+Example:
+.
+.Bd -literal -offset indent
+\&.Ft int
+\&.Fo res_mkquery
+\&.Fa "int op"
+\&.Fa "char *dname"
+\&.Fa "int class"
+\&.Fa "int type"
+\&.Fa "char *data"
+\&.Fa "int datalen"
+\&.Fa "struct rrec *newrr"
+\&.Fa "char *buf"
+\&.Fa "int buflen"
+\&.Fc
+.Ed
+.Pp
+.
+Produces:
+.
+.Bd -ragged -offset indent
+.Ft int
+.Fo res_mkquery
+.Fa "int op"
+.Fa "char *dname"
+.Fa "int class"
+.Fa "int type"
+.Fa "char *data"
+.Fa "int datalen"
+.Fa "struct rrec *newrr"
+.Fa "char *buf"
+.Fa "int buflen"
+.Fc
+.Ed
+.Pp
+.
+In the
+.Sx SYNOPSIS
+section, the function will always begin at the beginning of line.
+If there is more than one function presented in the
+.Sx SYNOPSIS
+section and a function type has not been given, a line break will occur,
+leaving a nice vertical space between the current function name and the one
+prior.
+.Pp
+The default width values of
+.Ql .Fn
+and
+.Ql .Fo
+are 12n and 16n, respectively.
+.
+.Ss "Function Arguments"
+.
+The
+.Ql .Fa
+macro is used to refer to function arguments (parameters) outside of the
+.Sx SYNOPSIS
+section of the manual or inside the
+.Sx SYNOPSIS
+section if the enclosure macros
+.Ql .Fo
+and
+.Ql .Fc
+instead of
+.Ql .Fn
+are used.
+.Ql .Fa
+may also be used to refer to structure members.
+.Pp
+.Dl Usage: .Fa Ao function argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Fa\ d_namlen\ )\ )\ ," -compact -offset 15n
+.It Li ".Fa d_namlen ) ) ,"
+.Fa d_namlen ) ) ,
+.It Li ".Fa iov_len"
+.Fa iov_len
+.El
+.Pp
+.
+The default width is 12n.
+.
+.Ss "Return Values"
+.
+The
+.Ql .Rv
+macro generates text for use in the
+.Sx RETURN VALUES
+section.
+.Pp
+.Dl Usage: .Rv Oo -std Oc Ao function Ac ...
+.Pp
+For example,
+.Ql ".Rv -std atexit"
+produces:
+.
+.Bd -ragged -offset -indent
+\# a small hack to suppress a warning message
+.ds section-old "\*[section]
+.ds section 2
+.Rv -std atexit
+.ds section "\*[section-old]
+.Ed
+.Pp
+.
+The
+.Fl std
+option is valid only for manual page sections\~2 and\~3.
+Currently, this macro does nothing if used without the
+.Fl std
+flag.
+.
+.Ss "Interactive Commands"
+.
+The
+.Ql .Ic
+macro designates an interactive or internal command.
+.Pp
+.Dl Usage: .Ic Ao argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Ic\ setenv\ ,\ unsetenv" -compact -offset 15n
+.It Li ".Ic :wq"
+.Ic :wq
+.It Li ".Ic \*[q]do while {...}\*[q]"
+.Ic "do while {...}"
+.It Li ".Ic setenv , unsetenv"
+.Ic setenv , unsetenv
+.El
+.Pp
+.
+The default width is 12n.
+.
+.Ss "Library Names"
+.
+The
+.Ql .Lb
+macro is used to specify the library where a particular function is compiled
+in.
+.Pp
+.Dl Usage: .Lb Ao argument Ac ...
+.Pp
+Available arguments to
+.Ql .Lb
+and their results are:
+.
+.Pp
+.Bl -tag -xwidth ".Li libossaudio" -compact -offset indent
+.It Li libarm32
+.Lb libarm32
+.It Li libc
+.Lb libc
+.It Li libcompat
+.Lb libcompat
+.It Li libcrypt
+.Lb libcrypt
+.It Li libcurses
+.Lb libcurses
+.It Li libedit
+.Lb libedit
+.It Li libi386
+.Lb libi386
+.It Li libipsec
+.Lb libipsec
+.It Li libkvm
+.Lb libkvm
+.It Li libm
+.Lb libm
+.It Li libmenu
+.Lb libmenu
+.It Li libossaudio
+.Lb libossaudio
+.It Li libposix
+.Lb libposix
+.It Li libresolv
+.Lb libresolv
+.It Li libtermcap
+.Lb libtermcap
+.It Li libutil
+.Lb libutil
+.It Li libz
+.Lb libz
+.El
+.Pp
+.
+Local, OS-specific additions might be found in the file
+.Pa mdoc.local ;
+look for strings named
+.Ql str-Lb-XXX .
+.Ql XXX
+then denotes the keyword to be used with the
+.Ql .Lb
+macro.
+.
+.Ss Literals
+.
+The
+.Ql .Li
+literal macro may be used for special characters, variable constants, etc.\&
+-- anything which should be displayed as it would be typed.
+.Pp
+.Dl Usage: .Li Ao argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Li\ cntrl-D\ )\ ," -compact -offset 15n
+.It Li ".Li \een"
+.Li \en
+.It Li ".Li M1 M2 M3 ;"
+.Li M1 M2 M3 ;
+.It Li ".Li cntrl-D ) ,"
+.Li cntrl-D ) ,
+.It Li ".Li 1024 ..."
+.Li 1024 ...
+.El
+.Pp
+.
+The default width is 16n.
+.
+.Ss Names
+.
+The
+.Ql .Nm
+macro is used for the document title or subject name.
+It has the peculiarity of remembering the first argument it was called with,
+which should always be the subject name of the page.
+When called without arguments,
+.Ql .Nm
+regurgitates this initial name for the sole purpose of making less work for
+the author.
+Note: A section two or three document function name is addressed with the
+.Ql .Nm
+in the
+.Sx NAME
+section, and with
+.Ql .Fn
+in the
+.Sx SYNOPSIS
+and remaining sections.
+For interactive commands, such as the
+.Ql while
+command keyword in
+.Xr csh 1 ,
+the
+.Ql .Ic
+macro should be used.
+While
+.Ql .Ic
+is nearly identical
+to
+.Ql .Nm ,
+it can not recall the first argument it was invoked with.
+.Pp
+.Dl Usage: .Nm Oo Ao argument Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Nm\ groff_mdoc" -compact -offset 15n
+.It Li ".Nm groff_mdoc"
+.Nm groff_mdoc
+.It Li ".Nm \e-mdoc"
+.Nm \-mdoc
+.It Li ".Nm foo ) ) ,"
+.Nm foo ) ) ,
+.It Li ".Nm :"
+.Nm :
+.El
+.Pp
+.
+The default width is 10n.
+.
+.Ss Options
+.
+The
+.Ql .Op
+macro places option brackets around any remaining arguments on the
+command line, and places any trailing punctuation outside the brackets.
+The macros
+.Ql .Oo
+and
+.Ql .Oc
+(which produce an opening and a closing option bracket respectively) may be used
+across one or more lines or to specify the exact position of the closing
+parenthesis.
+.Pp
+.Dl Usage: .Op Oo Ao option Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Op\ Fl\ c\ Ar\ objfil\ Op\ Ar\ corfil\ ," -compact -offset 15n
+.It Li .Op
+.Op
+.It Li ".Op Fl k"
+.Op Fl k
+.It Li ".Op Fl k ) ."
+.Op Fl k ) .
+.It Li ".Op Fl k Ar kookfile"
+.Op Fl k Ar kookfile
+.It Li ".Op Fl k Ar kookfile ,"
+.Op Fl k Ar kookfile ,
+.It Li ".Op Ar objfil Op Ar corfil"
+.Op Ar objfil Op Ar corfil
+.It Li ".Op Fl c Ar objfil Op Ar corfil ,"
+.Op Fl c Ar objfil Op Ar corfil ,
+.It Li ".Op word1 word2"
+.Op word1 word2
+.It Li ".Li .Op Oo Ao option Ac Oc ..."
+.Li .Op Oo Ao options Ac Oc ...
+.El
+.Pp
+Here a typical example of the
+.Ql .Oo
+and
+.Ql .Oc
+macros:
+.
+.Bd -literal -offset indent
+\&.Oo
+\&.Op Fl k Ar kilobytes
+\&.Op Fl i Ar interval
+\&.Op Fl c Ar count
+\&.Oc
+.Ed
+.Pp
+.
+Produces:
+.
+.Bd -filled -offset indent
+.Oo
+.Op Fl k Ar kilobytes
+.Op Fl i Ar interval
+.Op Fl c Ar count
+.Oc
+.Ed
+.Pp
+.
+The default width values of
+.Ql .Op
+and
+.Ql .Oo
+are 14n and 10n, respectively.
+.
+.Ss Pathnames
+.
+The
+.Ql .Pa
+macro formats path or file names.
+If called without arguments, the
+.Sq Pa
+string is output, which represents the current user's home directory.
+.Pp
+.Dl Usage: .Pa Oo Ao pathname Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Pa\ /tmp/fooXXXXX\ )\ ." -compact -offset 15n
+.It Li .Pa
+.Pa
+.It Li ".Pa /usr/share"
+.Pa /usr/share
+.It Li ".Pa /tmp/fooXXXXX ) ."
+.Pa /tmp/fooXXXXX ) .
+.El
+.Pp
+.
+The default width is 32n.
+.
+.Ss Standards
+.
+The
+.Ql .St
+macro replaces standard abbreviations with their formal names.
+.Pp
+.Dl Usage: .St Ao abbreviation Ac ...
+.Pp
+Available pairs for
+.Dq Abbreviation/Formal Name
+are:
+.
+.Pp
+.Tn ANSI/ISO C
+.Pp
+.Bl -tag -xwidth ".Li -iso9945-1-90" -compact -offset indent
+.It Li -ansiC
+.St -ansiC
+.It Li -ansiC-89
+.St -ansiC-89
+.It Li -isoC
+.St -isoC
+.It Li -isoC-99
+.St -isoC-99
+.El
+.Pp
+.
+.Tn POSIX
+Part 1: System API
+.Pp
+.Bl -tag -xwidth ".Li -p1003.1g-2000" -compact -offset indent
+.It Li -iso9945-1-90
+.St -iso9945-1-90
+.It Li -iso9945-1-96
+.St -iso9945-1-96
+.It Li -p1003.1
+.St -p1003.1
+.It Li -p1003.1-88
+.St -p1003.1-88
+.It Li -p1003.1-90
+.St -p1003.1-90
+.It Li -p1003.1-96
+.St -p1003.1-96
+.It Li -p1003.1b-93
+.St -p1003.1b-93
+.It Li -p1003.1c-95
+.St -p1003.1c-95
+.It Li -p1003.1g-2000
+.St -p1003.1g-2000
+.It Li -p1003.1i-95
+.St -p1003.1i-95
+.El
+.Pp
+.
+.Tn POSIX
+Part 2: Shell and Utilities
+.Pp
+.Bl -tag -xwidth ".Li -p1003.1g-2000" -compact -offset indent
+.It Li -iso9945-2-93
+.St -iso9945-2-93
+.It Li -p1003.2
+.St -p1003.2
+.It Li -p1003.2-92
+.St -p1003.2-92
+.It Li -p1003.2a-92
+.St -p1003.2a-92
+.El
+.Pp
+.
+X/Open
+.Bl -tag -xwidth ".Li -p1003.1g-2000" -compact -offset indent
+.Pp
+.It Li -susv2
+.St -susv2
+.It Li -svid4
+.St -svid4
+.It Li -xbd5
+.St -xbd5
+.It Li -xcu5
+.St -xcu5
+.It Li -xcurses4.2
+.St -xcurses4.2
+.It Li -xns5
+.St -xns5
+.It Li -xns5.2
+.St -xns5.2
+.It Li -xpg3
+.St -xpg3
+.It Li -xpg4
+.St -xpg4
+.It Li -xpg4.2
+.St -xpg4.2
+.It Li -xsh5
+.St -xsh5
+.El
+.Pp
+.
+Miscellaneous
+.Pp
+.Bl -tag -xwidth ".Li -p1003.1g-2000" -compact -offset indent
+.It Li -ieee754
+.St -ieee754
+.It Li -iso8802-3
+.St -iso8802-3
+.El
+.
+.Ss "Variable Types"
+.
+The
+.Ql .Vt
+macro may be used whenever a type is referenced.
+In the
+.Sx SYNOPSIS
+section, it causes a line break (useful for old style variable declarations).
+.Pp
+.Dl Usage: .Vt Ao type Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Vt\ extern\ char\ *optarg\ ;" -compact -offset 15n
+.It Li ".Vt extern char *optarg ;"
+.Vt extern char *optarg ;
+.It Li ".Vt FILE *"
+.Vt FILE *
+.El
+.
+.Ss Variables
+.
+Generic variable reference.
+.Pp
+.Dl Usage: .Va Ao variable Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Va\ Xchar\ sX\ ]\ )\ )\ ," -compact -offset 15n
+.It Li ".Va count"
+.Va count
+.It Li ".Va settimer ,"
+.Va settimer ,
+.It Li ".Va \*[q]int *prt\*[q] ) :"
+.Va "int *prt" ) :
+.It Li ".Va \*[q]char s\*[q] ] ) ) ,"
+.Va "char s" ] ) ) ,
+.El
+.Pp
+.
+The default width is 12n.
+.
+.Ss "Manual Page Cross References"
+.
+The
+.Ql .Xr
+macro expects the first argument to be a manual page name.
+The optional second argument, if a string (defining the manual section), is
+put into parentheses.
+.Pp
+.Dl Usage: .Xr Ao man page name Ac Oo Ao section Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Xr\ xinit\ 1x\ ;" -compact -offset 15n
+.It Li ".Xr mdoc"
+.Xr mdoc
+.It Li ".Xr mdoc ,"
+.Xr mdoc ,
+.It Li ".Xr mdoc 7"
+.Xr mdoc 7
+.It Li ".Xr xinit 1x ;"
+.Xr xinit 1x ;
+.El
+.Pp
+.
+The default width is 10n.
+.
+.
+.Sh "GENERAL TEXT DOMAIN"
+.
+.Ss "AT&T Macro"
+.
+.Pp
+.Dl Usage: .At Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .At\ v6\ ." -compact -offset 15n
+.It Li .At
+.At
+.It Li ".At v6 ."
+.At v6 .
+.El
+.Pp
+The following values for
+.Ao version Ac
+are possible:
+.Pp
+.Dl 32v, v1, v2, v3, v4, v5, v6, v7, V, V.1, V.2, V.3, V.4
+.
+.Ss "BSD Macro"
+.
+.Pp
+.Dl "Usage: .Bx" Bro -alpha | -beta | -devel Brc ...
+.Dl " .Bx" Oo Ao version Ac Oo Ao release Ac Oc Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Bx\ -devel" -compact -offset 15n
+.It Li .Bx
+.Bx
+.It Li ".Bx 4.3 ."
+.Bx 4.3 .
+.It Li ".Bx \-devel"
+.Bx -devel
+.El
+.Pp
+.Ao version Ac
+will be prepended to the string
+.Sq Bx .
+The following values for
+.Ao release Ac
+are possible:
+.Pp
+.Dl Reno, reno, Tahoe, tahoe, Lite, lite, Lite2, lite2
+.
+.Ss "NetBSD Macro"
+.
+.Pp
+.Dl Usage: .Nx Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Nx\ 1.4\ ." -compact -offset 15n
+.It Li .Nx
+.Nx
+.It Li ".Nx 1.4 ."
+.Nx 1.4 .
+.El
+.Pp
+For possible values of
+.Ao version Ac
+see the description of the
+.Ql .Os
+request above in section
+.Sx "TITLE MACROS" .
+.
+.Ss "FreeBSD Macro"
+.
+.Pp
+.Dl Usage: .Fx Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Fx\ 2.2\ ." -compact -offset 15n
+.It Li .Fx
+.Fx
+.It Li ".Fx 2.2 ."
+.Fx 2.2 .
+.El
+.Pp
+For possible values of
+.Ao version Ac
+see the description of the
+.Ql .Os
+request above in section
+.Sx "TITLE MACROS" .
+.
+.Ss "OpenBSD Macro"
+.
+.Pp
+.Dl Usage: .Ox Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Ox\ 1.0" -compact -offset 15n
+.It Li ".Ox 1.0"
+.Ox 1.0
+.El
+.
+.Ss "BSD/OS Macro"
+.
+.Pp
+.Dl Usage: .Bsx Oo Ao version Ac Oc ...
+.Pp
+.Bl -tag -xwidth ".Li .Bsx\ 1.0" -compact -offset 15n
+.It Li ".Bsx 1.0"
+.Bsx 1.0
+.El
+.
+.Ss "UNIX Macro"
+.
+.Pp
+.Dl Usage: .Ux ...
+.Pp
+.Bl -tag -xwidth ".Li .Ux" -compact -offset 15n
+.It Li .Ux
+.Ux
+.El
+.
+.Ss "Emphasis Macro"
+.
+Text may be stressed or emphasized with the
+.Ql .Em
+macro.
+The usual font for emphasis is italic.
+.Pp
+.Dl Usage: .Em Ao argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Em\ vide\ infra\ )\ )\ ," -compact -offset 15n
+.It Li ".Em does not"
+.Em does not
+.It Li ".Em exceed 1024 ."
+.Em exceed 1024 .
+.It Li ".Em vide infra ) ) ,"
+.Em vide infra ) ) ,
+.El
+.Pp
+.
+The default width is 10n.
+.
+.Ss "Font Mode"
+.
+The
+.Ql .Bf
+font mode must be ended with the
+.Ql .Ef
+macro (the latter takes no arguments).
+Font modes may be nested within other font modes.
+.Pp
+.Ql .Bf
+has the following syntax:
+.Pp
+.Dl .Bf Ao font mode Ac
+.Pp
+.Ao font mode Ac
+must be one of the following three types:
+.Pp
+.Bl -tag -xwidth ".Sy \&Sy | Fl symbolic" -compact -offset indent
+.It Sy \&Em | Fl emphasis
+Same as if the
+.Ql .Em
+macro was used for the entire block of text.
+.It Sy \&Li | Fl literal
+Same as if the
+.Ql .Li
+macro was used for the entire block of text.
+.It Sy \&Sy | Fl symbolic
+Same as if the
+.Ql .Sy
+macro was used for the entire block of text.
+.El
+.Pp
+Both macros are neither callable nor parsed.
+.
+.Ss "Enclosure and Quoting Macros"
+.
+The concept of enclosure is similar to quoting.
+The object being to enclose one or more strings between a pair of characters
+like quotes or parentheses.
+The terms quoting and enclosure are used interchangeably throughout this
+document.
+Most of the one-line enclosure macros end in small letter
+.Ql q
+to give a hint of quoting, but there are a few irregularities.
+For each enclosure macro there is also a pair of open and close macros which
+end in small letters
+.Ql o
+and
+.Ql c
+respectively.
+.Pp
+\# XXX
+.if t \
+. ne 10
+.
+.Bd -filled -offset 4n
+.Bl -column "quote" "close" "open" "Angle Bracket Enclosure" "`string' or string"
+.Em Quote Ta Em Open Ta Em Close Ta Em Function Ta Em Result
+.No .Aq Ta .Ao Ta .Ac Ta "Angle Bracket Enclosure" Ta Ao string Ac
+.No .Bq Ta .Bo Ta .Bc Ta "Bracket Enclosure" Ta Bo string Bc
+.No .Brq Ta .Bro Ta .Brc Ta "Brace Enclosure" Ta Bro string Brc
+.No .Dq Ta .Do Ta .Dc Ta "Double Quote" Ta Do string Dc
+.No .Eq Ta .Eo Ta .Ec Ta "Enclose String (in XX)" Ta XXstringXX
+.No .Pq Ta .Po Ta .Pc Ta "Parenthesis Enclosure" Ta Po string Pc
+.No .Ql Ta Ta Ta "Quoted Literal" Ta So string Sc or Li string
+.No .Qq Ta .Qo Ta .Qc Ta "Straight Double Quote" Ta Qo string Qc
+.No .Sq Ta .So Ta .Sc Ta "Single Quote" Ta So string Sc
+.El
+.Ed
+.Pp
+All macros ending with
+.Sq q
+and
+.Sq o
+have a default width value of 12n.
+.
+.Bl -tag -xwidth ".Li .Ec , .Eo"
+.It Li .Eo , .Ec
+These macros expect the first argument to be the opening and closing strings
+respectively.
+.It Li .Es , .En
+Due to the nine-argument limit in the original troff program two other
+macros have been implemented which are now rather obsolete:
+.Ql .Es
+takes the first and second parameter as the left and right enclosure string,
+which are then used to enclose the arguments of
+.Ql .En .
+The default width value is 12n for both macros.
+.It Li .Eq
+The first and second arguments of this macro are the opening and
+closing strings respectively, followed by the arguments to be enclosed.
+.It Li .Ql
+The quoted literal macro behaves differently in troff and nroff mode.
+If formatted with
+.Xr nroff ,
+a quoted literal is always quoted.
+If formatted with troff, an item is only quoted if the width of the item is
+less than three constant width characters.
+This is to make short strings more visible where the font change to literal
+(constant width) is less noticeable.
+.Pp
+The default width is 16n.
+.It Li .Pf
+The prefix macro suppresses the whitespace between its first and second
+argument:
+.
+.Bl -tag -xwidth ".Li .Pf\ (\ Fa\ name2" -offset indent
+.It Li ".Pf ( Fa name2"
+.Pf ( Fa name2
+.El
+.Pp
+.
+The default width is 12n.
+.Pp
+The
+.Ql .Ns
+macro (see below) performs the analogous suffix function.
+.It Li .Ap
+The
+.Ql .Ap
+macro inserts an apostrophe and exits any special text modes, continuing in
+.Ql .No
+mode.
+.El
+.Pp
+.
+Examples of quoting:
+.
+.Pp
+.Bl -tag -xwidth ".Li .Bq\ Em\ Greek\ ,\ French\ ." -compact -offset indent
+.It Li .Aq
+.Aq
+.It Li ".Aq Pa ctype.h ) ,"
+.Aq Pa ctype.h ) ,
+.It Li .Bq
+.Bq
+.It Li ".Bq Em Greek , French ."
+.Bq Em Greek , French .
+.It Li .Dq
+.Dq
+.It Li ".Dq string abc ."
+.Dq string abc .
+.It Li ".Dq \'^[A-Z]\'"
+.Dq \'^[A-Z]\'
+.It Li ".Ql man mdoc"
+.Ql man mdoc
+.It Li .Qq
+.Qq
+.It Li ".Qq string ) ,"
+.Qq string ) ,
+.It Li ".Qq string Ns ),"
+.Qq string Ns ),
+.It Li .Sq
+.Sq
+.It Li ".Sq string"
+.Sq string
+.It Li ".Em or Ap ing"
+.Em or Ap ing
+.El
+.Pp
+.
+For a good example of nested enclosure macros, see the
+.Ql .Op
+option macro.
+It was created from the same underlying enclosure macros as those presented
+in the list above.
+The
+.Ql .Xo
+and
+.Ql .Xc
+extended argument list macros are discussed below.
+.
+.Ss "No-Op or Normal Text Macro"
+.
+The
+.Ql .No
+macro can be used in a macro command line for parameters which should
+.Em not
+be formatted.
+Be careful to add
+.Ql \e&
+to the word
+.Ql \&No
+if you really want that English word (and not the macro) as a parameter.
+.Pp
+.Dl Usage: .No Ao argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .No\ test\ Ta\ with\ Ta\ tabs" -compact -offset 15n
+.It Li ".No test Ta with Ta tabs"
+.No test Ta with Ta tabs
+.El
+.Pp
+.
+The default width is 12n.
+.
+.Ss "No-Space Macro"
+.
+The
+.Ql .Ns
+macro suppresses insertion of a space between the current position and its
+first parameter.
+For example, it is useful for old style argument lists where there is no
+space between the flag and argument:
+.Pp
+.Dl "Usage:" ... Ao argument Ac \&Ns Oo Ao argument Ac Oc ...
+.Dl " " .Ns Ao argument Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Op\ Fl\ I\ Ns\ Ar\ directory" -compact -offset 15n
+.It Li ".Op Fl I Ns Ar directory"
+.Op Fl I Ns Ar directory
+.El
+.Pp
+Note: The
+.Ql .Ns
+macro always invokes the
+.Ql .No
+macro after eliminating the space unless another macro name follows it.
+If used as a request (i.e., the second form above in the
+.Sq Usage
+line,
+.Ql .Ns
+is identical to
+.Ql .No .
+.
+.Ss "Section Cross References"
+.
+The
+.Ql .Sx
+macro designates a reference to a section header within the same document.
+.Pp
+.Dl Usage: .Sx Ao section reference Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Sx\ FILES" -offset 15n
+.It Li ".Sx FILES"
+.Sx FILES
+.El
+.Pp
+.
+The default width is 16n.
+.
+.Ss Symbolics
+.
+The symbolic emphasis macro is generally a boldface macro in either the
+symbolic sense or the traditional English usage.
+.Pp
+.Dl Usage: .Sy Ao symbol Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Sy\ Important\ Notice" -compact -offset 15n
+.It Li ".Sy Important Notice"
+.Sy Important Notice
+.El
+.Pp
+.
+The default width is 6n.
+.
+.Ss Mathematical Symbols
+.
+Use this macro for mathematical symbols and similar things.
+.Pp
+.Dl Usage: .Ms Ao math symbol Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Ms\ sigma" -compact -offset 15n
+.It Li ".Ms sigma"
+.Ms sigma
+.El
+.Pp
+.
+The default width is 6n.
+.
+.Ss "References and Citations"
+.
+The following macros make a modest attempt to handle references.
+At best, the macros make it convenient to manually drop in a subset of
+.Xr refer 1
+style references.
+.Pp
+.Bl -tag -width 6n -offset indent -compact
+.It Li .Rs
+Reference start (does not take arguments).
+Causes a line break in the
+.Sx "SEE ALSO"
+section and begins collection of reference information until the reference
+end macro is read.
+.It Li .Re
+Reference end (does not take arguments).
+The reference is printed.
+.It Li .%A
+Reference author name; one name per invocation.
+.It Li .%B
+Book title.
+.It Li .%C
+City/place (not implemented yet).
+.It Li .%D
+Date.
+.It Li .%I
+Issuer/publisher name.
+.It Li .%J
+Journal name.
+.It Li .%N
+Issue number.
+.It Li .%O
+Optional information.
+.It Li .%P
+Page number.
+.It Li .%Q
+Corporate or foreign author.
+.It Li .%R
+Report name.
+.It Li .%T
+Title of article.
+.It Li .%V
+Volume.
+.El
+.Pp
+Macros beginning with
+.Ql %
+are not callable but accept multiple arguments in the usual way.
+Only the
+.Ql .Tn
+macro is handled properly as a parameter; other macros will cause strange
+output.
+.Ql .%B
+and
+.Ql .%T
+can be used outside of the
+.Ql .Rs/.Re
+environment.
+.Pp
+Example:
+.
+.Bd -literal -offset indent
+\&.Rs
+\&.%A "Matthew Bar"
+\&.%A "John Foo"
+\&.%T "Implementation Notes on foobar(1)"
+\&.%R "Technical Report ABC-DE-12-345"
+\&.%Q "Drofnats College, Nowhere"
+\&.%D "April 1991"
+\&.Re
+.Ed
+.Pp
+produces
+.
+.Bd -ragged -offset indent
+.Rs
+.%A "Matthew Bar"
+.%A "John Foo"
+.%T "Implementation Notes on foobar(1)"
+.%R "Technical Report ABC-DE-12-345"
+.%Q "Drofnats College, Nowhere"
+.%D "April 1991"
+.Re
+.Ed
+.
+.Ss "Trade Names (or Acronyms and Type Names)"
+.
+The trade name macro prints its arguments in a smaller font.
+Its intended use is to imitate a small caps fonts for uppercase acronyms.
+.Pp
+.Dl Usage: .Tn Ao symbol Ac ...
+.Pp
+.Bl -tag -xwidth ".Li .Tn\ ASCII" -compact -offset 15n
+.It Li ".Tn DEC"
+.Tn DEC
+.It Li ".Tn ASCII"
+.Tn ASCII
+.El
+.Pp
+.
+The default width is 10n.
+.
+.Ss "Extended Arguments"
+.
+The
+.Li .Xo
+and
+.Li .Xc
+macros allow one to extend an argument list on a macro boundary for the
+.Ql .It
+macro (see below).
+Note that
+.Li .Xo
+and
+.Li .Xc
+are implemented similarly to all other macros opening and closing an
+enclosure (without inserting characters, of course).
+This means that the following is true for those macros also.
+.Pp
+Here is an example of
+.Ql .Xo
+using the space mode macro to turn spacing off:
+.
+.Bd -literal -offset indent
+\&.Sm off
+\&.It Xo Sy I Ar operation
+\&.No \een Ar count No \een
+\&.Xc
+\&.Sm on
+.Ed
+.Pp
+.
+produces
+.
+.Bd -filled -offset indent
+.Bl -tag -compact
+.Sm off
+.It Xo Sy I Ar operation
+.No \en Ar count No \en
+.Xc
+.Sm on
+.El
+.Ed
+.Pp
+.
+Another one:
+.
+.Bd -literal -offset indent
+\&.Sm off
+\&.It Cm S No / Ar old_pattern Xo
+\&.No / Ar new_pattern
+\&.No / Op Cm g
+\&.Xc
+\&.Sm on
+.Ed
+.Pp
+.
+produces
+.
+.Bd -filled -offset indent
+.Bl -tag -compact
+.Sm off
+.It Cm S No \&/ Ar old_pattern Xo
+.No \&/ Ar new_pattern
+.No \&/ Op Cm g
+.Xc
+.Sm on
+.El
+.Ed
+.Pp
+.
+Another example of
+.Ql .Xo
+and enclosure macros: Test the value of a variable.
+.
+.Bd -literal -offset indent
+\&.It Xo
+\&.Ic .ifndef
+\&.Oo \e&! Oc Ns Ar variable Oo
+\&.Ar operator variable ...
+\&.Oc Xc
+.Ed
+.Pp
+.
+produces
+.
+.Bd -filled -offset indent
.Bl -tag -width flag -compact
-.It Li \&.Sh
-Section Headers.
-Valid headers, in the order of presentation:
-.Bl -tag -width "RETURN VALUES" -compact
-.It Ar NAME
-Name section, should include the
-.Ql \&.Nm
+.It Xo
+.Ic .ifndef
+.Oo \&! Oc Ns Ar variable Oo
+.Ar operator variable ...
+.Oc Xc
+.El
+.Ed
+.Pp
+.
+.
+.Sh "PAGE STRUCTURE DOMAIN"
+.
+.Ss "Section Headers"
+.
+The following
+.Ql .Sh
+section header macros are required in every man page.
+The remaining section headers are recommended at the discretion of the
+author writing the manual page.
+The
+.Ql .Sh
+macro is parsed but not generally callable.
+It can be used as an argument in a call to
+.Ql .Sh
+only; it then reactivates the default font for
+.Ql .Sh .
+.Pp
+The default width is 8n.
+.
+.Bl -tag -xwidth ".Li .Sh\ RETURN\ VALUES"
+.It Li ".Sh NAME"
+The
+.Ql ".Sh NAME"
+macro is mandatory.
+If not specified, headers, footers and page layout defaults will not be set
+and things will be rather unpleasant.
+The
+.Sx NAME
+section consists of at least three items.
+The first is the
+.Ql .Nm
+name macro naming the subject of the man page.
+The second is the name description macro,
+.Ql .Nd ,
+which separates the subject name from the third item, which is the
+description.
+The description should be the most terse and lucid possible, as the space
+available is small.
+.Pp
+.Ql .Nd
+first prints
+.Ql - ,
+then all its arguments.
+.
+.It Li ".Sh LIBRARY"
+This section is for section two and three function calls.
+It should consist of a single
+.Ql .Lb
+macro call;
+see
+.Sx "Library Names" .
+.
+.It Li ".Sh SYNOPSIS"
+The
+.Sx SYNOPSIS
+section describes the typical usage of the subject of a man page.
+The macros required are either
+.Ql .Nm ,
+.Ql .Cd ,
or
-.Ql \&.Fn
-and the
-.Ql \&.Nd
-macros.
-.It Ar SYNOPSIS
-Usage.
-.It Ar DESCRIPTION
-General description, should include
-options and parameters.
-.It Ar RETURN VALUES
-Sections two and three function calls.
-.It Ar ENVIRONMENT
-Describe environment variables.
-.It Ar FILES
-Files associated with the subject.
-.It Ar EXAMPLES
-Examples and suggestions.
-.It Ar DIAGNOSTICS
-Normally used for section four device interface diagnostics.
-.It Ar ERRORS
-Sections two and three error and signal
-handling.
-.It Ar SEE ALSO
-Cross references and citations.
-.It Ar STANDARDS
-Conformance to standards if applicable.
-.It Ar HISTORY
-If a standard is not applicable, the history
-of the subject should be given.
-.It Ar BUGS
-Gotchas and caveats.
-.It Ar SECURITY CONSIDERATIONS
-Security issues to be aware of.
-.It Ar other
-Customized headers may be added at
-the authors discretion.
-.El
-.It Li \&.Ss
-Subsection Headers.
-.It Li \&.Pp
-Paragraph Break.
-Vertical space (one line).
-.It Li \&.D1
-(D-one) Display-one
-Indent and display one text line.
-.It Li \&.Dl
-(D-ell) Display-one literal.
-Indent and display one line of literal text.
-.It Li \&.Bd
-Begin-display block.
-Display options:
-.Bl -tag -width "xoffset string " -compact
+.Ql .Fn
+(and possibly
+.Ql .Fo ,
+.Ql .Fc ,
+.Ql .Fd ,
+and
+.Ql .Ft ) .
+The function name macro
+.Ql .Fn
+is required for manual page sections\~2 and\~3; the command and general name
+macro
+.Ql .Nm
+is required for sections 1, 5, 6, 7, and\~8.
+Section\~4 manuals require a
+.Ql .Nm ,
+.Ql .Fd
+or a
+.Ql .Cd
+configuration device usage macro.
+Several other macros may be necessary to produce the synopsis line as shown
+below:
+.
+.Bd -filled -offset indent
+.Nm cat
+.Op Fl benstuv
+.Op Fl
+.Ar
+.Ed
+.Pp
+.
+The following macros were used:
+.Pp
+.Dl ".Nm cat"
+.Dl ".Op Fl benstuv"
+.Dl ".Op Fl"
+.Dl .Ar
+.
+.It Li ".Sh DESCRIPTION"
+In most cases the first text in the
+.Sx DESCRIPTION
+section is a brief paragraph on the command, function or file, followed by a
+lexical list of options and respective explanations.
+To create such a list, the
+.Ql .Bl
+(begin list),
+.Ql .It
+(list item) and
+.Ql .El
+(end list)
+macros are used (see
+.Sx Lists and Columns
+below).
+.
+.It Li ".Sh IMPLEMENTATION NOTES"
+Implementation specific information should be placed here.
+.
+.It Li ".Sh RETURN VALUES"
+Sections 2, 3 and\~9 function return values should go here.
+The
+.Ql .Rv
+macro may be used to generate text for use in the
+.Sx RETURN VALUES
+section for most section 2 and 3 library functions;
+see
+.Sx "Return Values" .
+.El
+.Pp
+.
+The following
+.Ql .Sh
+section headers are part of the preferred manual page layout and must be
+used appropriately to maintain consistency.
+They are listed in the order in which they would be used.
+.
+.Bl -tag -xwidth ".Li .Sh\ COMPATIBILITY"
+.It Li ".Sh ENVIRONMENT"
+The
+.Sx ENVIRONMENT
+section should reveal any related environment variables and clues to their
+behavior and/or usage.
+.
+.It Li ".Sh FILES"
+Files which are used or created by the man page subject should be listed via
+the
+.Ql .Pa
+macro in the
+.Sx FILES
+section.
+.
+.It Li ".Sh EXAMPLES"
+There are several ways to create examples.
+See the
+.Sx EXAMPLES
+section below for details.
+.
+.It Li ".Sh DIAGNOSTICS"
+Diagnostic messages from a command should be placed in this section.
+.
+.It Li ".Sh COMPATIBILITY"
+Known compatibility issues (e.g. deprecated options or parameters)
+should be listed here.
+.
+.It Li ".Sh ERRORS"
+Specific error handling, especially from library functions (man page
+sections 2, 3, and\~9) should go here.
+The
+.Ql .Er
+macro is used to specify an error (errno).
+.
+.It Li ".Sh SEE ALSO"
+References to other material on the man page topic and cross references to
+other relevant man pages should be placed in the
+.Sx "SEE ALSO"
+section.
+Cross references are specified using the
+.Ql .Xr
+macro.
+Currently
+.Xr refer 1
+style references are not accommodated.
+.Pp
+It is recommended that the cross references are sorted on the section
+number, then alphabetically on the names within a section, and placed
+in that order and comma separated.
+Example:
+.Pp
+.Xr ls 1 ,
+.Xr ps 1 ,
+.Xr group 5 ,
+.Xr passwd 5
+.
+.It Li ".Sh STANDARDS"
+If the command, library function or file adheres to a specific
+implementation such as
+.St -p1003.2
+or
+.St -ansiC
+this should be noted here.
+If the command does not adhere to any standard, its history should be noted
+in the
+.Sx HISTORY
+section.
+.
+.It Li ".Sh HISTORY"
+Any command which does not adhere to any specific standards should be
+outlined historically in this section.
+.
+.It Li ".Sh AUTHORS"
+Credits should be placed here.
+The
+.Ql .An
+macro should be used to specify the name(s) of the person(s).
+.
+.It Li ".Sh BUGS"
+Blatant problems with the topic go here.
+.El
+.Pp
+.
+User-specified
+.Ql .Sh
+sections may be added; for example, this section was set with:
+.
+.Bd -literal -offset 15n
+\&.Sh "PAGE STRUCTURE DOMAIN"
+.Ed
+.
+.Ss "Subsection Headers"
+.
+Subsection headers have exactly the same syntax as section headers:
+.Ql .Ss
+is parsed but not generally callable.
+It can be used as an argument in a call to
+.Ql .Ss
+only; it then reactivates the default font for
+.Ql .Ss .
+.Pp
+The default width is 8n.
+.
+.Ss "Paragraphs and Line Spacing"
+.
+.Bl -tag -xwidth ".Li .Pp"
+.It Li .Pp
+The
+.Ql .Pp
+paragraph command may be used to specify a line space where necessary.
+The macro is not necessary after a
+.Ql .Sh
+or
+.Ql .Ss
+macro or before a
+.Ql .Bl
+or
+.Ql .Bd
+macro (which both assert a vertical distance unless the
+.Fl compact
+flag is given).
+.Pp
+The macro is neither callable nor parsed and takes no arguments; an
+alternative name is
+.Ql .Lp .
+.El
+.
+.\" XXX
+.
+.\" This worked with version one, need to redo for version three
+.\" .Pp
+.\" .Ds I
+.\" .Cw (ax+bx+c) \ is\ produced\ by\ \&
+.\" .\".Cw (ax+bx+c) \&.Va_by_) \&_and_\& \&[?/]m_b1_e1_f1[?/]\&
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx\ (
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va ax
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy \+
+.\" .Cx
+.\" .Cl Cx \&(\&
+.\" .Va ax
+.\" .Cx +
+.\" .Va by
+.\" .Cx +
+.\" .Va c )
+.\" .Cx \t
+.\" .Em is produced by
+.\" .Cx \t
+.\" .Li \&.Va by
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy \+
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va c )
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx
+.\" .Cx
+.\" .Cw
+.\" .De
+.\" .Pp
+.\" This example shows the same equation in a different format.
+.\" The spaces
+.\" around the
+.\" .Li \&+
+.\" signs were forced with
+.\" .Li \e :
+.\" .Pp
+.\" .Ds I
+.\" .Cw (ax\ +\ bx\ +\ c) \ is\ produced\ by\ \&
+.\" .\".Cw (ax+bx+c) \&.Va_by_) \&_and_\& \&[?/]m_b1_e1_f1[?/]\&
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx\ (
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va a
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy x
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx \e\ +\e\ \e&
+.\" .Cx
+.\" .Cl Cx \&(\&
+.\" .Va a
+.\" .Sy x
+.\" .Cx \ +\ \&
+.\" .Va b
+.\" .Sy y
+.\" .Cx \ +\ \&
+.\" .Va c )
+.\" .Cx \t
+.\" .Em is produced by
+.\" .Cl Cx \t\t
+.\" .Li \&.Va b
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Sy y
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx \e\ +\e\ \e&
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Va c )
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx
+.\" .Cx
+.\" .Cw
+.\" .De
+.\" .Pp
+.\" The incantation below was
+.\" lifted from the
+.\" .Xr adb 1
+.\" manual page:
+.\" .Pp
+.\" .Ds I
+.\" .Cw \&[?/]m_b1_e1_f1[?/]\& is\ produced\ by
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx Op Sy ?/
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Nm m
+.\" .Cx
+.\" .Cl Cx Op Sy ?/
+.\" .Nm m
+.\" .Ad \ b1 e1 f1
+.\" .Op Sy ?/
+.\" .Cx \t
+.\" .Em is produced by
+.\" .Cx \t
+.\" .Li \&.Ar \e\ b1 e1 f1
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Op Sy ?/
+.\" .Cx
+.\" .Cl Cx \t\t
+.\" .Li \&.Cx
+.\" .Cx
+.\" .Cw
+.\" .De
+.\" .Pp
+.
+.Ss Keeps
+.
+The only keep that is implemented at this time is for words.
+The macros are
+.Ql .Bk
+(begin keep)
+and
+.Ql .Ek
+(end keep).
+The only option that
+.Ql .Bk
+accepts currently is
+.Fl words
+(this is also the default if no option is given) which is useful for
+preventing line breaks in the middle of options.
+In the example for the make command line arguments (see
+.Sx What's in a Name ) ,
+the keep prevented
+.Xr nroff
+from placing up the flag and the argument on separate lines.
+.Pp
+Both macros are neither callable nor parsed.
+.Pp
+More work needs to be done with the keep macros; specifically, a
+.Fl line
+option should be added.
+.
+.Ss "Examples and Displays"
+.
+There are seven types of displays.
+.Pp
+.Bl -tag -xwidth ".Li .D1"
+.It Li .D1
+(This is D-one.)
+Display one line of indented text.
+This macro is parsed but not callable.
+.Pp
+.D1 Fl ldghfstru
+.Pp
+The above was produced by:
+.Li ".D1 Fl ldghfstru" .
+.
+.It Li .Dl
+(This is D-ell.)
+Display one line of indented
+.Em literal
+text.
+The
+.Ql .Dl
+example macro has been used throughout this file.
+It allows the indentation (display) of one line of text.
+Its default font is set to constant width (literal).
+.Ql .Dl
+is parsed but not callable.
+.Pp
+.Dl % ls -ldg /usr/local/bin
+.Pp
+The above was produced by:
+.Li ".Dl % ls -ldg /usr/local/bin" .
+.
+.It Li .Bd
+Begin display.
+The
+.Ql .Bd
+display must be ended with the
+.Ql .Ed
+macro.
+It has the following syntax:
+.Pp
+.Bl -tag -xwidth ".Li .Bd" -offset indent
+.It Li .Bd Xo
+.Bro \-literal | \-filled | \-unfilled | \-ragged | \-centered Brc
+.Oo \-offset Ao string Ac Oc Oo \-file Ao file name Ac Oc Oo \-compact Oc Xc
+.El
+.Pp
+.
+.Bl -tag -xwidth ".Fl file Ao Ar file name Ac " -compact
.It Fl ragged
-Unjustified (ragged edges).
-.It Fl filled
-Filled, and if
-.Xr troff 1 ,
-also justified.
+Fill, but do not adjust the right margin (only left-justify).
+.It Fl centered
+Center lines between the current left and right margin.
+Note that each single line is centered.
.It Fl unfilled
-Unfilled, unjustified.
+Do not fill; display a block of text as typed, using line breaks as
+specified by the user.
+This can produce overlong lines without warning messages.
+.It Fl filled
+Display a filled block.
+The block of text is formatted (i.e., the text is justified on both the left
+and right side).
.It Fl literal
-Literal text or code.
-.It Fl file Ar name
-Read in named
-.Ar file
-and display.
-.It Fl offset Ar string
-Offset display.
-Acceptable
-.Ar string
-values:
-.Bl -tag -width indent-two -compact
+Display block with literal font (usually fixed-width).
+Useful for source code or simple tabbed or spaced text.
+.It Fl file Ao Ar file name Ac
+The file whose name follows the
+.Fl file
+flag is read and displayed before any data enclosed with
+.Ql .Bd
+and
+.Ql .Ed ,
+using the selected display type.
+Any
+.Xr troff/ Ns Nm \-mdoc
+commands in the file will be processed.
+.It Fl offset Ao Ar string Ac
+If
+.Fl offset
+is specified with one of the following strings, the string is interpreted to
+indicate the level of indentation for the forthcoming block of text:
+.
+.Pp
+.Bl -tag -xwidth ".Ar indent-two" -compact
.It Ar left
-Align block on left (default).
+Align block on the current left margin; this is the default mode of
+.Ql .Bd .
.It Ar center
-Approximate center margin.
+Supposedly center the block.
+At this time unfortunately, the block merely gets left aligned about an
+imaginary center margin.
.It Ar indent
-Six constant width spaces (a tab).
+Indent by one default indent value or tab.
+The default indent value is also used for the
+.Ql .D1
+and
+.Ql .Dl
+macros, so one is guaranteed the two types of displays will line up.
+The indentation value is normally set to\~6n or about two thirds of an inch
+(six constant width characters).
.It Ar indent-two
-Two tabs.
+Indent two times the default indent value.
.It Ar right
-Left aligns block 2 inches from
-right.
-.It Ar xx Ns Cm n
-Where
-.Ar xx
-is a number from
-.No \&4 Ns Cm n
-to
-.No \&9\&9 Ns Cm n .
-.It Ar Aa
-Where
-.Ar Aa
-is a callable macro name.
-.It Ar string
-The width of
-.Ar string
-is used.
-.El
+This
+.Em left
+aligns the block about two inches from the right side of the page.
+This macro needs work and perhaps may never do the right thing within
+.Xr troff .
.El
-.It Li \&.Ed
-End-display (matches \&.Bd).
-.It Li \&.Bl
-Begin-list.
-Create lists or columns. Options:
-.Bl -tag -width flag -compact
-.It Em List-types
-.Bl -column "xbullet " -compact
-.It Fl bullet Ta "Bullet Item List"
-.It Fl dash Ta "Dash Item List"
-.It Fl hyphen Ta "(as per" Fl dash ")"
-.It Fl item Ta "Unlabeled List"
-.It Fl enum Ta "Enumerated List"
-.It Fl tag Ta "Tag Labeled List"
-.It Fl diag Ta "Diagnostic List"
-.It Fl hang Ta "Hanging Labeled List"
-.It Fl ohang Ta "Overhanging Labeled List"
-.It Fl inset Ta "Inset or Run-on Labeled List"
-.It Fl column Ta "Multiple Columns"
-.El
-.It Em List-parameters
-.Bl -tag -width "xcompact " -compact
-.It Fl offset
-(All lists.) See
-.Ql \&.Bd
-begin-display above.
-.It Fl width
-.Pf ( Fl tag
-and
-.Fl hang
-lists only.)
-See
-.Ql \&.Bd .
-This parameter is effectively required for
-.Fl tag
-lists.
+.Pp
+.
+If
+.Ao string Ac
+is a valid numeric expression instead
+.Pf ( Em with a scale indicator other than
+.Sq Em u ) ,
+use that value for indentation.
+The most useful scale indicators are
+.Sq m
+and
+.Sq n ,
+specifying the so-called
+.Em \&Em
+and
+.Em "En square" .
+This is approximately the width of the letter
+.Sq m
+resp.\& the letter
+.Sq n
+of the current font (for nroff output, both scale indicators give the same
+values).
+If
+.Ao string Ac
+isn't a numeric expression, it is tested whether it is an
+.Nm \-mdoc
+macro name, and the default offset value associated with this macro is used.
+Finally, if all tests fail,
+the width of
+.Ao string Ac
+(typeset with a fixed-width font) is taken as the offset.
.It Fl compact
-(All lists.)
-Suppresses blank lines.
+Suppress insertion of vertical space before begin of display.
.El
+.
+.It Li .Ed
+End display (takes no arguments).
.El
-.It Li \&.El
-End-list.
-.It Li \&.It
-List item.
+.
+.Ss "Lists and Columns"
+.
+There are several types of lists which may be initiated with the
+.Ql .Bl
+begin-list macro.
+Items within the list are specified with the
+.Ql .It
+item macro, and each list must end with the
+.Ql .El
+macro.
+Lists may be nested within themselves and within displays.
+The use of columns inside of lists or lists inside of columns is unproven.
+.Pp
+In addition, several list attributes may be specified such as the width of a
+tag, the list offset, and compactness (blank lines between items allowed or
+disallowed).
+Most of this document has been formatted with a tag style list
+.Pf ( Fl tag ) .
+.Pp
+It has the following syntax forms:
+.
+.Pp
+.Bl -tag -xwidth ".Li .Bl" -offset indent -compact
+.It Li .Bl Xo
+.Bro \-hang | \-ohang | \-tag | \-diag | \-inset Brc
+.Oo \-width Ao string Ac Oc Oo \-xwidth Ao command Ac Oc
+.Oo \-offset Ao string Ac Oc Oo \-compact Oc Xc
+.It Li .Bl Xo
+.No \-column Oo \-offset Ao string Ac Oc
+.Ao string1 Ac Ao string2 Ac ... Xc
+.It Li .Bl Xo
+.Bro \-item | \-enum Oo \-nested Oc | \-bullet | \-hyphen | \-dash Brc
+.Oo \-offset Ao string Ac Oc Oo \-compact Oc Xc
.El
-.Sh MANUAL AND GENERAL TEXT DOMAIN MACROS
-The manual and general text domain macros are special in that
-most of them are parsed for callable macros
-for example:
-.Bl -tag -width ".Op Fl s Ar filex" -offset indent
-.It Li "\&.Op Fl s Ar file"
-Produces
-.Op Fl s Ar file
+.Pp
+.
+And now a detailed description of the list types.
+.
+.Pp
+.Bl -tag -xwidth ".Fl column" -compact
+.It Fl bullet
+A bullet list.
+.
+.Bd -literal -offset indent
+\&.Bl -bullet -offset indent -compact
+\&.It
+Bullet one goes here.
+\&.It
+Bullet two here.
+\&.El
+.Ed
+.Pp
+.
+Produces:
+.
+.Pp
+.Bl -bullet -offset indent -compact
+.It
+Bullet one goes here.
+.It
+Bullet two here.
.El
.Pp
-In this example, the option enclosure macro
-.Ql \&.Op
-is parsed, and calls the callable content macro
-.Ql \&Fl
-which operates on the argument
-.Ql s
-and then calls the callable content macro
-.Ql \&Ar
-which operates on the argument
-.Ql file .
-Some macros may be callable, but are not parsed and vice versa.
-These macros are indicated in the
-.Em parsed
+.
+.It Fl dash No ( or Fl hyphen )
+A dash list.
+.
+.Bd -literal -offset indent
+\&.Bl -dash -offset indent -compact
+\&.It
+Dash one goes here.
+\&.It
+Dash two here.
+\&.El
+.Ed
+.Pp
+.
+Produces:
+.
+.Pp
+.Bl -dash -offset indent -compact
+.It
+Dash one goes here.
+.It
+Dash two here.
+.El
+.Pp
+.
+.It Fl enum
+An enumerated list.
+.
+.Bd -literal -offset indent
+\&.Bl -enum -offset indent -compact
+\&.It
+Item one goes here.
+\&.It
+And item two here.
+\&.El
+.Ed
+.Pp
+.
+The result:
+.
+.Pp
+.Bl -enum -offset indent -compact
+.It
+Item one goes here.
+.It
+And item two here.
+.El
+.Pp
+.
+If you want to nest enumerated lists, use the
+.Fl nested
+flag (starting with the second-level list):
+.
+.Bd -literal -offset indent
+\&.Bl -enum -offset indent -compact
+\&.It
+Item one goes here
+\&.Bl -enum -nested -compact
+\&.It
+Item two goes here.
+\&.It
+And item three here.
+\&.El
+\&.It
+And item four here.
+\&.El
+.Ed
+.Pp
+.
+Result:
+.
+.Pp
+.Bl -enum -offset indent -compact
+.It
+Item one goes here.
+.Bl -enum -nested -compact
+.It
+Item two goes here.
+.It
+And item three here.
+.El
+.It
+And item four here.
+.El
+.Pp
+.
+.It Fl item
+A list of type
+.Fl item
+without list markers.
+.
+.Bd -literal -offset indent
+\&.Bl -item -offset indent
+\&.It
+Item one goes here.
+Item one goes here.
+Item one goes here.
+\&.It
+Item two here.
+Item two here.
+Item two here.
+\&.El
+.Ed
+.Pp
+.
+Produces:
+.
+.Pp
+.Bl -item -offset indent
+.It
+Item one goes here.
+Item one goes here.
+Item one goes here.
+.It
+Item two here.
+Item two here.
+Item two here.
+.El
+.Pp
+.
+.It Fl tag
+A list with tags.
+Use
+.Fl width
+or
+.Fl xwidth
+to specify the tag width.
+.
+.Pp
+.Bl -tag -width "PPID" -compact -offset indent
+.It SL
+sleep time of the process (seconds blocked)
+.It PAGEIN
+number of disk
+.Tn I/O Ns 's
+resulting from references by the process
+to pages not loaded in core.
+.It UID
+numerical user-id of process owner
+.It PPID
+numerical id of parent of process priority
+(non-positive when in non-interruptible wait)
+.El
+.Pp
+.
+The raw text:
+.
+.Bd -literal -offset indent
+\&.Bl -tag -width "PPID" -compact -offset indent
+\&.It SL
+sleep time of the process (seconds blocked)
+\&.It PAGEIN
+number of disk
+\&.Tn I/O Ns 's
+resulting from references by the process
+to pages not loaded in core.
+\&.It UID
+numerical user-id of process owner
+\&.It PPID
+numerical id of parent of process priority
+(non-positive when in non-interruptible wait)
+\&.El
+.Ed
+.Pp
+.
+.It Fl diag
+Diag lists create section four diagnostic lists and are similar to inset
+lists except callable macros are ignored.
+The flags
+.Fl width
and
-.Em callable
-columns below.
-.Pp
-Unless stated, manual domain macros share a common syntax:
-.Pp
-.Dl \&.Va argument [\ .\ ,\ ;\ :\ (\ )\ [\ ]\ argument \...\ ]
-.Pp
-.Sy Note :
-Opening and closing
-punctuation characters are only recognized as such if they are presented
-one at a time.
-The string
-.Ql "),"
-is not recognized as punctuation and will be output with a leading white
-space and in what ever font the calling macro uses.
-The
-argument list
-.Ql "] ) ,"
-is recognized as three sequential closing punctuation characters
-and a leading white space is not output between the characters
-and the previous argument (if any).
-The special meaning of a punctuation character may be escaped
-with the string
-.Ql \e& .
-For example the following string,
-.Bl -tag -width "&.Ar file1\ , file2\ , file3\ )\ ." -offset indent
-.It Li "\&.Ar file1\ , file2\ , file3\ )\ ."
-Produces
-.Ar file1 , file2 , file3 ) .
-.El
-.ne 1i
-.Ss Manual Domain Macros
-.Bl -column "Name" "Parsed" "Callable" -compact
-.It Em Name Parsed Callable Description
-.It Li \&Ad Ta Yes Ta Yes Ta Address. "(This macro may be deprecated.)"
-.It Li \&Ar Ta Yes Ta Yes Ta "Command line argument."
-.It Li \&Cd Ta \&No Ta \&No Ta "Configuration declaration (section four only)."
-.It Li \&Cm Ta Yes Ta Yes Ta "Command line argument modifier."
-.It Li \&Dv Ta Yes Ta Yes Ta "Defined variable (source code)."
-.It Li \&Er Ta Yes Ta Yes Ta "Error number (source code)."
-.It Li \&Ev Ta Yes Ta Yes Ta "Environment variable."
-.It Li \&Fa Ta Yes Ta Yes Ta "Function argument."
-.It Li \&Fd Ta \&No Ta \&No Ta "Function declaration."
-.It Li \&Fl Ta Yes Ta Yes Ta "Command line flag."
-.It Li \&Fn Ta Yes Ta Yes Ta "Function call (also .Fo and .Fc)."
-.It Li \&Ic Ta Yes Ta Yes Ta "Interactive command."
-.It Li \&Li Ta Yes Ta Yes Ta "Literal text."
-.It Li \&Nm Ta Yes Ta Yes Ta "Command name."
-.It Li \&Op Ta Yes Ta Yes Ta "Option (also .Oo and .Oc)."
-.It Li \&Ot Ta Yes Ta Yes Ta "Old style function type (Fortran only)."
-.It Li \&Pa Ta Yes Ta Yes Ta "Pathname or file name."
-.It Li \&St Ta Yes Ta Yes Ta "Standards (-p1003.2, -p1003.1 or -ansiC)"
-.It Li \&Va Ta Yes Ta Yes Ta "Variable name."
-.It Li \&Vt Ta Yes Ta Yes Ta "Variable type (Fortran only)."
-.It Li \&Xr Ta Yes Ta Yes Ta "Manual Page Cross Reference."
-.El
-.Ss General Text Domain Macros
-.Bl -column "Name" "Parsed" "Callable" -compact
-.It Em "Name Parsed Callable Description"
-.It Li \&%A Ta Yes Ta \&No Ta "Reference author."
-.It Li \&%B Ta Yes Ta Yes Ta "Reference book title."
-.It Li \&%\&C Ta \&No Ta \&No Ta "Reference place of publishing (city)."
-.It Li \&%\&D Ta \&No Ta \&No Ta "Reference date."
-.It Li \&%J Ta Yes Ta Yes Ta "Reference journal title."
-.It Li \&%N Ta \&No Ta \&No Ta "Reference issue number."
-.It Li \&%\&O Ta \&No Ta \&No Ta "Reference optional information."
-.It Li \&%P Ta \&No Ta \&No Ta "Reference page number(s)."
-.It Li \&%R Ta \&No Ta \&No Ta "Reference report Name."
-.It Li \&%T Ta Yes Ta Yes Ta "Reference article title."
-.It Li \&%V Ta \&No Ta \&No Ta "Reference volume."
-.It Li \&Ac Ta Yes Ta Yes Ta "Angle close quote."
-.It Li \&Ao Ta Yes Ta Yes Ta "Angle open quote."
-.It Li \&Ap Ta Yes Ta Yes Ta "Insert apostrophe; switch to .No mode "
-.It Li \&Aq Ta Yes Ta Yes Ta "Angle quote."
-.It Li \&At Ta \&No Ta \&No Ta Tn "AT&T UNIX."
-.It Li \&Bc Ta Yes Ta Yes Ta "Bracket close quote."
-.It Li \&Bf Ta \&No Ta \&No Ta "Begin font mode."
-.It Li \&Bo Ta Yes Ta Yes Ta "Bracket open quote."
-.It Li \&Bq Ta Yes Ta Yes Ta "Bracket quote."
-.It Li \&Bx Ta Yes Ta Yes Ta "BSD" .
-.It Li \&Db Ta \&No Ta \&No Ta "Debug (default is \\*qoff\\*q)."
-.It Li \&Dc Ta Yes Ta Yes Ta "Double close quote."
-.It Li \&Do Ta Yes Ta Yes Ta "Double open quote."
-.It Li \&Dq Ta Yes Ta Yes Ta "Double quote."
-.It Li \&Ec Ta Yes Ta Yes Ta "Enclose string close quote."
-.It Li \&Ef Ta \&No Ta \&No Ta "End font mode."
-.It Li \&Em Ta Yes Ta Yes Ta "Emphasis (traditional English)."
-.It Li \&Eo Ta Yes Ta Yes Ta "Enclose string open quote."
-.It Li \&Fx Ta \&No Ta \&No Ta "FreeBSD."
-.It Li \&No Ta Yes Ta Yes Ta "Normal text (no-op)."
-.It Li \&Ns Ta Yes Ta Yes Ta "No space."
-.It Li \&Nx Ta \&No Ta \&No Ta "NetBSD."
-.It Li \&Pc Ta Yes Ta Yes Ta "Parenthesis close quote."
-.It Li \&Pf Ta Yes Ta \&No Ta "Prefix string."
-.It Li \&Po Ta Yes Ta Yes Ta "Parenthesis open quote."
-.It Li \&Pq Ta Yes Ta Yes Ta "Parentheses quote."
-.It Li \&Qc Ta Yes Ta Yes Ta "Strait Double close quote."
-.It Li \&Ql Ta Yes Ta Yes Ta "Quoted literal."
-.It Li \&Qo Ta Yes Ta Yes Ta "Strait Double open quote."
-.It Li \&Qq Ta Yes Ta Yes Ta "Strait Double quote."
-.It Li \&Re Ta \&No Ta \&No Ta "Reference end."
-.It Li \&Rs Ta \&No Ta \&No Ta "Reference start."
-.It Li \&Sc Ta Yes Ta Yes Ta "Single close quote."
-.It Li \&So Ta Yes Ta Yes Ta "Single open quote."
-.It Li \&Sq Ta Yes Ta Yes Ta "Single quote."
-.It Li \&Sm Ta \&No Ta \&No Ta "Space mode (default is \\*qon\\*q)."
-.It Li \&Sx Ta Yes Ta Yes Ta "Section Cross Reference."
-.It Li \&Sy Ta Yes Ta Yes Ta "Symbolic (traditional English)."
-.It Li \&Tn Ta Yes Ta Yes Ta "Trade or type name (small Caps)."
-.It Li \&Ux Ta Yes Ta Yes Ta "UNIX."
-.It Li \&Xc Ta Yes Ta Yes Ta "Extend argument list close."
-.It Li \&Xo Ta Yes Ta Yes Ta "Extend argument list open."
-.El
-.\" .It Sy \&Hf Ta \&No Ta \&No Ta "Include file with header"
-.Pp
-Macro names ending in
-.Ql q
-quote remaining items on the argument list.
-Macro names ending in
-.Ql o
-begin a quote which may span more than one line of input and
-are close quoted with the matching macro name ending in
-.Ql c .
-Enclosure macros may be nested and are limited to
-eight arguments.
-.Pp
-Note: the extended argument list macros
-.Pf ( Ql \&.Xo ,
-.Ql \&.Xc )
-and the function enclosure macros
-.Pf ( Ql \&.Fo ,
-.Ql \&.Fc )
-are irregular.
-The extended list macros are used when the number of macro arguments
-would exceed the
-.Xr troff
-limitation of nine arguments.
-.Sh CONFIGURATION
-For site specific configuration of the macro package,
-see the file
-.Pa /usr/src/share/tmac/README .
+.Fl xwidth
+are not meaningful in this context.
+.Pp
+Example:
+.
+.Bd -literal -offset indent
+\&.Bl -diag
+\&.It You can't use Sy here.
+The message says all.
+\&.El
+.Ed
+.Pp
+.
+produces
+.
+.Bl -diag
+.It You can't use Sy here.
+The message says all.
+.El
+.Pp
+.
+.It Fl hang
+A list with hanging tags.
+.
+.Bl -hang -offset indent
+.It Em Hanged
+labels appear similar to tagged lists when the
+label is smaller than the label width.
+.It Em Longer hanged list labels
+blend into the paragraph unlike
+tagged paragraph labels.
+.El
+.Pp
+And the unformatted text which created it:
+.
+.Bd -literal -offset indent
+\&.Bl -hang -offset indent
+\&.It Em Hanged
+labels appear similar to tagged lists when the
+label is smaller than the label width.
+\&.It Em Longer hanged list labels
+blend into the paragraph unlike
+tagged paragraph labels.
+\&.El
+.Ed
+.Pp
+.
+.It Fl ohang
+Lists with overhanging tags do not use indentation for the items; tags are
+written to a separate line.
+.Pp
+.Bl -ohang -offset indent
+.It Sy SL
+sleep time of the process (seconds blocked)
+.It Sy PAGEIN
+number of disk
+.Tn I/O Ns 's
+resulting from references by the process
+to pages not loaded in core.
+.It Sy UID
+numerical user-id of process owner
+.It Sy PPID
+numerical id of parent of process priority
+(non-positive when in non-interruptible wait)
+.El
+.Pp
+.
+The raw text:
+.
+.Bd -literal -offset indent
+\&.Bl -ohang -offset indent
+\&.It Sy SL
+sleep time of the process (seconds blocked)
+\&.It Sy PAGEIN
+number of disk
+\&.Tn I/O Ns 's
+resulting from references by the process
+to pages not loaded in core.
+\&.It Sy UID
+numerical user-id of process owner
+\&.It Sy PPID
+numerical id of parent of process priority
+(non-positive when in non-interruptible wait)
+\&.El
+.Ed
+.Pp
+.
+.It Fl inset
+Here is an example of inset labels:
+.Bl -inset -offset indent
+.It Em Tag
+The tagged list (also called a tagged paragraph)
+is the most common type of list used in the
+Berkeley manuals.
+Use a
+.Fl width
+attribute as described below.
+.It Em Diag
+Diag lists create section four diagnostic lists
+and are similar to inset lists except callable
+macros are ignored.
+.It Em Hang
+Hanged labels are a matter of taste.
+.It Em Ohang
+Overhanging labels are nice when space is constrained.
+.It Em Inset
+Inset labels are useful for controlling blocks of
+paragraphs and are valuable for converting
+.Nm \-mdoc
+manuals to other formats.
+.El
+.Pp
+Here is the source text which produced the above example:
+.
+.Bd -literal -offset indent
+\&.Bl -inset -offset indent
+\&.It Em Tag
+The tagged list (also called a tagged paragraph)
+is the most common type of list used in the
+Berkeley manuals.
+\&.It Em Diag
+Diag lists create section four diagnostic lists
+and are similar to inset lists except callable
+macros are ignored.
+\&.It Em Hang
+Hanged labels are a matter of taste.
+\&.It Em Ohang
+Overhanging labels are nice when space is constrained.
+\&.It Em Inset
+Inset labels are useful for controlling blocks of
+paragraphs and are valuable for converting
+\&.Nm \-mdoc
+manuals to other formats.
+\&.El
+.Ed
+.Pp
+.
+.It Fl column
+This list type generates multiple columns.
+The number of columns and the width of each column is determined by the
+arguments to the
+.Fl column
+list.
+Each
+.Ql .It
+argument is parsed to make a row, each column within the row is a separate
+argument separated by a tab or the
+.Ql .Ta
+macro.
+.Pp
+The table:
+.
+.Bl -column -offset indent String Nroff Troff
+.It Sy String Ta Sy Nroff Ta Sy Troff
+.It Li <= Ta <= Ta \*(<=
+.It Li >= Ta >= Ta \*(>=
+.El
+.Pp
+.
+was produced by:
+.
+.Bd -literal -offset indent
+\&.Bl -column -offset indent String Nroff Troff
+\&.It Sy String Ta Sy Nroff Ta Sy Troff
+\&.It Li <= Ta <= Ta \e*(<=
+\&.It Li >= Ta >= Ta \e*(>=
+\&.El
+.Ed
+.El
+.Pp
+.
+Other keywords:
+.
+.Bl -tag -xwidth ".Fl indent Ao Ar string Ac"
+.It Fl width Ao Ar string Ac
+If
+.Ao string Ac
+is a valid numeric expression
+.Pf ( Em with a scale indicator other than
+.Sq Em u ) ,
+use that value for indentation.
+The most useful scale indicators are
+.Sq m
+and
+.Sq n ,
+specifying the so-called
+.Em \&Em
+and
+.Em "En square" .
+This is approximately the width of the letter
+.Sq m
+resp.\& the letter
+.Sq n
+of the current font (for nroff output, both scale indicators give the same
+values).
+If
+.Ao string Ac
+isn't a numeric expression, it is tested whether it is an
+.Nm \-mdoc
+macro name, and the default offset value associated with this macro is used.
+Finally, if all tests fail,
+the width of
+.Ao string Ac
+(typeset with a fixed-width font) is taken as the offset.
+.Pp
+If a width is not specified for the tag list type, every time
+.Ql .It
+is invoked, an attempt is made to determine an appropriate width.
+If the first argument to
+.Ql .It
+is a callable macro, the default width for that macro will be used;
+otherwise, the default width of
+.Ql .No
+is used.
+.It Fl xwidth Ao Ar string Ac
+Interpret
+.Ao string Ac
+and use the width of the result.
+Almost all lists in this document use this option.
+.Pp
+Example:
+.
+.Bd -literal -offset indent
+\&.Bl -tag -xwidth ".Fl test Ao Ar string Ac"
+\&.It Fl test Ao Ar string Ac
+This is a longer sentence to show how the
+\&.Fl xwidth
+flag works in combination with a tag list.
+\&.El
+.Ed
+.Pp
+.
+gives:
+.
+.Bl -tag -xwidth ".Fl test Ao Ar string Ac"
+.It Fl test Ao Ar string Ac
+This is a longer sentence to show how the
+.Fl xwidth
+flag works in combination with a tag list.
+.El
+.Pp
+.
+Note that the current state of
+.Nm \-mdoc
+is saved before
+.Ao string Ac
+is interpreted; afterwards, all variables are restored again.
+However, boxes (used for enclosures) can't be saved in
+.Tn GNU
+.Xr troff 1 ;
+as a consequence, arguments must always be
+.Em balanced
+to avoid nasty errors.
+For example, do not write
+.Ql ".Ao string"
+but
+.Ql ".Ao string Xc"
+instead if you really need only an opening angle bracket.
+.It Fl offset Ao Ar string Ac
+If
+.Ao string Ac
+is
+.Ar indent ,
+a default indent value (normally set to\~6n, similar to the value used in
+.Ql .Dl
+or
+.Ql .Bd )
+is used.
+If
+.Ao string Ac
+is a valid numeric expression instead
+.Pf ( Em with a scale indicator other than
+.Sq Em u ) ,
+use that value for indentation.
+The most useful scale indicators are
+.Sq m
+and
+.Sq n ,
+specifying the so-called
+.Em \&Em
+and
+.Em "En square" .
+This is approximately the width of the letter
+.Sq m
+resp.\& the letter
+.Sq n
+of the current font (for nroff output, both scale indicators give the same
+values).
+If
+.Ao string Ac
+isn't a numeric expression, it is tested whether it is an
+.Nm \-mdoc
+macro name, and the default offset value associated with this macro is used.
+Finally, if all tests fail,
+the width of
+.Ao string Ac
+(typeset with a fixed-width font) is taken as the offset.
+.It Fl compact
+Suppress insertion of vertical space before the list and between list items.
+.El
+.
+.
+.Sh "MISCELLANEOUS MACROS"
+.
+Here a list of the remaining macros which do not fit well into one of the
+above sections.
+We couldn't find real examples for the following macros:
+.Ql .Me
+and
+.Ql .Ot .
+They are documented here for completeness \- if you know how to use them
+properly please send a mail to
+.Mt bug-groff@gnu.org
+(including an example).
+.
+.Bl -tag -xwidth ".Li .Bt"
+.It Li .Bt
+prints
+.
+.Bd -ragged -offset indent
+.Bt
+.Ed
+.Pp
+It is neither callable nor parsed and takes no arguments.
+.
+.It Li .Fr
+.Pp
+.Dl Usage: .Fr Ao function return value Ac ...
+.Pp
+Don't use this macro.
+It allows a break right before the return value (usually a single digit)
+which is bad typographical behaviour.
+Use
+.Ql \e~
+to tie the return value to the previous word.
+.
+.It Li .Hf
+Use this macro to include a (header) file literally.
+It first prints
+.Ql File:
+followed by the file name, then the contents of
+.Ao file Ac .
+.Pp
+.Dl Usage: .Hf Ao file Ac
+.Pp
+It is neither callable nor parsed.
+.
+.It Li .Lk
+To be written.
+.
+.It Li .Me
+Exact usage unknown.
+The documentation in the
+.Nm \-mdoc
+source file describes it as a macro for
+.Dq "menu entries" .
+.Pp
+Its default width is 6n.
+.
+.It Li .Mt
+To be written.
+.
+.It Li .Ot
+Exact usage unknown.
+The documentation in the
+.Nm \-mdoc
+source file describes it as
+.Dq old function type (fortran) .
+.
+.It Li .Sm
+Activate (toggle) space mode.
+.Pp
+.Dl Usage: .Sm Oo on | off Oc ...
+.Pp
+If space mode is off, no spaces between macro arguments are inserted.
+If called without a parameter (or if the next parameter is neither
+.Ql on
+nor
+.Ql off ,
+.Ql .Sm
+toggles space mode.
+.
+.It Li .Ud
+prints
+.
+.Bd -ragged -offset indent
+.Ud
+.Ed
+.Pp
+It is neither callable nor parsed and takes no arguments.
+.El
+.
+.
+.Sh "PREDEFINED STRINGS"
+.
+The following strings are predefined:
+.Pp
+.Bl -column String infinity "Troff " "straight double quote" -offset indent
+.It Sy String Ta Sy Nroff Ta Sy Troff Ta Sy Meaning
+.It Li <= Ta <= Ta \*[<=] Ta "less equal"
+.It Li >= Ta >= Ta \*[>=] Ta "greater equal"
+.It Li Rq Ta '' Ta \*[Rq] Ta "right double quote"
+.It Li Lq Ta `` Ta \*[Lq] Ta "left double quote"
+.It Li ua Ta ^ Ta \*[ua] Ta "upwards arrow"
+.It Li aa Ta \' Ta \*[aa] Ta "acute accent"
+.It Li ga Ta \` Ta \*[ga] Ta "grave accent"
+.It Li q Ta \&" Ta \*[q] Ta "straight double quote"
+.It Li Pi Ta pi Ta \*[Pi] Ta "greek pi"
+.It Li Ne Ta != Ta \*[Ne] Ta "not equal"
+.It Li Le Ta <= Ta \*[Le] Ta "less equal"
+.It Li Ge Ta >= Ta \*[Ge] Ta "greater equal"
+.It Li Lt Ta < Ta \*[Lt] Ta "less than"
+.It Li Gt Ta > Ta \*[Gt] Ta "greater than"
+.It Li Pm Ta +\- Ta \*[Pm] Ta "plus minus"
+.It Li If Ta infinity Ta \*[If] Ta "infinity"
+.It Li Na Ta \*[Na] Ta \*[Na] Ta "not a number"
+.It Li Ba Ta \*[Ba] Ta \*[Ba] Ta "vertical bar"
+.El
+.Pp
+The names of the columns
+.Sy Nroff
+and
+.Sy Troff
+are a bit misleading;
+.Sy Nroff
+shows the
+.Tn ASCII
+representation, while
+.Sy Troff
+gives the best glyph form available.
+For example, a Unicode enabled
+.Tn TTY Ns - Ns
+device will have proper glyph representations for all strings, whereas the
+enhancement for a Latin1
+.Tn TTY Ns - Ns
+device is only the plus-minus sign.
+.Pp
+String names which consist of two characters can be written as
+.Ql \e*(xx ;
+string names which consist of one character can be written as
+.Ql \e*x .
+A generic syntax for a string name of any length is
+.Ql \e*[xxx]
+(this is a
+.Tn GNU
+.Xr troff 1
+extension).
+.
+.
+\#
+\#=====================================================================
+\#
+.Sh DIAGNOSTICS
+.
+The debugging macro
+.Ql .Db
+available in previous versions of
+.Nm \-mdoc
+has been removed since
+.Tn GNU
+.Xr troff 1
+provides better facilities to check parameters; additionally, many error and
+warning messages have been added to this macro package, making it both more
+robust and verbose.
+.Pp
+The only remaining debugging macro is
+.Ql .Rd
+which yields a register dump of all global registers and strings.
+A normal user will never need it.
+.
+.
+.Sh "FORMATTING WITH GROFF, TROFF, AND NROFF"
+.
+By default, the package inhibits page breaks, headers, and footers if
+displayed with a
+.Tn TTY
+device like
+.Sq latin1
+or
+.Sq unicode
+to make the manual more efficient for viewing on-line.
+This behaviour can be changed (e.g.\& to create a hardcopy of the
+.Tn TTY
+output) by setting the register
+.Ql cR
+to zero while calling
+.Xr groff :
+.Pp
+.Dl groff -Tlatin1 -rcR=0 -mdoc foo.man > foo.txt
+.Pp
+For double-sided printing, set register
+.Ql D
+to\~1:
+.Pp
+.Dl groff -Tps -rD1 -mdoc foo.man > foo.ps
+.Pp
+To change the document font size to 11pt or 12pt, set register
+.Ql S
+accordingly:
+.Pp
+.Dl groff -Tdvi -rS11 -mdoc foo.man > foo.dvi
+.Pp
+Register
+.Ql S
+is ignored for
+.Tn TTY
+devices.
+.
+.
.Sh FILES
-.Bl -tag -width "tmac.doc-ditroff" -compact
-.It Pa tmac.doc
-Manual and general text domain macros.
-.It Pa tmac.doc-common
-Common structural macros and definitions.
-.It Pa tmac.doc-nroff
-Site dependent
-.Xr nroff
-style file.
-.It Pa tmac.doc-ditroff
-Site dependent
-.Xr troff
-style file.
-.It Pa tmac.doc-syms
-Special defines (such as the standards macro).
+.
+.Bl -tag -width mdoc/doc-ditroff -compact
+.It Pa doc.tmac
+The main manual macro package.
+.It Pa mdoc.tmac
+A wrapper file to call
+.Pa doc.tmac .
+.It Pa mdoc/doc-common
+Common strings, definitions, stuff related typographic output.
+.It Pa mdoc/doc-nroff
+Definitions used for a
+.Tn TTY
+output device.
+.It Pa mdoc/doc-ditroff
+Definitions used for all other devices.
+.It Pa mdoc.local
+Local additions and customizations.
+.It Pa andoc.tmac
+This file checks whether the
+.Nm \-mdoc
+or the
+.Nm \-man
+package should be used.
.El
-.Sh SEE ALSO
-.Xr mdoc.samples 7
+.
+.
+.Sh "SEE ALSO"
+.
+.Xr groff 1 ,
+.Xr man 1 ,
+.Xr troff 1 ,
+.Xr groff_man 7
+.
+.
+.Sh BUGS
+.
+Section 3f has not been added to the header routines.
+.Pp
+.Ql \&.Nm
+font should be changed in
+.Sx NAME
+section.
+.Pp
+.Ql \&.Fn
+needs to have a check to prevent splitting up
+if the line length is too short.
+Occasionally it
+separates the last parenthesis, and sometimes
+looks ridiculous if a line is in fill mode.
+.Pp
+The list and display macros do not do any keeps
+and certainly should be able to.
+.\" Note what happens if the parameter list overlaps a newline
+.\" boundary.
+.\" to make sure a line boundary is crossed:
+.\" .Bd -literal
+.\" \&.Fn struct\e\ dictionarytable\e\ *dictionarylookup struct\e\ dictionarytable\e\ *tab[]
+.\" .Ed
+.\" .Pp
+.\" produces, nudge nudge,
+.\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] ,
+.\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] ,
+.\" nudge
+.\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] .
+.\" .Pp
+.\" If double quotes are used, for example:
+.\" .Bd -literal
+.\" \&.Fn \*qstruct dictionarytable *dictionarylookup\*q \*qchar *h\*q \*qstruct dictionarytable *tab[]\*q
+.\" .Ed
+.\" .Pp
+.\" produces, nudge nudge,
+.\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" ,
+.\" nudge
+.\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" ,
+.\" nudge
+.\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" .
+.\" .Pp
+.\" Not a pretty sight...
+.\" In a paragraph, a long parameter containing unpaddable spaces as
+.\" in the former example will cause
+.\" .Xr troff
+.\" to break the line and spread
+.\" the remaining words out.
+.\" The latter example will adjust nicely to
+.\" justified margins, but may break in between an argument and its
+.\" declaration.
+.\" In
+.\" .Xr nroff
+.\" the right margin adjustment is normally ragged and the problem is
+.\" not as severe.
diff --git a/contrib/groff/tmac/groff_me.man b/contrib/groff/tmac/groff_me.man
index 4919621..7debe29 100644
--- a/contrib/groff/tmac/groff_me.man
+++ b/contrib/groff/tmac/groff_me.man
@@ -24,16 +24,16 @@ groff_me \- troff macros for formatting papers
.SH SYNOPSIS
.B "groff \-me"
[ options ]
-file ...
+file ...
.br
-.B "troff \-me"
+.B "groff \-m\ me"
[ options ]
-file ...
+file ...
.SH DESCRIPTION
This manual page describes the GNU version of the \-me macros,
which is part of the groff document formatting system.
This version can be used with both GNU troff and Unix troff.
-This package of
+This package of
.I troff
macro definitions provides a canned formatting
facility for tech%nical papers in various formats.
@@ -65,7 +65,9 @@ and
preprocessors
is acceptable as input.
.SH FILES
-@MACRODIR@/tmac.e
+@MACRODIR@/me.tmac (a wrapper file for e.tmac)
+.br
+@MACRODIR@/e.tmac
.SH "SEE ALSO"
.BR groff (@MAN1EXT@),
.BR @g@troff (@MAN1EXT@)
@@ -74,7 +76,7 @@ is acceptable as input.
.br
Writing Papers with Groff Using \-me
.tr &.
-.SH REQUESTS
+.SH REQUESTS
This list is incomplete;
see
.I "The \-me Reference Manual"
@@ -86,6 +88,7 @@ for interesting details.
\ka
.br
.di
+.na
.in \nau
.ti 0
Request Initial Cause Explanation
@@ -272,3 +275,4 @@ points.
.ti 0
\&.xp \fIx\fR - no Print index
.I x.
+.ad
diff --git a/contrib/groff/tmac/groff_ms.man b/contrib/groff/tmac/groff_ms.man
index 0e1f64c..91463d8 100644
--- a/contrib/groff/tmac/groff_ms.man
+++ b/contrib/groff/tmac/groff_ms.man
@@ -21,7 +21,16 @@ the original English.
groff_ms \- groff ms macros
.SH SYNOPSIS
.B groff
-.B \-m@TMAC_S_PREFIX@s
+.B \-ms
+[
+.IR options .\|.\|.
+]
+[
+.IR files .\|.\|.
+]
+.br
+.B groff
+.B \-m\ ms
[
.IR options .\|.\|.
]
@@ -224,7 +233,11 @@ names containing
.IP \(bu
names containing only uppercase letters and digits.
.SH FILES
-.B @MACRODIR@/tmac.@TMAC_S_PREFIX@s
+.B @MACRODIR@/ms.tmac
+(a wrapper file for
+.BR s.tmac )
+.br
+.B @MACRODIR@/s.tmac
.SH "SEE ALSO"
.BR groff (@MAN1EXT@),
.BR @g@troff (@MAN1EXT@),
diff --git a/contrib/groff/tmac/groff_mwww.man b/contrib/groff/tmac/groff_mwww.man
new file mode 100644
index 0000000..bec719c
--- /dev/null
+++ b/contrib/groff/tmac/groff_mwww.man
@@ -0,0 +1,275 @@
+.TH GROFF_MWWW @MAN7EXT@ "@MDATE@" "Groff Version @VERSION@"
+.\" Copyright (C) 2000 Free Software Foundation, Inc.
+.\" Written by Gaius Mulley (gaius@glam.ac.uk)
+.\"
+.\" This file is part of groff.
+.\"
+.\" 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 2, 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 groff; see the file COPYING. If not, write to the Free Software
+.\" Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+.\"
+.\" user level guide to using the -mwww macroset
+.\"
+.do mso www.tmac
+.\" we need the .LINKS here as we use it in the middle as an example
+.\" once the user requests .LINKS then the automatic generation of links
+.\" at the top of the document is suppresed.
+.LINKS
+.SH NAME
+groff_mwww \- groff macros for authoring web pages
+.LINE
+.SH SYNOPSIS
+.B "groff \-mwww"
+[ options ]
+file ...
+.SH DESCRIPTION
+This manual page describes the GNU \-mwww macros, which is part of the
+groff document formatting system.
+The manual page is very a basic guide, and the html device driver
+.RB ( grohtml )
+has been completely rewritten but still remains as in an alpha state.
+It has been included into the distribution so that a lot of people have a
+chance to test it.
+Note that this macro file will be automatically called (via the
+\fCtroffrc\fP file) if you use \fC-Thtml\fP.
+.PP
+To see the hyperlinks in action, please format this man page with the
+.B grohtml
+device.
+.PP
+Here is a summary of the functions found in this macro set.
+.SH SYNPOSIS
+.ta 2iL
+\&.HTMLINDEX determine automatic link cut off
+.br
+ point for sections/headers
+.br
+\&.BODYCOLOR specify colours on a web page
+.br
+\&.BACKGROUND specify background image
+.br
+\&.URL create a url using two parameters
+.br
+\&.MAILTO create a html email address
+.br
+\&.FTP create an ftp reference
+.br
+\&.IMAGE include an image file
+.br
+\&.HTML pass an html raw request to the
+.br
+ device driver
+.br
+\&.TAG generate an html name tag from $1
+.br
+.\"\&.CDFTP optionally create two different links
+.\".br
+.\" depending on hostname
+.\".br
+\&.LINE create a full width horizontal rule
+.br
+.PP
+Output of the
+.IR pic ,
+.IR eqn ,
+.IR refer ,
+and
+.I tbl
+preprocessors is acceptable as input.
+.SH REQUESTS
+.TP
+.B HTMLINDEX
+determines the cut off point for automatic link generation to headings.
+By default all headings found in a troff document have links created to them
+at the top of the html web page.
+It maybe that many of the lower heading levels do not require links.
+Alternatively some web pages may not need any heading links at all, in which
+case:
+.sp
+.nf
+\fC\&.HTMLINDEX 0\fP
+.fi
+.sp
+will tell
+.B grohtml
+not to generate links.
+An \fCHTMLINDEX\fP of 2 will mean that a heading
+.sp
+.B "1.1.1 Some Title"
+.sp
+will not be included in the links either as it is said to have a heading
+level of three.
+Another method for switching automatic headings is via the command line
+switch \fC-P-l\fP.
+.TP
+.B BODYCOLOR
+takes five parameters: foreground, background, active hypertext link,
+hypertext link not yet visited, and visited hypertext link colour.
+.TP
+.B BACKGROUND
+the only parameter to this macro is the background image file.
+.TP
+.B URL
+generates
+.TAG URL
+a URL using either two or three arguments.
+$1 is the name of the link, $2 is the actual URL, and $3 is optional stuff
+to be printed immediately after $2.
+Here is how to encode
+.URL "homepage for groff" http://groff.ffii.org/ :
+.sp
+.nf
+\s-2\fC\&.URL "homepage for groff" http://groff.ffii.org/ :\fP\s+2
+.fi
+.sp
+If this is processed by a device other than \fC-Thtml\fP
+it appears as:
+homepage for groff \(lahttp://groff.ffii.org\(ra.
+The URL macro can be of any type; for example we can reference
+.URL "Eric Raymond's pic guide" pic.html
+by:
+.sp
+.nf
+\s-2\fC\&.URL "Eric Raymond's pic guide" pic.html\fP\s+2
+.fi
+.sp
+.TP
+.B MAILTO
+generates an email html reference.
+The first argument is mandatory as the email address.
+The optional second argument is the text you see in your browser, and
+an optional third argument is stuff printed immediately after the
+second argument.
+For example, the groff maintainers are
+.MAILTO wl@gnu.org "Werner Lemberg"
+and
+.MAILTO Ted.Harding@nessie.mcc.ac.uk "Ted Harding" .
+This is achieved by the following macros:
+.sp
+.nf
+\s-2\fC\&.MAILTO wl@gnu.org "Werner Lemberg"
+\&.MAILTO Ted.Harding@nessie.mcc.ac.uk "Ted Harding" .\s+2\fP
+.fi
+.sp
+Note that all the urls actually are treated as consuming no textual space
+in groff.
+This could be considered as a bug since it causes some problems.
+To circumvent this, \fCwww.tmac\fP inserts a zero-width character which
+expands to a harmless space (only if run with -Thtml).
+.TP
+.B FTP
+indicates that data can be obtained via ftp.
+The first argument is the browser text and the second is the url.
+A third argument, similar to the macros above, is intended for stuff printed
+immediately after the second argument.
+The second and the third parameter are optional.
+As an example, here the location of the
+.FTP "current groff development distribution" \
+ftp://ftp.ffii.org/pub/groff/devel/groff-current.tar.gz .
+The macro example above was specified by:
+.sp
+.nf
+\s-2\fC\&.FTP "current groff development distribution" \\
+ftp://ftp.ffii.org/pub/groff/devel/groff-current.tar.gz .\fP\s+2
+.fi
+.sp
+.TP
+.B IMAGE
+allows the document to include pictures.
+The first argument is the image file.
+The next two arguments are optional:
+Argument two is the width in pixels (default is 400 pixels if absent).
+The third argument is the height in pixels (default is the width value if
+absent).
+.sp
+.TP
+.B HTML
+all text after this macro is treated as raw html.
+If the document is processed \fIwithout\fP \fC-Thtml\fP then
+the macro is ignored.
+This macro is a building block for other higher level macros.
+.sp
+For example, the \fCBACKGROUND\fP macro is defined as:
+.nf
+\fC\&.de BACKGROUND
+\&. HTML <body background=\\$1>
+\&..
+\fP
+.fi
+.TP
+.B TAG
+generates an html name tag from its argument.
+This can then be referenced using the
+.URL URL #URL
+macro.
+As you can see, you must precede the tag name with `\fC#\fP' since it is
+a local reference.
+This link was achieved via placing a TAG in the URL description above;
+the source looks like this:
+.sp
+.nf
+\s-2\fC\&.TP
+\&.B URL
+generates
+\&.TAG URL
+a URL using either two or three
+arguments.
+$1 is the name of the link, $2 is the actual URL.\fP\s+2
+.fi
+.sp
+.TP
+.B LINE
+generates a full width horizontal rule.
+Example:
+.sp
+.nf
+\fC\s-2\&.LINE\fP\s+2
+.fi
+.sp
+.TP
+.B LINKS
+.TAG LINK
+requests that grohtml place the automatically generated links at this position.
+For example:
+.LINKS
+.SH
+SECTION HEADING LINKS
+.LP
+By default
+.B grohtml
+generates links to all section headings and places these at the top of the
+html document. (See
+.URL LINKS #LINK
+for details of how to switch this off or alter the position.
+.SH
+LIMITATIONS OF GROHTML
+.LP
+Tbl information is currently rendered as a png image.
+.SH FILES
+@MACRODIR@/mwww.tmac (a wrapper for www.tmac)
+.br
+@MACRODIR@/www.tmac
+.SH "SEE ALSO"
+.BR groff (@MAN1EXT@),
+.BR @g@troff (@MAN1EXT@)
+.BR grohtml (@MAN1EXT@),
+.LP
+.SH AUTHOR
+.B Grohtml
+was written by
+.MAILTO gaius@glam.ac.uk "Gaius Mulley"
+.SH BUGS
+Report bugs to the
+.MAILTO bug-groff@gnu.org "Groff Bug Mailing List" .
+Include a complete, self-contained example that will allow the bug to be
+reproduced, and say which version of groff you are using.
diff --git a/contrib/groff/tmac/groff_tmac.man b/contrib/groff/tmac/groff_tmac.man
index 9e1f8e0..4eb731c 100644
--- a/contrib/groff/tmac/groff_tmac.man
+++ b/contrib/groff/tmac/groff_tmac.man
@@ -1,4 +1,4 @@
-.\" -*- nroff -*-
+.\" -*- nroff -*-
.ig /
groff_tmac.5
@@ -24,7 +24,7 @@ FDL in the main directory of the groff source package.
.\" --------------------------------------------------------------------
.
.if n \{\
-. mso tmac.tty-char
+. mso tty-char.tmac
. ftr CR R
. ftr CI I
. ftr CB B
@@ -37,7 +37,7 @@ FDL in the main directory of the groff source package.
.
.de BIR
. ie (\\n[.$] < 3) \
-. BI $@
+. BI \\$@
. el \{\
. ds @tmp@ \fB\\$1\fP\fI\\$2\fP
. shift 2
@@ -111,13 +111,16 @@ this letter was omitted, e.g., the macro package for the man pages
was called
.I an
and its macro file
-.IR tmac.an .
+.I tmac.an
+(note that in recent versions of groff this file is called
+.I an.tmac
+instead).
.LP
By a similar reasoning, macro packages that did not start with an
.'char m
were often referred to by adding an
.'char m ,
- e.g., the package corresponding to
+e.g., the package corresponding to
.I tmac.doc
was called
.I mdoc
@@ -149,11 +152,13 @@ macro package may be specified as
.RE
.LP
The easiest way to find out which macro packages are available on a
-system is to check the content of the
+system is to check the contents of the
.I tmac
directories.
For example, a file called
.BI tmac. anything
+or
+.IB anything .tmac
determines a macro package named
.IR anything .
.LP
@@ -172,11 +177,14 @@ run-time, the groff option
.option \-m \ \c
.argument name
makes the definitions in the macro file
-.BI tmac. name
+.IB name .tmac
available as described in the section
.BR NAMING .
+If this file isn't found,
+.BI tmac. name
+will be searched.
.LP
-It is also possible to include the macro file into the document by using
+It is also possible to include the macro file into the document by using
the groff requests
.request .so
or
@@ -188,7 +196,14 @@ directory where it is kept.
If the macro file is stored in one of the tmac directories it is more
convenient to use
.request .mso
-instead because it additionally searches the tmac path for the filename.
+instead because it searches the tmac path for the filename.
+Additionally, if the file name to be included has the form
+.IB name .tmac
+and it isn't found,
+.request .mso
+will try to open
+.BI tmac. name
+instead and vice versa.
.LP
Note that in order to resolve the
.request .so
@@ -196,8 +211,9 @@ and
.request .mso
requests the roff preprocessor
.shellcommand soelim
-must be called. This can be done either directly by a pipeline on the
-command line or by using the
+must be called if the files to be included needs preprocessing.
+This can be done either directly by a pipeline on the command line or by
+using the
.option \-s
option of
.shellcommand groff .
@@ -208,7 +224,7 @@ in the preprocessor word as described in section
.BR CONVENTION .
.LP
For example, suppose a macro file is stored as
-.I /usr/share/groff/tmac/tmac.macros
+.I @MACRODIR@/macros.tmac
and is used in some document called
.IR docu.roff .
.LP
@@ -225,13 +241,13 @@ At run-time, the formatter call for this is
To include the macro file directly in the document either
.RS
.ft CR
-\&\.mso tmac.macros
+\&\.mso macros.tmac
.ft P
.RE
is used or
.RS
.ft CR
-\&\.so /usr/share/groff/tmac/tmac.macros
+\&\.so @MACRODIR@/macros.tmac
.ft P
.RE
.LP
@@ -257,8 +273,8 @@ comment characters and a blank) constitutes the
.BR word .
That means that the letters of this word are interpreted as
abbreviations for those preprocessor commands that should be run
-when formatting the document. Mostly, only the letters corresponding to
-the options for the preprocessors are recognized,
+when formatting the document. Mostly, only the letters corresponding to
+the options for the preprocessors are recognized,
.'char e ,
.'char G ,
.'char g ,
@@ -285,8 +301,10 @@ request as described in the
section.
.LP
To use the tmac functionality, call the macro file
-.BI tmac. whatever
-and put it in some directory of the tmac path, cf. section
+.IB whatever .tmac
+(or
+.BI tmac. whatever\c
+) and put it in some directory of the tmac path, cf. section
.BR FILES .
Then documents can include it with the
.request .mso
@@ -333,38 +351,51 @@ and
.\" --------------------------------------------------------------------
.SH FILES
.\" --------------------------------------------------------------------
-All macro names that want to use the tmac mechanism must be named
-according to the form
-.BIR tmac. name .
+All macro names must be named
+.IB name .tmac
+or
+.BI tmac. name
+to use the tmac mechanism.
.LP
The macro files are kept in the
.B tmac
.BR directories ,
-all of which constitue the
+all of which constitute the
.B tmac
.BR path.
-In accordance with the Filesystem Hierarchy Standard (FHS), the standard
-tmac directory location for groff is
-.IR /usr/share/groff/tmac ,
-a local installation will use
-.IR /usr/local/share/groff/tmac .
-Older systems used a subdirectory of
-.IR /usr/lib .
-Independently of the default tmac path, the tmac path actually used by a
-document can always be set by a shell environment variable, cf. section
-.BR ENVIRONMENT .
+.LP
+The elements of the search path for macro files are (in that order):
+.IP \(bu 4
+the directories specified with troff's resp. groff's
+.B \-M
+command line option
+.IP \(bu 4
+the directories given in the
+.B GROFF_TMAC_PATH
+environment variable
+.IP \(bu 4
+the current directory (only if in unsafe mode using the
+.B \-U
+command line switch)
+.IP \(bu 4
+the home directory
+.IP \(bu 4
+a site-specific (platform-independent) directory, a platform-specific
+directory, and the main tmac directory:
+.IP "" 6
+@LOCALMACRODIR@
+.br
+@SYSTEMMACRODIR@
+.br
+@MACRODIR@
.\" --------------------------------------------------------------------
.SH ENVIRONMENT
.\" --------------------------------------------------------------------
.TP
.B GROFF_TMAC_PATH
-A colon separated list of tmac directories in which to search for macro
-files, the
-.B tmac
-.BR path .
-If unset a default path is used as is outlined in the
-.B FILES
-section.
+A colon separated list of additional tmac directories in which to search
+for macro files.
+See the previous section for a detailed description.
.\" --------------------------------------------------------------------
.SH BUGS
.\" --------------------------------------------------------------------
@@ -400,14 +431,14 @@ in the groff source package.
.LP
The groff tmac macro packages are
.BR groff_man (@MAN7EXT@),
-.BR groff_markup (@MAN7EXT@),
+.BR groff_mwww (@MAN7EXT@),
.BR groff_mdoc (@MAN7EXT@),
.BR groff_mdoc.samples (@MAN7EXT@),
.BR groff_me (@MAN7EXT@),
.BR groff_mm (@MAN7EXT@),
.BR groff_mmroff (@MAN7EXT@),
-.BR groff_ms (@MAN7EXT@),
-.BR groff_msafer (@MAN7EXT@).
+and
+.BR groff_ms (@MAN7EXT@).
.LP
The groff language is described in
.BR groff (@MAN7EXT@)
@@ -417,4 +448,3 @@ and the formatters in
.LP
The Filesystem Hierarchy Standard (FHS) is available at
.BR http://www.pathname.com/fhs/ .
-
diff --git a/contrib/groff/tmac/html.tmac b/contrib/groff/tmac/html.tmac
new file mode 100644
index 0000000..c5591c8
--- /dev/null
+++ b/contrib/groff/tmac/html.tmac
@@ -0,0 +1,47 @@
+.\" html.tmac
+.\"
+.nr _C \n(.C
+.cp 0
+.ftr CW CR
+.ftr C CR
+.ftr CO CI
+.ftr CX CBI
+.ftr H HR
+.ftr HO HI
+.ftr HX HBI
+.ftr NX NBI
+.if !c\(em .char \(em --
+.if !c\(en .char \(en \-
+.if !c\(fi .char \(fi fi
+.if !c\(fl .char \(fl fl
+.if !c\(ff .char \(ff ff
+.if !c\(Fi .char \(Fi ffi
+.if !c\(Fl .char \(Fl ffl
+.if !c\(lq .char \(lq ``
+.if !c\(rq .char \(rq ''
+.if !c\(Bq .char \(bq ,,
+.if !c\(OE .char \(OE OE
+.if !c\(oe .char \(oe oe
+.if !c\(lh .char \(lh <-
+.if !c\(rh .char \(rh ->
+.if !c\(bq .tr \(bq,
+.if !c\(aq .tr \(aq'
+.if !\n(_C .mso pspic.tmac
+.cp \n(_C
+.\" now turn off all headers and footers for ms, me and mm macro sets
+.if d EF .EF ''''
+.if d EH .EH ''''
+.if d OF .OF ''''
+.if d OH .OH ''''
+.if d ef .ef ''''
+.if d of .of ''''
+.if d oh .oh ''''
+.if d eh .eh ''''
+.tl ''''
+.\" it doesn't make sense to use hyphenation with html, so we turn it off.
+.hy 0
+.nr HY 0
+.\" avoid line breaks after hyphen-like characters.
+.cflags 0 -\(hy\(em\(en\[shc]
+.pl 99999
+.\" eof of file, make sure this is the last time
diff --git a/contrib/groff/tmac/hyphen.us b/contrib/groff/tmac/hyphen.us
new file mode 100644
index 0000000..d86c3d5
--- /dev/null
+++ b/contrib/groff/tmac/hyphen.us
@@ -0,0 +1,4449 @@
+% Hyphenation patterns for US English.
+% These are the standard Plain TeX hyphenation patterns (in hyphen.tex).
+.ach4
+.ad4der
+.af1t
+.al3t
+.am5at
+.an5c
+.ang4
+.ani5m
+.ant4
+.an3te
+.anti5s
+.ar5s
+.ar4tie
+.ar4ty
+.as3c
+.as1p
+.as1s
+.aster5
+.atom5
+.au1d
+.av4i
+.awn4
+.ba4g
+.ba5na
+.bas4e
+.ber4
+.be5ra
+.be3sm
+.be5sto
+.bri2
+.but4ti
+.cam4pe
+.can5c
+.capa5b
+.car5ol
+.ca4t
+.ce4la
+.ch4
+.chill5i
+.ci2
+.cit5r
+.co3e
+.co4r
+.cor5ner
+.de4moi
+.de3o
+.de3ra
+.de3ri
+.des4c
+.dictio5
+.do4t
+.du4c
+.dumb5
+.earth5
+.eas3i
+.eb4
+.eer4
+.eg2
+.el5d
+.el3em
+.enam3
+.en3g
+.en3s
+.eq5ui5t
+.er4ri
+.es3
+.eu3
+.eye5
+.fes3
+.for5mer
+.ga2
+.ge2
+.gen3t4
+.ge5og
+.gi5a
+.gi4b
+.go4r
+.hand5i
+.han5k
+.he2
+.hero5i
+.hes3
+.het3
+.hi3b
+.hi3er
+.hon5ey
+.hon3o
+.hov5
+.id4l
+.idol3
+.im3m
+.im5pin
+.in1
+.in3ci
+.ine2
+.in2k
+.in3s
+.ir5r
+.is4i
+.ju3r
+.la4cy
+.la4m
+.lat5er
+.lath5
+.le2
+.leg5e
+.len4
+.lep5
+.lev1
+.li4g
+.lig5a
+.li2n
+.li3o
+.li4t
+.mag5a5
+.mal5o
+.man5a
+.mar5ti
+.me2
+.mer3c
+.me5ter
+.mis1
+.mist5i
+.mon3e
+.mo3ro
+.mu5ta
+.muta5b
+.ni4c
+.od2
+.odd5
+.of5te
+.or5ato
+.or3c
+.or1d
+.or3t
+.os3
+.os4tl
+.oth3
+.out3
+.ped5al
+.pe5te
+.pe5tit
+.pi4e
+.pio5n
+.pi2t
+.pre3m
+.ra4c
+.ran4t
+.ratio5na
+.ree2
+.re5mit
+.res2
+.re5stat
+.ri4g
+.rit5u
+.ro4q
+.ros5t
+.row5d
+.ru4d
+.sci3e
+.self5
+.sell5
+.se2n
+.se5rie
+.sh2
+.si2
+.sing4
+.st4
+.sta5bl
+.sy2
+.ta4
+.te4
+.ten5an
+.th2
+.ti2
+.til4
+.tim5o5
+.ting4
+.tin5k
+.ton4a
+.to4p
+.top5i
+.tou5s
+.trib5ut
+.un1a
+.un3ce
+.under5
+.un1e
+.un5k
+.un5o
+.un3u
+.up3
+.ure3
+.us5a
+.ven4de
+.ve5ra
+.wil5i
+.ye4
+4ab.
+a5bal
+a5ban
+abe2
+ab5erd
+abi5a
+ab5it5ab
+ab5lat
+ab5o5liz
+4abr
+ab5rog
+ab3ul
+a4car
+ac5ard
+ac5aro
+a5ceou
+ac1er
+a5chet
+4a2ci
+a3cie
+ac1in
+a3cio
+ac5rob
+act5if
+ac3ul
+ac4um
+a2d
+ad4din
+ad5er.
+2adi
+a3dia
+ad3ica
+adi4er
+a3dio
+a3dit
+a5diu
+ad4le
+ad3ow
+ad5ran
+ad4su
+4adu
+a3duc
+ad5um
+ae4r
+aeri4e
+a2f
+aff4
+a4gab
+aga4n
+ag5ell
+age4o
+4ageu
+ag1i
+4ag4l
+ag1n
+a2go
+3agog
+ag3oni
+a5guer
+ag5ul
+a4gy
+a3ha
+a3he
+ah4l
+a3ho
+ai2
+a5ia
+a3ic.
+ai5ly
+a4i4n
+ain5in
+ain5o
+ait5en
+a1j
+ak1en
+al5ab
+al3ad
+a4lar
+4aldi
+2ale
+al3end
+a4lenti
+a5le5o
+al1i
+al4ia.
+ali4e
+al5lev
+4allic
+4alm
+a5log.
+a4ly.
+4alys
+5a5lyst
+5alyt
+3alyz
+4ama
+am5ab
+am3ag
+ama5ra
+am5asc
+a4matis
+a4m5ato
+am5era
+am3ic
+am5if
+am5ily
+am1in
+ami4no
+a2mo
+a5mon
+amor5i
+amp5en
+a2n
+an3age
+3analy
+a3nar
+an3arc
+anar4i
+a3nati
+4and
+ande4s
+an3dis
+an1dl
+an4dow
+a5nee
+a3nen
+an5est.
+a3neu
+2ang
+ang5ie
+an1gl
+a4n1ic
+a3nies
+an3i3f
+an4ime
+a5nimi
+a5nine
+an3io
+a3nip
+an3ish
+an3it
+a3niu
+an4kli
+5anniz
+ano4
+an5ot
+anoth5
+an2sa
+an4sco
+an4sn
+an2sp
+ans3po
+an4st
+an4sur
+antal4
+an4tie
+4anto
+an2tr
+an4tw
+an3ua
+an3ul
+a5nur
+4ao
+apar4
+ap5at
+ap5ero
+a3pher
+4aphi
+a4pilla
+ap5illar
+ap3in
+ap3ita
+a3pitu
+a2pl
+apoc5
+ap5ola
+apor5i
+apos3t
+aps5es
+a3pu
+aque5
+2a2r
+ar3act
+a5rade
+ar5adis
+ar3al
+a5ramete
+aran4g
+ara3p
+ar4at
+a5ratio
+ar5ativ
+a5rau
+ar5av4
+araw4
+arbal4
+ar4chan
+ar5dine
+ar4dr
+ar5eas
+a3ree
+ar3ent
+a5ress
+ar4fi
+ar4fl
+ar1i
+ar5ial
+ar3ian
+a3riet
+ar4im
+ar5inat
+ar3io
+ar2iz
+ar2mi
+ar5o5d
+a5roni
+a3roo
+ar2p
+ar3q
+arre4
+ar4sa
+ar2sh
+4as.
+as4ab
+as3ant
+ashi4
+a5sia.
+a3sib
+a3sic
+5a5si4t
+ask3i
+as4l
+a4soc
+as5ph
+as4sh
+as3ten
+as1tr
+asur5a
+a2ta
+at3abl
+at5ac
+at3alo
+at5ap
+ate5c
+at5ech
+at3ego
+at3en.
+at3era
+ater5n
+a5terna
+at3est
+at5ev
+4ath
+ath5em
+a5then
+at4ho
+ath5om
+4ati.
+a5tia
+at5i5b
+at1ic
+at3if
+ation5ar
+at3itu
+a4tog
+a2tom
+at5omiz
+a4top
+a4tos
+a1tr
+at5rop
+at4sk
+at4tag
+at5te
+at4th
+a2tu
+at5ua
+at5ue
+at3ul
+at3ura
+a2ty
+au4b
+augh3
+au3gu
+au4l2
+aun5d
+au3r
+au5sib
+aut5en
+au1th
+a2va
+av3ag
+a5van
+ave4no
+av3era
+av5ern
+av5ery
+av1i
+avi4er
+av3ig
+av5oc
+a1vor
+3away
+aw3i
+aw4ly
+aws4
+ax4ic
+ax4id
+ay5al
+aye4
+ays4
+azi4er
+azz5i
+5ba.
+bad5ger
+ba4ge
+bal1a
+ban5dag
+ban4e
+ban3i
+barbi5
+bari4a
+bas4si
+1bat
+ba4z
+2b1b
+b2be
+b3ber
+bbi4na
+4b1d
+4be.
+beak4
+beat3
+4be2d
+be3da
+be3de
+be3di
+be3gi
+be5gu
+1bel
+be1li
+be3lo
+4be5m
+be5nig
+be5nu
+4bes4
+be3sp
+be5str
+3bet
+bet5iz
+be5tr
+be3tw
+be3w
+be5yo
+2bf
+4b3h
+bi2b
+bi4d
+3bie
+bi5en
+bi4er
+2b3if
+1bil
+bi3liz
+bina5r4
+bin4d
+bi5net
+bi3ogr
+bi5ou
+bi2t
+3bi3tio
+bi3tr
+3bit5ua
+b5itz
+b1j
+bk4
+b2l2
+blath5
+b4le.
+blen4
+5blesp
+b3lis
+b4lo
+blun4t
+4b1m
+4b3n
+bne5g
+3bod
+bod3i
+bo4e
+bol3ic
+bom4bi
+bon4a
+bon5at
+3boo
+5bor.
+4b1ora
+bor5d
+5bore
+5bori
+5bos4
+b5ota
+both5
+bo4to
+bound3
+4bp
+4brit
+broth3
+2b5s2
+bsor4
+2bt
+bt4l
+b4to
+b3tr
+buf4fer
+bu4ga
+bu3li
+bumi4
+bu4n
+bunt4i
+bu3re
+bus5ie
+buss4e
+5bust
+4buta
+3butio
+b5uto
+b1v
+4b5w
+5by.
+bys4
+1ca
+cab3in
+ca1bl
+cach4
+ca5den
+4cag4
+2c5ah
+ca3lat
+cal4la
+call5in
+4calo
+can5d
+can4e
+can4ic
+can5is
+can3iz
+can4ty
+cany4
+ca5per
+car5om
+cast5er
+cas5tig
+4casy
+ca4th
+4cativ
+cav5al
+c3c
+ccha5
+cci4a
+ccompa5
+ccon4
+ccou3t
+2ce.
+4ced.
+4ceden
+3cei
+5cel.
+3cell
+1cen
+3cenc
+2cen4e
+4ceni
+3cent
+3cep
+ce5ram
+4cesa
+3cessi
+ces5si5b
+ces5t
+cet4
+c5e4ta
+cew4
+2ch
+4ch.
+4ch3ab
+5chanic
+ch5a5nis
+che2
+cheap3
+4ched
+che5lo
+3chemi
+ch5ene
+ch3er.
+ch3ers
+4ch1in
+5chine.
+ch5iness
+5chini
+5chio
+3chit
+chi2z
+3cho2
+ch4ti
+1ci
+3cia
+ci2a5b
+cia5r
+ci5c
+4cier
+5cific.
+4cii
+ci4la
+3cili
+2cim
+2cin
+c4ina
+3cinat
+cin3em
+c1ing
+c5ing.
+5cino
+cion4
+4cipe
+ci3ph
+4cipic
+4cista
+4cisti
+2c1it
+cit3iz
+5ciz
+ck1
+ck3i
+1c4l4
+4clar
+c5laratio
+5clare
+cle4m
+4clic
+clim4
+cly4
+c5n
+1co
+co5ag
+coe2
+2cog
+co4gr
+coi4
+co3inc
+col5i
+5colo
+col3or
+com5er
+con4a
+c4one
+con3g
+con5t
+co3pa
+cop3ic
+co4pl
+4corb
+coro3n
+cos4e
+cov1
+cove4
+cow5a
+coz5e
+co5zi
+c1q
+cras5t
+5crat.
+5cratic
+cre3at
+5cred
+4c3reta
+cre4v
+cri2
+cri5f
+c4rin
+cris4
+5criti
+cro4pl
+crop5o
+cros4e
+cru4d
+4c3s2
+2c1t
+cta4b
+ct5ang
+c5tant
+c2te
+c3ter
+c4ticu
+ctim3i
+ctu4r
+c4tw
+cud5
+c4uf
+c4ui
+cu5ity
+5culi
+cul4tis
+3cultu
+cu2ma
+c3ume
+cu4mi
+3cun
+cu3pi
+cu5py
+cur5a4b
+cu5ria
+1cus
+cuss4i
+3c4ut
+cu4tie
+4c5utiv
+4cutr
+1cy
+cze4
+1d2a
+5da.
+2d3a4b
+dach4
+4daf
+2dag
+da2m2
+dan3g
+dard5
+dark5
+4dary
+3dat
+4dativ
+4dato
+5dav4
+dav5e
+5day
+d1b
+d5c
+d1d4
+2de.
+deaf5
+deb5it
+de4bon
+decan4
+de4cil
+de5com
+2d1ed
+4dee.
+de5if
+deli4e
+del5i5q
+de5lo
+d4em
+5dem.
+3demic
+dem5ic.
+de5mil
+de4mons
+demor5
+1den
+de4nar
+de3no
+denti5f
+de3nu
+de1p
+de3pa
+depi4
+de2pu
+d3eq
+d4erh
+5derm
+dern5iz
+der5s
+des2
+d2es.
+de1sc
+de2s5o
+des3ti
+de3str
+de4su
+de1t
+de2to
+de1v
+dev3il
+4dey
+4d1f
+d4ga
+d3ge4t
+dg1i
+d2gy
+d1h2
+5di.
+1d4i3a
+dia5b
+di4cam
+d4ice
+3dict
+3did
+5di3en
+d1if
+di3ge
+di4lato
+d1in
+1dina
+3dine.
+5dini
+di5niz
+1dio
+dio5g
+di4pl
+dir2
+di1re
+dirt5i
+dis1
+5disi
+d4is3t
+d2iti
+1di1v
+d1j
+d5k2
+4d5la
+3dle.
+3dled
+3dles.
+4dless
+2d3lo
+4d5lu
+2dly
+d1m
+4d1n4
+1do
+3do.
+do5de
+5doe
+2d5of
+d4og
+do4la
+doli4
+do5lor
+dom5iz
+do3nat
+doni4
+doo3d
+dop4p
+d4or
+3dos
+4d5out
+do4v
+3dox
+d1p
+1dr
+drag5on
+4drai
+dre4
+drea5r
+5dren
+dri4b
+dril4
+dro4p
+4drow
+5drupli
+4dry
+2d1s2
+ds4p
+d4sw
+d4sy
+d2th
+1du
+d1u1a
+du2c
+d1uca
+duc5er
+4duct.
+4ducts
+du5el
+du4g
+d3ule
+dum4be
+du4n
+4dup
+du4pe
+d1v
+d1w
+d2y
+5dyn
+dy4se
+dys5p
+e1a4b
+e3act
+ead1
+ead5ie
+ea4ge
+ea5ger
+ea4l
+eal5er
+eal3ou
+eam3er
+e5and
+ear3a
+ear4c
+ear5es
+ear4ic
+ear4il
+ear5k
+ear2t
+eart3e
+ea5sp
+e3ass
+east3
+ea2t
+eat5en
+eath3i
+e5atif
+e4a3tu
+ea2v
+eav3en
+eav5i
+eav5o
+2e1b
+e4bel.
+e4bels
+e4ben
+e4bit
+e3br
+e4cad
+ecan5c
+ecca5
+e1ce
+ec5essa
+ec2i
+e4cib
+ec5ificat
+ec5ifie
+ec5ify
+ec3im
+eci4t
+e5cite
+e4clam
+e4clus
+e2col
+e4comm
+e4compe
+e4conc
+e2cor
+ec3ora
+eco5ro
+e1cr
+e4crem
+ec4tan
+ec4te
+e1cu
+e4cul
+ec3ula
+2e2da
+4ed3d
+e4d1er
+ede4s
+4edi
+e3dia
+ed3ib
+ed3ica
+ed3im
+ed1it
+edi5z
+4edo
+e4dol
+edon2
+e4dri
+e4dul
+ed5ulo
+ee2c
+eed3i
+ee2f
+eel3i
+ee4ly
+ee2m
+ee4na
+ee4p1
+ee2s4
+eest4
+ee4ty
+e5ex
+e1f
+e4f3ere
+1eff
+e4fic
+5efici
+efil4
+e3fine
+ef5i5nite
+3efit
+efor5es
+e4fuse.
+4egal
+eger4
+eg5ib
+eg4ic
+eg5ing
+e5git5
+eg5n
+e4go.
+e4gos
+eg1ul
+e5gur
+5egy
+e1h4
+eher4
+ei2
+e5ic
+ei5d
+eig2
+ei5gl
+e3imb
+e3inf
+e1ing
+e5inst
+eir4d
+eit3e
+ei3th
+e5ity
+e1j
+e4jud
+ej5udi
+eki4n
+ek4la
+e1la
+e4la.
+e4lac
+elan4d
+el5ativ
+e4law
+elaxa4
+e3lea
+el5ebra
+5elec
+e4led
+el3ega
+e5len
+e4l1er
+e1les
+el2f
+el2i
+e3libe
+e4l5ic.
+el3ica
+e3lier
+el5igib
+e5lim
+e4l3ing
+e3lio
+e2lis
+el5ish
+e3liv3
+4ella
+el4lab
+ello4
+e5loc
+el5og
+el3op.
+el2sh
+el4ta
+e5lud
+el5ug
+e4mac
+e4mag
+e5man
+em5ana
+em5b
+e1me
+e2mel
+e4met
+em3ica
+emi4e
+em5igra
+em1in2
+em5ine
+em3i3ni
+e4mis
+em5ish
+e5miss
+em3iz
+5emniz
+emo4g
+emoni5o
+em3pi
+e4mul
+em5ula
+emu3n
+e3my
+en5amo
+e4nant
+ench4er
+en3dic
+e5nea
+e5nee
+en3em
+en5ero
+en5esi
+en5est
+en3etr
+e3new
+en5ics
+e5nie
+e5nil
+e3nio
+en3ish
+en3it
+e5niu
+5eniz
+4enn
+4eno
+eno4g
+e4nos
+en3ov
+en4sw
+ent5age
+4enthes
+en3ua
+en5uf
+e3ny.
+4en3z
+e5of
+eo2g
+e4oi4
+e3ol
+eop3ar
+e1or
+eo3re
+eo5rol
+eos4
+e4ot
+eo4to
+e5out
+e5ow
+e2pa
+e3pai
+ep5anc
+e5pel
+e3pent
+ep5etitio
+ephe4
+e4pli
+e1po
+e4prec
+ep5reca
+e4pred
+ep3reh
+e3pro
+e4prob
+ep4sh
+ep5ti5b
+e4put
+ep5uta
+e1q
+equi3l
+e4q3ui3s
+er1a
+era4b
+4erand
+er3ar
+4erati.
+2erb
+er4bl
+er3ch
+er4che
+2ere.
+e3real
+ere5co
+ere3in
+er5el.
+er3emo
+er5ena
+er5ence
+4erene
+er3ent
+ere4q
+er5ess
+er3est
+eret4
+er1h
+er1i
+e1ria4
+5erick
+e3rien
+eri4er
+er3ine
+e1rio
+4erit
+er4iu
+eri4v
+e4riva
+er3m4
+er4nis
+4ernit
+5erniz
+er3no
+2ero
+er5ob
+e5roc
+ero4r
+er1ou
+er1s
+er3set
+ert3er
+4ertl
+er3tw
+4eru
+eru4t
+5erwau
+e1s4a
+e4sage.
+e4sages
+es2c
+e2sca
+es5can
+e3scr
+es5cu
+e1s2e
+e2sec
+es5ecr
+es5enc
+e4sert.
+e4serts
+e4serva
+4esh
+e3sha
+esh5en
+e1si
+e2sic
+e2sid
+es5iden
+es5igna
+e2s5im
+es4i4n
+esis4te
+esi4u
+e5skin
+es4mi
+e2sol
+es3olu
+e2son
+es5ona
+e1sp
+es3per
+es5pira
+es4pre
+2ess
+es4si4b
+estan4
+es3tig
+es5tim
+4es2to
+e3ston
+2estr
+e5stro
+estruc5
+e2sur
+es5urr
+es4w
+eta4b
+eten4d
+e3teo
+ethod3
+et1ic
+e5tide
+etin4
+eti4no
+e5tir
+e5titio
+et5itiv
+4etn
+et5ona
+e3tra
+e3tre
+et3ric
+et5rif
+et3rog
+et5ros
+et3ua
+et5ym
+et5z
+4eu
+e5un
+e3up
+eu3ro
+eus4
+eute4
+euti5l
+eu5tr
+eva2p5
+e2vas
+ev5ast
+e5vea
+ev3ell
+evel3o
+e5veng
+even4i
+ev1er
+e5verb
+e1vi
+ev3id
+evi4l
+e4vin
+evi4v
+e5voc
+e5vu
+e1wa
+e4wag
+e5wee
+e3wh
+ewil5
+ew3ing
+e3wit
+1exp
+5eyc
+5eye.
+eys4
+1fa
+fa3bl
+fab3r
+fa4ce
+4fag
+fain4
+fall5e
+4fa4ma
+fam5is
+5far
+far5th
+fa3ta
+fa3the
+4fato
+fault5
+4f5b
+4fd
+4fe.
+feas4
+feath3
+fe4b
+4feca
+5fect
+2fed
+fe3li
+fe4mo
+fen2d
+fend5e
+fer1
+5ferr
+fev4
+4f1f
+f4fes
+f4fie
+f5fin.
+f2f5is
+f4fly
+f2fy
+4fh
+1fi
+fi3a
+2f3ic.
+4f3ical
+f3ican
+4ficate
+f3icen
+fi3cer
+fic4i
+5ficia
+5ficie
+4fics
+fi3cu
+fi5del
+fight5
+fil5i
+fill5in
+4fily
+2fin
+5fina
+fin2d5
+fi2ne
+f1in3g
+fin4n
+fis4ti
+f4l2
+f5less
+flin4
+flo3re
+f2ly5
+4fm
+4fn
+1fo
+5fon
+fon4de
+fon4t
+fo2r
+fo5rat
+for5ay
+fore5t
+for4i
+fort5a
+fos5
+4f5p
+fra4t
+f5rea
+fres5c
+fri2
+fril4
+frol5
+2f3s
+2ft
+f4to
+f2ty
+3fu
+fu5el
+4fug
+fu4min
+fu5ne
+fu3ri
+fusi4
+fus4s
+4futa
+1fy
+1ga
+gaf4
+5gal.
+3gali
+ga3lo
+2gam
+ga5met
+g5amo
+gan5is
+ga3niz
+gani5za
+4gano
+gar5n4
+gass4
+gath3
+4gativ
+4gaz
+g3b
+gd4
+2ge.
+2ged
+geez4
+gel4in
+ge5lis
+ge5liz
+4gely
+1gen
+ge4nat
+ge5niz
+4geno
+4geny
+1geo
+ge3om
+g4ery
+5gesi
+geth5
+4geto
+ge4ty
+ge4v
+4g1g2
+g2ge
+g3ger
+gglu5
+ggo4
+gh3in
+gh5out
+gh4to
+5gi.
+1gi4a
+gia5r
+g1ic
+5gicia
+g4ico
+gien5
+5gies.
+gil4
+g3imen
+3g4in.
+gin5ge
+5g4ins
+5gio
+3gir
+gir4l
+g3isl
+gi4u
+5giv
+3giz
+gl2
+gla4
+glad5i
+5glas
+1gle
+gli4b
+g3lig
+3glo
+glo3r
+g1m
+g4my
+gn4a
+g4na.
+gnet4t
+g1ni
+g2nin
+g4nio
+g1no
+g4non
+1go
+3go.
+gob5
+5goe
+3g4o4g
+go3is
+gon2
+4g3o3na
+gondo5
+go3ni
+5goo
+go5riz
+gor5ou
+5gos.
+gov1
+g3p
+1gr
+4grada
+g4rai
+gran2
+5graph.
+g5rapher
+5graphic
+4graphy
+4gray
+gre4n
+4gress.
+4grit
+g4ro
+gruf4
+gs2
+g5ste
+gth3
+gu4a
+3guard
+2gue
+5gui5t
+3gun
+3gus
+4gu4t
+g3w
+1gy
+2g5y3n
+gy5ra
+h3ab4l
+hach4
+hae4m
+hae4t
+h5agu
+ha3la
+hala3m
+ha4m
+han4ci
+han4cy
+5hand.
+han4g
+hang5er
+hang5o
+h5a5niz
+han4k
+han4te
+hap3l
+hap5t
+ha3ran
+ha5ras
+har2d
+hard3e
+har4le
+harp5en
+har5ter
+has5s
+haun4
+5haz
+haz3a
+h1b
+1head
+3hear
+he4can
+h5ecat
+h4ed
+he5do5
+he3l4i
+hel4lis
+hel4ly
+h5elo
+hem4p
+he2n
+hena4
+hen5at
+heo5r
+hep5
+h4era
+hera3p
+her4ba
+here5a
+h3ern
+h5erou
+h3ery
+h1es
+he2s5p
+he4t
+het4ed
+heu4
+h1f
+h1h
+hi5an
+hi4co
+high5
+h4il2
+himer4
+h4ina
+hion4e
+hi4p
+hir4l
+hi3ro
+hir4p
+hir4r
+his3el
+his4s
+hith5er
+hi2v
+4hk
+4h1l4
+hlan4
+h2lo
+hlo3ri
+4h1m
+hmet4
+2h1n
+h5odiz
+h5ods
+ho4g
+hoge4
+hol5ar
+3hol4e
+ho4ma
+home3
+hon4a
+ho5ny
+3hood
+hoon4
+hor5at
+ho5ris
+hort3e
+ho5ru
+hos4e
+ho5sen
+hos1p
+1hous
+house3
+hov5el
+4h5p
+4hr4
+hree5
+hro5niz
+hro3po
+4h1s2
+h4sh
+h4tar
+ht1en
+ht5es
+h4ty
+hu4g
+hu4min
+hun5ke
+hun4t
+hus3t4
+hu4t
+h1w
+h4wart
+hy3pe
+hy3ph
+hy2s
+2i1a
+i2al
+iam4
+iam5ete
+i2an
+4ianc
+ian3i
+4ian4t
+ia5pe
+iass4
+i4ativ
+ia4tric
+i4atu
+ibe4
+ib3era
+ib5ert
+ib5ia
+ib3in
+ib5it.
+ib5ite
+i1bl
+ib3li
+i5bo
+i1br
+i2b5ri
+i5bun
+4icam
+5icap
+4icar
+i4car.
+i4cara
+icas5
+i4cay
+iccu4
+4iceo
+4ich
+2ici
+i5cid
+ic5ina
+i2cip
+ic3ipa
+i4cly
+i2c5oc
+4i1cr
+5icra
+i4cry
+ic4te
+ictu2
+ic4t3ua
+ic3ula
+ic4um
+ic5uo
+i3cur
+2id
+i4dai
+id5anc
+id5d
+ide3al
+ide4s
+i2di
+id5ian
+idi4ar
+i5die
+id3io
+idi5ou
+id1it
+id5iu
+i3dle
+i4dom
+id3ow
+i4dr
+i2du
+id5uo
+2ie4
+ied4e
+5ie5ga
+ield3
+ien5a4
+ien4e
+i5enn
+i3enti
+i1er.
+i3esc
+i1est
+i3et
+4if.
+if5ero
+iff5en
+if4fr
+4ific.
+i3fie
+i3fl
+4ift
+2ig
+iga5b
+ig3era
+ight3i
+4igi
+i3gib
+ig3il
+ig3in
+ig3it
+i4g4l
+i2go
+ig3or
+ig5ot
+i5gre
+igu5i
+ig1ur
+i3h
+4i5i4
+i3j
+4ik
+i1la
+il3a4b
+i4lade
+i2l5am
+ila5ra
+i3leg
+il1er
+ilev4
+il5f
+il1i
+il3ia
+il2ib
+il3io
+il4ist
+2ilit
+il2iz
+ill5ab
+4iln
+il3oq
+il4ty
+il5ur
+il3v
+i4mag
+im3age
+ima5ry
+imenta5r
+4imet
+im1i
+im5ida
+imi5le
+i5mini
+4imit
+im4ni
+i3mon
+i2mu
+im3ula
+2in.
+i4n3au
+4inav
+incel4
+in3cer
+4ind
+in5dling
+2ine
+i3nee
+iner4ar
+i5ness
+4inga
+4inge
+in5gen
+4ingi
+in5gling
+4ingo
+4ingu
+2ini
+i5ni.
+i4nia
+in3io
+in1is
+i5nite.
+5initio
+in3ity
+4ink
+4inl
+2inn
+2i1no
+i4no4c
+ino4s
+i4not
+2ins
+in3se
+insur5a
+2int.
+2in4th
+in1u
+i5nus
+4iny
+2io
+4io.
+ioge4
+io2gr
+i1ol
+io4m
+ion3at
+ion4ery
+ion3i
+io5ph
+ior3i
+i4os
+io5th
+i5oti
+io4to
+i4our
+2ip
+ipe4
+iphras4
+ip3i
+ip4ic
+ip4re4
+ip3ul
+i3qua
+iq5uef
+iq3uid
+iq3ui3t
+4ir
+i1ra
+ira4b
+i4rac
+ird5e
+ire4de
+i4ref
+i4rel4
+i4res
+ir5gi
+ir1i
+iri5de
+ir4is
+iri3tu
+5i5r2iz
+ir4min
+iro4g
+5iron.
+ir5ul
+2is.
+is5ag
+is3ar
+isas5
+2is1c
+is3ch
+4ise
+is3er
+3isf
+is5han
+is3hon
+ish5op
+is3ib
+isi4d
+i5sis
+is5itiv
+4is4k
+islan4
+4isms
+i2so
+iso5mer
+is1p
+is2pi
+is4py
+4is1s
+is4sal
+issen4
+is4ses
+is4ta.
+is1te
+is1ti
+ist4ly
+4istral
+i2su
+is5us
+4ita.
+ita4bi
+i4tag
+4ita5m
+i3tan
+i3tat
+2ite
+it3era
+i5teri
+it4es
+2ith
+i1ti
+4itia
+4i2tic
+it3ica
+5i5tick
+it3ig
+it5ill
+i2tim
+2itio
+4itis
+i4tism
+i2t5o5m
+4iton
+i4tram
+it5ry
+4itt
+it3uat
+i5tud
+it3ul
+4itz.
+i1u
+2iv
+iv3ell
+iv3en.
+i4v3er.
+i4vers.
+iv5il.
+iv5io
+iv1it
+i5vore
+iv3o3ro
+i4v3ot
+4i5w
+ix4o
+4iy
+4izar
+izi4
+5izont
+5ja
+jac4q
+ja4p
+1je
+jer5s
+4jestie
+4jesty
+jew3
+jo4p
+5judg
+3ka.
+k3ab
+k5ag
+kais4
+kal4
+k1b
+k2ed
+1kee
+ke4g
+ke5li
+k3en4d
+k1er
+kes4
+k3est.
+ke4ty
+k3f
+kh4
+k1i
+5ki.
+5k2ic
+k4ill
+kilo5
+k4im
+k4in.
+kin4de
+k5iness
+kin4g
+ki4p
+kis4
+k5ish
+kk4
+k1l
+4kley
+4kly
+k1m
+k5nes
+1k2no
+ko5r
+kosh4
+k3ou
+kro5n
+4k1s2
+k4sc
+ks4l
+k4sy
+k5t
+k1w
+lab3ic
+l4abo
+laci4
+l4ade
+la3dy
+lag4n
+lam3o
+3land
+lan4dl
+lan5et
+lan4te
+lar4g
+lar3i
+las4e
+la5tan
+4lateli
+4lativ
+4lav
+la4v4a
+2l1b
+lbin4
+4l1c2
+lce4
+l3ci
+2ld
+l2de
+ld4ere
+ld4eri
+ldi4
+ld5is
+l3dr
+l4dri
+le2a
+le4bi
+left5
+5leg.
+5legg
+le4mat
+lem5atic
+4len.
+3lenc
+5lene.
+1lent
+le3ph
+le4pr
+lera5b
+ler4e
+3lerg
+3l4eri
+l4ero
+les2
+le5sco
+5lesq
+3less
+5less.
+l3eva
+lev4er.
+lev4era
+lev4ers
+3ley
+4leye
+2lf
+l5fr
+4l1g4
+l5ga
+lgar3
+l4ges
+lgo3
+2l3h
+li4ag
+li2am
+liar5iz
+li4as
+li4ato
+li5bi
+5licio
+li4cor
+4lics
+4lict.
+l4icu
+l3icy
+l3ida
+lid5er
+3lidi
+lif3er
+l4iff
+li4fl
+5ligate
+3ligh
+li4gra
+3lik
+4l4i4l
+lim4bl
+lim3i
+li4mo
+l4im4p
+l4ina
+1l4ine
+lin3ea
+lin3i
+link5er
+li5og
+4l4iq
+lis4p
+l1it
+l2it.
+5litica
+l5i5tics
+liv3er
+l1iz
+4lj
+lka3
+l3kal
+lka4t
+l1l
+l4law
+l2le
+l5lea
+l3lec
+l3leg
+l3lel
+l3le4n
+l3le4t
+ll2i
+l2lin4
+l5lina
+ll4o
+lloqui5
+ll5out
+l5low
+2lm
+l5met
+lm3ing
+l4mod
+lmon4
+2l1n2
+3lo.
+lob5al
+lo4ci
+4lof
+3logic
+l5ogo
+3logu
+lom3er
+5long
+lon4i
+l3o3niz
+lood5
+5lope.
+lop3i
+l3opm
+lora4
+lo4rato
+lo5rie
+lor5ou
+5los.
+los5et
+5losophiz
+5losophy
+los4t
+lo4ta
+loun5d
+2lout
+4lov
+2lp
+lpa5b
+l3pha
+l5phi
+lp5ing
+l3pit
+l4pl
+l5pr
+4l1r
+2l1s2
+l4sc
+l2se
+l4sie
+4lt
+lt5ag
+ltane5
+l1te
+lten4
+ltera4
+lth3i
+l5ties.
+ltis4
+l1tr
+ltu2
+ltur3a
+lu5a
+lu3br
+luch4
+lu3ci
+lu3en
+luf4
+lu5id
+lu4ma
+5lumi
+l5umn.
+5lumnia
+lu3o
+luo3r
+4lup
+luss4
+lus3te
+1lut
+l5ven
+l5vet4
+2l1w
+1ly
+4lya
+4lyb
+ly5me
+ly3no
+2lys4
+l5yse
+1ma
+2mab
+ma2ca
+ma5chine
+ma4cl
+mag5in
+5magn
+2mah
+maid5
+4mald
+ma3lig
+ma5lin
+mal4li
+mal4ty
+5mania
+man5is
+man3iz
+4map
+ma5rine.
+ma5riz
+mar4ly
+mar3v
+ma5sce
+mas4e
+mas1t
+5mate
+math3
+ma3tis
+4matiza
+4m1b
+mba4t5
+m5bil
+m4b3ing
+mbi4v
+4m5c
+4me.
+2med
+4med.
+5media
+me3die
+m5e5dy
+me2g
+mel5on
+mel4t
+me2m
+mem1o3
+1men
+men4a
+men5ac
+men4de
+4mene
+men4i
+mens4
+mensu5
+3ment
+men4te
+me5on
+m5ersa
+2mes
+3mesti
+me4ta
+met3al
+me1te
+me5thi
+m4etr
+5metric
+me5trie
+me3try
+me4v
+4m1f
+2mh
+5mi.
+mi3a
+mid4a
+mid4g
+mig4
+3milia
+m5i5lie
+m4ill
+min4a
+3mind
+m5inee
+m4ingl
+min5gli
+m5ingly
+min4t
+m4inu
+miot4
+m2is
+mis4er.
+mis5l
+mis4ti
+m5istry
+4mith
+m2iz
+4mk
+4m1l
+m1m
+mma5ry
+4m1n
+mn4a
+m4nin
+mn4o
+1mo
+4mocr
+5mocratiz
+mo2d1
+mo4go
+mois2
+moi5se
+4mok
+mo5lest
+mo3me
+mon5et
+mon5ge
+moni3a
+mon4ism
+mon4ist
+mo3niz
+monol4
+mo3ny.
+mo2r
+4mora.
+mos2
+mo5sey
+mo3sp
+moth3
+m5ouf
+3mous
+mo2v
+4m1p
+mpara5
+mpa5rab
+mpar5i
+m3pet
+mphas4
+m2pi
+mpi4a
+mp5ies
+m4p1in
+m5pir
+mp5is
+mpo3ri
+mpos5ite
+m4pous
+mpov5
+mp4tr
+m2py
+4m3r
+4m1s2
+m4sh
+m5si
+4mt
+1mu
+mula5r4
+5mult
+multi3
+3mum
+mun2
+4mup
+mu4u
+4mw
+1na
+2n1a2b
+n4abu
+4nac.
+na4ca
+n5act
+nag5er.
+nak4
+na4li
+na5lia
+4nalt
+na5mit
+n2an
+nanci4
+nan4it
+nank4
+nar3c
+4nare
+nar3i
+nar4l
+n5arm
+n4as
+nas4c
+nas5ti
+n2at
+na3tal
+nato5miz
+n2au
+nau3se
+3naut
+nav4e
+4n1b4
+ncar5
+n4ces.
+n3cha
+n5cheo
+n5chil
+n3chis
+nc1in
+nc4it
+ncour5a
+n1cr
+n1cu
+n4dai
+n5dan
+n1de
+nd5est.
+ndi4b
+n5d2if
+n1dit
+n3diz
+n5duc
+ndu4r
+nd2we
+2ne.
+n3ear
+ne2b
+neb3u
+ne2c
+5neck
+2ned
+ne4gat
+neg5ativ
+5nege
+ne4la
+nel5iz
+ne5mi
+ne4mo
+1nen
+4nene
+3neo
+ne4po
+ne2q
+n1er
+nera5b
+n4erar
+n2ere
+n4er5i
+ner4r
+1nes
+2nes.
+4nesp
+2nest
+4nesw
+3netic
+ne4v
+n5eve
+ne4w
+n3f
+n4gab
+n3gel
+nge4n4e
+n5gere
+n3geri
+ng5ha
+n3gib
+ng1in
+n5git
+n4gla
+ngov4
+ng5sh
+n1gu
+n4gum
+n2gy
+4n1h4
+nha4
+nhab3
+nhe4
+3n4ia
+ni3an
+ni4ap
+ni3ba
+ni4bl
+ni4d
+ni5di
+ni4er
+ni2fi
+ni5ficat
+n5igr
+nik4
+n1im
+ni3miz
+n1in
+5nine.
+nin4g
+ni4o
+5nis.
+nis4ta
+n2it
+n4ith
+3nitio
+n3itor
+ni3tr
+n1j
+4nk2
+n5kero
+n3ket
+nk3in
+n1kl
+4n1l
+n5m
+nme4
+nmet4
+4n1n2
+nne4
+nni3al
+nni4v
+nob4l
+no3ble
+n5ocl
+4n3o2d
+3noe
+4nog
+noge4
+nois5i
+no5l4i
+5nologis
+3nomic
+n5o5miz
+no4mo
+no3my
+no4n
+non4ag
+non5i
+n5oniz
+4nop
+5nop5o5li
+nor5ab
+no4rary
+4nosc
+nos4e
+nos5t
+no5ta
+1nou
+3noun
+nov3el3
+nowl3
+n1p4
+npi4
+npre4c
+n1q
+n1r
+nru4
+2n1s2
+ns5ab
+nsati4
+ns4c
+n2se
+n4s3es
+nsid1
+nsig4
+n2sl
+ns3m
+n4soc
+ns4pe
+n5spi
+nsta5bl
+n1t
+nta4b
+nter3s
+nt2i
+n5tib
+nti4er
+nti2f
+n3tine
+n4t3ing
+nti4p
+ntrol5li
+nt4s
+ntu3me
+nu1a
+nu4d
+nu5en
+nuf4fe
+n3uin
+3nu3it
+n4um
+nu1me
+n5umi
+3nu4n
+n3uo
+nu3tr
+n1v2
+n1w4
+nym4
+nyp4
+4nz
+n3za
+4oa
+oad3
+o5a5les
+oard3
+oas4e
+oast5e
+oat5i
+ob3a3b
+o5bar
+obe4l
+o1bi
+o2bin
+ob5ing
+o3br
+ob3ul
+o1ce
+och4
+o3chet
+ocif3
+o4cil
+o4clam
+o4cod
+oc3rac
+oc5ratiz
+ocre3
+5ocrit
+octor5a
+oc3ula
+o5cure
+od5ded
+od3ic
+odi3o
+o2do4
+odor3
+od5uct.
+od5ucts
+o4el
+o5eng
+o3er
+oe4ta
+o3ev
+o2fi
+of5ite
+ofit4t
+o2g5a5r
+og5ativ
+o4gato
+o1ge
+o5gene
+o5geo
+o4ger
+o3gie
+1o1gis
+og3it
+o4gl
+o5g2ly
+3ogniz
+o4gro
+ogu5i
+1ogy
+2ogyn
+o1h2
+ohab5
+oi2
+oic3es
+oi3der
+oiff4
+oig4
+oi5let
+o3ing
+oint5er
+o5ism
+oi5son
+oist5en
+oi3ter
+o5j
+2ok
+o3ken
+ok5ie
+o1la
+o4lan
+olass4
+ol2d
+old1e
+ol3er
+o3lesc
+o3let
+ol4fi
+ol2i
+o3lia
+o3lice
+ol5id.
+o3li4f
+o5lil
+ol3ing
+o5lio
+o5lis.
+ol3ish
+o5lite
+o5litio
+o5liv
+olli4e
+ol5ogiz
+olo4r
+ol5pl
+ol2t
+ol3ub
+ol3ume
+ol3un
+o5lus
+ol2v
+o2ly
+om5ah
+oma5l
+om5atiz
+om2be
+om4bl
+o2me
+om3ena
+om5erse
+o4met
+om5etry
+o3mia
+om3ic.
+om3ica
+o5mid
+om1in
+o5mini
+5ommend
+omo4ge
+o4mon
+om3pi
+ompro5
+o2n
+on1a
+on4ac
+o3nan
+on1c
+3oncil
+2ond
+on5do
+o3nen
+on5est
+on4gu
+on1ic
+o3nio
+on1is
+o5niu
+on3key
+on4odi
+on3omy
+on3s
+onspi4
+onspir5a
+onsu4
+onten4
+on3t4i
+ontif5
+on5um
+onva5
+oo2
+ood5e
+ood5i
+oo4k
+oop3i
+o3ord
+oost5
+o2pa
+ope5d
+op1er
+3opera
+4operag
+2oph
+o5phan
+o5pher
+op3ing
+o3pit
+o5pon
+o4posi
+o1pr
+op1u
+opy5
+o1q
+o1ra
+o5ra.
+o4r3ag
+or5aliz
+or5ange
+ore5a
+o5real
+or3ei
+ore5sh
+or5est.
+orew4
+or4gu
+4o5ria
+or3ica
+o5ril
+or1in
+o1rio
+or3ity
+o3riu
+or2mi
+orn2e
+o5rof
+or3oug
+or5pe
+3orrh
+or4se
+ors5en
+orst4
+or3thi
+or3thy
+or4ty
+o5rum
+o1ry
+os3al
+os2c
+os4ce
+o3scop
+4oscopi
+o5scr
+os4i4e
+os5itiv
+os3ito
+os3ity
+osi4u
+os4l
+o2so
+os4pa
+os4po
+os2ta
+o5stati
+os5til
+os5tit
+o4tan
+otele4g
+ot3er.
+ot5ers
+o4tes
+4oth
+oth5esi
+oth3i4
+ot3ic.
+ot5ica
+o3tice
+o3tif
+o3tis
+oto5s
+ou2
+ou3bl
+ouch5i
+ou5et
+ou4l
+ounc5er
+oun2d
+ou5v
+ov4en
+over4ne
+over3s
+ov4ert
+o3vis
+oviti4
+o5v4ol
+ow3der
+ow3el
+ow5est
+ow1i
+own5i
+o4wo
+oy1a
+1pa
+pa4ca
+pa4ce
+pac4t
+p4ad
+5pagan
+p3agat
+p4ai
+pain4
+p4al
+pan4a
+pan3el
+pan4ty
+pa3ny
+pa1p
+pa4pu
+para5bl
+par5age
+par5di
+3pare
+par5el
+p4a4ri
+par4is
+pa2te
+pa5ter
+5pathic
+pa5thy
+pa4tric
+pav4
+3pay
+4p1b
+pd4
+4pe.
+3pe4a
+pear4l
+pe2c
+2p2ed
+3pede
+3pedi
+pedia4
+ped4ic
+p4ee
+pee4d
+pek4
+pe4la
+peli4e
+pe4nan
+p4enc
+pen4th
+pe5on
+p4era.
+pera5bl
+p4erag
+p4eri
+peri5st
+per4mal
+perme5
+p4ern
+per3o
+per3ti
+pe5ru
+per1v
+pe2t
+pe5ten
+pe5tiz
+4pf
+4pg
+4ph.
+phar5i
+phe3no
+ph4er
+ph4es.
+ph1ic
+5phie
+ph5ing
+5phisti
+3phiz
+ph2l
+3phob
+3phone
+5phoni
+pho4r
+4phs
+ph3t
+5phu
+1phy
+pi3a
+pian4
+pi4cie
+pi4cy
+p4id
+p5ida
+pi3de
+5pidi
+3piec
+pi3en
+pi4grap
+pi3lo
+pi2n
+p4in.
+pind4
+p4ino
+3pi1o
+pion4
+p3ith
+pi5tha
+pi2tu
+2p3k2
+1p2l2
+3plan
+plas5t
+pli3a
+pli5er
+4plig
+pli4n
+ploi4
+plu4m
+plum4b
+4p1m
+2p3n
+po4c
+5pod.
+po5em
+po3et5
+5po4g
+poin2
+5point
+poly5t
+po4ni
+po4p
+1p4or
+po4ry
+1pos
+pos1s
+p4ot
+po4ta
+5poun
+4p1p
+ppa5ra
+p2pe
+p4ped
+p5pel
+p3pen
+p3per
+p3pet
+ppo5site
+pr2
+pray4e
+5preci
+pre5co
+pre3em
+pref5ac
+pre4la
+pre3r
+p3rese
+3press
+pre5ten
+pre3v
+5pri4e
+prin4t3
+pri4s
+pris3o
+p3roca
+prof5it
+pro3l
+pros3e
+pro1t
+2p1s2
+p2se
+ps4h
+p4sib
+2p1t
+pt5a4b
+p2te
+p2th
+pti3m
+ptu4r
+p4tw
+pub3
+pue4
+puf4
+pul3c
+pu4m
+pu2n
+pur4r
+5pus
+pu2t
+5pute
+put3er
+pu3tr
+put4ted
+put4tin
+p3w
+qu2
+qua5v
+2que.
+3quer
+3quet
+2rab
+ra3bi
+rach4e
+r5acl
+raf5fi
+raf4t
+r2ai
+ra4lo
+ram3et
+r2ami
+rane5o
+ran4ge
+r4ani
+ra5no
+rap3er
+3raphy
+rar5c
+rare4
+rar5ef
+4raril
+r2as
+ration4
+rau4t
+ra5vai
+rav3el
+ra5zie
+r1b
+r4bab
+r4bag
+rbi2
+rbi4f
+r2bin
+r5bine
+rb5ing.
+rb4o
+r1c
+r2ce
+rcen4
+r3cha
+rch4er
+r4ci4b
+rc4it
+rcum3
+r4dal
+rd2i
+rdi4a
+rdi4er
+rdin4
+rd3ing
+2re.
+re1al
+re3an
+re5arr
+5reav
+re4aw
+r5ebrat
+rec5oll
+rec5ompe
+re4cre
+2r2ed
+re1de
+re3dis
+red5it
+re4fac
+re2fe
+re5fer.
+re3fi
+re4fy
+reg3is
+re5it
+re1li
+re5lu
+r4en4ta
+ren4te
+re1o
+re5pin
+re4posi
+re1pu
+r1er4
+r4eri
+rero4
+re5ru
+r4es.
+re4spi
+ress5ib
+res2t
+re5stal
+re3str
+re4ter
+re4ti4z
+re3tri
+reu2
+re5uti
+rev2
+re4val
+rev3el
+r5ev5er.
+re5vers
+re5vert
+re5vil
+rev5olu
+re4wh
+r1f
+rfu4
+r4fy
+rg2
+rg3er
+r3get
+r3gic
+rgi4n
+rg3ing
+r5gis
+r5git
+r1gl
+rgo4n
+r3gu
+rh4
+4rh.
+4rhal
+ri3a
+ria4b
+ri4ag
+r4ib
+rib3a
+ric5as
+r4ice
+4rici
+5ricid
+ri4cie
+r4ico
+rid5er
+ri3enc
+ri3ent
+ri1er
+ri5et
+rig5an
+5rigi
+ril3iz
+5riman
+rim5i
+3rimo
+rim4pe
+r2ina
+5rina.
+rin4d
+rin4e
+rin4g
+ri1o
+5riph
+riph5e
+ri2pl
+rip5lic
+r4iq
+r2is
+r4is.
+ris4c
+r3ish
+ris4p
+ri3ta3b
+r5ited.
+rit5er.
+rit5ers
+rit3ic
+ri2tu
+rit5ur
+riv5el
+riv3et
+riv3i
+r3j
+r3ket
+rk4le
+rk4lin
+r1l
+rle4
+r2led
+r4lig
+r4lis
+rl5ish
+r3lo4
+r1m
+rma5c
+r2me
+r3men
+rm5ers
+rm3ing
+r4ming.
+r4mio
+r3mit
+r4my
+r4nar
+r3nel
+r4ner
+r5net
+r3ney
+r5nic
+r1nis4
+r3nit
+r3niv
+rno4
+r4nou
+r3nu
+rob3l
+r2oc
+ro3cr
+ro4e
+ro1fe
+ro5fil
+rok2
+ro5ker
+5role.
+rom5ete
+rom4i
+rom4p
+ron4al
+ron4e
+ro5n4is
+ron4ta
+1room
+5root
+ro3pel
+rop3ic
+ror3i
+ro5ro
+ros5per
+ros4s
+ro4the
+ro4ty
+ro4va
+rov5el
+rox5
+r1p
+r4pea
+r5pent
+rp5er.
+r3pet
+rp4h4
+rp3ing
+r3po
+r1r4
+rre4c
+rre4f
+r4reo
+rre4st
+rri4o
+rri4v
+rron4
+rros4
+rrys4
+4rs2
+r1sa
+rsa5ti
+rs4c
+r2se
+r3sec
+rse4cr
+rs5er.
+rs3es
+rse5v2
+r1sh
+r5sha
+r1si
+r4si4b
+rson3
+r1sp
+r5sw
+rtach4
+r4tag
+r3teb
+rten4d
+rte5o
+r1ti
+rt5ib
+rti4d
+r4tier
+r3tig
+rtil3i
+rtil4l
+r4tily
+r4tist
+r4tiv
+r3tri
+rtroph4
+rt4sh
+ru3a
+ru3e4l
+ru3en
+ru4gl
+ru3in
+rum3pl
+ru2n
+runk5
+run4ty
+r5usc
+ruti5n
+rv4e
+rvel4i
+r3ven
+rv5er.
+r5vest
+r3vey
+r3vic
+rvi4v
+r3vo
+r1w
+ry4c
+5rynge
+ry3t
+sa2
+2s1ab
+5sack
+sac3ri
+s3act
+5sai
+salar4
+sal4m
+sa5lo
+sal4t
+3sanc
+san4de
+s1ap
+sa5ta
+5sa3tio
+sat3u
+sau4
+sa5vor
+5saw
+4s5b
+scan4t5
+sca4p
+scav5
+s4ced
+4scei
+s4ces
+sch2
+s4cho
+3s4cie
+5scin4d
+scle5
+s4cli
+scof4
+4scopy
+scour5a
+s1cu
+4s5d
+4se.
+se4a
+seas4
+sea5w
+se2c3o
+3sect
+4s4ed
+se4d4e
+s5edl
+se2g
+seg3r
+5sei
+se1le
+5self
+5selv
+4seme
+se4mol
+sen5at
+4senc
+sen4d
+s5ened
+sen5g
+s5enin
+4sentd
+4sentl
+sep3a3
+4s1er.
+s4erl
+ser4o
+4servo
+s1e4s
+se5sh
+ses5t
+5se5um
+5sev
+sev3en
+sew4i
+5sex
+4s3f
+2s3g
+s2h
+2sh.
+sh1er
+5shev
+sh1in
+sh3io
+3ship
+shiv5
+sho4
+sh5old
+shon3
+shor4
+short5
+4shw
+si1b
+s5icc
+3side.
+5sides
+5sidi
+si5diz
+4signa
+sil4e
+4sily
+2s1in
+s2ina
+5sine.
+s3ing
+1sio
+5sion
+sion5a
+si2r
+sir5a
+1sis
+3sitio
+5siu
+1siv
+5siz
+sk2
+4ske
+s3ket
+sk5ine
+sk5ing
+s1l2
+s3lat
+s2le
+slith5
+2s1m
+s3ma
+small3
+sman3
+smel4
+s5men
+5smith
+smol5d4
+s1n4
+1so
+so4ce
+soft3
+so4lab
+sol3d2
+so3lic
+5solv
+3som
+3s4on.
+sona4
+son4g
+s4op
+5sophic
+s5ophiz
+s5ophy
+sor5c
+sor5d
+4sov
+so5vi
+2spa
+5spai
+spa4n
+spen4d
+2s5peo
+2sper
+s2phe
+3spher
+spho5
+spil4
+sp5ing
+4spio
+s4ply
+s4pon
+spor4
+4spot
+squal4l
+s1r
+2ss
+s1sa
+ssas3
+s2s5c
+s3sel
+s5seng
+s4ses.
+s5set
+s1si
+s4sie
+ssi4er
+ss5ily
+s4sl
+ss4li
+s4sn
+sspend4
+ss2t
+ssur5a
+ss5w
+2st.
+s2tag
+s2tal
+stam4i
+5stand
+s4ta4p
+5stat.
+s4ted
+stern5i
+s5tero
+ste2w
+stew5a
+s3the
+st2i
+s4ti.
+s5tia
+s1tic
+5stick
+s4tie
+s3tif
+st3ing
+5stir
+s1tle
+5stock
+stom3a
+5stone
+s4top
+3store
+st4r
+s4trad
+5stratu
+s4tray
+s4trid
+4stry
+4st3w
+s2ty
+1su
+su1al
+su4b3
+su2g3
+su5is
+suit3
+s4ul
+su2m
+sum3i
+su2n
+su2r
+4sv
+sw2
+4swo
+s4y
+4syc
+3syl
+syn5o
+sy5rin
+1ta
+3ta.
+2tab
+ta5bles
+5taboliz
+4taci
+ta5do
+4taf4
+tai5lo
+ta2l
+ta5la
+tal5en
+tal3i
+4talk
+tal4lis
+ta5log
+ta5mo
+tan4de
+tanta3
+ta5per
+ta5pl
+tar4a
+4tarc
+4tare
+ta3riz
+tas4e
+ta5sy
+4tatic
+ta4tur
+taun4
+tav4
+2taw
+tax4is
+2t1b
+4tc
+t4ch
+tch5et
+4t1d
+4te.
+tead4i
+4teat
+tece4
+5tect
+2t1ed
+te5di
+1tee
+teg4
+te5ger
+te5gi
+3tel.
+teli4
+5tels
+te2ma2
+tem3at
+3tenan
+3tenc
+3tend
+4tenes
+1tent
+ten4tag
+1teo
+te4p
+te5pe
+ter3c
+5ter3d
+1teri
+ter5ies
+ter3is
+teri5za
+5ternit
+ter5v
+4tes.
+4tess
+t3ess.
+teth5e
+3teu
+3tex
+4tey
+2t1f
+4t1g
+2th.
+than4
+th2e
+4thea
+th3eas
+the5at
+the3is
+3thet
+th5ic.
+th5ica
+4thil
+5think
+4thl
+th5ode
+5thodic
+4thoo
+thor5it
+tho5riz
+2ths
+1tia
+ti4ab
+ti4ato
+2ti2b
+4tick
+t4ico
+t4ic1u
+5tidi
+3tien
+tif2
+ti5fy
+2tig
+5tigu
+till5in
+1tim
+4timp
+tim5ul
+2t1in
+t2ina
+3tine.
+3tini
+1tio
+ti5oc
+tion5ee
+5tiq
+ti3sa
+3tise
+tis4m
+ti5so
+tis4p
+5tistica
+ti3tl
+ti4u
+1tiv
+tiv4a
+1tiz
+ti3za
+ti3zen
+2tl
+t5la
+tlan4
+3tle.
+3tled
+3tles.
+t5let.
+t5lo
+4t1m
+tme4
+2t1n2
+1to
+to3b
+to5crat
+4todo
+2tof
+to2gr
+to5ic
+to2ma
+tom4b
+to3my
+ton4ali
+to3nat
+4tono
+4tony
+to2ra
+to3rie
+tor5iz
+tos2
+5tour
+4tout
+to3war
+4t1p
+1tra
+tra3b
+tra5ch
+traci4
+trac4it
+trac4te
+tras4
+tra5ven
+trav5es5
+tre5f
+tre4m
+trem5i
+5tria
+tri5ces
+5tricia
+4trics
+2trim
+tri4v
+tro5mi
+tron5i
+4trony
+tro5phe
+tro3sp
+tro3v
+tru5i
+trus4
+4t1s2
+t4sc
+tsh4
+t4sw
+4t3t2
+t4tes
+t5to
+ttu4
+1tu
+tu1a
+tu3ar
+tu4bi
+tud2
+4tue
+4tuf4
+5tu3i
+3tum
+tu4nis
+2t3up.
+3ture
+5turi
+tur3is
+tur5o
+tu5ry
+3tus
+4tv
+tw4
+4t1wa
+twis4
+4two
+1ty
+4tya
+2tyl
+type3
+ty5ph
+4tz
+tz4e
+4uab
+uac4
+ua5na
+uan4i
+uar5ant
+uar2d
+uar3i
+uar3t
+u1at
+uav4
+ub4e
+u4bel
+u3ber
+u4bero
+u1b4i
+u4b5ing
+u3ble.
+u3ca
+uci4b
+uc4it
+ucle3
+u3cr
+u3cu
+u4cy
+ud5d
+ud3er
+ud5est
+udev4
+u1dic
+ud3ied
+ud3ies
+ud5is
+u5dit
+u4don
+ud4si
+u4du
+u4ene
+uens4
+uen4te
+uer4il
+3ufa
+u3fl
+ugh3en
+ug5in
+2ui2
+uil5iz
+ui4n
+u1ing
+uir4m
+uita4
+uiv3
+uiv4er.
+u5j
+4uk
+u1la
+ula5b
+u5lati
+ulch4
+5ulche
+ul3der
+ul4e
+u1len
+ul4gi
+ul2i
+u5lia
+ul3ing
+ul5ish
+ul4lar
+ul4li4b
+ul4lis
+4ul3m
+u1l4o
+4uls
+uls5es
+ul1ti
+ultra3
+4ultu
+u3lu
+ul5ul
+ul5v
+um5ab
+um4bi
+um4bly
+u1mi
+u4m3ing
+umor5o
+um2p
+unat4
+u2ne
+un4er
+u1ni
+un4im
+u2nin
+un5ish
+uni3v
+un3s4
+un4sw
+unt3ab
+un4ter.
+un4tes
+unu4
+un5y
+un5z
+u4ors
+u5os
+u1ou
+u1pe
+uper5s
+u5pia
+up3ing
+u3pl
+up3p
+upport5
+upt5ib
+uptu4
+u1ra
+4ura.
+u4rag
+u4ras
+ur4be
+urc4
+ur1d
+ure5at
+ur4fer
+ur4fr
+u3rif
+uri4fic
+ur1in
+u3rio
+u1rit
+ur3iz
+ur2l
+url5ing.
+ur4no
+uros4
+ur4pe
+ur4pi
+urs5er
+ur5tes
+ur3the
+urti4
+ur4tie
+u3ru
+2us
+u5sad
+u5san
+us4ap
+usc2
+us3ci
+use5a
+u5sia
+u3sic
+us4lin
+us1p
+us5sl
+us5tere
+us1tr
+u2su
+usur4
+uta4b
+u3tat
+4ute.
+4utel
+4uten
+uten4i
+4u1t2i
+uti5liz
+u3tine
+ut3ing
+ution5a
+u4tis
+5u5tiz
+u4t1l
+ut5of
+uto5g
+uto5matic
+u5ton
+u4tou
+uts4
+u3u
+uu4m
+u1v2
+uxu3
+uz4e
+1va
+5va.
+2v1a4b
+vac5il
+vac3u
+vag4
+va4ge
+va5lie
+val5o
+val1u
+va5mo
+va5niz
+va5pi
+var5ied
+3vat
+4ve.
+4ved
+veg3
+v3el.
+vel3li
+ve4lo
+v4ely
+ven3om
+v5enue
+v4erd
+5vere.
+v4erel
+v3eren
+ver5enc
+v4eres
+ver3ie
+vermi4n
+3verse
+ver3th
+v4e2s
+4ves.
+ves4te
+ve4te
+vet3er
+ve4ty
+vi5ali
+5vian
+5vide.
+5vided
+4v3iden
+5vides
+5vidi
+v3if
+vi5gn
+vik4
+2vil
+5vilit
+v3i3liz
+v1in
+4vi4na
+v2inc
+vin5d
+4ving
+vio3l
+v3io4r
+vi1ou
+vi4p
+vi5ro
+vis3it
+vi3so
+vi3su
+4viti
+vit3r
+4vity
+3viv
+5vo.
+voi4
+3vok
+vo4la
+v5ole
+5volt
+3volv
+vom5i
+vor5ab
+vori4
+vo4ry
+vo4ta
+4votee
+4vv4
+v4y
+w5abl
+2wac
+wa5ger
+wag5o
+wait5
+w5al.
+wam4
+war4t
+was4t
+wa1te
+wa5ver
+w1b
+wea5rie
+weath3
+wed4n
+weet3
+wee5v
+wel4l
+w1er
+west3
+w3ev
+whi4
+wi2
+wil2
+will5in
+win4de
+win4g
+wir4
+3wise
+with3
+wiz5
+w4k
+wl4es
+wl3in
+w4no
+1wo2
+wom1
+wo5ven
+w5p
+wra4
+wri4
+writa4
+w3sh
+ws4l
+ws4pe
+w5s4t
+4wt
+wy4
+x1a
+xac5e
+x4ago
+xam3
+x4ap
+xas5
+x3c2
+x1e
+xe4cuto
+x2ed
+xer4i
+xe5ro
+x1h
+xhi2
+xhil5
+xhu4
+x3i
+xi5a
+xi5c
+xi5di
+x4ime
+xi5miz
+x3o
+x4ob
+x3p
+xpan4d
+xpecto5
+xpe3d
+x1t2
+x3ti
+x1u
+xu3a
+xx4
+y5ac
+3yar4
+y5at
+y1b
+y1c
+y2ce
+yc5er
+y3ch
+ych4e
+ycom4
+ycot4
+y1d
+y5ee
+y1er
+y4erf
+yes4
+ye4t
+y5gi
+4y3h
+y1i
+y3la
+ylla5bl
+y3lo
+y5lu
+ymbol5
+yme4
+ympa3
+yn3chr
+yn5d
+yn5g
+yn5ic
+5ynx
+y1o4
+yo5d
+y4o5g
+yom4
+yo5net
+y4ons
+y4os
+y4ped
+yper5
+yp3i
+y3po
+y4poc
+yp2ta
+y5pu
+yra5m
+yr5ia
+y3ro
+yr4r
+ys4c
+y3s2e
+ys3ica
+ys3io
+3ysis
+y4so
+yss4
+ys1t
+ys3ta
+ysur4
+y3thin
+yt3ic
+y1w
+za1
+z5a2b
+zar2
+4zb
+2ze
+ze4n
+ze4p
+z1er
+ze3ro
+zet4
+2z1i
+z4il
+z4is
+5zl
+4zm
+1zo
+zo4m
+zo5ol
+zte4
+4z1z2
+z4zy
diff --git a/contrib/groff/tmac/latin1.tmac b/contrib/groff/tmac/latin1.tmac
new file mode 100644
index 0000000..9cc15cc
--- /dev/null
+++ b/contrib/groff/tmac/latin1.tmac
@@ -0,0 +1,103 @@
+.\" latin1.tmac
+.\"
+.nr _C \n(.C
+.cp 0
+.de latin1-tr
+.if c\\$2 .if !c\\$1 .tr \\$1\\$2
+..
+.latin1-tr \[char161] \(r!
+.latin1-tr \[char162] \(ct
+.latin1-tr \[char163] \(Po
+.latin1-tr \[char164] \(Cs
+.latin1-tr \[char165] \(Ye
+.latin1-tr \[char166] \(bb
+.latin1-tr \[char167] \(sc
+.latin1-tr \[char168] \(ad
+.latin1-tr \[char169] \(co
+.latin1-tr \[char170] \(Of
+.latin1-tr \[char171] \(Fo
+.latin1-tr \[char172] \(no
+.latin1-tr \[char173] \[shc]
+.latin1-tr \[char174] \(rg
+.latin1-tr \[char175] \(a-
+.latin1-tr \[char176] \(de
+.latin1-tr \[char177] \(+-
+.latin1-tr \[char178] \(S2
+.latin1-tr \[char179] \(S3
+.latin1-tr \[char180] \(aa
+.latin1-tr \[char181] \(*m
+.latin1-tr \[char182] \(ps
+.latin1-tr \[char183] \(pc
+.latin1-tr \[char184] \(ac
+.latin1-tr \[char185] \(S1
+.latin1-tr \[char186] \(Om
+.latin1-tr \[char187] \(Fc
+.latin1-tr \[char188] \(14
+.latin1-tr \[char189] \(12
+.latin1-tr \[char190] \(34
+.latin1-tr \[char191] \(r?
+.latin1-tr \[char192] \(`A
+.latin1-tr \[char193] \('A
+.latin1-tr \[char194] \(^A
+.latin1-tr \[char195] \(~A
+.latin1-tr \[char196] \(:A
+.latin1-tr \[char197] \(oA
+.latin1-tr \[char198] \(AE
+.latin1-tr \[char199] \(,C
+.latin1-tr \[char200] \(`E
+.latin1-tr \[char201] \('E
+.latin1-tr \[char202] \(^E
+.latin1-tr \[char203] \(:E
+.latin1-tr \[char204] \(`I
+.latin1-tr \[char205] \('I
+.latin1-tr \[char206] \(^I
+.latin1-tr \[char207] \(:I
+.latin1-tr \[char208] \(-D
+.latin1-tr \[char209] \(~N
+.latin1-tr \[char210] \(`O
+.latin1-tr \[char211] \('O
+.latin1-tr \[char212] \(^O
+.latin1-tr \[char213] \(~O
+.latin1-tr \[char214] \(:O
+.latin1-tr \[char215] \(mu
+.latin1-tr \[char216] \(/O
+.latin1-tr \[char217] \(`U
+.latin1-tr \[char218] \('U
+.latin1-tr \[char219] \(^U
+.latin1-tr \[char220] \(:U
+.latin1-tr \[char221] \('Y
+.latin1-tr \[char222] \(TP
+.latin1-tr \[char223] \(ss
+.latin1-tr \[char224] \(`a
+.latin1-tr \[char225] \('a
+.latin1-tr \[char226] \(^a
+.latin1-tr \[char227] \(~a
+.latin1-tr \[char228] \(:a
+.latin1-tr \[char229] \(oa
+.latin1-tr \[char230] \(ae
+.latin1-tr \[char231] \(,c
+.latin1-tr \[char232] \(`e
+.latin1-tr \[char233] \('e
+.latin1-tr \[char234] \(^e
+.latin1-tr \[char235] \(:e
+.latin1-tr \[char236] \(`i
+.latin1-tr \[char237] \('i
+.latin1-tr \[char238] \(^i
+.latin1-tr \[char239] \(:i
+.latin1-tr \[char240] \(Sd
+.latin1-tr \[char241] \(~n
+.latin1-tr \[char242] \(`o
+.latin1-tr \[char243] \('o
+.latin1-tr \[char244] \(^o
+.latin1-tr \[char245] \(~o
+.latin1-tr \[char246] \(:o
+.latin1-tr \[char247] \(di
+.latin1-tr \[char248] \(/o
+.latin1-tr \[char249] \(`u
+.latin1-tr \[char250] \('u
+.latin1-tr \[char251] \(^u
+.latin1-tr \[char252] \(:u
+.latin1-tr \[char253] \('y
+.latin1-tr \[char254] \(Tp
+.latin1-tr \[char255] \(:y
+.cp \n(_C
diff --git a/contrib/groff/tmac/lbp.tmac b/contrib/groff/tmac/lbp.tmac
new file mode 100644
index 0000000..0d17b63
--- /dev/null
+++ b/contrib/groff/tmac/lbp.tmac
@@ -0,0 +1,15 @@
+.\" lbp.tmac
+.\"
+.nr _C \n(.C
+.cp 0
+.ftr CW CR
+.ftr C CR
+.ftr CO CI
+.ftr H HR
+.ftr HO HI
+.ftr HX HBI
+.ftr Hr HNR
+.ftr Hi HNI
+.ftr Hb HNB
+.ftr Hx HNBI
+.cp \n(_C
diff --git a/contrib/groff/tmac/lj4.tmac b/contrib/groff/tmac/lj4.tmac
new file mode 100644
index 0000000..b5644e4
--- /dev/null
+++ b/contrib/groff/tmac/lj4.tmac
@@ -0,0 +1,20 @@
+.\" lj4.tmac
+.\"
+.nr _C \n(.C
+.cp 0
+.ftr CW CR
+.ftr C CR
+.ftr CX CBI
+.ftr H UR
+.ftr HR UR
+.ftr HB UB
+.ftr HBI UBI
+.ftr HI UI
+.ftr HO UI
+.ftr HX UBI
+.\" This is designed so that \(ul, \(rn and \(br form corners.
+.if !c\[br] .char \[br] \Z'\v'.25m'\D'R .04m -1m''
+.if !c\[ru] .char \[ru] \Z'\v'-.02m'\D'R .54m .04m''\h'.5m'
+.if !c\[rn] .char \[rn] \Z'\v'-.77m'\D'R .54m .04m''\h'.5m'
+.if !c\[ul] .char \[ul] \Z'\v'.23m'\D'R .54m .04m''\h'.5m'
+.cp \n(_C
diff --git a/contrib/groff/tmac/man.local b/contrib/groff/tmac/man.local
index 7bb8f50..c47b243 100644
--- a/contrib/groff/tmac/man.local
+++ b/contrib/groff/tmac/man.local
@@ -1,2 +1,2 @@
-.\" This file is loaded after tmac.an.
-.\" Put any local modifications to tmac.an here.
+.\" This file is loaded after an-old.tmac.
+.\" Put any local modifications to an-old.tmac here.
diff --git a/contrib/groff/tmac/man.tmac b/contrib/groff/tmac/man.tmac
new file mode 100644
index 0000000..ca7d14da
--- /dev/null
+++ b/contrib/groff/tmac/man.tmac
@@ -0,0 +1,3 @@
+.\" man.tmac
+.\"
+.do mso andoc.tmac
diff --git a/contrib/groff/tmac/mandoc.tmac b/contrib/groff/tmac/mandoc.tmac
new file mode 100644
index 0000000..ee21497
--- /dev/null
+++ b/contrib/groff/tmac/mandoc.tmac
@@ -0,0 +1,3 @@
+.\" mandoc.tmac
+.\"
+.do mso andoc.tmac
diff --git a/contrib/groff/tmac/mdoc.local b/contrib/groff/tmac/mdoc.local
new file mode 100644
index 0000000..2de6621
--- /dev/null
+++ b/contrib/groff/tmac/mdoc.local
@@ -0,0 +1,2 @@
+.\" This file is loaded after doc.tmac.
+.\" Put any local modifications to doc.tmac here.
diff --git a/contrib/groff/tmac/mdoc.tmac b/contrib/groff/tmac/mdoc.tmac
new file mode 100644
index 0000000..250d615
--- /dev/null
+++ b/contrib/groff/tmac/mdoc.tmac
@@ -0,0 +1,3 @@
+.\" mdoc.tmac
+.\"
+.do mso doc.tmac
diff --git a/contrib/groff/tmac/me.tmac b/contrib/groff/tmac/me.tmac
new file mode 100644
index 0000000..0c90a9b
--- /dev/null
+++ b/contrib/groff/tmac/me.tmac
@@ -0,0 +1,3 @@
+.\" me.tmac
+.\"
+.do mso e.tmac
diff --git a/contrib/groff/tmac/ms.tmac b/contrib/groff/tmac/ms.tmac
new file mode 100644
index 0000000..50e0370
--- /dev/null
+++ b/contrib/groff/tmac/ms.tmac
@@ -0,0 +1,3 @@
+.\" ms.tmac
+.\"
+.do mso s.tmac
diff --git a/contrib/groff/tmac/mwww.tmac b/contrib/groff/tmac/mwww.tmac
new file mode 100644
index 0000000..b258688
--- /dev/null
+++ b/contrib/groff/tmac/mwww.tmac
@@ -0,0 +1,3 @@
+.\" mwww.tmac
+.\"
+.do mso www.tmac
diff --git a/contrib/groff/tmac/pic.tmac b/contrib/groff/tmac/pic.tmac
new file mode 100644
index 0000000..ac3b024
--- /dev/null
+++ b/contrib/groff/tmac/pic.tmac
@@ -0,0 +1,12 @@
+.\" pic.tmac
+.\"
+.de PS
+.br
+.sp .3v
+.ne 0\\$1+1v+\n(.Vu
+.in \\n(.lu-\\n(.iu-0\\$2/2u>?0
+..
+.de PE
+.in
+.sp .3v+.5m
+..
diff --git a/contrib/groff/tmac/ps.tmac b/contrib/groff/tmac/ps.tmac
new file mode 100644
index 0000000..1aeacfd
--- /dev/null
+++ b/contrib/groff/tmac/ps.tmac
@@ -0,0 +1,54 @@
+.\" ps.tmac
+.\"
+.nr _C \n(.C
+.cp 0
+.ftr AX ABI
+.ftr KR BMR
+.ftr KI BMI
+.ftr KB BMB
+.ftr KX BMBI
+.ftr CW CR
+.ftr CO CI
+.ftr CX CBI
+.ftr H HR
+.ftr HO HI
+.ftr HX HBI
+.ftr Hr HNR
+.ftr Hi HNI
+.ftr Hb HNB
+.ftr Hx HNBI
+.ftr NX NBI
+.ftr PA PR
+.ftr PX PBI
+.ftr ZI ZCMI
+.ftr C CR
+.cflags 8 \(an
+.char \[radicalex] \h'-\w'\(sr'u'\[radicalex]\h'\w'\(sr'u'
+.char \(mo \h'.08m'\(mo\h'-.08m'
+.char \(nm \h'.08m'\(nm\h'-.08m'
+.char \[parenlefttp] \[parenlefttp]\h'.016m'
+.char \[parenleftbt] \[parenleftbt]\h'.016m'
+.char \[parenleftex] \[parenleftex]\h'.016m'
+.char \[parenrighttp] \[parenrighttp]\h'.016m'
+.char \[parenrightbt] \[parenrightbt]\h'.016m'
+.char \[parenrightex] \[parenrightex]\h'.016m'
+.if !c\[va] .char \[va] \o'\[ua]\[da]'
+.if !c\[ci] \
+.char \[ci] \v'-.25m'\h'.05m'\D'c .5m'\h'.05m'\v'.25m'
+.if !c\[sq] \
+.char \[sq] \h'.05m'\D'l .5m 0'\D'l 0 -.5m'\D'l -.5m 0'\D'l 0 .5m'\h'.55m'
+.if !c\[ru] .char \[ru] \D'l .5m 0'
+.if !c\[ul] .char \[ul] \v'.25m'\D'l .5m 0'\v'-.25m'
+.if !c\[br] .char \[br] \Z'\v'.25m'\D'l 0 -1m''
+.if !c\[rn] .char \[rn] \v'-.75m'\D'l .5m 0'\v'.75m'
+.if !c\[or] .char \[or] \h'.1m'\Z'\D'l 0 -.675m''\h'.1m'
+.if !c\[Fi] .char \[Fi] ffi
+.if !c\[Fl] .char \[Fl] ffl
+.if !c\[ff] .char \[ff] ff
+.if !c\[ij] .char \[ij] ij
+.if !c\[IJ] .char \[IJ] IJ
+.if !c\[tm] .char \[tm] \s-3\v'-.3m'TM\v'+.3m'\s+3
+.\" pic tests this register to see whether it should use \X'ps:...'
+.nr 0p 1
+.cp \n(_C
+.if !\n(.C .mso pspic.tmac
diff --git a/contrib/groff/tmac/psatk.tmac b/contrib/groff/tmac/psatk.tmac
new file mode 100644
index 0000000..dc6d2f38
--- /dev/null
+++ b/contrib/groff/tmac/psatk.tmac
@@ -0,0 +1,63 @@
+.\" psatk.tmac
+.\"
+.\" Implementation of the ATK PB and PE macros for use with groff and grops.
+.\" Load this after atk.tmac.
+.nr zT 0
+.if '\*(.T'ps' .nr zT 1
+.nr psatk-unit 1p
+.de psatk-defs
+ps: mdef 5
+/PB {
+ /saved save def
+ currentpoint translate
+ \n[psatk-unit] u -\n[psatk-unit] u scale
+ userdict begin
+ /showpage {} def
+} bind def
+/PE {
+ end
+ saved restore
+} bind def
+/troffadjust {
+ pop 0
+} bind def
+..
+.de PB
+.ne \\$1p
+.nr zT \\n(zT>0
+\\*[PB\\n(zT]\\
+..
+.de PE
+\\*[PE\\n(zT]\\
+..
+.ds PB0
+.\" The last line before the "'PE" is "\}" rather than ".\}". This
+.\" would cause a spurious space to be introduced before any picture
+.\" that was the first thing on a line. So we have to catch that and
+.\" remove it.
+.de PB1
+.ev psatk
+.fi
+.di psatk-mac
+\!ps: exec PB
+..
+.de PE0
+\v'-.75m'\
+\D'l \\$1p 0'\D'l 0 \\$2p'\D'l -\\$1p 0'\D'l 0 -\\$2p'\
+\h'\\$1p'\v'.75m'\x'\\$2p-1m>?0'\c
+..
+.ds psatk-init \Y[psatk-defs]
+.de PE1
+\!PE
+.di
+.di null
+.br
+.di
+.rm null
+.ev
+\v'-.75m'\
+\\*[psatk-init]\Y[psatk-mac]\
+\h'\\$1p'\v'.75m'\x'\\$2p-1m>?0'\c
+.rm psatk-mac
+.if \\n(.P .ds psatk-init
+..
diff --git a/contrib/groff/tmac/psfig.tmac b/contrib/groff/tmac/psfig.tmac
new file mode 100644
index 0000000..f966822
--- /dev/null
+++ b/contrib/groff/tmac/psfig.tmac
@@ -0,0 +1,89 @@
+.\" psfig.tmac
+.\"
+.\" These are macros to make psfig work with groff.
+.\" They require that psfig be patched as described in ../grops/psfig.diff.
+.de psfig-defs
+ps: mdef 100
+
+% wid ht llx lly urx ury psfigstart -
+
+/psfigstart {
+ /level1 save def
+ /ury exch def
+ /urx exch def
+ /lly exch def
+ /llx exch def
+ /ht exch u def
+ /wid exch u def
+ currentpoint ht add translate
+ wid urx llx sub div ht ury lly sub div neg scale
+ llx neg lly neg translate
+
+ % set the graphics state to default values
+ 0 setgray
+ 0 setlinecap
+ 1 setlinewidth
+ 0 setlinejoin
+ 10 setmiterlimit
+ [] 0 setdash
+ newpath
+ /showpage {} def
+} bind def
+
+% psfigclip -
+
+/psfigclip {
+ currentpoint newpath
+ llx lly moveto
+ urx lly lineto
+ urx ury lineto
+ llx ury lineto
+ closepath clip
+ newpath moveto
+} bind def
+
+% psfigend -
+
+/psfigend {
+ level1 restore
+} bind def
+
+% globalstart -
+
+/globalstart {
+ % save the current space code on the stack
+ SC
+ level0 restore
+} bind def
+
+% globalend -
+
+/globalend {
+ end
+ BP
+ /SC exch def
+ DEFS begin
+} bind def
+..
+.de psfig-init
+.if \\n[.P] \{\
+\Y[psfig-defs]
+. br
+. sp -1
+. ds psfig-init\" empty
+. rm psfig-defs
+.\}
+..
+.de F+
+.br
+.psfig-init
+.nr psfig-fill \\n[.u]
+.nf
+.sp -.5
+.if !\\n[.$] .ce 9999
+..
+.de F-
+.br
+.ce 0
+.if \\n[psfig-fill] .fi
+..
diff --git a/contrib/groff/tmac/psold.tmac b/contrib/groff/tmac/psold.tmac
new file mode 100644
index 0000000..28a446b
--- /dev/null
+++ b/contrib/groff/tmac/psold.tmac
@@ -0,0 +1,61 @@
+.\" psold.tmac
+.\"
+.\" In newer PostScript printers, text fonts contain all ISO Latin-1
+.\" characters. The font description files that comes with groff match
+.\" these fonts. The text fonts in older PostScript printers are missing
+.\" some of these characters. This file prevents those characters from
+.\" being used. This will allow the PostScript output to be printed on
+.\" such old printers.
+.nr _C \n(.C
+.cp 0
+.\" Define an accented character.
+.de ps-achar
+.\" Note that character definitions are always interpreted with
+.\" compatibility mode off.
+.char \\$1 \\$3\
+\k[acc]\
+\h'(u;-\w'\\$2'-\w'\\$3'/2+\\\\n[skw]+(\w'x'*0)-\\\\n[skw])'\
+\v'(u;\w'x'*0+\\\\n[rst]+(\w'\\$3'*0)-\\\\n[rst])'\
+\\$2\
+\v'(u;\w'x'*0-\\\\n[rst]+(\w'\\$3'*0)+\\\\n[rst])'\
+\h'|\\\\n[acc]u'
+.ie '\\$3'\(.i' .hcode \\$1i
+.el .hcode \\$1\\$3
+..
+.ps-achar \['y] \(aa y
+.ps-achar \['Y] \(aa Y
+.char \[12] \v'-.7m\s[\\n(.s*6u/10u]+.7m'1\v'-.7m\s0+.7m'\
+\(f/\s[\\n(.s*6u/10u]2\s0
+.char \[14] \v'-.7m\s[\\n(.s*6u/10u]+.7m'1\v'-.7m\s0+.7m'\
+\(f/\s[\\n(.s*6u/10u]4\s0
+.char \[34] \v'-.7m\s[\\n(.s*6u/10u]+.7m'3\v'-.7m\s0+.7m'\
+\(f/\s[\\n(.s*6u/10u]4\s0
+.char \[S1] \v'-.2m'\s-31\s+3\v'+.2m'
+.char \[S2] \v'-.2m'\s-32\s+3\v'+.2m'
+.char \[S3] \v'-.2m'\s-33\s+3\v'+.2m'
+.char \[bb] |
+.char \[de] \fS\(de
+.char \[-D] \Z'\v'-.1m'-'D
+.char \[TP] \
+I\h'-.25m'\v'-.33m'\s'\En(.s*6u/10u'\v'.33m'D\v'-.33m'\s0\v'.33m'
+.char \[Sd] \Z'\v'-.3m'\h'.2m'-'\(pd
+.char \[Tp] \zlp
+.tr \[char166]\[bb]
+.tr \[char176]\[de]
+.tr \[char177]\[+-]
+.tr \[char178]\[S2]
+.tr \[char179]\[S3]
+.tr \[char181]\[*m]
+.tr \[char185]\[S1]
+.tr \[char188]\[14]
+.tr \[char189]\[12]
+.tr \[char190]\[34]
+.tr \[char208]\[-D]
+.tr \[char215]\[mu]
+.tr \[char221]\['Y]
+.tr \[char222]\[TP]
+.tr \[char240]\[Sd]
+.tr \[char247]\[di]
+.tr \[char253]\['y]
+.tr \[char254]\[Tp]
+.cp \n(_C
diff --git a/contrib/groff/tmac/pspic.tmac b/contrib/groff/tmac/pspic.tmac
new file mode 100644
index 0000000..ab06668
--- /dev/null
+++ b/contrib/groff/tmac/pspic.tmac
@@ -0,0 +1,60 @@
+.\" pspic.tmac
+.\"
+.\" Define the PSPIC macro.
+.\" When used other than with -Tps, it will draw a box around where
+.\" the picture would go.
+.de PSPIC
+.nr ps-offset-mode 0
+.ie '\\$1'-L' \{\
+. nr ps-offset-mode 1
+. shift
+. HTML-DO-IMAGE \\$1 l
+.\}
+.el \{\
+. ie '\\$1'-R' \{\
+. nr ps-offset-mode 2
+. shift
+. HTML-DO-IMAGE \\$1 r
+. \}
+. el \{\
+. if '\\$1'-I' \{\
+. nr ps-offset-mode 3
+. nr ps-offset (m;\\$2)
+. shift 2
+. \}
+. HTML-DO-IMAGE \\$1 i
+. \}
+.\}
+.br
+.psbb \\$1
+.if (\\n[llx] : \\n[lly] : \\n[urx] : \\n[ury]) \{\
+. nr ps-wid (\\n[urx]-\\n[llx])
+. nr ps-ht (\\n[ury]-\\n[lly])
+. if \\n[ps-wid]<0 .nr ps-wid 0-\\n[ps-wid]
+. if \\n[ps-ht]<0 .nr ps-ht 0-\\n[ps-ht]
+. ie \\n[.$]>=2 .nr ps-deswid (i;\\$2)
+. el .nr ps-deswid \\n[.l]-\\n[.i]<?\\n[ps-wid]p
+. nr ps-desht \\n[ps-deswid]*1000+(\\n[ps-wid]/2)/\\n[ps-wid]\
+*\\n[ps-ht]+500/1000
+. if \\n[.$]>=3&(\\n[ps-desht]>(i;0\\$3)) \{\
+. nr ps-desht (i;\\$3)
+. nr ps-deswid \\n[ps-desht]*1000+(\\n[ps-ht]/2)/\\n[ps-ht]\
+*\\n[ps-wid]+500/1000
+. \}
+. ne \\n[ps-desht]u+1v
+. if \\n[ps-offset-mode]=0 .nr ps-offset \\n[.l]-\\n[.i]-\\n[ps-deswid]/2
+. if \\n[ps-offset-mode]=1 .nr ps-offset 0
+. if \\n[ps-offset-mode]=2 .nr ps-offset \\n[.l]-\\n[.i]-\\n[ps-deswid]
+. ie \\n[.$]>=3 .ds ps-desht \\n[ps-desht]
+. el .ds ps-desht \" empty
+\h'\\n[ps-offset]u'\
+\X'ps: invis'\
+\Z'\D'p 0 \\n[ps-desht]u \\n[ps-deswid]u 0 0 -\\n[ps-desht]u''\
+\X'ps: endinvis'\
+\v'\\n[ps-desht]u'\X'ps: import \\$1 \
+\\n[llx] \\n[lly] \\n[urx] \\n[ury] \\n[ps-deswid] \\*[ps-desht]'
+. br
+. sp \\n[ps-desht]u
+.\}
+.HTML-IMAGE-END
+..
diff --git a/contrib/groff/tmac/s.tmac b/contrib/groff/tmac/s.tmac
new file mode 100644
index 0000000..7d1ad49
--- /dev/null
+++ b/contrib/groff/tmac/s.tmac
@@ -0,0 +1,1934 @@
+.\" -*- nroff -*-
+.ig
+
+s.tmac
+
+Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
+ Written by James Clark (jjc@jclark.com)
+
+This file is part of groff.
+
+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 2, 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 groff; see the file COPYING. If not, write to the Free Software
+Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+..
+.if !\n(.g .ab These ms macros require groff.
+.if \n(.C \
+. ab The groff ms macros do not work in compatibility mode.
+.\" Enable warnings. You can delete this if you want.
+.warn
+.\" See if already loaded.
+.if r GS .nx
+.nr GS 1
+.de @error
+.tm \\n(.F:\\n(.c: macro error: \\$*
+..
+.de @warning
+.tm \\n(.F:\\n(.c: macro warning: \\$*
+..
+.de @fatal
+.ab \\n(.F:\\n(.c: fatal macro error: \\$*
+..
+.de @not-implemented
+.@error sorry, \\$0 not implemented
+.als \\$0 @nop
+..
+.als TM @not-implemented
+.als CT @not-implemented
+.de @nop
+..
+.de @init
+.nr PO \\n(.o
+.\" a non-empty environment
+.ev ne
+\c
+.ev
+.ev nf
+'nf
+.ev
+..
+.ds REFERENCES References
+.ds ABSTRACT ABSTRACT
+.ds TOC Table of Contents
+.ds MONTH1 January
+.ds MONTH2 February
+.ds MONTH3 March
+.ds MONTH4 April
+.ds MONTH5 May
+.ds MONTH6 June
+.ds MONTH7 July
+.ds MONTH8 August
+.ds MONTH9 September
+.ds MONTH10 October
+.ds MONTH11 November
+.ds MONTH12 December
+.ds MO \\*[MONTH\n[mo]]
+.ds DY \n[dy] \*[MO] \n[year]
+.de ND
+.if \\n[.$] .ds DY "\\$*
+..
+.de DA
+.if \\n[.$] .ds DY "\\$*
+.ds CF \\*[DY]
+..
+.\" indexing
+.de IX
+.tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[PN]
+..
+.\" print an error message and then try to recover
+.de @error-recover
+.@error \\$@ (recovering)
+.nr *pop-count 0
+.while !'\\n(.z'' \{\
+. \"@warning automatically terminating diversion \\n(.z
+. ie d @div-end!\\n(.z .@div-end!\\n(.z
+. el .*div-end-default
+. nr *pop-count +1
+. \" ensure that we don't loop forever
+. if \\n[*pop-count]>20 .@fatal recovery failed
+.\}
+.while !'\\n[.ev]'0' .ev
+.par@reset-env
+.par@reset
+..
+.de *div-end-default
+.ds *last-div \\n(.z
+.br
+.di
+.ev nf
+.\\*[*last-div]
+.ev
+..
+.\" ****************************
+.\" ******** module cov ********
+.\" ****************************
+.\" Cover sheet and first page.
+.de cov*err-not-after-first-page
+.@error \\$0 is not allowed after the first page has started
+..
+.de cov*err-not-before-tl
+.@error \\$0 is not allowed before TL
+..
+.de cov*err-not-again
+.@error \\$0 is not allowed more than once
+..
+.de cov*err-not-after-ab
+.@error \\$0 is not allowed after first AB, LP, PP, IP, SH or NH
+..
+.als AU cov*err-not-before-tl
+.als AI cov*err-not-before-tl
+.als AB cov*err-not-before-tl
+.de cov*first-page-init
+.rm cov*first-page-init
+.par@init
+.als RP cov*err-not-after-first-page
+.@init
+.ie \\n[cov*rp-format] \{\
+. pg@cs-top
+. als FS cov*FS
+. als FE cov*FE
+.\}
+.el \{\
+. pg@top
+. als FS @FS
+. als FE @FE
+.\}
+.wh 0 pg@top
+.CHECK-FOOTER-AND-KEEP
+..
+.wh 0 cov*first-page-init
+.\" This handles the case where FS occurs before TL or LP.
+.de FS
+.br
+\\*[FS]\\
+..
+.nr cov*rp-format 0
+.nr cov*rp-no 0
+.\" released paper format
+.de RP
+.nr cov*rp-format 1
+.if \\n[.$] .if '\\$1'no' .nr cov*rp-no 1
+.pn 0
+..
+.de TL
+.br
+.als TL cov*err-not-again
+.rn @AB AB
+.rn @AU AU
+.rn @AI AI
+.if !'\*(.T'html' .di cov*tl-div
+.par@reset
+.ft B
+.ps +2
+.vs +3p
+.ll (u;\\n[LL]*5/6)
+.nr cov*n-au 0
+.HTML-TAG ".tl"
+..
+.de @AU
+.par@reset
+.if !'\\n(.z'' \{\
+. br
+. di
+.\}
+.nr cov*n-au +1
+.di cov*au-div!\\n[cov*n-au]
+.nf
+.ft I
+.ps \\n[PS]
+..
+.de @AI
+.if !'\*(.T'html' .par@reset
+.if !'\\n(.z'' \{\
+. br
+. di
+.\}
+.ie !\\n[cov*n-au] .@error AI before AU
+.el \{\
+. di cov*ai-div!\\n[cov*n-au]
+. nf
+. ft R
+. ps \\n[PS]
+.\}
+..
+.de LP
+.if !'\\n[.z]'' \{\
+. br
+. di
+.\}
+.br
+.cov*ab-init
+.cov*print
+\\*[\\$0]\\
+..
+.als IP LP
+.als PP LP
+.als XP LP
+.als QP LP
+.als RS LP
+.als NH LP
+.als SH LP
+.als MC LP
+.als RT LP
+.als XS LP
+.de cov*ab-init
+.als cov*ab-init @nop
+.als LP @LP
+.als IP @IP
+.als PP @PP
+.als XP @XP
+.als RT @RT
+.als XS @XS
+.als SH @SH
+.als NH @NH
+.als QP @QP
+.als RS @RS
+.als RE @RE
+.als QS @QS
+.als QE @QE
+.als MC @MC
+.als EQ @EQ
+.als EN @EN
+.als TS @TS
+.als AB cov*err-not-after-ab
+.als AU par@AU
+.als AI par@AI
+.als TL par@TL
+..
+.de @AB
+.if !'\\n(.z'' \{\
+. br
+. di
+.\}
+.cov*ab-init
+.if !'\*(.T'html' .di cov*ab-div
+.par@ab-indent
+.par@reset
+.if !'\\$1'no' \{\
+. ft I
+. ce 1
+\\*[ABSTRACT]
+. sp
+. ft R
+.\}
+.ns
+.@PP
+.if '\*(.T'html' \{\
+. cov*tl-au-print
+. als cov*tl-au-print @nop
+. par@reset-env
+. par@reset
+. cov*print
+.\}
+..
+.de AE
+.ie '\*(.T'html' \{\
+. als AE cov*err-not-again
+.\}
+.el \{\
+. ie '\\n(.z'cov*ab-div' \{\
+. als AE cov*err-not-again
+. br
+. di
+.\" nr cov*ab-height \\n[dn]
+. par@reset-env
+. par@reset
+. cov*print
+. \}
+. el .@error AE without AB
+.\}
+..
+.de @div-end!cov*ab-div
+.AE
+..
+.de cov*print
+.als cov*print @nop
+.ie d cov*tl-div \{\
+. ie \\n[cov*rp-format] .cov*rp-print
+. el .cov*draft-print
+.\}
+.el \{\
+. if \\n[cov*rp-format] \{\
+. @warning RP format but no TL
+. bp 1
+. als FS @FS
+. als FE @FE
+. CHECK-FOOTER-AND-KEEP
+. \}
+. br
+.\}
+..
+.de cov*rp-print
+.nr cov*page-length \\n[.p]
+.pl 1000i
+.cov*tl-au-print
+.sp 3
+.if d cov*ab-div \{\
+. if !'\*(.T'html' . nf
+. cov*ab-div
+.\}
+.sp 3
+.par@reset
+\\*[DY]
+.br
+.if \\n[cov*fn-height] \{\
+. sp |(u;\\n[cov*page-length]-\\n[FM]\
+-\\n[cov*fn-height]-\\n[fn@sep-dist]>?\\n[nl])
+. fn@print-sep
+. ev nf
+. cov*fn-div
+. ev
+. ie \\n[cov*rp-no] .rm cov*fn-div
+. el \{\
+. rn cov*fn-div fn@overflow-div
+. nr fn@have-overflow 1
+. \}
+.\}
+.als FS @FS
+.als FE @FE
+.CHECK-FOOTER-AND-KEEP
+.\" If anything was printed below where the footer line is normally printed,
+.\" then that's an overflow.
+.if -\\n[FM]/2+1v+\\n[cov*page-length]<\\n[nl] .@error cover sheet overflow
+.pl \\n[cov*page-length]u
+.bp 1
+.if !\\n[cov*rp-no] .cov*tl-au-print
+.rs
+.sp 1
+..
+.de cov*draft-print
+.cov*tl-au-print
+.if d cov*ab-div \{\
+. nf
+. sp 2
+. cov*ab-div
+.\}
+.sp 1
+..
+.de cov*tl-au-print
+.par@reset
+.nf
+.rs
+.sp 3
+.ce 9999
+.if d cov*tl-div .cov*tl-div
+.nr cov*i 1
+.nr cov*sp 1v
+.while \\n[cov*i]<=\\n[cov*n-au] \{\
+. sp \\n[cov*sp]u
+. cov*au-div!\\n[cov*i]
+. ie d cov*ai-div!\\n[cov*i] \{\
+. sp .5v
+. cov*ai-div!\\n[cov*i]
+. nr cov*sp 1v
+. \}
+. el .nr cov*sp .5v
+. nr cov*i +1
+.\}
+.ce 0
+..
+.nr cov*fn-height 0
+.nr cov*in-fn 0
+.\" start of footnote on cover
+.de cov*FS
+.if \\n[cov*in-fn] \{\
+. @error nested FS
+. FE
+.\}
+.nr cov*in-fn 1
+.ev fn
+.par@reset-env
+.da cov*fn-div
+.if !\\n[cov*fn-height] .ns
+.ie \\n[.$] .FP "\\$1" no
+.el .@LP
+..
+.de @div-end!cov*fn-div
+.cov*FE
+..
+.\" end of footnote on cover
+.de cov*FE
+.ie '\\n(.z'cov*fn-div' \{\
+. br
+. ev
+. di
+. nr cov*in-fn 0
+. nr cov*fn-height +\\n[dn]
+.\}
+.el .@error FE without matching FS
+..
+.\" ***************************
+.\" ******** module pg ********
+.\" ***************************
+.\" Page-level formatting.
+.\" > 0 if we have a footnote on the current page
+.nr pg@fn-flag 0
+.nr pg@colw 0
+.nr pg@fn-colw 0
+.nr HM 1i
+.nr FM 1i
+.ds LF
+.ds CF
+.ds RF
+.ds LH
+.ds CH -\\n[PN]-
+.ds RH
+.ds pg*OH '\\*[LH]'\\*[CH]'\\*[RH]'
+.ds pg*EH '\\*[LH]'\\*[CH]'\\*[RH]'
+.ds pg*OF '\\*[LF]'\\*[CF]'\\*[RF]'
+.ds pg*EF '\\*[LF]'\\*[CF]'\\*[RF]'
+.de OH
+.ds pg*\\$0 "\\$*
+..
+.als EH OH
+.als OF OH
+.als EF OH
+.de PT
+.ie \\n%=1 .if \\n[pg*P1] .tl \\*[pg*OH]
+.el \{\
+. ie o .tl \\*[pg*OH]
+. el .tl \\*[pg*EH]
+.\}
+..
+.de BT
+.ie o .tl \\*[pg*OF]
+.el .tl \\*[pg*EF]
+..
+.nr pg*P1 0
+.de P1
+.nr pg*P1 1
+..
+.wh -\n[FM]u pg@bottom
+.wh -\n[FM]u/2u pg*footer
+.nr MINGW 2n
+.nr pg@ncols 1
+.de @MC
+.if !'\\n(.z'' .error-recover MC while diversion open
+.br
+.ie \\n[pg@ncols]>1 .pg@super-eject
+.el \{\
+. \" flush out any floating keeps
+. while \\n[kp@tail]>\\n[kp@head] \{\
+. rs
+. bp
+. \}
+.\}
+.ie !\\n(.$ \{\
+. nr pg@colw \\n[LL]*7/15
+. nr pg*gutw \\n[LL]-(2*\\n[pg@colw])
+. nr pg@ncols 2
+.\}
+.el \{\
+. nr pg@colw (n;\\$1)<?\\n[LL]
+. ie \\n[.$]<2 .nr pg*gutw \\n[MINGW]
+. el .nr pg*gutw (n;\\$2)
+. nr pg@ncols \\n[LL]-\\n[pg@colw]/(\\n[pg@colw]+\\n[pg*gutw])+1
+. ie \\n[pg@ncols]>1 \
+. nr pg*gutw \\n[LL]-(\\n[pg@ncols]*\\n[pg@colw])/(\\n[pg@ncols]-1)
+. el .nr pg*gutw 0
+.\}
+.HTML-TAG ".mc \\n[pg@ncols] \\n[pg@colw] \\n[pg*gutw]"
+.mk pg*col-top
+.ns
+.nr pg*col-num 0
+.nr pg@fn-colw \\n[pg@colw]*5/6
+.par@reset
+..
+.de 2C
+.MC
+..
+.de 1C
+.MC \\n[LL]u
+..
+.\" top of page macro
+.de pg@top
+.ch pg*footer -\\n[FM]u/2u
+.nr PN \\n%
+.nr pg*col-num 0
+.nr pg@fn-bottom-margin 0
+.nr pg*saved-po \\n[PO]
+.po \\n[PO]u
+.ev h
+.par@reset
+.sp (u;\\n[HM]/2)
+.PT
+.sp |\\n[HM]u
+.if d HD .HD
+.mk pg@header-bottom
+.ev
+.mk pg*col-top
+.pg*start-col
+..
+.de pg*start-col
+.\" Handle footnote overflow before floating keeps, because the keep
+.\" might contain an embedded footnote.
+.fn@top-hook
+.kp@top-hook
+.tbl@top-hook
+.ns
+..
+.de pg@cs-top
+.sp \\n[HM]u
+.\" move pg@bottom and pg*footer out of the way
+.ch pg@bottom \\n[.p]u*2u
+.ch pg*footer \\n[.p]u*2u
+.ns
+..
+.de pg@bottom
+.tbl@bottom-hook
+.if \\n[pg@fn-flag] .fn@bottom-hook
+.nr pg*col-num +1
+.ie \\n[pg*col-num]<\\n[pg@ncols] .pg*end-col
+.el .pg*end-page
+..
+.de pg*end-col
+'sp |\\n[pg*col-top]u
+.po (u;\\n[pg*saved-po]+(\\n[pg@colw]+\\n[pg*gutw]*\\n[pg*col-num]))
+.\"po +(u;\\n[pg@colw]+\\n[pg*gutw])
+.pg*start-col
+..
+.de pg*end-page
+.po \\n[pg*saved-po]u
+.\" Make sure we don't exit if there are still floats or footnotes left-over.
+.ie \\n[kp@head]<\\n[kp@tail]:\\n[fn@have-overflow] \{\
+. \" Switching environments ensures that we don't get an unnecessary
+. \" blank line at the top of the page.
+. ev ne
+' bp
+. ev
+.\}
+.el \{\
+. \" If the text has ended and there are no more footnotes or keeps, exit.
+. if \\n[pg@text-ended] .ex
+. if r pg*next-number \{\
+. pn \\n[pg*next-number]
+. rr pg*next-number
+. if d pg*next-format \{\
+. af PN \\*[pg*next-format]
+. rm pg*next-format
+. \}
+. \}
+' bp
+.\}
+..
+.\" pg@begin number format
+.de pg@begin
+.ie \\n[.$]>0 \{\
+. nr pg*next-number (;\\$1)
+. ie \\n[.$]>1 .ds pg*next-format \\$2
+. el .rm pg*next-format
+.\}
+.el .rr pg*next-number
+.pg@super-eject
+..
+.\" print the footer line
+.de pg*footer
+.ev h
+.par@reset
+.BT
+.ev
+..
+.\" flush out any keeps or footnotes
+.de pg@super-eject
+.br
+.if !'\\n(.z'' .@error-recover diversion open while ejecting page
+.\" Make sure we stay in the end macro while there is still footnote overflow
+.\" left, or floating keeps.
+.while \\n[kp@tail]>\\n[kp@head]:\\n[pg@fn-flag] \{\
+. rs
+. bp
+.\}
+.bp
+..
+.nr pg@text-ended 0
+.de pg@end-text
+.br
+.nr pg@text-ended 1
+.pg@super-eject
+..
+.em pg@end-text
+.\" ***************************
+.\" ******** module fn ********
+.\" ***************************
+.\" Footnotes.
+.nr fn@sep-dist 8p
+.ev fn
+.\" Round it vertically
+.vs \n[fn@sep-dist]u
+.nr fn@sep-dist \n[.v]
+.ev
+.nr fn*text-num 0 1
+.nr fn*note-num 0 1
+.ds * \\*[par@sup-start]\En+[fn*text-num]\\*[par@sup-end]
+.nr fn*open 0
+.\" normal FS
+.de @FS
+.ie \\n[.$] .fn*do-FS "\\$1" no
+.el \{\
+. ie \\n[fn*text-num]>\\n[fn*note-num] .fn*do-FS \\n+[fn*note-num]
+. el .fn*do-FS
+.\}
+..
+.\" Second argument of `no' means don't embellish the first argument.
+.de fn*do-FS
+.if \\n[fn*open] .@error-recover nested FS
+.nr fn*open 1
+.if \\n[.u] \{\
+. \" Ensure that the first line of the footnote is on the same page
+. \" as the reference. I think this is minimal.
+. ev fn
+. nr fn*need 1v
+. ev
+. ie \\n[pg@fn-flag] .nr fn*need +\\n[fn:PD]
+. el .nr fn*need +\\n[fn@sep-dist]
+. ne \\n[fn*need]u+\\n[.V]u>?0
+.\}
+.ev fn
+.par@reset-env
+.fn*start-div
+.par@reset
+.ie \\n[.$] .FP \\$@
+.el .@LP
+..
+.de @FE
+.ie !\\n[fn*open] .@error FE without FS
+.el \{\
+. nr fn*open 0
+. br
+. ev
+. fn*end-div
+.\}
+..
+.nr fn@have-overflow 0
+.\" called at the top of each column
+.de fn@top-hook
+.nr fn*max-width 0
+.nr fn*page-bottom-pos 0-\\n[FM]-\\n[pg@fn-bottom-margin]
+.ch pg@bottom \\n[fn*page-bottom-pos]u
+.if \\n[fn@have-overflow] \{\
+. nr fn@have-overflow 0
+. fn*start-div
+. ev nf
+. fn@overflow-div
+. ev
+. fn*end-div
+.\}
+..
+.\" This is called at the bottom of the column if pg@fn-flag is set.
+.de fn@bottom-hook
+.nr pg@fn-flag 0
+.nr fn@have-overflow 0
+.nr fn@bottom-pos \\n[.p]-\\n[FM]-\\n[pg@fn-bottom-margin]+\\n[.v]
+.ev fn
+.nr fn@bottom-pos -\\n[.v]
+.ev
+.ie \\n[nl]+\\n[fn@sep-dist]+\n[.V]>\\n[fn@bottom-pos] \{\
+. rn fn@div fn@overflow-div
+. nr fn@have-overflow 1
+.\}
+.el \{\
+. if \\n[pg@ncols]>1 \
+. if \\n[fn*max-width]>\\n[pg@fn-colw] \
+. nr pg@fn-bottom-margin \\n[.p]-\\n[FM]-\\n[nl]+1v
+. wh \\n[fn@bottom-pos]u fn*catch-overflow
+. fn@print-sep
+. ev nf
+. fn@div
+. rm fn@div
+. ev
+. if '\\n(.z'fn@overflow-div' \{\
+. di
+. nr fn@have-overflow \\n[dn]>0
+. \}
+. ch fn*catch-overflow
+.\}
+..
+.de fn*catch-overflow
+.di fn@overflow-div
+..
+.nr fn*embed-count 0
+.de @div-end!fn@div
+.br
+.if '\\n[.ev]'fn' .ev
+.fn*end-div
+.nr fn*open 0
+..
+.als @div-end!fn*embed-div @div-end!fn@div
+.de fn*start-div
+.ie '\\n(.z'' \{\
+. da fn@div
+. if !\\n[pg@fn-flag] .ns
+.\}
+.el .di fn*embed-div
+..
+.de fn*end-div
+.ie '\\n(.z'fn@div' \{\
+. di
+. nr fn*page-bottom-pos -\\n[dn]
+. nr fn*max-width \\n[fn*max-width]>?\\n[dl]
+. if !\\n[pg@fn-flag] .nr fn*page-bottom-pos -\\n[fn@sep-dist]
+. nr pg@fn-flag 1
+. nr fn*page-bottom-pos \\n[nl]-\\n[.p]+\n[.V]>?\\n[fn*page-bottom-pos]
+. ch pg@bottom \\n[fn*page-bottom-pos]u
+.\}
+.el \{\
+. ie '\\n(.z'fn*embed-div' \{\
+. di
+. rn fn*embed-div fn*embed-div!\\n[fn*embed-count]
+\!. fn*embed-start \\n[fn*embed-count]
+. rs
+' sp (u;\\n[dn]+\\n[fn@sep-dist]+\\n[.V])
+\!. fn*embed-end
+. nr fn*embed-count +1
+. \}
+. el \{\
+. ev fn
+. @error-recover unclosed diversion within footnote
+. \}
+.\}
+..
+.de fn*embed-start
+.ie '\\n(.z'' \{\
+. fn*start-div
+. ev nf
+. fn*embed-div!\\$1
+. rm fn*embed-div!\\$1
+. ev
+. fn*end-div
+. di fn*null
+.\}
+.el \{\
+\!. fn*embed-start \\$1
+. rs
+.\}
+..
+.de fn*embed-end
+.ie '\\n(.z'fn*null' \{\
+. di
+. rm fn*null
+.\}
+.el \!.fn*embed-end
+..
+.\" It's important that fn@print-sep use up exactly fn@sep-dist vertical space.
+.de fn@print-sep
+.ev fn
+.in 0
+.vs \\n[fn@sep-dist]u
+\D'l 1i 0'
+.br
+.ev
+..
+.\" ***************************
+.\" ******** module kp ********
+.\" ***************************
+.\" Keeps.
+.de KS
+.br
+.di kp*div
+..
+.de KF
+.if !'\\n(.z'' .@error-recover KF while open diversion
+.di kp*fdiv
+.ev k
+.par@reset-env
+.par@reset
+..
+.de KE
+.ie '\\n(.z'kp*div' .kp*end
+.el \{\
+. ie '\\n(.z'kp*fdiv' .kp*fend
+. el .@error KE without KS or KF
+.\}
+..
+.de @div-end!kp*div
+.kp*end
+..
+.de @div-end!kp*fdiv
+.kp*fend
+..
+.de kp*need
+.ie '\\n(.z'' .ds@need \\$1
+.el \!.kp*need \\$1
+..
+.\" end non-floating keep
+.de kp*end
+.br
+.di
+.kp*need \\n[dn]
+.ev nf
+.kp*div
+.ev
+.rm kp*div
+..
+.\" Floating keeps.
+.nr kp@head 0
+.nr kp@tail 0
+.\" end floating keep
+.de kp*fend
+.br
+.ev
+.di
+.ie \\n[.t]-(\\n[.k]>0*1v)>\\n[dn] \{\
+. br
+. ev nf
+. kp*fdiv
+. rm kp*fdiv
+. ev
+.\}
+.el \{\
+. rn kp*fdiv kp*div!\\n[kp@tail]
+. nr kp*ht!\\n[kp@tail] 0\\n[dn]
+. nr kp@tail +1
+.\}
+..
+.\" top of page processing for KF
+.nr kp*doing-top 0
+.de kp@top-hook
+.if !\\n[kp*doing-top] \{\
+. nr kp*doing-top 1
+. kp*do-top
+. nr kp*doing-top 0
+.\}
+..
+.de kp*do-top
+.\" If the first keep won't fit, only force it out if we haven't had a footnote
+.\" and we're at the top of the page.
+.nr kp*force \\n[pg@fn-flag]=0&(\\n[nl]<=\\n[pg@header-bottom])
+.nr kp*fits 1
+.while \\n[kp@tail]>\\n[kp@head]&\\n[kp*fits] \{\
+. ie \\n[.t]>\\n[kp*ht!\\n[kp@head]]:\\n[kp*force] \{\
+. nr kp*force 0
+. \" It's important to advance kp@head before bringing
+. \" back the keep, so that if the last line of the
+. \" last keep springs the bottom of page trap, a new
+. \" page will not be started unnecessarily.
+. rn kp*div!\\n[kp@head] kp*temp
+. nr kp@head +1
+. ev nf
+. kp*temp
+. ev
+. rm kp*temp
+. \}
+. el .nr kp*fits 0
+.\}
+..
+.\" ***************************
+.\" ******** module ds ********
+.\" ***************************
+.\" Displays and non-floating keeps.
+.de DE
+.ds*end!\\n[\\n[.ev]:ds-type]
+.nr \\n[.ev]:ds-type 0
+..
+.de ds@auto-end
+.if \\n[\\n[.ev]:ds-type] \{\
+. @error automatically terminating display
+. DE
+.\}
+..
+.de @div-end!ds*div
+.ie \\n[\\n[.ev]:ds-type] .DE
+.el .ds*end!2
+..
+.de ds*end!0
+.@error DE without DS, ID, CD, LD or BD
+..
+.de LD
+.br
+.nr \\n[.ev]:ds-type 1
+.par@reset
+.nf
+.sp \\n[DD]u
+..
+.de ID
+.LD
+.ie \\n[.$] .in +(n;\\$1)
+.el .in +\\n[DI]u
+..
+.de CD
+.LD
+.ce 9999
+..
+.de RD
+.LD
+.rj 9999
+..
+.de ds*common-end
+.par@reset
+.sp \\n[DD]u
+..
+.als ds*end!1 ds*common-end
+.de BD
+.LD
+.nr \\n[.ev]:ds-type 2
+.di ds*div
+..
+.de ds*end!2
+.br
+.ie '\\n(.z'ds*div' \{\
+. di
+. nf
+. in (u;\\n[.l]-\\n[dl]/2>?0)
+. ds*div
+. rm ds*div
+. ds*common-end
+.\}
+.el .@error-recover mismatched DE
+..
+.de DS
+.br
+.di ds*div
+.ie '\\$1'B' \{\
+. LD
+. nr \\n[.ev]:ds-type 4
+.\}
+.el \{\
+. ie '\\$1'L' .LD
+. el \{\
+. ie '\\$1'C' .CD
+. el \{\
+. ie '\\$1'R' .RD
+. el \{\
+. ie '\\$1'I' .ID \\$2
+. el .ID \\$1
+. \}
+. \}
+. \}
+. nr \\n[.ev]:ds-type 3
+.\}
+..
+.de ds@need
+.if '\\n(.z'' \{\
+. while \\n[.t]<=(\\$1)&(\\n[nl]>\\n[pg@header-bottom]) \{\
+. rs
+' sp \\n[.t]u
+. \}
+.\}
+..
+.de ds*end!3
+.br
+.ie '\\n(.z'ds*div' \{\
+. di
+. ds@need \\n[dn]
+. ev nf
+. ds*div
+. ev
+. rm ds*div
+. ds*common-end
+.\}
+.el .@error-recover mismatched DE
+..
+.de ds*end!4
+.ie '\\n(.z'ds*div' \{\
+. br
+. di
+. nf
+. in (u;\\n[.l]-\\n[dl]/2>?0)
+. ds@need \\n[dn]
+. ds*div
+. rm ds*div
+. ds*common-end
+.\}
+.el .@error-recover mismatched DE
+..
+.\" ****************************
+.\" ******** module par ********
+.\" ****************************
+.\" Paragraph-level formatting.
+.\" Load time initialization.
+.de par@load-init
+.\" PS and VS might have been set on the command-line
+.if !rPS .nr PS 10
+.if !rLL .nr LL 6i
+.ll \\n[LL]u
+.\" don't set LT so that it can be defaulted from LL
+.ie rLT .lt \\n[LT]u
+.el .lt \\n[LL]u
+.ps \\n[PS]
+.\" don't set VS so that it can be defaulted from PS
+.ie rVS .par*vs \\n[VS]
+.el .par*vs \\n[PS]+2
+.if dFAM .fam \\*[FAM]
+.if !rHY .nr HY 14
+.hy \\n[HY]
+.TA
+.CHECK-FOOTER-AND-KEEP
+..
+.de par*vs
+.\" If it's too big to be in points, treat it as units.
+.ie (p;\\$1)>=40p .vs (u;\\$1)
+.el .vs (p;\\$1)
+..
+.de par@ab-indent
+.nr 0:li (u;\\n[LL]/12)
+.nr 0:ri \\n[0:li]
+..
+.de par*env-init
+.aln \\n[.ev]:PS PS
+.aln \\n[.ev]:VS VS
+.aln \\n[.ev]:LL LL
+.aln \\n[.ev]:MCLL LL
+.aln \\n[.ev]:LT LT
+.aln \\n[.ev]:MCLT LT
+.aln \\n[.ev]:PI PI
+.aln \\n[.ev]:PD PD
+.ad \\n[par*adj]
+.par@reset-env
+..
+.\" happens when the first page begins
+.de par@init
+.if !rLT .nr LT \\n[LL]
+.if !rFL .nr FL \\n[LL]*5/6
+.if !rVS .nr VS \\n[PS]+2
+.if !rDI .nr DI .5i
+.if !rFPS .nr FPS \\n[PS]-2
+.if !rFVS .nr FVS \\n[FPS]+2
+.\" don't change environment 0
+.ev h
+.ps \\n[PS]
+.if !rQI .nr QI 5n
+.if !rPI .nr PI 5n
+.par*vs \\n[VS]
+.if !rPD .nr PD .3v>?\n(.V
+.if !rDD .nr DD .5v>?\n(.V
+.if !rFI .nr FI 2n
+.if !rFPD .nr FPD \\n[PD]/2
+.ev
+.if !dFAM .ds FAM \\n[.fam]
+.nr par*adj \\n[.j]
+.par*env-init
+.ev h
+.par*env-init
+.ev
+.ev fn
+.par*env-init
+.ev
+.ev k
+.par*env-init
+.ev
+.aln 0:MCLL pg@colw
+.aln 0:MCLT pg@colw
+.aln k:MCLL pg@colw
+.aln k:MCLT pg@colw
+.aln fn:PS FPS
+.aln fn:VS FVS
+.aln fn:LL FL
+.aln fn:LT FL
+.aln fn:PI FI
+.aln fn:PD FPD
+.aln fn:MCLL pg@fn-colw
+.aln fn:MCLT pg@fn-colw
+..
+.de par@reset-env
+.nr \\n[.ev]:il 0
+.nr \\n[.ev]:li 0
+.nr \\n[.ev]:ri 0
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.nr \\n[.ev]:pli 0
+.nr \\n[.ev]:pri 0
+.nr \\n[.ev]:ds-type 0
+..
+.\" par@reset
+.de par@reset
+.br
+.ce 0
+.rj 0
+.ul 0
+.fi
+.ie \\n[pg@ncols]>1 \{\
+. ll (u;\\n[\\n[.ev]:MCLL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
+. lt \\n[\\n[.ev]:MCLT]u
+.\}
+.el \{\
+. ll (u;\\n[\\n[.ev]:LL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
+. lt \\n[\\n[.ev]:LT]u
+.\}
+.in (u;\\n[\\n[.ev]:li]+\\n[\\n[.ev]:pli])
+.ft 1
+.fam \\*[FAM]
+.ps \\n[\\n[.ev]:PS]
+.par*vs \\n[\\n[.ev]:VS]
+.ls 1
+.TA
+.hy \\n[HY]
+..
+.de @RT
+.nr \\n[.ev]:pli 0
+.nr \\n[.ev]:pri 0
+.par@reset
+..
+.\" This can be redefined by the user.
+.de TA
+.ta T 5n
+..
+.de par*start
+.ds@auto-end
+.nr \\n[.ev]:pli \\$1
+.nr \\n[.ev]:pri \\$2
+.par@reset
+.sp \\n[\\n[.ev]:PD]u
+.ne 1v+\\n(.Vu
+..
+.de par@finish
+.nr \\n[.ev]:pli 0
+.nr \\n[.ev]:pri 0
+.par@reset
+..
+.\" normal LP
+.de @LP
+.par*start 0 0
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+..
+.de @PP
+.par*start 0 0
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.if !'\*(.T'html' .ti +\\n[\\n[.ev]:ai]u
+..
+.de @QP
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.par*start \\n[QI] \\n[QI]
+..
+.de @XP
+.par*start \\n[\\n[.ev]:PI] 0
+.ti -\\n[\\n[.ev]:PI]u
+..
+.de @IP
+.if \\n[.$]>1 .nr \\n[.ev]:ai (n;\\$2)
+.par*start \\n[\\n[.ev]:ai] 0
+.if !'\\$1'' \{\
+. \" Divert the label so as to freeze any spaces.
+. di par*label
+. par*push-tag-env
+\&\\$1
+. par*pop-tag-env
+. di
+. chop par*label
+. ie '\*(.T'html' \{\
+. if \\n[dl]+1n<=\\n[\\n[.ev]:ai] .HTML-TAG ".ip"
+. ti 0
+\&\\$1
+. br
+. \}
+. el \{\
+. ti -\\n[\\n[.ev]:ai]u
+. ie \\n[dl]+1n<=\\n[\\n[.ev]:ai] \\*[par*label]\h'|\\n[\\n[.ev]:ai]u'\c
+. el \{\
+\\*[par*label]
+. br
+. \}
+. \}
+. rm par*label
+.\}
+..
+.\" We don't want margin characters to be attached when we divert
+.\" the tag. Since there's no way to save and restore the current
+.\" margin character, we have to switch to a new environment, taking
+.\" what we need of the old environment with us.
+.de par*push-tag-env
+.nr par*saved-font \\n[.f]
+.nr par*saved-size \\n[.s]z
+.nr par*saved-ss \\n[.ss]
+.ds par*saved-fam \\n[.fam]
+.ev par
+.nf
+.TA
+.ft \\n[par*saved-font]
+.ps \\n[par*saved-size]u
+.ss \\n[par*saved-ss]
+.fam \\*[par*saved-fam]
+..
+.de par*pop-tag-env
+.ev
+..
+.de @RS
+.br
+.nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
+.nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
+.nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
+.nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
+.nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
+.nr \\n[.ev]:il +1
+.nr \\n[.ev]:li +\\n[\\n[.ev]:ai]
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.par@reset
+..
+.de @RE
+.br
+.ie \\n[\\n[.ev]:il] \{\
+. nr \\n[.ev]:il -1
+. nr \\n[.ev]:ai \\n[\\n[.ev]:ai!\\n[\\n[.ev]:il]]
+. nr \\n[.ev]:li \\n[\\n[.ev]:li!\\n[\\n[.ev]:il]]
+. nr \\n[.ev]:ri \\n[\\n[.ev]:ri!\\n[\\n[.ev]:il]]
+. nr \\n[.ev]:pli \\n[\\n[.ev]:pli!\\n[\\n[.ev]:il]]
+. nr \\n[.ev]:pri \\n[\\n[.ev]:pri!\\n[\\n[.ev]:il]]
+.\}
+.el .@error unbalanced \\$0
+.par@reset
+..
+.de @QS
+.br
+.nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
+.nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
+.nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
+.nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
+.nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
+.nr \\n[.ev]:il +1
+.nr \\n[.ev]:li +\\n[QI]
+.nr \\n[.ev]:ri +\\n[QI]
+.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
+.par@reset
+..
+.als @QE @RE
+.\" start boxed text
+.de B1
+.br
+.HTML-IMAGE
+.di par*box-div
+.nr \\n[.ev]:li +1n
+.nr \\n[.ev]:ri +1n
+.nr par*box-in \\n[.in]
+.\" remember what 1n is, just in case the point size changes
+.nr par*box-n 1n
+.in +1n
+.ll -1n
+.lt -1n
+.ti \\n[par*box-in]u+1n
+..
+.de @div-end!par*box-div
+.B2
+..
+.\" end boxed text
+.\" Postpone the drawing of the box until we're in the top-level diversion,
+.\" in case there's a footnote inside the box.
+.de B2
+.ie '\\n(.z'par*box-div' \{\
+. br
+. if \n[.V]>.25m .sp
+. di
+. if \n[.V]>.25m .sp
+. ds@need \\n[dn]
+. par*box-mark-top
+. ev nf
+. par*box-div
+. ev
+. nr \\n[.ev]:ri -\\n[par*box-n]
+. nr \\n[.ev]:li -\\n[par*box-n]
+. in -\\n[par*box-n]u
+. ll +\\n[par*box-n]u
+. lt +\\n[par*box-n]u
+. par*box-draw \\n[.i]u \\n[.l]u-(\\n[.H]u==1n*1n)
+.\}
+.el .@error B2 without B1
+.HTML-IMAGE-END
+..
+.de par*box-mark-top
+.ie '\\n[.z]'' \{\
+. rs
+. mk par*box-top
+.\}
+.el \!.par*box-mark-top
+..
+.de par*box-draw
+.ie '\\n[.z]'' \{\
+. nr par*box-in \\n[.i]
+. nr par*box-ll \\n[.l]
+. nr par*box-vpt \\n[.vpt]
+. nr par*box-ad \\n[.j]
+. ad l
+. vpt 0
+. in \\$1
+. ll \\$2
+\v'-1v+.25m'\
+\D'l (u;\\n[.l]-\\n[.i]) 0'\
+\D'l 0 |\\n[par*box-top]u'\
+\D'l -(u;\\n[.l]-\\n[.i]) 0'\
+\D'l 0 -|\\n[par*box-top]u'
+. br
+. sp -1
+. in \\n[par*box-in]u
+. ll \\n[par*box-ll]u
+. vpt \\n[par*box-vpt]
+. ad \\n[par*box-ad]
+.\}
+.el \!.par*box-draw \\$1 \\$2
+..
+.de @SH
+.par@finish
+.\" Keep together the heading and the first two lines of the next paragraph.
+.ne 3v+\\n[\\n[.ev]:PD]u+\\n(.Vu
+.sp 1
+.ft B
+.HTML-TAG ".SH 1"
+..
+.\" TL, AU, and AI are aliased to these in cov*ab-init.
+.de par@TL
+.par@finish
+.sp 1
+.ft B
+.ps +2
+.vs +3p
+.ce 9999
+.HTML-TAG ".tl"
+..
+.de par@AU
+.par@finish
+.sp 1
+.ft I
+.ce 9999
+..
+.de par@AI
+.par@finish
+.sp .5
+.ce 9999
+..
+.\" In paragraph macros.
+.de NL
+.ps \\n[\\n[.ev]:PS]
+..
+.de SM
+.ps -2
+..
+.de LG
+.ps +2
+..
+.de R
+.ft R
+..
+.\" par*define-font-macro macro font
+.de par*define-font-macro
+.de \\$1
+.ie \\\\n[.$] \{\
+. nr par*prev-font \\\\n[.f]
+\&\\\\$3\f[\\$2]\\\\$1\f[\\\\n[par*prev-font]]\\\\$2
+.\}
+.el .ft \\$2
+\\..
+..
+.par*define-font-macro B B
+.par*define-font-macro I I
+.par*define-font-macro BI BI
+.par*define-font-macro CW CR
+.\" underline a word
+.de UL
+\Z'\\$1'\v'.25m'\D'l \w'\\$1'u 0'\v'-.25m'\\$2
+..
+.\" box a word
+.de BX
+.nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\\$1'\
+\h'\\n[par*bxw]u'
+..
+.\" The first time UX is used, put a registered mark after it.
+.ds par*ux-rg \(rg
+.de UX
+\s[\\n[.s]*8u/10u]UNIX\s0\\$1\\*[par*ux-rg]
+.ds par*ux-rg
+..
+.ds par@sup-start \v'-.9m\s'\En[.s]*7u/10u'+.7m'
+.als { par@sup-start
+.ds par@sup-end \v'-.7m\s0+.9m'
+.als } par@sup-end
+.\" footnote paragraphs
+.\" FF is the footnote format
+.nr FF 0
+.\" This can be redefined. It gets a second argument of `no' if the first
+.\" argument was supplied by the user, rather than automatically.
+.de FP
+.br
+.if !d par*fp!\\n[FF] \{\
+. @error unknown footnote format `\\n[FF]'
+. nr FF 0
+.\}
+.ie '\\$2'no' .par*fp!\\n[FF]-no "\\$1"
+.el .par*fp!\\n[FF] "\\$1"
+..
+.de par*fp!0
+.@PP
+\&\\*[par@sup-start]\\$1\\*[par@sup-end]\ \c
+..
+.de par*fp!0-no
+.@PP
+\&\\$1\ \c
+..
+.de par*fp!1
+.@PP
+\&\\$1.\ \c
+..
+.de par*fp!1-no
+.@PP
+\&\\$1\ \c
+..
+.de par*fp!2
+.@LP
+\&\\$1.\ \c
+..
+.de par*fp!2-no
+.@LP
+\&\\$1\ \c
+..
+.de par*fp!3
+.@IP "\\$1." (u;\\n[\\n[.ev]:PI]*2)
+..
+.de par*fp!3-no
+.@IP "\\$1" (u;\\n[\\n[.ev]:PI]*2)
+..
+.\" ***************************
+.\" ******** module nh ********
+.\" ***************************
+.\" Numbered headings.
+.\" nh*hl is the level of the last heading
+.nr nh*hl 0
+.\" numbered heading
+.de @NH
+.HTML-TAG ".NH \\$1"
+.ie '\\$1'S' \{\
+. shift
+. nr nh*hl 0
+. while \\n[.$] \{\
+. nr nh*hl +1
+. nr H\\n[nh*hl] 0\\$1
+. shift
+. \}
+. if !\\n[nh*hl] \{\
+. nr H1 1
+. nr nh*hl 1
+. @error missing arguments to .NH S
+. \}
+.\}
+.el \{\
+. nr nh*ohl \\n[nh*hl]
+. ie \\n[.$] \{\
+. nr nh*hl 0\\$1
+. ie \\n[nh*hl]<=0 \{\
+. nr nh*ohl 0
+. nr nh*hl 1
+. \}
+. el \{\
+. if \\n[nh*hl]-\\n[nh*ohl]>1 \
+. @warning .NH \\n[nh*ohl] followed by .NH \\n[nh*hl]
+. \}
+. \}
+. el .nr nh*hl 1
+. while \\n[nh*hl]>\\n[nh*ohl] \{\
+. nr nh*ohl +1
+. nr H\\n[nh*ohl] 0
+. \}
+. nr H\\n[nh*hl] +1
+.\}
+.ds SN
+.nr nh*i 0
+.while \\n[nh*i]<\\n[nh*hl] \{\
+. nr nh*i +1
+. as SN \\n[H\\n[nh*i]].
+.\}
+.SH
+\\*[SN]
+..
+.\" ****************************
+.\" ******** module toc ********
+.\" ****************************
+.\" Table of contents generation.
+.de @XS
+.da toc*div
+.ev h
+.ie \\n[.$] .XA "\\$1"
+.el .XA
+..
+.de @div-end!toc*div
+.XE
+..
+.de XA
+.ie '\\n(.z'toc*div' \{\
+. if d toc*num .toc*end-entry
+. ie \\n[.$] \{\
+. ie '\\$1'no' .ds toc*num
+. el .ds toc*num "\\$1
+. \}
+. el .ds toc*num \\n[PN]
+. br
+. par@reset
+. na
+. ll -8n
+. in (n;0\\$2)
+.\}
+.el .@error XA without XS
+..
+.de XE
+.ie '\\n(.z'toc*div' \{\
+. if d toc*num .toc*end-entry
+. ev
+. di
+.\}
+.el .@error XS without XE
+..
+.de toc*end-entry
+\\a\\t\\*[toc*num]
+.br
+.rm toc*num
+..
+.de PX
+.1C
+.if !'\\$1'no' \{\
+. ce 1
+. ps \\n[PS]+2
+. ft B
+\\*[TOC]
+. ft
+. ps
+.\}
+.nf
+.char \[toc*leader-char] .\h'1m'
+.lc \[toc*leader-char]
+.ta (u;\\n[.l]-\\n[.i]-\w'000') (u;\\n[.l]-\\n[.i])R
+.sp 2
+.toc*div
+.par@reset
+..
+.\" print the table of contents on page i
+.de TC
+.P1
+.pg@begin 1 i
+.PX \\$1
+..
+.\" ****************************
+.\" ******** module eqn ********
+.\" ****************************
+.\" Eqn support.
+.de EQ
+..
+.de EN
+..
+.de @EQ
+.br
+.ds eqn*num "\\$2
+.ie '\\$1'L' .nr eqn*type 0
+.el \{\
+. ie '\\$1'I' .nr eqn*type 1
+. el \{\
+. nr eqn*type 2
+. if !'\\$1'C' .ds eqn*num "\\$1
+. \}
+.\}
+.di eqn*div
+.in 0
+.nf
+..
+.de @div-end!eqn*div
+.@EN
+..
+.\" Note that geqn mark and lineup work correctly in centered equations.
+.de @EN
+.ie !'\\n(.z'eqn*div' .@error-recover mismatched EN
+.el \{\
+. br
+. di
+. nr eqn*have-num 0
+. if !'\\*[eqn*num]'' .nr eqn*have-num 1
+. if \\n[dl]:\\n[eqn*have-num] \{\
+. sp \\n[DD]u
+. par@reset
+. ds eqn*tabs \\n[.tabs]
+. nf
+. ie \\n[dl] \{\
+. ds@need \\n[dn]u-1v+\n[.V]u
+. chop eqn*div
+. ie \\n[eqn*type]=0 \{\
+. ta (u;\\n[.l]-\\n[.i])R
+\\*[eqn*div]\t\\*[eqn*num]
+. \}
+. el \{\
+. ie \\n[eqn*type]=1 .ta \\n[DI]u \
+(u;\\n[.l]-\\n[.i])R
+. el .ta (u;\\n[.l]-\\n[.i]/2)C \
+(u;\\n[.l]-\\n[.i])R
+\t\\*[eqn*div]\t\\*[eqn*num]
+. \}
+. \}
+. el \{\
+. ta (u;\\n[.l]-\\n[.i])R
+\t\\*[eqn*num]
+. \}
+. sp \\n[DD]u
+. ta \\*[eqn*tabs]
+. \}
+. fi
+.\}
+..
+.\" ****************************
+.\" ******** module tbl ********
+.\" ****************************
+.\" Tbl support.
+.nr tbl*have-header 0
+.\" This gets called if TS occurs before the first paragraph.
+.de TS
+.LP
+.\" cov*ab-init aliases TS to @TS
+\\*[TS]\\
+..
+.de @TS
+.sp \\n[DD]u
+.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*print-header
+.ev nf
+.tbl*header-div
+.ev
+.mk #T
+..
+.de TH
+.ie '\\n[.z]'tbl*header-div' \{\
+. nr T. 0
+. T#
+. br
+. di
+. ie \\n[dn]+\\n[FM]+\\n[HM]+2v>=\\n[.p] \{\
+. @error ridiculously long table header
+. ds@need \\n[dn]
+. tbl*print-header
+. \}
+. el \{\
+. nr tbl*header-ht \\n[dn]
+. ds@need \\n[dn]u+1v
+. tbl*print-header
+. nr tbl*have-header 1
+. \}
+.\}
+.el .@error-recover .TH without .TS H
+..
+.de @div-end!tbl*header-div
+.TH
+.TE
+..
+.de TE
+.ie '\\n(.z'tbl*header-div' .@error-recover .TS H but no .TH before .TE
+.el \{\
+. nr tbl*have-header 0
+. sp \\n[DD]u
+.\}
+.\" reset tabs
+.TA
+..
+.de tbl@bottom-hook
+.if \\n[tbl*have-header] \{\
+. nr T. 1
+. T#
+.\}
+..
+.de T&
+..
+.\" ****************************
+.\" ******** module pic ********
+.\" ****************************
+.\" Pic support.
+.\" PS height width
+.de PS
+.br
+.sp \\n[DD]u
+.ie \\n[.$]<2 .@error bad arguments to PS (not preprocessed with pic?)
+.el \{\
+. ds@need (u;\\$1)+1v
+. in +(u;\\n[.l]-\\n[.i]-\\$2/2>?0)
+.\}
+..
+.de PE
+.par@reset
+.sp \\n[DD]u+.5m
+..
+.\" ****************************
+.\" ******** module ref ********
+.\" ****************************
+.\" Refer support.
+.de ]-
+.rm [A [B [C [D [E [G [I [J [N [O [P [Q [R [S [T [V
+.rm ref*string
+..
+.\" Other
+.ds ref*spec!0 Q A T1 S V N P I C D O
+.\" Journal article
+.ds ref*spec!1 Q A T2 J S V N P I C D O
+.\" Book
+.ds ref*spec!2 Q A T1 S V P I C D O
+.\" Article within book
+.ds ref*spec!3 Q A T2 B E S V P I C D O
+.\" Tech report
+.ds ref*spec!4 Q A T2 R G P I C D O
+.\" ][ type
+.de ][
+.if r [T \{\
+. als [T1 [T
+. als [T2 [T
+.\}
+.ie d ref*spec!\\$1 .ref*build \\*[ref*spec!\\$1]
+.el \{\
+. @error unknown reference type `\\$1'
+. ref*build \\*[ref*spec!0]
+.\}
+.ref*print
+.rm ref*string
+.rm [F [T1 [T2
+..
+.\" start of reference number
+.ds [. \\*[par@sup-start]
+.\" end of reference number
+.ds .] \\*[par@sup-end]
+.\" period before reference
+.ds <. .
+.\" period after reference
+.ds >. \" empty
+.\" comma before reference
+.ds <, ,
+.\" comma after reference
+.ds >, \" empty
+.\" start collected references
+.de ]<
+.als ref*print ref*end-print
+.SH
+\&\\*[REFERENCES]
+.par@reset
+..
+.\" end collected references
+.de ]>
+.par@finish
+.als ref*print ref*normal-print
+..
+.de ref*normal-print
+.ie d [F .FS "\\*([.\\*([F\\*(.]"
+.el .FS \&
+\\*[ref*string]
+.FE
+..
+.de ref*end-print
+.ie d [F .IP "\\*([F."
+.el .XP
+\\*[ref*string]
+..
+.als ref*print ref*normal-print
+.de ref*build
+.rm ref*string ref*post-punct
+.nr ref*suppress-period 1
+.while \\n[.$] \{\
+. if d [\\$1 \{\
+. ie d ref*add-\\$1 .ref*add-\\$1
+. el .ref*add-dflt \\$1
+. \}
+. shift
+.\}
+.\" now add a final period
+.ie d ref*string \{\
+. if !\\n[ref*suppress-period] .as ref*string .
+. if d ref*post-punct \{\
+. as ref*string "\\*[ref*post-punct]
+. rm ref*post-punct
+. \}
+.\}
+.el .ds ref*string
+..
+.de ref*add-T1
+.ref*field T , "\fI" "" "\fP"
+.if r [T .nr ref*suppress-period \\n([T
+..
+.de ref*add-T2
+.ref*field T , "\\*Q" "" "\\*U"
+.if r [T .nr ref*suppress-period \\n([T
+..
+.de ref*add-P
+.ie \\n([P>0 .ref*field P , "pp. "
+.el .ref*field P , "p. "
+..
+.de ref*add-J
+.ref*field J , \fI "" \fP
+..
+.de ref*add-D
+.ref*field D "" ( )
+..
+.de ref*add-E
+.ref*field E , "ed. "
+..
+.de ref*add-G
+.ref*field G "" ( )
+..
+.de ref*add-B
+.ref*field B "" "in \fI" "" \fP
+..
+.de ref*add-O
+.ref*field O .
+.ie r [O .nr ref*suppress-period \\n([O
+.el .nr ref*suppress-period 1
+..
+.de ref*add-A
+.ref*field A ,
+.if r [A .nr ref*suppress-period \\n([A
+..
+.de ref*add-dflt
+.ref*field \\$1 ,
+..
+.\" First argument is the field letter.
+.\" Second argument is the punctuation character to use to separate this field
+.\" from the previous field.
+.\" Third argument is a string with which to prefix this field.
+.\" Fourth argument is a string with which to postfix this field.
+.\" Fifth argument is a string to add after the punctuation character supplied
+.\" by the next field.
+.de ref*field
+.if d ref*string \{\
+. ie d ref*post-punct \{\
+. as ref*string "\\$2\\*[ref*post-punct] \"
+. rm ref*post-punct
+. \}
+. el .as ref*string "\\$2 \"
+.\}
+.as ref*string "\\$3\\*([\\$1\\$4
+.if \\n[.$]>4 .ds ref*post-punct "\\$5
+.nr ref*suppress-period 0
+..
+.\" ****************************
+.\" ******** module acc ********
+.\" ****************************
+.\" Accents and special characters.
+.ds Q \(lq
+.ds U \(rq
+.ds - \(em
+.\" Characters
+.\" The idea of this definition is for the top of the 3 to be at the x-height.
+.if !c\[yogh] .char \[yogh] \Z'\v'\w'x'*0-\En[rst]u'\s[\En[.s]*8u/10u]\
+\v'\w'3'*0+\En[rst]u'3\s0'\h'\w'\s[\En[.s]*8u/10u]3'u'
+.\" Accents
+.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'
+..
+.de acc*slash-def
+.ds \\$1 \Z'\h'(u;-\En[.w]-\w'\\$2'/2)'\
+\v'(u;\En[.cdp]-\En[.cht]+\En[rst]+\En[rsb]/2)'\\$2'
+..
+.de acc*prefix-def
+.ds \\$1 \Z'\h'(u;\w'x'-\w'\\$2'/2)'\\$2'
+..
+.acc*prefix-def ' \'
+.acc*prefix-def ` \`
+.acc*prefix-def ^ ^
+.acc*prefix-def , \(ac
+.acc*prefix-def : \(ad
+.acc*prefix-def ~ ~
+.\" improved accent marks
+.de AM
+.acc*over-def ' \'
+.acc*over-def ` \`
+.acc*over-def ^ ^
+.acc*over-def ~ ~
+.acc*over-def : \(ad
+.acc*over-def v \(ah
+.acc*over-def _ \(a-
+.acc*over-def o \(ao
+.acc*under-def , \(ac
+.acc*under-def . \s[\En[.s]*8u/10u]\v'.2m'.\v'-.2m'\s0
+.acc*under-def hook \(ho
+.acc*slash-def / /
+.char \[hooko] o\\\\*[hook]
+.ds q \[hooko]
+.ds 3 \[yogh]
+.ds D- \(-D\" Icelandic uppercase eth
+.ds d- \(Sd\" Icelandic lowercase eth
+.ds Th \(TP\" Icelandic uppercase thorn
+.ds th \(Tp\" Icelandic lowercase thorn
+.ds 8 \(ss\" German double s
+.ds Ae \(AE\" AE ligature
+.ds ae \(ae\" ae ligature
+.ds Oe \(OE\" OE ligature
+.ds oe \(oe\" oe ligature
+.ds ? \(r?\" upside down ?
+.ds ! \(r!\" upside down !
+..
+.de CHECK-FOOTER-AND-KEEP
+.\" it might be better to als FS -> B1 and FE -> B2
+.\" however this produced wierd results, so I've moved back to a more reliable
+.\" but less interesting solution --fixme--
+. if '\*(.T'html' \{\
+. rm KF
+. als KF KS
+. rm FS
+. de FS
+. br
+. HTML-IMAGE
+\\..
+. rm FE
+. de FE
+. br
+. HTML-IMAGE-END
+\\..
+. \}
+. if r ps4html \{\
+. rm FS
+. de FS
+. br
+. HTML-IMAGE
+\\..
+. rm FE
+. de FE
+. br
+. HTML-IMAGE-END
+\\..
+. \}
+..
+.par@load-init
+.\" Make sure that no blank lines creep in at the end of this file.
diff --git a/contrib/groff/tmac/safer.tmac b/contrib/groff/tmac/safer.tmac
new file mode 100644
index 0000000..1e7d03d
--- /dev/null
+++ b/contrib/groff/tmac/safer.tmac
@@ -0,0 +1,5 @@
+.\" This file is no longer needed; it has been replaced with a built-in
+.\" solution.
+.\"
+.\" It just exists for compatibility reasons with older man programs
+.\" which explicitly load this file.
diff --git a/contrib/groff/tmac/strip.sed b/contrib/groff/tmac/strip.sed
index b309e86..069c3db 100644
--- a/contrib/groff/tmac/strip.sed
+++ b/contrib/groff/tmac/strip.sed
@@ -1,2 +1,10 @@
-/%beginstrip%/,$s/[ ]*\\".*//
+# strip comments, spaces, etc. after a line containing `%beginstrip%'
+/%beginstrip%/,$ {
+ s/^\.[ ]*/./
+ s/^\.\\".*/./
+ s/\\".*/\\"/
+ /\(.[ad]s\)/!s/[ ]*\\"//
+ /\(.[ad]s\)/s/\([^ ]*\)\\"/\1/
+ s/\([^/]\)doc-/\1/g
+}
/^\.$/d
diff --git a/contrib/groff/tmac/trace.tmac b/contrib/groff/tmac/trace.tmac
new file mode 100644
index 0000000..143f954
--- /dev/null
+++ b/contrib/groff/tmac/trace.tmac
@@ -0,0 +1,29 @@
+.\" trace.tmac
+.\"
+.\" Load this before a macro package that you want to trace.
+.
+.eo
+.
+.rn de !!de
+.
+.!!de de
+. ecs
+. ec
+. !!de \$1
+. ie "\$1"\\$0" .tm *** trace enter: \\$0 \\$@
+. el .tm *** trace enter \$1: \\$0 \\$@
+. nop \\*[!!\$1]\\
+. ie "\$1"\\$0" .tm *** trace exit: \\$0 \\$@
+. el .tm *** trace exit \$1: \\$0 \\$@
+\..
+.
+. ds !!d1 !!\$1
+. ds !!d2 \$2
+.
+. ecr
+. dei !!d1 !!d2
+..
+.
+.ec
+.
+.\" EOF
diff --git a/contrib/groff/tmac/troffrc b/contrib/groff/tmac/troffrc
index e61319d..c4cfa20 100644
--- a/contrib/groff/tmac/troffrc
+++ b/contrib/groff/tmac/troffrc
@@ -3,20 +3,20 @@
.nr 0p 0
.\" Use .do here, so that it works with -C.
.\" The groff command defines the .X string if the -X option was given.
-.ie r.X .do ds troffrc!ps tmac.Xps
-.el .do ds troffrc!ps tmac.ps
-.do ds troffrc!dvi tmac.dvi
-.do ds troffrc!X75 tmac.X
-.do ds troffrc!X75-12 tmac.X
-.do ds troffrc!X100 tmac.X
-.do ds troffrc!X100-12 tmac.X
-.do ds troffrc!ascii tmac.tty
-.do ds troffrc!latin1 tmac.tty
-.do ds troffrc!utf8 tmac.tty
-.do ds troffrc!cp1047 tmac.tty
-.do ds troffrc!lj4 tmac.lj4
-.do ds troffrc!lbp tmac.lbp
-.do ds troffrc!html tmac.arkup
+.ie r.X .do ds troffrc!ps Xps.tmac
+.el .do ds troffrc!ps ps.tmac
+.do ds troffrc!dvi dvi.tmac
+.do ds troffrc!X75 X.tmac
+.do ds troffrc!X75-12 X.tmac
+.do ds troffrc!X100 X.tmac
+.do ds troffrc!X100-12 X.tmac
+.do ds troffrc!ascii tty.tmac
+.do ds troffrc!latin1 tty.tmac
+.do ds troffrc!utf8 tty.tmac
+.do ds troffrc!cp1047 tty.tmac
+.do ds troffrc!lj4 lj4.tmac
+.do ds troffrc!lbp lbp.tmac
+.do ds troffrc!html www.tmac
.do if d troffrc!\*[.T] \
. do mso \*[troffrc!\*[.T]]
.do rm troffrc!ps troffrc!Xps troffrc!dvi troffrc!X75 troffrc!X75-12 \
diff --git a/contrib/groff/tmac/troffrc-end b/contrib/groff/tmac/troffrc-end
index edd23e4..631f6b0 100644
--- a/contrib/groff/tmac/troffrc-end
+++ b/contrib/groff/tmac/troffrc-end
@@ -2,5 +2,18 @@
.\" final startup file for troff
.\" this file is parsed after all macro sets have been read
.\"
-.if '\*(.T'html' .mso tmac.html
-.\" Don't let blank lines creep in here. \ No newline at end of file
+.do if '\*(.T'html' .mso html.tmac
+.\" if we are running the postscript device for html images then load -mwww
+.\"
+.do if r ps4html .mso www.tmac
+.\"
+.\" for all other devices blank out these macros
+.\"
+.do if !d HTML-IMAGE-INLINE .ds HTML-IMAGE-INLINE
+.do if !d HTML-IMAGE .ds HTML-IMAGE
+.do if !d HTML-IMAGE-RIGHT .ds HTML-IMAGE-RIGHT
+.do if !d HTML-IMAGE-LEFT .ds HTML-IMAGE-LEFT
+.do if !d HTML-IMAGE-END .ds HTML-IMAGE-END
+.do if !d HTML-TAG .ds HTML-TAG
+.do if !d HTML-DO-IMAGE .ds HTML-DO-IMAGE
+.\" Don't let blank lines creep in here.
diff --git a/contrib/groff/tmac/tty-char.tmac b/contrib/groff/tmac/tty-char.tmac
new file mode 100644
index 0000000..02a1071
--- /dev/null
+++ b/contrib/groff/tmac/tty-char.tmac
@@ -0,0 +1,204 @@
+.\" tty-char.tmac
+.\"
+.\" This file defines standard troff characters and some groff characters for
+.\" use with -Tascii, -Tlatin1, -Tutf8, and -Tcp1047.
+.\"
+.\" These definitions are chosen so that, as far as possible, they:
+.\" - work with all of -Tascii, -Tlatin1, -Tutf8, and -Tcp1047.
+.\" - work on devices that display only the last overstruck character
+.\" as well as on devices that support overstriking
+.\" - represent the character's graphical shape (not its meaning)
+.\"
+.nr _C \n(.C
+.cp 0
+.de tty-char
+.if !c\\$1 .char \\$1 "\\$2
+..
+.ie c\(a- .ds tty-rn \(a-
+.el .ds tty-rn \v'-1m'_\v'+1m'
+.tty-char \(tm tm
+.tty-char \(rn \*[tty-rn]
+.tty-char \(ua \z|^
+.tty-char \(da \z|v
+.tty-char \(sc S
+.tty-char \(ct \z/c
+.tty-char \(dg \z|-
+.tty-char \(dd \z|=
+.tty-char \(ib (\z=_
+.tty-char \(ip \z=_)
+.tty-char \(sb (=
+.tty-char \(sp =)
+.tty-char \(if oo
+.tty-char \(pt oc
+.tty-char \(es {}
+.tty-char \(ca (^)
+.tty-char \(cu U
+.tty-char \(de o
+.tty-char \(di -:-
+.tty-char \(no ~
+.tty-char \(gr \Z'\*[tty-rn]'V
+.tty-char \(is \z'\z,I
+.tty-char \(mo E
+.tty-char \(pd a
+.tty-char \(sr \e/
+.tty-char \(*C \z_H
+.tty-char \(*D \z_/\z_\e
+.tty-char \(*F \zIO
+.tty-char \(*G |\*[tty-rn]
+.tty-char \(*H \z-O
+.tty-char \(*L /\e
+.tty-char \(*P TT
+.tty-char \(*Q \zIY
+.tty-char \(*S \z_\Z'\*[tty-rn]'>
+.tty-char \(*W \z_O
+.if c\(ss .tty-char \(*b \(ss
+.tty-char \(*b B
+.tty-char \(*a a
+.tty-char \(*c \z,E
+.tty-char \(*d d
+.tty-char \(*e e
+.tty-char \(*f \z|o
+.tty-char \(+f \z|o
+.tty-char \(*g y
+.tty-char \(*h \z-0
+.tty-char \(+h \z-0
+.tty-char \(*i i
+.tty-char \(*k k
+.tty-char \(*l \z>\e
+.tty-char \(*m \z,u
+.tty-char \(*n v
+.tty-char \(*p \z-n
+.tty-char \(+p \z-w
+.tty-char \(*q \z|u
+.tty-char \(*r p
+.tty-char \(*s \z-o
+.tty-char \(*t \z~t
+.tty-char \(*u u
+.tty-char \(*w w
+.tty-char \(*x x
+.tty-char \(*y n
+.tty-char \(*z \z,C
+.tty-char \(ts s
+.\" Definition of \(ss should follow that of \(*b.
+.tty-char \(ss B
+.tty-char \(c* \zO\(mu
+.tty-char \(c+ \zO+
+.tty-char \(AN ^
+.tty-char \(OR v
+.tty-char \(uA \z=^
+.tty-char \(dA \z=v
+.if c\(md .tty-char \(pc \(md
+.if c\(pc .tty-char \(md \(pc
+.if c\(pc .tty-char \(a. \(pc
+.tty-char \(Im I
+.tty-char \(Re R
+.tty-char \(/L \z/L
+.tty-char \(/l \z/l
+.tty-char \(%0 %o
+.tty-char \(ao o
+.tty-char \(a" """"
+.tty-char \(ab \z'`
+.tty-char \(ah v
+.tty-char \(ho \(ac
+.tty-char \(/_ \z_/
+.tty-char \(=~ =~
+.tty-char \(Ah N
+.tty-char \(CR _|
+.tty-char \(fa \z-V
+.tty-char \(nm \z/E
+.tty-char \(pp \z_|
+.tty-char \(sd ''
+.tty-char \(st -)
+.tty-char \(te 3
+.if c\(md .tty-char \(tf .\(md.
+.tty-char \(tf .:.
+.tty-char \(wp p
+.tty-char \(~~ ~~
+.tty-char \(Fn \z,f
+.tty-char \(Bq ,,
+.tty-char \(bq ,
+.tty-char \(lz <>
+.\" Latin-1 characters
+.tty-char \(r! \z,i
+.tty-char \(Po \z-L
+.tty-char \(Cs \zox
+.tty-char \(Ye \z=Y
+.tty-char \(bb |
+.tty-char \(ad """"
+.tty-char \(Of \z_a
+.tty-char \(Fo <<
+.tty-char \(a- \*[tty-rn]
+.tty-char \(S2 2
+.tty-char \(S3 3
+.tty-char \(ps 9|
+.tty-char \(md .
+.tty-char \(pc .
+.tty-char \(ac ,
+.tty-char \(S1 1
+.tty-char \(Om \z_o
+.tty-char \(Fc >>
+.tty-char \(r? \z'c
+.tty-char \(`A \z`A
+.tty-char \('A \z'A
+.tty-char \(^A \z^A
+.tty-char \(~A \z~A
+.tty-char \(:A \z"A
+.tty-char \(oA \zoA
+.tty-char \(,C \z,C
+.tty-char \(`E \z`E
+.tty-char \('E \z'E
+.tty-char \(^E \z^E
+.tty-char \(:E \z"E
+.tty-char \(`I \z`I
+.tty-char \('I \z'I
+.tty-char \(^I \z^I
+.tty-char \(:I \z"I
+.tty-char \(-D \z-D
+.tty-char \(~N \z~N
+.tty-char \(`O \z`O
+.tty-char \('O \z'O
+.tty-char \(^O \z^O
+.tty-char \(~O \z~O
+.tty-char \(:O \z"O
+.tty-char \(/O \z/O
+.tty-char \(`U \z`U
+.tty-char \('U \z'U
+.tty-char \(^U \z^U
+.tty-char \(:U \z"U
+.tty-char \('Y \z'Y
+.tty-char \(TP \zIb
+.tty-char \(`a \z`a
+.tty-char \('a \z'a
+.tty-char \(^a \z^a
+.tty-char \(~a \z~a
+.tty-char \(:a \z"a
+.tty-char \(oa \zoa
+.tty-char \(,c \z,c
+.tty-char \(`e \z`e
+.tty-char \('e \z'e
+.tty-char \(^e \z^e
+.tty-char \(:e \z"e
+.tty-char \(`i \z`i
+.tty-char \('i \z'i
+.tty-char \(^i \z^i
+.tty-char \(:i \z"i
+.tty-char \(Sd \z`\z'o
+.tty-char \(~n \z~n
+.tty-char \(`o \z`o
+.tty-char \('o \z'o
+.tty-char \(^o \z^o
+.tty-char \(~o \z~o
+.tty-char \(:o \z"o
+.tty-char \(/o \z/o
+.tty-char \(`u \z`u
+.tty-char \('u \z'u
+.tty-char \(^u \z^u
+.tty-char \(:u \z"u
+.tty-char \('y \z'y
+.tty-char \(Tp \zpb
+.tty-char \(:y \z"y
+.\"tty-char \(:y \ij
+.tty-char \[arrowvertex] |
+.cp \n(_C
+.if !'\*(.T'cp1047' \
+. do mso latin1.tmac
diff --git a/contrib/groff/tmac/tty.tmac b/contrib/groff/tmac/tty.tmac
new file mode 100644
index 0000000..e680435
--- /dev/null
+++ b/contrib/groff/tmac/tty.tmac
@@ -0,0 +1,50 @@
+.\" tty.tmac
+.\"
+.nr _C \n(.C
+.cp 0
+.nroff
+.\" Don't warn about non-existent fonts.
+.warn \n[.warn]-(\n[.warn]/131072%2*131072)
+.po 0
+.if c\[shc] .shc \[shc]
+.de tty-char
+.if !c\\$1 .char \\$1 "\\$2
+..
+.ie c\(pc .tr \(bu\(pc
+.el .if c\(md .tr \(bu\(md
+.tty-char \(bu \z+o
+.tty-char \(14 1/4
+.tty-char \(12 1/2
+.tty-char \(34 3/4
+.tty-char \(ff ff
+.tty-char \(fi fi
+.tty-char \(fl fl
+.tty-char \(Fi ffi
+.tty-char \(Fl ffl
+.tty-char \(<- <-
+.tty-char \(-> ->
+.tty-char \(<> <->
+.tty-char \(em --
+.tty-char \(+- +-
+.tty-char \(co (C)
+.tty-char \(<= <=
+.tty-char \(>= >=
+.tty-char \(!= !=
+.tty-char \(== ==
+.tty-char \(~= ~=
+.tty-char \(sq []
+.tty-char \(lh <=
+.tty-char \(rh =>
+.tty-char \(lA <=
+.tty-char \(rA =>
+.tty-char \(hA <=>
+.tty-char \(rg (R)
+.tty-char \(OE OE
+.tty-char \(oe oe
+.tty-char \(AE AE
+.tty-char \(ae ae
+.tty-char \(an -
+.cp \n(_C
+.\" If you want the character definitions in tty-char.tmac to be loaded
+.\" automatically, remove the `\"' from the next line.
+.\"do mso tty-char.tmac
diff --git a/contrib/groff/tmac/www.tmac b/contrib/groff/tmac/www.tmac
new file mode 100644
index 0000000..8358c86
--- /dev/null
+++ b/contrib/groff/tmac/www.tmac
@@ -0,0 +1,211 @@
+.\" www.tmac
+.\"
+.\" A simple set of macros to provide HTML documents with basic
+.\" www functionality. It will work with any macro set.
+.\"
+.nr _C \n(.C
+.cp 0
+.nr www-html 0
+.if '\*(.T'html' .nr www-html 1
+.\"
+.\"
+.\"
+.de HTML
+. if \\n[www-html] \{\
+.\" the following line makes the vertical mode leave, so to say
+\&
+\X^html:\\$*^
+. \}
+..
+.de HTMLINDEX
+. if \\n[www-html] \X^index:\\$*^
+..
+.\"
+.\" BODYCOLOR - $1 is foreground color
+.\" $2 is background color
+.\" $3 is the color of an active hypertext link
+.\" $4 is the color of a hypertext link not yet visited
+.\" $5 is the color of a visited hypertext link
+.\"
+.de BODYCOLOR
+. HTML <body text=\\$1 bgcolor=\\$2 link=\\$3 alink=\\$4 vlink=\\$5>
+..
+.\"
+.\" BACKGROUND - $1 is the background image file
+.\"
+.de BACKGROUND
+. HTML <body background=\\$1>
+..
+.\"
+.\" URL - $1 is the classical underlined blue text
+.\" $2 is the url
+.\" $3 is optional stuff printed immediately after $3
+.\"
+.de URL
+. ie \\n[www-html] \{\
+. HTML <a href="\\$2">\\$1</a>\\$3
+. \}
+. el \{\
+\\$1 \(la\fC\\$2\fP\(ra\\$3
+. \}
+..
+.\"
+.\" FTP - $1 is the classical underlined blue text
+.\" $2 is the ftp url
+.\" $3 is optional stuff printed immediately after $2
+.de FTP
+. ie \\n[www-html] \{\
+. HTML <a href=\\$2>\\$1</a>\\$3
+. \}
+. el \{\
+\\$1 \(la\fC\\$2\fP\(ra\\$3
+. \}
+..
+.\"
+.\" MAILTO - generate html email reference
+.\" $1 is the email address (without the `mailto:' prefix)
+.\" $2 is the optional name
+.\" $3 is optional stuff printed immediately after $2 (resp. $1)
+.\"
+.\" example:
+.\"
+.\" Foobar has been written by
+.\" .MAILTO fred@foo.bar "Fredrick Bloggs" .
+.\"
+.de MAILTO
+.\"
+.\" force reset after a potential heading by performing some motion..
+.\" how do we do this --fixme--
+.\" \h'\w' ''\h'-\w' '' doesn't work..
+. ie \\n[www-html] \{\
+. ie '\\$2'' \{\
+. HTML "<a href=mailto:\\$1>\\$1</a>\\$3"
+. \}
+. el \{\
+. HTML "<a href=mailto:\\$1>\\$2</a>\\$3"
+. \}
+. \}
+. el \{\
+. ie '\\$2'' \{\
+\fC\\$1\fP\\$3
+. \}
+. el \{\
+\\$2 \(la\fC\\$1\fP\(ra\\$3
+. \}
+. \}
+..
+.\"
+.\" TAG - generate an html name $1
+.\"
+.de TAG
+. HTML <a name="\\$1"></a>
+..
+.\"
+.\" IMAGE - reference an image
+.\" $1 is the image file
+.\" $2 is the x width (default if absent 400 pixels)
+.\" $3 is the y width (default if absent is the x value)
+.\"
+.de IMAGE
+. ie \\n[www-html] \{\
+. nr HTMLWIDTH 400
+. if !'\\$2'' \{\
+. nr HTMLWIDTH \\$2
+. \}
+. nr HTMLHEIGHT \\n[HTMLWIDTH]
+. if !'\\$3'' \{\
+. nr HTMLHEIGHT \\$3
+. \}
+. HTML-TAG ".centered-image"
+. HTML <img src="\\$1" width=\\n[HTMLWIDTH] height=\\n[HTMLHEIGHT]>
+. \}
+. el \{\
+. B1
+\(la\fC\\$1\fP\(ra
+. B2
+. \}
+..
+.\" HTML-TAG - emit a tag for the new grohtml
+.de HTML-TAG
+. if \\n[www-html] \{\
+.\" the following line makes the vertical mode leave, so to say
+\&
+\X^html-tag:\\$*^
+. \}
+..
+.\" LINKS - emit the automatically collected links derived from section/numbered
+.\" headings at this position.
+.de LINKS
+. HTML-TAG ".links"
+..
+.\"
+.\" LINE - produce a horizontal line
+.\"
+.de LINE
+. ti 0
+. HTML <hr>
+..
+.\"
+.\" supplimentary macros used by other macro sets
+.\"
+.\" here are some tags specially for -Tps or -Thtml when invoked by pre-html
+.\" to generate png images from postscript.
+.\"
+.\" HTML-DO-IMAGE - tells troff to issue an image marker which can be
+.\" read back by pre-html
+.\"
+.de HTML-DO-IMAGE
+. if r ps4html .begin \{\
+. image \\$2 \\$1.png
+. bp
+. tl ''''
+\O0\O1
+. \}
+. if \\n[www-html] .begin \{
+. image \\$2 \\$1.png
+\O0
+. \}
+..
+.\"
+.\" HTML-IMAGE-END - terminates an image for html
+.\"
+.de HTML-IMAGE-END
+. if r ps4html \O2\O1\O4
+. if \\n[www-html] \O2\O1\O4
+..
+.nr png-no 0
+.\"
+.\" MAKE-UNIQUE-NAME - generates another unique name
+.\"
+.de MAKE-UNIQUE-NAME
+. nr png-no \\n[png-no]+1
+. ds HTML-UNIQUE-NAME \\n(.F-auto-\\n[png-no]
+..
+.\"
+.\" HTML-IMAGE - is the same name as a tag generated from eqn/tbl/pic.
+.\" Although the tags generated via the preprocessor
+.\" are given image names by pre-html and troff.
+.\" The macros below can only be invoked by *other macro sets*
+.\" not user troff input since the contents of macro sets are
+.\" not seen by pre-html.
+.\"
+.de HTML-IMAGE
+.\" generates a centered image
+. MAKE-UNIQUE-NAME
+. HTML-DO-IMAGE \\*[HTML-UNIQUE-NAME] c
+..
+.de HTML-IMAGE-RIGHT
+. MAKE-UNIQUE-NAME
+. HTML-DO-IMAGE \\*[HTML-UNIQUE-NAME] r
+..
+.de HTML-IMAGE-LEFT
+. MAKE-UNIQUE-NAME
+. HTML-DO-IMAGE \\*[HTML-UNIQUE-NAME] l
+..
+.de HTML-IMAGE-INLINE
+. MAKE-UNIQUE-NAME
+. HTML-DO-IMAGE \\*[HTML-UNIQUE-NAME] i
+..
+.nr HY 0
+.nh
+.cp \n(_C
OpenPOWER on IntegriCloud