summaryrefslogtreecommitdiffstats
path: root/man
diff options
context:
space:
mode:
Diffstat (limited to 'man')
-rw-r--r--man/groff.7.man8055
-rw-r--r--man/groff_char.7.man2282
-rw-r--r--man/groff_diff.7.man6188
-rw-r--r--man/groff_font.5.man1114
-rw-r--r--man/groff_out.5.man1963
-rw-r--r--man/groff_tmac.5.man1474
-rw-r--r--man/man.am46
-rw-r--r--man/roff.7.man2613
8 files changed, 23735 insertions, 0 deletions
diff --git a/man/groff.7.man b/man/groff.7.man
new file mode 100644
index 0000000..3d4cad1
--- /dev/null
+++ b/man/groff.7.man
@@ -0,0 +1,8055 @@
+'\" t
+.TH groff @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff \- GNU
+.I roff
+language reference
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2000-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, with no Front-Cover Texts,
+.\" and with no Back-Cover Texts.
+.\"
+.\" A copy of the Free Documentation License is included as a file
+.\" called FDL in the main directory of the groff source package.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Setup
+.\" ====================================================================
+.
+.\" Man pages should not define page-local macros. Most of these were
+.\" written long ago; someday we'll revise the page without them.
+.
+.\" ====================================================================
+.\" start a macro, escape sequence, or register definition
+.
+.de TPx
+. TP 10n
+..
+.\" ====================================================================
+.\" .Text anything ...
+.\"
+.\" All arguments are printed as text.
+.\"
+.de Text
+. nop \)\\$*
+..
+.
+.\" ========= characters =========
+.
+.de squoted_char
+. Text \[oq]\f[CB]\\$1\f[]\[cq]\\$2
+..
+.de dquoted_char
+. Text \[lq]\f[CB]\\$1\f[]\[rq]\\$2
+..
+.\" ========= requests =========
+.
+.\" synopsis of a request
+.de REQ
+. ie \\n[.$]=1 \{\
+. Text \f[CB]\\$1\f[]
+. \}
+. el \{\
+. Text \f[CB]\\$1\~\f[]\f[I]\\$2\f[]
+. \}
+..
+.
+.\" reference of a request
+.de request
+. ie (\\n[.$] < 2) \
+. B \\$*
+. el \
+. BR \\$*
+..
+.
+.\" ========= numeric elements =========
+.
+.\" number with a trailing unit
+.de scalednumber
+. Text \\$1\^\f[CB]\\$2\f[]\\$3\f[R]
+. ft P
+..
+.
+.\" representation of units within the text
+.de scaleindicator
+. Text \f[CB]\\$1\f[]\\$2\f[R]
+. ft P
+..
+.
+.\" representation of mathematical operators within the text
+.de operator
+. squoted_char \\$@
+..
+.
+.
+.\" ========= escape sequences =========
+.
+.\" ====================================================================
+.\" .ESC name [arg]
+.\"
+.\" Synopsis of an escape sequence, optionally with argument
+.\" Args : 1 or 2; 'name' obligatory, 'arg' optional
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary word
+.\" Result : prints \namearg, where 'name' is in CB, 'arg' in I
+.\"
+.de ESC
+. Text "\f[CB]\e\\$1\,\f[I]\\$2\/\fR"
+..
+.\" ====================================================================
+.\" .ESC[] name arg
+.\"
+.\" Synopsis for escape sequence with a bracketed long argument
+.\" Args : 2 obligatory
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary text
+.\" Result : prints \name[arg], where 'name' is in CB, 'arg' in I
+.\"
+.de ESC[]
+. Text "\f[CB]\e\\$1\[lB]\f[]\,\f[I]\\$2\/\f[]\f[CB]\[rB]\f[]"
+..
+.\" ====================================================================
+.\" .ESCq name arg
+.\"
+.\" Synopsis for escape sequence with a bracketed long argument
+.\" Args : 2 obligatory
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary text
+.\" Result : prints \name'arg', where 'name' is in CB, 'arg' in I
+.\"
+.de ESCq
+. Text "\f[CB]\e\\$1\[aq]\f[]\,\f[I]\\$2\/\f[]\f[CB]\[aq]\f[]"
+..
+.\" ====================================================================
+.\" .ESC? arg
+.\"
+.\" Synopsis for escape sequence with a bracketed long argument
+.\" Args : 1 obligatory
+.\" arg : arbitrary text
+.\" Result : prints '\?arg\?', where the '\?' are in CB, 'arg' in I
+.\"
+.de ESC?
+. Text "\f[CB]\e?\,\f[I]\\$1\/\f[CB]\[rs]?\f[R]"
+..
+.\" ====================================================================
+.\" .esc name [punct]
+.\"
+.\" Reference of an escape sequence (no args), possibly punctuation
+.\" Args : 1 obligatory
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" punct : arbitrary
+.\" Result : prints \name, where 'name' is in B, 'punct' in R
+.\"
+.de esc
+. ie (\\n[.$] < 2) \
+. B "\e\\$1"
+. el \
+. BR "\e\\$1" \\$2
+..
+.\" ====================================================================
+.\" .escarg name arg [punct]
+.\"
+.\" Reference of an escape sequence (no args)
+.\" Args : 1 obligatory, 1 optional
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary word
+.\" Result : prints \namearg, where
+.\" 'name' is in B, 'arg' in I
+.\"
+.de escarg
+. Text \f[B]\e\\$1\f[]\,\f[I]\\$2\/\f[]\\$3
+..
+.\" ====================================================================
+.\" .esc[] name arg [punct]
+.\"
+.\" Reference for escape sequence with a bracketed long argument
+.\" Args : 2 obligatory
+.\" name : suitable name for an escape sequence (c, (xy, [long])
+.\" arg : arbitrary text
+.\" Result : prints \name[arg], where 'name' is in CB, 'arg' in CI
+.\"
+.de esc[]
+. Text \f[CB]\e\\$1\[lB]\f[]\,\f[CI]\\$2\/\f[]\f[CB]\[rB]\f[]\\$3
+..
+.
+.\" ========= strings =========
+.
+.\" synopsis for string, with \*[]
+.de STRING
+. Text \[rs]*[\f[CB]\\$1\f[]] \\$2
+..
+.\" synopsis for a long string
+.de string
+. if \n[.$]=0 \
+. return
+. Text \f[CB]\[rs]*\[lB]\\$1\[rB]\f[]\\$2
+..
+.
+.\" ========= registers =========
+.
+.\" synopsis for registers, with \n[]
+.de REG
+. Text \[rs]n[\f[CB]\\$1\f[]]
+..
+.\" reference of a register, without decoration
+.de register
+. Text register
+. ie (\\n[.$] < 2) \
+. B \\$*
+. el \
+. BR \\$*
+..
+.
+.\" begin list [piloting a possible extension to man(7)]
+.de LS
+. nr saved-PD \\n[PD]
+. nr PD 0
+..
+.
+.\" end list [piloting a possible extension to man(7)]
+.de LE
+. nr PD \\n[saved-PD]
+..
+.
+.
+.\" end of macro definitions
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.I groff
+is short for GNU
+.IR roff ,
+a free reimplementation of the AT&T device-independent
+.I troff \" AT&T
+typesetting system.
+.
+See
+.MR roff @MAN7EXT@
+for a survey of and background on
+.I roff
+systems.
+.
+.
+.P
+This document is intended as a reference.
+.
+The primary
+.I groff
+manual,
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is a better resource for learners,
+containing many examples and much discussion.
+.
+It is written in Texinfo;
+you can browse it interactively with \[lq]info groff\[rq].
+.
+Additional formats,
+including plain text,
+HTML,
+DVI,
+and PDF,
+may be available in
+.IR @DOCDIR@ .
+.
+.
+.P
+.I groff
+is also a name for an extended dialect of the
+.I roff
+language.
+.
+We use \[lq]roff\[rq] to denote features that are universal,
+or nearly so,
+among implementations of this family.
+.
+We apply the term \[lq]groff\[rq] to the language documented here,
+the GNU implementation of the overall system,
+the project that develops that system,
+and the command of that name.
+.
+.
+.P
+GNU
+.IR troff , \" GNU
+installed on this system as
+.MR @g@troff @MAN1EXT@ ,
+is the
+.I formatter:
+a program that reads device and font descriptions
+(\c
+.MR groff_font @MAN5EXT@ ),
+interprets the
+.I groff
+language expressed in text input files,
+and translates that input into a device-independent output format
+(\c
+.MR groff_out @MAN5EXT@ )
+that is usually then post-processed by an output driver to produce
+PostScript,
+PDF,
+HTML,
+DVI,
+or terminal output.
+.
+.
+.\" ====================================================================
+.SH "Input format"
+.\" ====================================================================
+.
+Input to GNU
+.I troff \" GNU
+is organized into lines separated by the Unix newline character
+(U+000A),
+and must be in one of two character encodings it can recognize:
+IBM code page 1047 on EBCDIC systems,
+and ISO\~Latin-1 (8859-1) otherwise.
+.
+Use of ISO\~646-1991:IRV (\[lq]US-ASCII\[rq]) or (equivalently) the
+\[lq]Basic Latin\[rq]
+subset of ISO\~10646 (\[lq]Unicode\[rq]) is recommended;
+see
+.MR groff_char @MAN7EXT@ .
+.
+The
+.MR preconv @MAN1EXT@
+preprocessor transforms other encodings,
+including UTF-8,
+to satisfy
+.IR @g@troff 's
+requirements.
+.
+.
+.\" ====================================================================
+.SH "Syntax characters"
+.\" ====================================================================
+.
+Several input characters are syntactically significant to
+.IR groff .
+.
+.
+.IP . 4n
+A dot at the beginning of an input line marks it as a
+.I control line.
+.
+It can also follow the
+.request .el
+and
+.request .nop
+requests,
+and the condition in
+.request .if ,
+.request .ie ,
+and
+.request .while
+requests.
+.
+The control character invokes requests and calls macros by the name that
+follows it.
+.
+The
+.request .cc
+request can change the control character.
+.
+.
+.IP \[aq]
+The neutral apostrophe is the
+.I "no-break control character,"
+recognized where the control character is.
+.
+It suppresses the (first) break implied by the
+.request .bp ,
+.request .cf ,
+.request .fi ,
+.request .fl ,
+.request .in ,
+.request .nf ,
+.request .rj ,
+.request .sp ,
+.request .ti ,
+and
+.request .trf
+requests.
+.
+The requested operation takes effect at the next break.
+.
+It makes
+.request .br
+nilpotent.
+.
+The no-break control character can be changed with the
+.request .c2
+request.
+.
+When formatted,
+.RB \[lq] \[aq] \[rq]
+may be typeset as a typographical quotation mark;
+use the
+.esc [aq]
+special character escape sequence to format a neutral apostrophe glyph.
+.
+.
+.IP \[dq]
+The neutral double quote can be used to enclose arguments to macros and
+strings,
+and is required if those arguments contain space or tab characters.
+.
+In the
+.request .ds ,
+.request .ds1 ,
+.request .as ,
+and
+.request .as1
+requests,
+an initial neutral double quote in the second argument is stripped off
+to allow embedding of leading spaces.
+.
+To include a double quote inside a quoted argument,
+use the
+.esc [dq]
+special character escape sequence
+(which also serves to typeset the glyph in text).
+.
+.
+.IP \[rs]
+A backslash introduces an escape sequence.
+.
+The escape character can be changed with the
+.request .ec
+request;
+.request .eo
+disables escape sequence recognition.
+.
+Use the
+.esc [rs]
+special character escape sequence to format a backslash glyph,
+and
+.esc e
+to typeset the glyph of the current escape character.
+.
+.
+.IP (
+An opening parenthesis is special only in certain escape sequences;
+when recognized,
+it introduces an argument of exactly two characters.
+.
+.I groff
+offers the more flexible square bracket syntax.
+.
+.
+.IP [
+An opening bracket is special only in certain escape sequences;
+when recognized,
+it introduces an argument (list) of any length,
+not including a closing bracket.
+.
+.
+.IP ]
+A closing bracket is special only when an escape sequence using an
+opening bracket as an argument delimiter is being interpreted.
+.
+It ends the argument (list).
+.
+.
+.P
+Additionally,
+the Control+A character (U+0001) in text is interpreted as a
+.I leader
+(see below).
+.
+.
+.P
+Horizontal white space characters are significant to
+.I groff,
+but trailing spaces on text lines are ignored.
+.\" slack text for widow/orphan control: trailing tabs are not
+.
+.
+.TP 8n
+.I space
+Space characters separate arguments in request invocations,
+macro calls,
+and string interpolations.
+.
+In text,
+they separate words.
+.
+Multiple adjacent space characters in text cause
+.I groff
+to attempt end-of-sentence detection on the preceding word
+(and trailing punctuation).
+.
+The amount of space between words and sentences is controlled by the
+.request .ss
+request.
+.
+When filling is enabled
+(the default),
+a line may be broken at a space.
+.
+When adjustment is enabled
+(the default),
+inter-word spaces are expanded until the output line reaches the
+configured length.
+.
+An adjustable but non-breaking space is available with
+.esc \[ti] .
+.
+To get a space of fixed width,
+use one of the escape sequences
+.squoted_char "\[rs]\~"
+(the escape character followed by a space),
+.esc 0 ,
+.esc | ,
+.esc \[ha] ,
+or
+.esc h ;
+see section \[lq]Escape sequences\[rq] below.
+.
+.
+.TP
+.I newline
+In text,
+a newline puts an inter-word space onto the output and,
+if filling is enabled,
+triggers end-of-sentence recognition on the preceding text.
+.
+See section \[lq]Line continuation\[rq] below.
+.
+.
+.TP
+.I tab
+A tab character in text causes the drawing position to advance to the
+next defined tab stop.
+.
+.
+.\" ====================================================================
+.SH "Tabs and leaders"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Tabs and
+.\" Leaders".
+The formatter interprets input horizontal tab characters
+(\[lq]tabs\[rq]) and Control+A characters (\[lq]leaders\[rq]) into
+movements to the next tab stop.
+.
+Tabs simply move to the next tab stop;
+leaders place enough periods to fill the space.
+.
+Tab stops are by default located every half inch measured from the
+drawing position corresponding to the beginning of the input line;
+see section \[lq]Page geometry\[rq] of
+.MR roff 7 .
+.
+Tabs and leaders do not cause breaks and therefore do not interrupt
+filling.
+.
+Tab stops can be configured with the
+.B ta
+request,
+and tab and leader glyphs with the
+.B tc
+and
+.B lc
+requests,
+respectively.
+.\" END Keep (roughly) parallel with groff.texi node "Tabs and Leaders".
+.
+.
+.\" ====================================================================
+.SH "Line continuation"
+.\" ====================================================================
+.
+When filling is enabled,
+input and output line breaks generally do not correspond.
+.
+The
+.I roff
+language therefore distinguishes input and output line continuation.
+.
+.
+.P
+A backslash
+.B \[rs]
+immediately followed by a newline,
+sometimes discussed as
+.BI \[rs] newline\c
+,
+suppresses the effects of that newline
+on the input.
+.
+The next input line thus retains the classification of its predecessor
+as a control or text line.
+.
+.BI \[rs] newline
+is useful for managing line lengths in the input during document
+maintenance;
+you can break an input line in the middle of a request invocation,
+macro call,
+or escape sequence.
+.
+Input line continuation is invisible to the formatter,
+with two exceptions:
+the
+.B \[or]
+operator recognizes the new input line,
+and the input line counter register
+.B .c
+is incremented.
+.
+.
+.P
+The
+.esc c
+escape sequence continues an
+.I output
+line.
+.
+Nothing on the input line after it is formatted.
+.
+In contrast to
+.BI \[rs] newline\c
+,
+a line after
+.esc c
+is treated as a new input line,
+so a control character is recognized at its beginning.
+.
+The visual results depend on whether filling is enabled.
+.
+An intervening control line that causes a break overrides
+.esc c ,
+flushing out the pending output line in the usual way.
+.
+The
+.register .int
+contains a positive value if the last output line was continued with
+.esc c ;
+this datum is associated with the
+environment.
+.
+.
+.\" ====================================================================
+.SH Colors
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Colors".
+.I groff
+supports color output with a variety of color spaces and up to 16 bits
+per channel.
+.
+Some devices,
+particularly terminals,
+may be more limited.
+.
+When color support is enabled,
+two colors are current at any given time:
+the
+.I stroke color,
+with which glyphs,
+rules (lines),
+and geometric objects like circles and polygons are drawn,
+and the
+.I fill color,
+which can be used to paint the interior of a closed geometric figure.
+.
+The
+.BR color ,
+.BR defcolor ,
+.BR gcolor ,
+and
+.B fcolor
+requests;
+.B \[rs]m
+and
+.B \[rs]M
+escape sequences;
+and
+.BR .color ,
+.BR .m ,
+and
+.B .M
+registers exercise color support.
+.
+.
+.P
+Each output device has a color named
+.RB \[lq] default \[rq],
+which cannot be redefined.
+.
+A device's default stroke and fill colors are not necessarily the same.
+.
+For the
+.BR dvi ,
+.BR html ,
+.BR pdf ,
+.BR ps ,
+and
+.B xhtml
+output devices,
+.I @g@troff
+automatically loads a macro file defining many color names at startup.
+.
+By the same mechanism,
+the devices supported by
+.MR grotty @MAN1EXT@
+recognize the eight standard ISO\~6429/ECMA-48 color names
+(also known vulgarly as \[lq]ANSI colors\[rq]).
+.\" END Keep (roughly) parallel with groff.texi node "Colors".
+.
+.
+.br
+.ne 3v
+.\" ====================================================================
+.SH Measurements
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Measurements".
+Numeric parameters that specify measurements are expressed as
+integers or decimal fractions with an optional
+.I scaling unit
+suffixed.
+.
+A scaling unit is a letter that immediately follows the last digit of a
+number.
+.
+Digits after the decimal point are optional.
+.
+.
+.P
+Measurements are scaled by the scaling unit and stored internally
+(with any fractional part discarded)
+in basic units.
+.
+The device resolution can therefore be obtained by storing a value of
+.RB \[lq] 1i \[rq]
+to a register.
+.
+The only constraint on the basic unit is that it is at least as small as
+any other unit.
+.\" That's a fib. A device resolution of around 2^31 would surely also
+.\" cause problems. But nobody does that.
+.
+.
+.P
+.LS
+.TP
+.B u
+Basic unit.
+.
+.TP
+.B i
+Inch;
+defined as 2.54\~centimeters.
+.
+.TP
+.B c
+Centimeter.
+.
+.TP
+.B p
+Point;
+a typesetter's unit used for measuring type size.
+.
+There are 72\~points to an inch.
+.
+.TP
+.B P
+Pica;
+another typesetter's unit.
+.
+There are 6\~picas to an inch and 12\~points to a pica.
+.
+.TP
+.BR s ,\~ z
+Scaled points and multiplication by the output device's
+.I sizescale
+parameter,
+respectively.
+.
+.TP
+.B f
+Multiplication by 65,536;
+.
+scales decimal fractions in the interval [0, 1] to 16-bit unsigned
+integers.
+.LE
+.
+.
+.P
+The magnitudes of other scaling units depend on the text formatting
+parameters in effect.
+.
+.
+.P
+.LS
+.TP
+.B m
+Em;
+an em is equal to the current type size in points.
+.
+.TP
+.B n
+En;
+an en is one-half em.
+.
+.TP
+.B v
+Vee;
+distance between text baselines.
+.
+.TP
+.B M
+Hundredth of an em.
+.LE
+.\" END Keep (roughly) parallel with groff.texi node "Measurements".
+.
+.
+.\" ====================================================================
+.SS "Motion quanta"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Motion Quanta".
+An output device's basic unit
+.B u
+is not necessarily its smallest addressable length;
+.B u
+can be smaller to avoid problems with integer roundoff.
+.
+The minimum distances that a device can work with in the horizontal and
+vertical directions are termed its
+.I "motion quanta,"
+stored in the
+.B .H
+and
+.B .V
+registers,
+respectively.
+.
+Measurements are rounded to applicable motion quanta.
+.
+Half-quantum fractions round toward zero.
+.\" END Keep (roughly) parallel with groff.texi node "Motion Quanta".
+.
+.
+.\" ====================================================================
+.SS "Default units"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Default Units".
+A general-purpose register
+(one created or updated with the
+.B nr
+request;
+see section \[lq]Registers\[rq] below)
+is implicitly dimensionless,
+or reckoned in basic units if interpreted in a measurement context.
+.
+But it is convenient for many requests and escape sequences to infer a
+scaling unit for an argument if none is specified.
+.
+An explicit scaling unit
+(not after a closing parenthesis)
+can override an undesirable default.
+.
+Effectively,
+the default unit is suffixed to the expression if a scaling unit is not
+already present.
+.
+GNU
+.IR troff 's \" GNU
+use of integer arithmetic should also be kept in mind;
+see below.
+.\" END Keep (roughly) parallel with groff.texi node "Default Units".
+.
+.
+.\" ====================================================================
+.SH "Numeric expressions"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Numeric
+.\" expressions".
+A
+.I numeric expression
+evaluates to an integer.
+.
+The following operators are recognized.
+.\"evaluates to an integer:
+.\"it can be as simple as a literal
+.\".RB \[lq] 0 \[rq]
+.\"or it can be a complex sequence of register and string interpolations
+.\"interleaved with measurement operators.
+.
+.
+.P
+.TS
+Rf(CR) L.
++ addition
+\- subtraction
+* multiplication
+/ truncating division
+% modulus
+_
+\f[R]unary\f[] + assertion, motion, incrementation
+\f[R]unary\f[] \- negation, motion, decrementation
+_
+; scaling
+>? maximum
+<? minimum
+_
+< less than
+> greater than
+<= less than or equal
+>= greater than or equal
+\&= equal
+== equal
+_
+& logical conjunction (\[lq]and\[rq])
+: logical disjunction (\[lq]or\[rq])
+! logical complementation (\[lq]not\[rq])
+_
+( ) precedence
+_
+| boundary-relative motion
+.TE
+.
+.
+.P
+.I @g@troff
+provides a set of mathematical and logical operators familiar to
+programmers\[em]as well as some unusual ones\[em]but supports only
+integer arithmetic.
+.
+(Provision is made for interpreting and
+reporting decimal fractions in certain cases.)
+.
+The internal data type used for computing results is usually a 32-bit
+signed integer,
+which suffices to represent magnitudes within a range of \[+-]2
+billion.
+.
+(If that's not enough, see
+.MR groff_tmac @MAN5EXT@
+for the
+.I 62bit.tmac
+macro package.)
+.
+.
+.P
+Arithmetic infix operators perform a function on the numeric expressions
+to their left and right;
+they are
+.B +
+(addition),
+.B \-
+(subtraction),
+.B *
+(multiplication),
+.B /
+(truncating division),
+and
+.B %
+(modulus).
+.
+.I Truncating division
+rounds to the integer nearer to zero,
+no matter how large the fractional portion.
+.
+Overflow and division
+(or modulus)
+by zero are errors and abort evaluation of a numeric expression.
+.
+.
+.P
+Arithmetic unary operators operate on the numeric expression to their
+right;
+they are
+.B \-
+(negation)
+and
+.B +
+(assertion\[em]for completeness;
+it does nothing).
+.
+The unary minus must often be used with parentheses to avoid confusion
+with the decrementation operator,
+discussed below.
+.
+.
+.P
+The sign of the modulus of operands of mixed signs is determined by the
+sign of the first.
+.
+Division and modulus operators satisfy the following property:
+given a
+.RI dividend\~ a
+and a
+.RI divisor\~ b ,
+a
+.RI quotient\~ q
+formed by
+.RB \[lq] "(a / b)" \[rq]
+and a
+.RI remainder\~ r
+by
+.RB \[lq] "(a % b)" \[rq],
+then
+.IR qb \~+\~ r \~=\~ a .
+.
+.
+.P
+GNU
+.IR troff 's \" GNU
+scaling operator,
+used with parentheses as
+.BI ( c ; e )\c
+,
+evaluates a numeric
+.RI expression\~ e
+.RI using\~ c
+as the default scaling unit.
+.
+If
+.I c
+is omitted,
+scaling units are ignored in the evaluation
+.RI of\~ e .
+.
+GNU
+.I troff \" GNU
+also provides a pair of operators to compute the extrema of two
+operands:
+.B >?\&
+(maximum)
+and
+.B <?\&
+(minimum).
+.
+.
+.P
+Comparison operators comprise
+.B <
+(less than),
+.B >
+(greater than),
+.B <=
+(less than or equal),
+.B >=
+(greater than or equal),
+and
+.B =
+(equal).
+.
+.B ==
+is a synonym for
+.BR = .
+.
+When evaluated,
+a comparison is replaced with
+.RB \[lq] 0 \[rq]
+if it is false and
+.RB \[lq] 1 \[rq]
+if true.
+.
+In the
+.I roff
+language,
+positive values are true,
+others false.
+.
+.
+.P
+We can operate on truth values with the logical operators
+.B &
+(logical conjunction or \[lq]and\[rq])
+and
+.B :
+(logical disjunction or \[lq]or\[rq]).
+.
+They evaluate as comparison operators do.
+.
+A logical complementation (\[lq]not\[rq]) operator,
+.B !\&,
+works only within
+.RB \[lq] if \[rq],
+.RB \[lq] ie \[rq],
+and
+.RB \[lq] while \[rq]
+requests.
+.
+.\" This is worded to avoid implying that the operator doesn't apply to
+.\" conditional expressions in general, albeit without mentioning them
+.\" because they're out of scope.
+Furthermore,
+.B !\&
+is recognized only at the beginning of a numeric expression not
+contained by another numeric expression.
+.
+In other words,
+it must be the \[lq]outermost\[rq] operator.
+.
+Including it elsewhere in the expression produces a warning in the
+.RB \%\[lq] number \[rq]
+category
+(see
+.MR @g@troff @MAN1EXT@ ),
+and its expression evaluates false.
+.
+This unfortunate limitation maintains compatibility with AT&T
+.IR troff .\" AT&T
+.
+Test a numeric expression for falsity by comparing it to a false value.
+.
+.
+.P
+The
+.I roff
+language has no operator precedence:
+expressions are evaluated strictly from left to right,
+in contrast to schoolhouse arithmetic.
+.
+Use parentheses
+.B ( )
+to impose a desired precedence upon subexpressions.
+.
+.
+.P
+For many requests and escape sequences that cause motion on the page,
+the unary operators
+.B +
+and
+.B \-
+work differently when leading a numeric expression.
+.
+They then indicate a motion relative to the drawing position:
+positive is down in vertical contexts,
+right in horizontal ones.
+.
+.
+.P
+.B +
+and
+.B \-
+are also treated differently by the following requests and escape
+sequences:
+.BR bp ,
+.BR in ,
+.BR ll ,
+.BR pl ,
+.BR pn ,
+.BR po ,
+.BR ps ,
+.BR pvs ,
+.BR rt ,
+.BR ti ,
+.BR \[rs]H ,
+.BR \[rs]R ,
+and
+.BR \[rs]s .
+.
+Here,
+leading plus and minus signs serve as incrementation and decrementation
+operators,
+respectively.
+.
+To negate an expression,
+subtract it from zero
+or include the unary minus in parentheses with its argument.
+.\" @xref{Setting Registers}, for examples.
+.
+.
+.P
+A leading
+.B \[or]
+operator indicates a motion relative not to the drawing position but to
+a boundary.
+.
+For horizontal motions,
+the measurement specifies a distance relative to a drawing position
+corresponding to the beginning of the
+.I input
+line.
+.
+By default,
+tab stops reckon movements in this way.
+Most escape sequences do not;
+.\" XXX: Which ones do?
+.B \[or]
+tells them to do so.
+.
+For vertical motions,
+the
+.B \[or]
+operator specifies a distance from the first text baseline on the page
+or in the current diversion,
+using the current vertical spacing.
+.
+.
+.P
+The
+.B \[rs]B
+escape sequence tests its argument for validity as a numeric expression.
+.
+.
+.br
+.ne 2v
+.P
+A register interpolated as an operand in a numeric expression must have
+an Arabic format;
+luckily,
+this is the default.\" @xref{Assigning Register Formats}.
+.
+.
+.P
+Due to the way arguments are parsed,
+spaces are not allowed in numeric expressions unless the (sub)expression
+containing them is surrounded by parentheses.
+.\"@xref{Request and Macro Arguments}, and @ref{Conditionals and Loops}.
+.\" END Keep (roughly) parallel with groff.texi node "Numeric
+.\" expressions".
+.
+.
+.\" ====================================================================
+.SH Identifiers
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Identifiers".
+An
+.I identifier
+labels a GNU
+.I troff \" GNU
+datum such as a register,
+name
+(macro,
+string,
+or diversion),
+typeface,
+color,
+special character,
+character class,
+environment,
+or stream.
+.
+Valid identifiers consist of one or more ordinary characters.
+.
+An
+.I ordinary character
+is an input character that is not the escape character,
+a leader,
+tab,
+newline,
+or invalid as GNU
+.I troff \" GNU
+input.
+.
+.
+.\" XXX: We might move this discussion earlier since it is applicable to
+.\" troff input in general, and include a reference to the `trin`
+.\" request.
+.P
+Invalid input characters are subset of control characters
+(from the sets \[lq]C0 Controls\[rq] and \[lq]C1 Controls\[rq] as
+Unicode describes them).
+.
+When
+.I @g@troff
+encounters one in an identifier,
+it produces a warning in category
+.RB \%\[lq] input \[rq]
+(see section \[lq]Warnings\[rq] in
+.MR @g@troff @MAN1EXT@ ).
+.
+They are removed during interpretation:
+an identifier \[lq]foo\[rq],
+followed by an invalid
+character and then \[lq]bar\[rq],
+is processed as \[lq]foobar\[rq].
+.
+.
+.P
+On a machine using the ISO 646,
+8859,
+or 10646 character encodings,
+invalid input characters are
+.BR 0x00 ,
+.BR 0x08 ,
+.BR 0x0B ,
+.BR 0x0D \[en] 0x1F ,
+and
+.BR 0x80 \[en] 0x9F .
+.
+On an EBCDIC host,
+they are
+.BR 0x00 \[en] 0x01 ,
+.BR 0x08 ,
+.BR 0x09 ,
+.BR 0x0B ,
+.BR 0x0D \[en] 0x14 ,
+.BR 0x17 \[en] 0x1F ,
+and
+.BR 0x30 \[en] 0x3F .
+.
+Some of these code points are used by
+.I @g@troff
+internally,
+making it non-trivial to extend the program to accept UTF-8 or other
+encodings that use characters from these ranges.
+.
+.
+.P
+An identifier with a closing bracket (\[lq]]\[rq]) in its name can't be
+accessed with bracket-form escape sequences that expect an identifier as
+a parameter.
+.
+Similarly,
+the
+identifier \[lq](\[rq] can't be interpolated
+.I except
+with bracket forms.
+.
+.
+.P
+If you begin a macro,
+string,
+or diversion name with either of the characters \[lq][\[rq] or
+\[lq]]\[rq],
+you foreclose use of the
+.MR @g@refer @MAN1EXT@
+preprocessor,
+which recognizes \[lq].[\[rq] and \[lq].]\[rq] as bibliographic
+reference delimiters.
+.
+.
+.P
+The escape sequence
+.B \[rs]A
+tests its argument for validity as an identifier.
+.
+.
+.P
+How GNU
+.I troff \" GNU
+handles the interpretation of an undefined identifier depends on the
+context.
+.
+There is no way to invoke an undefined request;
+such syntax is interpreted as a macro call instead.
+.
+If the identifier is interpreted as a string,
+macro,
+or diversion,
+.I @g@troff
+emits a warning in category
+.RB \[lq] mac \[rq],
+defines it as empty,
+and interpolates nothing.
+.
+If the identifier is interpreted as a register,
+.I @g@troff
+emits a warning in category
+.RB \[lq] reg \[rq],
+initializes it to zero,
+and interpolates that value.
+.
+See section \[lq]Warnings\[rq] in
+.MR @g@troff @MAN1EXT@ ,
+and subsection \[lq]Interpolating registers\[rq] and section
+\[lq]Strings\[rq] below.
+.
+Attempting to use an undefined
+typeface,
+style,
+special character,
+color,
+character class,
+environment,
+or stream generally provokes an error diagnostic.
+.
+.
+.P
+Identifiers for requests,
+macros,
+strings,
+and diversions share one name
+space;
+special characters and character classes another.
+.
+No other object types do.
+.\" END Keep (roughly) parallel with groff.texi node "Identifiers".
+.
+.
+.\" ====================================================================
+.SH "Control characters"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Control
+.\" Characters".
+.\" The mechanism of using @code{roff}'s control characters to invoke
+.\" requests and call macros was introduced in @ref{Requests and Macros}.
+Control characters are recognized only at the beginning of an input
+line,
+or at the beginning of the branch of a control structure request;
+.\" see @ref{Conditionals and Loops}.
+see section \[lq]Control structures\[rq] below.
+.
+.
+.P
+A few requests cause a break implicitly;
+use the no-break control character to prevent the break.
+.
+Break suppression is its sole behavioral distinction.
+.
+Employing the no-break control character to invoke requests that don't
+cause breaks is harmless but poor style.
+.
+.
+.P
+The control character
+.RB \[lq] .\& \[rq]
+and the no-break control character
+.RB \[lq] \|\[aq]\| \[rq]
+can be changed with the
+.B cc
+and
+.B c2
+requests,
+respectively.
+.
+Within a macro definition,
+.\" you might wish to know
+register
+.B .br
+indicates the control character used to call it.
+.\" END Keep (roughly) parallel with groff.texi node "Control
+.\" Characters".
+.
+.
+.\" ====================================================================
+.SH "Invoking requests"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Invoking
+.\" Requests".
+A control character is optionally followed by tabs and/or spaces and
+then an identifier naming a request or macro.
+.
+The invocation of an unrecognized request is interpreted as a macro
+call.
+.
+Defining a macro with the same name as a request replaces the request.
+.
+Deleting a request name with the
+.B rm
+request makes it unavailable.
+.
+The
+.B als
+request can alias requests,
+permitting them to be wrapped or non-destructively replaced.
+.
+See section \[lq]Strings\[rq] below.
+.
+.
+.br
+.ne 4v
+.P
+There is no inherent limit on argument length or quantity.
+.
+Most requests take one or more arguments,
+and ignore any they do not expect.
+.
+A request may be separated from its arguments by tabs or spaces,
+but only spaces can separate an argument from its successor.
+.
+Only one between arguments is necessary;
+any excess is ignored.
+.
+GNU
+.I troff \" GNU
+does not allow tabs for argument separation.
+.\" @footnote{In compatibility mode, a space is not necessary after a
+.\" request or macro name of two characters' length. Also, Plan@tie{}9
+.\" @code{troff} allows tabs to separate arguments.}
+.
+.
+.br
+.ne 3v
+.P
+Generally,
+a space
+.I within
+a request argument is not relevant,
+not meaningful,
+or is supported by bespoke provisions,
+as with the
+.B tl
+request's delimiters.
+.
+Some requests,
+like
+.BR ds ,
+interpret the remainder of the control line as a single argument.
+.
+See section \[lq]Strings\[rq] below.
+.
+.
+.P
+Spaces and tabs immediately after a control character are ignored.
+.
+Commonly,
+authors structure the source of documents or macro files with them.
+.\" END Keep (roughly) parallel with groff.texi node "Requests".
+.
+.
+.\" ====================================================================
+.SH "Calling macros"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Calling Macros".
+If a macro of the desired name does not exist when called,
+it is created,
+assigned an empty definition,
+and a warning in category
+.RB \[lq] mac \[rq]
+is emitted.
+.
+Calling an undefined macro
+.I does
+end a macro definition naming it as its end macro
+(see section \[lq]Writing macros\[rq] below).
+.
+.
+.P
+To embed spaces
+.I within
+a macro argument,
+enclose the argument in neutral double quotes
+.RB \[oq] \|\[dq]\| \[cq].
+.
+Horizontal motion escape sequences are sometimes a better choice for
+arguments to be formatted as text.
+.
+.
+.P
+The foregoing raises the question of how to embed neutral double quotes
+or backslashes in macro arguments when
+.I those
+characters are desired as literals.
+.
+In GNU
+.IR troff , \" GNU
+the special character escape sequence
+.B \[rs][rs]
+produces a backslash and
+.B \[rs][dq]
+a neutral double quote.
+.
+.
+.P
+In GNU
+.IR troff 's \" GNU
+AT&T compatibility mode,
+these characters remain available as
+.B \[rs](rs
+and
+.BR \[rs](dq ,
+respectively.
+.
+AT&T
+.I troff \" AT&T
+did not consistently define these special characters,
+.\" It seems that AT&T troff never recognized \(rs, though DWB 3.3
+.\" defined \(bs as an alias of "\" on its "Latin1" device, in
+.\" deliberate(?) collision with the Bell System logo identifier. It
+.\" also defined \(dq for several devices (pcl, Latin1, nroff, ...)
+.\" along with \(aq.
+but its descendants can be made to support them.
+.
+See
+.MR groff_font @MAN5EXT@ .
+.
+If even that is not feasible,
+.\" Nope nope nope--if you're this much of a masochist, go read Texinfo.
+see the \[lq]Calling Macros\[rq] section of the
+.I groff
+Texinfo manual for the complex macro argument quoting rules of AT&T
+.IR troff . \" AT&T
+.\" END Keep (roughly) parallel with groff.texi node "Calling Macros".
+.
+.
+.\" ====================================================================
+.SH "Using escape sequences"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Using Escape
+.\" Sequences".
+Whereas requests must occur on control lines,
+escape sequences can occur intermixed with text and may appear in
+arguments to requests,
+macros,
+and other escape sequences.
+.
+An escape sequence is introduced by the escape character,
+a backslash
+.BR \[rs] .
+.\" (but see the @code{ec} request below)
+.
+The next character selects the escape's function.
+.
+.
+.P
+Escape sequences vary in length.
+.
+Some take an argument,
+and of those,
+some have different syntactical forms for a one-character,
+two-character,
+or arbitrary-length argument.
+.
+Others accept
+.I only
+an arbitrary-length argument.
+.
+In the former scheme,
+a one-character argument follows the function character immediately,
+an opening parenthesis
+.RB \[lq] ( \[rq]
+introduces a two-character argument
+(no closing parenthesis is used),
+and an argument of arbitrary length is enclosed in brackets
+.RB \[lq] [] \[rq].
+.
+In the latter scheme,
+the user selects a delimiter character.
+.
+A few escape sequences are idiosyncratic,
+and support both of the foregoing conventions
+.RB ( \|\[rs]s ),
+designate their own termination sequence
+.RB ( \|\[rs]? ),
+consume input until the next newline
+.RB ( \|\[rs]! ,
+.BR \|\[rs]" ,
+.BR \|\[rs]# ),
+or support an additional modifier character
+.RB ( \|\[rs]s
+again,
+and
+.BR \|\[rs]n ).
+.\" As with requests, use of some escape sequences in source documents
+.\" may interact poorly with a macro package you use; consult its
+.\" documentation to learn of ``safe'' sequences or alternative
+.\" facilities it provides to achieve the desired result.
+.
+.
+.P
+If an escape character is followed by a character that does not
+identify a defined operation,
+the escape character is ignored
+(producing
+a diagnostic of the
+.RB \[lq] escape \[rq]
+warning category,
+which is not enabled by default)
+and the following character is processed normally.
+.
+.
+.P
+Escape sequence interpolation is of higher precedence than escape
+sequence argument interpretation.
+.
+This rule affords flexibility in using escape sequences to construct
+parameters to other escape sequences.
+.
+.
+.P
+The escape character can be interpolated
+.RB ( \[rs]e ).
+.
+Requests permit the escape mechanism to be deactivated
+.RB ( eo )
+and restored,
+or the escape character changed
+.RB ( ec ),
+and to save and restore it
+.RB ( ecs
+and
+.BR ecr ).
+.\" END Keep (roughly) parallel with groff.texi node "Using Escape
+.\" Sequences".
+.
+.
+.\" ====================================================================
+.SH Delimiters
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Delimiters".
+Some escape sequences that require parameters use delimiters.
+.
+The neutral apostrophe
+.B \[aq]
+is a popular choice and shown in this document.
+.
+The neutral double quote
+.B \[dq]
+is also commonly seen.
+.
+Letters,
+numerals,
+and leaders can be used.
+.
+Punctuation characters are likely better choices,
+except for those defined as infix operators in numeric expressions;
+see below.
+.
+.
+.br
+.ne 2v
+.P
+The following escape sequences don't take arguments and thus are allowed
+as delimiters:
+.BI \[rs] space\c
+,
+.BR \[rs]% ,
+.BR \[rs]| ,
+.BR \[rs]\[ha] ,
+.BR \[rs]{ ,
+.BR \[rs]} ,
+.BR \[rs]\[aq] ,
+.BR \[rs]\[ga] ,
+.BR \[rs]\- ,
+.BR \[rs]_ ,
+.BR \[rs]! ,
+.BR \[rs]? ,
+.BR \[rs]) ,
+.BR \[rs]/ ,
+.BR \[rs], ,
+.BR \[rs]& ,
+.BR \[rs]: ,
+.BR \[rs]\[ti] ,
+.BR \[rs]0 ,
+.BR \[rs]a ,
+.BR \[rs]c ,
+.BR \[rs]d ,
+.BR \[rs]e ,
+.BR \[rs]E ,
+.BR \[rs]p ,
+.BR \[rs]r ,
+.BR \[rs]t ,
+and
+.BR \[rs]u .
+.
+However,
+using them this way is discouraged;
+they can make the input confusing to read.
+.
+.
+.P
+A few escape sequences,
+.BR \[rs]A ,
+.BR \[rs]b ,
+.BR \[rs]o ,
+.BR \[rs]w ,
+.BR \[rs]X ,
+and
+.BR \[rs]Z ,
+accept a newline as a delimiter.
+.
+Newlines that serve as delimiters continue to be recognized as input
+line terminators.
+.
+Use of newlines as delimiters in escape sequences is also discouraged.
+.
+.
+.br
+.ne 2v
+.P
+Finally,
+the escape sequences
+.BR \[rs]D ,
+.BR \[rs]h ,
+.BR \[rs]H ,
+.BR \[rs]l ,
+.BR \[rs]L ,
+.BR \[rs]N ,
+.BR \[rs]R ,
+.BR \[rs]s ,
+.BR \[rs]S ,
+.BR \[rs]v ,
+and
+.B \[rs]x
+prohibit many delimiters.
+.
+.
+.RS
+.IP \[bu] 2n
+the numerals 0\[en]9 and the decimal point
+.RB \[lq] . \[rq]
+.
+.
+.IP \[bu]
+the (single-character) operators
+.B +\-/*%<>=&:()
+.
+.
+.IP \[bu]
+any escape sequences other than
+.BR \[rs]% ,
+.BR \[rs]: ,
+.BR \[rs]{ ,
+.BR \[rs]} ,
+.BR \[rs]\[aq] ,
+.BR \[rs]\[ga] ,
+.BR \[rs]\- ,
+.BR \[rs]_ ,
+.BR \[rs]! ,
+.BR \[rs]/ ,
+.BR \[rs]c ,
+.BR \[rs]e ,
+and
+.B \[rs]p
+.RE
+.
+.
+.P
+Delimiter syntax is complex and flexible primarily for historical
+reasons;
+the foregoing restrictions need be kept in mind mainly when using
+.I groff
+in AT&T compatibility mode.
+.
+GNU
+.I troff \" GNU
+keeps track of the nesting depth of escape sequence interpolations,
+so the only characters you need to avoid using as delimiters are those
+that appear in the arguments you input,
+not any that result from interpolation.
+.
+Typically,
+.B \[aq]
+works fine.
+.
+See section \[lq]Implementation differences\[rq] in
+.MR groff_diff @MAN7EXT@ .
+.\" END Keep (roughly) parallel with groff.texi node "Delimiters".
+.
+.
+.\" ====================================================================
+.SH "Dummy characters"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Dummy
+.\" Characters".
+As discussed in
+.MR roff @MAN7EXT@ ,
+the first character on an input line is treated specially.
+.
+Further,
+formatting a glyph has many
+consequences on formatter state
+(see section \[lq]Environments\[rq] below).
+.
+Occasionally,
+we want to escape this context or embrace some of those consequences
+without actually rendering a glyph to the output.
+.
+.B \[rs]&
+interpolates a dummy character,
+which is constitutive of output but invisible.
+.
+Its presence alters the interpretation context of a subsequent input
+character,
+and enjoys several applications:
+preventing the insertion of extra space after an end-of-sentence
+character,
+preventing interpretation of a control character at the beginning of an
+input line,
+preventing kerning between two glyphs,
+and permitting the
+.B tr
+request to remap a character to \[lq]nothing\[rq].
+.
+.B \[rs])
+works as
+.B \[rs]&
+does,
+except that it does not cancel a pending end-of-sentence state.
+.\" END Keep (roughly) parallel with groff.texi node "Dummy Characters".
+.
+.
+.\" ====================================================================
+.SH "Control structures"
+.\" ====================================================================
+.
+.I groff
+has \[lq]if\[rq] and \[lq]while\[rq] control structures like other
+languages.
+.
+However,
+the syntax for grouping multiple input lines in the branches or bodies
+of these structures is unusual.
+.
+.
+.P
+They have a common form:
+the request name is
+(except for
+.request .el
+\[lq]else\[rq])
+followed by a conditional expression
+.IR cond-expr ;
+the remainder of the line,
+.IR anything ,
+is interpreted as if it were an input line.
+.
+Any quantity of spaces between arguments to requests serves only to
+separate them;
+leading spaces in
+.I anything
+are therefore not seen.
+.
+.I anything
+effectively
+.I cannot
+be omitted;
+if
+.I cond-expr
+is true and
+.I anything
+is empty,
+the newline at the end of the control line is interpreted as a blank
+line
+(and therefore a blank text line).
+.
+.
+.P
+It is frequently desirable for a control structure to govern more than
+one request,
+macro call,
+or text line,
+or a combination of the foregoing.
+.
+The opening and closing brace escape sequences
+.esc {
+and
+.esc }
+perform such grouping.
+.
+Brace escape sequences outside of control structures have no meaning and
+produce no output.
+.
+.
+.P
+.esc {
+should appear
+(after optional spaces and tabs)
+immediately subsequent to the request's conditional expression.
+.
+.esc }
+should appear on a line with other occurrences of itself as necessary to
+match
+.esc {
+sequences.
+.
+It can be preceded by a control character,
+spaces,
+and tabs.
+.
+Input after any quantity of
+.esc }
+sequences on the same line is processed only if all the preceding
+conditions to which they correspond are true.
+.
+Furthermore,
+a
+.esc }
+closing the body of a
+.request .while
+request must be the last such escape sequence on an input line.
+.
+.
+.\" ====================================================================
+.SS "Conditional expressions"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Operators in
+.\" Conditionals".
+The
+.request .if ,
+.request .ie ,
+and
+.request .while
+requests test the truth values of numeric expressions.
+.
+They also support several additional Boolean operators;
+the members of this expanded class are termed
+.IR "conditional expressions" ;
+their truth values are as shown below.
+.
+.
+.br
+.ne 3v
+.P
+.TS
+rf(BI) lB
+rB lx.
+cond-expr\f[R].\|.\|. .\|.\|.is true if.\|.\|.
+_
+T{
+.BI \[aq] s1 \[aq] s2 \[aq]
+T} T{
+.I s1
+produces the same formatted output as
+.IR s2 .
+T}
+T{
+.BI c\~ g
+T} T{
+a glyph
+.I g
+is available.
+T}
+T{
+.BI d\~ m
+T} T{
+a string,
+macro,
+diversion,
+or request
+.I m
+is defined.
+T}
+e T{
+the current page number is even.
+T}
+T{
+.BI F\~ f
+T} T{
+a font named
+.I f
+is available.
+T}
+T{
+.BI m\~ c
+T} T{
+a color named
+.I c
+is defined.
+T}
+n T{
+the formatter is in
+.I nroff
+mode.
+T}
+o T{
+the current page number is odd.
+T}
+T{
+.BI r\~ n
+T} T{
+a register named
+.I n
+is defined.
+T}
+T{
+.BI S\~ s
+T} T{
+a font style named
+.I s
+is available.
+T}
+t T{
+the formatter is in
+.I troff
+mode.
+T}
+v T{
+n/a
+(historical artifact;
+always false).
+T}
+.TE
+.
+.
+.br
+.ne 2v
+.P
+If the first argument to an
+.BR .if ,
+.BR .ie ,
+or
+.B .while
+request begins with a non-alphanumeric character apart from
+.B !\&
+(see below);
+it performs an
+.I output comparison test.
+.
+Shown first in the table above,
+the
+.I output comparison operator
+interpolates a true value if formatting its comparands
+.I s1
+and
+.I s2
+produces the same output commands.
+.
+Other delimiters can be used in place of the neutral apostrophes.
+.
+.I @g@troff
+formats
+.I s1
+and
+.I s2
+in separate environments;
+after the comparison,
+the resulting data are discarded.
+.
+The resulting glyph properties,
+including font family,
+style,
+size,
+and
+slant,
+must match,
+but not necessarily the requests and/or escape sequences used to obtain
+them.
+.
+Motions must match in orientation and magnitude to within the applicable
+horizontal or vertical motion quantum of the device,
+after rounding.
+.
+.\" TODO: Uncomment and add forward reference when we add a "GNU troff
+.\" internals" subsection to this page.
+.\"(All of this is to say that the lists of output nodes created by
+.\"formatting
+.\".I s1
+.\"and
+.\".I s2
+.\"must be identical.)
+.
+.
+.P
+Surround the comparands with
+.B \[rs]?\&
+to avoid formatting them;
+this causes them to be compared character by character,
+as with string comparisons in other programming languages.
+.
+Since comparands protected with
+.B \[rs]?\&
+are read in copy mode,
+they need not even be valid
+.I groff
+syntax.
+.
+The escape character is still lexically recognized,
+however,
+and consumes the next character.
+.
+.
+.P
+The above operators can't be combined with most others,
+but a leading
+.RB \[lq] !\& \[rq],
+not followed immediately by spaces or tabs,
+complements an expression.
+.
+Spaces and tabs are optional immediately after the
+.RB \[lq] c \[rq],
+.RB \[lq] d \[rq],
+.RB \[lq] F \[rq],
+.RB \[lq] m \[rq],
+.RB \[lq] r \[rq],
+and
+.RB \[lq] S \[rq]
+operators,
+but right after
+.RB \[lq] !\& \[rq],
+they end the predicate and the conditional evaluates true.
+.
+(This bizarre behavior maintains compatibility with AT&T
+.IR troff .)
+.\" END Keep (roughly) parallel with groff.texi node "Operators in
+.\" Conditionals".
+.
+.
+.\" ====================================================================
+.SH "Syntax reference conventions"
+.\" ====================================================================
+.
+In the following request and escape sequence specifications,
+most argument names were chosen to be descriptive.
+.
+A few denotations may require introduction.
+.
+.
+.P
+.LS
+.RS
+.
+.TPx
+.I c
+denotes a single input character.
+.
+.TPx
+.I font
+a font either specified as a font name or a numeric mounting position.
+.
+.TPx
+.I anything
+all characters up to the end of the line,
+to the ending delimiter for the escape sequence,
+or within
+.esc {
+and
+.esc } .
+.
+Escape sequences may generally be used freely in
+.IR anything ,
+except when it is read in copy mode.
+.
+.TPx
+.I message
+is a character sequence to be emitted on the standard error stream.
+.
+Special character escape sequences are
+.I not
+interpreted.
+.
+.TPx
+.I n
+is a numeric expression that evaluates to a non-negative integer.
+.
+.TPx
+.I npl
+is a numeric expression constituting a count of subsequent
+.I productive
+input lines;
+that is,
+those that directly produce formatted output.
+.
+Text lines produce output,
+as do control lines containing requests like
+.request .tl
+or escape sequences like
+.esc D .
+.
+Macro calls are not themselves productive,
+but their interpolated contents can be.
+.
+.TPx
+.I \[+-]N
+is a numeric expression with a meaning dependent on its sign.
+.RE
+.LE
+.
+.
+.P
+If a numeric expression presented as
+.I \[+-]N
+starts with a
+.squoted_char +
+sign,
+an increment in the amount of
+.RI of\~ N
+is applied to the value applicable to the request or escape sequence.
+.
+If it starts with a
+.squoted_char \-
+sign,
+a decrement of magnitude
+.I N
+is applied instead.
+.
+Without a sign,
+.I N
+replaces any existing value.
+.
+A leading minus sign
+.RI in\~ N
+is always interpreted as a decrementation operator,
+not an algebraic sign.
+.
+To assign a register a negative value or the negated value of another
+register,
+enclose it with its operand in
+parentheses or subtract it from zero.
+.
+If a prior value does not exist
+(the register was undefined),
+an increment or decrement is applied as if to\~0.
+.
+.
+.\" ====================================================================
+.SH "Request short reference"
+.\" ====================================================================
+.
+Not all details of request behavior are outlined here.
+.
+See the
+.I groff
+Texinfo manual or,
+for features new to GNU
+.IR troff , \" GNU
+.MR groff_diff @MAN7EXT@ .
+.
+.
+.P
+.LS
+.
+.TPx
+.REQ .ab
+Abort processing;
+exit with failure status.
+.
+.TPx
+.REQ .ab message
+Abort processing;
+write
+.I message
+to the standard error stream and exit with failure status.
+.
+.
+.TPx
+.REQ .ad
+Enable output line alignment and adjustment using the mode stored in
+.BR \[rs]n[.j] .
+.
+.
+.TPx
+.REQ .ad c
+Enable output line alignment and adjustment in mode
+.I c
+.RI ( c =\c
+.BR b , c , l , n , r ).
+.
+Sets
+.BR \[rs]n[.j] .
+.
+.
+.TPx
+.REQ .af "register c"
+Assign format
+.I c
+to
+.IR register ,
+where
+.I c
+is
+.RB \[lq] i \[rq],
+.RB \[lq] I \[rq],
+.RB \[lq] a \[rq],
+.RB \[lq] A \[rq],
+or a sequence of decimal digits whose quantity denotes the minimum width
+in digits to be used when the register is interpolated.
+.
+.RB \[lq] i \[rq]
+and
+.RB \[lq] a \[rq]
+indicate Roman numerals and basic Latin alphabetics,
+respectively,
+in the lettercase specified.
+.
+The default is
+.BR 0 .
+.
+.TPx
+.REQ .aln "new old"
+Create alias
+(additional name)
+.I new
+for existing register named
+.IR old .
+.
+.TPx
+.REQ .als "new old"
+Create alias
+(additional name)
+.I new
+for existing request,
+string,
+macro,
+or diversion
+.IR old .
+.
+.TPx
+.REQ .am "macro"
+Append to
+.I macro
+until
+.B ..\&
+is encountered.
+.
+.TPx
+.REQ .am "macro end"
+Append to
+.I macro
+until
+.BI . end
+is called.
+.
+.TPx
+.REQ .am1 "macro"
+Same as
+.request .am
+but with compatibility mode switched off during macro expansion.
+.
+.TPx
+.REQ .am1 "macro end"
+Same as
+.request .am
+but with compatibility mode switched off during macro expansion.
+.
+.TPx
+.REQ .ami "macro"
+Append to a macro whose name is contained in the string
+.I macro
+until
+.B ..\&
+is encountered.
+.
+.TPx
+.REQ .ami "macro end"
+Append to a macro indirectly.
+.I macro
+and
+.I end
+are strings whose contents are interpolated for the macro name and the
+end macro,
+respectively.
+.
+.TPx
+.REQ .ami1 "macro"
+Same as
+.request .ami
+but with compatibility mode switched off during macro expansion.
+.
+.TPx
+.REQ .ami1 "macro end"
+Same as
+.request .ami
+but with compatibility mode switched off during macro expansion.
+.
+.TPx
+.REQ .as name
+Create string
+.I name
+with empty contents;
+no operation if
+.I name
+already exists.
+.
+.TPx
+.REQ .as "name contents"
+Append
+.I contents
+to string
+.IR name .
+.
+.TPx
+.REQ .as1 string
+.TQ
+.REQ .as1 "string contents"
+As
+.request .as ,
+but with compatibility mode disabled when
+.I contents
+interpolated.
+.
+.TPx
+.REQ .asciify "diversion"
+Unformat ASCII characters, spaces, and some escape sequences in
+.IR diversion .
+.
+.TPx
+.REQ .backtrace
+Write the state of the input stack to the standard error stream.
+.
+See the
+.B \-b
+option of
+.MR groff @MAN1EXT@ .
+.
+.TPx
+.REQ .bd font
+Stop emboldening font
+.I font.
+.
+.TPx
+.REQ .bd "font n"
+Embolden
+.I font
+by overstriking its glyphs offset by
+.IR n \-1
+units.
+.
+See
+.register .b .
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .bd "special-font font"
+Stop emboldening
+.I special-font
+when
+.I font
+is selected.
+.
+.TPx
+.REQ .bd "special-font font n"
+Embolden
+.I special-font,
+overstriking its glyphs offset by
+.IR n \-1
+units when
+.I font
+is selected.
+.
+See
+.register .b .
+.
+.TPx
+.REQ .blm
+Unset blank line macro (trap).
+.
+Restore default handling of blank lines.
+.
+.
+.TPx
+.REQ .blm name
+Set blank line macro (trap) to
+.IR name .
+.
+.
+.TPx
+.REQ .box
+Stop directing output to current diversion;
+any pending output line is discarded.
+.
+.
+.TPx
+.REQ .box name
+Direct output to diversion
+.IR name ,
+omitting a partially collected line.
+.
+.
+.TPx
+.REQ .boxa
+Stop appending output to current diversion;
+any pending output line is discarded.
+.
+.
+.TPx
+.REQ .boxa name
+Append output to diversion
+.IR name ,
+omitting a partially collected line.
+.
+.
+.TPx
+.REQ .bp
+Break page and start a new one.
+.
+.TPx
+.REQ .bp "\[+-]N"
+Break page,
+starting a new one numbered
+.IR \[+-]N .
+.
+.TPx
+.REQ .br
+Break output line.
+.
+.TPx
+.REQ .brp
+Break output line;
+adjust if applicable.
+.
+.TPx
+.REQ .break
+Break out of a while loop.
+.
+.TPx
+.REQ .c2
+Reset no-break control character to
+.dquoted_char \[aq] .
+.
+.TPx
+.REQ .c2 "o"
+Recognize ordinary character
+.I o
+as no-break control character.
+.
+.TPx
+.REQ .cc
+Reset control character to
+.squoted_char . .
+.
+.TPx
+.REQ .cc "o"
+Recognize ordinary character
+.I o
+as the control character.
+.
+.TPx
+.REQ .ce
+Break,
+center the output of the next productive input line without filling,
+and break again.
+.
+.TPx
+.REQ .ce npl
+Break,
+center the output of the next
+.I npl
+productive input lines without filling,
+then break again.
+.
+If
+.I npl
+\[<=] 0,
+stop centering.
+.
+.TPx
+.REQ .cf file
+Copy contents of
+.I file
+without formatting to the (top-level) diversion.
+.
+.TPx
+.REQ .cflags "n c1 c2 \fR\&.\|.\|.\&\fP"
+Assign properties encoded
+.RI by\~ n
+to characters
+.IR c1 ,
+.IR c2 ,
+and so on.
+.
+.
+.TPx
+.REQ .ch name
+Unplant page location trap
+.IR name .
+.
+.
+.TPx
+.REQ .ch "name vpos"
+Change page location trap
+.I name
+planted by
+.request .wh
+by moving its location to
+.I vpos
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TPx
+.REQ .char "c contents"
+Define ordinary or special character
+.I c
+as
+.IR contents .
+.
+.TPx
+.REQ .chop object
+Remove the last character from the macro,
+string,
+or diversion
+named
+.IR object .
+.
+.TPx
+.REQ .class "name c1 c2 \fR\&.\|.\|.\&\fP"
+Define a (character) class
+.I name
+comprising the characters or range expressions
+.IR c1 ,
+.IR c2 ,
+and so on.
+.
+.TPx
+.REQ .close "stream"
+Close the
+.IR stream .
+.
+.
+.TPx
+.REQ .color
+Enable output of color-related device-independent output commands.
+.
+.
+.TPx
+.REQ .color n
+If
+.I n
+is zero,
+disable output of color-related device-independent output commands;
+otherwise,
+enable them.
+.\" XXX: Should probably interpret negative values as false.
+.
+.
+.TPx
+.REQ .composite "from to"
+Map glyph name
+.I from
+to glyph name
+.I to
+while constructing a composite glyph name.
+.
+.TPx
+.REQ .continue
+Finish the current iteration of a while loop.
+.
+.TPx
+.REQ .cp
+Enable compatibility mode.
+.
+.TPx
+.REQ .cp n
+If
+.I n
+is zero,
+disable compatibility mode,
+otherwise enable it.
+.
+.TPx
+.REQ .cs "font n m"
+Set constant character width mode for
+.I font
+to
+.IR n /36
+ems with em
+.IR m .
+.\" XXX: m parameter needs more explanation.
+.
+.
+.TPx
+.REQ .cu
+Continuously underline the output of the next productive input line.
+.
+.
+.TPx
+.REQ .cu npl
+Continuously underline the output of the next
+.I npl
+productive input lines.
+.
+If
+.IR npl =0,
+stop continuously underlining.
+.
+.
+.TPx
+.REQ .da
+Stop appending output to current diversion.
+.
+.
+.TPx
+.REQ .da name
+Append output to diversion
+.IR name .
+.
+.
+.TPx
+.REQ .de macro
+Define or redefine
+.I macro
+until
+.RB \[lq] ..\& \[rq]
+occurs at the start of a control line in the current conditional block.
+.
+.
+.TPx
+.REQ .de "macro end"
+Define or redefine
+.I macro
+until
+.I end
+is invoked or called at the start of a control line in the current
+conditional block.
+.
+.
+.TPx
+.REQ .de1 "macro"
+As
+.request .de ,
+but disable compatibility mode during macro expansion.
+.
+.TPx
+.REQ .de1 "macro end"
+As
+.RB \[lq] .de
+.IR "macro end" \[rq],
+but disable compatibility mode during macro expansion.
+.
+.
+.TPx
+.REQ .defcolor "ident scheme color-component \f[R].\|.\|."
+Define a color named
+.I ident.
+.
+.I scheme
+identifies a color space and determines the number of required
+.IR color-component s;
+it must be one of
+.RB \[lq] rgb \[rq]
+(three components),
+.RB \[lq] cmy \[rq]
+(three),
+.RB \[lq] cmyk \[rq]
+(four),
+or
+.RB \[lq] gray \[rq]
+(one).
+.
+.RB \[lq] grey \[rq]
+is accepted as a synonym of
+.RB \[lq] gray \[rq].
+.
+The color components can be encoded as a single hexadecimal value
+starting with
+.B #
+or
+.BR ## .
+.
+The former indicates that each component is in the range 0\[en]255
+(0\[en]FF),
+the latter the range 0\[en]65,535 (0\[en]FFFF).
+.
+Alternatively,
+each color component can be specified as a decimal fraction in the range
+0\[en]1,
+interpreted using a default scaling unit
+.RB of\~\[lq] f \[rq],
+which multiplies its value by 65,536
+(but clamps it at 65,535).
+.
+Each output device has a color named
+.RB \[lq] default \[rq],
+which cannot be redefined.
+.
+A device's default stroke and fill colors are not necessarily the same.
+.
+.
+.TPx
+.REQ .dei "macro"
+Define macro indirectly.
+.
+As
+.request .de ,
+but use interpolation of string
+.I macro
+as the name of the defined macro.
+.
+.
+.TPx
+.REQ .dei "macro end"
+Define macro indirectly.
+.
+As
+.request .de ,
+but use interpolations of strings
+.I macro
+and
+.I end
+as the names of the defined and end macros.
+.
+.
+.TPx
+.REQ .dei1 "macro"
+As
+.request .dei ,
+but disable compatibility mode during macro expansion.
+.
+.
+.TPx
+.REQ .dei1 "macro end"
+As
+.request ".dei\~\f[I]macro\~end\f[]" ,
+but disable compatibility mode during macro expansion.
+.
+.TPx
+.REQ .device "anything"
+Write
+.IR anything ,
+read in copy mode,
+to
+.I @g@troff
+output as a device control command.
+.
+An initial neutral double quote is stripped to allow embedding of
+leading spaces.
+.
+.TPx
+.REQ .devicem "name"
+Write contents of macro or string
+.I name
+to
+.I @g@troff
+output as a device control command.
+.
+.TPx
+.REQ .di
+Stop directing output to current diversion.
+.
+.
+.TPx
+.REQ .di name
+Direct output to diversion
+.IR name .
+.
+.TPx
+.REQ .do "name \fR\&.\|.\|.\&\fP"
+Interpret the string,
+request,
+diversion,
+or macro
+.I name
+(along with any arguments)
+with compatibility mode disabled.
+.
+Compatibility mode is restored
+(only if it was active)
+when the
+.I expansion
+of
+.I name
+is interpreted.
+.
+.TPx
+.REQ .ds name
+Create empty string
+.IR name .
+.
+.TPx
+.REQ .ds "name contents"
+Create a string
+.I name
+containing
+.IR contents .
+.
+.TPx
+.REQ .ds1 name
+.TQ
+.REQ .ds1 "name contents"
+As
+.request .ds ,
+but with compatibility mode disabled when
+.I contents
+interpolated.
+.
+.TPx
+.REQ .dt
+Clear diversion trap.
+.
+.
+.TPx
+.REQ .dt "vertical-position name"
+Set the diversion trap to macro
+.I name
+at
+.I vertical-position
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TPx
+.REQ .ec
+Recognize
+.B \[rs]
+as the escape character.
+.
+.
+.TPx
+.REQ .ec "o"
+Recognize ordinary character
+.I o
+as the escape character.
+.
+.
+.TPx
+.REQ .ecr
+Restore escape character saved with
+.request .ecs .
+.
+.
+.TPx
+.REQ .ecs
+Save the escape character.
+.
+.
+.TPx
+.REQ .el "anything"
+Interpret
+.I anything
+as if it were an input line if the conditional expression of the
+corresponding
+.request .ie
+request was false.
+.
+.
+.TPx
+.REQ .em name
+Call macro
+.I name
+after the end of input.
+.
+.
+.TPx
+.REQ .eo
+Disable the escape mechanism in interpretation mode.
+.
+.
+.TPx
+.REQ .ev
+Pop environment stack,
+returning to previous one.
+.
+.
+.TPx
+.REQ .ev "env"
+Push current environment onto stack and switch to
+.IR env .
+.
+.
+.TPx
+.REQ .evc "env"
+Copy environment
+.I env
+to the current one.
+.
+.
+.TPx
+.REQ .ex
+Exit with successful status.
+.
+.
+.TPx
+.REQ .fam
+Set default font family to previous value.
+.
+.TPx
+.REQ .fam "name"
+Set default font family to
+.IR name .
+.
+.TPx
+.REQ .fc
+Disable field mechanism.
+.
+.TPx
+.REQ .fc "a"
+Set field delimiter to\~\c
+.I a
+and pad glyph to space.
+.
+.TPx
+.REQ .fc "a b"
+Set field delimiter to\~\c
+.I a
+and pad glyph to\~\c
+.IR b .
+.
+.TPx
+.REQ .fchar "c contents"
+Define fallback character (or glyph)
+.I c
+as
+.IR contents .
+.
+.
+.TPx
+.REQ .fcolor
+Restore previous fill color.
+.
+.
+.TPx
+.REQ .fcolor "c"
+Set fill color to
+.IR c .
+.
+.
+.TPx
+.REQ .fi
+Enable filling of output lines;
+a pending output line is broken.
+.
+Sets
+.BR \[rs]n[.u] .
+.
+.
+.TPx
+.REQ .fl
+Flush output buffer.
+.
+.TPx
+.REQ .fp "pos id"
+Mount font with font description file name
+.I id
+at non-negative
+.RI position\~ n .
+.
+.TPx
+.REQ .fp "pos id font-description-file-name"
+Mount font with
+.I font-description-file-name
+as name
+.I id
+at non-negative
+.RI position\~ n .
+.
+.TPx
+.REQ .fschar "f c anything"
+Define fallback character (or glyph)
+.I c
+for font
+.I f
+as string
+.IR anything .
+.
+.TPx
+.REQ .fspecial "font"
+Reset list of special fonts for
+.I font
+to be empty.
+.
+.TPx
+.REQ .fspecial "font s1 s2 \fR\&.\|.\|.\&\fP"
+When the current font is
+.IR font ,
+then the fonts
+.IR s1 ,
+.IR s2 ,
+\&.\|.\|.\&
+are special.
+.
+.TPx
+.REQ .ft
+.TQ
+.REQ ".ft P"
+Select previous font mounting position
+(abstract style or font);
+same as
+.esc f[]
+or
+.esc fP .
+.
+.TPx
+.REQ .ft "font"
+Select typeface
+.I font,
+which can be a
+mounting position,
+abstract style,
+or font name;
+same as
+.esc[] f font
+escape sequence.
+.
+.I font
+cannot be
+.BR P .
+.
+.TPx
+.REQ .ftr "font1 font2"
+Translate
+.I font1
+to
+.IR font2 .
+.
+.TPx
+.REQ .fzoom font
+.TQ
+.REQ .fzoom font\~\f[CB]0\f[]
+Stop magnifying
+.IR font .
+.
+.TPx
+.REQ .fzoom "font z"
+Set zoom factor for
+.I font
+.RI to\~ z
+(in thousandths;
+default:
+1000).
+.
+.TPx
+.REQ .gcolor
+Restore previous stroke color.
+.
+.
+.TPx
+.REQ .gcolor "c"
+Set stroke color to
+.IR c .
+.
+.
+.TPx
+.REQ .hc
+Reset the hyphenation character
+.RB to\~ \[rs]%
+(the default).
+.
+.TPx
+.REQ .hc char
+Change the hyphenation character
+.RI to\~ char .
+.
+.TPx
+.REQ .hcode "c1 code1 \fR[\fPc2 code2\fR] .\|.\|.\fP"
+Set the hyphenation code of character
+.I c1
+to
+.IR code1 ,
+that of
+.I c2
+to
+.IR code2 ,
+and so on.
+.
+.TPx
+.REQ .hla lang
+Set the hyphenation language to
+.IR lang .
+.
+.TPx
+.REQ .hlm n
+Set the maximum quantity of consecutive hyphenated lines to
+.IR n .
+.
+.TPx
+.REQ .hpf pattern-file
+Read hyphenation patterns from
+.IR pattern-file .
+.
+.TPx
+.REQ .hpfa pattern-file
+Append hyphenation patterns from
+.IR pattern-file .
+.
+.TPx
+.REQ .hpfcode "a b \fR[\fPc d\fR] .\|.\|.\fP"
+Define mappings for character codes in hyphenation pattern files read
+with
+.request .hpf
+and
+.request .hpfa .
+.
+.TPx
+.REQ .hw "word \fR.\|.\|.\fP"
+Define hyphenation overrides for each
+.I word;
+a hyphen
+.RB \[lq] \- \[rq]
+indicates a hyphenation point.
+.
+.
+.TPx
+.REQ .hy
+Set automatic hyphenation mode to
+.BR 1 .
+.
+.
+.TPx
+.REQ .hy\~0
+Disable automatic hyphenation;
+same as
+.BR .nh .
+.
+.
+.TPx
+.REQ .hy mode
+Set automatic hyphenation mode to
+.IR mode ;
+see section \[lq]Hyphenation\[rq] below.
+.
+.
+.TPx
+.REQ .hym
+Set the (right) hyphenation margin to
+.B 0
+(the default).
+.
+.TPx
+.REQ .hym length
+Set the (right) hyphenation margin to
+.I length
+(default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .hys
+Set the hyphenation space to
+.B 0
+(the default).
+.
+.TPx
+.REQ .hys hyphenation-space
+Suppress automatic hyphenation in adjustment modes
+.RB \[lq] b \[rq]
+or
+.RB \[lq] n \[rq]
+if the line can be justified with the addition of up to
+.I hyphenation-space
+to each inter-word space
+(default scaling unit\~\c
+.scaleindicator m ).
+.
+.
+.TPx
+.REQ .ie "cond-expr anything"
+If
+.I cond-expr
+is true,
+interpret
+.I anything
+as if it were an input line,
+otherwise skip to a corresponding
+.request .el
+request.
+.
+.
+.TPx
+.REQ .if "cond-expr anything"
+If
+.I cond-expr
+is true,
+then interpret
+.I anything
+as if it were an input line.
+.
+.
+.TPx
+.REQ .ig
+Ignore input
+(except for side effects of
+.B \[rs]R
+on auto-incrementing registers)
+until
+.RB \[lq] ..\& \[rq]
+occurs at the start of a control line in the current conditional block.
+.
+.
+.TPx
+.REQ .ig "end"
+Ignore input
+(except for side effects of
+.B \[rs]R
+on auto-incrementing registers)
+until
+.BI . end
+is called at the start of a control line in the current conditional
+block.
+.
+.TPx
+.REQ .in
+Set indentation amount to previous value.
+.
+.TPx
+.REQ .in "\[+-]N"
+Set indentation to
+.I \[+-]N
+(default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .it
+Cancel any pending input line trap.
+.
+.TPx
+.REQ .it "npl name"
+Set
+(or replace)
+an input line trap in the environment,
+calling macro
+.IR name ,
+after the next
+.I npl
+productive input lines have been read.
+.
+Lines interrupted with the
+.B \[rs]c
+escape sequence are counted separately.
+.
+.TPx
+.REQ .itc
+Cancel any pending input line trap.
+.
+.TPx
+.REQ .itc "npl name"
+As
+.request .it ,
+except that input lines interrupted with the
+.B \[rs]c
+escape sequence are not counted.
+.
+.TPx
+.REQ .kern
+Enable pairwise kerning.
+.
+.TPx
+.REQ .kern n
+If
+.I n
+is zero,
+disable pairwise kerning,
+otherwise enable it.
+.
+.TPx
+.REQ .lc
+Unset leader repetition character.
+.
+.TPx
+.REQ .lc "c"
+Set leader repetition character
+.RI to\~ c
+(default:
+.RB \[lq] . \[rq]).
+.
+.TPx
+.REQ .length "reg anything"
+Compute the number of characters of
+.I anything
+and store the count
+in the register
+.IR reg .
+.
+.
+.TPx
+.REQ .linetabs
+Enable line-tabs mode
+(calculate tab positions relative to beginning of output line).
+.
+.
+.TPx
+.REQ .linetabs\~0
+Disable line-tabs mode.
+.
+.
+.TPx
+.REQ .lf n
+Set number of next input line to
+.IR n .
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .lf "n file"
+Set number of next input line to
+.I n
+and input file name to
+.IR file .
+.
+.TPx
+.REQ .lg m
+Set ligature mode to
+.I m
+.RB ( 0
+= disable,
+.B 1
+= enable,
+.B 2
+= enable for two-letter ligatures only).
+.\" XXX: negative values accepted (mapped to 1); check AT&T troff
+.
+.TPx
+.REQ .ll
+Set line length to previous value.
+.
+Does not affect a pending output line.
+.
+.TPx
+.REQ .ll "\[+-]N"
+Set line length to
+.I \[+-]N
+(default length
+.scalednumber 6.5 i ,
+default scaling unit\~\c
+.scaleindicator m ).
+.
+Does not affect a pending output line.
+.
+.TPx
+.REQ .lsm
+Unset the leading space macro (trap).
+.
+Restore default handling of lines with leading spaces.
+.
+.TPx
+.REQ .lsm name
+Set the leading space macro (trap) to
+.IR name .
+.
+.TPx
+.REQ .ls
+Change to the previous value of additional intra-line skip.
+.
+.TPx
+.REQ .ls n
+Set additional intra-line skip value to
+.IR n ,
+i.e.,
+.IR n \-1
+blank lines are inserted after each text output line.
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .lt
+Set length of title lines to previous value.
+.
+.TPx
+.REQ .lt "\[+-]N"
+Set length of title lines
+(default length
+.scalednumber 6.5 i ,
+default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .mc
+Cease writing margin character.
+.
+.TPx
+.REQ .mc c
+Begin writing margin
+.RI character\~ c
+to the right of each output line.
+.
+.TPx
+.REQ .mc "c d"
+Begin writing margin
+.RI character\~ c
+on each output line at
+.RI distance\~ d
+to the right of the right margin
+(default distance
+.scalednumber 10 p ,
+default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .mk
+Mark vertical drawing position in an internal register;
+see
+.BR .rt .
+.
+.TPx
+.REQ .mk register
+Mark vertical drawing position in
+.IR register .
+.
+.TPx
+.REQ .mso "file"
+As
+.request .so ,
+except that
+.I file
+is sought in the
+.I tmac
+directories.
+.
+.
+.TPx
+.REQ .msoquiet "file"
+As
+.request .mso ,
+but no warning is emitted if
+.I file
+does not exist.
+.
+.
+.TPx
+.REQ .na
+Disable output line adjustment.
+.
+.
+.TPx
+.REQ .ne
+Break page if distance to next page location trap is less than one vee.
+.
+.TPx
+.REQ .ne d
+Break page if distance to next page location trap is less than distance
+.I d
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TPx
+.REQ .nf
+Disable filling of output lines;
+a pending output line is broken.
+.
+Clears
+.BR \[rs]n[.u] .
+.
+.
+.TPx
+.REQ .nh
+Disable automatic hyphenation;
+same as
+.RB \[lq] ".hy 0" \[rq].
+.
+.TPx
+.REQ .nm
+Deactivate output line numbering.
+.
+.TPx
+.REQ .nm \[+-]N
+.TQ
+.REQ .nm "\[+-]N m"
+.TQ
+.REQ .nm "\[+-]N m s"
+.TQ
+.REQ .nm "\[+-]N m s i"
+Activate output line numbering:
+number the next output line
+.I \[+-]N,
+writing numbers every
+.I m
+lines,
+with
+.I s
+numeral widths
+.RB ( \[rs]0 )
+between the line number and the output
+(default 1),
+and indenting the line number by
+.I i
+numeral widths
+(default 0).
+.
+.TPx
+.REQ .nn
+Suppress numbering of the next output line to be numbered with
+.BR nm .
+.
+.TPx
+.REQ .nn n
+Suppress numbering of the next
+.I n
+output lines to be numbered with
+.BR nm .
+.
+If
+.IR n =0,
+cancel suppression.
+.\" XXX: negative values accepted; check AT&T troff
+.
+.
+.TPx
+.REQ .nop "anything"
+Interpret
+.I anything
+as if it were an input line.
+.
+.TPx
+.REQ .nr "reg \[+-]N"
+Define or update register
+.I reg
+with value
+.IR N .
+.
+.TPx
+.REQ .nr "reg \[+-]N I"
+Define or update register
+.I reg
+with value
+.I N
+and auto-increment
+.IR I .
+.
+.TPx
+.REQ .nroff
+Make the conditional expressions
+.B n
+true and
+.B t
+false.
+.
+.TPx
+.REQ .ns
+Enable
+.IR "no-space mode" ,
+ignoring
+.B .sp
+requests until a glyph or
+.B \[rs]D
+primitive is output.
+.
+See
+.BR .rs .
+.
+.TPx
+.REQ .nx
+Immediately jump to end of current file.
+.
+.TPx
+.REQ .nx file
+Stop formatting current file and begin reading
+.I file.
+.
+.TPx
+.REQ .open "stream file"
+Open
+.I file
+for writing and associate the stream named
+.I stream
+with it.
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .opena "stream file"
+As
+.request .open ,
+but append to
+.I file.
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .os
+Output vertical distance that was saved by the
+.request .sv
+request.
+.
+.TPx
+.REQ .output contents
+Emit
+.I contents
+directly to intermediate output,
+allowing leading whitespace if
+.I string
+starts with
+\&\f[CB]\[dq]\f[]
+(which is stripped off).
+.
+.TPx
+.REQ .pc
+Reset page number character to\~\c
+.squoted_char % .
+.
+.TPx
+.REQ .pc "c"
+Page number character.
+.
+.
+.TPx
+.REQ .pev
+Report the state of the current environment followed by that of all
+other environments to the standard error stream.
+.
+.TPx
+.REQ .pi "program"
+Pipe output to
+.I program
+.RI ( nroff
+only).
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .pl
+Set page length to default
+.scalednumber 11 i .
+The current page length is stored in register
+.BR .p .
+.
+.TPx
+.REQ .pl "\[+-]N"
+Change page length to
+.I \[+-]N
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.TPx
+.REQ .pm
+Report,
+to the standard error stream,
+the names and sizes in bytes of
+defined
+macros,
+strings,
+and
+diversions.
+.
+.TPx
+.REQ .pn "\[+-]N"
+Next page number
+.IR N .
+.
+.TPx
+.REQ .pnr
+Write the names and contents of all defined registers to the standard
+error stream.
+.
+.TPx
+.REQ .po
+Change to previous page offset.
+.
+The current page offset is available in register
+.BR .o .
+.
+.TPx
+.REQ .po "\[+-]N"
+Page offset
+.IR N .
+.
+.
+.TPx
+.REQ .ps
+Return to previous type size.
+.TPx
+.
+.
+.REQ .ps "\[+-]N"
+Set/increase/decrease the type size to/by
+.I N
+scaled points
+(a non-positive resulting type size is set to 1\~u);
+also see
+.esc[] s \[+-]N .
+.
+.TPx
+.REQ .psbb file
+Retrieve the bounding box of the PostScript image found in
+.I file,
+which must conform to Adobe's Document Structuring Conventions (DSC).
+.
+See registers
+.BR llx ,
+.BR lly ,
+.BR urx ,
+.BR ury .
+.
+.TPx
+.REQ .pso "command-line"
+Execute
+.I command-line
+with
+.MR popen 3
+and interpolate its output.
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .ptr
+Report names and positions of all page location traps to the standard
+error stream.
+.
+.
+.TPx
+.REQ .pvs
+Change to previous post-vertical line spacing.
+.
+.TPx
+.REQ .pvs "\[+-]N"
+Change post-vertical line spacing according to
+.I \[+-]N
+(default scaling unit\~\c
+.scaleindicator p ).
+.
+.TPx
+.REQ .rchar "c1 c2 \fR.\|.\|.\&\fP"
+Remove definition of each ordinary or special character
+.IR c1 ,
+.IR c2 ,
+\&.\|.\|.\& defined by a
+.request .char ,
+.request .fchar ,
+or
+.request .schar
+request.
+.
+.TPx
+.REQ .rd "prompt"
+Read insertion.
+.
+.TPx
+.REQ .return
+Return from a macro.
+.
+.TPx
+.REQ .return "anything"
+Return twice, namely from the macro at the current level and from the
+macro one level higher.
+.
+.TPx
+.REQ .rfschar "f c1 c2 \fR\&.\|.\|.\&\fP"
+Remove the font-specific definitions of glyphs
+.IR c1 ,
+.IR c2 ,
+\&.\|.\|.\& for
+.RI font\~ f .
+.
+.TPx
+.REQ .rj npl
+Break,
+right-align the output of the next productive input line without
+filling,
+then break again.
+.
+.TPx
+.REQ .rj npl
+Break,
+right-align the output of the next
+.I npl
+productive input lines without filling,
+then break again.
+.
+If
+.I npl
+\[<=] 0,
+stop right-aligning.
+.
+.TPx
+.REQ .rm "name"
+Remove request, macro, diversion, or string
+.IR name .
+.
+.TPx
+.REQ .rn "old new"
+Rename request, macro, diversion, or string
+.I old
+to
+.IR new .
+.
+.TPx
+.REQ .rnn "reg1 reg2"
+Rename register
+.I reg1
+to
+.IR reg2 .
+.
+.
+.TPx
+.REQ .rr ident
+Remove register
+.IR ident .
+.
+.
+.TPx
+.REQ .rs
+Restore spacing;
+disable no-space mode.
+.
+See
+.BR .ns .
+.
+.TPx
+.REQ .rt
+Return
+.I (upward only)
+to vertical position marked by
+.B .mk
+on the current page.
+.
+.TPx
+.REQ .rt N
+Return
+.I (upward only)
+to vertical position
+.I N
+(default scaling
+unit\~\c
+.scaleindicator v ).
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .schar "c contents"
+Define global fallback character (or glyph)\~\c
+.I c
+as
+.IR contents .
+.
+.
+.TPx
+.REQ .shc
+Reset the soft hyphen character to
+.esc [hy] .
+.
+.
+.TPx
+.REQ .shc c
+Set the soft hyphen character
+.RI to\~ c .
+.
+.
+.TPx
+.REQ .shift n
+In a macro definition,
+left-shift arguments by
+.IR n \~\c
+positions.
+.
+.TPx
+.REQ .sizes "s1 s2 \f[R].\|.\|.\&\f[] sn \f[R][\f[CB]0\f[]]"
+Set available type sizes similarly to the
+.B sizes
+directive in a
+.I DESC
+file.
+.
+Each
+.IR s i
+is interpreted in units of scaled points (\c
+.scaleindicator z ).
+.
+.
+.TPx
+.REQ .so file
+Replace the request's control line with the contents of
+.IR file ,
+\[lq]sourcing\[rq] it.
+.
+.
+.TPx
+.REQ .soquiet file
+As
+.request .so ,
+but no warning is emitted if
+.I file
+does not exist.
+.
+.
+.TPx
+.REQ .sp
+Break and move the next text baseline down by one vee,
+or until springing a page location trap.
+.
+.
+.TPx
+.REQ .sp dist
+Break and move the next text baseline down by
+.IR dist ,
+or until springing a page location trap
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+A negative
+.I dist
+will not reduce the position of the text baseline below zero.
+.
+Prefixing
+.I dist
+with the
+.B \[or]
+operator moves to a position relative to the page top for positive
+.IR N ,
+and the bottom if
+.I N
+is negative;
+in all cases,
+one line height (vee) is added
+.RI to\~ dist .
+.
+.I dist
+is ignored inside a diversion.
+.
+.
+.TPx
+.REQ .special
+Reset global list of special fonts to be empty.
+.
+.TPx
+.REQ .special "s1 s2 \fR\&.\|.\|.\&\fR"
+Fonts
+.IR s1 ,
+.IR s2 ,
+etc.\& are special and are searched for glyphs not in the
+current font.
+.
+.TPx
+.REQ .spreadwarn
+Toggle the spread warning on and off (the default) without changing its
+value.
+.
+.TPx
+.REQ .spreadwarn N
+Emit a
+.B break
+warning if the additional space inserted for each space between words in
+an adjusted output line is greater than or equal to
+.IR N .
+.
+A negative
+.I N
+is treated as 0.
+.
+The default scaling unit is\~\c
+.scaleindicator m .
+.
+At startup,
+.request .spreadwarn
+is inactive and
+.I N
+is
+.scalednumber "3 m" .
+.\" XXX: negative values accepted; retain for future space-squeezing
+.
+.TPx
+.REQ .ss n
+Set minimal inter-word spacing to
+.IR n \~12ths
+of current font's space width.
+.
+.TPx
+.REQ .ss "n m"
+As
+.RB \[lq] .ss\~\c
+.IR n \[rq],
+and set additional inter-sentence space to
+.IR m \~12ths
+of current font's space width.
+.
+.TPx
+.REQ .stringdown stringvar
+Replace each byte in the string named
+.I stringvar
+with its lowercase version.
+.
+.TPx
+.REQ .stringup stringvar
+Replace each byte in the string named
+.I stringvar
+with its uppercase version.
+.
+.TPx
+.REQ .sty "n style"
+Associate abstract
+.I style
+with font position
+.IR n .
+.
+.TPx
+.REQ .substring "str start \fR[\fPend\fR]\fP"
+Replace the string named
+.I str
+with its substring bounded by the indices
+.I start
+and
+.IR end ,
+inclusive.
+.
+Negative indices count backwards from the end of the string.
+.
+.TPx
+.REQ .sv
+As
+.request .ne ,
+but save
+.scalednumber "1 v"
+for output with
+.request .os
+request.
+.
+.TPx
+.REQ .sv d
+As
+.request .ne ,
+but save distance
+.I d
+for later output with
+.request .os
+request
+(default scaling unit\~\c
+.scaleindicator v ).
+.\" XXX: negative values accepted; check AT&T troff
+.
+.TPx
+.REQ .sy "command-line"
+Execute
+.I command-line
+with
+.MR system 3 .
+.
+Unsafe request;
+disabled by default.
+.
+.TPx
+.REQ .ta "n1 n2 \fR\&.\|.\|.\&\fP n\fRn\fP \f[CB]T\f[] r1 r2 \
+\fR\&.\|.\|.\&\fP r\fRn\fP"
+Set tabs at positions
+.IR n1 ,
+.IR n2 ,
+\&.\|.\|.\&,
+.IR n n,
+then set tabs at
+.IR n n+ m \[tmu] r n+ r1
+through
+.IR n n+ m \[tmu] r n+ r n,
+where
+.I m
+increments from 0,
+1,
+2,
+\&.\|.\|.\& to the output line length.
+.
+Each
+.IR n \~argument
+can be prefixed with
+.RB a\~\[lq] + \[rq]
+to place the tab stop
+.I ni
+at a distance relative to the previous,
+.IR n ( i \-1).
+.
+Each argument
+.IR ni \~or\~ ri
+can be suffixed with a letter to align text within the tab column
+bounded by tab stops
+.IR i \~and\~ i +1;
+.RB \[lq] L \[rq]
+for left-aligned
+(the default),
+.RB \[lq] C \[rq]
+for centered,
+and
+.RB \[lq] R \[rq]
+for right-aligned.
+.
+.br
+.ne 4v \" XXX: should need only 2v
+.TPx
+.REQ .tag
+.TQ
+.REQ .taga
+Reserved for internal use.
+.
+.TPx
+.REQ .tc
+Unset tab repetition character.
+.
+.TPx
+.REQ .tc "c"
+Set tab repetition character
+.RI to\~ c
+(default: none).
+.
+.TPx
+.REQ .ti "\[+-]N"
+Temporarily indent next output line
+(default scaling unit\~\c
+.scaleindicator m ).
+.
+.TPx
+.REQ .tkf "font s1 n1 s2 n2"
+Enable track kerning for
+.IR font .
+.
+.TPx
+.REQ .tl "\f[CB]\[aq]\f[]left\f[CB]\[aq]\f[]center\f[CB]\[aq]\f[]right\
+\f[CB]\[aq]\f[]"
+Format three-part title.
+.
+.TPx
+.REQ .tm message
+Write
+.I message,
+followed by a newline,
+to the standard error stream.
+.
+.TPx
+.REQ .tm1 message
+As
+.request .tm ,
+but an initial neutral double quote in
+.I message
+is removed,
+allowing it to contain leading spaces.
+.
+.TPx
+.REQ .tmc message
+As
+.request .tm1 ,
+without emitting a newline.
+.
+.TPx
+.REQ .tr "abcd\fR\&.\|.\|.\&\fP"
+Translate ordinary or special characters
+.I a
+to
+.IR b ,
+.I c
+to
+.IR d ,
+and so on prior to output.
+.
+.TPx
+.REQ .trf file
+Transparently output the contents of
+.I file.
+.
+Unlike
+.request .cf ,
+invalid input characters in
+.I file
+are rejected.
+.
+.TPx
+.REQ .trin "abcd\fR\&.\|.\|.\&\fP"
+As
+.request .tr ,
+except that
+.request .asciify
+ignores the translation when a diversion is interpolated.
+.
+.TPx
+.REQ .trnt "abcd\fR\&.\|.\|.\&\fP"
+As
+.request .tr ,
+except that translations are suppressed in the argument to
+.esc ! .
+.
+.TPx
+.REQ .troff
+Make the conditional expressions
+.B t
+true and
+.B n
+false.
+.
+.TPx
+.REQ .uf font
+Set underline font used by
+.request .ul
+to
+.I font.
+.
+.
+.TPx
+.REQ .ul
+Underline
+(italicize in
+.I troff
+mode)
+the output of the next productive input line.
+.
+.
+.TPx
+.REQ .ul npl
+Underline
+(italicize in
+.I troff
+mode)
+the output of the next
+.I npl
+productive input line.
+.
+If
+.IR npl =0,
+stop underlining.
+.
+.
+.TPx
+.REQ .unformat "diversion"
+Unformat space characters and tabs in
+.IR diversion ,
+preserving font information.
+.
+.
+.TPx
+.REQ .vpt
+Enable vertical position traps.
+.
+.
+.TPx
+.REQ .vpt\~0
+Disable vertical position traps.
+.
+.
+.TPx
+.REQ .vs
+Change to previous vertical spacing.
+.
+.TPx
+.REQ .vs "\[+-]N"
+Set vertical spacing to
+.I \[+-]N
+(default scaling unit\~\c
+.scaleindicator p ).
+.
+.
+.TPx
+.REQ .warn
+Enable all warning categories.
+.
+.
+.TPx
+.REQ .warn\~0
+Disable all warning categories.
+.
+.
+.TPx
+.REQ .warn n
+Enable warnings in categories whose codes sum
+.RI to\~ n ;
+.\" TODO: Move that table here, perhaps.
+see
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.TPx
+.REQ .warnscale "su"
+Set scaling unit used in certain warnings \" `output_warning()`
+to
+.I su
+(one of
+.BR u ,
+.BR i ,
+.BR c ,
+.BR p ,
+or
+.BR P ;
+default:
+.BR i ).
+.
+.
+.TPx
+.REQ .wh vpos
+Remove visible page location trap at
+.I vpos
+(default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TPx
+.REQ .wh "vpos name"
+Plant macro
+.I name
+as page location trap at
+.I vpos
+(default scaling unit\~\c
+.scaleindicator v ),
+removing any visible trap already there.
+.
+.
+.TPx
+.REQ .while "cond-expr anything"
+Repeatedly execute
+.I anything
+unless and until
+.I cond-expr
+evaluates false.
+.
+.
+.TPx
+.REQ .write "stream anything"
+Write
+.I anything
+to the stream named
+.IR stream .
+.
+.TPx
+.REQ .writec "stream anything"
+Similar to
+.request .write
+without emitting a final newline.
+.
+.TPx
+.REQ .writem "stream xx"
+Write contents of macro or string
+.I xx
+to the stream named
+.IR stream .
+.
+.LE
+.
+.
+.\" ====================================================================
+.SH "Escape sequence short reference"
+.\" ====================================================================
+.
+The escape sequences
+.esc \[dq] ,
+.esc # ,
+.esc $ ,
+.esc * ,
+.esc ? ,
+.esc a ,
+.esc e ,
+.esc n ,
+.esc t ,
+.esc g ,
+.esc V ,
+and
+.escarg \& newline
+are interpreted even in copy mode.
+.
+.
+.P
+.LS
+.
+.\" ========= comments =========
+.
+.TP
+.ESC \[dq]
+Comment.
+.
+Everything up to the end of the line is ignored.
+.
+.
+.TP
+.ESC #
+Comment.
+.
+Everything up to and including the next newline is ignored.
+.
+.
+.\" ========= strings =========
+.
+.TP
+.ESC * s
+Interpolate string with one-character
+.RI name\~ s .
+.
+.
+.TP
+.ESC *( st
+Interpolate string with two-character
+.RI name\~ st .
+.
+.
+.TP
+.ESC[] * string
+Interpolate string with name
+.I string
+(of arbitrary length).
+.
+.
+.TP
+.ESC[] * "string arg \fR\&.\|.\|.\fP"
+Interpolate string with name
+.I string
+(of arbitrary length),
+taking
+.I arg
+\&.\|.\|.\&
+as arguments.
+.
+.
+.\" ========= macro arguments =========
+.
+.TP
+.ESC $0
+Interpolate name by which currently executing macro was invoked.
+.
+.
+.TP
+.ESC $ n
+Interpolate macro or string parameter
+.RI numbered\~ n
+.RI (1\|\[<=]\| n \|\[<=]\|9).
+.
+.
+.TP
+.ESC $( nn
+Interpolate macro or string parameter
+.RI numbered\~ nn
+.RI (01\|\[<=]\| nn \|\[<=]\|99).
+.
+.TP
+.ESC[] $ nnn
+Interpolate macro or string parameter
+.RI numbered\~ nnn
+.RI ( nnn \|\[>=]\|1).
+.
+.
+.TP
+.ESC $*
+Interpolate concatenation of all macro or string parameters,
+separated by spaces.
+.
+.
+.TP
+.ESC $@
+Interpolate concatenation of all macro or string parameters,
+with each surrounded by double quotes and separated by spaces.
+.
+.
+.TP
+.ESC $\[ha]
+Interpolate concatenation of all macro or string parameters
+as if they were arguments to the
+.request .ds
+request.
+.
+.
+.\" ========= escaped characters =========
+.
+.
+.TP
+.ESC \[aq]
+is a synonym for
+.esc [aa] ,
+the acute accent special character.
+.
+.
+.TP
+.ESC \[ga]
+is a synonym for
+.esc [ga] ,
+the grave accent special character.
+.
+.
+.TP
+.ESC \-
+is a synonym for
+.esc [\-] ,
+the minus sign special character.
+.
+.
+.TP
+.ESC _
+is a synonym for
+.esc [ul] ,
+the underrule special character.
+.
+.
+.TP
+.ESC %
+Control hyphenation.
+.
+.
+.TP
+.ESC !
+Transparent line.
+.
+The remainder of the input line is interpreted
+(1) when the current diversion is read;
+or
+(2) if in the top-level diversion,
+by the postprocessor
+(if any).
+.
+.
+.TP
+.ESC? anything
+Transparently embed
+.IR anything ,
+read in copy mode,
+in a diversion,
+or unformatted as an output comparand in a conditional expression.
+.
+.
+.\" ========= spaces and fixed-width horizontal motions =========
+.
+.TP
+.ESC \f[I]space
+Move right one word space.
+.
+.
+.TP
+.ESC \[ti]
+Insert an unbreakable,
+adjustable space.
+.
+.
+.TP
+.ESC 0
+Move right by the width of a numeral in the current font.
+.
+.
+.TP
+.ESC |
+Move one-sixth em to the right on typesetters.
+.
+.
+.TP
+.ESC \[ha]
+Move one-twelfth em to the right on typesetters.
+.
+.
+.TP
+.ESC &
+Interpolate a dummy character.
+.
+.
+.TP
+.ESC )
+Interpolate a dummy character that is transparent to end-of-sentence
+recognition.
+.
+.
+.TP
+.ESC /
+Apply italic correction.
+.
+Use between an immediately adjacent oblique glyph on the left and an
+upright glyph on the right.
+.
+.
+.TP
+.ESC ,
+Apply left italic correction.
+.
+Use between an immediately adjacent upright glyph on the left and an
+oblique glyph on the right.
+.
+.
+.TP
+.ESC :
+Non-printing break point
+(similar to
+.esc % ,
+but never produces a hyphen glyph).
+.
+.
+.TP
+.ESC "" newline
+Continue current input line on the next.
+.
+.
+.\" ========= structuring =========
+.
+.TP
+.ESC {
+Begin conditional input.
+.
+.TP
+.ESC }
+End conditional input.
+.
+.\" ========= longer escape names =========
+.
+.TP
+.ESC ( gl
+Interpolate glyph with two-character name
+.IR gl .
+.
+.
+.TP
+.ESC[] "" glyph
+Interpolate glyph with name
+.I glyph
+(of arbitrary length).
+.
+.
+.TP
+.ESC[] "" "base-char comp \fR\&.\|.\|."
+Interpolate composite glyph constructed from
+.I base-char
+and each component
+.IR comp .
+.
+.
+.TP
+.ESC[] "" "\f[CB]char\f[]nnn"
+Interpolate glyph of eight-bit encoded character
+.IR nnn ,
+where
+.RI 0\|\[<=]\| nnn \|\[<=]\|255.
+.
+.
+.TP
+.ESC[] "" "\f[CB]u\f[]nnnn\f[R][\f[]n\f[R][\f[]n\f[R]]]"
+Interpolate glyph of Unicode character with code point
+.IR nnnn [ n [ n ]]
+in uppercase hexadecimal.
+.
+.
+.TP
+.ESC[] "" "\f[CB]u\f[]base-char\f[R][\f[]\f[CB]_\f[]\
+combining-component\f[R]].\|.\|."
+Interpolate composite glyph from Unicode character
+.I base-char
+and
+.IR combining-components .
+.
+.
+.\" ========= alphabetical escape sequences =========
+.
+.TP
+.ESC a
+Interpolate a leader in copy mode.
+.
+.TP
+.ESCq A anything
+Interpolate 1 if
+.I anything
+is a valid identifier,
+and\~0 otherwise.
+.
+.TP
+.ESCq b string
+Build bracket:
+pile a sequence of glyphs corresponding to each character in
+.I string
+vertically,
+and center it vertically on the output line.
+.
+.TP
+.ESCq B anything
+Interpolate 1 if
+.I anything
+is a valid numeric expression,
+and\~0 otherwise.
+.
+.
+.TP
+.ESC c
+Continue output line at next input line.
+.
+.
+.TP
+.ESCq C glyph
+As
+.esc[] "" glyph ,
+but compatible with other
+.I troff \" generic
+implementations.
+.
+.
+.TP
+.ESC d
+Move downward \[12]\~em on typesetters.
+.\" XXX: No current groff nroff-mode output driver supports half-line
+.\" motions.
+.\" (\[12]\~line in
+.\" .I nroff
+.\" contingent on device support).
+.
+.
+.TP
+.ESCq D drawing-command
+See subsection \[lq]Drawing commands\[rq] below.
+.
+.
+.TP
+.ESC e
+Interpolate the escape character.
+.
+.
+.TP
+.ESC E
+As
+.esc e ,
+but not interpreted in copy mode.
+.
+.TP
+.ESC fP
+Select previous font mounting position
+(abstract style or font);
+same as
+.RB \[lq] .ft \[rq]
+or
+.RB \[lq] .ft\~P \[rq].
+.
+.TP
+.ESC f F
+Select font mounting position,
+abstract style,
+or font with one-character name or one-digit
+.RI position\~ F .
+.
+.IR F \~cannot
+be
+.BR P .
+.
+.TP
+.ESC f( ft
+Select font mounting position,
+abstract style,
+or font with two-character name or two-digit
+.RI position\~ ft .
+.
+.TP
+.ESC[] f font
+Select font mounting position,
+abstract style,
+or font with arbitrarily long name or position
+.IR font .
+.
+.I font
+cannot be
+.BR P .
+.
+.TP
+.ESC[] f ""
+Select previous font mounting position
+(abstract style or font).
+.
+.TP
+.ESC F f
+Set default font family to that with one-character
+.RI name\~ f .
+.
+.TP
+.ESC F( fm
+Set default font family to that with two-character
+.RI name\~ fm .
+.
+.TP
+.ESC[] F fam
+Set default font family to that with arbitrarily long name
+.IR fam .
+.
+.TP
+.ESC[] F ""
+Set default font family to previous value.
+.
+.TP
+.ESC g r
+Interpolate format of register with one-character
+.RI name\~ r .
+.
+.
+.TP
+.ESC g( rg
+Interpolate format of register with two-character
+.RI name\~ rg .
+.
+.
+.TP
+.ESC[] g reg
+Interpolate format of register with arbitrarily long name
+.IR reg .
+.
+.
+.TP
+.ESCq h N
+Horizontally move the drawing position by
+.IR N \~ems
+(or specified units);
+.B \[or]
+may be used.
+.
+Positive motion is rightward.
+.
+.
+.TP
+.ESCq H N
+Set height of current font to
+.IR N \~scaled
+points
+(or specified units).
+.
+.
+.TP
+.ESC k r
+Mark horizontal position in one-character register
+.RI name\~ r .
+.
+.TP
+.ESC k( rg
+Mark horizontal position in two-character register
+.RI name\~ rg .
+.
+.
+.TP
+.ESC[] k reg
+Mark horizontal position in register with arbitrarily long
+.RI name\~ reg .
+.
+.
+.TP
+.ESCq l N\/\f[R][\f[]c\f[R]]
+Draw horizontal line of length
+.I N
+with character
+.B c
+(default:
+.BR \[rs][ru] ;
+default scaling unit\~\c
+.scaleindicator m ).
+.
+.
+.
+.TP
+.ESCq L N\/\f[R][\f[]c\f[R]]
+Draw vertical line of length
+.I N
+with character
+.B c
+(default:
+.BR \[rs][br] ;
+default scaling unit\~\c
+.scaleindicator v ).
+.
+.
+.TP
+.ESC m c
+Set stroke color to that with one-character
+.RI name\~ c .
+.
+.
+.TP
+.ESC m( cl
+Set stroke color to that with two-character
+.RI name\~ cl .
+.
+.
+.TP
+.ESC[] m color
+Set stroke color to that with arbitrarily long
+.RI name\~ color .
+.
+.
+.TP
+.ESC[] m ""
+Restore previous stroke color.
+.
+.
+.TP
+.ESC M c
+Set fill color to that with one-character
+.RI name\~ c .
+.
+.
+.TP
+.ESC M( cl
+Set fill color to that with two-character
+.RI name\~ cl .
+.
+.
+.TP
+.ESC[] M color
+Set fill color to that with arbitrarily long
+.RI name\~ color .
+.
+.
+.TP
+.ESC[] M ""
+Restore previous fill color.
+.
+.
+.br
+.ne 4v \" XXX: why not 3v?
+.TP
+.ESC n r
+Interpolate contents of register with one-character
+.RI name\~ r .
+.
+.
+.TP
+.ESC n( rg
+Interpolate contents of register with two-character
+.RI name\~ rg .
+.
+.
+.TP
+.ESC[] n reg
+Interpolate contents of register with arbitrarily long
+.RI name\~ reg .
+.
+.
+.TP
+.ESCq N n
+Interpolate glyph with
+.RI index\~ n
+in the current font.
+.
+.TP
+.ESCq o abc\f[R].\|.\|.\f[]
+Overstrike centered glyphs of characters
+.IR a ,
+.IR b ,
+.IR c ,
+and so on.
+.
+.TP
+.ESC O0
+At the outermost suppression level,
+disable emission of glyphs and geometric objects to the output
+driver.
+.
+.
+.TP
+.ESC O1
+At the outermost suppression level,
+enable emission of glyphs and geometric objects to the output driver.
+.
+.
+.TP
+.ESC O2
+At the outermost suppression level,
+enable glyph and geometric primitive emission to the output driver and
+write to the standard error stream the page number,
+four bounding box registers enclosing glyphs written since the previous
+.B \[rs]O
+escape sequence,
+the page offset,
+line length,
+image file name
+(if any),
+horizontal and vertical device motion quanta,
+and input file name.
+.
+.
+.TP
+.ESC O3
+Begin a nested suppression level.
+.
+.
+.TP
+.ESC O4
+End a nested suppression level.
+.
+.
+.TP
+.ESC[] O "\f[CB]5\f[]Pfile"
+At the outermost suppression level,
+write the name
+.I file
+to the standard error stream at
+.RI position\~ P ,
+which must be one of
+.BR l ,
+.BR r ,
+.BR c ,
+or
+.BR i .
+.
+.
+.TP
+.ESC p
+Break output line at next word boundary;
+adjust if applicable.
+.
+.
+.TP
+.ESC r
+Move \[lq]in reverse\[rq] (upward) 1\~em.
+.
+.
+.TP
+.ESCq R "name\~\[+-]N"
+Set,
+increment,
+or decrement register
+.I name
+.RI by\~ N .
+.
+.
+.TP
+.ESC s \[+-]N
+Set/increase/decrease the type size to/by
+.I N
+scaled points.
+.
+.I N
+must be a single digit;
+0 restores the previous type size.
+.
+(In compatibility mode only,
+a non-zero
+.I N
+must be in the range 4\[en]39.)
+.
+Otherwise,
+as
+.request .ps
+request.
+.
+.
+.TP
+.ESC s( \[+-]N
+.TQ
+.fam C
+.BI \es \[+-] ( N
+.fam
+Set/increase/decrease the type size to/by
+.I N
+scaled points;
+.I N
+is a two-digit number \[>=]1.
+.
+As
+.request .ps
+request.
+.
+.
+.TP
+.ESC[] s \[+-]N
+.TQ
+.fam C
+.BI \es \[+-] [ N ]
+.fam
+.TQ
+.ESCq s \[+-]N
+.TQ
+.fam C
+.BI \es \[+-] \[aq] N \[aq]
+.fam
+Set/increase/decrease the type size to/by
+.I N
+scaled points.
+.
+As
+.request .ps
+request.
+.
+.
+.TP
+.ESCq S N
+Slant output glyphs by
+.I N
+degrees;
+the direction of text flow is positive.
+.
+.
+.TP
+.ESC t
+Interpolate a tab in copy mode.
+.
+.
+.TP
+.ESC u
+Move upward \[12]\~em on typesetters.
+.\" XXX: No current groff nroff-mode output driver supports half-line
+.\" motions.
+.\" (\[12]\~line in
+.\" .I nroff
+.\" contingent on device support).
+.
+.
+.TP
+.ESCq v N
+Vertically move the drawing position by
+.IR N \~vees
+(or specified units);
+.B \[or]
+may be used.
+.
+Positive motion is downward.
+.
+.
+.TP
+.ESC V e
+Interpolate contents of environment variable with one-character
+.RI name\~ e .
+.
+.
+.TP
+.ESC V( ev
+Interpolate contents of environment variable with two-character
+.RI name\~ ev .
+.
+.
+.TP
+.ESC[] V env
+Interpolate contents of environment variable with arbitrarily long
+.RI name\~ env .
+.
+.
+.TP
+.ESCq w anything
+Interpolate width of
+.IR anything ,
+formatted in a dummy environment.
+.
+.
+.TP
+.ESCq x N
+Increase vertical spacing of pending output line by
+.IR N \~vees
+(or specified units;
+negative before,
+positive after).
+.
+.TP
+.ESCq X anything
+Write
+.I anything
+to
+.I @g@troff
+output as a device control command.
+.
+Within
+.IR anything ,
+the escape sequences
+.BR \[rs]& ,
+.BR \[rs]) ,
+.BR \[rs]% ,
+and
+.B \[rs]:
+are ignored;
+.BI \[rs] space
+and
+.B \[rs]\[ti]
+are converted to single space characters;
+and
+.B \[rs]\[rs]
+has its escape character stripped.
+.
+So that the basic Latin subset of the Unicode character
+set can be reliably encoded in
+.I anything,
+the special character escape sequences
+.BR \[rs]\- ,
+.BR \[rs][aq] ,
+.BR \[rs][dq] ,
+.BR \[rs][ga] ,
+.BR \[rs][ha] ,
+.BR \[rs][rs] ,
+and
+.B \[rs][ti]
+are mapped to basic Latin characters;
+see
+.MR groff_char @MAN7EXT@ .
+.
+For this transformation,
+character translations and special character definitions are ignored.
+.
+.TP
+.ESC Y n
+Write contents of macro or string
+.I n
+to
+.I @g@troff
+output as a device control command.
+.
+.TP
+.ESC Y( nm
+Write contents of macro or string
+.I nm
+to
+.I @g@troff
+output as a device control command.
+.
+.TP
+.ESC[] Y name
+Write contents of macro or string
+.I name
+to
+.I @g@troff
+output as a device control command.
+.
+.TP
+.ESC z c
+Format character
+.I c
+with zero width\[em]without advancing the drawing position.
+.
+.TP
+.ESCq Z anything
+Save the drawing position,
+format
+.IR anything ,
+then restore it.
+.LE
+.
+.
+.\" ====================================================================
+.SS "Drawing commands"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Drawing
+.\" commands".
+Drawing commands direct the output device to render geometrical objects
+rather than glyphs.
+.
+Specific devices may support only a subset,
+or may feature additional ones;
+consult the man page for the output driver in use.
+.
+Terminal devices in particular implement almost none.
+.
+.
+.P
+Rendering starts at the drawing position;
+when finished,
+the drawing position is left at the rightmost point of the object,
+even for closed figures,
+except where noted.
+.
+GNU
+.I troff \" GNU
+draws stroked (outlined) objects with the stroke color,
+and shades filled ones with the fill color.
+.
+See section \[lq]Colors\[rq] above.
+.
+Coordinates
+.I h
+and
+.I v
+are horizontal and vertical motions relative to the drawing position
+or previous point in the command.
+.
+The default scaling unit for horizontal measurements
+(and diameters of circles)
+.RB is\~ m ;
+for vertical ones,
+.BR v .
+.
+.
+.P
+Circles,
+ellipses,
+and polygons can be drawn stroked or filled.
+.
+These are independent properties;
+if you want a filled,
+stroked figure,
+you must draw the same figure twice using each drawing command.
+.
+A filled figure is always smaller than an outlined one because the
+former is drawn only within its defined area,
+whereas strokes have a line thickness
+(set with
+.BR \[rs]D\[aq]t\[aq] ).
+.
+.
+.P
+.LS
+.TP
+.BI \[rs]D\[aq]\[ti]\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+Draw B-spline to each point in sequence,
+leaving drawing position at
+.RI ( hn ,\~ vn ).
+.
+.\" XXX: This is one case where a valid coordinate pair could be off the
+.\" page (even negative) and we need to discuss this frankly.
+.TP
+.BI \[rs]D\[aq]a\~ "hc vc h v" \[aq]
+Draw circular arc centered at
+.RI ( hc ,\~ vc )
+counterclockwise from the drawing position to a point
+.RI ( h ,\~ v )
+relative to the center.
+.
+.RI ( hc ,\~ vc )
+is adjusted to the point nearest the perpendicular bisector of the arc's
+chord.
+.
+.TP
+.BI \[rs]D\[aq]c\~ "d" \[aq]
+Draw circle of diameter
+.I d
+with its leftmost point at the drawing position.
+.
+.TP
+.BI \[rs]D\[aq]C\~ "d" \[aq]
+As
+.BR \[rs]D\[aq]C\[aq] ,
+but the circle is filled.
+.
+.TP
+.BI \[rs]D\[aq]e\~ "h v" \[aq]
+Draw ellipse of width
+.I h
+and height
+.I v
+with its leftmost point at the drawing position.
+.
+.\" How do we draw an ellipse with rotated axes?
+.TP
+.BI \[rs]D\[aq]E\~ "h v" \[aq]
+As
+.BR \[rs]D\[aq]e\[aq] ,
+but the ellipse is filled.
+.
+.\" XXX: Df and dF are taken care of by \M and .defcolor.
+.TP
+.BI \[rs]D\[aq]l\~ "h v" \[aq]
+Draw line from the drawing position to
+.RI ( h ,\~ v ).
+.
+.TP
+.BI \[rs]D\[aq]p\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+Draw polygon with vertices at drawing position and each point
+in sequence.
+.
+GNU
+.I troff \" GNU
+closes the polygon by drawing a line from
+.RI ( hn ,\~ vn )
+back to the initial drawing position.
+.
+.\" XXX: This would be the "STUPID_DRAWING_POSITIONING" complained of in
+.\" src/libs/libdriver/input.cpp. It is neither the rightmost point
+.\" of the figure nor the initial drawing position that GNU troff
+.\" automatically returned to to close the figure.
+Afterward,
+the drawing position is left at
+.RI ( hn ,\~ vn ).
+.
+.TP
+.BI \[rs]D\[aq]P\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+As
+.BR \[rs]D\[aq]p\[aq] ,
+but the polygon is filled.
+.
+.TP
+.BI \[rs]D\[aq]t\~ "n" \[aq]
+Set stroke thickness of geometric objects to
+.RI to\~ n
+basic units.
+.
+A zero
+.I n
+selects the minimal supported thickness.
+.
+A negative
+.I n
+selects a thickness proportional to the type size;
+this is the default.
+.LE
+.\" END Keep (roughly) parallel with groff.texi node "Drawing
+.\" commands".
+.
+.
+.\" ====================================================================
+.SS "Device control commands"
+.\" ====================================================================
+.
+The
+.B .device
+and
+.B .devicem
+requests,
+and
+.B \[rs]X
+and
+.B \[rs]Y
+escape sequences,
+enable documents to pass information directly to a postprocessor.
+.
+These are useful for
+exercising device-specific capabilities that the
+.I groff
+language does not abstract or generalize;
+such functions include the embedding of hyperlinks and image files.
+.
+Device-specific functions are documented in
+each output driver's man page.
+.
+.
+.\" ====================================================================
+.SH Strings
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Strings".
+.I groff
+supports strings primarily for user convenience.
+.
+Conventionally,
+if one would define a macro only to interpolate a small amount of text,
+without invoking requests or calling any other macros,
+one defines a string instead.
+.
+Only one string is predefined by the language.
+.
+.
+.TPx
+.STRING .T
+Contains the name of the output device
+(for example,
+.RB \[lq] utf8 \[rq]
+or
+.RB \[lq] pdf \[rq] ).
+.
+.
+.P
+The
+.request .ds
+request creates a string with a specified name and contents.
+.
+If the identifier named by
+.request .ds
+already exists as an alias,
+the target of the alias is redefined.
+.
+If
+.request .ds
+is called with only one argument,
+the named string becomes empty.
+.
+Otherwise,
+.I @g@troff
+stores the remainder of the control line in copy mode;
+see subsection \[lq]Copy mode\[rq] below.
+.
+.
+.P
+The
+.esc *
+escape sequence dereferences a string's name,
+interpolating its contents.
+.
+If the name does not exist,
+it is defined as empty,
+nothing is interpolated,
+and a warning in category
+.RB \%\[lq] mac \[rq]
+is emitted.
+.
+See section \[lq]Warnings\[rq] in
+.MR @g@troff 1 .
+.
+The bracketed interpolation form accepts arguments that are handled as
+macro arguments are;
+see section \[lq]Calling macros\[rq] above.
+.
+In contrast to macro calls,
+however,
+if a closing bracket
+.B ]
+occurs in a string argument,
+that argument must be enclosed in double quotes.
+.
+.B \[rs]*
+is interpreted even in copy mode.
+.
+When defining strings,
+argument interpolations must be escaped if they are to reference
+parameters from the calling context;
+see section \[lq]Parameters\[rq] below.
+.
+.
+.P
+An initial neutral double quote
+.B \[dq]
+in the string contents is stripped to allow embedding of leading spaces.
+.
+Any other
+.B \[dq]
+is interpreted literally,
+but it is wise to use the special character escape sequence
+.B \[rs][dq]
+instead if the string might be interpolated as part of a macro argument;
+see section \[lq]Calling macros\[rq] above.
+.
+Strings are not limited to a single input line of text.
+.BI \[rs] newline
+works just as it does elsewhere.
+.
+The resulting string is stored
+.I without
+the newlines.
+.
+Care is therefore required when interpolating strings while filling is
+disabled.
+.
+It is not possible to embed a newline in a string that will be
+interpreted as such when the string is interpolated.
+.
+To achieve that effect,
+use
+.B \[rs]*
+to interpolate a macro instead.\" see @ref{Punning Names}.
+.
+.
+.P
+The
+.request .as
+request is similar to
+.request .ds
+but appends to a string instead of redefining it.
+.
+If
+.request .as
+is called with only one argument,
+no operation is performed
+(beyond dereferencing the string).
+.
+.
+.P
+Because strings are similar to macros,
+they too can be defined to suppress AT&T
+.I troff \" AT&T
+compatibility mode enablement when interpolated;
+see section \[lq]Compatibility mode\[rq] below.
+.
+The
+.request .ds1
+request defines a string that suspends compatibility mode when the
+string is later interpolated.
+.
+.request .as1
+is likewise similar to
+.BR .as ,
+with compatibility mode suspended when the appended portion of the
+string is later interpolated.
+.
+.
+.P
+.B Caution:
+Unlike other requests,
+the second argument to these requests consumes the remainder of the
+input line,
+including trailing spaces.
+.
+Ending string definitions
+(and appendments)
+with a comment,
+even an empty one,
+prevents unwanted space from creeping into them during source document
+maintenance.
+.
+.
+.br
+.ne 3v
+.P
+Several requests exist to perform rudimentary string operations.
+.
+Strings can be queried
+(\c
+.request .length )
+and modified
+(\c
+.request .chop ,
+.request .substring ,
+.request .stringup ,
+.request .stringdown ),
+and their names can be manipulated through renaming,
+removal,
+and aliasing
+(\c
+.request .rn ,
+.request .rm ,
+.request .als).
+.
+.
+.P
+When a request,
+macro,
+string,
+or diversion is aliased,
+redefinitions and appendments \[lq]write through\[rq] alias names.
+.
+To replace an alias with a separately defined object,
+you must use the
+.B rm
+request on its name first.
+.\" END Keep (roughly) parallel with groff.texi node "Strings".
+.
+.
+.\" ====================================================================
+.SH Registers
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Registers".
+In the
+.I roff
+language,
+numbers can be stored in
+.I registers.
+.
+Many built-in registers exist,
+supplying anything from the date to details of formatting parameters.
+.
+You can also define your own.
+.
+See section \[lq]Identifiers\[rq] above for information on constructing
+a valid name for a register.
+.
+.
+.P
+Define registers and update their values with the
+.B nr
+request or the
+.B \[rs]R
+escape sequence.
+.
+.
+.P
+Registers can also be incremented or decremented by a configured amount
+at the time they are interpolated.
+.
+The value of the increment is specified with a third argument to the
+.request .nr
+request,
+and a special interpolation syntax,
+.BI \[rs]n \[+-]
+is used to alter and then retrieve
+the register's value.
+.
+Together,
+these features are called
+.IR auto-increment .
+.
+(A negative auto-increment can be
+considered an \[lq]auto-decrement\[rq].)
+.
+.
+.P
+Many predefined registers are available.
+.
+In the following presentation,
+the register interpolation syntax
+.BI \[rs]n[ name ]
+is used to refer to a register
+.I name
+to clearly distinguish it from a string or request
+.IR name .
+.
+The register name space is separate from that used for requests,
+macros,
+strings,
+and diversions.
+.
+Bear in mind that the symbols
+.B \[rs]n[]
+are
+.I not
+part of the register name.
+.\" END Keep (roughly) parallel with groff.texi node "Registers".
+.
+.
+.\" ====================================================================
+.SS "Read-only registers"
+.\" ====================================================================
+.
+Predefined registers whose identifiers start with a dot are read-only.
+.
+Many are Boolean-valued.
+.
+Some are string-valued,
+meaning that they interpolate text.
+.
+A register name
+(without the dot)
+is often associated with a request of the same name;
+exceptions are noted.
+.
+.
+.P
+.LS
+.
+.TP 15n
+.REG .$
+Count of arguments passed to currently interpolated macro or string.
+.
+.TP
+.REG .a
+Amount of extra post-vertical line space;
+see
+.esc x .
+.
+.TP
+.REG .A
+Approximate output is being formatted (Boolean-valued);
+see
+.I @g@troff
+.B \-a
+option.
+.
+.TP
+.REG .b
+Font emboldening offset;
+see
+.request .bd .
+.
+.TP
+.REG .br
+The normal control character was used to call the currently interpolated
+macro (Boolean-valued).
+.
+.TP
+.REG .c
+Input line number;
+see
+.request .lf
+and
+.register \f[R]\[lq]\f[]c.\f[R]\[rq]\f[] .
+.
+.TP
+.REG .C
+Compatibility mode is enabled (Boolean-valued);
+see
+.request .cp .
+.
+Always false when processing
+.request .do ;
+see
+.register .cp .
+.
+.TP
+.REG .cdp
+Depth of last glyph formatted in the environment;
+.\" TODO: Give page a discussion of glyph properties and move this.
+positive if glyph extends below the baseline.
+.
+.TP
+.REG .ce
+Count of output lines remaining to be centered.
+.
+.TP
+.REG .cht
+Height of last glyph formatted in the environment;
+.\" TODO: Give page a discussion of glyph properties and move this.
+positive if glyph extends above the baseline.
+.
+.TP
+.REG .color
+Color output is enabled (Boolean-valued).
+.
+.TP
+.REG .cp
+Within
+.request .do ,
+the saved value of compatibility mode;
+see
+.register .C .
+.
+.TP
+.REG .csk
+Skew of the last glyph formatted in the environment;
+.\" TODO: Give page a discussion of glyph properties and move this.
+skew is how far to the right of the center of a glyph the center of an
+accent over that glyph should be placed.
+.
+.TP
+.REG .d
+Vertical drawing position in diversion.
+.
+.TP
+.REG .ev
+Name of environment (string-valued).
+.
+.TP
+.REG .f
+Mounting position of selected font;
+see
+.request .ft
+and
+.esc f .
+.
+.TP
+.REG .F
+Name of input file (string-valued);
+see
+.request .lf .
+.
+.TP
+.REG .fam
+Name of default font family (string-valued).
+.
+.TP
+.REG .fn
+Resolved name of selected font (string-valued);
+see
+.request .ft
+and
+.esc f .
+.
+.TP
+.REG .fp
+Next non-zero free font mounting position index.
+.
+.TP
+.REG .g
+Always true in GNU
+.I troff \" GNU
+(Boolean-valued).
+.
+.TP
+.REG .h
+Text baseline high-water mark on page or in diversion.
+.
+.TP
+.REG .H
+Horizontal motion quantum of output device in basic units.
+.
+.TP
+.REG .height
+Font height;
+see
+.esc H .
+.
+.TP
+.REG .hla
+Hyphenation language in environment (string-valued).
+.
+.TP
+.REG .hlc
+Count of immediately preceding consecutive hyphenated lines in
+environment.
+.
+.TP
+.REG .hlm
+Maximum quantity of consecutive hyphenated lines allowed in environment.
+.
+.TP
+.REG .hy
+Automatic hyphenation mode in environment.
+.
+.TP
+.REG .hym
+Hyphenation margin in environment.
+.
+.TP
+.REG .hys
+Hyphenation space adjustment threshold in environment.
+.
+.TP
+.REG .i
+Indentation amount;
+see
+.request .in .
+.
+.TP
+.REG .in
+Indentation amount applicable to the pending output line;
+see
+.request .ti .
+.
+.TP
+.REG .int
+Previous output line was \[lq]interrupted\[rq] or continued with
+.esc c
+(Boolean-valued).
+.
+.TP
+.REG .j
+Adjustment mode encoded as an integer;
+see
+.request .ad
+and
+.request .na .
+.
+Do not interpret or perform arithmetic on its value.
+.
+.TP
+.REG .k
+Horizontal drawing position relative to indentation.
+.
+.TP
+.REG .kern
+Pairwise kerning is enabled (Boolean-valued).
+.
+.TP
+.REG .l
+Line length;
+see
+.request .ll .
+.
+.TP
+.REG .L
+Line spacing;
+see
+.request .ls .
+.
+.TP
+.REG .lg
+Ligature mode.
+.
+.TP
+.REG .linetabs
+Line-tabs mode is enabled (Boolean-valued).
+.
+.TP
+.REG .ll
+Line length applicable to the pending output line.
+.
+.TP
+.REG .lt
+Title length.
+.
+.TP
+.REG .m
+Stroke color (string-valued);
+see
+.request .gcolor
+and
+.esc m .
+.
+Empty if the stroke color is the default.
+.
+.TP
+.REG .M
+Fill color (string-valued);
+see
+.request .fcolor
+and
+.esc M .
+.
+Empty if the fill color is the default.
+.
+.TP
+.REG .n
+Length of formatted output on previous output line.
+.
+.TP
+.REG .ne
+Amount of vertical space required by last
+.request .ne
+that caused a trap to be sprung;
+also see
+.register .trunc .
+.
+.TP
+.REG .nm
+Output line numbering is enabled (Boolean-valued).
+.
+.TP
+.REG .nn
+Count of output lines remaining to have numbering suppressed.
+.
+.TP
+.REG .ns
+No-space mode is enabled (Boolean-valued).
+.
+.TP
+.REG .o
+Page offset;
+see
+.request .po .
+.
+.TP
+.REG .O
+Output suppression nesting level;
+see
+.esc O .
+.
+.TP
+.REG .p
+Page length;
+see
+.request .pl .
+.
+.TP
+.REG .P
+The page is selected for output (Boolean-valued);
+see
+.I @g@troff
+.B \-o
+option.
+.
+.TP
+.REG .pe
+Page ejection is in progress (Boolean-valued).
+.
+.TP
+.REG .pn
+Number of the next page.
+.
+.TP
+.REG .ps
+Type size in scaled points.
+.
+.TP
+.REG .psr
+Most recently requested type size in scaled points;
+see
+.request .ps
+and
+.esc s .
+.
+.TP
+.REG .pvs
+Post-vertical line spacing.
+.
+.TP
+.REG .R
+Count of available unused registers;
+always 10,000 in GNU
+.IR troff . \" GNU
+.
+.TP
+.REG .rj
+Count of lines remaining to be right-aligned.
+.
+.TP
+.REG .s
+Type size in points as a decimal fraction (string-valued);
+see
+.request .ps
+and
+.esc s .
+.
+.TP
+.REG .slant
+Slant of font in degrees;
+see
+.esc S .
+.
+.TP
+.REG .sr
+Most recently requested type size in points as a decimal fraction
+(string-valued);
+see
+.request .ps
+and
+.esc s .
+.
+.TP
+.REG .ss
+Size of minimal inter-word space in twelfths of the space width of the
+selected font.
+.
+.TP
+.REG .sss
+Size of additional inter-sentence space in twelfths of the space width
+of the selected font.
+.
+.TP
+.REG .sty
+Selected abstract style (string-valued);
+see
+.request .ft
+and
+.esc f .
+.
+.TP
+.REG .t
+Distance to next vertical position trap;
+see
+.request .wh
+and
+.request .ch .
+.
+.TP
+.REG .T
+An output device was explicitly selected (Boolean-valued);
+see
+.I @g@troff
+.B \-T
+option.
+.
+.TP
+.REG .tabs
+Representation of tab settings suitable for use as argument to
+.request .ta
+(string-valued).
+.
+.TP
+.REG .trunc
+Amount of vertical space truncated by the most recently sprung
+vertical position trap,
+or,
+if the trap was sprung by an
+.request .ne ,
+minus the amount of vertical motion produced by
+.request .ne ;
+also see
+.register .ne .
+.
+.TP
+.REG .u
+Filling is enabled (Boolean-valued);
+see
+.request .fi
+and
+.request .nf .
+.
+.TP
+.REG .U
+Unsafe mode is enabled (Boolean-valued);
+see
+.I @g@troff
+.B \-U
+option.
+.
+.TP
+.REG .v
+Vertical line spacing;
+see
+.request .vs .
+.
+.TP
+.REG .V
+Vertical motion quantum of the output device in basic units.
+.
+.TP
+.REG .vpt
+Vertical position traps are enabled (Boolean-valued).
+.
+.TP
+.REG .w
+Width of previous glyph formatted in the environment.
+.
+.TP
+.REG .warn
+Sum of the numeric codes of enabled warning categories.
+.
+.TP
+.REG .x
+Major version number of the running
+.I @g@troff
+formatter.
+.
+.TP
+.REG .y
+Minor version number of the running
+.I @g@troff
+formatter.
+.
+.TP
+.REG .Y
+Revision number of the running
+.I @g@troff
+formatter.
+.
+.TP
+.REG .z
+Name of diversion (string-valued).
+.
+Empty if output is directed to the top-level diversion.
+.
+.TP
+.REG .zoom
+Zoom multiplier of current font
+(in thousandths;
+zero if no magnification);
+see
+.request .fzoom .
+.LE
+.
+.
+.\" ====================================================================
+.SS "Writable predefined registers"
+.\" ====================================================================
+.
+Several registers are predefined but also modifiable;
+some are updated upon interpretation of certain requests or escape
+sequences.
+.
+Date- and time-related registers are set to the local time as determined
+by
+.MR localtime 3
+when the formatter launches.
+.
+This initialization can be overridden by
+.I \%SOURCE_DATE_EPOCH
+and
+.IR TZ ;
+see section \[lq]Environment\[rq] of
+.MR groff @MAN1EXT@ .
+.
+.
+.P
+.LS
+.
+.TP 15n
+.REG $$
+Process ID of
+.IR @g@troff .
+.
+.TP
+.REG %
+Page number.
+.
+.TP
+.REG c.
+Input line number.
+.
+.TP
+.REG ct
+Union of character types of each glyph rendered into dummy environment
+by
+.esc w .
+.
+.TP
+.REG dl
+Width of last closed diversion.
+.
+.TP
+.REG dn
+Height of last closed diversion.
+.
+.TP
+.REG dw
+Day of the week (1\[en]7;
+1 is Sunday).
+.
+.TP
+.REG dy
+Day of the month (1\[en]31).
+.
+.TP
+.REG hours
+Count of hours elapsed since midnight (0\[en]23).
+.
+.TP
+.REG hp
+Horizontal drawing position relative to start of input line.
+.
+.TP
+.REG llx
+Lower-left
+.I x
+coordinate
+(in PostScript units)
+of PostScript image;
+see
+.request .psbb .
+.
+.TP
+.REG lly
+Lower-left
+.I y
+coordinate
+(in PostScript units)
+of PostScript image;
+see
+.request .psbb .
+.
+.TP
+.REG ln
+Output line number;
+see
+.request .nm .
+.
+.TP
+.REG lsn
+Count of leading spaces on input line.
+.
+.TP
+.REG lss
+Amount of horizontal space corresponding to leading spaces on input
+line.
+.
+.TP
+.REG minutes
+Count of minutes elapsed in the hour (0\[en]59).
+.
+.TP
+.REG mo
+Month of the year (1\[en]12).
+.
+.TP
+.REG nl
+Vertical drawing position.
+.
+.TP
+.REG opmaxx
+.TP
+.REG opmaxy
+.TP
+.REG opminx
+.TP
+.REG opminy
+These four registers mark the top left- and bottom right-hand corners of
+a rectangle encompassing all formatted output on the page.
+.
+They are reset to \-1 by
+.B \[rs]O0
+or
+.BR \[rs]O1 .
+.
+.TP
+.REG rsb
+As
+.register sb ,
+adding maximum glyph height to measurement.
+.
+.TP
+.REG rst
+As
+.register st ,
+adding maximum glyph depth to measurement.
+.
+.TP
+.REG sb
+Maximum displacement of text baseline below its original position
+after rendering into dummy environment by
+.esc w .
+.
+.TP
+.REG seconds
+Count of seconds elapsed in the minute (0\[en]60). \" not 59; see POSIX
+.
+.TP
+.REG skw
+Skew of last glyph rendered into dummy environment by
+.esc w .
+.
+.TP
+.REG slimit
+The maximum depth of
+.IR @g@troff 's
+internal input stack.
+.
+If \[<=]0,
+there is no limit:
+recursion can continue until available memory is exhausted.
+.
+The default is 1,000.
+.
+.TP
+.REG ssc
+Subscript correction of last glyph rendered into dummy environment by
+.esc w .
+.
+.TP
+.REG st
+Maximum displacement of text baseline above its original position
+after rendering into dummy environment by
+.esc w .
+.
+.TP
+.REG systat
+Return value of
+.I system()
+function; see
+.request .sy .
+.
+.TP
+.REG urx
+Upper-right
+.I x
+coordinate
+(in PostScript units)
+of PostScript image;
+see
+.request .psbb .
+.
+.TP
+.REG ury
+Upper-right
+.I y
+coordinate
+(in PostScript units)
+of PostScript image;
+see
+.request .psbb .
+.
+.TP
+.REG year
+Gregorian year.
+.
+.TP
+.REG yr
+Gregorian year minus 1900.
+.LE
+.
+.
+.\" ====================================================================
+.SH "Using fonts"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Using Fonts".
+In digital typography,
+a
+.I font
+is a collection of characters in a specific typeface that a device can
+render as glyphs at a desired size.
+.
+(Terminals and some output devices have fonts that render at only one or
+two sizes.
+.
+As examples of the latter,
+take the
+.I groff
+.B lj4
+device's
+Lineprinter,
+and
+.BR lbp 's
+Courier and Elite faces.)
+.
+.
+A
+.I roff
+formatter can change typefaces at any point in the text.
+.
+The basic faces are a set of
+.I styles
+combining upright and slanted shapes with normal and heavy stroke
+weights:
+.RB \[lq] R \[rq],
+.RB \[lq] I \[rq],
+.RB \[lq] B \[rq],
+and
+.RB \[lq] BI \[rq]\[em]\c
+these stand for
+.I roman,
+.I bold,
+.I italic,
+and
+.I bold-italic.
+.
+For linguistic text,
+GNU
+.I troff \" GNU
+groups typefaces into
+.I families
+containing each of these styles.
+.
+(Font designers prepare families such that the styles share esthetic
+properties.)
+.
+A
+.I "text font"
+is thus often a family combined with a style,
+but it need not be:
+consider the
+.B ps
+and
+.B pdf
+devices'
+.B ZCMI
+(Zapf Chancery Medium italic)\[em]\c
+often,
+no other style of Zapf Chancery Medium is provided.
+.
+On typesetting devices,
+at least one
+.I "special font"
+is available,
+comprising
+.I unstyled
+glyphs for mathematical operators and other purposes.
+.
+.
+.P
+Like AT&T
+.I troff, \" AT&T
+GNU
+.I troff \" GNU
+does not itself load or manipulate a digital font file;
+.\" @footnote{Historically, the fonts @code{troff}s dealt with were not
+.\" Free Software or, as with the Graphic Systems C/A/T, did not even
+.\" exist in the digital domain.}
+instead it
+works with a
+.I font description file
+that characterizes it,
+including its glyph repertoire and the
+.I metrics
+(dimensions) of each glyph.
+.
+This information permits the formatter to accurately place glyphs with
+respect to each other.
+.
+Before using a font description,
+the formatter associates it with a
+.I "mounting position,"
+a place in an ordered list of available typefaces.
+.
+So that a document need not be strongly coupled to a specific font
+family,
+in GNU
+.I troff \" GNU
+an output device can associate a style in the abstract sense with a
+mounting position.
+.
+Thus the default family can be combined with a style dynamically,
+producing a
+.I "resolved font name."
+.
+.
+.P
+Fonts often have trademarked names,
+and even Free Software fonts can require renaming upon modification.
+.
+.I groff
+maintains a convention that a device's serif font family is given the
+name
+.B T
+(\[lq]Times\[rq]),
+its sans-serif family
+.B H
+(\[lq]Helvetica\[rq]),
+and its
+monospaced family
+.B C
+(\[lq]Courier\[rq]).
+.
+Historical inertia has driven
+.IR groff 's
+font identifiers to short uppercase abbreviations of font names,
+as with
+.BR TR ,
+.BR TB ,
+.BR TI ,
+.BR TBI ,
+and a special font
+.BR S .
+.
+.
+.P
+The default family used with abstract styles can be changed at any time;
+initially,
+it
+.RB is\~ T .
+.
+Typically,
+abstract styles are arranged in the first four mounting positions in the
+order shown above.
+.
+The default mounting position,
+and therefore style,
+is always
+.B 1
+.RB ( R ).
+.
+By issuing appropriate formatter instructions,
+you can override these defaults before your document writes its first
+glyph.
+.
+.
+.P
+Terminal output devices cannot change font families and lack special
+fonts.
+.
+They support style changes by overstriking,
+or by altering ISO\~6429/\:ECMA-48
+.I "graphic renditions"
+(character cell attributes).
+.\" END Keep (roughly) parallel with groff.texi node "Using Fonts".
+.
+.
+.\" ====================================================================
+.SH Hyphenation
+.\" ====================================================================
+.
+When filling,
+.I groff
+hyphenates words as needed at user-specified and automatically
+determined hyphenation points.
+.
+Explicitly hyphenated words such as \[lq]mother-in-law\[rq] are always
+eligible for breaking after each of their hyphens.
+.
+The hyphenation
+.RB character\~ \[rs]%
+and non-printing break
+.RB point\~ \[rs]:
+escape sequences may be used to control the hyphenation and breaking of
+individual words.
+.
+The
+.B .hw
+request sets user-defined hyphenation points for specified words at any
+subsequent occurrence.
+.
+Otherwise,
+.I groff
+determines hyphenation points automatically by default.
+.
+.
+.P
+Several requests influence automatic hyphenation.
+.
+Because conventions vary,
+a variety of hyphenation modes is available to the
+.B .hy
+request;
+these determine whether hyphenation will apply to a word prior to
+breaking a line at the end of a page
+(more or less;
+see below for details),
+and at which positions within that word automatically determined
+hyphenation points are permissible.
+.
+The default is
+.RB \[lq] 1 \[rq]
+for historical reasons,
+but this is not an appropriate value for the English hyphenation
+patterns used by
+.IR groff ;
+localization macro files loaded by
+.I troffrc
+and macro packages often override it.
+.
+.
+.TP
+.B 0
+disables hyphenation.
+.
+.
+.TP
+.B 1
+enables hyphenation except after the first and before the last character
+of a word.
+.
+.
+.P
+The remaining values \[lq]imply\[rq]
+.BR 1 ;
+that is,
+they enable hyphenation under the same conditions as
+.RB \[lq] ".hy 1" \[rq],
+and then apply or lift restrictions relative to that basis.
+.
+.
+.TP
+.B 2
+disables hyphenation of the last word on a page.
+.
+(Hyphenation is prevented if the next page location trap is closer to
+the vertical drawing position than the next text baseline would be.
+.
+See section \[lq]Traps\[rq] below.)
+.
+.
+.TP
+.B 4
+disables hyphenation before the last two characters of a word.
+.
+.
+.TP
+.B 8
+disables hyphenation after the first two characters of a word.
+.
+.
+.TP
+.B 16
+enables hyphenation before the last character of a word.
+.
+.
+.TP
+.B 32
+enables hyphenation after the first character of a word.
+.
+.
+.P
+Apart from value\~2,
+restrictions imposed by the hyphenation mode are
+.I not
+respected for words whose hyphenations have been specified with the
+hyphenation character
+.RB (\[lq] \|\[rs]% \[rq]
+by default)
+or the
+.B .hw
+request.
+.
+.
+.P
+Nonzero values are additive.
+.
+For example,
+mode\~12 causes
+.I groff
+to hyphenate neither the last two nor the first two characters of a
+word.
+.
+Some values cannot be used together because they contradict;
+for instance,
+values 4 and\~16,
+and values 8 and\~32.
+.
+As noted,
+it is superfluous to add\~1 to any non-zero even mode.
+.
+.
+.br
+.ne 2v
+.P
+The places within a word that are eligible for hyphenation are
+determined by language-specific data
+.RB ( .hla ,
+.BR .hpf ,
+and
+.BR .hpfa )
+and lettercase relationships
+.RB ( .hcode
+and
+.BR .hpfcode ).
+.
+Furthermore,
+hyphenation of a word might be suppressed due to a limit on
+consecutive hyphenated lines
+.RB ( .hlm ),
+a minimum line length threshold
+.RB ( .hym ),
+or because the line can instead be adjusted with additional inter-word
+space
+.RB ( .hys ).
+.
+.
+.\" ====================================================================
+.SH Localization
+.\" ====================================================================
+.
+The set of hyphenation patterns is associated with the hyphenation
+language set by the
+.B .hla
+request.
+.
+The
+.B .hpf
+request is usually invoked by a localization file loaded by the
+.I troffrc
+file.
+.
+.I groff
+provides localization files for several languages;
+see
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.\" ====================================================================
+.SH "Writing macros"
+.\" ====================================================================
+.
+The
+.B .de
+request defines a macro named for its argument.
+.
+If that name already exists as an alias,
+the target of the alias is redefined;
+see section \[lq]Strings\[rq] above.
+.
+.I @g@troff
+enters \[lq]copy mode\[rq]
+(see below),
+storing subsequent input lines as the definition.
+.
+If the optional second argument is not specified,
+the definition ends with the control line
+.RB \[lq] .. \[rq]\&
+(two dots).
+.
+Alternatively,
+a second argument names a macro whose call syntax ends the definition;
+this \[lq]end macro\[rq] is then called normally.
+.
+Spaces or tabs are permitted after the first control character in the
+line containing this ending token,
+but a tab immediately after the token prevents its recognition as the
+end of a macro definition.
+.
+Macro definitions can be nested if they use distinct end macros or if
+their ending tokens are sufficiently escaped.
+.
+An end macro need not be defined until it is called.
+.
+This fact enables a nested macro definition to begin inside one macro
+and end inside another.
+.
+.
+.P
+Variants of
+.B .de
+disable compatibility mode and/or indirect the names of the macros
+specified for definition or termination:
+these are
+.BR .de1 ,
+.BR .dei ,
+and
+.BR .dei1 .
+.
+Append to macro definitions with
+.BR .am ,
+.BR .am1 ,
+.BR .ami ,
+and
+.BR .ami1 .
+.
+The
+.BR .als ,
+.BR .rm ,
+and
+.B .rn
+requests create an alias of,
+remove,
+and rename a macro,
+respectively.
+.
+.B .return
+stops the execution of a macro immediately,
+returning to the enclosing context.
+.
+.
+.\" ====================================================================
+.SS Parameters
+.\" ====================================================================
+.
+Macro call and string interpolation parameters can be accessed using
+escape sequences starting with
+.RB \[lq] \|\[rs]$ \[rq].
+.
+The
+.B \[rs]n[.$]
+read-only register stores the count of parameters available to a macro
+or string;
+its value can be changed by the
+.B .shift
+request,
+which dequeues parameters from the current list.
+.
+The
+.B \[rs]$0
+escape sequence interpolates the name by which a macro was called.
+.
+Applying string interpolation to a macro does not change this name.
+.
+.
+.\" ====================================================================
+.SS "Copy mode"
+.\" ====================================================================
+.
+When
+.I @g@troff
+processes certain requests,
+most importantly those which define or append to a macro or string,
+it does so in
+.IR "copy mode" :
+it copies the characters of the definition into a dedicated storage
+region,
+interpolating the escape sequences
+.BR \[rs]n ,
+.BR \[rs]g ,
+.BR \[rs]$ ,
+.BR \[rs]* ,
+.BR \[rs]V ,
+and
+.B \[rs]?\&
+normally;
+interpreting
+.BI \[rs] newline
+immediately;
+discarding comments
+.B \[rs]"
+and
+.BR \[rs]# ;
+interpolating the current leader,
+escape,
+or tab character with
+.BR \[rs]a ,
+.BR \[rs]e ,
+and
+.BR \[rs]t ,
+respectively;
+and storing all other escape sequences in an encoded form.
+.
+The complement of copy mode\[em]a
+.I roff
+formatter's behavior when not defining or appending to a macro,
+string,
+or diversion\[em]where all macros are interpolated,
+requests invoked,
+and valid escape sequences processed immediately upon recognition,
+can be termed
+.IR "interpretation mode" .
+.
+.
+.P
+The escape character,
+.B \[rs]
+by default,
+can escape itself.
+.
+This enables you to control whether a given
+.BR \[rs]n ,
+.BR \[rs]g ,
+.BR \[rs]$ ,
+.BR \[rs]* ,
+.BR \[rs]V ,
+or
+.B \[rs]?\&
+escape sequence is interpreted at the time the macro containing it is
+defined,
+or later when the macro is called.
+.
+.
+.P
+You can think of
+.B \[rs]\[rs]
+as a \[lq]delayed\[rq] backslash;
+it is the escape character followed by a backslash from which the escape
+character has removed its special meaning.
+.
+Consequently,
+.B \[rs]\[rs]
+is not an escape sequence in the usual sense.
+.
+In any escape sequence
+.BI \[rs] X
+that
+.I @g@troff
+does not recognize,
+the escape character is ignored and
+.IR X \~is
+output.
+.
+An unrecognized escape sequence causes a warning in category
+.RB \%\[lq] escape \[rq],
+with two exceptions,
+.B \[rs]\[rs]
+being one.
+.
+The other is
+.BR \[rs]. ,
+which escapes the control character.
+.
+It is used to permit nested macro definitions to end without a named
+macro call to conclude them.
+.
+Without a syntax for escaping the control character,
+this would not be possible.
+.
+.I roff
+documents should not use the
+.B \[rs]\[rs]
+or
+.B \[rs].\&
+character sequences outside of copy mode;
+they serve only to obfuscate the input.
+.
+Use
+.B \[rs]e
+to represent the escape character,
+.B \[rs][rs]
+to obtain a backslash glyph,
+and
+.B \[rs]&
+before
+.B .\&
+and
+.B \[aq]
+where
+.I @g@troff
+expects them as control characters if you mean to use them literally.
+.
+.
+.br
+.ne 2v
+.P
+Macro definitions can be nested to arbitrary depth.
+.
+In
+.RB \[lq] \|\[rs]\[rs] \[rq],
+each escape character is interpreted twice\[em]once in copy mode,
+when the macro is defined,
+and once in interpretation mode,
+when the macro is called.
+.
+This fact leads to exponential growth in the quantity of escape
+characters required to delay interpolation of
+.BR \[rs]n ,
+.BR \[rs]g ,
+.BR \[rs]$ ,
+.BR \[rs]* ,
+.BR \[rs]V ,
+and
+.B \[rs]?\&
+at each nesting level.
+.
+An alternative is to use
+.BR \[rs]E ,
+which represents an escape character that is not interpreted in copy
+mode.
+.
+Because
+.B \[rs].\&
+is not a true escape sequence,
+we can't use
+.B \[rs]E
+to keep
+.RB \[lq] ..\& \[rq]
+from ending a macro definition prematurely.
+.
+If the multiplicity of backslashes complicates maintenance,
+use end macros.
+.
+.
+.\" ====================================================================
+.SH Traps
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Traps".
+.I Traps
+are locations in the output,
+or conditions on the input that,
+when reached or fulfilled,
+call a specified macro.
+.
+A
+.I "vertical position trap"
+calls a macro when the formatter's vertical drawing position reaches or
+passes,
+in the downward direction,
+a certain location on the output page or in a diversion.
+.
+Its applications include setting page headers and footers,
+body text in multiple columns,
+and footnotes.
+.
+These traps can occur at a given location on the page
+.RB ( .wh ,\~ .ch );
+at a given location in the current diversion
+.RB ( .dt )\[em]together,
+these are known as
+vertical position traps,
+which can be disabled and re-enabled
+.RB ( .vpt ).
+.
+.
+.P
+A diversion is not formatted in the context of a page,
+so it lacks page location traps;
+instead it can have a
+.I "diversion trap."
+.
+There can exist at most one such vertical position trap per diversion.
+.
+.
+.P
+Other kinds of trap can be planted
+at a blank line
+.RB ( .blm );
+at a line with leading space characters
+.RB ( .lsm );
+after a certain number of productive input lines
+.RB ( .it ,\~ .itc );
+or at the end of input
+.RB ( .em ).
+.
+Macros called by traps are passed no arguments.
+.
+Setting a trap is also called
+.I planting
+one.
+.
+It is said that a trap is
+.I sprung
+if its condition is fulfilled.
+.\" END Keep (roughly) parallel with groff.texi node "Traps".
+.
+.
+.br
+.ne 5v
+.P
+Registers associated with trap management include
+vertical position trap enablement status
+.RB ( \[rs]n[.vpt] ),
+distance to the next trap
+.RB ( \[rs]n[.t] ),
+amount of needed
+.RB ( .ne -requested)
+space that caused the most recent vertical position trap to be sprung
+.RB ( \[rs]n[.ne] ),
+amount of needed space truncated from the amount requested
+.RB ( \[rs]n[.trunc] ),
+page ejection status
+.RB ( \[rs]n[.pe] ),
+and
+leading space count
+.RB ( \[rs]n[.lsn] )
+with its corresponding amount of motion
+.RB ( \[rs]n[.lss] ).
+.
+.
+.\" ====================================================================
+.SS "Page location traps"
+.\" ====================================================================
+.
+A
+.I "page location trap"
+is a vertical position trap that applies to
+the page;
+that is,
+to undiverted output.
+.
+Many can be present;
+manage them with
+the
+.B wh
+and
+.B ch
+requests.
+.
+Non-negative page locations given to these requests set the trap
+relative to the top of the page;
+negative values set the trap relative to the bottom of the page.
+.
+It is not possible to plant a trap less than one basic unit from the
+page bottom:
+a location of \[lq]\-0\[rq] is interpreted as \[lq]0\[rq],
+the top of the page.
+.
+An existing
+.I visible
+trap
+(see below)
+at the same location is removed;
+this is
+.BR .wh 's
+sole function if its second argument is missing.
+.
+.
+.P
+A trap is sprung only if it is
+.I visible,
+meaning that its location is reachable on the page and it is not hidden
+by another trap at the same location already planted there.
+.
+(A trap planted at \[lq]20i\[rq] or \[lq]\-30i\[rq] will not be sprung
+on a page of length \[lq]11i\[rq].)
+.
+.
+.P
+A trap above the top or at or below the bottom of the page can be made
+visible by either moving it into the page area or increasing the page
+length so that the trap is on the page.
+.
+Negative trap values always use the
+.I current
+page length;
+they are not converted to an absolute vertical position.
+.
+Use
+.B .ptr
+to dump page location traps to the standard error stream;
+their positions are reported in basic units.
+.
+.
+.br
+.ne 6v
+.\" ====================================================================
+.SS "The implicit page trap"
+.\" ====================================================================
+.
+An
+.I implicit page trap
+always exists in the top-level diversion;
+it works like a trap in some ways but not others.
+.
+Its purpose is to eject the current page and start the next one.
+.
+It has no name,
+so it cannot be moved or deleted with
+.B wh
+or
+.B ch
+requests.
+.
+You cannot hide it by placing another trap at its location,
+and can move it only by redefining the page length with
+.BR .pl .
+.
+Its operation is suppressed when vertical page traps are disabled with
+the
+.B vpt
+request.
+.
+.
+.\" ====================================================================
+.SH Diversions
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Diversions".
+In
+.I roff
+systems it is possible to format text as if for output,
+but instead of writing it immediately,
+one can
+.I divert
+the formatted text into a named storage area.
+.
+It is retrieved later by specifying its name after a control character.
+.
+The same name space is used for such
+.I diversions
+as for strings and macros;
+see section \[lq]Identifiers\[rq] above.
+.
+Such text is sometimes said to be \[lq]stored in a macro\[rq],
+but this coinage obscures the important distinction between macros and
+strings on one hand and diversions on the other;
+the former store
+.I unformatted
+input text,
+and the latter capture
+.I formatted
+output.
+.
+Diversions also do not interpret arguments.
+.
+Applications of diversions include \[lq]keeps\[rq]
+(preventing a page break from occurring at an inconvenient place by
+forcing a set of output lines to be set as a group),
+footnotes,
+tables of contents,
+and indices.
+.
+For orthogonality it is said that GNU
+.I troff \" GNU
+is in the
+.I top-level diversion
+if no diversion is active
+(that is,
+formatted output is being \[lq]diverted\[rq] immediately to the output
+device.
+.
+.
+.P
+Dereferencing an undefined diversion will create an empty one of that
+name and cause a warning in category
+.B mac
+to be emitted.
+(see section \[lq]Warnings\[rq] in
+.MR @g@troff @MAN1EXT@ ).
+.
+A diversion does not exist for the purpose of testing with the
+.B d
+conditional operator until its initial definition ends
+(see subsection \[lq]Conditional expressions\[rq] above).
+.\" The following requests are used to create and alter diversions.
+.\" END Keep (roughly) parallel with groff.texi node "Diversions".
+.
+.
+.P
+The
+.B di
+request creates a diversion,
+including any partially collected line.
+.
+.B da
+appends to a diversion,
+creating one if it does not already exist.
+.
+If the diversion's name already exists as an alias,
+the target of the alias is replaced or appended to;
+see section \[lq]Strings\[rq] above.
+.
+.B box
+and
+.B boxa
+works similarly,
+but ignore partially collected lines.
+.
+Call any of these macros again without an argument to end the diversion.
+.
+.
+.br
+.ne 2v
+.P
+Diversions can be nested.
+.
+The registers
+.BR .d ,
+.BR .z ,
+.BR dn ,
+and
+.B dl
+report information about the current
+(or last closed)
+diversion.
+.
+.B .h
+is meaningful in diversions,
+including the top level.
+.
+.
+.P
+The
+.B \[rs]!\%
+and
+.B \[rs]?\%
+escape sequences and
+.B output
+request escape from a diversion,
+the first two to the enclosing level and the last to the top level.
+.
+This facility is termed
+.IR "transparent embedding" .
+.
+.
+.P
+The
+.B asciify
+and
+.B unformat
+requests reprocess diversions.
+.\" XXX: That's a weak statement. What we need is a `for` request and
+.\" a new conditional operator that tests whether an item in a node list
+.\" is an (otherwise unrepresentable) node. See Savannah #62264.
+.
+.
+.\" ====================================================================
+.SH "Punning names"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Punning names".
+Macros,
+strings,
+and diversions share a name space;
+see section \[lq]Identifiers\[rq] above.
+.
+Internally,
+the same mechanism is used to store them.
+.
+You can thus call a macro with string interpolation syntax and vice
+versa.
+.
+Interpolating a string does not hide existing macro arguments.
+.
+The sequence
+.B \[rs]\[rs]
+can be placed at the end of a line in a macro definition or,
+within a macro definition,
+immediately after the interpolation of a macro as a string to suppress
+the effect of a newline.
+.\" END Keep (roughly) parallel with groff.texi node "Punning names".
+.
+.
+.\" ====================================================================
+.SH Environments
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Environments".
+Environments store most of the parameters that control text processing.
+.
+A default environment named
+.RB \[lq] 0 \[rq]
+exists when
+.I @g@troff
+starts up;
+it is modified by formatting-related requests and escape sequences.
+.
+.
+.P
+You can create new environments and switch among them.
+.
+Only one is current at any given time.
+.
+Active environments are managed using a
+.I stack,
+a data structure supporting \[lq]push\[rq] and \[lq]pop\[rq] operations.
+.
+The current environment is at the top of the stack.
+.
+The same environment name can be pushed onto the stack multiple times,
+possibly interleaved with others.
+.
+Popping the environment stack does not destroy the current environment;
+it remains accessible by name and can be made current again by pushing
+it at any time.
+.
+Environments cannot be renamed or deleted,
+and can only be modified when current.
+.
+To inspect the environment stack,
+use the
+.B pev
+request;
+see section \[lq]Debugging\[rq] below.
+.
+.
+.P
+Environments store the following information.
+.
+.
+.IP \[bu] 2n
+a partially collected line, if any
+.
+.
+.IP \[bu]
+data about the most recently output glyph and line
+(registers
+.BR .cdp ,
+.BR .cht ,
+.BR .csk ,
+.BR .n ,
+.BR .w )
+.
+.
+.IP \[bu]
+typeface parameters
+(size,
+family,
+style,
+height and slant,
+inter-word and inter-sentence space sizes)
+.
+.
+.IP \[bu]
+page parameters
+(line length,
+title length,
+vertical spacing,
+line spacing,
+indentation,
+line numbering,
+centering,
+right-alignment,
+underlining,
+hyphenation parameters)
+.
+.
+.IP \[bu]
+filling enablement;
+adjustment enablement and mode
+.
+.
+.IP \[bu]
+tab stops;
+tab,
+leader,
+escape,
+control,
+no-break control,
+hyphenation,
+and
+margin characters
+.
+.
+.IP \[bu]
+input line traps
+.
+.
+.IP \[bu]
+stroke and fill colors
+.
+.
+.P
+The
+.B ev
+request pushes to and pops from the environment stack,
+while
+.B evc
+copies a named environment's contents to the current one.
+.\" END Keep (roughly) parallel with groff.texi node "Environments".
+.
+.
+.\" ====================================================================
+.SH Underlining
+.\" ====================================================================
+.
+In
+.I RUNOFF
+(see
+.MR roff @MAN7EXT@ ),
+underlining,
+even of lengthy passages,
+was straightforward because only fixed-pitch printing devices were
+targeted.
+.
+Typesetter output posed a greater challenge.
+.
+There exists a
+.I groff
+request
+.B .ul
+(see above)
+that underlines subsequent source lines on terminal devices,
+but on typesetters,
+it selects an italic font style instead.
+.
+.
+The
+.I ms
+macro package
+(see
+.MR groff_ms @MAN7EXT@ )
+offers a macro
+.BR .UL ,
+but it too produces the desired effect only on typesetters,
+and has other limitations.
+.
+.
+.P
+One could adapt
+.IR ms 's
+approach to the construction of a macro as follows.
+.
+.RS
+.EX
+\&.de UNDERLINE
+\&. ie n \[rs]\[rs]$1\[rs]f[I]\[rs]\[rs]$2\[rs]f[P]\[rs]\[rs]$3
+\&. el \[rs]\[rs]$1\[rs]Z\[aq]\[rs]\[rs]$2\[aq]\[rs]v\[aq].25m\[aq]\
+\[rs]D\[aq]l \[rs]w\[aq]\[rs]\[rs]$2\[aq]u 0\[aq]\[rs]v\[aq]\-.25m\
+\[aq]\[rs]\[rs]$3
+\&..
+.EE
+.RE
+.
+If
+.MR doclifter 1
+makes trouble, change the macro name
+.B UNDERLINE
+into some 2-letter word, like
+.BR Ul .
+.
+Moreover,
+change the form of the font selection escape sequence from
+.B \[rs]f[P]
+to
+.BR \[rs]fP .
+.
+.
+.\" ====================================================================
+.SS "Underlining without macro definitions"
+.\" ====================================================================
+.
+If one does not want to use macro definitions,
+e.g.,
+when
+.I doclifter
+gets lost,
+use the following.
+.
+.RS
+.EX
+\&.ds u1 before
+\&.ds u2 in
+\&.ds u3 after
+\&.ie n \[rs]*[u1]\[rs]f[I]\[rs]*[u2]\[rs]f[P]\[rs]*[u3]
+\&.el \[rs]*[u1]\[rs]Z\[aq]\[rs]*[u2]\[aq]\[rs]v\[aq].25m\[aq]\[rs]D\
+\[aq]l \[rs]w\[aq]\[rs]*[u2]\[aq]u 0\[aq]\[rs]v\[aq]\-.25m\[aq]\[rs]*\
+[u3]
+.EE
+.RE
+.
+.ne 2v
+When using
+.IR doclifter ,
+it might be necessary to change syntax forms such as
+.B \e[xy]
+and
+.B \e*[xy]
+to those supported by AT&T
+.IR troff :
+.B \e*(xy
+and
+.BR \e(xy ,
+and so on.
+.
+.
+.P
+Then these lines could look like
+.RS
+.EX
+\&.ds u1 before
+\&.ds u2 in
+\&.ds u3 after
+\&.ie n \[rs]*[u1]\[rs]fI\[rs]*(u2\[rs]fP\[rs]*(u3
+\&.el \[rs]*(u1\[rs]Z\[aq]\[rs]*(u2\[aq]\[rs]v\[aq].25m\[aq]\[rs]D\
+\[aq]l \[rs]w\[aq]\[rs]*(u2\[aq]u 0\[aq]\[rs]v\[aq]\-.25m\[aq]\[rs]*(u3
+.EE
+.RE
+.
+.
+.P
+The result looks like
+.RS
+.ft CR
+before
+\z\[ul]i\
+\z\[ul]n
+after
+.ft R
+.RE
+.
+.
+.\" ====================================================================
+.SS "Underlining by overstriking with \e(ul"
+.\" ====================================================================
+.
+The
+.B \[rs]z
+escape sequence writes a glyph without advancing the
+drawing position,
+enabling overstriking.
+.
+Thus,
+.BI \[rs]z c \[rs](ul
+formats
+.I c
+with an underrule glyph on top of it.
+.
+Video terminals implement the underrule by setting a character cell's
+underline attribute,
+so this technique works in both
+.I nroff \" mode
+and
+.I troff \" mode
+modes.
+.
+.
+.P
+Long words may then look intimidating in the input;
+a clarifying approach might be to use the input line continuation escape
+sequence
+.BI \[rs] newline
+to place each underlined character on its own input line.
+.
+Thus,
+.
+.RS
+.EX
+\&.nf
+\[rs]&\[rs]fB: ${\[rs]fIvar\[rs]fR\[rs]c
+\[rs]zo\[rs](ul\[rs]
+\[rs]zp\[rs](ul\[rs]c
+\[rs]&\[rs]fIvalue\[rs]fB}
+\&.fi
+.EE
+.RE
+.
+produces
+.
+.RS
+.EX
+.BI ": ${" var \c
+\zo\(ul\
+\zp\(ul\c
+.IB value }
+.EE
+.RE
+.
+as output.
+.
+.
+.\" ====================================================================
+.SH "Compatibility mode"
+.\" ====================================================================
+.
+The differences between the
+.I roff
+language recognized by GNU
+.I troff \" GNU
+and that of AT&T
+.IR troff , \" AT&T
+as well as the device,
+font,
+and device-independent intermediate output formats described by
+CSTR\~#54 are documented in
+.MR groff_diff @MAN7EXT@ .
+.
+.I groff
+provides an AT&T compatibility mode.
+.
+The
+.request .cp
+request and registers
+.B .C
+and
+.B .cp
+set and test the enablement of this mode.
+.
+.
+.\" ====================================================================
+.SH Debugging
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Debugging".
+Preprocessors use the
+.B .lf
+request to preserve the identities of line numbers and names of input
+files.
+.
+.I groff
+emits a variety of error diagnostics and supports several categories of
+warning;
+the output of these can be selectively suppressed with
+.B .warn
+(and see the
+.BR \-E ,
+.BR \-w ,
+and
+.B \-W
+options of
+.MR @g@troff @MAN1EXT@ ).
+.
+A trace of the formatter's input processing stack can be emitted when
+errors or warnings occur by means of
+.MR @g@troff @MAN1EXT@ 's
+.B \-b
+option,
+or produced on demand with the
+.request .backtrace
+request.
+.
+.BR .tm ,
+.BR .tmc ,
+and
+.B .tm1
+can be used to emit customized diagnostic messages or for
+instrumentation while troubleshooting.
+.
+.B .ex
+and
+.B .ab
+cause early termination with successful and error exit codes
+respectively,
+to halt further processing when continuing would be fruitless.
+.
+Examine the state of the formatter with requests that write lists of
+defined names\[em]macros,
+strings,
+and
+.RB diversions\[em]( .pm );
+environments
+.RB ( .pev ),
+registers
+.RB ( .pnr ),
+and page location traps
+.RB ( .ptr )
+to the standard error stream.
+.\" END Keep (roughly) parallel with groff.texi node "Debugging".
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+by Trent A.\& Fisher,
+Werner Lemberg,
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+Section \[lq]Underlining\[rq] was primarily written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.ne 2v
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.br
+.ne 4v
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+widely called simply \[lq]CSTR\~#54\[rq],
+documents the language,
+device and font description file formats,
+and device-independent output format
+referred to collectively in
+.I groff
+documentation as
+.RI \[lq]AT&T\~ troff \[rq].
+.
+.
+.br
+.ne 3v
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97
+(CSTR\~#97),
+provides additional insights into the
+device and font description file formats
+and device-independent output format.
+.
+.
+.TP
+.MR groff @MAN1EXT@
+is the preferred interface to the
+.I groff
+system;
+it manages the pipeline that carries a source document through
+preprocessors,
+the
+.I @g@troff
+formatter,
+and an output driver to viewable or printable form.
+.
+It also exhaustively lists the man pages provided with the GNU
+.I roff
+system.
+.
+.
+.TP
+.MR groff_char @MAN7EXT@
+discusses character encoding issues,
+escape sequences that produce glyphs,
+and enumerates
+.IR groff 's
+predefined special character escape sequences.
+.
+.
+.TP
+.MR groff_diff @MAN7EXT@
+covers differences between the
+GNU
+.I troff \" GNU
+formatter,
+its device and font description file formats,
+its device-independent output format,
+and those of AT&T
+.IR troff ,\" AT&T
+whose design it reimplements.
+.
+.
+.TP
+.MR groff_font @MAN5EXT@
+describes the formats of the files that describe devices
+.RI ( DESC )
+and fonts.
+.
+.
+.TP
+.MR groff_tmac @MAN5EXT@
+surveys macro packages provided with
+.IR groff ,
+describes how documents can take advantage of them,
+offers guidance on writing macro packages and using diversions,
+and includes historical information on macro package naming conventions.
+.
+.
+.TP
+.MR roff @MAN7EXT@
+presents a detailed history of
+.I roff
+systems and summarizes concepts common to them.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_7_man_C]
+.do rr *groff_groff_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/groff_char.7.man b/man/groff_char.7.man
new file mode 100644
index 0000000..b3ddb49
--- /dev/null
+++ b/man/groff_char.7.man
@@ -0,0 +1,2282 @@
+'\" t
+.TH groff_char @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_char \- GNU
+.I roff
+special character and glyph repertoire
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff (GNU roff), which is a free software
+.\" project.
+.\"
+.\" 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 of the License, or (at your option) any later
+.\" version.
+.\"
+.\" You should have received a copy of the GNU General Public License
+.\" along with this program.
+.\"
+.\" If not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_char_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU
+.I roff
+typesetting system has a large glyph repertoire suitable for production
+of varied literary,
+professional,
+technical,
+and mathematical documents.
+.
+.I groff
+works with
+.I characters;
+an output device renders
+.I glyphs.
+.
+.IR groff 's
+input character set is restricted to that defined by the standards
+ISO Latin-1
+(ISO 8859-1)
+and CCSID \[lq]code page\[rq] 1047
+(an EBCDIC arrangement of Latin-1).
+.
+For ease of document maintenance in UTF-8 environments,
+it is advisable to use only the Unicode basic Latin code points,
+a subset of all of the foregoing historically referred to as \%US-ASCII,
+.\" Yes, a subset, albeit a permutation as well in the cp1047 case.
+which has only 94 visible,
+printable code points.
+.\" In groff, 0x20 SP is mapped to a space node, not a glyph node, and
+.\" all kinds of special behavior attaches to such nodes, so we count
+.\" only to 94 and not 95 as is often done in other ASCII contexts.
+In
+.I groff,
+these are termed
+.I "ordinary characters."
+.
+Often,
+many more are desired in output.
+.
+.
+.P
+AT&T
+.I troff
+in the 1970s faced a similar problem:
+the available typesetter's glyph repertoire differed from that of the
+computers that controlled it.
+.
+.IR troff 's \" AT&T
+solution was a form of escape sequence known as a
+.I special character
+to access several dozen additional glyphs available in the fonts
+prepared for mounting in the phototypesetter.
+.
+These glyphs were mapped onto a two-character name space for a degree
+of mnemonic convenience;
+for example,
+the escape sequence
+.B \e(aa
+encoded an acute accent and
+.B \e(sc
+a section sign.
+.
+.
+.P
+.I groff
+has lifted historical
+.I roff
+limitations on special character name lengths,
+but recognizes and retains compatibility with the historical names.
+.
+.I groff
+expands the lexicon of glyphs available by name and permits users to
+define their own special character escape sequences with the
+.B char
+request.
+.
+Special character names are
+.I groff
+identifiers;
+see section \[lq]Identifiers\[rq] in
+.MR groff @MAN7EXT@ .
+.
+Our discussion uses the terms \[lq]glyph name\[rq] and \[lq]special
+character name\[rq] interchangeably;
+we assume no character translations or redefinitions.
+.
+.
+.P
+This document lists all of the glyph names predefined by
+.IR groff 's
+font description files and presents the systematic notation by which it
+enables access to arbitrary Unicode code points and construction of
+composite glyphs.
+.
+Glyphs listed may be unavailable,
+or may vary in appearance,
+depending on the output device and font chosen when the page was
+formatted.
+.
+This page was rendered for device
+.B \*[.T]
+using font
+.BR \n[.fn] .
+.
+.
+.P
+A few escape sequences that are not
+.I groff
+special characters also produce glyphs;
+these exist for syntactical or historical reasons.
+.
+.BR \e\[aq] ,
+.BR \e\[ga] ,
+.BR \e\- ,
+and
+.B \e_
+are translated on input to the special character escape sequences
+.BR \e[aa] ,
+.BR \e[ga] ,
+.BR \e[\-] ,
+and
+.BR \e[ul] ,
+respectively.
+.
+Others include
+.BR \e\e ,
+.B \e.\&
+(backslash-dot),
+and
+.BR \ee ;
+see
+.MR groff @MAN7EXT@ .
+.
+A small number of special characters represent glyphs that are not
+encoded in Unicode;
+examples include the baseline rule
+.B \e[ru]
+and the Bell System logo
+.B \e[bs].
+.
+.
+.P
+In
+.IR groff ,
+you can test output device support for any character
+(ordinary or special)
+with the conditional expression operator
+.RB \[lq] c \[rq].
+.
+.RS
+.\" https://www.bell-labs.com/usr/dmr/www/ ("In 1984, ...")
+.EX
+\&.ie c \e[bs] \e{Welcome to the \e[bs] Bell System;
+did you get the Wehrmacht helmet or the Death Star?\e}
+\&.el No Bell System logo.
+.EE
+.RE
+.
+.
+.P
+For brevity in the remainder of this document,
+we shall refer to systems conforming to the
+ISO 646:1991 IRV,
+ISO 8859,
+or
+ISO 10646 (\[lq]Unicode\[rq])
+character encoding standards as \[lq]ISO\[rq] systems,
+and those employing IBM code page 1047 as \[lq]EBCDIC\[rq] systems.
+.
+That said,
+EBCDIC systems that support
+.I groff
+are known to also support UTF-8.
+.
+.
+.P
+While
+.I groff
+accepts eight-bit encoded input,
+not all such code points are valid as input.
+.
+.\" src/libs/libgroff/invalid.cpp
+On ISO platforms,
+character codes
+0,
+11,
+13\[en]31,
+and
+128\[en]159
+are invalid.
+.
+(This is all C0 and C1 controls except for
+SOH through LF
+[Control+A to Control+J],
+and FF
+[Control+L].)
+.
+On EBCDIC platforms,
+0,
+8\[en]9,
+11,
+13\[en]20,
+23\[en]31,
+and
+48\[en]63
+are invalid.
+.
+Some of these code points are used by
+.I groff
+for internal purposes,
+which is one reason it does not support UTF-8 natively.
+.
+.
+.\" ====================================================================
+.SS "Fundamental character set"
+.\" ====================================================================
+.
+The ordinary characters catalogued above,
+plus the space,
+tab,
+newline,
+and leader (Control+A),
+form the fundamental character
+set for
+.I groff
+input;
+anything in the language,
+even over one million code points in Unicode,
+can be expressed using it.
+.
+On ISO systems,
+code points in the range 33\[en]126 comprise a common set of
+printable glyphs in all of the aforementioned ISO character encoding
+standards.
+.
+It is this character set and
+(with some noteworthy exceptions)
+the corresponding glyph repertoire for which AT&T
+.I troff
+was implemented.
+.
+On EBCDIC systems,
+printable characters are in the range 66\[en]201 and 203\[en]254;
+those without counterparts in the ISO range 33\[en]126 are discussed
+in the next subsection.
+.\" From this point, do not talk about numerical character assignments.
+.
+.
+.P
+All of the following characters map to glyphs as you would expect.
+.
+.TS
+center box;
+Lf(CR).
+! # $ % & ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @
+A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] _
+a b c d e f g h i j k l m n o p q r s t u v w x y z { | }
+.TE
+.\" The bottom border of that box is practically kissin' the tittles.
+.if t .sp 0.2v
+.
+The remaining ordinary characters surprise computing professionals and
+others intimately familiar with the ISO character encodings.
+.
+The developers of AT&T
+.I troff
+chose mappings for them that would be useful for typesetting technical
+literature in a broad range of scientific disciplines:
+Bell Labs used the system for preparation of AT&T's patent filings with
+the U.S.\& government.
+.
+Further,
+the prevailing character encoding standard in the 1970s,
+USAS X3.4-1968 (\[lq]ASCII\[rq]),
+deliberately supported semantic ambiguity at some code points,
+and outright substitution at several others,
+to suit the localization demands of various national standards bodies.
+.
+.
+.P
+The table below presents the seven exceptional code points
+with their typical keycap engravings,
+their glyph mappings and semantics in
+.I roff
+systems,
+and the escape sequences producing the Unicode basic Latin character
+they replace.
+.
+The first,
+the neutral double quote,
+is a partial exception because it does represent itself,
+but since the
+.I roff
+language also uses it to quote macro arguments,
+.I groff
+supports a special character escape sequence as an alternative form so
+that the glyph can be easily included in macro arguments without
+requiring the user to master the quoting rules that AT&T
+.I troff
+required in that context.
+.
+(Some requests,
+like
+.BR ds ,
+also treat
+.B \[dq]
+non-literally.)
+.
+Furthermore,
+not all of the special character escape sequences are portable to AT&T
+.I troff
+and all of its descendants;
+these
+.I groff
+extensions are presented using its special character form
+.BR \[rs][] ,
+whereas portable special character escape sequences are shown in the
+traditional
+.B \[rs](
+form.
+.
+.B \[rs]\-
+and
+.B \[rs]e
+are portable to all known
+.IR troff s.
+.
+.B \[rs]e
+means \[lq]the glyph of the current escape character\[rq];
+it therefore can produce unexpected output if the
+.B ec
+request is used.
+.
+On devices with a limited glyph repertoire,
+glyphs in the \[lq]keycap\[rq] and \[lq]appearance\[rq] columns on the
+same row of the table may look identical;
+except for the neutral double quote,
+this will
+.I not
+be the case on more-capable devices.
+.
+Review your document using as many different output devices as possible.
+.
+.
+.P
+.TS
+center box;
+L L L.
+Keycap Appearance and meaning Special character and meaning
+_
+" " neutral double quote \f[CR]\[rs][dq]\f[] neutral double quote
+\[aq] \[cq] closing single quote \f[CR]\[rs][aq]\f[] neutral apostrophe
+\- - hyphen \f[CR]\[rs]\-\f[] or \f[CR]\[rs][\-]\f[] minus sign/Unix dash
+\[rs] (escape character) \f[CR]\[rs]e\f[] or \f[CR]\[rs][rs]\f[] reverse solidus
+\[ha] \[u02C6] modifier circumflex \f[CR]\[rs](ha\f[] circumflex/caret/\[lq]hat\[rq]
+\[ga] \[oq] opening single quote \f[CR]\[rs](ga\f[] grave accent
+\[ti] \[u02DC] modifier tilde \f[CR]\[rs](ti\f[] tilde
+.TE
+.
+.
+.P
+The hyphen-minus is a particularly unfortunate case of overloading.
+.
+Its awkward name in ISO 8859 and later standards reflects the many
+distinguishable purposes to which it had already been put by the 1980s,
+including
+a hyphen,
+a minus sign,
+and
+(alone or in repetition)
+dashes of varying widths.
+.
+For best results in
+.I roff
+systems,
+use the
+.RB \[lq] \- \[rq]
+character in input outside an escape sequence
+.I only
+to mean a hyphen,
+as in the phrase \[lq]long-term\[rq].
+.
+For a minus sign in running text or a Unix command-line option dash,
+use
+.B \[rs]\-
+(or
+.B \[rs][\-]
+in
+.I groff
+if you find it helps the clarity of the source document).
+.
+(Another minus sign,
+for use in mathematical equations,
+is available as
+.BR \[rs][mi] ).
+.
+AT&T
+.I troff
+supported em-dashes as
+.BR \[rs](em ,
+as does
+.IR groff .
+.
+.
+.P
+The special character escape sequence for the apostrophe as a neutral
+single quote is typically needed only in technical content;
+typing words like \[lq]can't\[rq] and \[lq]Anne's\[rq] in a natural way
+will render correctly,
+because in ordinary prose an apostrophe is typeset either as a closing
+single quotation mark or as a neutral single quote,
+depending on the capabilities of the output device.
+.
+By contrast,
+special character escape sequences should be used for quotation marks
+unless portability to limited or historical
+.I troff
+implementations is necessary;
+on those systems,
+the input convention is to pair the grave accent with the apostrophe for
+single quotes,
+and to double both characters for double quotes.
+.
+AT&T
+.I troff
+defined no special characters for quotation marks or the apostrophe.
+.
+Repeated single quotes
+(\[oq]\[oq]thus\[cq]\[cq])
+will be visually distinguishable from double quotes
+(\[lq]thus\[rq])
+on terminal devices,
+and perhaps on others
+(depending on the font selected).
+.
+.TS
+tab(@) center box;
+L L.
+AT&T \f[I]troff\f[] input@recommended \f[I]groff\f[] input
+_
+.T&
+Lf(CR) Lf(CR).
+A Winter\[aq]s Tale@A Winter\[aq]s Tale
+\[ga]U.K.\& outer quotes\[aq]@\[rs][oq]U.K.\& outer quotes\[rs][cq]
+\[ga]U.K.\& \[ga]\[ga]inner\[aq]\[aq] quotes\[aq]\
+@\[rs][oq]U.K.\& \[rs][lq]inner\[rs][rq] quotes\[rs][cq]
+\[ga]\[ga]U.S.\& outer quotes\[aq]\[aq]\
+@\[rs][lq]U.S.\& outer quotes\[rs][rq]
+\[ga]\[ga]U.S.\& \[ga]inner\[aq] quotes\[aq]\[aq]\
+@\[rs][lq]U.S.\& \[rs][oq]inner\[rs][cq] quotes\[rs][rq]
+.TE
+.\" Keep bottom border of box from sitting on the ascenders below.
+.if t .sp 0.2v
+.
+If you frequently require quotation marks in your document,
+see if the macro package you're using supplies strings or macros to
+facilitate quotation,
+or define them yourself
+(except in man pages).
+.
+.
+.P
+Using Unicode basic Latin characters to compose boxes and lines is
+ill-advised.
+.
+.I roff
+systems have special characters for drawing horizontal and vertical
+lines;
+see subsection \[lq]Rules and lines\[rq] below.
+.
+Preprocessors like
+.MR @g@tbl @MAN1EXT@
+and
+.MR @g@pic @MAN1EXT@
+draw boxes and will produce the best possible output for the device,
+falling back to basic Latin glyphs only when necessary.
+.
+.
+.\" ====================================================================
+.SS "Eight-bit encodings and Latin-1 supplement"
+.\" ====================================================================
+.
+ISO 646 is a seven-bit code encoding 128 code points;
+eight-bit codes are twice the size.
+.
+ISO 8859-1 and code page 1047 allocated the additional space to what
+Unicode calls \[lq]C1 controls\[rq]
+(control characters)
+and the \[lq]Latin-1 supplement\[rq].
+.
+The C1 controls are neither printable nor usable as
+.I groff
+input.
+.
+.
+.P
+Two Latin-1 supplement characters are handled specially on input.
+.
+.I @g@troff
+never produces them as output.
+.
+.
+.TP
+NBSP
+encodes a no-break space;
+it is mapped to
+.BR \[rs]\[ti] ,
+the adjustable non-breaking space escape sequence.
+.
+.
+.TP
+SHY
+encodes a soft hyphen;
+it is mapped to
+.BR \[rs]% ,
+the hyphenation control escape sequence.
+.
+.
+.P
+The remaining characters in the Latin-1 supplement represent
+themselves.
+.
+Although they can be specified directly with the keyboard on systems
+configured to use Latin-1 as the character encoding,
+it is more portable,
+both to other
+.I roff
+systems and to UTF-8 environments,
+to use their special character escape sequences,
+shown below.
+.
+The glyph descriptions we use are non-standard in some cases,
+for brevity.
+.
+.
+.P
+.TS
+L2 Lf(CR)1 L L2 Lf(CR)1 L.
+\[r!] \e[r!] inverted exclamation mark \[~N] \e[\[ti]N] N tilde
+\[ct] \e[ct] cent sign \[`O] \e[\[ga]O] O grave
+\[Po] \e[Po] pound sign \['O] \e[\[aq]O] O acute
+\[Cs] \e[Cs] currency sign \[^O] \e[\[ha]O] O circumflex
+\[Ye] \e[Ye] yen sign \[~O] \e[\[ti]O] O tilde
+\[bb] \e[bb] broken bar \[:O] \e[:O] O dieresis
+\[sc] \e[sc] section sign \[mu] \e[mu] multiplication sign
+\[ad] \e[ad] dieresis accent \[/O] \e[/O] O slash
+\[co] \e[co] copyright sign \[`U] \e[\[ga]U] U grave
+\[Of] \e[Of] feminine ordinal indicator \['U] \e[\[aq]U] U acute
+\[Fo] \e[Fo] left double chevron \[^U] \e[\[ha]U] U circumflex
+\[no] \e[no] logical not \[:U] \e[:U] U dieresis
+\[rg] \e[rg] registered sign \['Y] \e[\[aq]Y] Y acute
+\[a-] \e[a\-] macron accent \[TP] \e[TP] uppercase thorn
+\[de] \e[de] degree sign \[ss] \e[ss] lowercase sharp s
+\[+-] \e[+\-] plus-minus \[`a] \e[\[ga]a] a grave
+\[S2] \e[S2] superscript two \['a] \e[\[aq]a] a acute
+\[S3] \e[S3] superscript three \[^a] \e[\[ha]a] a circumflex
+\[aa] \e[aa] acute accent \[~a] \e[\[ti]a] a tilde
+\[mc] \e[mc] micro sign \[:a] \e[:a] a dieresis
+\[ps] \e[ps] pilcrow sign \[oa] \e[oa] a ring
+\[pc] \e[pc] centered period \[ae] \e[ae] ae ligature
+\[ac] \e[ac] cedilla accent \[,c] \e[,c] c cedilla
+\[S1] \e[S1] superscript one \[`e] \e[\[ga]e] e grave
+\[Om] \e[Om] masculine ordinal indicator \['e] \e[\[aq]e] e acute
+\[Fc] \e[Fc] right double chevron \[^e] \e[\[ha]e] e circumflex
+\[14] \e[14] one quarter symbol \[:e] \e[:e] e dieresis
+\[12] \e[12] one half symbol \[`i] \e[\[ga]i] i grave
+\[34] \e[34] three quarters symbol \['i] \e[\[aq]i] e acute
+\[r?] \e[r?] inverted question mark \[^i] \e[\[ha]i] i circumflex
+\[`A] \e[\[ga]A] A grave \[:i] \e[:i] i dieresis
+\['A] \e[\[aq]A] A acute \[Sd] \e[Sd] lowercase eth
+\[^A] \e[\[ha]A] A circumflex \[~n] \e[\[ti]n] n tilde
+\[~A] \e[\[ti]A] A tilde \[`o] \e[\[ga]o] o grave
+\[:A] \e[:A] A dieresis \['o] \e[\[aq]o] o acute
+\[oA] \e[oA] A ring \[^o] \e[\[ha]o] o circumflex
+\[AE] \e[AE] AE ligature \[~o] \e[\[ti]o] o tilde
+\[,C] \e[,C] C cedilla \[:o] \e[:o] o dieresis
+\[`E] \e[\[ga]E] E grave \[di] \e[di] division sign
+\['E] \e[\[aq]E] E acute \[/o] \e[/o] o slash
+\[^E] \e[\[ha]E] E circumflex \[`u] \e[\[ga]u] u grave
+\[:E] \e[:E] E dieresis \['u] \e[\[aq]u] u acute
+\[`I] \e[\[ga]I] I grave \[^u] \e[\[ha]u] u circumflex
+\['I] \e[\[aq]I] I acute \[:u] \e[:u] u dieresis
+\[^I] \e[\[ha]I] I circumflex \['y] \e[\[aq]y] y acute
+\[:I] \e[:I] I dieresis \[Tp] \e[Tp] lowercase thorn
+\[-D] \e[\-D] uppercase eth \[:y] \e[:y] y dieresis
+.TE
+.
+.
+.\" ====================================================================
+.SS "Special character escape forms"
+.\" ====================================================================
+.
+Glyphs that lack a character code in the basic Latin repertoire to
+directly represent them are entered by one of several special character
+escape forms.
+.
+Such glyphs can be simple or composite,
+and accessed either by name or numerically by code point.
+.
+Code points and combining properties are determined by character
+encoding standards,
+whereas glyph names as used here originated in AT&T
+.I troff \" AT&T
+special character escape sequences.
+.
+Predefined glyph names use only characters in the basic Latin
+repertoire.
+.
+.
+.TP
+.BI \[rs]( gl
+is a special character escape sequence for the glyph with the
+two-character name
+.IR gl .
+.
+This is the original syntax form supported by AT&T
+.IR troff .
+.
+The acute accent,
+.BR \[rs](aa ,
+is an example.
+.
+.
+.TP
+.BI \[rs]C\[aq] glyph-name \[aq]
+is a special character escape sequence for
+.IR glyph-name ,
+which can be of arbitrary length.
+.
+The delimiter,
+shown here as a neutral apostrophe,
+can be any character not occurring in
+.IR glyph-name .
+.
+This syntax form was introduced in later versions of AT&T
+device-independent
+.IR troff . \" AT&T
+.
+The foregoing acute accent example can be expressed
+as
+.BR \[rs]C\[aq]aa\[aq] .
+.
+.
+.TP
+.BI \[rs][ glyph-name ]
+is a special character escape sequence for
+.IR glyph-name ,
+which can be of arbitrary length but must not contain a closing square
+bracket
+.RB \[lq] ] \[rq].
+.
+(No glyph names predefined by
+.I groff
+employ
+.RB \[lq] ] \[rq].)
+.
+The foregoing acute accent example can be expressed in
+.I groff
+as
+.BR \[rs][aa] .
+.
+.
+.P
+.BI \[rs]C\[aq] c \[aq]
+and
+.BI \[rs][ c ]
+are not synonyms for the ordinary character
+.RI \[lq] c \[rq],
+but request the special character named
+.RB \[lq] \[rs] \c
+.IR c \[rq].
+.
+For example,
+.RB \[lq] \[rs][a] \[rq]
+is not \[lq]a\[rq],
+but rather a special character with the internal glyph name
+(used in font description files and diagnostic messages)
+.BR \[rs]a ,
+which is typically undefined.
+.
+The only such glyph name
+.I groff
+predefines is the minus sign,
+which can therefore be accessed as
+.B \[rs]C\[aq]\-\[aq]
+or
+.BR \[rs][\-] .
+.
+.
+.TP
+.BI \[rs][ "base-char composite-1 composite-2"\~\c
+\&.\|.\|.\~\c
+.IB composite-n ]
+is a composite glyph.
+.
+Glyphs like a lowercase \[lq]e\[rq] with an acute accent,
+as in the word \[lq]caf\[e aa]\[rq],
+can be expressed as
+.BR "\[rs][e aa]" .
+.
+See subsection \[lq]Accents\[rq] below for a table of combining glyph
+names.
+.
+.
+.P
+Unicode encodes far more characters than
+.I groff
+has glyph names for;
+special character escape forms based on numerical code points enable
+access to any of them.
+.
+Frequently used glyphs or glyph combinations can be stored in strings,
+and new glyph names can be created
+.I "ad hoc"
+with the
+.B char
+request;
+see
+.MR groff @MAN7EXT@ .
+.
+.
+.TP
+.BI \[rs][u nnnn\c
+.RI [ n\c
+.RI [ n ]]\c
+.B ]
+is a Unicode numeric special character escape sequence.
+.
+Any Unicode code point can be accessed with four to six hexadecimal
+digits,
+with hexadecimal letters accepted in uppercase form only.
+.
+Thus,
+.B \[rs][u02DA]
+accesses the (spacing) ring accent,
+producing \[lq]\[u02DA]\[rq].
+.
+.
+.\" Use "GNU troff" in this paragraph because the contrast with AT&T
+.\" troff, which antedated Unicode, is important, and that contrast is
+.\" obscured with the default empty command prefix on "troff".
+.P
+Unicode code points can be composed as well;
+when they are,
+GNU
+.I troff \" GNU
+requires NFD
+(Normalization Form D),
+where all Unicode glyphs are maximally decomposed.
+.
+(Exception:
+precomposed characters in the Latin-1 supplement described above are
+also accepted.
+.
+Do not count on this exception remaining in a future
+GNU
+.I troff \" GNU
+that accepts UTF-8 input directly.)
+.
+.
+Thus,
+GNU
+.I troff \" GNU
+accepts
+.RB \[lq]caf \[rs][\[aq]e] \[rq],
+.RB \[lq]caf \[rs][e\~aa] \[rq],
+and
+.RB \[lq]caf \[rs][u0065_0301] \[rq],
+as ways to input \[lq]caf\['e]\[rq].
+.
+(Due to its legacy 8-bit encoding compatibility,
+at present it also accepts
+.RB \[lq]caf \[rs][u00E9] \[rq]
+on ISO Latin-1 systems.)
+.
+.
+.TP
+.BI \[rs][u base-char\c
+[\c
+.BI _ combining-component\c
+].\|.\|.]
+constructs a composite glyph from Unicode numeric special character
+escape sequences.
+.
+The code points of the base glyph and the combining components are each
+expressed in hexadecimal,
+with an underscore
+.RB ( _ )
+separating each component.
+.
+Thus,
+.B \[rs][u006E_0303]
+produces \[lq]\[u006E_0303]\[rq].
+.
+.
+.TP
+.BI \[rs][char nnn ]
+expresses an eight-bit code point where
+.I nnn
+is the code point of the character,
+a decimal number between 0 and\~255
+without leading zeroes.
+.
+This legacy numeric special character escape sequence is used to map
+characters onto glyphs via the
+.B trin
+request in macro files loaded by
+.MR grotty @MAN1EXT@ .
+.
+.
+.\" ====================================================================
+.SH "Glyph tables"
+.\" ====================================================================
+.
+In this section,
+.IR groff 's
+glyph name repertoire is presented in tabular form.
+.
+The meanings of the columns are as follows.
+.
+.
+.TP 8n
+.B Output
+shows the glyph as it appears on the device used to render this
+document;
+although it can have a notably different shape on other devices
+(and is subject to user-directed translation and replacement),
+.I groff
+attempts reasonable equivalency on all output devices.
+.
+.
+.TP
+.B Input
+shows the
+.I groff
+character
+(ordinary or special)
+that normally produces the glyph.
+.
+Some code points have multiple glyph names.
+.
+.
+.TP
+.B Unicode
+is the code point notation for the glyph or combining glyph sequence as
+described in subsection \[lq]Special character escape forms\[rq] above.
+.
+It corresponds to the standard notation for Unicode short identifiers
+such that
+.IR groff 's
+.BI u nnnn
+is equivalent to Unicode's
+.RI U+ nnnn .
+.\" And thereby hangs a tale...
+.\" https://unicode.org/mail-arch/unicode-ml/y2005-m11/0060.html
+.
+.
+.TP
+.B Notes
+describes the glyph,
+elucidating the mnemonic value of the glyph name where possible.
+.
+.
+.IP
+A plus sign \[lq]+\[rq] indicates that the glyph name appears in the
+AT&T
+.I troff
+user's manual,
+CSTR\~#54
+(1992 revision).
+.
+When using the AT&T special character syntax
+.BI \[rs]( xx\c
+, widespread portability can be expected from such names.
+.
+.
+.IP
+Entries marked with \[lq]***\[rq] denote glyphs used for mathematical
+purposes.
+.
+On typesetting devices,
+such glyphs are typically drawn from a
+.I special
+font
+(see
+.MR groff_font @MAN5EXT@ ).
+.
+Often,
+such glyphs lack bold or italic style forms or have metrics that look
+incongruous in ordinary prose.
+.
+A few which are not uncommon in running text have \[lq]text
+variants\[rq],
+which should work better in that context.
+.
+Conversely,
+a handful of glyphs that are normally drawn from a text font may be
+required in mathematical equations.
+.
+Both sets of exceptions are noted in the tables where they appear
+(\[lq]Logical symbols\[rq] and \[lq]Mathematical symbols\[rq]).
+.
+.
+.\" ====================================================================
+.SS "Basic Latin"
+.\" ====================================================================
+.
+Apart from basic Latin characters with special mappings,
+described in subsection \[lq]Fundamental character set\[rq] above,
+a few others in that range have special character glyph names.
+.
+.\" XXX: I surmise that...
+These were defined for ease of input on non-U.S.\& keyboards lacking
+keycaps for them,
+or for symmetry with other special character glyph names serving a
+similar purpose.
+.
+.
+.P
+The vertical bar is overloaded;
+the
+.B \[rs][ba]
+and
+.B \[rs][or]
+escape sequences may render differently.
+.
+See subsection \[lq]Mathematical symbols\[rq] below for special variants
+of the plus,
+minus,
+and equals
+signs normally drawn from this range.
+.
+.
+.P
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[dq] \e[dq] u0022 neutral double quote
+\[sh] \e[sh] u0023 number sign
+\[Do] \e[Do] u0024 dollar sign
+\[aq] \e[aq] u0027 apostrophe, neutral single quote
+\[sl] \e[sl] u002F slash, solidus +
+\[at] \e[at] u0040 at sign
+\[lB] \e[lB] u005B left square bracket
+\[rs] \e[rs] u005C reverse solidus
+\[rB] \e[rB] u005D right square bracket
+\[ha] \e[ha] u005E circumflex, caret, \[lq]hat\[rq]
+\[lC] \e[lC] u007B left brace
+| | u007C bar
+\[ba] \e[ba] u007C bar
+\[or] \e[or] u007C bitwise or +
+\[rC] \e[rC] u007D right brace
+\[ti] \e[ti] u007E tilde
+.TE
+.
+.
+.\" ====================================================================
+.SS "Supplementary Latin letters"
+.\" ====================================================================
+.
+Historically,
+.B \[rs][ss]
+could be considered a ligature of \[lq]sz\[rq].
+.
+An uppercase form is available as
+.BR \[rs][u1E9E] ,
+but in the German language it is of specialized use;
+\[ss] does
+.I not
+normally uppercase-transform to it,
+but rather to \[lq]SS\[rq].
+.
+\[lq]Lowercase f with hook\[rq] is also used as a function symbol;
+see subsection \[lq]Mathematical symbols\[rq] below.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[-D] \e[\-D] u00D0 uppercase eth
+\[Sd] \e[Sd] u00F0 lowercase eth
+\[TP] \e[TP] u00DE uppercase thorn
+\[Tp] \e[Tp] u00FE lowercase thorn
+\[ss] \e[ss] u00DF lowercase sharp s
+\[.i] \e[.i] u0131 i without tittle
+\[.j] \e[.j] u0237 j without tittle
+\[Fn] \e[Fn] u0192 lowercase f with hook, function
+\[/L] \e[/L] u0141 L with stroke
+\[/l] \e[/l] u0142 l with stroke
+\[/O] \e[/O] u00D8 O with stroke
+\[/o] \e[/o] u00F8 o with stroke
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS "Ligatures and digraphs"
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[ff] \e[ff] u0066_0066 ff ligature +
+\[fi] \e[fi] u0066_0069 fi ligature +
+\[fl] \e[fl] u0066_006C fl ligature +
+\[Fi] \e[Fi] u0066_0066_0069 ffi ligature +
+\[Fl] \e[Fl] u0066_0066_006C ffl ligature +
+\[AE] \e[AE] u00C6 AE ligature
+\[ae] \e[ae] u00E6 ae ligature
+\[OE] \e[OE] u0152 OE ligature
+\[oe] \e[oe] u0153 oe ligature
+\[IJ] \e[IJ] u0132 IJ digraph
+\[ij] \e[ij] u0133 ij digraph
+.TE
+.
+.
+.\" ====================================================================
+.SS Accents
+.\" ====================================================================
+.
+Normally,
+the formatting of a special character advances the drawing position as
+an ordinary character does.
+.
+.IR groff 's
+.B composite
+request designates a special character as combining.
+.
+The
+.I composite.tmac
+macro file,
+loaded automatically by the default
+.IR troffrc ,
+maps the following special characters to the combining characters shown
+below.
+.
+The non-combining code point in parentheses is used when the special
+character occurs in isolation
+(compare
+.RB \[lq] "caf\[rs][e aa]" \[rq]
+and
+.RB \[lq] "caf\[rs][aa]e" \[rq]).
+.
+.
+.P
+.if t .ne 3v
+.if n .ne 4v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[a"] \e[a"] u030B (u02DD) double acute accent
+\[a-] \e[a\-] u0304 (u00AF) macron accent
+\[a.] \e[a.] u0307 (u02D9) dot accent
+\[a^] \e[a\[ha]] u0302 (u005E) circumflex accent
+\[aa] \e[aa] u0301 (u00B4) acute accent +
+\[ga] \e[ga] u0300 (u0060) grave accent +
+\[ab] \e[ab] u0306 (u02D8) breve accent
+\[ac] \e[ac] u0327 (u00B8) cedilla accent
+\[ad] \e[ad] u0308 (u00A8) dieresis accent
+\[ah] \e[ah] u030C (u02C7) caron accent
+\[ao] \e[ao] u030A (u02DA) ring accent
+\[a~] \e[a\[ti]] u0303 (u007E) tilde accent
+\[ho] \e[ho] u0328 (u02DB) hook accent
+.TE
+.
+.
+.\" ====================================================================
+.SS "Accented characters"
+.\" ====================================================================
+.
+All of these glyphs can be composed using combining glyph names as
+described in subsection \[lq]Special character escape forms\[rq] above;
+the names below are short aliases for convenience.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\['A] \e[\[aq]A] u0041_0301 A acute
+\['C] \e[\[aq]C] u0043_0301 C acute
+\['E] \e[\[aq]E] u0045_0301 E acute
+\['I] \e[\[aq]I] u0049_0301 I acute
+\['O] \e[\[aq]O] u004F_0301 O acute
+\['U] \e[\[aq]U] u0055_0301 U acute
+\['Y] \e[\[aq]Y] u0059_0301 Y acute
+\['a] \e[\[aq]a] u0061_0301 a acute
+\['c] \e[\[aq]c] u0063_0301 c acute
+\['e] \e[\[aq]e] u0065_0301 e acute
+\['i] \e[\[aq]i] u0069_0301 i acute
+\['o] \e[\[aq]o] u006F_0301 o acute
+\['u] \e[\[aq]u] u0075_0301 u acute
+\['y] \e[\[aq]y] u0079_0301 y acute
+
+\[:A] \e[:A] u0041_0308 A dieresis
+\[:E] \e[:E] u0045_0308 E dieresis
+\[:I] \e[:I] u0049_0308 I dieresis
+\[:O] \e[:O] u004F_0308 O dieresis
+\[:U] \e[:U] u0055_0308 U dieresis
+\[:Y] \e[:Y] u0059_0308 Y dieresis
+\[:a] \e[:a] u0061_0308 a dieresis
+\[:e] \e[:e] u0065_0308 e dieresis
+\[:i] \e[:i] u0069_0308 i dieresis
+\[:o] \e[:o] u006F_0308 o dieresis
+\[:u] \e[:u] u0075_0308 u dieresis
+\[:y] \e[:y] u0079_0308 y dieresis
+
+\[^A] \e[\[ha]A] u0041_0302 A circumflex
+\[^E] \e[\[ha]E] u0045_0302 E circumflex
+\[^I] \e[\[ha]I] u0049_0302 I circumflex
+\[^O] \e[\[ha]O] u004F_0302 O circumflex
+\[^U] \e[\[ha]U] u0055_0302 U circumflex
+\[^a] \e[\[ha]a] u0061_0302 a circumflex
+\[^e] \e[\[ha]e] u0065_0302 e circumflex
+\[^i] \e[\[ha]i] u0069_0302 i circumflex
+\[^o] \e[\[ha]o] u006F_0302 o circumflex
+\[^u] \e[\[ha]u] u0075_0302 u circumflex
+
+\[`A] \e[\[ga]A] u0041_0300 A grave
+\[`E] \e[\[ga]E] u0045_0300 E grave
+\[`I] \e[\[ga]I] u0049_0300 I grave
+\[`O] \e[\[ga]O] u004F_0300 O grave
+\[`U] \e[\[ga]U] u0055_0300 U grave
+\[`a] \e[\[ga]a] u0061_0300 a grave
+\[`e] \e[\[ga]e] u0065_0300 e grave
+\[`i] \e[\[ga]i] u0069_0300 i grave
+\[`o] \e[\[ga]o] u006F_0300 o grave
+\[`u] \e[\[ga]u] u0075_0300 u grave
+
+\[~A] \e[\[ti]A] u0041_0303 A tilde
+\[~N] \e[\[ti]N] u004E_0303 N tilde
+\[~O] \e[\[ti]O] u004F_0303 O tilde
+\[~a] \e[\[ti]a] u0061_0303 a tilde
+\[~n] \e[\[ti]n] u006E_0303 n tilde
+\[~o] \e[\[ti]o] u006F_0303 o tilde
+
+\[vS] \e[vS] u0053_030C S caron
+\[vs] \e[vs] u0073_030C s caron
+\[vZ] \e[vZ] u005A_030C Z caron
+\[vz] \e[vz] u007A_030C z caron
+
+\[,C] \e[,C] u0043_0327 C cedilla
+\[,c] \e[,c] u0063_0327 c cedilla
+
+\[oA] \e[oA] u0041_030A A ring
+\[oa] \e[oa] u0061_030A a ring
+.TE
+.
+.
+.\" ====================================================================
+.SS "Quotation marks"
+.\" ====================================================================
+.
+The neutral double quote,
+often useful when documenting programming languages,
+is also available as a special character for convenient embedding in
+macro arguments;
+see subsection \[lq]Fundamental character set\[rq] above.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[Bq] \e[Bq] u201E low double comma quote
+\[bq] \e[bq] u201A low single comma quote
+\[lq] \e[lq] u201C left double quote
+\[rq] \e[rq] u201D right double quote
+\[oq] \e[oq] u2018 single opening (left) quote
+\[cq] \e[cq] u2019 single closing (right) quote
+\[aq] \e[aq] u0027 apostrophe, neutral single quote
+\[dq] " u0022 neutral double quote
+\[dq] \e[dq] u0022 neutral double quote
+\[Fo] \e[Fo] u00AB left double chevron
+\[Fc] \e[Fc] u00BB right double chevron
+\[fo] \e[fo] u2039 left single chevron
+\[fc] \e[fc] u203A right single chevron
+.TE
+.
+.
+.\" ====================================================================
+.SS Punctuation
+.\" ====================================================================
+.
+The Unicode name for U+00B7 is \[lq]middle dot\[rq],
+which is unfortunately confusable with the
+.I groff
+mnemonic for the visually similar but semantically distinct
+multiplication dot;
+see subsection \[lq]Mathematical symbols\[rq] below.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[r!] \e[r!] u00A1 inverted exclamation mark
+\[r?] \e[r?] u00BF inverted question mark
+\[pc] \e[pc] u00B7 centered period
+\[em] \e[em] u2014 em-dash +
+\[en] \e[en] u2013 en-dash
+\[hy] \e[hy] u2010 hyphen +
+.TE
+.
+.
+.\" ====================================================================
+.SS Brackets
+.\" ====================================================================
+.
+On typesetting devices,
+the bracket extensions are font-invariant glyphs;
+that is,
+they are rendered the same way regardless of font
+(with a drawing escape sequence).
+.
+On terminals,
+they are
+.I not
+font-invariant;
+.I groff
+maps them rather arbitrarily to U+23AA
+(\[lq]curly bracket extension\[rq]).
+.
+In AT&T
+.IR troff ,
+only one glyph was available to vertically extend
+brackets,
+braces,
+and
+parentheses:
+.BR \[rs](bv .
+.
+.
+.
+.P
+Not all devices supply bracket pieces that can be piled up with
+.B \[rs]b
+due to the restrictions of the escape's piling algorithm.
+.
+A general solution to build brackets out of pieces is the following
+macro:
+.
+.
+.RS
+.EX
+\&.\e" Make a pile centered vertically 0.5em above the baseline.
+\&.\e" The first argument is placed at the top.
+\&.\e" The pile is returned in string \[aq]pile\[aq].
+\&.eo
+\&.de pile\-make
+\&.\& nr pile\-wd 0
+\&.\& nr pile\-ht 0
+\&.\& ds pile\-args
+\&.\&
+\&.\& nr pile\-# \en[.$]
+\&.\& while \en[pile\-#] \e{\e
+\&.\& nr pile\-wd (\en[pile\-wd] >? \ew\[aq]\e$[\en[pile\-#]]\[aq])
+\&.\& nr pile\-ht +(\en[rst] \- \en[rsb])
+\&.\& as pile\-args \ev\[aq]\en[rsb]u\[aq]\e"
+\&.\& as pile\-args \eZ\[aq]\e$[\en[pile\-#]]\[aq]\e"
+\&.\& as pile\-args \ev\[aq]\-\en[rst]u\[aq]\e"
+\&.\& nr pile\-# \-1
+\&.\& \e}
+\&.\&
+\&.\& ds pile \ev\[aq](\-0.5m + (\en[pile\-ht]u / 2u))\[aq]\e"
+\&.\& as pile \e*[pile\-args]\e"
+\&.\& as pile \ev\[aq]((\en[pile\-ht]u / 2u) + 0.5m)\[aq]\e"
+\&.\& as pile \eh\[aq]\en[pile\-wd]u\[aq]\e"
+\&..
+\&.ec
+.EE
+.RE
+.
+.
+.P
+Another complication is the fact that some glyphs which represent
+bracket pieces in AT&T
+.I troff
+can be used for other mathematical symbols as well,
+for example
+.B \[rs](lf
+and
+.BR \[rs](rf ,
+which provide the floor operator.
+.
+Some output devices,
+such as
+.BR dvi ,
+don't unify such glyphs.
+.
+For this reason,
+the glyphs
+.BR \[rs][lf] ,
+.BR \[rs][rf] ,
+.BR \[rs][lc] ,
+and
+.B \[rs][rc]
+are not unified with similar-looking bracket pieces.
+.
+In
+.IR groff ,
+only glyphs with long names are guaranteed to pile up correctly for all
+devices\[em]provided those glyphs are available.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[lB] [ u005B left square bracket
+\[lB] \e[lB] u005B left square bracket
+\[rB] ] u005D right square bracket
+\[rB] \e[rB] u005D right square bracket
+\[lC] { u007B left brace
+\[lC] \e[lC] u007B left brace
+\[rC] } u007D right brace
+\[rC] \e[rC] u007D right brace
+\[la] \e[la] u27E8 left angle bracket
+\[ra] \e[ra] u27E9 right angle bracket
+\[bv] \e[bv] u23AA brace vertical extension + ***
+\[braceex] \e[braceex] u23AA brace vertical extension
+
+\[bracketlefttp] \e[bracketlefttp] u23A1 left square bracket top
+\[bracketleftex] \e[bracketleftex] u23A2 left square bracket extension
+\[bracketleftbt] \e[bracketleftbt] u23A3 left square bracket bottom
+
+\[bracketrighttp] \e[bracketrighttp] u23A4 right square bracket top
+\[bracketrightex] \e[bracketrightex] u23A5 right square bracket extension
+\[bracketrightbt] \e[bracketrightbt] u23A6 right square bracket bottom
+
+\[lt] \e[lt] u23A7 left brace top +
+\[lk] \e[lk] u23A8 left brace middle +
+\[lb] \e[lb] u23A9 left brace bottom +
+\[bracelefttp] \e[bracelefttp] u23A7 left brace top
+\[braceleftmid] \e[braceleftmid] u23A8 left brace middle
+\[braceleftbt] \e[braceleftbt] u23A9 left brace bottom
+\[braceleftex] \e[braceleftex] u23AA left brace extension
+
+\[rt] \e[rt] u23AB right brace top +
+\[rk] \e[rk] u23AC right brace middle +
+\[rb] \e[rb] u23AD right brace bottom +
+\[bracerighttp] \e[bracerighttp] u23AB right brace top
+\[bracerightmid] \e[bracerightmid] u23AC right brace middle
+\[bracerightbt] \e[bracerightbt] u23AD right brace bottom
+\[bracerightex] \e[bracerightex] u23AA right brace extension
+
+\[parenlefttp] \e[parenlefttp] u239B left parenthesis top
+\[parenleftex] \e[parenleftex] u239C left parenthesis extension
+\[parenleftbt] \e[parenleftbt] u239D left parenthesis bottom
+\[parenrighttp] \e[parenrighttp] u239E right parenthesis top
+\[parenrightex] \e[parenrightex] u239F right parenthesis extension
+\[parenrightbt] \e[parenrightbt] u23A0 right parenthesis bottom
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS Arrows
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[<-] \e[<\-] u2190 horizontal arrow left +
+\[->] \e[\->] u2192 horizontal arrow right +
+\[<>] \e[<>] u2194 bidirectional horizontal arrow
+\[da] \e[da] u2193 vertical arrow down +
+\[ua] \e[ua] u2191 vertical arrow up +
+\[va] \e[va] u2195 bidirectional vertical arrow
+\[lA] \e[lA] u21D0 horizontal double arrow left
+\[rA] \e[rA] u21D2 horizontal double arrow right
+\[hA] \e[hA] u21D4 bidirectional horizontal double arrow
+\[dA] \e[dA] u21D3 vertical double arrow down
+\[uA] \e[uA] u21D1 vertical double arrow up
+\[vA] \e[vA] u21D5 bidirectional vertical double arrow
+\[an] \e[an] u23AF horizontal arrow extension
+.TE
+.
+.
+.\" ====================================================================
+.SS "Rules and lines"
+.\" ====================================================================
+.
+On typesetting devices,
+the font-invariant glyphs
+(see subsection \[lq]Brackets\[rq] above)
+.BR \[rs][br] ,
+.BR \[rs][ul] ,
+and
+.B \[rs][rn]
+form corners when adjacent;
+they can be used to build boxes.
+.
+On terminal devices,
+they are mapped as shown in the table.
+.
+The Unicode-derived names of these three glyphs are approximations.
+.
+.
+.P
+The input character
+.B _
+always accesses the underscore glyph in a font;
+.\" unless one isn't available, but this seems to be only a theoretical
+.\" concern--what font doesn't support every ASCII codepoint these days?
+.BR \[rs][ul] ,
+by contrast,
+may be font-invariant on typesetting devices.
+.
+.
+.P
+The baseline rule
+.B \[rs][ru]
+is a font-invariant glyph,
+namely a rule of one-half em.
+.
+.
+.P
+In AT&T
+.IR troff , \" AT&T
+.B \[rs][rn]
+also served as a one\~en extension of the square root symbol.
+.
+.I groff
+favors
+.B \[rs][radicalex]
+for this purpose;
+see subsection \[lq]Mathematical symbols\[rq] below.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+| | u007C bar
+\[ba] \e[ba] u007C bar
+\[br] \e[br] u2502 box rule +
+\&_ \&_ u005F underscore, low line +
+\[ul] \e[ul] --- underrule +
+\[rn] \e[rn] u203E overline +
+\[ru] \e[ru] --- baseline rule +
+\[bb] \e[bb] u00A6 broken bar
+\[sl] / u002F slash, solidus +
+\[sl] \e[sl] u002F slash, solidus +
+\[rs] \e[rs] u005C reverse solidus
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS "Text markers"
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[ci] \e[ci] u25CB circle +
+\[bu] \e[bu] u2022 bullet +
+\[dg] \e[dg] u2020 dagger +
+\[dd] \e[dd] u2021 double dagger +
+\[lz] \e[lz] u25CA lozenge, diamond
+\[sq] \e[sq] u25A1 square +
+\[ps] \e[ps] u00B6 pilcrow sign
+\[sc] \e[sc] u00A7 section sign +
+\[lh] \e[lh] u261C hand pointing left +
+\[rh] \e[rh] u261E hand pointing right +
+\[at] @ u0040 at sign
+\[at] \e[at] u0040 at sign
+\[sh] # u0023 number sign
+\[sh] \e[sh] u0023 number sign
+\[CR] \e[CR] u21B5 carriage return
+\[OK] \e[OK] u2713 check mark
+.TE
+.
+.\" ====================================================================
+.SS "Legal symbols"
+.\" ====================================================================
+.
+The Bell System logo is not supported in
+.IR groff .
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[co] \e[co] u00A9 copyright sign +
+\[rg] \e[rg] u00AE registered sign +
+\[tm] \e[tm] u2122 trade mark sign
+\[bs] \e[bs] --- Bell System logo +
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS "Currency symbols"
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[Do] $ u0024 dollar sign
+\[Do] \e[Do] u0024 dollar sign
+\[ct] \e[ct] u00A2 cent sign +
+\[eu] \e[eu] u20AC Euro sign
+\[Eu] \e[Eu] u20AC variant Euro sign
+\[Ye] \e[Ye] u00A5 yen sign
+\[Po] \e[Po] u00A3 pound sign
+\[Cs] \e[Cs] u00A4 currency sign
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS Units
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[de] \e[de] u00B0 degree sign +
+\[%0] \e[%0] u2030 per thousand, per mille sign
+\[fm] \e[fm] u2032 arc minute sign, foot mark +
+\[sd] \e[sd] u2033 arc second sign
+\[mc] \e[mc] u00B5 micro sign
+\[Of] \e[Of] u00AA feminine ordinal indicator
+\[Om] \e[Om] u00BA masculine ordinal indicator
+.TE
+.
+.
+.\" ====================================================================
+.SS "Logical symbols"
+.\" ====================================================================
+.
+The variants of the not sign may differ in appearance or spacing
+depending on the device and font selected.
+.
+Unicode does not encode a discrete \[lq]bitwise or\[rq] sign:
+on typesetting devices,
+it is drawn shorter than the bar,
+about the same height as a capital letter.
+.
+Terminal devices unify
+.B \[rs][ba]
+and
+.BR \[rs][or] .
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[AN] \e[AN] u2227 logical and
+\[OR] \e[OR] u2228 logical or
+\[no] \e[no] u00AC logical not + ***
+\[tno] \e[tno] u00AC text variant of \f[B]\e[no]\f[]
+\[te] \e[te] u2203 there exists
+\[fa] \e[fa] u2200 for all
+\[st] \e[st] u220B such that
+\[3d] \e[3d] u2234 therefore
+\[tf] \e[tf] u2234 therefore
+| | u007C bar
+\[or] \e[or] u007C bitwise or +
+.TE
+.
+.
+.\" ====================================================================
+.SS "Mathematical symbols"
+.\" ====================================================================
+.
+.B \[rs][Fn]
+also appears in subsection \[lq]Supplementary Latin letters\[rq] above.
+.
+Observe the two varieties of the
+plus-minus,
+multiplication,
+and division signs;
+.BR \[rs][+\-] ,
+.BR \[rs][mu] ,
+and
+.B \[rs][di]
+are normally drawn from the special font,
+but have text font variants.
+.
+Also be aware of three glyphs available in special font variants that
+are normally drawn from text fonts:
+the plus,
+minus,
+and equals signs.
+.
+These variants may differ in appearance or spacing depending on the
+device and font selected.
+.
+.
+.P
+In AT&T
+.IR troff ,
+.B \[rs](rn
+(\[lq]root en extender\[rq])
+served as the horizontal extension of the radical
+(square root)
+sign,
+.BR \[rs](sr ,
+and was drawn at the maximum height of the typeface's bounding box;
+this enabled the special character to double as an overline
+(see subsection \[lq]Rules and lines\[rq] above).
+.
+A contemporary font's radical sign might not ascend to such an extreme.
+.
+In
+.IR groff ,
+you can instead use
+.B \[rs][radicalex]
+to continue the radical sign
+.BR \[rs][sr] ;
+these special characters are intended for use with text fonts.
+.
+.B \[rs][sqrt]
+and
+.B \[rs][sqrtex]
+are their counterparts with mathematical spacing.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[12] \e[12] u00BD one half symbol +
+\[14] \e[14] u00BC one quarter symbol +
+\[34] \e[34] u00BE three quarters symbol +
+\[18] \e[18] u215B one eighth symbol
+\[38] \e[38] u215C three eighths symbol
+\[58] \e[58] u215D five eighths symbol
+\[78] \e[78] u215E seven eighths symbol
+\[S1] \e[S1] u00B9 superscript one
+\[S2] \e[S2] u00B2 superscript two
+\[S3] \e[S3] u00B3 superscript three
+
++ + u002B plus
+\[pl] \e[pl] u002B special variant of plus + ***
+\- \e[\-] u002D minus
+\[mi] \e[mi] u2212 special variant of minus + ***
+\[-+] \e[\-+] u2213 minus-plus
+\[+-] \e[+\-] u00B1 plus-minus + ***
+\[t+-] \e[t+\-] u00B1 text variant of \f[B]\e[+\-]\f[]
+\[md] \e[md] u22C5 multiplication dot
+\[mu] \e[mu] u00D7 multiplication sign + ***
+\[tmu] \e[tmu] u00D7 text variant of \f[B]\e[mu]\f[]
+\[c*] \e[c*] u2297 circled times
+\[c+] \e[c+] u2295 circled plus
+\[di] \e[di] u00F7 division sign + ***
+\[tdi] \e[tdi] u00F7 text variant of \f[B]\e[di]\f[]
+\[f/] \e[f/] u2044 fraction slash
+* * u002A asterisk
+\[**] \e[**] u2217 mathematical asterisk +
+
+\[<=] \e[<=] u2264 less than or equal to +
+\[>=] \e[>=] u2265 greater than or equal to +
+\[<<] \e[<<] u226A much less than
+\[>>] \e[>>] u226B much greater than
+\&= \&= u003D equals
+\[eq] \e[eq] u003D special variant of equals + ***
+\[!=] \e[!=] u003D_0338 not equals +
+\[==] \e[==] u2261 equivalent +
+\[ne] \e[ne] u2261_0338 not equivalent
+\[=~] \e[=\[ti]] u2245 approximately equal to
+\[|=] \e[|=] u2243 asymptotically equal to +
+\[ti] \e[ti] u007E tilde +
+\[ap] \e[ap] u223C similar to, tilde operator +
+\[~~] \e[\[ti]\[ti]] u2248 almost equal to
+\[~=] \e[\[ti]=] u2248 almost equal to
+\[pt] \e[pt] u221D proportional to +
+
+\[es] \e[es] u2205 empty set +
+\[mo] \e[mo] u2208 element of a set +
+\[nm] \e[nm] u2208_0338 not element of set
+\[sb] \e[sb] u2282 proper subset +
+\[nb] \e[nb] u2282_0338 not subset
+\[sp] \e[sp] u2283 proper superset +
+\[nc] \e[nc] u2283_0338 not superset
+\[ib] \e[ib] u2286 subset or equal +
+\[ip] \e[ip] u2287 superset or equal +
+\[ca] \e[ca] u2229 intersection, cap +
+\[cu] \e[cu] u222A union, cup +
+
+\[/_] \e[/_] u2220 angle
+\[pp] \e[pp] u22A5 perpendicular
+\[is] \e[is] u222B integral +
+\[integral] \e[integral] u222B integral ***
+\[sum] \e[sum] u2211 summation ***
+\[product] \e[product] u220F product ***
+\[coproduct] \e[coproduct] u2210 coproduct ***
+\[gr] \e[gr] u2207 gradient +
+\[sr] \e[sr] u221A radical sign, square root +
+\[rn] \e[rn] u203E overline +
+\[radicalex] \e[radicalex] --- radical extension
+\[sqrt] \e[sqrt] u221A radical sign, square root ***
+\[sqrtex] \e[sqrtex] --- radical extension ***
+
+\[lc] \e[lc] u2308 left ceiling +
+\[rc] \e[rc] u2309 right ceiling +
+\[lf] \e[lf] u230A left floor +
+\[rf] \e[rf] u230B right floor +
+
+\[if] \e[if] u221E infinity +
+\[Ah] \e[Ah] u2135 aleph symbol
+\[Fn] \e[Fn] u0192 lowercase f with hook, function
+\[Im] \e[Im] u2111 blackletter I, imaginary part
+\[Re] \e[Re] u211C blackletter R, real part
+\[wp] \e[wp] u2118 Weierstrass p
+\[pd] \e[pd] u2202 partial differential
+\[-h] \e[\-h] u210F h bar
+\[hbar] \e[hbar] u210F h bar
+.TE
+.
+.
+.\" ====================================================================
+.SS "Greek glyphs"
+.\" ====================================================================
+.
+These glyphs are intended for technical use,
+not for typesetting Greek language text;
+normally,
+the uppercase letters have upright shape,
+and the lowercase ones are slanted.
+.
+.
+.P
+.if t .ne 2v
+.if n .ne 3v \" account for horizontal rule
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[*A] \e[*A] u0391 uppercase alpha +
+\[*B] \e[*B] u0392 uppercase beta +
+\[*G] \e[*G] u0393 uppercase gamma +
+\[*D] \e[*D] u0394 uppercase delta +
+\[*E] \e[*E] u0395 uppercase epsilon +
+\[*Z] \e[*Z] u0396 uppercase zeta +
+\[*Y] \e[*Y] u0397 uppercase eta +
+\[*H] \e[*H] u0398 uppercase theta +
+\[*I] \e[*I] u0399 uppercase iota +
+\[*K] \e[*K] u039A uppercase kappa +
+\[*L] \e[*L] u039B uppercase lambda +
+\[*M] \e[*M] u039C uppercase mu +
+\[*N] \e[*N] u039D uppercase nu +
+\[*C] \e[*C] u039E uppercase xi +
+\[*O] \e[*O] u039F uppercase omicron +
+\[*P] \e[*P] u03A0 uppercase pi +
+\[*R] \e[*R] u03A1 uppercase rho +
+\[*S] \e[*S] u03A3 uppercase sigma +
+\[*T] \e[*T] u03A4 uppercase tau +
+\[*U] \e[*U] u03A5 uppercase upsilon +
+\[*F] \e[*F] u03A6 uppercase phi +
+\[*X] \e[*X] u03A7 uppercase chi +
+\[*Q] \e[*Q] u03A8 uppercase psi +
+\[*W] \e[*W] u03A9 uppercase omega +
+
+\[*a] \e[*a] u03B1 lowercase alpha +
+\[*b] \e[*b] u03B2 lowercase beta +
+\[*g] \e[*g] u03B3 lowercase gamma +
+\[*d] \e[*d] u03B4 lowercase delta +
+\[*e] \e[*e] u03B5 lowercase epsilon +
+\[*z] \e[*z] u03B6 lowercase zeta +
+\[*y] \e[*y] u03B7 lowercase eta +
+\[*h] \e[*h] u03B8 lowercase theta +
+\[*i] \e[*i] u03B9 lowercase iota +
+\[*k] \e[*k] u03BA lowercase kappa +
+\[*l] \e[*l] u03BB lowercase lambda +
+\[*m] \e[*m] u03BC lowercase mu +
+\[*n] \e[*n] u03BD lowercase nu +
+\[*c] \e[*c] u03BE lowercase xi +
+\[*o] \e[*o] u03BF lowercase omicron +
+\[*p] \e[*p] u03C0 lowercase pi +
+\[*r] \e[*r] u03C1 lowercase rho +
+\[*s] \e[*s] u03C3 lowercase sigma +
+\[*t] \e[*t] u03C4 lowercase tau +
+\[*u] \e[*u] u03C5 lowercase upsilon +
+\[*f] \e[*f] u03D5 lowercase phi +
+\[*x] \e[*x] u03C7 lowercase chi +
+\[*q] \e[*q] u03C8 lowercase psi +
+\[*w] \e[*w] u03C9 lowercase omega +
+
+\[+e] \e[+e] u03F5 variant epsilon (lunate)
+\[+h] \e[+h] u03D1 variant theta (cursive form)
+\[+p] \e[+p] u03D6 variant pi (similar to omega)
+\[+f] \e[+f] u03C6 variant phi (curly shape)
+\[ts] \e[ts] u03C2 terminal lowercase sigma +
+.TE
+.
+.
+.br
+.if t .ne 4v
+.if n .ne 5v \" account for horizontal rule
+.\" ====================================================================
+.SS "Playing card symbols"
+.\" ====================================================================
+.
+.TS
+L L L Lx.
+Output Input Unicode Notes
+_
+.T&
+L Lf(CR) L Lx.
+\[CL] \e[CL] u2663 solid club suit
+\[SP] \e[SP] u2660 solid spade suit
+\[HE] \e[HE] u2665 solid heart suit
+\[DI] \e[DI] u2666 solid diamond suit
+.TE
+.
+.
+.\" ====================================================================
+.SH History
+.\" ====================================================================
+.
+A consideration of the typefaces originally available to AT&T
+.I nroff \" AT&T
+and
+.I troff \" AT&T
+illuminates many conventions that one might regard as idiosyncratic
+fifty years afterward.
+.
+(See section \[lq]History\[rq] of
+.MR roff @MAN7EXT@
+for more context.)
+.
+The face used by the Teletype Model\~37 terminals of the Murray Hill
+Unix Room was based on ASCII,
+but assigned multiple meanings to several code points,
+as suggested by that standard.
+.
+Decimal 34
+.RB ( \[dq] )
+served as a dieresis accent and neutral double quotation mark;
+decimal 39
+.RB ( \[aq] )
+as an acute accent,
+apostrophe,
+and closing (right) single quotation mark;
+decimal 45
+.RB ( \[-] )
+as a hyphen and a minus sign;
+decimal 94
+.RB ( \[ha] )
+as a circumflex accent and caret;
+decimal 96
+.RB ( \[ga] )
+as a grave accent and opening (left) single quotation mark;
+and decimal 126
+.RB ( \[ti] )
+as a tilde accent and
+(with a half-line motion)
+swung dash.
+.
+The Model\~37 bore an optional extended character set offering upright
+Greek letters and several mathematical symbols;
+these were documented as early as the
+.IR kbd (VII)
+man page of the
+(First Edition)
+.I Unix Programmer's Manual.
+.
+.
+.br
+.ne 2v
+.P
+At the time Graphic Systems delivered the C/A/T phototypesetter to AT&T,
+the ASCII character set was not considered a standard basis for a glyph
+repertoire by traditional typographers.
+.
+In the stock Times roman,
+italic,
+and bold styles available,
+several ASCII characters were not present at all,
+nor was most of the Teletype's extended character set.
+.
+AT&T commissioned a \[lq]special\[rq] font to ensure no loss of
+repertoire.
+.
+.
+.br
+.ne 2v
+.P
+A representation of the coverage of the C/A/T's text fonts follows.
+.
+The glyph resembling an underscore is a baseline rule,
+and that resembling a vertical line is a box rule.
+.
+In italics,
+the box rule was not slanted.
+.
+We also observe that the hyphen and minus sign were already
+\[lq]de-unified\[rq] by the fonts provided;
+a decision whither to map an input \[lq]\-\[rq] therefore had to be
+taken.
+.
+.
+.br
+.if t .ne 5v
+.if t .ne 7v \" account for box border
+.P
+.TS
+center box;
+Lf(R).
+A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+a b c d e f g h i j k l m n o p q r s t u v w x y z
+0 1 2 3 4 5 6 7 8 9 \[fi] \[fl] \[Fi] \[Fl]
+! $ % & ( ) \[oq] \[cq] * + \- . , / : ; = ? [ ] \[br]
+\[bu] \[sq] \[em] \[hy] \[ru] \[14] \[12] \[34] \
+\[de] \[dg] \[fm] \[ct] \[rg] \[co]
+.TE
+.
+.
+.P
+The special font supplied the missing ASCII and Teletype extended
+glyphs,
+among several others.
+.
+The plus,
+minus,
+and equals signs appeared in the special font despite availability in
+text fonts \[lq]to insulate the appearance of equations from the choice
+of standard [read: text] fonts\[rq]\[em]a priority since
+.I troff \" AT&T
+was turned to the task of mathematical typesetting as soon as it was
+developed.
+.
+.
+.P
+We note that AT&T took the opportunity to de-unify the apostrophe/right
+single quotation mark from the acute accent
+(a choice ISO later duplicated in its 8859 series of standards).
+.
+A slash intended to be mirror-symmetric with the backslash was also
+included,
+as was the Bell System logo;
+we do not attempt to depict the latter.
+.
+.
+.br
+.if t .ne 5v
+.if t .ne 7v \" account for box border
+.P
+.TS
+center box;
+Lf(I),Lf(R).
+\[*a] \[*b] \[*g] \[*d] \[*e] \[*z] \[*y] \[*h] \[*i] \[*k] \[*l] \
+\[*m] \[*n] \[*c] \[*o] \[*p] \[*r] \[*s] \[ts] \[*t] \[*u] \[*f] \
+\[*x] \[*q] \[*w]
+\[*G] \[*D] \[*H] \[*L] \[*C] \[*P] \[*S] \[*U] \[*F] \[*Q] \[*W]
+\[dq] \[aa] \[rs] \[ha] \[ul] \[ga] \[ti] \[sl] < > { } # @ \
+\[pl] \[mi] \[eq] \[**]
+.\" We use \[radicalex] instead of \[rn] for more reliable simulation of
+.\" the typeface shown in Table I of CSTR #54 (1976); see subsection
+.\" "Mathematical symbols" above.
+\[>=] \[<=] \[==] \[~=] \[ap] \[!=] \
+\[ua] \[da] \[<-] \[->] \[mu] \[di] \[+-] \
+\[if] \[pd] \[gr] \[no] \[is] \[pt] \[sr] \[radicalex] \
+\[cu] \[ca] \[sb] \[sp] \[ib] \[ip] \[es] \[mo]
+\[sc] \[dd] \[lh] \[rh] \[or] \[ci] \
+\[lt] \[lb] \[rt] \[rb] \[lk] \[rk] \[bv] \[lf] \[rf] \[lc] \[rc]
+.TE
+.
+.
+.P
+One ASCII character as rendered by the Model 37 was apparently
+abandoned.
+.
+That device printed decimal 124 (\[or]) as a broken vertical line,
+like Unicode U+00A6 (\[bb]).
+.
+No equivalent was available on the C/A/T;
+the box rule
+.BR \[rs][br] ,
+brace vertical extension
+.\" CSTR #54 (1976 edition) called this the "bold vertical", probably
+.\" because it was thicker than the box rule and matched the thickness
+.\" of the bracket pieces \(lt, \(lb, \(rt, \(rb, \(lk, \(rk, and so on.
+.\" Saying "bold" could be misleading because it appeared only in the
+.\" special font, not a bold text font.
+.BR \[rs][bv] ,
+and \[lq]or\[rq] operator
+.B \[rs][or]
+were used as contextually appropriate.
+.
+.
+.P
+.\" In the Holt, Reinhart, Winston edition of the _Unix Programmer's
+.\" Manual_, Revised and Expanded Version, Volume 2 (1983), the square
+.\" \(sq in Times bold is _not_ shown as filled on page 226.
+.\"
+.\" ...but in the AT&T USG Unix 4.0 manual (ca. 1981), typeset on the
+.\" Autologic APS-5, the Times bold \(sq _is_ filled.
+.\"
+.\" https://www.tuhs.org/Archive/Documentation/Manuals/Unix_4.0/
+.\" Volume_1/00_Annotated_Table_of_Contents.pdf
+.\" Volume_1/C.1.2_NROFF_TROFF_Users_Manual.pdf
+.\" -- GBR
+Devices supported by AT&T device-independent
+.I troff
+exhibited some differences in glyph detail.
+.
+For example,
+on the Autologic APS-5 phototypesetter,
+the square
+.B \[rs](sq
+became filled in the Times bold face.
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+The files below are loaded automatically by the default
+.IR troffrc .
+.
+.
+.TP
+.I @MACRODIR@/\:\%composite\:.tmac
+assigns alternate mappings for identifiers after the first in a
+composite special character escape sequence.
+.
+See subsection \[lq]Accents\[rq] above.
+.
+.
+.TP
+.I @MACRODIR@/\:\%fallbacks\:.tmac
+defines fallback mappings for Unicode code points such as the increment
+sign (U+2206) and upper- and lowercase Roman numerals.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+.MT jjc@\:jclark\:.com
+James Clark
+.ME ,
+with additions by
+.MT wl@\:gnu\:.org
+Werner Lemberg
+.ME
+and
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME ,
+revised to use
+.MR @g@tbl @MAN1EXT@
+by
+.MT esr@\:thyrsus\:.com
+Eric S.\& Raymond
+.ME ,
+and largely rewritten by
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+Section \[lq]Using Symbols\[rq] may be of particular note.
+.
+You can browse it interactively with \[lq]info \[aq](groff) Using
+Symbols\[aq]\[rq].
+.
+.
+.P
+\[lq]An extension to the
+.I troff
+character set for Europe\[rq],
+E.G.\& Keizer,
+K.J.\& Simonsen,
+J.\& Akkerhuis;
+EUUG Newsletter,
+Volume 9,
+No.\& 2,
+Summer 1989
+.
+.
+.P
+.UR http://\:www\:.unicode\:.org
+The Unicode Standard
+.UE
+.
+.
+.br
+.ne 2v
+.P
+.UR https://\:www\:.aivosto\:.com/\:articles/\:charsets\-7bit\:.html
+\[lq]7-bit Character Sets\[rq]
+.UE
+by Tuomas Salste documents the inherent ambiguity and configurable code
+points of the ASCII encoding standard.
+.
+.
+.P
+\[lq]Nroff/Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+features two tables that throw light on the glyph repertoire available
+to \[lq]typesetter
+.IR roff \[rq]
+when it was first written.
+.
+Be careful of re-typeset versions of this document that can be found on
+the Internet.
+.
+Some do not accurately represent the original document:
+several glyphs are obviously missing.
+.
+More subtly,
+lowercase Greek letters are rendered upright,
+not slanted as they appeared in the C/A/T's special font and as expected
+by
+.I troff \" AT&T
+users.
+.
+.
+.P
+.MR groff_rfc1345 @MAN7EXT@
+describes an alternative set of special character glyph names,
+which extends and in some cases overrides the definitions listed above.
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR troff @MAN1EXT@ ,
+.MR groff @MAN7EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_char_7_man_C]
+.do rr *groff_groff_char_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" tab-width: 20
+.\" End:
+.\" vim: set filetype=groff tabstop=20 textwidth=72:
diff --git a/man/groff_diff.7.man b/man/groff_diff.7.man
new file mode 100644
index 0000000..0d25cb6
--- /dev/null
+++ b/man/groff_diff.7.man
@@ -0,0 +1,6188 @@
+'\" e
+.TH groff_diff @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_diff \- differences between GNU
+.I roff
+and AT&T
+.I troff
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, with no Front-Cover Texts,
+.\" and with no Back-Cover Texts.
+.\"
+.\" A copy of the Free Documentation License is included as a file
+.\" called FDL in the main directory of the groff source package.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_diff_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Local definitions
+.\" ====================================================================
+.
+.\" define a string tx for the TeX logo
+.ie t .ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X
+.el .ds tx TeX
+.
+.
+.\" from old groff_out.man
+.ie \n(.g \
+. ds ic \/
+.el \
+. ds ic \^
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The GNU
+.I roff
+text processing system,
+.IR groff ,
+is an extension of AT&T
+.IR troff , \" AT&T
+the typesetting system originating in Unix systems of the 1970s.
+.
+.I groff
+removes many arbitrary limitations and adds features,
+both to the input language and to the page description language output
+by the
+.I troff \" generic
+formatter.
+.
+Differences arising from
+.IR groff 's
+implementation of AT&T
+.I troff \" AT&T
+features are also noted.
+.
+See
+.MR roff @MAN7EXT@
+for background.
+.
+.
+.\" ====================================================================
+.SH Language
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+features identifiers of arbitrary length;
+supports color output,
+non-integral type sizes,
+and user-defined characters;
+adds more conditional expression operators;
+recognizes additional scaling units and numeric operators;
+enables general file I/O
+(in \[lq]unsafe mode\[rq] only);
+and exposes more formatter state.
+.
+.
+.\" ====================================================================
+.SS "Long names"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+introduces many new requests;
+with three exceptions
+.RB ( cp ,
+.BR do ,
+.BR rj ),
+they have names longer than two characters.
+.
+The names of registers,
+fonts,
+strings/\:macros/\:diversions,
+environments,
+special characters,
+streams,
+and colors can be of any length.
+.
+Anywhere AT&T
+.I troff \" AT&T
+supports a parameterized escape sequence that uses an opening
+parenthesis \[lq](\[rq] to introduce a two-character argument,
+.I groff
+supports a square-bracketed form \[lq][]\[rq] where the argument
+within can be of arbitrary length.
+.
+.
+.\" ====================================================================
+.SS "Font families, abstract styles, and translation"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+can group text typefaces into
+.I families
+containing each of the styles
+.RB \[lq] R \[rq],
+.RB \[lq] I \[rq],
+.RB \[lq] B \[rq],
+and
+.RB \[lq] BI \[rq].
+.
+So that a document need not be coupled to a specific font family,
+an output device can associate a style in the abstract sense with a
+mounting position.
+.
+Thus the default family can be combined with a style dynamically,
+producing a
+.I "resolved font name."
+.
+A document can
+.I translate,
+or remap,
+fonts with the
+.B ftr
+request.
+.
+.
+.P
+Applying the requests
+.BR cs ,
+.BR bd ,
+.BR tkf ,
+.BR uf ,
+or
+.B \%fspecial
+to an abstract style affects the member of the default family
+corresponding to that style.
+.
+The default family can be set with the
+.B fam
+request or
+.B \-f
+command-line option.
+.
+The
+.B styles
+directive in the output device's
+.I DESC
+file controls which mounting positions
+(if any)
+are initially associated with abstract styles rather than fonts,
+and the
+.B sty
+request can update this association.
+.
+.
+.\" ====================================================================
+.SS Colors
+.\" ====================================================================
+.
+.I groff
+supports color output with a variety of color spaces and up to 16 bits
+per channel.
+.
+Some devices,
+particularly terminals,
+may be more limited.
+.
+When color support is enabled,
+two colors are current at any given time:
+the
+.I stroke color,
+with which glyphs,
+rules (lines),
+and geometric figures are drawn,
+and the
+.I fill color,
+which paints the interior of filled geometric figures.
+.
+The
+.BR color ,
+.BR \%defcolor ,
+.BR gcolor ,
+and
+.B fcolor
+requests;
+.B \[rs]m
+and
+.B \[rs]M
+escape sequences;
+and
+.BR .color ,
+.BR .m ,
+and
+.B .M
+registers exercise color support.
+.
+.
+.\" ====================================================================
+.SS "Fractional type sizes and new scaling units"
+.\" ====================================================================
+.
+.\" BEGIN Keep (roughly) parallel with groff.texi node "Using Fractional
+.\" Type Sizes".
+AT&T
+.I troff \" AT&T
+interpreted all type size measurements in points.
+.
+Combined with integer arithmetic,
+this design choice made it impossible to support,
+for instance,
+ten and a half-point type.
+.
+In GNU
+.IR troff , \" GNU
+an output device can select a scaling factor that subdivides a point
+into \[lq]scaled points\[rq].
+.
+A type size expressed in scaled points can thus represent a non-integral
+type size.
+.
+.
+.P
+A
+.I scaled point
+is equal to
+.RI 1/ sizescale
+points,
+where
+.I sizescale
+is specified in the device description file,
+.IR DESC ,
+and defaults to\~1;
+see
+.MR groff_font @MAN5EXT@ .
+.
+Requests and escape sequences in GNU
+.I troff \" GNU
+interpret arguments that represent a type size in points,
+which the formatter multiplies by
+.I sizescale
+and converts to an integer.
+.
+Arguments treated in this way comprise those to the escape sequences
+.B \[rs]H
+and
+.BR \[rs]s ,
+to the request
+.BR ps ,
+the third argument to the
+.B cs
+request,
+and the second and fourth arguments to the
+.B tkf
+request.
+.
+Scaled points may be specified explicitly with the
+.B z
+scaling unit.
+.
+In GNU
+.IR troff , \" GNU
+the register
+.B \[rs]n[.s]
+can interpolate a non-integral type size.
+.
+The register
+.B \[rs]n[.ps]
+interpolates the type size in scaled points.
+.
+.
+.P
+For example,
+if
+.I sizescale
+is\~1000,
+then a scaled point is one thousandth of a point.
+.
+Consequently,
+.RB \[lq] ".ps 10.5" \[rq]
+is synonymous with
+.RB \[lq] ".ps 10.5z" \[rq];
+both set the type size to 10,500\~scaled points,
+or 10.5\~points.
+.
+.
+.P
+It makes no sense to use the
+.RB \[lq] z \[rq]\~scaling
+unit in a numeric expression whose default scaling unit is neither
+.RB \[lq] u \[rq]
+.RB nor\~\[lq] z \[rq],
+so GNU
+.I troff \" GNU
+disallows this.
+.
+Similarly,
+it is nonsensical to use a scaling unit other
+.RB than\~\[lq] z \[rq]
+.RB or\~\[lq] u \[rq]
+in a numeric expression whose default scaling unit
+.RB is\~\[lq] z \[rq],
+so GNU
+.I troff
+disallows this as well.
+.
+.
+.br
+.ne 2v
+.P
+Another new scaling unit,
+.RB \[lq] s \[rq],
+multiplies by the number of basic units in a scaled point.
+.
+Thus,
+.RB \[lq]\^ \[rs]n[.ps]s \[rq]
+is equal to
+.RB \[lq] 1m \[rq]
+by definition.
+.
+Do not confuse the
+.RB \[lq] s \[rq]
+and
+.RB \[lq] z \[rq]
+scaling units.
+.
+.
+.br
+.ne 2v
+.P
+Output devices may be limited in the type sizes they can employ.
+.
+The
+.B .s
+and
+.B .ps
+registers represent the type size as selected by the output driver as it
+understands a device's capability.
+.
+The last
+.I requested
+type size is interpolated in scaled points by the read-only register
+.B .psr
+and in points as a decimal fraction by the read-only string-valued
+register
+.BR .sr .
+.
+Both are associated with the environment.
+.
+For example,
+if a type size of 10.95\~points is requested,
+and the nearest size permitted by a
+.B sizes
+request
+(or by the
+.B sizes
+or
+.B \%sizescale
+directives in the device's
+.I DESC
+file)
+is 11\~points,
+the output driver uses the latter value.
+.\" END Keep (roughly) parallel with groff.texi node "Using Fractional
+.\" Type Sizes".
+.
+.
+.P
+A further two new measurement units available in
+.I groff
+are
+.RB \[lq] M \[rq],
+which indicates hundredths of an em,
+and
+.RB \[lq] f \^\[rq],
+which multiplies by 65,536.
+.
+The latter provides convenient fractions for color definitions with the
+.B \%defcolor
+request.
+.
+For example,
+0.5f equals 32768u.
+.
+.
+.\" ====================================================================
+.SS "Numeric expressions"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+permits spaces in a numeric expression within parentheses,
+and offers three new operators.
+.
+.
+.TP
+.IB e1 >? e2
+Interpolate the greater of
+.I e1
+and
+.IR e2 .
+.
+.
+.TP
+.IB e1 <? e2
+Interpolate the lesser of
+.I e1
+and
+.IR e2 .
+.
+.
+.TP
+.BI ( c ; e )
+Evaluate
+.I e
+using
+.I c
+as the default scaling unit,
+ignoring scaling units in
+.I e
+if
+.I c
+is empty.
+.
+.
+.\" ====================================================================
+.SS "Conditional expressions"
+.\" ====================================================================
+.
+More conditions can be tested with the
+.RB \[lq]\| if \|\[rq]
+and
+.B ie
+requests,
+as well as the new
+.RB \[lq] while \[rq]
+request.
+.
+.
+.TP
+.BI c\~ chr
+True if a character
+.I chr
+is available,
+where
+.I chr
+is an ordinary character
+(Unicode basic Latin excluding control characters and the space),
+a special character,
+or
+.BI \[rs]N\[aq] index\c
+.BR \[aq] .
+.
+.
+.TP
+.BI d\~ nam
+True if a string,
+macro,
+diversion,
+or request
+.I nam
+is defined.
+.
+.
+.TP
+.BI F\~ fnt
+True if a font
+.I fnt
+is available;
+.I fnt
+can be an abstract style
+or a font name.
+.
+.I fnt
+is handled as if it
+were accessed with the
+.B ft
+request
+(that is,
+abstract styles and font translation are applied),
+but
+.I fnt
+cannot be a mounting position,
+and no font is mounted.
+.
+.
+.TP
+.BI m\~ col
+True if a color
+.I col
+is defined.
+.
+.
+.TP
+.BI r\~ reg
+True if a register
+.I reg
+is defined.
+.
+.
+.TP
+.BI S\~ sty
+True if a style
+.I sty
+is registered.
+.
+Font translation applies.
+.
+.
+.TP
+.B v
+Always false.
+.
+This condition is for compatibility with certain other
+.I troff
+implementations only.
+.
+(This refers to
+.IR vtroff ,
+a translator that would convert the C/A/T output from early-vintage AT&T
+.I troff \" AT&T
+to a form suitable for Versatec and Benson-Varian plotters.)
+.
+.
+.\" ====================================================================
+.SS "Drawing commands"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+offers drawing commands to create filled
+circles and ellipses,
+and polygons.
+.\" CSTR #54 did not countenance polygons, but DWB 3.3 had outlined ones
+.\" as \D'p' as we do. Filled polygons appear to be a GNU innovation.
+.
+Stroked (outlined) objects are drawn with the stroke color and
+filled (solid) ones shaded with the fill color.
+.
+These are independent properties;
+if you want a filled,
+stroked figure,
+you must draw the same figure twice using each drawing command.
+.
+A filled figure is always smaller than a stroked one because the former
+is drawn only within its defined area,
+whereas strokes have a line thickness
+(set with another new drawing command,
+.BR \[rs]D\[aq]t\[aq] ).
+.
+.
+.\" ====================================================================
+.SS "Escape sequences"
+.\" ====================================================================
+.
+.\" TODO: Some of the synopses here and in "New requests" get pretty
+.\" discursive. It would be better to lift the introduction of new
+.\" concepts in groff programming to new subsections above. Examples
+.\" include: string parameterization, user-definable characters,
+.\" character properties (cflags), character classes; the hyphenation
+.\" language, code, and pattern file system; file stream manipulation...
+.\"
+.\" _Maybe_ output suppression. It's a big enough concept, but only
+.\" well understood by retired contributors, only used by the grohtml
+.\" output driver (still beta after 20 years), and we have some Savannah
+.\" tickets that point the way to radically simplifying its design,
+.\" eliminating its need to groff before you groff.
+.I groff
+introduces several new escape sequences
+and extends the syntax of a few AT&T
+.I troff \" AT&T
+escape sequences
+(namely,
+.BR \[rs]D ,
+.BR \[rs]f ,
+.BR \[rs]k ,
+.BR \[rs]n ,
+.BR \[rs]s ,
+.BR \[rs]$ ,
+and
+.BR \[rs]* ).
+.
+In the following list,
+escape sequences are collated alphabetically at first,
+and then by symbol roughly in Unicode code point order.
+.\" Exceptions are made to group closely-related escape sequences in an
+.\" order more agreeable to the development of a topic.
+.
+.
+.TP 7.5 \" sinfully obtain better pagination on typesetters
+.BI \[rs]A\[aq] anything \[aq]
+Interpolate 1 if
+.I anything
+is a valid identifier,
+and\~0 otherwise.
+.
+Because invalid input characters are removed,
+invalid identifiers are empty or contain spaces,
+tabs,
+or newlines.
+.
+You can employ
+.B \[rs]A
+to validate a macro argument before using it to construct another escape
+sequence or identifier.
+.
+.TP
+.BI \[rs]B\[aq] anything \[aq]
+Interpolate 1 if
+.I anything
+is a valid numeric expression,
+and\~0 otherwise.
+.
+You might use
+.B \[rs]B
+along with the
+.RB \[lq]\| if \|\[rq]
+request to filter out invalid macro arguments.
+.
+.
+.TP
+.BI \[rs]D\[aq]C\~ "d" \[aq]
+Draw filled circle of diameter
+.I d
+with its leftmost point at the drawing position.
+.
+.
+.TP
+.BI \[rs]D\[aq]E\~ "h v" \[aq]
+Draw filled ellipse with
+.I h
+and
+.I v
+as the axes and the leftmost point at the drawing position.
+.
+.
+.TP
+.BI \[rs]D\[aq]p\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+Draw polygon with vertices at drawing position and each point
+in sequence.
+.
+GNU
+.I troff \" GNU
+closes the polygon by drawing a line from
+.RI ( hn ,\~ vn )
+back to the initial drawing position;
+DWB and Heirloom
+.IR troff s \" DWB, Heirloom
+do not.
+.
+.\" XXX: This would be the "STUPID_DRAWING_POSITIONING" complained of in
+.\" src/libs/libdriver/input.cpp. It is neither the rightmost point
+.\" of the figure nor the initial drawing position that GNU troff
+.\" automatically returned to to close the figure.
+Afterward,
+the drawing position is left at
+.RI ( hn ,\~ vn ).
+.
+.
+.TP
+.BI \[rs]D\[aq]P\~ "h1 v1"\~\c
+.RI .\|.\|.\~ "hn vn"\c
+.B \[aq]
+As
+.BR \[rs]D\[aq]p\[aq] ,
+but the polygon is filled.
+.
+.
+.TP
+.BI \[rs]D\[aq]t\~ "n" \[aq]
+Set line thickness of geometric objects to
+.RI to\~ n
+basic units.
+.
+A zero
+.I n
+selects the minimal supported thickness.
+.
+A negative
+.I n
+selects a thickness proportional to the type size;
+this is the default.
+.
+.
+.TP
+.B \[rs]E
+Embed an escape character that is not interpreted in copy mode
+(compare with
+.B \[rs]a
+and
+.BR \[rs]t ).
+.
+You can use it to ease the writing of nested macro definitions.
+.
+It is also convenient to define strings containing escape sequences that
+need to work when used in copy mode
+(for example,
+as macro arguments),
+or which will be interpolated at varying macro nesting depths.
+.
+.
+.TP
+.BI \[rs]f[ font ]
+Select
+.IR font ,
+which may be a mounting position,
+abstract style,
+or font name,
+to choose the typeface.
+.
+.B \[rs]f[]
+and
+.B \[rs]fP
+are synonyms;
+we recommend the former.
+.
+.
+.TP
+.BI \[rs]F f
+.TQ
+.BI \[rs]F( fm
+.TQ
+.BI \[rs]F[ family ]
+Select default font family.
+.
+.B \[rs]F[]
+makes the previous font family the default.
+.
+.B \[rs]FP
+is unlike
+.BR \[rs]fP ;
+it selects font family \[lq]P\[rq] as the default.
+.
+See the
+.B fam
+request below.
+.
+.
+.TP
+.BI \[rs]k( rg
+.TQ
+.BI \[rs]k[ reg ]
+Mark horizontal drawing position in
+two-character register
+.RI name\~ rg
+or arbitrary register
+.RI name\~ reg .
+.
+.
+.TP
+.BI \[rs]m c
+.TQ
+.BI \[rs]m( cl
+.TQ
+.BI \[rs]m[ col ]
+Set the stroke color.
+.
+.B \[rs]m[]
+restores the previous stroke color,
+or the default if there is none.
+.
+.
+.TP
+.BI \[rs]M c
+.TQ
+.BI \[rs]M( cl
+.TQ
+.BI \[rs]M[ col ]
+Set the fill color.
+.
+.B \[rs]M[]
+restores the previous fill color,
+or the default if there is none.
+.
+.
+.TP
+.BI \[rs]n[ reg ]
+Interpolate register
+.IR reg .
+.
+.
+.TP
+.BI \[rs]O n
+.TQ
+.BI \[rs]O[ n ]
+Suppress
+.I @g@troff
+output of glyphs and geometric objects.
+.
+The sequences
+.BR \[rs]O2 ,
+.BR \[rs]O3 ,
+.BR \[rs]O4 ,
+and
+.B \[rs]O5
+are intended for internal use by
+.MR grohtml @MAN1EXT@ .
+.
+.
+.RS
+.TP
+.B \[rs]O0
+.TQ
+.B \[rs]O1
+Disable and enable,
+respectively,
+the emission of glyphs and geometric objects to the output driver,
+provided that this sequence occurs at the outermost suppression level
+(see
+.B \[rs]O3
+and
+.BR \[rs]O4 ).
+.
+Horizontal motions corresponding to non-overstruck glyph widths still
+occur.
+.
+These sequences also reset the registers
+.BR opminx ,
+.BR opminy ,
+.BR opmaxx ,
+and
+.B opmaxy
+to\~\-1.
+.
+These four registers mark the top left and bottom right hand corners of
+a box encompassing all written or drawn output.
+.
+.
+.TP
+.B \[rs]O2
+At the outermost suppression level,
+enable emission of glyphs and geometric objects,
+and write to the standard error stream the page number and values of the
+four aforementioned registers encompassing glyphs written since the last
+interpolation of a
+.B \[rs]O
+sequence,
+as well as the page offset,
+line length,
+image file name
+(if any),
+horizontal and vertical device motion quanta,
+and input file name.
+.
+Numeric values are in basic units.
+.
+.
+.TP
+.B \[rs]O3
+.TQ
+.B \[rs]O4
+Begin and end a nested suppression level,
+respectively.
+.
+.I \%grohtml
+uses this mechanism to create images of output preprocessed with
+.IR @g@pic ,
+.IR @g@eqn ,
+and
+.IR @g@tbl .
+.
+At startup,
+.I @g@troff
+is at the outermost suppression level.
+.
+.I \%pre\-grohtml
+generates these sequences when processing the document,
+using
+.I @g@troff
+with the
+.B ps
+output device,
+Ghostscript,
+and the PNM tools to produce images in PNG format.
+.
+These sequences start a new page if the device is not
+.B html
+or
+.BR xhtml ,
+to reduce the number of images crossing a page boundary.
+.
+.
+.TP
+.BI \[rs]O5[ Pfile ]
+At the outermost suppression level,
+write the name
+.I file
+to the standard error stream at position
+.IR P ,
+which must be one of
+.BR l ,
+.BR r ,
+.BR c ,
+or
+.BR i ,
+corresponding to
+left,
+right,
+centered,
+and inline alignments within the document,
+respectively.
+.
+.I file
+is is a name associated with the production of the next image.
+.RE
+.
+.
+.TP
+.BI \[rs]R\[aq] name\~\[+-]n \[aq]
+Synonymous with
+.RB \[lq] .nr
+.IR name\~\[+-]n \[rq].
+.
+.
+.TP
+.BI \[rs]s[ \[+-]n ]
+.TQ
+.BI \[rs]s \[+-] [ n ]
+.TQ
+.BI \[rs]s\[aq] \[+-]n \[aq]
+.TQ
+.BI \[rs]s \[+-] \[aq] n \[aq]
+Set the type size to,
+or increment or decrement it by,
+.I n
+scaled points.
+.
+.
+.br
+.ne 5v
+.TP
+.BI \[rs]V e
+.TQ
+.BI \[rs]V( ev
+.TQ
+.BI \[rs]V[ env ]
+Interpolate contents of the environment variable
+.IR env ,
+as returned by
+.MR getenv 3 .
+.
+.B \[rs]V
+is interpreted even in copy mode.
+.
+.
+.TP
+.BI \[rs]X\[aq] anything \[aq]
+Within
+.B \[rs]X
+arguments,
+the escape sequences
+.BR \[rs]& ,
+.BR \[rs]) ,
+.BR \[rs]% ,
+and
+.B \[rs]:
+are ignored;
+.BI \[rs] space
+and
+.B \[rs]\[ti]
+are converted to single space characters;
+and
+.B \[rs]\[rs]
+is reduced to
+.BR \[rs] .
+.
+So that the basic Latin subset of the Unicode character set
+(that is,
+ISO\~646:1991-IRV or,
+popularly,
+\[lq]US-ASCII\[rq])
+can be reliably encoded in
+.I anything,
+the special character escape sequences
+.BR \[rs]\- ,
+.BR \[rs][aq] ,
+.BR \[rs][dq] ,
+.BR \[rs][ga] ,
+.BR \[rs][ha] ,
+.BR \[rs][rs] ,
+and
+.B \[rs][ti]
+are mapped to basic Latin characters;
+see
+.MR groff_char @MAN7EXT@ .
+.
+For this transformation,
+character translations and definitions are ignored.
+.
+Other escape sequences are not supported.
+.
+.
+.IP
+If the
+.B \%use_charnames_in_special
+directive appears in the output device's
+.I DESC
+file,
+the use of special character escape sequences is
+.I not
+an error;
+they are simply output verbatim
+(with the exception of the seven mapped to Unicode basic Latin
+characters,
+discussed above).
+.
+.B \%use_charnames_in_special
+is currently employed only by
+.MR grohtml @MAN1EXT@ .
+.
+.
+.TP
+.BI \[rs]Y m
+.TQ
+.BI \[rs]Y( ma
+.TQ
+.BI \[rs]Y[ mac ]
+Interpolate a macro as a device control command.
+.
+This is similar to
+.BI \[rs]X\[aq]\[rs]*[ mac ]\[aq]\f[R],
+except the contents of
+.I mac
+are not interpreted,
+and
+.I mac
+can be a macro and thus contain newlines,
+whereas the argument to
+.B \[rs]X
+cannot.
+.
+This inclusion of newlines requires an extension to the AT&T
+.I troff \" AT&T
+output format,
+and will confuse postprocessors that do not know about it.
+.
+.
+.TP
+.BI \[rs]Z\[aq] anything \[aq]
+Save the drawing position,
+format
+.IR anything ,
+then restore it.
+.
+Tabs and leaders in the argument are ignored with an error diagnostic.
+.
+.
+.TP
+.B \[rs]#
+Everything up to and including the next newline is ignored.
+.
+This escape sequence is interpreted even in copy mode.
+.
+.B \[rs]#
+is like
+.BR \[rs]" ,
+except that
+.B \[rs]"
+does not ignore a newline;
+the latter therefore cannot be used by itself for a whole-line
+comment\[em]it leaves a blank line on the input stream.
+.
+.
+.\" Keep \$0 before \$( in spite of collation.
+.TP
+.B \[rs]$0
+Interpolate the name by which the macro being interpreted was called.
+.
+In GNU
+.I troff \" GNU
+this name can vary;
+see the
+.B als
+request.
+.
+.
+.TP
+.BI \[rs]$( nn
+.TQ
+.BI \[rs]$[ nnn ]
+In a macro or string definition,
+interpolate
+the
+.IR nn th
+or
+.IR nnn th
+argument.
+.
+Macros and strings can have an unlimited number of arguments.
+.
+.
+.TP
+.B \[rs]$*
+In a macro or string definition,
+interpolate the catenation of all arguments,
+separated by spaces.
+.
+.
+.TP
+.B \[rs]$@
+In a macro or string definition,
+interpolate the catenation of all arguments,
+with each surrounded by double quotes and separated by spaces.
+.
+.
+.TP
+.B \[rs]$\[ha]
+In a macro or string definition,
+interpolate the catenation of all arguments
+constructed in a form suitable for passage to the
+.B ds
+request.
+.
+.
+.TP
+.B \[rs])
+Interpolate a
+.I transparent
+dummy character\[em]one that is ignored by end-of-sentence detection.
+.
+It behaves as
+.BR \[rs]& ,
+except that
+.B \[rs]&
+is treated as letters and numerals normally are after
+\[lq].\[rq],
+\[lq]?\[rq],
+and
+\[lq]!\[rq];
+.B \[rs]&
+cancels end-of-sentence detection,
+and
+.B \[rs])
+does not.
+.
+.
+.TP
+.BI \[rs]*[ "string\~\c
+.RI [ arg \~.\|.\|.]\c
+.B ]
+Interpolate
+.I string,
+passing it
+.I arg
+\&.\|.\|.\&
+as arguments.
+.
+.
+.\" Keep \/ before \, in spite of collation.
+.TP
+.B \[rs]/
+Apply an
+.IR "italic correction" :
+modify the spacing of the preceding glyph so that the distance between
+it and the following glyph is correct if the latter is of upright shape.
+.
+For example,
+if an italic\~\[lq]f\^\[rq] is followed immediately by a roman right
+parenthesis,
+then in many fonts the top right portion of the\~\[lq]f\^\[rq] overlaps
+the top left of the right parenthesis,
+.if t producing \f[I]f\f[R]),
+which is ugly.
+.
+Inserting
+.B \[rs]\^/
+between them
+.if t \{\
+. nop produces
+. ie \n(.g \f[I]f\/\f[R])
+. el \f[I]f\|\f[R])
+. nop and
+.\}
+avoids this problem.
+.
+Use this escape sequence whenever an oblique glyph is immediately
+followed by an upright glyph without any intervening space.
+.
+.
+.TP
+.B \[rs],
+Apply a
+.IR "left italic correction" :
+modify the spacing of the following glyph so that the distance between
+it and the preceding glyph is correct if the latter is of upright shape.
+.
+For example,
+if a roman left parenthesis is immediately followed by an
+italic\~\[lq]f\^\[rq],
+then in many fonts the bottom left portion of the\~\[lq]f\^\[rq]
+overlaps the bottom of the left parenthesis,
+.if t producing \f[R](\f[I]f\f[R],
+which is ugly.
+.
+Inserting
+.B \[rs],
+between them
+.if t \{\
+. nop produces
+. ie \n(.g \f[R](\,\f[I]f\f[R]
+. el \f[R](\^\f[I]f\f[R]
+. nop and
+.\}
+avoids this problem.
+.
+Use this escape sequence whenever an upright glyph is followed
+immediately by an oblique glyph without any intervening space.
+.
+.
+.TP
+.B \[rs]:
+Insert a non-printing break point.
+.
+That is,
+a word can break there,
+but the soft hyphen character does not mark the break point if it does
+(in contrast to
+.RB \[lq]\^ \[rs]% \[rq]).
+.
+This escape sequence is an input word boundary,
+so the remainder of the word is subject to hyphenation as normal.
+.
+.
+.TP
+.BI \[rs]? anything \[rs]?
+When used in a diversion,
+this transparently embeds
+.I anything
+in the diversion.
+.I anything
+is read in copy mode.
+.
+When the diversion is reread,
+.I anything
+is interpreted.
+.I anything
+may not contain newlines;
+use
+.B \[rs]!\&
+if you want to embed newlines in a diversion.
+.
+The escape sequence
+.B \[rs]?\&
+is also recognized in copy mode and becomes an internal code;
+it is this code that terminates
+.IR anything .
+Thus
+.
+.
+.RS
+.IP
+.EX
+.ne 14v+\n(.Vu
+\&.nr x 1
+\&.nf
+\&.di d
+\&\[rs]?\[rs]\[rs]?\[rs]\[rs]\[rs]\[rs]?\[rs]\[rs]\[rs]\[rs]\[rs]\[rs]\
+\[rs]\c
+\&\[rs]nx\[rs]\[rs]\[rs]\[rs]?\[rs]\[rs]?\[rs]?
+\&.di
+\&.nr x 2
+\&.di e
+\&.d
+\&.di
+\&.nr x 3
+\&.di f
+\&.e
+\&.di
+\&.nr x 4
+\&.f
+.EE
+.RE
+.
+.
+.IP
+prints\~\c
+.BR 4 .
+.
+.
+.TP
+.BI \[rs][ char ]
+Typeset the special character
+.IR char .
+.
+.
+.TP
+.BI \[rs][ "base-char combining-component\~"\c
+.RB .\|.\|. ]
+Typeset a composite glyph consisting of
+.I base-char
+overlaid with one or more
+.IR combining-component s.
+.
+For example,
+.RB \[lq]\| \[rs][A\~ho] \^\[rq]
+is a capital letter \[lq]A\[rq] with a \[lq]hook accent\[rq] (ogonek).
+.
+See the
+.B \%composite
+request below;
+.IR "Groff: The GNU Implementation of troff" ,
+the
+.I groff
+Texinfo manual,
+for details of composite glyph name construction;
+and
+.MR groff_char @MAN7EXT@
+for a list of components used in composite glyph names.
+.
+.
+.TP
+.B \[rs]\[ti]
+Insert an unbreakable space that is adjustable like an ordinary space.
+.
+It is discarded from the end of an output line if a break is forced.
+.
+.
+.\" ====================================================================
+.SS "Restricted requests"
+.\" ====================================================================
+.
+To mitigate risks from untrusted input documents,
+the
+.B pi
+and
+.B sy
+requests are disabled by default.
+.
+.MR @g@troff @MAN1EXT@ 's
+.B \-U
+option enables the formatter's \[lq]unsafe mode\[rq],
+restoring their function
+(and enabling additional
+.I groff
+extension requests,
+.BR open ,
+.BR opena ,
+and
+.BR pso ).
+.
+.
+.\" ====================================================================
+.SS "New requests"
+.\" ====================================================================
+.
+.TP
+.BI .aln\~ "new old"
+Create alias
+.I new
+for existing register named
+.IR old ,
+causing the names to refer to the same stored value.
+.
+If
+.I old
+is undefined,
+a warning in category
+.RB \[lq] reg \[rq]
+is generated and the request is ignored.
+.
+To remove a register alias,
+invoke
+.B rr
+on its name.
+.
+A register's contents do not become inaccessible until it has no more
+names.
+.
+.
+.TP
+.BI .als\~ "new old"
+Create alias
+.I new
+for existing request,
+string,
+macro,
+or diversion named
+.IR old ,
+causing the names to refer to the same stored object.
+.
+If
+.I old
+is undefined,
+a warning in category
+.RB \[lq] mac \[rq]
+is produced,
+and the request is ignored.
+.
+The
+.RB \[lq] am \[rq],
+.RB \[lq] as \[rq],
+.BR da ,
+.BR de ,
+.BR di ,
+and
+.B ds
+requests
+(together with their variants)
+create a new object only if the name of the macro,
+diversion,
+or string is currently undefined
+or if it is defined as a request;
+normally,
+they modify the value of an existing object.
+.
+To remove an alias,
+invoke
+.B rm
+on its name.
+.
+The object itself is not destroyed until it has no more names.
+.
+.
+.IP
+When a request,
+macro,
+string,
+or diversion is aliased,
+redefinitions and appendments \[lq]write through\[rq] alias names.
+.
+To replace an alias with a separately defined object,
+you must use the
+.B rm
+request on its name first.
+.
+.
+.TP
+.BI .am1\~ name\~\c
+.RI [ end-name ]
+As
+.RB \[lq] am \[rq],
+but compatibility mode is disabled while the appendment to
+.I name
+is interpreted:
+a \[lq]compatibility save\[rq] token is inserted at its beginning,
+and a \[lq]compatibility restore\[rq] token at its end.
+.
+As a consequence,
+the requests
+.RB \[lq] am \[rq],
+.BR am1 ,
+.BR de ,
+and
+.B de1
+can be intermixed freely since the compatibility save/\:restore tokens
+affect only the parts of the macro populated by
+.B am1
+and
+.BR de1 .
+.
+.
+.TP
+.BI .ami\~ name\~\c
+.RI [ end-name ]
+Append to macro indirectly.
+.
+See
+.B dei
+below.
+.
+.
+.TP
+.BI .ami1\~ name\~\c
+.RI [ end-name ]
+As
+.BR ami ,
+but compatibility mode is disabled during interpretation of the
+appendment.
+.
+.
+.TP
+.BI .as1\~ name\~\c
+.RI [ contents ]
+As
+.RB \[lq] as \[rq],
+but compatibility mode is disabled while the appendment to
+.I name
+is interpreted:
+a \[lq]compatibility save\[rq] token is inserted at the beginning of
+.IR contents ,
+and a \[lq]compatibility restore\[rq] token after it.
+.
+As a consequence,
+the requests
+.RB \[lq] as \[rq],
+.BR as1 ,
+.BR ds ,
+and
+.B ds1
+can be intermixed freely since the compatibility save/\:restore tokens
+affect only the portions of the strings populated by
+.B as1
+and
+.BR ds1 .
+.
+.
+.TP
+.BI .asciify\~ div
+.I Unformat
+the diversion
+.I div
+in a way such that Unicode basic Latin (ASCII) characters,
+characters translated with the
+.B trin
+request,
+space characters,
+and some escape sequences,
+that were formatted in the diversion
+.I div
+are treated like ordinary input characters when
+.I div
+is reread.
+.
+Doing so can be useful in conjunction with the
+.B writem
+request.
+.
+.B asciify
+can be also used for gross hacks;
+for example,
+the following sets
+.RB register\~ n
+to\~1.
+.
+.
+.RS
+.IP
+.EX
+.ne 8v+\n(.Vu
+\&.tr @.
+\&.di x
+\&@nr n 1
+\&.br
+\&.di
+\&.tr @@
+\&.asciify x
+\&.x
+.EE
+.RE
+.
+.
+.IP
+.B asciify
+cannot return all items in a diversion to their source equivalent:
+nodes such as those produced by
+.BR \[rs]N[ .\|.\|.\& ]
+will remain nodes,
+so the result cannot be guaranteed to be a pure string.
+.
+See section \[lq]Copy mode\[rq] in
+.MR groff @MAN7EXT@ .
+.
+Glyph parameters such as the type face and size are not preserved;
+use
+.B unformat
+to achieve that.
+.
+.
+.TP
+.B .backtrace
+Write backtrace of input stack to the standard error stream.
+.
+See the
+.B \-b
+option of
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.TP
+.BR .blm\~ [\c
+.IR name ]
+Set a blank line macro (trap).
+.
+If a blank line macro is thus defined,
+.I groff
+executes
+.I macro
+when a blank line is encountered in the input file,
+instead of the usual behavior.
+.
+A line consisting only of spaces is also treated as blank and subject to
+this trap.
+.
+If no argument is supplied,
+the default blank line behavior is (re-)established.
+.
+.
+.TP
+.BR .box\~ [\c
+.IR name ]
+.TQ
+.BR .boxa\~ [\c
+.IR name ]
+Divert
+(or append)
+output to
+.I name,
+similarly to the
+.B di
+and
+.B da
+requests,
+respectively.
+.
+Any pending output line is
+.I not
+included in the diversion.
+.
+Without an argument,
+stop diverting output;
+any pending output line inside the diversion is discarded.
+.
+.
+.TP
+.B .break
+Exit a
+.RB \[lq] while \[rq]
+loop.
+.
+Do not confuse this request with a typographical break or the
+.B br
+request.
+.
+See
+.RB \[lq] continue \[rq].
+.
+.
+.TP
+.B .brp
+Break and adjust line;
+this is the AT&T
+.I troff \" AT&T
+escape sequence
+.B \[rs]p
+in request form.
+.
+.
+.TP
+.BI .cflags\~ "n c1 c2\~"\c
+\&.\|.\|.
+Assign properties encoded by the number
+.I n
+to characters
+.IR c1 ,
+.IR c2 ,
+and so on.
+.
+Ordinary and special characters have certain associated properties.
+.
+(Glyphs don't:
+to GNU
+.IR troff , \" GNU
+like AT&T device-independent
+.IR troff , \" AT&T
+a glyph is an identifier corresponding to a rectangle with some metrics;
+see
+.MR groff_font @MAN5EXT@ .)
+.
+The first argument is the sum of the desired flags and the remaining
+arguments are the characters to be assigned those properties.
+.
+Spaces between the
+.I cn
+arguments are optional.
+.
+Any argument
+.I cn
+can be a character class defined with the
+.B class
+request rather than an individual character.
+.
+.
+.IP
+The non-negative integer
+.I n
+is the sum of any of the following.
+.
+Some combinations are nonsensical,
+such as
+.RB \[lq] 33 \[rq]
+(1 + 32).
+.
+.
+.RS
+.IP 1
+Recognize the character as ending a sentence if followed by a newline
+or two spaces.
+.
+Initially,
+characters
+.RB \[lq] .?! \[rq]
+have this property.
+.
+.
+.IP 2
+Enable breaks before the character.
+.
+A line is not broken at a character with this property unless the
+characters on each side both have non-zero hyphenation codes.
+.
+This exception can be overridden by adding 64.
+.
+Initially,
+no characters have this property.
+.
+.
+.IP 4
+Enable breaks after the character.
+.
+A line is not broken at a character with this property unless the
+characters on each side both have non-zero hyphenation codes.
+.
+This exception can be overridden by adding 64.
+.
+Initially,
+characters
+.RB \[lq] \-\[rs][hy]\[rs][em] \^\[rq]
+have this property.
+.
+.
+.IP 8
+Mark the glyph associated with this character as overlapping other
+instances of itself horizontally.
+.
+Initially,
+characters
+.RB \[lq]\^ \[rs][ul]\[rs][rn]\[rs][ru]\[rs][radicalex]\[rs][sqrtex]\
+\& \^\[rq]
+have this property.
+.
+.
+.IP 16
+Mark the glyph associated with this character as overlapping other
+instances of itself vertically.
+.
+Initially,
+the character
+.RB \[lq]\^ \[rs][br] \^\[rq]
+has this property.
+.
+.
+.IP 32
+Mark the character as transparent for the purpose of end-of-sentence
+recognition.
+.
+In other words,
+an end-of-sentence character followed by any number of characters with
+this property is treated as the end of a sentence if followed by a
+newline or two spaces.
+.
+This is the same as having a zero space factor in \*[tx].
+.
+Initially,
+characters
+.\" The following is ordered with the apostrophe and (single) closing
+.\" quote on the ends so they are more easily visually distinguished
+.\" from the double quotation marks in roman.
+.RB \[lq]\| \[aq]\|"\|)]*\[rs][dg]\[rs][dd]\[rs][rq]\[rs]\^[cq] \|\[rq]
+have this property.
+.
+.
+.IP 64
+Ignore hyphenation codes of the surrounding characters.
+.
+Use this value in combination with values 2 and\~4.
+.
+Initially,
+no characters have this property.
+.
+.
+.IP
+For example,
+if you need an automatic break point after
+the en-dash in numeric ranges like \[lq]3000\[en]5000\[rq],
+insert
+.RS
+.RS
+.EX
+\&.cflags 68 \[rs][en]
+.EE
+.RE
+into your document.
+.
+However,
+this can lead to bad layout if done without thinking;
+in most situations,
+a better solution than
+changing the
+.B cflags
+value is inserting
+.RB \[lq] \[rs]: \[rq]
+right after the hyphen at the places that really need a break point.
+.RE
+.
+.
+.P
+The remaining values were implemented for East Asian language support;
+those who use alphabetic scripts exclusively can disregard them.
+.
+.
+.IP 128
+Prohibit a break before the character,
+but allow a break after the character.
+.
+This works only in combination with values 256 and 512 and has no effect
+otherwise.
+.
+Initially,
+no characters have this property.
+.
+.
+.IP 256
+Prohibit a break after the character,
+but allow a break before the character.
+.
+This works only in combination with values 128 and 512 and has no effect
+otherwise.
+.
+Initially,
+no characters have this property.
+.
+.
+.IP 512
+Allow a break before or after the character.
+.
+This works only in combination with values 128 and 256 and has no effect
+otherwise.
+.
+Initially,
+no characters have this property.
+.RE
+.
+.
+.IP
+In contrast to values 2 and\~4,
+the values 128,
+256,
+and 512 work
+pairwise.
+.
+If,
+for example,
+the left character has value 512,
+and the right character 128,
+no break will be automatically inserted between them.
+.
+If we use value\~6 instead for the left character,
+a break after the character can't be suppressed since the neighboring
+character on the right doesn't get examined.
+.
+.
+.TP
+.BI .char\~ "c contents"
+Define the ordinary or special
+.RI character\~ c
+as
+.IR contents ,
+which can be empty.
+.
+More precisely,
+.B char
+defines a
+.I groff
+object
+(or redefines an existing one)
+that is accessed with the
+.RI name\~ c
+on input,
+and produces
+.I contents
+on output.
+.
+Every time
+.I c
+is to be formatted,
+.I contents
+is processed in a temporary environment and the result is wrapped up
+into a single object.
+.
+Compatibility mode is turned off and the escape character is
+set
+.RB to\~ \[rs]
+while
+.I contents
+is processed.
+.
+Any emboldening,
+constant spacing,
+or track kerning is applied to this object as a whole,
+not to each character in
+.IR contents .
+.
+.
+.IP
+An object defined by this request can be used just like a glyph
+provided by the output device.
+.
+In particular,
+other characters can be translated to it with the
+.B tr
+request;
+it can be made the tab or leader fill character with the
+.B tc
+and
+.B lc
+requests;
+sequences of it can be drawn with the
+.B \[rs]l
+and
+.B \[rs]L
+escape sequences;
+and,
+if the
+.B hcode
+request is used on
+.IR c ,
+it is subject to automatic hyphenation.
+.
+.
+.IP
+To prevent infinite recursion,
+occurrences of
+.I c
+within its own definition are treated normally
+(as if it were not being defined with
+.BR char ).
+.
+The
+.B tr
+and
+.B trin
+requests take precedence if
+.B char
+both apply
+.RI to\~ c .
+.
+A character definition can be removed with the
+.B rchar
+request.
+.
+.
+.TP
+.BI .chop\~ object
+Remove the last character from the macro,
+string,
+or diversion
+.IR object .
+.
+This is useful for removing the newline from the end of a diversion that
+is to be interpolated as a string.
+.
+This request can be used repeatedly on the same
+.IR object ;
+see section \[lq]gtroff Internals\[rq] in
+.IR "Groff: The GNU Implementation of troff" ,
+the
+.I groff
+Texinfo manual,
+for discussion of nodes inserted by
+.IR groff .
+.
+.
+.TP
+.BI .class\~ "name c1 c2\~"\c
+\&.\|.\|.
+Define a character class
+(or simply \[lq]class\[rq])
+.I name
+comprising the characters or range expressions
+.IR c1 ,
+.IR c2 ,
+and so on.
+.
+.
+.IP
+A class thus defined can then be referred to in lieu of listing all the
+characters within it.
+.
+Currently,
+only the
+.B cflags
+request can handle references to character classes.
+.
+.
+.IP
+In the request's simplest form,
+each
+.I cn
+is a character
+(or special character).
+.
+.RS
+.RS
+.EX
+\&.class [quotes] \[aq] \[rs][aq] \[rs][dq] \[rs][oq] \[rs][cq] \
+\[rs][lq] \[rs][rq]
+.EE
+.RE
+.RE
+.
+.
+.IP
+Since class and special character names share the same name space,
+we recommend starting and ending the class name with
+.RB \[lq] [ \[rq]
+and
+.RB \[lq] ] \[rq],
+respectively,
+to avoid collisions with existing character names defined by
+.I groff
+or the user
+(with
+.B char
+and related requests).
+.
+This practice applies the presence of
+.RB \[lq] ] \[rq]
+in the class name to prevent the usage of the special character escape
+form
+.RB \[lq] \[rs][ .\|.\|. ] \[rq],
+thus you must use the
+.B \[rs]C
+escape to access a class with such a name.
+.
+.
+.IP
+You can also use a character range expression consisting of a start
+character followed by
+.RB \[lq] \- \[rq]
+and then an end character.
+.
+Internally,
+GNU
+.I troff \" GNU
+converts these two character names to Unicode code points
+(according to the
+.I groff
+glyph list [GGL]),
+which determine the start and end values of the range.
+.
+If that fails,
+the class definition is skipped.
+.
+Furthermore,
+classes can be nested.
+.
+.RS
+.RS
+.EX
+\&.class [prepunct] , : ; > }
+\&.class [prepunctx] \[rs]C\[aq][prepunct]\[aq] \
+\[rs][u2013]\-\[rs][u2016]
+.EE
+.RE
+The class
+.RB \[lq] [prepunctx] \[rq]
+thus contains the contents of the class
+.RB \[lq] [prepunct] \[rq]
+and characters in the range U+2013\[en]U+2016.
+.RE
+.
+.
+.IP
+If you want to include
+.RB \[lq] \- \[rq]
+in a class,
+it must be the first character value in the argument list,
+otherwise it gets misinterpreted as part of the range syntax.
+.
+.
+.IP
+It is not possible to use class names as end points of range
+definitions.
+.
+.
+.IP
+A typical use of the
+.B class
+request is to control line-breaking and hyphenation rules as defined by
+the
+.B cflags
+request.
+.
+For example,
+to inhibit line breaks before the characters belonging to the
+.RB \[lq] [prepunctx] \[rq]
+class defined in the previous example,
+you can write the following.
+.
+.RS
+.RS
+.EX
+\&.cflags 2 \[rs]C\[aq][prepunctx]\[aq]
+.EE
+.RE
+.RE
+.
+.
+.TP
+.BI .close\~ stream
+Close the stream named
+.IR stream ,
+invalidating it as an argument to the
+.B write
+request.
+.
+See
+.BR open .
+.
+.
+.TP
+.BI .composite\~ c1\~c2
+Map character name
+.I c1
+to character name
+.I c2
+when
+.I c1
+is a combining component in a composite glyph.
+.
+Typically,
+this remaps a spacing glyph to a combining one.
+.
+.
+.TP
+.B .continue
+Skip the remainder of a
+.RB \[lq] while \[rq]
+loop's body,
+immediately starting the next iteration.
+.
+See
+.BR break .
+.
+.
+.TP
+.BI .color\~ n
+If
+.I n
+is non-zero or missing,
+enable colors
+(the default),
+otherwise disable them.
+.
+.
+.TP
+.BI .cp\~ n
+If
+.I n
+is non-zero or missing,
+enable compatibility mode,
+otherwise disable it.
+.
+In compatibility mode,
+long names are not recognized,
+and the incompatibilities they cause do not arise.
+.
+.
+.TP
+.BI .defcolor\~ "ident scheme color-component\~\c"
+\&.\|.\|.
+Define a color named
+.I ident.
+.
+.I scheme
+identifies a color space and determines the number of required
+.IR color-component s;
+it must be one of
+.RB \[lq] rgb \[rq]
+(three components),
+.RB \[lq] cmy \[rq]
+(three components),
+.RB \[lq] cmyk \[rq]
+(four components),
+or
+.RB \[lq] gray \[rq]
+(one component).
+.
+.RB \[lq] grey \[rq]
+is accepted as a synonym of
+.RB \[lq] gray \[rq].
+.
+The color components can be encoded as a hexadecimal value starting
+with
+.B #
+or
+.BR ## .
+.
+The former indicates that each component is in the range 0\[en]255
+(0\[en]FF),
+the latter the range 0\[en]65535 (0\[en]FFFF).
+.
+Alternatively,
+each color component can be specified as a decimal fraction in the range
+0\[en]1,
+interpreted using a default scaling unit
+.RB of\~\[lq] f \[rq],
+which multiplies its value by 65,536
+(but clamps it at 65,535).
+.
+.
+.IP
+Each output device has a color named
+.RB \[lq] default \[rq],
+which cannot be redefined.
+.
+A device's default stroke and fill colors are not necessarily the same.
+.
+.
+.TP
+.BI .de1\~ name\~\c
+.RI [ end-name ]
+Define a macro to be interpreted with compatibility mode disabled.
+.
+When
+.I name
+is called,
+compatibility mode enablement status is saved;
+it is restored when the call completes.
+.
+.
+.TP
+.BI .dei\~ name\~\c
+.RI [ end-name ]
+Define macro indirectly,
+with the name of the macro to be defined in string
+.I name
+and the name of the end macro terminating its definition in string
+.IR end-name .
+.
+.
+.TP
+.BI .dei1\~ name\~\c
+.RI [ end-name ]
+As
+.BR dei ,
+but compatibility mode is disabled while the definition of the macro
+named in string
+.I name
+is interpreted.
+.
+.
+.TP
+.BI .device\~ anything
+Write
+.IR anything ,
+read in copy mode,
+to
+.I @g@troff
+output as a device control command.
+.
+An initial neutral double quote is stripped to allow the embedding of
+leading spaces.
+.
+.
+.TP
+.BI .devicem\~ name
+Write contents of macro or string
+.I name
+to
+.I @g@troff
+output as a device control command.
+.
+.
+.TP
+.BI .do\~ name\~\c
+.RI [ arg \~.\|.\|.]
+Interpret the string,
+request,
+diversion,
+or macro
+.I name
+(along with any arguments)
+with compatibility mode disabled.
+.
+Compatibility mode is restored
+(only if it was active)
+when the
+.I expansion
+of
+.I name
+is interpreted;
+that is,
+the restored compatibility state applies to the contents of the macro,
+string,
+or diversion
+.I name
+as well as data read from files or pipes if
+.I name
+is any of the
+.BR so ,
+.BR soquiet ,
+.BR mso ,
+.BR msoquiet ,
+or
+.B pso
+requests.
+.
+.
+.IP
+For example,
+.RS
+.RS \" one "extra" RS to get us inboard of this indented paragraph
+.EX
+\&.de mac1
+FOO
+\&..
+\&.de1 mac2
+groff
+\&.mac1
+\&..
+\&.de mac3
+compatibility
+\&.mac1
+\&..
+\&.de ma
+\[rs]\[rs]$1
+\&..
+\&.cp 1
+\&.do mac1
+\&.do mac2 \[rs]" mac2, defined with .de1, calls "mac1"
+\&.do mac3 \[rs]" mac3 calls "ma" with argument "c1"
+\&.do mac3 \[rs][ti] \[rs]" groff syntax accepted in .do arguments
+.EE
+.RE
+results in
+.RS
+.EX
+FOO groff FOO compatibility c1 \[ti]
+.EE
+.RE
+as output.
+.RE \" this "extra" RE avoids indentation of the remaining paragraphs
+.
+.
+.TP
+.BI .ds1\~ "name contents"
+As
+.BR ds ,
+but compatibility mode is disabled while
+.I name
+is interpreted:
+a \[lq]compatibility save\[rq] token is inserted at the beginning of
+.IR contents ,
+and a \[lq]compatibility restore\[rq] token after it.
+.
+.
+.TP
+.B .ecr
+Restore the escape character saved with
+.BR ecs ,
+or set escape character to
+.RB \[lq]\| \[rs] \[rq]
+if none has been saved.
+.
+.
+.TP
+.B .ecs
+Save the current escape character.
+.
+.
+.TP
+.BI .evc\~ env
+Copy the properties of environment
+.I env
+to the current environment,
+except for the following data.
+.
+.
+.RS
+.IP \[bu] 2n
+a partially collected line,
+if present;
+.
+.
+.IP \[bu]
+the interruption status of the previous input line
+(due to use of the
+.B \[rs]c
+escape sequence);
+.
+.
+.IP \[bu]
+the count of remaining lines to center,
+to right-justify,
+or to underline
+(with or without underlined spaces)\[em]these are set to zero;
+.
+.
+.IP \[bu]
+the activation status of temporary indentation;
+.
+.
+.IP \[bu]
+input traps and their associated data;
+.
+.
+.IP \[bu]
+the activation status of line numbering
+(which can be reactivated with
+.RB \[lq] .nm\~+0 \[rq]);
+and
+.
+.
+.IP \[bu]
+the count of consecutive hyphenated lines
+(set to zero).
+.RE
+.
+.
+.TP
+.BR .fam\~ [\c
+.IR family ]
+Set default font family to
+.IR family .
+.
+If no argument is given,
+the previous font family is selected,
+or the formatter's default family if there is none.
+.
+The formatter's default font family is \[lq]T\[rq] (Times),
+but it can be overridden by the output device\[em]see
+.MR groff_font @MAN5EXT@ .
+.
+The default font family is associated with the environment.
+.
+See
+.BR \[rs]F .
+.
+.
+.TP
+.BI .fchar\~ c\~contents
+Define fallback
+.RI character\~ c
+as
+.IR contents .
+.
+The syntax of this request is the same as the
+.B char
+request;
+the difference is that a character defined with
+.B char
+hides a glyph with the same name in the selected font,
+whereas characters defined with
+.B fchar
+are checked only if
+.I c
+isn't found in the selected font.
+.
+This test happens before special fonts are searched.
+.
+.
+.TP
+.BI .fcolor\~ color
+Set the fill color to
+.IR color .
+.
+Without an argument,
+the previous fill color is selected.
+.
+.
+.TP
+.BI .fschar\~ f\~c\~contents
+Define fallback special
+.RI character\~ c
+for font\~\c
+.I f
+as
+.IR contents .
+.
+A character defined by
+.B fschar
+is located after the list of fonts declared with
+.B \%fspecial
+is searched but before those declared with the
+.RB \%\[lq] special \[rq]
+request.
+.
+.TP
+.BI .fspecial\~ "f s1 s2\~"\c
+\&.\|.\|.
+When
+.RI font\~ f
+is selected,
+fonts
+.IR s1 ,
+.IR s2 ,
+\&.\|.\|.\&
+are treated as special;
+that is,
+they are searched for glyphs not found in
+.IR f .
+.
+Any fonts specified in the
+.RB \%\[lq] special \[rq]
+request are searched after
+.IR s1 ,
+.IR s2 ,
+and so on.
+.
+Without
+.I s
+arguments,
+.B \%fspecial
+clears the list of fonts treated as special when
+.I f
+is selected.
+.
+.
+.TP
+.BI .ftr\~ f\~g
+Translate
+.RI font\~ f
+.RI to\~ g .
+.
+Whenever a font
+.RI named\~ f
+is referred to in an
+.B \[rs]f
+escape sequence,
+in the
+.B F
+and
+.B S
+conditional expression operators,
+or in the
+.BR ft ,
+.BR ul ,
+.BR bd ,
+.BR cs ,
+.BR tkf ,
+.BR \%special ,
+.BR \%fspecial ,
+.BR fp ,
+or
+.B sty
+requests,
+.RI font\~ g
+is used.
+If
+.I g
+is missing or identical
+.RI to\~ f ,
+then
+.RI font\~ f
+is not translated.
+.
+.
+.TP
+.BI .fzoom\~ f\~zoom
+Set zoom factor
+.I zoom
+for font\~\c
+.IR f .
+.I zoom
+must a non-negative integer multiple of 1/1000th.
+.
+If it is missing or is equal to zero,
+it means the same as 1000,
+namely no magnification.
+.
+.IR f \~\c
+must be a resolved font name,
+not an abstract style.
+.\" XXX: What about a mounting position? It's not rejected...
+.
+.
+.TP
+.BI .gcolor\~ color
+Set the stroke color to
+.IR color .
+.
+Without an argument,
+the previous stroke color is selected.
+.
+.
+.TP
+.BI .hcode\~ "c1 code1\~"\c
+.RI [ "c2 code2" "] .\|.\|."
+Set the hyphenation code of character
+.I c1
+to
+.IR code1 ,
+that of
+.I c2
+to
+.IR code2 ,
+and so on.
+.
+A hyphenation code must be an ordinary character
+(not a special character escape sequence)
+other than a digit.
+.
+The request is ignored if given no arguments.
+.
+.
+.IP
+For hyphenation to work,
+hyphenation codes must be set up.
+.
+At startup,
+.I groff
+assigns hyphenation codes to the letters \[lq]a\[en]z\[rq]
+(mapped to themselves),
+to the letters \[lq]A\[en]Z\[rq]
+(mapped to \[lq]a\[en]z\[rq]),
+and zero to all other characters.
+.
+Normally,
+hyphenation patterns contain only lowercase letters which should be
+applied regardless of case.
+.
+In other words,
+they assume that the words \[lq]ABBOT\[rq] and \[lq]Abbot\[rq] should be
+hyphenated exactly as \[lq]abbot\[rq] is.
+.
+.B hcode
+extends this principle to letters outside the Unicode basic Latin
+alphabet;
+without it,
+words containing such letters won't be hyphenated properly even if the
+corresponding hyphenation patterns contain them.
+.
+.
+.TP
+.BI .hla\~ lang
+Set the hyphenation language to
+.IR lang .
+.
+Hyphenation exceptions specified with the
+.B hw
+request and hyphenation patterns and exceptions specified with the
+.B hpf
+and
+.B hpfa
+requests are associated with the hyphenation language.
+.
+The
+.B hla
+request is usually invoked by a localization file,
+which is in turn loaded by the
+.I troffrc
+or
+.I troffrc\-end
+file;
+see the
+.B hpf
+request below.
+.
+The hyphenation language is associated with the environment.
+.
+.
+.TP
+.BR .hlm\~ [\c
+.IR n ]
+Set the maximum number of consecutive hyphenated lines
+.RI to\~ n .
+.
+If
+.I n
+is negative,
+there is no maximum.
+.
+If omitted,
+.I n
+is\~\-1.
+.
+This value is associated with the environment.
+.
+Only lines output from a given environment count towards the maximum
+associated with that environment.
+.
+Hyphens resulting from
+.B \[rs]%
+are counted;
+explicit hyphens are not.
+.
+.
+.TP
+.BI .hpf\~ pattern-file
+Read hyphenation patterns from
+.IR pattern-file .
+.
+This file is sought in the same way that macro files are with the
+.B mso
+request or the
+.BI \-m name
+command-line option to
+.MR groff @MAN1EXT@
+and
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.IP
+The
+.I pattern-file
+should have the same format as (simple) \*[tx] pattern files.
+.
+The following scanning rules are implemented.
+.
+.
+.RS
+.IP \[bu] 2n
+A percent sign starts a comment
+(up to the end of the line)
+even if preceded by a backslash.
+.
+.
+.IP \[bu]
+\[lq]Digraphs\[rq] like
+.B \[rs]$
+are not supported.
+.
+.
+.IP \[bu]
+.RB \[lq] \[ha]\[ha]\c
+.IR xx \[rq]
+(where each
+.I x
+is 0\[en]9 or a\[en]f) and
+.BI \[ha]\[ha] c
+.RI (character\~ c
+in the code point range 0\[en]127 decimal)
+are recognized;
+other uses
+.RB of\~ \[ha]
+cause an error.
+.
+.
+.IP \[bu]
+No macro expansion is performed.
+.
+.
+.IP \[bu]
+.B hpf
+checks for the expression
+.BR \[rs]patterns{ .\|.\|. }
+(possibly with whitespace before or after the braces).
+.
+Everything between the braces is taken as hyphenation patterns.
+.
+Consequently,
+.RB \[lq] { \[rq]
+and
+.RB \[lq] } \[rq]
+are not allowed in patterns.
+.
+.
+.IP \[bu]
+Similarly,
+.BR \[rs]hyphenation{ .\|.\|. }
+gives a list of hyphenation exceptions.
+.
+.
+.IP \[bu]
+.B \[rs]endinput
+is recognized also.
+.
+.
+.IP \[bu]
+For backwards compatibility,
+if
+.B \[rs]patterns
+is missing,
+the whole file is treated as a list of hyphenation patterns
+(but the
+.RB \[lq] % \[rq]
+character is still recognized as the start of a comment).
+.RE
+.
+.
+.IP
+Use the
+.B hpfcode
+request
+(see below)
+to map the encoding used in hyphenation pattern files to
+.IR groff 's
+input encoding.
+.
+.
+.IP
+The set of hyphenation patterns is associated with the hyphenation
+language set by the
+.B hla
+request.
+.
+The
+.B hpf
+request is usually invoked by a localization file loaded by the
+.I troffrc
+file.
+.
+By default,
+.I troffrc
+loads the localization file for English.
+.
+(As of
+.I groff
+1.23.0,
+localization files for Czech
+.RI ( cs ),
+German
+.RI ( de ),
+English
+.RI ( en ),
+French
+.RI ( fr ),
+Japanese
+.RI ( ja ),
+Swedish
+.RI ( sv ),
+and Chinese
+.RI ( zh )
+exist.)
+.
+For Western languages,
+the localization file sets the hyphenation mode and loads hyphenation
+patterns and exceptions.
+.
+.
+.IP
+A second call to
+.B hpf
+(for the same language)
+replaces the old patterns with the new ones.
+.
+.
+.IP
+Invoking
+.B hpf
+causes an error if there is no hyphenation language.
+.
+.
+.IP
+If no
+.B hpf
+request is specified
+(either in the document,
+in a file loaded at startup,
+or in a macro package),
+GNU
+.I troff \" GNU
+won't automatically hyphenate at all.
+.
+.
+.TP
+.BI .hpfa\~ pattern-file
+As
+.BR hpf ,
+except that the hyphenation patterns and exceptions from
+.I pattern-file
+are appended to the patterns already applied to the hyphenation language
+of the environment.
+.
+.
+.TP
+.BI .hpfcode\~ "a b"\c
+.RI \~[ "c d" "] .\|.\|."
+Define mapping values for character codes in pattern files.
+.
+This is an older mechanism no longer used by
+.IR groff 's
+own macro files;
+for its successor,
+see
+.B hcode
+above.
+.
+.B hpf
+or
+.B hpfa
+apply the mapping
+after reading or appending to the active list of patterns.
+.
+Its arguments are pairs of character codes\[em]integers from 0 to\~255.
+.
+The request maps character
+.RI code\~ a
+to
+.RI code\~ b ,
+.RI code\~ c
+to
+.RI code\~ d ,
+and so on.
+.
+Character codes that would otherwise be invalid in
+.I groff
+can be used.
+.
+By default,
+every code maps to itself except those for letters \[lq]A\[rq] to
+\[lq]Z\[rq],
+which map to those for \[lq]a\[rq] to \[lq]z\[rq].
+.
+.
+.TP
+.BR .hym\~ [\c
+.IR length ]
+Set the (right) hyphenation margin
+.RI to\~ length .
+.
+If the adjustment mode is not
+.RB \[lq] b \[rq]
+or
+.RB \[lq] n \[rq],
+the line is not hyphenated if it is shorter than
+.IR length .
+.
+Without an argument,
+the default hyphenation margin is reset to its default value,
+0.
+.
+The default scaling unit
+.RB is\~\[lq] m \[rq].
+.
+The hyphenation margin is associated with the environment.
+.
+A negative argument resets the hyphenation margin to zero,
+emitting a warning in category
+.RB \[lq] range \[rq].
+.
+.
+.TP
+.BR .hys\~ [\c
+.IR hyphenation-space ]
+Suppress hyphenation of the line in adjustment modes
+.RB \[lq] b \[rq]
+or
+.RB \[lq] n \[rq],
+if it can be justified by adding no more than
+.I hyphenation-space
+extra space to each inter-word space.
+.
+Without an argument,
+the hyphenation space adjustment threshold is set to its default value,
+0.
+.
+The default scaling unit
+.RB is\~\[lq] m \[rq].
+.
+The hyphenation space adjustment threshold is associated with the
+current environment.
+.
+A negative argument resets the hyphenation space adjustment threshold to
+zero,
+emitting a warning in category
+.RB \[lq] range \[rq].
+.
+.
+.TP
+.BI .itc\~ n\~name
+As
+.RB \[lq] it \[rq],
+but lines interrupted with the
+.B \[rs]c
+escape sequence are not applied to the line count.
+.
+.
+.TP
+.BI .kern\~ n
+If
+.I n
+is non-zero or missing,
+enable pairwise kerning
+(the default),
+otherwise disable it.
+.
+.
+.TP
+.BI .length\~ "reg anything"
+Compute the number of characters in
+.I anything
+and return the count in the register
+.IR reg .
+.
+If
+.I reg
+doesn't exist,
+it is created.
+.
+.I anything
+is read in copy mode.
+.
+.
+.RS
+.IP
+.EX
+.B .ds xxx abcd\eh\[aq]3i\[aq]efgh
+.B .length yyy \e*[xxx]
+.B \en[yyy]
+14
+.EE
+.RE
+.
+.
+.TP
+.BI .linetabs\~ n
+.RS
+If
+.I n
+is non-zero or missing,
+enable line-tabs mode,
+otherwise disable it
+(the default).
+.
+In this mode,
+tab stops are computed relative to the start of the pending output line,
+instead of the drawing position corresponding to the start of the input
+line.
+.
+Line-tabs mode is a property of the environment.
+.
+.
+.P
+For example,
+the following
+.
+.
+.RS
+.P
+.ne 6v+\n(.Vu
+.EX
+\&.ds x a\[rs]t\[rs]c
+\&.ds y b\[rs]t\[rs]c
+\&.ds z c
+\&.ta 1i 3i
+\&\[rs]*x
+\&\[rs]*y
+\&\[rs]*z
+.EE
+.RE
+.
+yields
+.
+.RS
+.EX
+a b c
+.EE
+.RE
+.
+whereas in line-tabs mode,
+the same input gives
+.
+.RS
+.EX
+a b c
+.EE
+.RE
+.
+instead.
+.RE
+.
+.
+.TP
+.BR .lsm\~ [\c
+.IR name ]
+Set the leading space macro (trap) to
+.IR name .
+.
+If there are leading space characters on an input line,
+.I name
+is invoked in lieu of the usual
+.I roff
+behavior;
+the leading spaces are removed.
+.
+The count of leading spaces on an input line is stored in
+.BR \[rs]n[lsn] ,
+and the amount of corresponding horizontal motion in
+.BR \[rs]n[lss] ,
+irrespective of whether a leading space trap is set.
+.
+When it is,
+the leading spaces are removed from the input line,
+and no motion is produced before calling
+.IR name .
+.
+If no argument is supplied,
+the default leading space behavior is (re-)established.
+.
+.
+.TP
+.BI .mso\~ file
+As
+.RB \[lq] so \[rq],
+except that
+.I file
+is sought in the same directories as arguments to the
+.MR groff @MAN1EXT@
+and
+.MR @g@troff @MAN1EXT@
+.B \-m
+command-line option are
+(the \[lq]tmac path\[rq]).
+.
+If the file name to be interpolated has the form
+.IB name .tmac
+and it isn't found,
+.B mso
+tries to include
+.BI tmac. name
+instead and vice versa.
+.
+If
+.I file
+does not exist,
+a warning in category
+.RB \[lq] file \[rq]
+is emitted
+and the request has no other effect.
+.
+.
+.TP
+.BI .msoquiet\~ file
+As
+.BR mso ,
+but no warning is emitted if
+.I file
+does not exist.
+.
+.
+.TP
+.BI .nop \~anything
+Interpret
+.I anything
+as if it were an input line.
+.
+.B nop
+resembles
+.RB \[lq] ".if 1" \[rq];
+it puts a break on the output if
+.I anything
+is empty.
+.
+Unlike
+.RB \[lq]\| if \|\[rq],
+it cannot govern conditional blocks.
+.
+Its application is to maintain consistent indentation within macro
+definitions even when producing text lines.
+.
+.
+.TP
+.B .nroff
+Make the
+.B n
+conditional expression evaluate true and
+.B t
+false.
+.
+See
+.BR troff .
+.
+.
+.TP
+.BI .open\~ "stream file"
+Open
+.I file
+for writing and associate
+.I stream
+with it.
+.
+See
+.B write
+and
+.BR close .
+.
+.
+.TP
+.BI .opena\~ "stream file"
+As
+.BR open ,
+but if
+.I file
+exists,
+append to it instead of truncating it.
+.
+.
+.TP
+.BI .output\~ contents
+Emit
+.IR contents ,
+which are read in copy mode,
+to the formatter output;
+this is similar to
+.B \[rs]!\&
+used in the top-level diversion.
+.
+An initial neutral double quote in
+.I contents
+is stripped to allow the embedding of leading spaces.
+.\" XXX: useless request warning if no argument?
+.
+.
+.TP
+.B .pev
+Report the state of the current environment followed by that of all
+other environments to the standard error stream.
+.
+.
+.TP
+.B .pnr
+Write the names and values of all currently defined registers to the
+standard error stream.
+.
+.
+.TP
+.BI .psbb \~file
+Get the bounding box of a PostScript image
+.IR file .
+.
+This file must conform to Adobe's Document Structuring Conventions;
+the request attempts to extract the bounding box values from a
+.B \%%%BoundingBox
+comment.
+.
+After invocation,
+the
+.I x
+and
+.I y
+coordinates
+(in PostScript units)
+of the lower left and upper right corners can be found in the registers
+.BR \[rs]n[llx] ,
+.BR \[rs]n[lly] ,
+.BR \[rs]n[urx] ,
+and
+.BR \[rs]n[ury] ,
+respectively.
+.
+If an error occurs,
+these four registers are set to zero.
+.
+.
+.TP
+.BI .pso \~command
+As
+.RB \[lq] so \[rq],
+except that input comes from the standard output stream of
+.IR command .
+.
+.
+.TP
+.B .ptr
+Report the names and vertical positions of all page location traps
+to the standard error stream.
+.
+Empty slots in the list are shown as well,
+because they can affect the visibility of subsequently planted traps.
+.
+.
+.TP
+.BI .pvs \~\[+-]n
+Set the post-vertical line spacing
+.RI to\~ n ;
+default scaling unit
+.RB is\~\[lq] p \[rq].
+.
+With no argument,
+the post-vertical line space is set to its previous value.
+.
+.
+.IP
+In GNU
+.IR troff , \" GNU
+the distance between text baselines consists of the extra pre-vertical
+line spacing set by the most negative
+.B \[rs]x
+argument on the pending output line,
+the vertical spacing
+.RB ( vs ),
+the extra post-vertical line spacing set by the most positive
+.B \[rs]x
+argument on the pending output line,
+and the post-vertical line spacing set by this request.
+.
+.
+.TP
+.BI .rchar\~ c\~\c
+\&.\|.\|.
+Remove definition of each ordinary or special character
+.IR c ,
+undoing the effect of a
+.BR char ,
+.BR fchar ,
+or
+.B schar
+request.
+.
+Glyphs,
+which are defined by font description files,
+cannot be removed.
+.
+Spaces and tabs may separate
+.I c
+arguments.
+.
+.
+.TP
+.B .return
+Within a macro,
+return immediately.
+.
+If called with an argument,
+return twice,
+namely from the current macro and from the macro one level higher.
+.
+No effect otherwise.
+.\" XXX: useless request warning?
+.
+.
+.TP
+.BI .rfschar\~ "f c\~"\c
+\&.\|.\|.
+Remove each fallback special
+.RI character\~ c
+for font
+.IR f .
+.
+Spaces and tabs may separate
+.I c
+arguments.
+.
+See
+.BR fschar .
+.
+.
+.TP
+.BR .rj\~ [\c
+.IR n ]
+Right-align the
+.RI next\~ n
+input lines.
+.
+Without an argument,
+right-align the next input line.
+.
+.B rj
+implies
+.RB \[lq] ".ce 0" \[rq],
+and
+.B ce
+implies
+.RB \[lq] ".rj 0" \[rq].
+.
+.
+.TP
+.BI .rnn \~r1\~r2
+Rename register
+.I r1
+to
+.IR r2 .
+.
+If
+.I r1
+doesn't exist,
+the request is ignored.
+.
+.
+.TP
+.BI .schar\~ c\~contents
+Define global fallback character
+.I c
+as
+.IR contents .
+.
+See
+.BR char ;
+the distinction is that a character defined with
+.B schar
+is located after the list of fonts declared with the
+.B \%special
+request but before any mounted special fonts.
+.
+.
+.TP
+.BR .shc \~\c
+.RI [ c ]
+Set the soft hyphen character,
+inserted when a word is hyphenated automatically or at a hyphenation
+character,
+.RI to\~ c .
+.
+If
+.I c
+is omitted,
+the soft hyphen character is set to the default,
+.BR \[rs][hy] .
+.
+If the selected glyph does not exist in the font in use at a potential
+hyphenation point,
+then the line is not broken at that point.
+.
+Neither character definitions
+.RB ( char
+and similar)
+nor translations
+.RB ( tr
+and similar)
+are considered when assigning the soft hyphen character.
+.
+.
+.TP
+.BI .shift\~ n
+In a macro,
+shift the arguments by
+.I n
+positions:
+.RI argument\~ i
+becomes argument
+.IR i \|\-\| n ;
+arguments 1
+.RI to\~ n
+are no longer available.
+.
+.RI If\~ n
+is missing,
+arguments are shifted by\~1.
+.
+No effect otherwise.
+.\" XXX: useless request warning?
+.
+.
+.TP
+.BI .sizes\~ "s1 s2\~"\c
+.RI .\|.\|.\~ sn\~\c
+.RB [ 0 ]
+Set the available type sizes to
+.IR s1 ,
+.IR s2 ,
+\&.\|.\|.\&
+.I sn
+scaled points.
+.
+The list of sizes can be terminated by an
+.RB optional\~\[lq] 0 \[rq].
+.
+Each
+.I si
+can also be a range
+.IR m \(en n .
+.
+In contrast to the device description file directive of the same name
+(see
+.MR groff_font @MAN5EXT@ ),
+the argument list can't extend over more than one line.
+.
+.
+.TP
+.BI .soquiet\~ file
+As
+.RB \[lq] so \[rq],
+but no warning is emitted if
+.I file
+does not exist.
+.
+.
+.TP
+.BI .special\~ f\~\c
+\&.\|.\|.
+Declare each font
+.I f
+as special,
+searching it for glyphs not found in the selected font.
+.
+Without arguments,
+this list of special fonts is made empty.
+.
+.
+.TP
+.BR .spreadwarn\~ [\c
+.IR limit ]
+Emit a
+.B break
+warning if the additional space inserted for each space between words in
+an output line adjusted to both margins with
+.RB \[lq] .ad\~b \[rq]
+is larger than or equal to
+.IR limit .
+.
+A negative value is treated as zero;
+an absent argument toggles the warning on and off without changing
+.IR limit .
+.
+The default scaling unit is
+.BR m .
+.
+At startup,
+.B spreadwarn
+is inactive and
+.I limit
+is 3\~m.
+.
+.
+.IP
+For example,
+.RB \[lq] ".spreadwarn 0.2m" \[rq]
+causes a warning if
+.B break
+warnings are not suppressed and
+.I @g@troff
+must add 0.2\~m or more for each inter-word space in a line.
+.
+.
+.TP
+.BI .stringdown \~str
+.TQ
+.BI .stringup \~str
+Alter the string named
+.I str
+by replacing each of its bytes with its
+lowercase
+.RB ( down )
+or uppercase
+.RB ( up )
+version
+(if one exists).
+.
+Special characters
+(see
+.MR groff_char @MAN7EXT@ )
+will often transform in the expected way due to the regular naming
+convention for accented characters.
+.
+When they do not,
+use substrings and/or catenation.
+.
+.
+.IP
+.RS
+.RS
+.EX
+.B .ds resume R\e[\[aq]e]sum\e[\[aq]e]\e"
+.B \e*[resume]
+.B .stringdown resume
+.B \e*[resume]
+.B .stringup resume
+.B \e*[resume]
+R\['e]sum\['e] r\['e]sum\['e] R\['E]SUM\['E]
+.EE
+.RE
+.RE
+.
+.
+.TP
+.BI .sty\~ n\~s
+Associate abstract
+.RI style\~ s
+with font mounting
+.RI position\~ n .
+.
+.
+.TP
+.BI .substring\~ "string start\~"\c
+.RI [ end ]
+Replace the string named
+.I string
+with its substring bounded by the indices
+.I start
+and
+.IR end ,
+inclusively.
+.
+The first character in the string has index\~0.
+.
+If
+.I end
+is omitted,
+it is implicitly set to the largest valid value
+(the string length minus one).
+.
+Negative indices count backwards from the end of the string:
+the last character has index\~\-1,
+the character before the last has index\~\-2,
+and so on.
+.
+.
+.RS
+.IP
+.EX
+.B .ds xxx abcdefgh
+.B .substring xxx 1 \-4
+.B \e*[xxx]
+bcde
+.B .substring xxx 2
+.B \e*[xxx]
+de
+.EE
+.RE
+.
+.
+.TP
+.BI .tkf\~ f\~s1\~n1\~s2\~n2
+Enable track kerning for font\~\c
+.IR f .
+When the current font is\~\c
+.I f
+the width of every glyph is increased by an amount between
+.I n1
+and
+.IR n2 ;
+when the current type size is less than or equal to
+.I s1
+the width is increased by
+.IR n1 ;
+when it is greater than or equal to
+.I s2
+the width is increased by
+.IR n2 ;
+when the type size is greater than or equal to
+.I s1
+and less than or equal to
+.I s2
+the increase in width is a linear function of the type size.
+.
+.
+.TP
+.BI .tm1\~ message
+As
+.B tm
+request,
+but strips a leading neutral double quote from
+.I message
+to allow the embedding of leading spaces.
+.
+.
+.TP
+.BI .tmc\~ message
+As
+.B tm1
+request,
+but does not append a newline.
+.
+.
+.TP
+.BI .trf\~ file
+Transparently output the contents of file
+.IR file .
+.
+Each line is output as if preceded by
+.BR \[rs]! ;
+however,
+the lines are not subject to copy-mode interpretation.
+.
+If the file does not end with a newline,
+then a newline is added.
+.
+Unlike
+.BR cf ,
+.I file
+cannot contain characters
+that are invalid as input to GNU
+.IR troff . \" GNU
+.
+.
+.IP
+For example,
+you can define a macro\~\c
+.I x
+containing the contents of file\~\c
+.IR f ,
+using
+.
+.
+.RS
+.IP
+.ne 2v+\n(.Vu
+.EX
+\&.di x
+\&.trf f
+\&.di
+.EE
+.RE
+.
+.
+.TP
+.BI .trin\~ abcd
+This is the same as the
+.B tr
+request except that the
+.B asciify
+request uses the character code
+(if any)
+before the character translation.
+.
+Example:
+.
+.
+.RS
+.IP
+.EX
+\&.trin ax
+\&.di xxx
+\&a
+\&.br
+\&.di
+\&.xxx
+\&.trin aa
+\&.asciify xxx
+\&.xxx
+.EE
+.RE
+.
+.
+.IP
+The result is \[lq]x\~a\[rq].
+.
+Using
+.BR tr ,
+the result would be \[lq]x\~x\[rq].
+.
+.
+.TP
+.BI .trnt\~ abcd
+This is the same as the
+.B tr
+request except that the translations do not apply to text that is
+transparently throughput into a diversion with
+.BR \[rs]! .
+For example,
+.
+.
+.RS
+.IP
+.EX
+\&.tr ab
+\&.di x
+\&\[rs]!.tm a
+\&.di
+\&.x
+.EE
+.RE
+.
+.
+.IP
+prints\~\c
+.BR b ;
+if
+.B trnt
+is used instead of
+.B tr
+it prints\~\c
+.BR a .
+.
+.
+.TP
+.B .troff
+Make the
+.B t
+conditional expression evaluate true and
+.B n
+false.
+.
+See
+.BR nroff .
+.
+.
+.TP
+.BI .unformat\~ div
+Unformat the diversion
+.IR div .
+.
+Unlike
+.BR asciify ,
+.B unformat
+handles only tabs and spaces between words,
+the latter usually arising from spaces or newlines in the input.
+.
+Tabs are treated as input tokens,
+and spaces become adjustable again.
+.
+The vertical sizes of lines are not preserved,
+but glyph information
+(font,
+type size,
+space width,
+and so on)
+is retained.
+.
+.
+.TP
+.BI .vpt\~ n
+If
+.I n
+is non-zero or missing,
+enable vertical position traps
+(the default),
+otherwise disable them.
+.
+Vertical position traps are those set by the
+.BR ch ,
+.BR wh ,
+and
+.B dt
+requests.
+.
+.
+.TP
+.BR .warn\~ [\c
+.IR n ]
+Select the categories,
+or \[lq]types\[rq],
+of reported warnings.
+.
+.IR n \~is
+the sum of the numeric codes associated with each warning category that
+is to be enabled;
+all other categories are disabled.
+.
+The categories and their associated codes are listed in section
+\[lq]Warnings\[rq] of
+.MR @g@troff @MAN1EXT@ .
+.\" TODO: Maybe move that table to groff(7).
+.
+For example,
+.RB \[lq] ".warn 0" \[rq]
+disables all warnings,
+and
+.RB \[lq] ".warn 1" \[rq]
+disables all warnings except those about missing glyphs.
+.
+If no argument is given,
+all warning categories are enabled.
+.
+.
+.TP
+.BI .warnscale\~ si
+Set the scaling unit used in warnings to
+.IR si .
+.
+Valid values for
+.I si
+are
+.BR u ,
+.B i
+(the default),
+.BR c ,
+.BR p ,
+.RB and\~ P .
+.
+.
+.TP
+.BI .while \~cond-expr\~anything
+Evaluate the conditional expression
+.IR cond-expr ,
+and repeatedly execute
+.I anything
+unless and until
+.I cond-expr
+evaluates false.
+.
+.I anything,
+which is often a conditional block,
+is referred to as the
+.B while
+request's
+.I body.
+.
+.
+.IP
+.I @g@troff
+treats the body of a
+.B while
+request similarly to that of a
+.B de
+request
+(albeit one not read in copy mode),
+but stores it under an internal name and deletes it when the loop
+finishes.
+.
+The operation of a macro containing a
+.B while
+request can slow significantly if the
+.B while
+body is large.
+.
+Each time the macro is executed,
+the
+.B while
+body is parsed and stored again.
+.
+An often better solution\[em]and one that is more portable,
+since AT&T
+.I troff \" AT&T
+lacked the
+.B while
+request\[em]is to instead write a recursive macro.
+.
+It will be parsed only once (unless you redefine it).
+.
+To prevent infinite loops,
+the default number of available recursion levels is 1,000 or somewhat
+less (because things other than macro calls can be on the input stack).
+.
+You can disable this protective measure,
+or raise the limit,
+by setting the
+.B slimit
+register.
+.
+See section \[lq]Debugging\[rq] below.
+.
+.
+.IP
+If a
+.B while
+body begins with a conditional block,
+its closing brace must end an input line.
+.
+.
+.IP
+The
+.B break
+and
+.B continue
+requests alter a
+.B while
+loop's flow of control.
+.
+.
+.TP
+.BI .write\~ stream\~anything
+Write
+.I anything
+to
+.IR stream ,
+which must previously have been the subject of an
+.B open
+request,
+followed by a newline.
+.
+.I anything
+is read in copy mode.
+.
+An initial neutral double quote in
+.I anything
+is stripped to allow the embedding of leading spaces.
+.
+.
+.TP
+.BI .writec\~ stream\~anything
+As
+.BR write ,
+but without a trailing newline.
+.
+.
+.TP
+.BI .writem\~ "stream name"
+Write the contents of the macro or string
+.I name
+to
+.IR stream ,
+which must previously have been the subject of an
+.B open
+request.
+.
+.I name
+is read in copy mode.
+.
+.
+.br
+.ne 6v
+.\" ====================================================================
+.SS "Extended requests"
+.\" ====================================================================
+.
+.\" XXX: .cf might better belong in "Implementation differences".
+.TP
+.BI .cf\~ file
+In a diversion,
+embed an object which,
+when reread,
+will cause the contents of
+.I file
+to be copied verbatim to the output.
+.
+In AT&T
+.IR troff ,
+the contents of
+.I file
+are immediately copied to the output regardless of whether a diversion
+is being written to;
+this behavior is so anomalous that it must be considered a bug.
+.
+.
+.TP
+.BI .de\~ name\~\c
+.RI [ end-name ]
+.TQ
+.BI .am\~ name\~\c
+.RI [ end-name ]
+.TQ
+.BI .ds\~ name\~\c
+.RI [ contents ]
+.TQ
+.BI .as\~ name\~\c
+.RI [ contents ]
+In compatibility mode,
+these requests behave similarly to
+.BR de1 ,
+.BR am1 ,
+.BR ds1 ,
+and
+.BR as1 ,
+respectively:
+a \[lq]compatibility save\[rq] token is inserted at the beginning,
+and a \[lq]compatibility restore\[rq] token at the end,
+with compatibility mode switched on during execution.
+.
+.
+.TP
+.BI .hy\~ n
+New values 16 and\~32 are available;
+the former enables hyphenation before the last character in a word,
+and the latter enables hyphenation after the first character in a word.
+.
+.
+.TP
+.BI .ss\~ word-space-size\~\c
+.RI [ additional-sentence-space-size ]
+A second argument sets the amount of additional space separating
+sentences on the same output line.
+.
+If omitted,
+this amount is set to
+.IR word-space-size .
+.
+Both arguments are in twelfths of current font's space width
+(typically one-fourth to one-third em for Western scripts;
+see
+.MR groff_font @MAN5EXT@ ).
+.
+The default for both parameters is\~12.
+.
+Negative values are erroneous.
+.
+.
+.TP
+.BR .ta\~ [[\c
+.IR "n1 n2\~" .\|.\|.\~ nn \~]\c
+.BR T \~\c \" space in roman because we must use 2-font macro with \c
+.IR "r1 r2\~" .\|.\|.\~ rn ]
+.I groff
+supports an extended syntax to specify repeating tab stops after
+the
+.RB \[lq] T \[rq]
+mark.
+.
+These values are always taken as relative distances from the previous
+tab stop.
+.
+This is the idiomatic way to specify tab stops at equal intervals in
+.IR groff .
+.
+.
+.IP
+The syntax summary above instructs
+.I groff
+to set tabs at positions
+.IR n1 ,
+.IR n2 ,
+\&.\|.\|.\|,
+.IR nn ,
+then at
+.IR nn \|+\| r1 ,
+.IR nn \|+\| r2 ,
+\&.\|.\|.\|,
+.IR nn \|+\| rn ,
+then at
+.IR nn \|+\| rn \|+\| r1 ,
+.IR nn \|+\| rn \|+\| r2 ,
+\&.\|.\|.\|,
+.IR nn \|+\| rn \|+\| rn ,
+and so on.
+.
+.
+.\" ====================================================================
+.SS "New registers"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+exposes more formatter state via many new read-only registers.
+.
+Their names often correspond to the requests that affect them.
+.
+.
+.TP 12n
+.B \[rs]n[.br]
+Within a macro call,
+interpolate\~1
+if the macro is called with the \[lq]normal\[rq] control character
+(\[lq].\[rq] by default),
+and\~0 otherwise.
+.
+This facility allows the reliable modification of requests.
+.
+Using this register outside of a macro definition makes no sense.
+.
+.
+.RS
+.IP
+.ne 6v+\n(.Vu
+.EX
+\&.als bp*orig bp
+\&.de bp
+\&.tm before bp
+\&.ie \[rs]\[rs]n[.br] .bp*orig
+\&.el \[aq]bp*orig
+\&.tm after bp
+\&..
+.EE
+.RE
+.
+.
+.TP
+.B \[rs]n[.C]
+Interpolate 1\~if compatibility mode is in effect,
+0\~otherwise.
+.
+See
+.BR cp .
+.
+.
+.TP
+.B \[rs]n[.cdp]
+Interpolate depth of last glyph added to the environment.
+.
+It is positive if the glyph extends below the baseline.
+.
+.
+.TP
+.B \[rs]n[.ce]
+Interpolate number of input lines remaining to be centered.
+.
+.
+.TP
+.B \[rs]n[.cht]
+Interpolate height of last glyph added to the environment.
+.
+It is positive if the glyph extends above the baseline.
+.
+.
+.TP
+.B \[rs]n[.color]
+Interpolate 1\~if colors are enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.cp]
+Within a
+.RB \[lq] do \[rq]
+request,
+interpolate the saved value of compatibility mode
+(see
+.B \[rs]n[.C]
+above).
+.
+.
+.TP
+.B \[rs]n[.csk]
+Interpolate skew of last glyph added to the environment.
+.
+The
+.I skew
+of a glyph is how far to the right of the center of a glyph the center
+of an accent over that glyph should be placed.
+.
+.
+.TP
+.B \[rs]n[.ev]
+Interpolate name of current environment.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.fam]
+Interpolate name of default font family.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.fn]
+Interpolate resolved name of the selected font.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.fp]
+Interpolate next free font mounting position.
+.
+.
+.TP
+.B \[rs]n[.g]
+Interpolate\~1.
+.
+Test with
+.RB \[lq]\| if \|\[rq]
+or
+.B ie
+to check whether GNU
+.I troff \" GNU
+is the formatter.
+.
+.
+.TP
+.B \[rs]n[.height]
+Interpolate font height.
+.
+See
+.BR \[rs]H .
+.
+.
+.TP
+.B \[rs]n[.hla]
+Interpolate hyphenation language of the environment.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.hlc]
+Interpolate count of immediately preceding consecutive hyphenated lines
+in the environment.
+.
+.
+.TP
+.B \[rs]n[.hlm]
+Interpolate maximum number of consecutive hyphenated lines allowed in
+the environment.
+.
+.
+.TP
+.B \[rs]n[.hy]
+Interpolate hyphenation mode of the environment.
+.
+.
+.TP
+.B \[rs]n[.hym]
+Inteprolate hyphenation margin of the environment.
+.
+.
+.TP
+.B \[rs]n[.hys]
+Interpolate hyphenation space adjustment threshold of the environment.
+.
+.
+.TP
+.B \[rs]n[.in]
+Interpolate indentation amount applicable to the pending output line.
+.
+.
+.TP
+.B \[rs]n[.int]
+Interpolate\~1 if the previous output line was interrupted
+(ended with
+.BR \[rs]c ),
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.kern]
+Interpolate\~1 if pairwise kerning is enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.lg]
+Interpolate ligature mode.
+.
+.
+.TP
+.B \[rs]n[.linetabs]
+Interpolate\~1 if line-tabs mode is enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.ll]
+Interpolate line length applicable to the pending output line.
+.
+.
+.TP
+.B \[rs]n[.lt]
+Interpolate title line length.
+.
+.
+.TP
+.B \[rs]n[.m]
+Interpolate name of the selected stroke color.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.M]
+Interpolate name of the selected fill color.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.ne]
+Interpolate amount of space demanded by the most recent
+.B ne
+request that caused a page location trap to be sprung.
+.
+See
+.BR \[rs]n[.trunc] .
+.
+.
+.TP
+.B \[rs]n[.nm]
+Interpolate\~1 if output line numbering is enabled
+(even if temporarily suppressed),
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.ns]
+Interpolate\~1 if no-space mode is enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.O]
+Interpolate output suppression level.
+.
+See
+.BR \[rs]O .
+.
+.
+.TP
+.B \[rs]n[.P]
+Interpolate\~1 if the current page is selected for output.
+.
+See
+.B \-o
+command-line option to
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.TP
+.B \[rs]n[.pe]
+Interpolate\~1 during page ejection,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.pn]
+Interpolate next page number
+(either that set by
+.BR pn ,
+or that of the current page plus\~1).
+.
+.
+.TP
+.B \[rs]n[.ps]
+Interpolate type size in scaled points.
+.
+.
+.TP
+.B \[rs]n[.psr]
+Interpolate most recently requested type size in scaled points.
+.
+.
+.TP
+.B \[rs]n[.pvs]
+Interpolate post-vertical line spacing amount.
+.
+.
+.TP
+.B \[rs]n[.rj]
+Interpolate number of input lines remaining to be right-aligned.
+.
+.
+.TP
+.B \[rs]n[.slant]
+Interpolate font slant.
+.
+See
+.BR \[rs]S .
+.
+.
+.TP
+.B \[rs]n[.sr]
+Interpolate most recently requested type size in points as a decimal
+fraction.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.ss]
+.TQ
+.B \[rs]n[.sss]
+Interpolate values of minimal inter-word space and additional
+inter-sentence space,
+respectively,
+in twelfths of the space width of the selected font.
+.
+.
+.TP
+.B \[rs]n[.sty]
+Interpolate selected abstract font style,
+if any.
+.
+This is a string-valued register.
+.
+.
+.TP
+.B \[rs]n[.tabs]
+Interpolate representation of the tab stop settings in a form suitable
+for passage to the
+.B ta
+request.
+.
+.
+.TP
+.B \[rs]n[.trunc]
+Interpolate amount of vertical space truncated by the most recently
+sprung page location trap,
+or,
+if the trap was sprung by an
+.B ne
+request,
+minus the amount of vertical motion produced by the
+.B ne
+request.
+.
+In other words,
+at the point a trap is sprung,
+.B \[rs]n[.trunc]
+represents the difference of what the vertical position would have
+been but for the trap,
+and what the vertical position actually is.
+.
+See
+.BR \[rs]n[.ne] .
+.
+.
+.TP
+.B \[rs]n[.U]
+Interpolate\~1 if in unsafe mode,
+0\~otherwise.
+.
+See
+.B \-U
+command-line option to
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.TP
+.B \[rs]n[.vpt]
+Interpolate\~1 if vertical position traps are enabled,
+0\~otherwise.
+.
+.
+.TP
+.B \[rs]n[.warn]
+Interpolate warning mode.
+.
+See section \[lq]Warnings\[rq] of
+.MR @g@troff @MAN1EXT@ .
+.\" TODO: Maybe move that table to groff(7).
+.
+.
+.TP
+.B \[rs]n[.x]
+Interpolate major version number of the running
+.I @g@troff
+formatter.
+.
+For example,
+if the version number is 1.23.0,
+then
+.B \[rs]n[.x]
+contains\~1.
+.
+.
+.TP
+.B \[rs]n[.y]
+Interpolate minor version number of the running
+.I @g@troff
+formatter.
+.
+For example,
+if the version number is 1.23.0,
+then
+.B \[rs]n[.y]
+contains\~23.
+.
+.
+.TP
+.B \[rs]n[.Y]
+Interpolate revision number of the running
+.I @g@troff
+formatter.
+.
+For example,
+if the version number is 1.23.0,
+then
+.B \[rs]n[.Y]
+contains\~0.
+.
+.
+.TP
+.B \[rs]n[.zoom]
+Interpolate magnification of font,
+in thousandths,
+or\~0 if magnification unused.
+.
+See
+.BR fzoom .
+.
+.
+.P
+The following (writable) registers are set by the
+.B psbb
+request.
+.
+.
+.TP
+.B \[rs]n[llx]
+.TQ
+.B \[rs]n[lly]
+.TQ
+.B \[rs]n[urx]
+.TQ
+.B \[rs]n[ury]
+Interpolate the
+(upper,
+lower,
+left,
+right)
+bounding box values
+(in PostScript units) of the most recently processed PostScript image.
+.
+.
+.P
+The following (writable) registers are set by the
+.B \[rs]w
+escape sequence.
+.
+.
+.TP 8n
+.B \[rs]n[rst]
+.TQ
+.B \[rs]n[rsb]
+Like
+.B \[rs]n[st]
+and
+.BR \[rs]n[sb] ,
+but taking account of the heights and depths of glyphs.
+.
+In other words,
+these registers store the highest and lowest vertical positions attained
+by the argument formatted by the
+.B \[rs]w
+escape sequence,
+doing what AT&T
+.I troff \" AT&T
+documented
+.B \[rs]n[st]
+and
+.B \[rs]n[sb]
+as doing.
+.
+.
+.TP
+.B \[rs]n[ssc]
+The amount of horizontal space (possibly negative) that should be
+added to the last glyph before a subscript.
+.
+.
+.TP
+.B \[rs]n[skw]
+How far to right of the center of the last glyph in the
+.B \[rs]w
+argument,
+the center of an accent from a roman font should be placed
+over that glyph.
+.
+.
+.P
+Other writable registers are as follows.
+.
+Those relating to date and time are initialized using
+.MR localtime 3
+at formatter startup.
+.
+.
+.\" The `c.` register was documented in the January 1981 "Addendum to
+.\" the Nroff/Troff User's Manual" (presumably by Kernighan), and is
+.\" widely supported by descendants of his device-independent troff, but
+.\" appears to have been overlooked in his 1992 revision of CSTR #54.
+.TP 12n
+.B \[rs]n[c.]
+Interpolate input line number.
+.
+.B \[rs]n[.c]
+is a read-only alias of this register.
+.
+.
+.TP
+.B \[rs]n[hours]
+Interpolate number of hours elapsed since midnight.
+.
+.
+.TP
+.B \[rs]n[hp]
+Interpolate horizontal position relative to that at the start of the
+input line.
+.
+.
+.br
+.ne 3v
+.TP
+.B \[rs]n[lsn]
+.TQ
+.B \[rs]n[lss]
+Interpolate count of leading spaces on input line and amount of
+corresponding horizontal motion,
+respectively.
+.
+.
+.TP
+.B \[rs]n[minutes]
+Interpolate number of minutes elapsed in the hour.
+.
+.
+.TP
+.B \[rs]n[seconds]
+Interpolate number of seconds elapsed in the minute.
+.
+.
+.TP
+.B \[rs]n[systat]
+Interpolate return value of
+.MR system 3
+function executed by most recent
+.B sy
+request.
+.
+.
+.TP
+.B \[rs]n[slimit]
+Interpolates maximum quantity of objects on
+.IR @g@troff 's
+internal input stack
+(default: 1000).
+.
+If non-positive,
+there is no limit:
+recursion can continue until program memory is exhausted.
+.
+.
+.TP
+.B \[rs]n[year]
+Interpolate Gregorian year.
+.
+AT&T
+.IR troff 's \" AT&T
+.B \[rs][yr]
+interpolates the Gregorian year minus 1900.
+.
+.
+.\" ====================================================================
+.SS Miscellaneous
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+predefines one string,
+.BR .T ,
+containing the argument given to the
+.B \-T
+command-line option,
+namely the output device
+(for example,
+.B pdf
+or
+.BR utf8 ).
+.
+The (read-only)
+.I register
+.B .T
+interpolates\~1 if GNU
+.I troff \" GNU
+is run with the
+.B \-T
+command-line option,
+and 0\~otherwise.
+.
+.
+.P
+A font not listed in the output device's
+.I DESC
+file's
+.B fonts
+directive is automatically mounted at the next available font position
+when it is selected.
+.
+If you mount a font explicitly with the
+.B fp
+request,
+you should do so on the first unused position,
+which can be found in the
+.B .fp
+register.
+.
+.
+.P
+Unparameterized string interpolation does not conceal the arguments to a
+macro being interpreted.
+.
+Thus,
+in a macro definition,
+the call of another macro with the existing argument list,
+.
+.RS
+.EX
+.BI . xx\~ \[rs]\[rs]$@
+.EE
+.RE
+.
+is more efficiently done with
+.
+.RS
+.EX
+.BI \[rs]\[rs]*[ xx ]\[rs]\[rs]
+.EE
+.RE
+.
+(that is,
+with string interpolation).
+.
+The trailing backslashes prevent the final newline in the macro
+definition from being interpolated,
+potentially putting an unwanted blank line on the output.
+.
+See section \[lq]Punning Names\[rq] in
+.MR groff @MAN7EXT@ .
+.
+.
+.\" XXX: Is this really not an AT&T troff feature?
+.P
+If a font description file contains pairwise kerning information,
+glyphs from that font are kerned.
+.
+Kerning between two glyphs can be inhibited by placing a dummy character
+.B \[rs]&
+between them.
+.
+.
+.P
+GNU
+.I troff \" GNU
+keeps track of the nesting depth of escape sequence
+interpolations and other uses of delimiters,
+as in the
+.B tl
+request and the output comparison operator
+(that is,
+input like
+.B \[aq]foo\[aq]bar\[aq]
+as a conditional expression),
+so the only characters you need to avoid using as
+delimiters are those that appear in the arguments you input,
+not any that result from interpolation.
+.
+Typically,
+.B \[aq]
+works fine.
+.
+Use visible characters as delimiters in GNU
+.IR troff , \" GNU
+not \[lq]ASCII\[rq] controls like BEL (Control+G).
+.
+The implementation of
+.B \[rs]$@
+ensures that the double quotes surrounding an argument appear at an
+interpolation depth different from that of the arguments themselves.
+.
+Similarly,
+in bracket-form escape sequences like
+.B \[rs]f[ZCMI],
+a right bracket
+.B ]
+does not end the sequence unless it occurs at the same interpolation
+depth as the
+.RB opening\~ [ ,
+so input like
+.
+.RS
+.EX
+\[rs]f[\[rs]*[my-family]\[rs]*[my-style]]
+.EE
+.RE
+.
+works as desired.
+.
+In compatibility mode,
+no attention is paid to the interpolation depth.
+.
+.
+.P
+In
+GNU
+.IR troff , \" GNU
+the
+.B tr
+request can map characters to the unbreakable space escape sequence
+.B \[rs]\[ti]
+as a special case
+.RB ( tr
+normally operates only on
+.IR characters ).
+.
+This feature replaces the odd-parity
+.B tr
+mapping trick used in AT&T
+.I troff \" AT&T
+documents,
+where a character,
+often
+.BR \[ti] ,
+was \[lq]sacrificed\[rq] by mapping it to \[lq]nothing\[rq],
+drafting it into use as an unadjustable,
+unbreakable space.
+.
+(This feature was gratuitous even in early AT&T
+.I troff, \" AT&T
+which supported the
+.BI \[rs] space
+escape sequence by 1976.) \" see CSTR #54 of that year
+.
+Often,
+it makes more sense to use
+GNU
+.IR troff 's \" GNU
+.B \[rs]\[ti]
+escape sequence instead,
+which has been adopted by every other active
+.I troff
+implementation except that of Illumos,
+as well as by the
+.RI non -troff
+.IR mandoc .
+.
+Translation of a character to
+.B \[rs]\[ti]
+is unnecessary.
+.
+.
+.P
+GNU
+.I troff \" GNU
+permits tabs and spaces after the first dot on a control line that ends
+a macro definition.
+.
+.RS
+.ne 5v+\n(.Vu
+.EX
+\&.if t \[rs]{\[rs]
+\&.\& de bar
+\&.\& nop Hello, I\[aq]m \[aq]bar\[aq].
+\&.\& .
+\&.\[rs]}
+.EE
+.RS
+.
+.
+.\" ====================================================================
+.SH "Formatter output"
+.\" ====================================================================
+.
+The page description language output by GNU
+.I troff \" GNU
+is modeled after that used by AT&T
+.I troff \" AT&T
+once the latter adopted a device-independent approach in the early
+1980s.
+.
+Only the differences are documented here.
+.
+For a fuller discussion,
+see
+.MR groff_out @MAN5EXT@ .
+.\"
+.\"
+.\" XXX: This feature is unused and documenting it gives a valuable
+.\" hostage to fortune.
+.\".P
+.\"Note that single characters can have the eighth bit set, as can the
+.\"names of fonts and special characters.
+.
+.
+.P
+Glyph and font names can be of arbitrary length;
+postprocessors should not assume that they are at most two characters.
+.
+A glyph to be formatted is always drawn from the current font;
+in contrast to AT&T device-independent
+.IR troff , \" AT&T
+drivers need not search special fonts to find a glyph.
+.
+.
+.\" ====================================================================
+.SS Units
+.\" ====================================================================
+.
+The argument to the
+.BR s \~command
+is in scaled points
+(units of
+.RI points/ n ,
+where
+.I n
+is the argument to the
+.B sizescale
+command in the
+.I DESC
+file).
+.
+The argument to the
+.RB \[lq] "x H" \[rq]
+command is also in scaled points.
+.
+.
+.\" ====================================================================
+.SS "Simple commands"
+.\" ====================================================================
+.
+.\" BEGIN Keep in sync with relevant portions of section "Simple
+.\" commands" from groff_out(5).
+.P
+If the
+.B tcommand
+directive is present in the output device's
+.I DESC
+file,
+GNU
+.I troff \" GNU
+employs the following two commands.
+.
+.
+.TP
+.BI t\~ xyz\c
+\&.\|.\|.
+Typeset word
+.IR xyz ;
+that is,
+set a sequence of ordinary glyphs named
+.IR x ,
+.IR y ,
+.IR z ,
+\&.\|.\|.\|,
+terminated by a space or newline;
+an optional second integer argument is ignored
+(this allows the formatter to generate an even number of arguments).
+.\" XXX: Why?
+.
+Each glyph is set at the current drawing position,
+and the position is then advanced horizontally by the glyph's width.
+.
+A glyph's width is read from its metrics in the font description file,
+scaled to the current type size,
+and rounded to a multiple of the horizontal motion quantum.
+.
+Use the
+.B C
+command to emplace glyphs of special characters.
+.
+.
+.TP
+.BI u\~ "n xyz"\c
+\&.\|.\|.
+Typeset word
+.I xyz
+with track kerning.
+.
+As
+.BR t ,
+but after placing each glyph,
+the drawing position is further advanced horizontally
+.RI by\~ n
+basic units.
+.\" END Keep in sync with relevant portions of section "Simple commands"
+.\" from groff_out(5).
+.
+.
+.P
+New commands implement color support.
+.
+.
+.TP
+.BI mc\~ "cyan magenta yellow"
+.TQ
+.B md
+.TQ
+.BI mg\~ gray
+.TQ
+.BI mk\~ "cyan magenta yellow black"
+.TQ
+.BI mr\~ "red green blue"
+Set the components of the stroke color with respect to various color
+spaces.
+.
+.B md
+resets the stroke color to the default value.
+.
+The arguments are integers in the range 0 to 65535.
+.
+.
+.P
+A new device control subcommand is available.
+.
+.
+.TP
+.BI "x u\~" n
+If
+.I n
+is\~1,
+start underlining of spaces.
+.
+If
+.I n
+is\~0,
+stop underlining of spaces.
+.
+This facility is needed for the
+.B cu
+request in
+.I nroff \" mode
+mode and is ignored otherwise.
+.
+.
+.\" ====================================================================
+.SS "Extended drawing commands"
+.\" ====================================================================
+.
+GNU
+.I pic \" GNU
+does not produce
+.I @g@troff
+escape sequences employing these extensions if its
+.B \-n
+option is given.
+.
+.
+.TP
+.BI Df\~ n
+Set the shade of gray used to fill geometric objects to
+.IR n ,
+which must be an integer.
+.
+0 corresponds to white and 1000 to black.
+.
+A grayscale ramp spans the two.
+.
+A value outside this range uses the stroke color as the fill color.
+.
+The fill color is opaque.
+.
+Normally the default is black,
+but some drivers may provide a way of changing this.
+.
+.B Df
+is obsolete since 2002, \" commit ea5a42d080, 2002-01-24
+superseded by
+.B DFg
+below.
+.
+.
+.IP
+The corresponding
+.B \[rs]D\[aq]f\^\[aq]
+escape sequence should not be used:
+its argument is rounded to an integer multiple of the horizontal motion
+quantum,
+which can limit the precision
+.RI of\~ n .
+.
+.
+.TP
+.BI DC\~ d
+Draw a filled circle of diameter
+.I d
+with its leftmost point at the drawing position.
+.
+.
+.TP
+.BI DE\~ "h v"
+Draw a filled ellipse,
+of horizontal axis
+.I h
+and vertical axis
+.IR v ,
+with its leftmost point at the drawing position.
+.
+.
+.br
+.ne 4v
+.EQ
+delim $$
+.EN
+.TP
+.\" `BR`, not `BI`, here, because eqn will take care of font changes.
+.BR Dp\~ "$dx sub 1 ~ dy sub 1 ~ ldots ~ dx sub n ~ dy sub n$"
+Draw a polygon with,
+for $i = 1 , ldots , n + 1$,
+its
+.IR i th
+vertex at the drawing position
+.
+$+ sum from { j = 1 } to { i - 1 } ( dx sub j , dy sub j )$.
+.
+.\" The following is implied by the math above, but let's be kind.
+.I groff
+output drivers automatically close polygons,
+drawing a line from $( dx sub n , dy sub n )$ back to
+$( dx sub 1 , dy sub 1 )$.
+.
+The drawing position is left at the last
+.I specified
+vertex,
+but this may change in a future version of GNU
+.IR troff . \" GNU
+.
+Heirloom Doctools
+.IR troff , \" Heirloom
+like DWB
+.IR troff , \" DWB
+by default does not close the polygon.
+.
+In its
+.I groff
+compatibility mode,
+Heirloom closes the polygon but leaves the drawing position
+.IR unchanged \[em]that
+is,
+at the polygon's
+.I initial
+drawing position.
+.
+.
+.IP
+At the moment,
+GNU
+.I pic \" GNU
+uses this command only to generate triangles and rectangles.
+.
+.
+.TP
+.BR DP\~ "$dx sub 1 ~ dy sub 1 ~ ldots ~ dx sub n ~ dy sub n$"
+As
+.BR Dp ,
+but draw a filled rather than a stroked polygon.
+.
+.
+.TP
+.BI Dt\~ n
+Set the line thickness to
+.IR n \~\c
+basic units.
+.
+AT&T
+.I troff \" AT&T
+output drivers use a thickness proportional to the type size;
+this is the GNU
+.I troff \" GNU
+default.
+.
+A
+.RI negative\~ n
+requests this explicitly.
+.
+.RI An\~ n
+of zero selects the smallest available line thickness.
+.
+.
+.P
+A difficulty arises in how the drawing position should be changed after
+the execution of these commands.
+.
+This has little importance to most users,
+since the output of GNU
+.I grn \" GNU
+and
+.I pic \" GNU
+does not depend on it.
+.
+Given a drawing command of the form
+.BI D z
+$x sub 1 ~ y sub 1 ~ ldots ~ x sub n ~ y sub n$,
+where
+.I z
+is not
+.B c
+or
+.BR e ,
+AT&T
+.I troff \" AT&T
+treats each $x sub i$ as a horizontal motion,
+each $y sub i$ as a vertical one,
+and therefore assumes that the width of the drawn object is
+$sum from { i = 1 } to n x sub i$,
+and its height is $sum from { i = 1 } to n y sub i$.
+.
+(Verify its assumption about height by examining the
+.B st
+and
+.B sb
+registers after using such a drawing command in a
+.B \[rs]w
+escape sequence).
+.
+For the sake of compatibility,
+GNU
+.I troff \" GNU
+also follows this rule,
+even though it frustrates extensions to the
+.B D
+command that set drawing parameters rather than rendering objects,
+producing ugly results in the case of
+.B Dt
+and
+.BR Df ,
+or otherwise don't parameterize objects as a series of vertices,
+as with
+GNU
+.IR troff 's \" GNU
+filled ellipse,
+.BR DE .
+.
+Thus after executing a
+.BR D \~command
+of the form
+.BI D z
+$x sub 1 ~ y sub 1 ~ ldots ~ x sub n ~ y sub n$,
+the drawing position should be increased by
+.
+$( sum from { i = 1 } to n x sub i , sum from { i = 1 } to n y sub i )$.
+.EQ
+delim off
+.EN
+.
+In a future release,
+GNU
+.I troff \" GNU
+and its output drivers may abandon the application of this assumption to
+drawing commands not explicitly specified in the AT&T \[lq]Troff User's
+Manual\[rq].
+.
+.
+.P
+Fill color selection is implemented with another set of extensions.
+.
+.
+.TP
+.BI DFc\~ "cyan magenta yellow"
+.TQ
+.B DFd
+.TQ
+.BI DFg\~ gray
+.TQ
+.BI DFk\~ "cyan magenta yellow black"
+.TQ
+.BI DFr\~ "red green blue"
+Set the components of the fill color as described under the
+.B \[rs]M
+escape sequence above.
+.
+.B DFd
+restores the device's default fill color.
+.
+The drawing position is not updated,
+in contrast to
+.BR Df .
+.
+.
+.\" ====================================================================
+.SS "Device control syntax extension"
+.\" ====================================================================
+.
+GNU
+.I troff \" GNU
+introduces a line continuation convention,
+permitting the argument to the
+.B x X
+command to contain newlines.
+.
+A newline in the input is transformed to the sequence
+.RI \[lq] newline\c
+.BR + \[rq].
+.
+When interpreting an
+.B x X
+command,
+a postprocessor should therefore be prepared for a plus sign after a
+newline;
+if it occurs,
+preserve the newline,
+discard the plus sign,
+and continue to collect the input into the argument of the
+.B x X
+command.
+.
+A newline
+.I not
+followed by a plus sign terminates the
+.B x X
+command.
+.
+An application of this feature is the embedding of PostScript or PDF
+language command streams into
+.I troff \"
+output.
+.
+.
+.P
+GNU
+.I troff \" GNU
+guarantees that the first three output commands it emits are as follows.
+.
+.
+.P
+.RS
+.EX
+.RI x\~T\~ device
+.RI x\~res\~ n\~h\~v
+x init
+.EE
+.RE
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Debugging
+.\" ====================================================================
+.
+In addition to AT&T
+.IR troff 's \" AT&T
+debugging features,
+GNU
+.I troff \" GNU
+emits more error diagnostics when syntactical or semantic nonsense is
+encountered and supports several warning categories;
+the output of these can be selected with
+.BR warn .
+.
+Also see the
+.BR \-E ,
+.BR \-w ,
+and
+.B \-W
+options of
+.MR @g@troff @MAN1EXT@ .
+.
+Backtraces can be automatically produced when errors or warnings occur
+(the
+.B \-b
+option of
+.MR @g@troff @MAN1EXT@ )
+or generated on demand
+.RB ( backtrace ).
+.
+.
+.P
+.I groff
+also adds more flexible diagnostic output requests
+.RB ( tmc
+and
+.BR tm1 ).
+.
+More aspects of formatter state can be examined with requests that write
+lists of
+defined registers
+.RB ( pnr ),
+environments
+.RB ( pev ),
+and page location traps
+.RB ( ptr )
+to the standard error stream.
+.
+.
+.\" ====================================================================
+.SH "Implementation differences"
+.\" ====================================================================
+.
+.\" TODO: Resync with the node of this name in our Texinfo manual.
+GNU
+.IR troff 's \" GNU
+features sometimes cause incompatibilities with documents written
+assuming old implementations of
+.IR troff . \" generic
+.
+Some GNU extensions to
+.I troff \" generic
+are supported by other implementations.
+.
+.
+.P
+When adjusting to both margins,
+AT&T
+.I troff \" AT&T
+at first adjusts spaces starting from the right;
+GNU
+.I troff \" GNU
+begins from the left.
+.
+Both implementations adjust spaces from opposite ends on alternating
+output lines to prevent \[lq]rivers\[rq] in the text.
+.
+.
+.P
+GNU
+.I troff \" GNU
+does not always hyphenate words as AT&T
+.I troff \" AT&T
+does.
+.
+The AT&T implementation uses a set of hard-coded rules specific to
+U.S.\& English,
+while GNU
+.I troff \" GNU
+uses language-specific hyphenation pattern files derived from \*[tx].
+.
+In some versions of
+.I troff \" generic
+there was limited space to store hyphenation exceptions
+(arguments to the
+.B hw
+request);
+GNU
+.I troff \" GNU
+has no such restriction.
+.
+.
+.P
+Long names may be GNU
+.IR troff 's \" GNU
+most obvious innovation.
+.
+AT&T
+.I troff \" AT&T
+interprets
+.RB \[lq] .dsabcd \[rq]
+as defining a string
+.RB \[lq] ab \[rq]
+with contents
+.RB \[lq] cd \[rq].
+.
+Normally,
+GNU
+.I troff \" GNU
+interprets this as a call of a macro named
+.RB \[lq] dsabcd \[rq].
+.
+AT&T
+.I troff \" AT&T
+also interprets
+.B \[rs]*[
+and
+.B \[rs]n[
+as an interpolation of a string or register,
+respectively,
+called
+.RB \[lq] [ \[rq].
+.
+In GNU
+.IR troff , \" GNU
+however,
+the
+.RB \[lq] [ \[rq]
+is normally interpreted as beginning the enclosure of a long identifier.
+.
+In compatibility mode,
+GNU
+.I troff \" GNU
+interprets names in the traditional way,
+which means that they are limited to one or two characters.
+.
+See the
+.B \-C
+option in
+.MR @g@troff @MAN1EXT@
+and,
+above,
+the
+.B .C
+and
+.B .cp
+registers,
+and
+.B cp
+and
+.RB \[lq] do \[rq]
+requests,
+for more on compatibility mode.
+.
+.
+.P
+The register
+.B \[rs]n[.cp]
+is specialized and may require a statement of rationale.
+.
+When writing macro packages or documents that use GNU
+.I troff \" GNU
+features and which may be mixed with other packages or documents that do
+not\[em]common scenarios include serial processing of man pages or use
+of the
+.RB \[lq] so \[rq]
+or
+.B mso
+requests\[em]you may desire correct operation regardless of
+compatibility mode enablement in the surrounding context.
+.
+It may occur to you to save the existing value of
+.B \[rs]n(.C
+into a register,
+say,
+.BR _C ,
+at the beginning of your file,
+turn compatibility mode off with
+.RB \[lq] .cp\~0 \[rq],
+then restore it from that register at the end with
+.RB \[lq] .cp\~\[rs]n(_C \[rq].
+.
+At the same time,
+a modular design of a document or macro package may lead you to multiple
+layers of inclusion.
+.
+You cannot use the same register name everywhere lest you
+\[lq]clobber\[rq] the value from a preceding or enclosing context.
+.
+The two-character register name space of AT&T
+.I troff \" AT&T
+is confining and mnemonically challenging;
+you may wish to use
+GNU
+.IR troff 's \" GNU
+more capacious name space.
+.
+However,
+attempting
+.RB \[lq] ".nr _my_saved_C \[rs]n(.C" \[rq]
+will not work in compatibility mode;
+the register name is too long.
+.
+\[lq]This is exactly what
+.B .do
+is for,\[rq] you think,
+.RB \[lq] ".do nr _my_saved_C \[rs]n(.C" \[rq].
+.
+The foregoing will always save zero to your register,
+because
+.RB \[lq] do \[rq]
+turns compatibility mode
+.I off
+while it interprets its argument list.
+.
+What you need is:
+.
+.RS
+.EX
+\&.do nr _my_saved_C \[rs]n[.cp]
+\&.cp 0
+.EE
+.RE
+.
+at the beginning of your file,
+followed by
+.RS
+.EX
+\&.cp \[rs]n[_my_saved_C]
+\&.do rr _my_saved_C
+.EE
+.RE
+at the end.
+.
+As in the C language,
+we all have to share one big name space,
+so choose a register name that is unlikely to collide with other uses.
+.
+.
+.P
+The existence of the
+.B .T
+string is a common feature of post-CSTR\~#54
+.IR troff s\[em]DWB\~3.3, \" others
+Solaris,
+Heirloom Doctools,
+and Plan\~9
+.I troff \" foreign
+all support it\[em]but valid values are specific to each implementation.
+.
+The behavior of the
+.B .T
+register in GNU
+.I troff \" GNU
+differs from AT&T
+.IR troff , \" AT&T
+which interpolated\~1 only if
+.I nroff \" AT&T
+was the formatter and was called with
+.BR \-T .
+.
+.
+.P
+The
+.B lf
+request sets the number of the
+.I current
+input line in AT&T
+.IR troff ,\" AT&T
+and the
+.I next
+in GNU
+.IR troff .\" GNU
+.
+.
+.br
+.ne 2v
+.P
+AT&T
+.I troff
+had only environments named
+.RB \[lq] 0 \[rq],
+.RB \[lq] 1 \[rq],
+and
+.RB \[lq] 2 \[rq].
+.
+In GNU
+.IR troff ,
+any number of environments may exist,
+using any valid identifiers for their names.
+.
+.
+.P
+GNU
+.I troff \" GNU
+normally tracks the interpolation depth of escape sequence parameters
+and other delimited structures,
+but not in compatibility mode.
+.
+See section \[lq]Miscellaneous\[rq] above.
+.
+.
+.P
+In compatibility mode,
+the escape sequences
+.BR \[rs]f ,
+.BR \[rs]H ,
+.BR \[rs]m ,
+.BR \[rs]M ,
+.BR \[rs]R ,
+.BR \[rs]s ,
+and
+.B \[rs]S
+are transparent at the beginning of an input line for the purpose of
+recognizing a control character,
+because they modify formatter state
+.RB ( \[rs]R )
+or properties of the environment
+(the rest)
+and therefore do not create output nodes.
+.
+For example,
+this code produces bold output in both cases,
+but the text differs,
+.
+.RS
+.EX
+\&.de xx \[aq]
+Hello!
+\&..
+\&\[rs]fB.xx\[rs]fP
+.EE
+.RE
+.
+formatting \[lq].xx\[rq] normally and \[lq]Hello!\[rq] in compatibility
+mode.
+.
+.
+.P
+GNU
+.I troff \" GNU
+request names unrecognized by other
+.I troff \" generic
+implementations will likely be ignored;
+escape sequences that are GNU
+.I troff \" GNU
+extensions are liable to format their function selector character.
+.
+For example,
+the adjustable,
+non-breaking space escape sequence
+.B \[rs]\[ti]
+.\" BEGIN Keep in sync with groff.texi node "Other Differences" and
+.\" groff_man_style(7).
+is also supported by Heirloom Doctools
+.I troff \" Heirloom
+050915 (September 2005),
+.I mandoc
+1.9.5 (2009-09-21),
+.I neatroff
+(commit 1c6ab0f6e,
+2016-09-13),
+and Plan\~9 from User Space
+.I troff \" Plan 9
+(commit 93f8143600,
+2022-08-12),
+but not by Solaris/Illumos
+.IR troff s, \" Solaris/Illumos
+which will render it as
+.BR \[ti] .
+.\" as of this writing, 2022-08-13
+.\" END Keep in sync with groff.texi node "Other Differences" and
+.\" groff_man_style(7).
+.
+.
+.P
+GNU
+.I troff \" GNU
+does not allow the use of the escape sequences
+.BR \[rs]| ,
+.BR \[rs]\[ha] ,
+.BR \[rs]& ,
+.BR \[rs]{ ,
+.BR \[rs]} ,
+.BI \[rs] space\c
+,
+.BR \[rs]\[aq] ,
+.BR \[rs]\[ga] ,
+.BR \[rs]\- ,
+.BR \[rs]_ ,
+.BR \[rs]! ,
+.BR \[rs]% ,
+or
+.B \[rs]c
+in identifiers;
+AT&T
+.I troff \" AT&T
+does.
+.
+The
+.B \[rs]A
+escape sequence
+(see subsection \[lq]Escape sequences\[rq] above)
+may be helpful in avoiding their use.
+.
+.
+.P
+Normally,
+the syntax form
+.BI \[rs]s n
+accepts only a single character
+(a digit)
+for
+.IR n ,
+consistently with other forms that originated in AT&T
+.IR troff , \" AT&T
+like
+.BR \[rs]* ,
+.BR \[rs]$ ,
+.BR \[rs]f ,
+.BR \[rs]g ,
+.BR \[rs]k ,
+.BR \[rs]n ,
+and
+.BR \[rs]z .
+.
+In compatibility mode only,
+a
+.RI non-zero\~ n
+must be in the range 4\[en]39.
+.
+Legacy documents relying upon this quirk of parsing should be migrated
+to another
+.B \[rs]s
+form.
+.
+[Background:
+The Graphic Systems C/A/T phototypesetter
+(the original device target for AT&T
+.IR troff ) \" AT&T
+supported only a few discrete type sizes in the range 6\[en]36 points,
+so Ossanna contrived a special case in the parser to do what the user
+must have meant.
+.
+Kernighan warned of this in the 1992 revision of CSTR\~#54 (\[sc]2.3),
+and more recently,
+McIlroy referred to it as a \[lq]living fossil\[rq].]
+.
+.
+.P
+Fractional type sizes cause one noteworthy incompatibility.
+.
+In AT&T
+.I troff \" AT&T
+the
+.B ps
+request ignores scaling units and thus
+.RB \[lq] .ps\~10u \[rq]
+sets the type size to 10\~points,
+whereas in GNU
+.I troff \" GNU
+it sets the type size to
+.RI 10\~ scaled
+points,
+which may be a much smaller measurement.
+.
+See subsection \[lq]Fractional type sizes and new scaling units\[rq]
+above.
+.
+.
+.P
+The
+.B ab
+request differs from AT&T
+.IR troff : \" AT&T
+GNU
+.I troff \" GNU
+writes no message to the standard error stream if no arguments are
+given,
+and it exits with a failure status instead of a successful one.
+.
+.
+.P
+The
+.B bp
+request differs from AT&T
+.IR troff : \" AT&T
+GNU
+.I troff \" GNU
+does not accept a scaling unit on the argument,
+a page number;
+the former
+(somewhat uselessly)
+does.
+.
+.
+.P
+In AT&T
+.I troff \" AT&T
+the
+.B pm
+request reports
+macro,
+string,
+and
+diversion
+sizes in units of 128-byte blocks,
+and an argument reduces the report to a sum of the above in the same
+units.
+.
+GNU
+.I troff \" GNU
+ignores any arguments and reports the sizes in bytes.
+.
+.
+.P
+Unlike AT&T
+.IR troff , \" AT&T
+GNU
+.I troff \" GNU
+does not ignore the
+.B ss
+request if the output is a terminal device;
+instead,
+the values of minimum inter-word and additional inter-sentence space are
+each rounded down to the nearest multiple of\~12.
+.
+.
+.P
+In GNU
+.I troff \" GNU
+there is a fundamental difference between (unformatted) characters and
+(formatted) glyphs.
+.
+Everything that affects how a glyph is output is stored with the glyph
+node;
+once a glyph node has been constructed,
+it is unaffected by any subsequent requests that are executed,
+including
+.BR bd ,
+.BR cs ,
+.BR tkf ,
+.BR tr ,
+or
+.B fp
+requests.
+.
+Normally,
+glyphs are constructed from characters immediately before the glyph is
+added to an output line.
+.
+Macros,
+diversions,
+and strings are all,
+in fact,
+the same type of object;
+they contain a sequence of intermixed character and glyph nodes.
+.
+Special characters transform from one to the other:
+before being added to the output,
+they behave as characters;
+afterward,
+they are glyphs.
+.
+A glyph node does not behave like a character node when it is processed
+by a macro:
+it does not inherit any of the special properties that the character
+from which it was constructed might have had.
+.
+For example,
+the input
+.
+.br
+.ne 5v
+.RS
+.EX
+\&.di x
+\[rs]\[rs]\[rs]\[rs]
+\&.br
+\&.di
+\&.x
+.EE
+.RE
+.
+produces
+.RB \[lq]\^ \[rs]\[rs] \[rq]
+in GNU
+.IR troff . \" GNU
+Each pair of backslashes becomes one backslash
+.I glyph;
+the resulting backslashes are thus not interpreted as escape
+.I characters
+when they are reread as the diversion is output.
+.
+AT&T
+.I troff \" AT&T
+.I would
+interpret them as escape characters when rereading them and end up
+printing one
+.RB \[lq] \[rs] \[rq].
+.
+.
+.P
+One way to format a backslash in most documents is with the
+.B \[rs]e
+escape sequence;
+this formats the glyph of the current escape character,
+regardless of whether it is used in a diversion;
+it also works in both GNU
+.I troff \" GNU
+and AT&T
+.IR troff . \" AT&T
+.
+(Naturally,
+if you've changed the escape character,
+you need to prefix the
+.RB \[lq] e \[rq]
+with whatever it is\[em]and you'll likely get something other than a
+backslash in the output.)
+.
+.
+.P
+The other correct way,
+appropriate in contexts independent of the backslash's common use as a
+.I roff
+escape character\[em]perhaps in discussion of character sets or other
+programming languages\[em]is the character escape
+.B \[rs](rs
+or
+.BR \[rs][rs] ,
+for \[lq]reverse solidus\[rq],
+from its name in the ECMA-6 (ISO/IEC\~646) standard.
+.
+[This escape sequence is not portable to AT&T
+.IR troff , \" AT&T
+but is to its lineal descendant,
+Heirloom Doctools
+.IR troff ,
+as of its 060716 release (July 2006).]
+.
+.
+.P
+To store an escape sequence in a diversion that is interpreted when the
+diversion is reread,
+either use the traditional
+.B \[rs]!\&
+transparent output facility,
+or,
+if this is unsuitable,
+the new
+.B \[rs]?\&
+escape sequence.
+.
+See subsection \[lq]Escape sequences\[rq] above and sections
+\[lq]Diversions\[rq] and \[lq]gtroff Internals\[rq] in
+.IR "Groff: The GNU Implementation of troff" ,
+the
+.I groff
+Texinfo manual.
+.
+.
+.P
+In the somewhat pathological case where a diversion exists containing a
+partially collected line and a partially collected line at the top-level
+diversion has never existed,
+AT&T
+.I troff
+will output the partially collected line at the end of input;
+GNU
+.I troff \" GNU
+will not.
+.
+.
+.\" ====================================================================
+.SS "Formatter output incompatibilities"
+.\" ====================================================================
+.
+Its extensions notwithstanding,
+the
+.I groff
+intermediate output format has some incompatibilities
+with that of AT&T
+.IR troff , \" AT&T
+but better compatibility is sought;
+problem reports and patches are welcome.
+.
+The following incompatibilities are known.
+.
+.
+.IP \[bu] 2n
+The drawing position after rendering polygons is inconsistent with AT&T
+.I troff \" AT&T
+practice.
+.
+Other implementations have diverged on this point as well.
+.
+.
+.IP \[bu]
+The output cannot be easily rescaled to other devices as AT&T
+.IR troff 's \" AT&T
+could.
+.\" XXX: Why? What's the problem? sizescale? That could be written
+.\" into the output as a comment or x command. --GBR
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+.MT jjc@\:jclark\:.com
+James Clark
+.ME ,
+.MT wl@\:gnu\:.org
+Werner Lemberg
+.ME ,
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME ,
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.br
+.ne 4v
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+widely called simply \[lq]CSTR\~#54\[rq],
+documents the language,
+device and font description file formats,
+and output format
+referred to collectively in
+.I groff
+documentation as AT&T
+.IR troff . \" AT&T
+.
+.
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97,
+provides additional insights into the
+device and font description file formats
+and output format.
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+.MR groff @MAN7EXT@ ,
+.MR roff @MAN7EXT@
+.
+.
+.\" Clean up.
+.rm tx
+.rm ic
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_diff_7_man_C]
+.do rr *groff_groff_diff_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/groff_font.5.man b/man/groff_font.5.man
new file mode 100644
index 0000000..0ee1d9a
--- /dev/null
+++ b/man/groff_font.5.man
@@ -0,0 +1,1114 @@
+.TH groff_font @MAN5EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_font \- GNU
+.I roff
+device and font description files
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2021 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff (GNU roff), which is a free software
+.\" project.
+.\"
+.\" 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 of the License, or (at your option) any later
+.\" version.
+.\"
+.\" You should have received a copy of the GNU General Public License
+.\" along with this program. If not, see
+.\" <http://www.gnu.org/licenses/gpl-2.0.html>.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_font_5_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+.\" BEGIN Keep parallel with groff.texi node "Device and Font Files".
+The
+.I groff
+font and output device description formats are slight
+extensions of those used by AT&T device-independent
+.IR troff . \" AT&T
+.
+In distinction to the AT&T implementation,
+.I groff
+lacks a binary format;
+all files are text files.
+.
+(Plan\~9
+.I troff \" Plan 9
+has also abandoned the binary format.)
+.
+The device and font description files for a device
+.I name
+are stored in a
+.IR dev name
+directory.
+.
+The device description file is called
+.IR DESC ,
+and,
+for each font supported by the device,
+a font description file is
+.RI called\~ f,
+where
+.IR f \~is
+usually an abbreviation of a font's name and/or style.
+.
+For example,
+the
+.B ps
+(PostScript)
+device has
+.I groff
+font description files for Times roman
+.RB ( TR )
+and Zapf Chancery Medium italic
+.RB ( ZCMI ),
+among many others,
+while the
+.B utf8
+device
+(for terminal emulators)
+has only font descriptions for the roman,
+italic,
+bold,
+and bold-italic styles
+.RB ( R ,
+.BR I ,
+.BR B ,
+and
+.BR BI ,
+respectively).
+.
+.
+.P
+Device and font description files are read by the formatter,
+.IR @g@troff ,
+and by output drivers.
+.
+The programs typically delegate these files' processing to an internal
+library,
+.IR libgroff ,
+ensuring their consistent interpretation.
+.
+.
+.\" ====================================================================
+.SH "\f[I]DESC\f[] file format"
+.\" ====================================================================
+.
+The
+.I DESC
+file contains a series of directives;
+each begins a line.
+.
+Their order is not important,
+with two exceptions:
+(1) the
+.B res
+directive must precede any
+.B \%papersize
+directive;
+and
+(2) the
+.B charset
+directive must come last
+(if at all).
+.
+If a directive name is repeated,
+later entries in the file override previous ones
+(except that the paper dimensions are computed based on the
+.B res
+directive last seen when
+.B \%papersize
+is encountered).
+.
+Spaces and/or tabs separate words and are ignored at line boundaries.
+.
+Comments start with the
+.RB \[lq] # \[rq]
+character and extend to the end of a line.
+.
+Empty lines are ignored.
+.
+.
+.TP
+.BI family\~ fam
+The default font family is
+.IR fam .
+.
+.
+.TP
+.BI fonts\~ "n F1"\~\c
+.RI .\|.\|.\&\~ Fn
+Fonts
+.IR F1 ", \|.\|.\|.\|, " Fn
+are mounted at font positions
+.IR m "\|+\|1, \|.\|.\|., " m \|+\| n
+where
+.I m
+is the number of
+.B styles
+(see below).
+.
+This directive may extend over more than one line.
+.
+A font name
+.RB of\~ 0
+causes no font to be mounted at the corresponding position.
+.
+.
+.TP
+.BI hor\~ n
+The horizontal motion quantum is
+.IR n \~basic
+units.
+.
+Horizontal quantities are rounded to multiples
+.RI of\~ n.
+.
+.
+.TP
+.BI image_generator\~ program
+Use
+.I program
+to generate PNG images from PostScript input.
+.
+Under GNU/Linux,
+this is usually
+.MR gs 1 ,
+but under other systems
+(notably Cygwin)
+it might be set to another name.
+.
+The
+.MR grohtml @MAN1EXT@
+driver uses this directive.
+.
+.
+.TP
+.BI paperlength\~ n
+The vertical dimension of the output medium is
+.IR n \~basic
+units
+(deprecated:
+use
+.B \%papersize
+instead).
+.
+.
+.TP
+.BI papersize\~ format-or-dimension-pair-or-file-name\c
+\~.\|.\|.
+The dimensions of the output medium are as according to the
+argument,
+which is either
+a standard paper format,
+a pair of dimensions,
+or the name of a plain text file containing either of the foregoing.
+.
+Recognized paper formats are the ISO and DIN formats
+.BR A0 \[en] A7 ,
+.BR B0 \[en] B7 ,
+.BR C0 \[en] C7 ,
+and
+.BR D0 \[en] D7 ;
+.\" XXX: tmac/papersize.tmac does not support [ABCD]7.
+the U.S.\& formats
+.BR letter ,
+.BR legal ,
+.BR tabloid ,
+.BR ledger ,
+.BR statement ,
+and
+.BR executive ;
+and the envelope formats
+.BR com10 ,
+.BR monarch ,
+and
+.BR DL .
+.
+Matching is performed without regard for lettercase.
+.
+.
+.IP
+Alternatively,
+the argument can be a custom paper format
+.IB length , width
+(with no spaces before or after the comma).
+.
+Both
+.I length
+and
+.I width
+must have a unit appended;
+valid units are
+.RB \[lq] i \[rq]
+for inches,
+.RB \[lq] c \[rq]
+for centimeters,
+.RB \[lq] p \[rq]
+for points,
+and
+.RB \[lq] P \[rq]
+for picas.
+.
+Example:
+.RB \[lq] 12c,235p \[rq].
+.
+An argument that starts with a digit is always treated as a custom paper
+format.
+.
+.
+.IP
+Finally,
+the argument can be a file name
+(e.g.,
+.IR /etc/papersize );
+if the file can be opened,
+the first line is read and a match attempted against each other form.
+.
+No comment syntax is supported.
+.
+.
+.IP
+More than one argument can be specified;
+each is scanned in turn and the first valid paper specification used.
+.
+.
+.TP
+.BI paperwidth\~ n
+The horizontal dimension of the output medium is
+.IR n \~basic
+units
+(deprecated:
+use
+.B \%papersize
+instead).
+.
+.
+.TP
+.B pass_filenames
+Direct
+.I @g@troff
+to emit the name of the source file being processed.
+.
+This is achieved with the intermediate output command
+.RB \[lq] "x F" \[rq],
+which
+.I \%grohtml
+interprets.
+.
+.
+.TP
+.BI postpro\~ program
+Use
+.I program
+as the postprocessor.
+.
+.
+.TP
+.BI prepro\~ program
+Use
+.I program
+as a preprocessor.
+.
+The
+.B html
+and
+.B xhtml
+output devices use this directive.
+.
+.
+.TP
+.BI print\~ program
+Use
+.I program
+as the print spooler.
+.
+If omitted,
+.IR groff 's
+.B \-l
+and
+.B \-L
+options are ignored.
+.
+.
+.TP
+.BI res\~ n
+The device resolution is
+.I n
+basic units per inch.
+.
+.
+.TP
+.BI sizes\~ s1\~\c
+.RI .\|.\|.\&\~ sn\~\c
+.B 0
+The device has fonts at
+.IR s1 ,
+\&.\|.\|.,
+.I sn
+scaled points
+(see below).
+.
+The list of sizes must be terminated by
+.RB a\~ 0 .
+.
+Each
+.I si
+can also be a range of sizes
+.IR m \[en] n .
+.
+The list can extend over more than one line.
+.
+.
+.TP
+.BI sizescale\~ n
+A typographical point
+is subdivided into
+.IR n \~scaled
+points.
+.
+The default
+.RB is\~ 1 .
+.
+.
+.TP
+.BI styles\~ S1\~\c
+.RI .\|.\|.\&\~ Sm
+The
+.RI first\~ m
+font mounting positions are associated with styles
+.IR S1 ,
+\&.\|.\|.,
+.IR Sm .
+.
+.
+.TP
+.B tcommand
+The postprocessor can handle the
+.B t
+.RB and\~ u
+intermediate output commands.
+.
+.
+.TP
+.B unicode
+The output device supports the complete Unicode repertoire.
+.
+This directive is useful only for devices which produce character
+entities instead of glyphs.
+.
+.
+.IP
+If
+.B unicode
+is present,
+no
+.B charset
+section is required in the font description files since the Unicode
+handling built into
+.I groff
+is used.
+.
+However,
+if there are entries in a font description file's
+.B charset
+section,
+they either override the default mappings for those particular
+characters or add new mappings
+(normally for composite characters).
+.
+.
+.IP
+The
+.BR utf8 ,
+.BR html ,
+and
+.B xhtml
+output devices use this directive.
+.
+.
+.TP
+.BI unitwidth\~ n
+Quantities in the font description files are in basic units for fonts
+whose type size is
+.IR n \~scaled
+points.
+.
+.
+.TP
+.B unscaled_charwidths
+Make the font handling module always return unscaled glyph widths.
+.
+The
+.I \%grohtml
+driver uses this directive.
+.
+.
+.TP
+.B use_charnames_in_special
+.I @g@troff
+should encode named glyphs inside device control commands.
+.
+The
+.I \%grohtml
+driver uses this directive.
+.
+.
+.TP
+.BI vert\~ n
+The vertical motion quantum is
+.IR n \~basic
+units.
+.
+Vertical quantities are rounded to multiples
+.RI of\~ n.
+.
+.
+.TP
+.B charset
+This directive and the rest of the file are ignored.
+.
+It is recognized for compatibility with other
+.I troff \" generic
+implementations.
+.
+In GNU
+.IR troff , \" GNU
+character set repertoire is described on a per-font basis.
+.
+.
+.P
+.I @g@troff
+recognizes but ignores the directives
+.BR spare1 ,
+.BR spare2 ,
+and
+.BR biggestfont .
+.
+.
+.P
+The
+.BR res ,
+.BR unitwidth ,
+.BR fonts ,
+and
+.B sizes
+lines are mandatory.
+.
+Directives not listed above are ignored by
+.I @g@troff
+but may be used by postprocessors to obtain further information about
+the device.
+.
+.
+.\" ====================================================================
+.SH "Font description file format"
+.\" ====================================================================
+.
+On typesetting output devices,
+each font is typically available at multiple sizes.
+.
+While paper measurements in the device description file are in absolute
+units,
+measurements applicable to fonts must be proportional to the type size.
+.
+.I groff
+achieves this using the precedent set by AT&T device-independent
+.IR troff : \" AT&T
+one font size is chosen as a norm,
+and all others are scaled linearly relative to that basis.
+.
+The \[lq]unit width\[rq] is the number of basic units per point when the
+font is rendered at this nominal size.
+.
+.
+.P
+For instance,
+.IR groff 's
+.B lbp
+device uses a
+.B unitwidth
+of\~800.
+.
+Its Times roman font
+.RB (\[lq] TR \[rq])
+has a
+.B spacewidth
+of\~833;
+this is also the width of its comma,
+period,
+centered period,
+and mathematical asterisk,
+while its \[lq]M\[rq] is 2,963 basic units.
+.
+Thus,
+an \[lq]M\[rq] on the
+.B lbp
+device is 2,963 basic units wide at a notional type size of 800\~points.
+.
+(800-point type is not practical for most purposes,
+but using it enables the quantities in the font description files to be
+expressed as integers.)
+.
+.
+.P
+A font description file has two sections.
+.
+The first is a sequence of directives,
+and is parsed similarly to the
+.I DESC
+file described above.
+.
+Except for the directive names that begin the second section,
+their ordering is immaterial.
+.
+Later directives of the same name override earlier ones,
+spaces and tabs are handled in the same way,
+and the same comment syntax is supported.
+.
+Empty lines are ignored throughout.
+.
+.
+.TP
+.BI name\~ F
+The name of the font
+.RI is\~ F .
+.
+.RB \[lq] DESC \[rq]
+is an invalid font name.
+.
+Simple integers are valid,
+but their use is discouraged.
+.
+.RI ( groff
+requests and escape sequences interpret non-negative font names as
+mounting positions instead.
+.
+Further,
+a font named
+.RB \[lq] 0 \[rq]
+cannot be automatically mounted by the
+.B fonts
+directive of a
+.I DESC
+file.)
+.
+.
+.TP
+.BI spacewidth\~ n
+The width of an unadjusted inter-word space is
+.IR n \~basic
+units.
+.
+.
+.P
+The directives above must appear in the first section;
+those below are optional.
+.
+.
+.TP
+.BI slant\~ n
+The font's glyphs have a slant of
+.IR n \~degrees;
+a positive
+.I n
+slants in the direction of text flow.
+.
+.
+.TP
+.BI ligatures\~ lig1\~\c
+.RI .\|.\|.\&\~ lign\~\c
+.RB [ 0 ]
+Glyphs
+.IR lig1 ,
+\&.\|.\|.,
+.I lign
+are ligatures;
+possible ligatures are
+.BR ff ,
+.BR fi ,
+.BR fl ,
+.BR ffi ,
+and
+.BR ffl .
+.
+For compatibility with other
+.I troff
+implementations,
+the list of ligatures may be terminated with
+.RB a\~ 0 .
+.
+The list of ligatures must not extend over more than one line.
+.
+.
+.TP
+.B special
+The font is
+.IR special :
+when a glyph is requested that is not present in the current font,
+it is sought in any mounted fonts that bear this property.
+.
+.
+.P
+Other directives in this section are ignored by
+.IR @g@troff ,
+but may be used by postprocessors to obtain further information about
+the font.
+.
+.
+.P
+The second section contains one or two subsections.
+.
+These can appear in either order;
+the first one encountered commences the second section.
+.
+Each starts with a directive on a line by itself.
+.
+A
+.B charset
+subsection is mandatory unless the associated
+.I DESC
+file contains the
+.B unicode
+directive.
+.
+Another subsection,
+.BR \%kernpairs ,
+is optional.
+.
+.
+.P
+The directive
+.B charset
+starts the character set subsection.
+.
+(For typesetter devices,
+this directive is misnamed since it starts a list of glyphs,
+not characters.)
+.
+It precedes a series of glyph descriptions,
+one per line.
+.
+Each such glyph description comprises a set of fields separated by
+spaces or tabs and organized as follows.
+.
+.
+.IP
+.I name metrics type code
+.RI [ entity-name ]
+.RB [ \-\-
+.IR comment ]
+.
+.
+.P
+.I name
+identifies the glyph:
+if
+.I name
+is a printable
+.RI character\~ c ,
+it corresponds to the
+.I troff \" generic
+ordinary
+.RI character\~ c .
+.
+If
+.I name
+is a multi-character sequence not beginning with
+.BR \[rs] ,
+it corresponds to the GNU
+.I troff \" GNU
+special character escape sequence
+\[lq]\c
+.BI \[rs][ name ]\c
+\[rq].
+.
+A name consisting of three minus signs,
+.RB \[lq] \-\-\- \[rq],
+indicates that the glyph is unnamed:
+such glyphs can be accessed only by the
+.B \[rs]N
+escape sequence in
+.IR troff . \" generic; \N is portable
+.
+A special character named
+.RB \[lq] \-\-\- \[rq]
+can still be defined using
+.B .char
+and similar requests.
+.
+The
+.I name
+.RB \[lq] \[rs]\- \[rq]
+defines the minus sign glyph.
+.
+.\" TODO: Withdraw support for this. No one seems to use it.
+Finally,
+.I name
+can be the horizontal motion escape sequences,
+.B \[rs]|
+and
+.B \[rs]\[ha]
+(\[lq]thin\[rq] and \[lq]hair\[rq] spaces,
+respectively),
+in which case only the width metric described below is applied;
+a font can thus customize the widths of these spaces.
+.\" XXX: For exhaustivity purposes...you can define "\whatever", which
+.\" has to be accessed with \C'\\whatever' or \[\\whatever], but the
+.\" parser matches predefined escape sequences before looking up special
+.\" characters. Most such definitions are inaccessible from the
+.\" language, because nearly every '\x', where 'x' is a Unicode basic
+.\" Latin character, is a predefined groff escape sequence.
+.
+.
+.br
+.ne 4v \" Keep next paragraph together with (possibly 2-line) synopsis.
+.P
+The form of the
+.I metrics
+field is as follows
+(on one line;
+it may be broken here for readability).
+.
+.
+.IP
+.\" XXX: Turning off adjustment is ugly; thanks to meter-long specimens
+.\" like this, we need an escape sequence that selectively disables
+.\" adjustment at the end of a word.
+.na
+.I width\/\c
+.RI [\fB,\fP[ \:height\/\c
+.RI [\fB,\fP[ \:depth\/\c
+.RI [\fB,\fP[ \:\%italic-correction\/\c
+.RI [\fB,\fP[ \:\%left-italic-correction\/\c
+.RI [\fB,\fP[ \:\%subscript-correction ]]]]]]]]]]
+.ad \*[AD]
+.
+.
+.P
+There must not be any spaces,
+tabs,
+or newlines between these
+.I subfields,
+.
+which are in basic units expressed as decimal integers.
+.
+Unspecified subfields default
+.RB to\~ 0 .
+.
+Since there is no associated binary format,
+these values are not required to fit into the C language data type
+.B char
+as they are in AT&T device-independent
+.IR troff . \" AT&T
+.
+.
+.P
+The
+.I width
+subfield gives the width of the glyph.
+.
+The
+.I height
+subfield gives the height of the glyph
+(upwards is positive);
+if a glyph does not extend above the baseline,
+it should be given a zero height,
+rather than a negative height.
+.
+The
+.I depth
+subfield gives the depth of the glyph,
+that is,
+the distance below the baseline to which the glyph extends
+(downwards is positive);
+if a glyph does not extend below the baseline,
+it should be given a zero depth,
+rather than a negative depth.
+.
+Italic corrections are relevant to glyphs in italic or oblique styles.
+.
+The
+.I italic-correction
+is the amount of space that should be added after an oblique glyph to be
+followed immediately by an upright glyph.
+.
+The
+.I left-italic-correction
+is the amount of space that should be added before an oblique glyph to
+be preceded immediately by an upright glyph.
+.
+The
+.I
+subscript-correction
+is the amount of space that should be added after an oblique glyph to be
+followed by a subscript;
+it should be less than the italic correction.
+.
+.
+.P
+For fonts used with typesetting devices,
+the
+.I type
+field gives a featural description of the glyph:
+it is a bit mask recording whether the glyph is an ascender,
+descender,
+both,
+or neither.
+.
+When a
+.B \[rs]w
+escape sequence is interpolated,
+these values are bitwise or-ed together
+for each glyph
+and stored in the
+.B ct
+register.
+.
+In font descriptions for terminal devices,
+all glyphs might have a type of zero,
+regardless of their appearance.
+.
+.
+.TP
+0
+means the glyph lies entirely between the baseline and
+a horizontal line at the \[lq]x-height\[rq] of the font,
+as with \[lq]a\[rq],
+\[lq]c\[rq],
+and
+\[lq]x\[rq];
+.
+.
+.TP
+1
+means the glyph descends below the baseline,
+like \[lq]p\[rq];
+.
+.
+.TP
+2
+means the glyph ascends above the font's x-height,
+like \[lq]A\[rq] or
+\[lq]b\[rq]);
+and
+.
+.
+.TP
+3
+means the glyph is both an ascender and a descender\[em]this is true of
+parentheses in some fonts.
+.
+.
+.P
+The
+.I code
+field gives a numeric identifier that the postprocessor uses to render
+the glyph.
+.
+The glyph can be specified to
+.I troff \" generic
+using this code by means of the
+.B \[rs]N
+escape sequence.
+.
+The code can be any integer
+(that is,
+any integer parsable by the C standard library's
+.MR strtol 3
+function).
+.
+.
+.P
+The
+.I entity-name
+field defines an identifier for the glyph that the postprocessor
+uses to print the
+.I @g@troff
+glyph
+.IR name .
+.
+This field is optional;
+it was introduced so that the
+.I \%grohtml
+output driver could encode its character set.
+.
+For example,
+the glyph
+.B \[rs][Po]
+is represented by
+.RB \[lq] &pound; \[rq]
+in HTML 4.0.
+.
+For efficiency,
+these data are now compiled directly into
+.IR \%grohtml .
+.
+.I grops
+uses the field to build sub-encoding arrays for PostScript fonts
+containing more than 256 glyphs.
+.
+Anything on the line after the
+.I entity-name
+field or
+.RB \[lq] \-\- \[rq]
+is ignored.
+.
+.
+.P
+A line in the
+.B charset
+section can also have the form
+.
+.RS
+.IB name\~ \[dq]
+.RE
+.
+identifying
+.I name
+as another name for the glyph mentioned in the preceding line.
+.
+Such aliases can be chained.
+.
+.
+.P
+The directive
+.B \%kernpairs
+starts a list of kerning adjustments to be made to adjacent glyph pairs
+from this font.
+.
+It contains a sequence of lines formatted as follows.
+.
+.RS
+.I g1 g2 n
+.RE
+.
+The foregoing means that when glyph
+.I g1
+is typeset immediately before
+.IR g2 ,
+the space between them should be increased
+.RI by\~ n .
+.
+Most kerning pairs should have a negative value
+.RI for\~ n .
+.\" END Keep parallel with groff.texi node "Device and Font Files".
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.IR @FONTDIR@/\:\%dev name /\:DESC
+describes the output device
+.IR name .
+.
+.
+.TP
+.IR @FONTDIR@/\:\%dev name / F
+describes the font known
+.RI as\~ F
+on device
+.IR name .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+widely called simply \[lq]CSTR\~#54\[rq],
+documents the language,
+device and font description file formats,
+and device-independent output format
+referred to collectively in
+.I groff
+documentation as
+.RI \[lq]AT&T\~ troff \[rq].
+.
+.
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97,
+provides additional insights into the
+device and font description file formats
+and device-independent output format.
+.
+.
+.P
+.MR groff @MAN1EXT@ ,
+subsection \[lq]Utilities\[rq],
+lists programs available for describing fonts in a variety of formats
+such that
+.I groff
+output drivers can use them.
+.
+.
+.P
+.MR @g@troff @MAN1EXT@
+documents the default device and font description file search path.
+.
+.
+.P
+.MR groff_out @MAN5EXT@ ,
+.MR addftinfo @MAN1EXT@
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_font_5_man_C]
+.do rr *groff_groff_font_5_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/groff_out.5.man b/man/groff_out.5.man
new file mode 100644
index 0000000..9c1534e
--- /dev/null
+++ b/man/groff_out.5.man
@@ -0,0 +1,1963 @@
+.TH groff_out @MAN5EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_out \- GNU
+.I roff
+intermediate output format
+.
+.
+.\" XXX: This page needs review and editing.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 1989-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, with no Front-Cover Texts,
+.\" and with no Back-Cover Texts.
+.\"
+.\" A copy of the Free Documentation License is included as a file
+.\" called FDL in the main directory of the groff source package.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_out_5_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.\" Setup
+.\" ====================================================================
+.
+.\" ================= Document configuration
+.
+.\" Number register to decide whether the commands '{' and '}' are used
+.\" 0: disable (current default); 1: enable
+.nr @USE_ENV_STACK 0
+.
+.ig
+Unfortunately, old versions of groff used an illogical position change
+after some D\~commands (Dp, DP, Dt). If the register
+@STUPID_DRAWING_POSITIONING is 1 (current default) then change position
+after these commands, otherwise the position is not changed.
+..
+.nr @STUPID_DRAWING_POSITIONING 1
+.
+.\" ================= Semantical definitions
+.
+.nr @maxcolor 65536
+.ds @backslash \[rs]\"
+.ds @linebreak \fR\[la]line-break\[ra]\fP\"
+.
+.\" Begin of macro definitions
+.
+.de offset
+.RI ( \,\\$1\/ ,\ \,\\$2\/ )\\$3
+..
+.de indexed_offset
+.offset \fI\\$1\/\fP\d\s-3\\$2\s+3\u\x'\n[.v]/4' \fI\\$3\/\fP\
+\d\s-3\\$4\s+3\u\x'\n[.v]/4' \\$5\x'\n[.v]/4'
+..
+.\" format: .command <name> "<arguments>" <punctuation>
+.de command
+\fB\\$1\fP\ \fI\,\\$2\/\fP\\$3
+..
+.\" format: .D-command <subcommand> "<arguments>"
+.de D-command
+\fBD\\$1\fP\ \fI\,\\$2\/\fP\|\*[@linebreak]
+..
+.
+.\" We set these as troff micromotions rather than eqn because \d and \u
+.\" can be lifted to XML subscript/superscript tags. Don't change
+.\" these to a parameterized string, man2html won't handle that.
+.ds hv1 \fIh\d\s-3\&1\s+3\u\~v\d\s-3\&1\s+3\u\fP\x'\n[.v]/4'
+.ds hv2 \fIh\d\s-3\&2\s+3\u\~v\d\s-3\&2\s+3\u\fP\x'\n[.v]/4'
+.ds hvn \fIh\d\s-3\&n\s+3\u\~v\d\s-3\&n\s+3\u\fP\x'\n[.v]/4'
+.
+.de Da-command
+\fBDa\fP\ \*[hv1] \*[hv2]\|\*[@linebreak]
+..
+.\" graphics command .D with a variable number of arguments
+.\" format: .D-multiarg <subcommand>
+.de D-multiarg
+\fBD\\$1\fP\ \*[hv1] \*[hv2] \&.\|.\|.\& \*[hvn]\|\*[@linebreak]
+..
+.\" format: .x-command <subname> "<arguments>"
+.de x-command
+\fBx\\$1\fP\ \fI\\$2\fP\|\*[@linebreak]
+..
+.de xsub
+.RI "(" "\\$1" " control command)"
+.br
+..
+.\" End of macro definitions
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The fundamental operation of the
+.MR @g@troff @MAN1EXT@
+formatter is the translation of the
+.MR groff @MAN7EXT@
+input language into a series of instructions concerned primarily with
+placing glyphs or geometric objects at specific positions on a
+rectangular page.
+.
+In the following discussion,
+the term
+.I command
+refers to this intermediate output language,
+never to the
+.MR groff @MAN7EXT@
+language intended for use by document authors.
+.
+Intermediate output commands comprise several categories:
+glyph output;
+font,
+color,
+and text size selection;
+motion of the printing position;
+page advancement;
+drawing of geometric primitives;
+and device control commands,
+a catch-all for other operations.
+.
+The last includes directives to start and stop output,
+identify the intended output device,
+and embed URL hyperlinks in supported output formats.
+.
+.
+.P
+Because the front-end command
+.MR groff @MAN1EXT@
+is a wrapper that normally runs the
+.I @g@troff
+formatter to generate intermediate output
+and an output driver (\[lq]postprocessor\[rq]) to consume it,
+users normally do not encounter this language.
+.
+The
+.I groff
+program's
+.B \-Z
+option inhibits postprocessing such that this intermediate output is
+sent to the standard output stream as when
+.I @g@troff
+is run manually.
+.
+.
+.P
+.IR groff 's
+intermediate output facilitates the development of output drivers and
+other postprocessors by offering a common programming interface.
+.
+It is an extension of the page description language developed by Brian
+Kernighan for AT&T device-independent
+.I troff \" AT&T
+circa 1980.
+.
+Where a distinction is necessary,
+we will say
+.RI \[lq] @g@troff
+output\[rq] to describe the output of GNU
+.IR troff , \" GNU
+and \[lq]intermediate output\[rq] to denote the language accepted by
+the parser implemented in
+.IR groff 's
+internal C++ library used by most of its output drivers.
+.\" XXX GBR leaves off here.
+.
+.
+.\" ====================================================================
+.SH "Language concepts"
+.\" ====================================================================
+.
+During the run of
+.IR @g@troff ,
+the
+.I roff
+input is cracked down to the information on what has to be printed at
+what position on the intended device.
+.
+So the language of the
+.I intermediate output
+format can be quite small.
+.
+Its only elements are commands with or without arguments.
+.
+In this document, the term \[lq]command\[rq] always refers to the
+.I intermediate output
+language, never to the
+.I roff
+language used for document formatting.
+.
+There are commands for positioning and text writing, for drawing, and
+for device controlling.
+.
+.
+.\" ====================================================================
+.SS Separation
+.\" ====================================================================
+.
+.I Classical troff output
+had strange requirements on whitespace.
+.
+The
+.I groff
+output parser, however, is smart about whitespace by making it
+maximally optional.
+.
+The whitespace characters, i.e., the
+.IR tab ,
+.IR space ,
+and
+.I newline
+characters, always have a syntactical meaning.
+.
+They are never printable because spacing within the output is always
+done by positioning commands.
+.
+.
+.P
+Any sequence of
+.I space
+or
+.I tab
+characters is treated as a single
+.I syntactical
+.IR space .
+.
+It separates commands and arguments, but is only required when there
+would occur a clashing between the command code and the arguments
+without the space.
+.
+Most often, this happens when variable length command names,
+arguments, argument lists, or command clusters meet.
+.
+Commands and arguments with a known, fixed length need not be
+separated by
+.I syntactical
+.IR space .
+.
+.
+.P
+A line break is a syntactical element, too.
+.
+Every command argument can be followed by whitespace, a comment, or a
+newline character.
+.
+Thus a
+.I syntactical line break
+is defined to consist of optional
+.I syntactical space
+that is optionally followed by a comment, and a newline character.
+.
+.
+.P
+The normal commands, those for positioning and text, consist of a
+single letter taking a fixed number of arguments.
+.
+For historical reasons, the parser allows stacking of such commands on
+the same line, but fortunately, in
+.I groff intermediate
+.IR output ,
+every command with at least one argument is followed by a line break,
+thus providing excellent readability.
+.
+.P
+The other commands \[em] those for drawing and device controlling \[em]
+have a more complicated structure; some recognize long command names,
+and some take a variable number of arguments.
+.
+So all
+.B D
+and
+.B x
+commands were designed to request a
+.I syntactical line break
+after their last argument.
+.
+Only one command,
+.RB \[oq] x\ X \[cq]
+has an argument that can stretch over several lines, all other
+commands must have all of their arguments on the same line as the
+command, i.e., the arguments may not be split by a line break.
+.
+.P
+Lines containing only spaces and/or a comment are treated as empty and
+ignored.
+.
+.
+.\" ====================================================================
+.SS "Argument units"
+.\" ====================================================================
+.
+Some commands accept integer arguments that represent measurements,
+but the scaling units of the formatter's language are never used.
+.
+Most commands assume a scaling unit
+.RB of\~\[lq] u \[rq]
+(basic units),
+and others
+.RB use\~\[lq] z \[rq]
+(scaled points);
+.
+These are defined by the parameters specified in the device's
+.I DESC
+file;
+see
+.MR groff_font @MAN5EXT@
+and,
+for more on scaling units,
+.MR groff @MAN7EXT@
+and
+.IR "Groff: The GNU Implementation of troff" ,
+the
+.I groff
+Texinfo manual.
+.
+Color-related commands use dimensionless integers.
+.
+.
+.P
+Note that single characters can have the eighth bit set, as can the
+names of fonts and special characters (this is, glyphs).
+.
+The names of glyphs and fonts can be of arbitrary length.
+.
+A glyph that is to be printed will always be in the current font.
+.
+.
+.P
+A string argument is always terminated by the next whitespace
+character (space, tab, or newline); an embedded
+.B #
+character is regarded as part of the argument, not as the beginning of
+a comment command.
+.
+An integer argument is already terminated by the next non-digit
+character, which then is regarded as the first character of the next
+argument or command.
+.
+.
+.\" ====================================================================
+.SS "Document parts"
+.\" ====================================================================
+.
+A correct
+.I intermediate output
+document consists of two parts, the
+.I prologue
+and the
+.IR body .
+.
+.P
+The task of the
+.I prologue
+is to set the general device parameters using three exactly specified
+commands.
+.
+The
+.I groff prologue
+is guaranteed to consist of the following three lines (in that order):
+.RS
+.P
+.B x\ T
+.I device
+.br
+.B x\ res
+.I n\ h\ v
+.br
+.B x init
+.RE
+.P
+with the arguments set as outlined in subsection \[lq]Device Control
+Commands\[rq] below.
+.
+However, the parser for the
+.I intermediate output
+format is able to swallow additional whitespace and comments as well.
+.
+.
+.P
+The
+.I body
+is the main section for processing the document data.
+.
+Syntactically, it is a sequence of any commands different from the
+ones used in the
+.IR prologue .
+.
+Processing is terminated as soon as the first
+.B x\ stop
+command is encountered; the last line of any
+.I groff intermediate output
+always contains such a command.
+.
+.
+.P
+Semantically, the
+.I body
+is page oriented.
+.
+A new page is started by a
+.BR p \~command.
+.
+Positioning, writing, and drawing commands are always done within the
+current page, so they cannot occur before the first
+.BR p \~command.
+.
+Absolute positioning (by the
+.B H
+and
+.BR V \~commands)
+is done relative to the current page, all other positioning
+is done relative to the current location within this page.
+.
+.
+.\" ====================================================================
+.SH "Command reference"
+.\" ====================================================================
+.
+This section describes all
+.I intermediate output
+commands, the classical commands as well as the
+.I groff
+extensions.
+.
+.
+.\" ====================================================================
+.SS "Comment command"
+.\" ====================================================================
+.
+.TP
+.BI # anything\c
+\[la]line-break\[ra]
+A comment.
+.
+Ignore any characters from the
+.BR # \~character
+up to the next newline.
+.
+Each comment can be preceded by arbitrary
+.I syntactical
+.IR space ;
+every command can be terminated by a comment.
+.
+.
+.\" ====================================================================
+.SS "Simple commands"
+.\" ====================================================================
+.
+The commands in this subsection have a command code consisting of a
+single character, taking a fixed number of arguments.
+.
+Most of them are commands for positioning and text writing.
+.
+These commands are smart about whitespace.
+.
+Optionally,
+.I syntactical space
+can be inserted before, after, and between the command letter and its
+arguments.
+.
+All of these commands are stackable, i.e., they can be preceded by
+other simple commands or followed by arbitrary other commands on the
+same line.
+.
+A separating
+.I syntactical space
+is necessary only when two integer arguments would clash or if the
+preceding argument ends with a string argument.
+.
+.
+.if \n[@USE_ENV_STACK]=1 \{\
+.TP
+.command {
+Open a new environment by copying the current device configuration data
+to the environment stack.
+.
+The current environment is setup by the device specification and
+manipulated by the setting commands.
+.
+.
+.TP
+.command }
+Close the current environment
+(opened by a preceding
+.BR { \~command)
+and restore the previous environment from the environment
+stack as the current device configuration data.
+.
+.\} \" endif @USE_ENV_STACK
+.
+.
+.TP
+.command C id \[la]white-space\[ra]
+Typeset the glyph of the special character
+.IR id .
+.
+Trailing syntactical space is necessary to allow special character names
+of arbitrary length.
+.
+The drawing position is not advanced.
+.\" XXX: Why does it matter that we read its size if we don't advance
+.\" the drawing position?
+.\" its size is read from the font description file.
+.
+.
+.TP
+.command c c
+Typeset the glyph of the ordinary character
+.RI character\~ c .
+.
+The drawing position is not advanced.
+.\" XXX: Why does it matter that we read its size if we don't advance
+.\" the drawing position?
+.\" its size is read from the font description file.
+.
+.
+.TP
+.command f n
+Select the font mounted at
+.RI position\~ n .
+.
+.IR n\~ cannot
+be negative.
+.
+.
+.TP
+.command H n
+Horizontally move the drawing position to
+.IR n\~ basic
+units from the left edge of the page.
+.
+.IR n\~ cannot
+be negative.
+.
+.
+.TP
+.command h n
+Move the drawing position right
+.I n
+basic units.
+.
+AT&T
+.I troff \" AT&T
+allowed negative
+.I n;
+GNU
+.I troff \" GNU
+does not produce such values,
+but
+.IR groff 's
+output driver library handles them.
+.
+.
+.TP
+.command m "scheme \f[R][\f[]component\f[R] .\|.\|.]"
+Select the stroke color using the
+.IR component s
+in the color space
+.IR scheme .
+.
+Each
+.I component
+is an integer between 0 and \n[@maxcolor].
+.
+The quantity of components and their meanings vary with each
+.IR scheme .
+.
+This command is a
+.I groff
+extension.
+.
+.
+.RS
+.TP
+.command mc "cyan magenta yellow"
+Use the CMY color scheme with components
+cyan,
+magenta,
+and yellow.
+.
+.
+.TP
+.command md
+Use the default color
+(no components;
+black in most cases).
+.
+.
+.TP
+.command mg gray
+Use a grayscale color scheme with a component ranging
+between 0 (black) and \n[@maxcolor] (white).
+.
+.
+.TP
+.command mk "cyan magenta yellow black"
+Use the CMYK color scheme with components
+cyan,
+magenta,
+yellow,
+and black.
+.
+.
+.TP
+.command mr "red green blue"
+Use the RGB color scheme with components
+red,
+green,
+and blue.
+.RE
+.
+.
+.TP
+.command N n
+Typeset the glyph with
+.RI index\~ n
+in the current font.
+.
+.IR n\~ is
+normally a non-negative integer.
+.
+The drawing position is not advanced.
+.
+The
+.B html
+and
+.B xhtml
+devices use this command with
+.RI negative\~ n
+to produce unbreakable space;
+the absolute value of
+.I n
+is taken and interpreted in basic units.
+.
+.
+.TP
+.command n b\~a
+Indicate a break.
+.
+No action is performed;
+the command is present to make the output more easily parsed.
+.
+The integers
+.I b
+.RI and\~ a
+describe the vertical space amounts before and after the break,
+respectively.
+.
+GNU
+.I troff \" GNU
+issues this command but
+.IR groff 's
+output driver library ignores it.
+.
+See
+.B v
+and
+.BR V .
+.
+.
+.TP
+.command p n
+Begin a new page,
+setting its number
+.RI to\~ n .
+.
+Each page is independent,
+even from those using the same number.
+.
+The vertical drawing position is set to\~0.
+.
+All positioning,
+writing,
+and drawing commands are interpreted in the context of a page,
+so a
+.BR p \~command
+must precede them.
+.
+.
+.TP
+.command s n
+Set type size to
+.I n
+scaled points
+.RB (unit\~ z
+in GNU
+.IR troff ). \" GNU
+.
+AT&T
+.I troff \" AT&T
+used unscaled points
+.RB ( p )
+instead;
+see section \[lq]Compatibility\[rq] below.
+.
+.
+.TP
+.command t xyz\f[R]\|.\|.\|.\& \f[R]\[la]white-space\[ra]
+.TQ
+.command t "xyz\f[R]\|.\|.\|.\&\f[] dummy-arg" \[la]white-space\[ra]
+Typeset word
+.IR xyz ;
+that is,
+set a sequence of ordinary glyphs named
+.IR x ,
+.IR y ,
+.IR z ,
+\&.\|.\|.\|,
+terminated by a space or newline;
+an optional second integer argument is ignored
+(this allows the formatter to generate an even number of arguments).
+.\" XXX: Why?
+.
+Each glyph is set at the current drawing position,
+and the position is then advanced horizontally by the glyph's width.
+.
+A glyph's width is read from its metrics in the font description file,
+scaled to the current type size,
+and rounded to a multiple of the horizontal motion quantum.
+.
+Use the
+.B C
+command to emplace glyphs of special characters.
+.
+The
+.BR t \~command
+is a
+.I groff
+extension and is output only for devices whose
+.I DESC
+file contains the
+.B tcommand
+directive;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.command u "n xyz"\f[R]\|.\|.\|.\& \f[R]\[la]white-space\[ra]
+.TQ
+.command u "xyz\f[R]\|.\|.\|.\&\f[] dummy-arg" \[la]white-space\[ra]
+Typeset word
+.I xyz
+with track kerning.
+.
+As
+.BR t ,
+but after placing each glyph,
+the drawing position is further advanced horizontally
+.RI by\~ n
+basic units.
+.
+The
+.BR u \~command
+is a
+.I groff
+extension and is output only for devices whose
+.I DESC
+file contains the
+.B tcommand
+directive;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.command V n
+Vertically move the drawing position to
+.IR n\~ basic
+units from the top edge of the page.
+.
+.IR n\~ cannot
+be negative.
+.
+.
+.TP
+.command v n
+Move the drawing position down
+.I n
+basic units.
+.
+AT&T
+.I troff \" AT&T
+allowed negative
+.I n;
+GNU
+.I troff \" GNU
+does not produce such values,
+but
+.IR groff 's
+output driver library handles them.
+.
+.
+.TP
+.command w
+Indicate an inter-word space.
+.
+No action is performed;
+the command is present to make the output more easily parsed.
+.
+Only adjustable,
+breakable inter-word spaces are thus described;
+those resulting from
+.B \[rs]\[ti]
+or horizontal motion escape sequences are not.
+.
+GNU
+.I troff \" GNU
+issues this command but
+.IR groff 's
+output driver library ignores it.
+.
+See
+.B h
+and
+.BR H .
+.
+.
+.\" ====================================================================
+.SS "Graphics commands"
+.\" ====================================================================
+.
+Each graphics or drawing command in the
+.I intermediate output
+starts with the letter\~\c
+.B D
+followed by one or two characters that specify a subcommand; this
+is followed by a fixed or variable number of integer arguments that
+are separated by a single space character.
+.
+A
+.BR D \~command
+may not be followed by another command on the same line (apart from a
+comment), so each
+.BR D \~command
+is terminated by a
+.I syntactical line
+.IR break .
+.
+.
+.P
+.I @g@troff
+output follows the classical spacing rules (no space between command
+and subcommand, all arguments are preceded by a single space
+character), but the parser allows optional space between the command
+letters and makes the space before the first argument optional.
+.
+As usual, each space can be any sequence of tab and space characters.
+.
+.
+.P
+Some graphics commands can take a variable number of arguments.
+.
+In this case, they are integers representing a size measured in basic
+units\~\c
+.BR u .
+.
+The
+.I h
+arguments
+stand for horizontal distances where positive means right, negative
+left.
+.
+The
+.I v
+arguments
+stand for vertical distances where positive means down, negative up.
+.
+All these distances are offsets relative to the current location.
+.
+.
+.P
+Unless indicated otherwise, each graphics command directly corresponds
+to a similar
+.I groff
+.B \*[@backslash]D
+escape sequence; see
+.MR groff @MAN7EXT@ .
+.
+.
+.P
+Unknown
+.BR D \~commands
+are assumed to be device-specific.
+.
+Its arguments are parsed as strings; the whole information is then
+sent to the postprocessor.
+.
+.
+.P
+In the following command reference, the syntax element
+.I \[la]line-break\[ra]
+means a
+.I syntactical line break
+as defined in subsection \[lq]Separation\[rq] above.
+.
+.
+.TP
+.D-multiarg \[ti]
+Draw B-spline from current position to offset
+.indexed_offset h 1 v 1 ,
+then to offset
+.indexed_offset h 2 v 2
+if given, etc., up to
+.indexed_offset h n v n .
+This command takes a variable number of argument pairs; the current
+position is moved to the terminal point of the drawn curve.
+.
+.
+.TP
+.Da-command
+Draw arc from current position to
+.indexed_offset h 1 v 1 \|+\|\c
+.indexed_offset h 2 v 2
+with center at
+.indexed_offset h 1 v 1 ;
+then move the current position to the final point of the arc.
+.
+.
+.TP
+.D-command C d
+.TQ
+.D-command C "d dummy-arg"
+Draw a solid circle using the current fill color with diameter\~\c
+.I d
+(integer in basic units\~\c
+.BR u )
+with leftmost point at the current position; then move the current
+position to the rightmost point of the circle.
+.
+An optional second integer argument is ignored (this allows the
+formatter to generate an even number of arguments).
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.D-command c d
+Draw circle line with diameter\~\c
+.I d
+(integer in basic units\~\c
+.BR u )
+with leftmost point at the current position; then move the current
+position to the rightmost point of the circle.
+.
+.
+.TP
+.D-command E "h v"
+Draw a solid ellipse in the current fill color with a horizontal
+diameter of\~\c
+.I h
+and a vertical diameter of\~\c
+.I v
+(both integers in basic units\~\c
+.BR u )
+with the leftmost point at the current position; then move to the
+rightmost point of the ellipse.
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.D-command e "h v"
+Draw an outlined ellipse with a horizontal diameter of\~\c
+.I h
+and a vertical diameter of\~\c
+.I v
+(both integers in basic units\~\c
+.BR u )
+with the leftmost point at current position; then move to the
+rightmost point of the ellipse.
+.
+.
+.TP
+.D-command F "color-scheme \fR[\fPcomponent\fR .\|.\|.]\fP"
+Set fill color for solid drawing objects using different color
+schemes; the analogous command for setting the color of text, line
+graphics, and the outline of graphic objects is
+.BR m .
+.
+The color components are specified as integer arguments between 0 and
+\n[@maxcolor].
+.
+The number of color components and their meaning vary for the
+different color schemes.
+.
+These commands are generated by the
+.I groff
+escape sequences
+.BR \*[@backslash]D\[aq]F\ .\|.\|. '
+and
+.B \*[@backslash]M
+(with no other corresponding graphics commands).
+.
+This command is a
+.I groff
+extension.
+.
+.
+.RS
+.
+.TP
+.D-command Fc "cyan magenta yellow"
+Set fill color for solid drawing objects using the CMY color scheme,
+having the 3\~color components cyan, magenta, and yellow.
+.
+.
+.TP
+.D-command Fd
+Set fill color for solid drawing objects to the default fill color value
+(black in most cases).
+.
+No component arguments.
+.
+.
+.TP
+.D-command Fg "gray"
+Set fill color for solid drawing objects to the shade of gray given by
+the argument, an integer between 0 (black) and \n[@maxcolor] (white).
+.
+.
+.TP
+.D-command Fk "cyan magenta yellow black"
+Set fill color for solid drawing objects using the CMYK color scheme,
+having the 4\~color components cyan, magenta, yellow, and black.
+.
+.TP
+.D-command Fr "red green blue"
+Set fill color for solid drawing objects using the RGB color scheme,
+having the 3\~color components red, green, and blue.
+.
+.RE
+.
+.
+.TP
+.D-command f n
+The argument
+.I n
+must be an integer in the range \-32767 to 32767.
+.
+.RS
+.TP
+.RI 0\|\[<=]\| n \|\[<=]\|1000
+Set the color for filling solid drawing objects to a shade of gray,
+where 0 corresponds to solid white, 1000 (the default) to solid black,
+and values in between to intermediate shades of gray; this is
+obsoleted by command
+.BR DFg .
+.
+.TP
+.IR n "\|<\|0 or " n \|>\|1000
+Set the filling color to the color that is currently being used for
+the text and the outline, see command
+.BR m .
+For example, the command sequence
+.
+.RS
+.IP
+.EX
+mg 0 0 \n[@maxcolor]
+Df \-1
+.EE
+.RE
+.
+.IP
+sets all colors to blue.
+.
+.P
+This command is a
+.I groff
+extension.
+.
+.RE
+.
+.
+.TP
+.D-command l "h v"
+Draw line from current position to offset
+.offset h v
+(integers in basic units\~\c
+.BR u );
+then set current position to the end of the drawn line.
+.
+.
+.TP
+.D-multiarg p
+Draw a polygon line from current position to offset
+.indexed_offset h 1 v 1 ,
+from there to offset
+.indexed_offset h 2 v 2 ,
+etc., up to offset
+.indexed_offset h n v n ,
+and from there back to the starting position.
+.
+.ie \n[@STUPID_DRAWING_POSITIONING]=1 \{\
+For historical reasons, the position is changed by adding the sum of
+all arguments with odd index to the current horizontal position and the
+even ones to the vertical position.
+.
+Although this doesn't make sense it is kept for compatibility.
+.
+.\}
+.el \{\
+As the polygon is closed, the end of drawing is the starting point, so
+the position doesn't change.
+.\}
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.D-multiarg P
+The same macro as the corresponding
+.B Dp
+command with the same arguments, but draws a solid polygon in the
+current fill color rather than an outlined polygon.
+.
+.if \n[@STUPID_DRAWING_POSITIONING]=1 \{\
+The position is changed in the same way as with
+.BR Dp .
+.\}
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.D-command t n
+Set the current line thickness
+.RI to\~ n
+(an integer in basic
+.RB units\~ u )
+if
+.IR n \|>\|0;
+if
+.IR n \|=\|0
+select the smallest available line thickness;
+otherwise,
+the line thickness is made proportional to the type size,
+which is the default.
+.
+.if \n[@STUPID_DRAWING_POSITIONING]=1 \{\
+For historical reasons,
+the horizontal position is changed by adding the argument to the current
+horizontal position,
+while the vertical position is not changed.
+.
+Although this doesn't make sense,
+it is kept for compatibility.
+.\}
+.
+This command is a
+.I groff
+extension.
+.
+.
+.\" ====================================================================
+.SS "Device control commands"
+.\" ====================================================================
+.
+Each device control command starts with the letter
+.B x
+followed by a space character (optional or arbitrary space/\:tab in
+.IR groff )
+and a subcommand letter or word; each argument (if any) must be
+preceded by a
+.I syntactical
+.IR space .
+.
+All
+.B x
+commands are terminated by a
+.IR "syntactical line break" ;
+no device control command can be followed by another command on the same
+line (except a comment).
+.
+.P
+The subcommand is basically a single letter, but to increase
+readability, it can be written as a word, i.e., an arbitrary sequence
+of characters terminated by the next tab, space, or newline character.
+.
+All characters of the subcommand word but the first are simply ignored.
+.
+For example,
+.I @g@troff
+outputs the initialization command
+.B x\ i
+as
+.B x\ init
+and the resolution command
+.B x\ r
+as
+.BR "x\ res" .
+.
+But writings like
+.B x\ i_like_groff
+and
+.B x\ roff_is_groff
+are accepted as well to mean the same commands.
+.
+.P
+In the following, the syntax element
+.I \[la]line-break\[ra]
+means a
+.I syntactical line break
+as defined in subsection \[lq]Separation\[rq] above.
+.
+.TP
+.x-command F name
+.xsub Filename
+Use
+.I name
+as the intended name for the current file in error reports.
+.
+This is useful for remembering the original file name when
+.I groff
+uses an internal piping mechanism.
+.
+The input file is not changed by this command.
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.x-command f "n\ s"
+.xsub font
+Mount font position\~\c
+.I n
+(a non-negative integer) with font named\~\c
+.I s
+(a text word);
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.TP
+.x-command H n
+.xsub Height
+Set character height to\~\c
+.I n
+(a positive integer in scaled points\~\c
+.BR z ).
+.
+.I Classical troff
+used the unit points (\c
+.BR p )
+instead;
+see section \[lq]Compatibility\[rq] below.
+.
+.
+.TP
+.x-command i
+.xsub init
+Initialize device.
+.
+This is the third command of the
+.IR prologue .
+.
+.
+.TP
+.x-command p
+.xsub pause
+Parsed but ignored.
+.
+The classical documentation reads
+.I pause device, can be
+.IR restarted .
+.
+.
+.TP
+.x-command r "n\ h\ v"
+.xsub resolution
+Resolution is\~\c
+.IR n ,
+while
+.I h
+is the minimal horizontal motion, and
+.I v
+the minimal vertical motion possible with this device; all arguments
+are positive integers in basic units\~\c
+.B u
+per inch.
+.
+This is the second command of the
+.IR prologue .
+.
+.
+.TP
+.x-command S n
+.xsub Slant
+Set slant to\~\c
+.I n
+degrees (an integer in basic units\~\c
+.BR u ).
+.
+.
+.TP
+.x-command s
+.xsub stop
+Terminates the processing of the current file; issued as the last
+command of any
+.I intermediate @g@troff
+.IR output .
+.
+.
+.TP
+.x-command t
+.xsub trailer
+Generate trailer information, if any.
+.
+In
+.BR groff ,
+this is currently ignored.
+.
+.
+.TP
+.x-command T xxx
+.xsub Typesetter
+.
+Set the name of the output driver to
+.IR xxx ,
+a sequence of non-whitespace characters terminated by whitespace.
+.
+The possible names correspond to those of
+.IR groff 's
+.B \-T
+option.
+.
+This is the first command of the prologue.
+.
+.
+.TP
+.x-command u n
+.xsub underline
+Configure underlining of spaces.
+.
+If
+.I n
+is\~1, start underlining of spaces;
+if
+.I n
+is\~0, stop underlining of spaces.
+.
+This is needed for the
+.B cu
+request in
+.B @g@nroff
+mode and is ignored otherwise.
+.
+This command is a
+.I groff
+extension.
+.
+.
+.TP
+.x-command X anything
+.xsub X-escape
+Send string
+.I anything
+uninterpreted to the device.
+.
+If the line following this command starts with a
+.B +
+character this line is interpreted as a continuation line in the
+following sense.
+.
+The
+.B +
+is ignored, but a newline character is sent instead to the device, the
+rest of the line is sent uninterpreted.
+.
+The same applies to all following lines until the first character of a
+line is not a
+.B +
+character.
+.
+This command is generated by the
+.I groff
+escape sequence
+.BR \*[@backslash]X .
+.
+The line-continuing feature is a
+.I groff
+extension.
+.
+.
+.\" ====================================================================
+.SS "Obsolete command"
+.\" ====================================================================
+.
+In
+.I classical troff
+output, emitting a single glyph was mostly done by a very
+strange command that combined a horizontal move and the printing of a
+glyph.
+.
+It didn't have a command code, but is represented by a 3-character
+argument consisting of exactly 2\~digits and a character.
+.
+.TP
+.I ddc
+Move right
+.I dd
+(exactly two decimal digits) basic units\~\c
+.BR u ,
+then print glyph with single-letter name\~\c
+.IR c .
+.
+.
+.RS
+.P
+In
+.IR groff ,
+arbitrary
+.I syntactical space
+around and within this command is allowed to be added.
+.
+Only when a preceding command on the same line ends with an argument
+of variable length a separating space is obligatory.
+.
+In
+.I classical
+.IR troff ,
+large clusters of these and other commands were used, mostly without
+spaces; this made such output almost unreadable.
+.
+.RE
+.
+.
+.P
+For modern high-resolution devices, this command does not make sense
+because the width of the glyphs can become much larger than two
+decimal digits.
+.
+In
+.IR groff ,
+it is used only for output to the
+.BR X75 ,
+.BR X75\-12 ,
+.BR X100 ,
+and
+.B X100\-12
+devices.
+.
+For others,
+the commands
+.B t
+.RB and\~ u
+provide greater functionality and superior troubleshooting capacity.
+.
+.
+.\" ====================================================================
+.SH Postprocessing
+.\" ====================================================================
+.
+The
+.I roff
+postprocessors are programs that have the task to translate the
+.I intermediate output
+into actions that are sent to a device.
+.
+A device can be some piece of hardware such as a printer, or a software
+file format suitable for graphical or text processing.
+.
+The
+.I groff
+system provides powerful means that make the programming of such
+postprocessors an easy task.
+.P
+There is a library function that parses the
+.I intermediate output
+and sends the information obtained to the device via methods of a
+class with a common interface for each device.
+.
+So a
+.I groff
+postprocessor must only redefine the methods of this class.
+.
+For details,
+see the reference in section \[lq]Files\[rq] below.
+.
+.
+.\" ====================================================================
+.SH Example
+.\" ====================================================================
+.
+This section presents the
+.I intermediate output
+generated from the same input for three different devices.
+.
+The input is the sentence
+.I hell world
+fed into
+.I groff
+on the command line.
+.
+.
+.IP \[bu] 2m
+High-resolution device
+.I ps
+.
+.
+.RS
+.P
+.EX
+.RB "shell>\~" "echo \[dq]hell world\[dq] | groff \-Z \-T ps"
+.EE
+.
+.
+.P
+.EX
+x T ps
+x res 72000 1 1
+x init
+p1
+x font 5 TR
+f5
+s10000
+V12000
+H72000
+thell
+wh2500
+tw
+H96620
+torld
+n12000 0
+x trailer
+V792000
+x stop
+.EE
+.RE
+.
+.
+.P
+This output can be fed into the postprocessor
+.MR grops @MAN1EXT@
+to get its representation as a PostScript file, or
+.MR gropdf @MAN1EXT@
+to output directly to PDF.
+.
+.
+.IP \[bu] 2m
+Low-resolution device
+.I latin1
+.
+.
+.RS
+.P
+This is similar to the high-resolution device except that the
+positioning is done at a minor scale.
+.
+Some comments (lines starting with
+.IR # )
+were added for clarification; they were not generated by the
+formatter.
+.
+.
+.P
+.EX
+\fBshell>\fP "hell world" | groff \-Z \-T latin1
+.EE
+.
+.
+.P
+.EX
+.I # prologue
+x T latin1
+x res 240 24 40
+x init
+.I # begin a new page
+p1
+.I # font setup
+x font 1 R
+f1
+s10
+.I # initial positioning on the page
+V40
+H0
+.I # write text \[aq]hell\[aq]
+thell
+.I # inform about a space, and do it by a horizontal jump
+wh24
+.I # write text \[aq]world\[aq]
+tworld
+.I # announce line break, but do nothing because ...
+n40 0
+.I # ... the end of the document has been reached
+x trailer
+V2640
+x stop
+.EE
+.RE
+.
+.
+.P
+This output can be fed into the postprocessor
+.MR grotty @MAN1EXT@
+to get a formatted text document.
+.
+.
+.IP \[bu] 2m
+Classical style output
+.
+.
+.RS
+.P
+As a computer monitor has a very low resolution compared to modern
+printers the
+.I intermediate output
+for the X\~devices can use the jump-and-write command with its 2-digit
+displacements.
+.
+.
+.P
+.EX
+\fBshell>\fP "hell world" | groff \-Z \-T X100
+.EE
+.
+.
+.P
+.EX
+x T X100
+x res 100 1 1
+x init
+p1
+x font 5 TR
+f5
+s10
+V16
+H100
+.I # write text with old-style jump-and-write command
+ch07e07l03lw06w11o07r05l03dh7
+n16 0
+x trailer
+V1100
+x stop
+.EE
+.RE
+.
+.
+.P
+This output can be fed into the postprocessor
+.MR xditview 1x
+or
+.MR gxditview @MAN1EXT@
+for displaying in\~X.
+.
+.
+.P
+Due to the obsolete jump-and-write command, the text clusters in the
+classical output are almost unreadable.
+.
+.
+.\" ====================================================================
+.SH Compatibility
+.\" ====================================================================
+.
+The
+.I intermediate output
+language of the
+.I classical troff
+was first documented in
+[CSTR\~#97].
+.
+The
+.I groff intermediate output
+format is compatible with this specification except for the following
+features.
+.
+.
+.IP \[bu] 2m
+The classical quasi device independence is not yet implemented.
+.
+.
+.IP \[bu] 2m
+The old hardware was very different from what we use today.
+.
+So the
+.I groff
+devices are also fundamentally different from the ones in
+.I classical
+.IR troff .
+.
+For example, the classical PostScript device was called
+.I post
+and had a resolution of 720 units per inch,
+while
+.IR groff 's
+.I ps
+device has a resolution of 72000 units per inch.
+.
+Maybe, by implementing some rescaling mechanism similar to the
+classical quasi device independence, these could be integrated into
+modern
+.IR groff .
+.
+.
+.IP \[bu] 2m
+The B-spline command
+.B D\[ti]
+is correctly handled by the
+.I intermediate output
+parser, but the drawing routines aren't implemented in some of the
+postprocessor programs.
+.
+.
+.IP \[bu] 2m
+The argument of the commands
+.B s
+and
+.B x H
+has the implicit unit scaled point\~\c
+.B z
+in
+.IR groff ,
+while
+.I classical troff
+had point (\c
+.BR p ).
+.
+This isn't an incompatibility, but a compatible extension, for both
+units coincide for all devices without a
+.I sizescale
+parameter, including all classical and the
+.I groff
+text devices.
+.
+The few
+.I groff
+devices with a sizescale parameter either did not exist, had a
+different name, or seem to have had a different resolution.
+.
+So conflicts with classical devices are very unlikely.
+.
+.
+.ie \n[@STUPID_DRAWING_POSITIONING]=1 \{\
+.IP \[bu] 2m
+The position changing after the commands
+.BR Dp ,
+.BR DP ,
+and
+.B Dt
+is illogical, but as old versions of groff used this feature it is
+kept for compatibility reasons.
+.\} \" @STUPID_DRAWING_POSITIONING
+.el \{\
+.IP \[bu] 2m
+Temporarily, there existed some confusion on the positioning after the
+.B D
+commands that are
+.I groff
+extensions.
+.
+This has been clarified by establishing the classical rule for all
+groff drawing commands:
+.
+.
+.RS
+.P
+.ft I
+The position after a graphic object has been drawn is at its end;
+for circles and ellipses, the "end" is at the right side.
+.ft
+.RE
+.
+.
+.P
+From this, the positionings specified for the drawing commands above
+follow quite naturally.
+.\} \" @STUPID_DRAWING_POSITIONING
+.
+.P
+The differences between
+.I groff
+and
+.I classical troff
+are documented in
+.MR groff_diff @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SH Files
+.\" ====================================================================
+.
+.TP
+.IR @FONTDIR@/\:\%dev name /\:DESC
+describes the output device
+.IR name .
+.
+.
+.br
+.ne 4v
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+James Clark wrote an early version of this document,
+which described only the differences between AT&T
+device-independent
+.IR troff 's
+output format and that of GNU
+.IR roff .
+.
+The present version was completely rewritten in 2001 by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.P
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54,
+widely called simply \[lq]CSTR\~#54\[rq],
+documents the language,
+device and font description file formats,
+and device-independent output format
+referred to collectively in
+.I groff
+documentation as
+.RI \[lq]AT&T\~ troff \[rq].
+.
+.
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97,
+provides additional insights into the
+device and font description file formats
+and device-independent output format.
+.
+.
+.TP
+.MR groff @MAN1EXT@
+documents the
+.B \-Z
+option and contains pointers to further
+.I groff
+documentation.
+.
+.
+.TP
+.MR groff @MAN7EXT@
+describes the
+.I groff
+language,
+including its escape sequences and system of units.
+.
+.
+.TP
+.MR groff_font @MAN5EXT@
+details the device scaling parameters of device
+.I DESC
+files.
+.
+.
+.TP
+.MR @g@troff @MAN1EXT@
+generates the device-independent intermediate output documented here.
+.
+.
+.TP
+.MR roff @MAN7EXT@
+presents historical aspects and the general structure of
+.I roff
+systems.
+.
+.
+.TP
+.MR groff_diff @MAN7EXT@
+enumerates differences between the intermediate output produced by AT&T
+.I troff \" AT&T
+and that of
+.IR groff .
+.
+.
+.TP
+.MR gxditview @MAN1EXT@
+is a viewer for intermediate output.
+.
+.
+.TP
+.UR https://\:github.com/\:Alhadis/\:Roff\:.js/
+.I Roff.js
+.UE
+is a viewer for intermediate output written in JavaScript.
+.
+.
+.P
+.MR grodvi @MAN1EXT@ ,
+.MR grohtml @MAN1EXT@ ,
+.MR grolbp @MAN1EXT@ ,
+.MR grolj4 @MAN1EXT@ ,
+.MR gropdf @MAN1EXT@ ,
+.MR grops @MAN1EXT@ ,
+and
+.MR grotty @MAN1EXT@
+are
+.I groff
+postprocessors.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_out_5_man_C]
+.do rr *groff_groff_out_5_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/groff_tmac.5.man b/man/groff_tmac.5.man
new file mode 100644
index 0000000..fac78f5
--- /dev/null
+++ b/man/groff_tmac.5.man
@@ -0,0 +1,1474 @@
+.TH groff_tmac @MAN5EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+groff_tmac \- macro files in the GNU
+.I roff
+typesetting system
+.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2000-2022 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff typesetting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, with no Front-Cover Texts,
+.\" and with no Back-Cover Texts.
+.\"
+.\" A copy of the Free Documentation License is included as a file
+.\" called FDL in the main directory of the groff source package.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_groff_tmac_5_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" TODO: Consider parallelizing with our Texinfo node "Macro Packages".
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+Definitions of macros,
+strings,
+and registers for use in a
+.MR roff @MAN7EXT@
+document can be collected into
+.IR "macro files" ,
+.I roff
+input files designed to produce no output themselves but instead ease
+the preparation of other
+.I roff
+documents.
+.
+There is no syntactical difference between a macro file and any other
+.I roff
+document;
+only its purpose distinguishes it.
+.
+When a macro file is installed at a standard location,
+named according to a certain convention,
+and suitable for use by a general audience,
+it is termed a
+.IR "macro package" .
+.
+Macro packages can be loaded by supplying the
+.B \-m
+option to
+.MR @g@troff @MAN1EXT@
+or a
+.I groff
+front end.
+.
+.
+.P
+Each macro package stores its macro,
+string,
+and register definitions in one or more
+.I tmac
+files.
+.
+This name originated in early Unix culture as an abbreviation of
+.RI \[lq] troff \" generic
+macros\[rq].
+.
+.
+.P
+A macro file must have a name in the form
+.RI name .tmac
+(or
+.IR tmac. name)
+and be placed in a
+.RI \[lq] tmac
+directory\[rq] to be loadable with the
+.BI \-m name
+option.
+.
+Section \[lq]Environment\[rq] of
+.MR @g@troff @MAN1EXT@
+lists these directories.
+.
+Alternatively,
+a
+.I groff
+document requiring a macro file can load it with the
+.B mso
+(\[lq]macro source\[rq]) request.
+.
+.
+.P
+Like any other
+.I roff
+document,
+a macro file can use the
+.RB \[lq] so \[rq]
+request (\[lq]source\[rq]) to load further files relative to its own
+location.
+.
+.
+.P
+Macro files are named for their most noteworthy application,
+but a macro file need not define any macros.
+.
+It can restrict itself to defining registers and strings or invoking
+other
+.I groff
+requests.
+.
+It can even be empty.
+.
+.
+.\" ====================================================================
+.SH "Macro packages"
+.\" ====================================================================
+.
+Macro packages come in two varieties;
+those which assume responsibility for page layout and other critical
+functions
+(\[lq]major\[rq] or \[lq]full-service\[rq])
+and those which do not
+(\[lq]supplemental\[rq] or \[lq]auxiliary\[rq]).
+.
+GNU
+.I roff
+provides most major macro packages found in AT&T and BSD Unix systems,
+an additional full-service package,
+and many supplemental packages.
+.
+Multiple full-service macro packages cannot be used by the same
+document.
+.
+Auxiliary packages can generally be freely combined,
+though attention to their use of the
+.I groff
+language name spaces for identifiers
+(particularly registers,
+macros,
+strings,
+and diversions)
+should be paid.
+.
+Name space management was a significant challenge in AT&T
+.IR troff ;
+.IR groff 's
+support for arbitrarily long identifiers affords few excuses for name
+collisions,
+apart from attempts at compatibility with the demands of historical
+documents.
+.
+.
+.\" ====================================================================
+.SS "Man pages"
+.\" ====================================================================
+.
+.TP
+.I an
+.TQ
+.I man
+.I an
+is used to compose man pages in the format originating in Version\~7
+Unix (1979).
+.
+It has a small macro interface and is widely used;
+see
+.MR groff_man @MAN7EXT@ .
+.
+.
+.TP
+.I doc
+.TQ
+.I mdoc
+.I doc
+is used to compose man pages in the format originating in 4.3BSD-Reno
+(1990).
+.
+It provides many more features than
+.IR an ,
+but is also larger,
+more complex,
+and not as widely adopted;
+see
+.MR groff_mdoc @MAN7EXT@ .
+.
+.
+.P
+Because readers of man pages often do not know in advance which macros
+are used to format a given document,
+a wrapper is available.
+.
+.
+.TP
+.I \%andoc
+.TQ
+.I mandoc
+This macro file,
+specific to
+.IR groff ,
+recognizes whether a document uses
+.I man
+or
+.I mdoc
+format and loads the corresponding macro package.
+.
+Multiple man pages,
+in either format,
+can be handled;
+.I \%andoc
+reloads each macro package as necessary.
+.
+.
+.\" ====================================================================
+.SS "Full-service packages"
+.\" ====================================================================
+.
+The packages in this section provide a complete set of macros for
+writing documents of any kind, up to whole books.
+.
+They are similar in functionality; it is a matter of taste which one
+to use.
+.
+.
+.TP
+.I me
+The classical
+.I me
+macro package; see
+.MR groff_me @MAN7EXT@ .
+.
+.
+.TP
+.I mm
+The semi-classical
+.I mm
+macro package; see
+.MR groff_mm @MAN7EXT@ .
+.
+.
+.TP
+.I mom
+The
+.I mom
+macro package, only available in groff.
+.
+As this was not based on other packages, it was freely designed as
+quite a nice, modern macro package.
+.
+See
+.MR groff_mom @MAN7EXT@ .
+.
+.
+.TP
+.I ms
+The classical
+.I ms
+macro package; see
+.MR groff_ms @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SS "Localization packages"
+.\" ====================================================================
+.
+For Western languages,
+the localization file sets the hyphenation mode and loads hyphenation
+patterns and exceptions.
+.
+Localization files can also adjust the date format and provide
+translations of strings used by some of the full-service macro packages;
+alter the input encoding
+(see the next section);
+and change the amount of additional inter-sentence space.
+.
+For Eastern languages,
+the localization file defines character classes and sets flags on them.
+.
+By default,
+.I troffrc
+loads the localization file for English.
+.
+.
+.TP
+.I trans
+loads localized strings used by various macro packages after their
+localized forms have been prepared by a localization macro file.
+.
+.
+.P
+.I groff
+provides the following localization files.
+.
+.
+.TP
+.I cs
+Czech;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+Sets the input encoding to Latin-2 by loading
+.IR latin2.tmac .
+.
+.
+.TP
+.I de
+.TQ
+.I den
+German;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+Sets the input encoding to Latin-1 by loading
+.IR latin1.tmac .
+.
+.
+.IP
+.I de.tmac
+selects hyphenation patterns for traditional orthography,
+and
+.I den.tmac
+does the same for the new orthography
+(\[lq]Recht\%schreib\%reform\[rq]).
+.
+.
+.TP
+.I en
+English.
+.
+.
+.TP
+.I fr
+French;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+Sets the input encoding to Latin-9 by loading
+.IR latin9.tmac .
+.
+.
+.TP
+.I it
+Italian;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+.
+.TP
+.I ja
+Japanese.
+.
+.
+.TP
+.I sv
+Swedish;
+localizes
+.IR man ,
+.IR me ,
+.IR mm ,
+.IR mom ,
+and
+.IR ms .
+.
+Sets the input encoding to Latin-1 by loading
+.IR latin1.tmac .
+.
+Some of the localization of the
+.I mm
+package is handled separately;
+see
+.MR groff_mmse @MAN7EXT@ .
+.
+.
+.TP
+.I zh
+Chinese.
+.
+.
+.\" ====================================================================
+.SS "Input encodings"
+.\" ====================================================================
+.
+.TP
+.I latin1
+.TQ
+.I latin2
+.TQ
+.I latin5
+.TQ
+.I latin9
+are various ISO\~8859 input encodings supported by
+.IR groff .
+.
+On systems using ISO character encodings,
+.I groff
+loads
+.I latin1.tmac
+automatically at startup.
+.
+A document that uses Latin-2,
+Latin-5,
+or Latin-9
+can specify one of these alternative encodings.
+.
+.
+.TP
+.I cp1047
+provides support for EBCDIC-based systems.
+.
+On those platforms,
+.I groff
+loads
+.I cp1047.tmac
+automatically at startup.
+.
+.
+.P
+Because different input character codes constitute valid GNU
+.I troff \" GNU
+input on ISO and EBCDIC systems,
+the
+.I latin
+macro files cannot be used on EBCDIC systems,
+and
+.I cp1047
+cannot be used on ISO systems.
+.
+.
+.\" ====================================================================
+.SS "Auxiliary packages"
+.\" ====================================================================
+.
+The macro packages in this section are not intended for stand-alone
+use,
+but can add functionality to any other macro package or to plain
+(\[lq]raw\[rq])
+.I groff
+documents.
+.
+.
+.\" TODO:
+.\" a4
+.\" devtag
+.\" doc-old
+.\" europs
+.\" psatk
+.\" psfig
+.TP
+.I 62bit
+provides macros for addition,
+multiplication,
+and division of 62-bit integers
+(allowing safe multiplication of signed 31-bit integers,
+for example).
+.
+.
+.TP
+.I hdtbl
+allows the generation of tables using a syntax similar to the HTML table
+model.
+.
+This Heidelberger table macro package is not a preprocessor,
+which can be useful if the contents of table entries are determined by
+macro calls or string interpolations.
+.
+Compare to
+.MR @g@tbl @MAN1EXT@ .
+.
+It works only with the
+.B ps
+and
+.B pdf
+output devices.
+.
+See
+.MR groff_hdtbl @MAN7EXT@ .
+.
+.
+.TP
+.I papersize
+enables the paper format to be set on the command line by giving a
+.RB \[lq] \-d
+.BI \%paper= format\c
+\[rq]
+option to
+.IR @g@troff .
+.
+Possible values for
+.I format
+are the ISO and DIN formats
+.RB \[lq] A0 \[en] A6 \[rq],
+.RB \[lq] B0 \[en] B6 \[rq],
+.RB \[lq] C0 \[en] C6 \[rq],
+and
+.RB \[lq] D0 \[en] D6 \[rq];
+.\" XXX: src/libs/libgroff/paper.cpp also supports [ABCD]7.
+the U.S.\& formats
+.RB \%\[lq] letter \[rq],
+.RB \%\[lq] legal \[rq],
+.RB \%\[lq] tabloid \[rq],
+.RB \%\[lq] ledger \[rq],
+.RB \%\[lq] statement \[rq],
+and
+.RB \%\[lq] executive \[rq];
+and the envelope formats
+.RB \%\[lq] com10 \[rq],
+.RB \%\[lq] monarch \[rq],
+and
+.RB \%\[lq] DL \[rq].
+.
+All formats,
+even those for envelopes,
+are in portrait orientation:
+the length measurement is vertical.
+.
+Appending \[lq]l\[rq] (ell) to any of these denotes landscape
+orientation instead.
+.
+This macro file assumes one-inch horizontal margins,
+and sets registers recognized by the
+.I groff
+.IR man ,
+.IR mdoc ,
+.IR mm ,
+.IR mom ,
+and
+.I ms
+packages to configure them accordingly.
+.
+If you want different margins,
+you will need to use those packages' facilities,
+or
+.I @g@troff
+.B ll
+and/or
+.B po
+requests to adjust them.
+.
+An output device typically requires command-line options
+.B \-p
+and
+.B \-l
+to override the paper dimensions and orientation,
+respectively,
+defined in its
+.I DESC
+file;
+see subsection \[lq]Paper format\[rq]
+of
+.MR groff @MAN1EXT@ .
+.
+This macro file is normally loaded at startup by the
+.I troffrc
+file when formatting for a typesetting device
+(but not a terminal).
+.
+.
+.TP
+.I pdfpic
+provides a single macro,
+.BR PDFPIC ,
+to include a PDF graphic in a document using features of the
+.B pdf
+output driver.
+.
+For other output devices,
+.B PDFPIC
+calls
+.BR PSPIC ,
+with which it shares an interface
+(see below).
+.
+This macro file is normally loaded at startup by the
+.I troffrc
+file.
+.
+.
+.TP
+.I pic
+supplies definitions of the macros
+.BR PS ,
+.BR PE ,
+and
+.BR PF ,
+usable with the
+.MR @g@pic @MAN1EXT@
+preprocessor.
+.
+They center each picture.
+.
+Use it if your document does not use a full-service macro package,
+or that package does not supply working
+.I pic
+macro definitions.
+.
+Except for
+.I man
+and
+.IR mdoc ,
+those provided with
+.I groff
+already do so
+(exception:
+.I mm
+employs the name
+.B PF
+for a different purpose).
+.
+.
+.TP
+.I pspic
+provides a macro,
+.BR PSPIC ,
+that includes a PostScript graphic in a document.
+.
+The
+.BR ps ,
+.BR dvi ,
+.BR html ,
+and
+.B xhtml
+output devices support such inclusions;
+for all other drivers,
+the image is replaced with a rectangular border of the same size.
+.
+.I pspic.tmac
+is loaded at startup by the
+.I troffrc
+file.
+.
+.
+.IP
+Its syntax is as follows.
+.RS
+.IP
+\&\fB.PSPIC\fP \
+[\fB\-L\fP\|\
+|\|\fB\-R\fP\|\
+|\|\fB\-C\fP\|\
+|\|\fB\-I\fP\~\fIn\fP] \
+\fI\|file\fP [\fIwidth\fP [\,\fIheight\/\fP]]
+.RE
+.
+.
+.IP
+.I file
+is the name of the PostScript file;
+.I width
+and
+.I height
+give the desired width and height of the image.
+.
+If neither a
+.I width
+nor a
+.I height
+argument is specified,
+the image's natural width
+(as given in the file's bounding box)
+or the current line length is used as the width,
+whatever is smaller.
+.
+The
+.I width
+and
+.I height
+arguments may have scaling units attached;
+the default scaling unit
+.RB is\~ i .
+.
+.B PSPIC
+scales the graphic uniformly in the horizontal and vertical directions
+so that it is no more than
+.I width
+wide
+and
+.I height
+high.
+.
+Option
+.B \-C
+centers the graphic horizontally;
+this is the default.
+.
+.B \-L
+and
+.B \-R
+left- and right-align the graphic,
+respectively.
+.
+.B \-I
+indents the graphic
+.RI by\~ n
+(with a default scaling unit
+.RB of\~ m ).
+.
+.
+.IP
+To use
+.B PSPIC
+within a diversion,
+we recommend extending it with the following code,
+assuring that the diversion's width completely covers the image's width.
+.
+.
+.RS
+.IP
+.EX
+\&.am PSPIC
+\&.\~\~vpt 0
+\&\[rs]h\[aq](\[rs]\[rs]n[ps\-offset]u + \[rs]\[rs]n[ps\-deswid]u)\[aq]
+\&.\~\~sp \-1
+\&.\~\~vpt 1
+\&..
+.EE
+.RE
+.
+.
+.IP
+Failure to load
+.BR PSPIC 's
+image argument is not an error.
+.
+(The
+.B psbb
+request does issue an error diagnostic.)
+.
+To make such a failure fatal,
+append to the
+.B pspic*error\-hook
+macro.
+.
+.
+.RS
+.IP
+.EX
+\&.am pspic*error\-hook
+\&.\~\~ab
+\&..
+.EE
+.RE
+.
+.
+.TP
+.I ptx
+provides a macro,
+.BR xx ,
+to format permuted index entries as produced by the GNU
+.MR ptx 1
+program.
+.
+If your formatting needs differ,
+copy the macro into your document and adapt it to your needs.
+.
+.
+.TP
+.I rfc1345
+defines special character escape sequences named for the glyph mnemonics
+specified in RFC\~1345 and the digraph table of the Vim text editor.
+.
+See
+.MR groff_rfc1345 @MAN7EXT@ .
+.
+.
+.TP
+.I sboxes
+offers an interface to the
+.RB \[lq] "pdf: background" \[rq]
+device control command supported by
+.MR gropdf @MAN1EXT@ .
+.
+Using this package,
+.I groff ms
+documents can draw colored rectangles beneath any output.
+.
+.RS
+.TP
+.BI \%.BOXSTART\~SHADED\~ color\~\c
+.BI \%OUTLINED\~ color\~\c
+.BI \%INDENT\~ size\~\c
+.BI \%WEIGHT\~ size
+begins a box,
+where the argument after
+.B \%SHADED
+gives the fill color and that after
+.B \%OUTLINED
+the border color.
+.
+Omit the former to get a borderless filled box and the latter for a
+border with no fill.
+.
+The specified
+.B \%WEIGHT
+is used if the box is
+.BR \%OUTLINED .
+.
+.
+.IP
+.B \%INDENT
+precedes a value which leaves a gap between the border and the contents
+inside the box.
+.
+.
+.IP
+Each
+.I color
+must be a defined
+.I groff
+color name,
+and each
+.I size
+a valid
+.I groff
+numeric expression.
+.
+The keyword/value pairs can be specified in any order.
+.RE
+.
+.
+.IP
+Boxes can be stacked,
+so you can start a box within another box;
+usually the later boxes would be smaller than the containing box,
+but this is not enforced.
+.
+When using
+.BR \%BOXSTART ,
+the left position is the current indent minus the
+.B \%INDENT
+in the command,
+and the right position is the left position
+(calculated above)
+plus the current line length and twice the indent.
+.
+.
+.RS
+.TP
+.B \%.BOXSTOP
+takes no parameters.
+.
+It closes the most recently started box at the current vertical position
+after adding its
+.B \%INDENT
+spacing.
+.RE
+.
+.
+.IP
+Your
+.I groff
+documents can conditionally exercise the
+.I sboxes
+macros.
+.
+The register
+.B \%GSBOX
+is defined if the package is loaded,
+and interpolates a true value if the
+.B pdf
+output device is in use.
+.
+.
+.IP
+.I sboxes
+furthermore hooks into the
+.MR groff_ms @MAN7EXT@
+package to receive notifications when footnotes are growing,
+so that it can close boxes on a page before footnotes are printed.
+.
+When that condition obtains,
+.I sboxes
+will close open boxes two points
+above the footnote separator and re-open them on the next page.
+.
+(This amount probably will not match the box's
+.BR \%INDENT .)
+.
+.
+.IP
+See
+.UR file://@DOCDIR@/\:\%msboxes\:.pdf
+\[lq]Using PDF boxes with
+.I groff
+and the
+.I ms
+macros\[rq]
+.UE
+for a demonstration.
+.
+.
+.TP
+.I trace
+aids the debugging of
+.I groff
+documents by tracing macro calls.
+.
+See
+.MR groff_trace @MAN7EXT@ .
+.
+.
+.TP
+.I www
+defines macros corresponding to HTML elements.
+.
+See
+.MR groff_www @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SH Naming
+.\" ====================================================================
+.
+AT&T
+.I nroff \" AT&T
+and
+.I troff \" AT&T
+were implemented before the conventions of the modern C
+.MR getopt 3
+call evolved,
+and used a naming scheme for macro packages that looks odd to modern
+eyes.
+.
+Macro packages were typically loaded using the
+.B \-m
+option to the formatter;
+when directly followed by its argument without an intervening space,
+this looked like a long option preceded by a single minus\[em]a
+sensation in the computer stone age.
+.
+Macro packages therefore came to be known by names that started with the
+letter \[lq]m\[rq],
+which was omitted from the name of the macro file as stored on disk.
+.
+For example,
+the manuscript macro package was stored as
+.I tmac.s
+and loaded with the option
+.BR \-ms .
+.
+.
+.P
+.I groff
+commands permit space between an option and its argument.
+.
+The syntax
+.RB \[lq] "groff \-m s" \[rq]
+makes the macro file name more clear but may surprise users familiar
+with the original convention,
+unaware that the package's \[lq]real\[rq] name was \[lq]s\[rq] all
+along.
+.
+For such packages of long pedigree,
+.I groff
+accommodates different users' expectations by supplying wrapper macro
+files that load the desired file with
+.B mso
+requests.
+.
+Thus,
+all of
+.RB \[lq] "groff \-m s" \[rq],
+.RB \[lq] "groff \-m ms" \[rq],
+.RB \[lq] "groff \-ms" \[rq],
+and
+.RB \[lq] "groff \-mms" \[rq]
+serve to load the manuscript macros.
+.
+.
+.P
+Wrappers are not provided for packages of more recent vintage,
+like
+.IR www.tmac .
+.
+.
+.P
+As noted in passing above,
+AT&T
+.I troff \" AT&T
+named macro files in the form
+.IR tmac. name.
+.
+It has since become conventional in operating systems to use a suffixed
+file name extension to suggest a file type or format.
+.
+.
+.\" ====================================================================
+.SH Inclusion
+.\" ====================================================================
+.
+The traditional method of employing a macro package is to specify the
+.B \-m
+.I package
+option to the formatter,
+which then reads
+.IR package 's
+macro file prior to any input files.
+.
+Historically,
+.I package
+was sought in a file named
+.IR tmac. package
+(that is,
+with a
+.RB \[lq] tmac.\& \[rq]
+prefix).
+.
+GNU
+.I troff \" GNU
+searches for
+.RI package .tmac
+in the macro path;
+if not found,
+it looks for
+.IR tmac. package
+instead,
+and vice versa.
+.
+.
+.P
+Alternatively,
+one could include a macro file by using the request
+.RB \[lq] .so
+.IR file-name \[rq]
+in the document;
+.I file-name
+is resolved relative to the location of the input document.
+.
+GNU
+.I troff \" GNU
+offers an improved feature in the similar request
+.RB \[lq] mso
+.IR package-file-name \[rq],
+which searches the macro path for
+.IR package-file-name .
+.
+Because its argument is a file name,
+its
+.RB \[lq] .tmac \[rq]
+component must be included for the file to be found;
+however,
+as a convenience,
+if opening it fails,
+.B mso
+strips any such suffix and tries again with a
+.RB \[lq] tmac.\& \[rq]
+prefix,
+and vice versa.
+.
+.
+.P
+If a sourced file requires preprocessing,
+for example if it includes
+.I tbl \" generic
+tables
+or
+.I eqn \" generic
+equations,
+the preprocessor
+.MR @g@soelim @MAN1EXT@
+must be used.
+.
+This can be achieved with a pipeline or,
+in
+.IR groff ,
+by specifying
+the
+.B \-s
+option to the formatter
+(or front end).
+.
+.MR man 1
+librarian programs generally call
+.I @g@soelim
+automatically.
+.
+(Macro packages themselves generally do not require preprocessing.)
+.
+.
+.ig
+.\" ====================================================================
+.SH Convention
+.\" ====================================================================
+.
+.\" This section does not fit into the framework of this document.
+.
+There is a convention that is supported by many modern roff
+typesetters and
+.MR man 1
+programs, the
+.I preprocessor word
+described in the following.
+.
+.P
+If the first line in a document is a comment, the first word (after the
+comment characters and a blank) constitutes the
+.B preprocessor
+.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,
+\[oq]e\[cq]
+(for
+.IR eqn ),
+.\" \[oq]G\[cq],
+.\" \[oq]g\[cq],
+\[oq]p\[cq]
+(for
+.IR pic ),
+\[oq]R\[cq]
+(for
+.IR refer ),
+\[oq]s\[cq]
+(for
+.IR soelim ),
+and
+\[oq]t\[cq]
+(for
+.IR tbl ).
+(see
+.MR roff @MAN7EXT@ ).
+.
+.
+.P
+Besides being a good reminder for the user, some formatters (like the
+.MR man 1
+program) are even able to automatically start the preprocessors
+specified in the preprocessor word, but do not bet on this.
+.
+.
+.P
+The
+.I man
+program handles some preprocessors automatically, such that in
+man\~pages only the following characters should be used:
+\[oq]e\[cq], \[oq]p\[cq], and \[oq]t\[cq].
+.
+.
+..
+.\" ====================================================================
+.SH "Writing macros"
+.\" ====================================================================
+.
+A
+.MR roff @MAN7EXT@
+document is a text file that is enriched by predefined formatting
+constructs, such as requests, escape sequences, strings, numeric
+registers, and macros from a macro package.
+.
+These elements are described in
+.MR roff @MAN7EXT@ .
+.
+.
+.P
+To give a document a personal style, it is most useful to extend the
+existing elements by defining some macros for repeating tasks; the best
+place for this is near the beginning of the document or in a separate
+file.
+.
+.
+.P
+Macros without arguments are just like strings.
+.
+But the full power of macros occurs when arguments are passed with a
+macro call.
+.
+Within the macro definition, the arguments are available as the escape
+sequences
+.BR \[rs]$1 ,
+\&.\|.\|.,
+.BR \[rs]$9 ,
+.BR \[rs]$[ .\|.\|. ] ,
+.BR \[rs]$* ,
+and
+.BR \[rs]$@ ,
+the name under which the macro was called is in
+.BR \[rs]$0 ,
+and the number of arguments is in register
+.BR \[rs]n[.$] ;
+see
+.MR groff @MAN7EXT@ .
+.
+.
+.\" ====================================================================
+.SS "Draft mode"
+.\" ====================================================================
+.
+Writing groff macros is easy when the escaping mechanism is temporarily
+disabled.
+.
+In groff, this is done by enclosing the macro definition(s) within a
+pair of
+.B .eo
+and
+.B .ec
+requests.
+.
+Then the body in the macro definition is just like a normal part of
+the document \[em] text enhanced by calls of requests, macros,
+strings, registers, etc.
+.
+For example, the code above can be written in a simpler way by
+.
+.
+.IP
+.ds @1 \[rs]f[I]\[rs]$0\[rs]f[]\"
+.ds @2 arguments:\"
+.EX
+\&.eo
+\&.ds midpart was called with the following
+\&.de print_args
+\&\*[@1]\ \[rs]*[midpart]\ \[rs]n[.$]\ \*[@2]
+\&\[rs]$*
+\&..
+\&.ec
+.EE
+.rm @1
+.rm @2
+.
+.
+.P
+Unfortunately, draft mode cannot be used universally.
+.
+Although it is good enough for defining normal macros, draft mode
+fails with advanced applications, such as indirectly defined
+strings, registers, etc.
+.
+An optimal way is to define and test all macros in draft mode and then
+do the backslash doubling as a final step; do not forget to remove the
+.I .eo
+request.
+.
+.
+.\" ====================================================================
+.SS "Tips for macro definitions"
+.\" ====================================================================
+.
+.IP \(bu
+Start every line with a dot, for example, by using the groff request
+.B .nop
+for text lines, or write your own macro that handles also text lines
+with a leading dot.
+.
+.RS
+.IP
+.EX
+\&.de Text
+\&.\ \ if (\[rs]\[rs]n[.$] == 0)\ \[rs]
+\&.\ \ \ \ return
+\&.\ \ nop\ \[rs])\[rs]\[rs]$*\[rs])
+\&..
+.EE
+.RE
+.
+.IP \(bu
+Write a comment macro that works both for copy and draft modes;
+since the escape character is off in draft mode,
+trouble might occur when comment escape sequences are used.
+.
+For example, the following macro just ignores its arguments, so it
+acts like a comment line:
+.
+.RS
+.IP
+.EX
+\&.de\ c
+\&..
+\&.c\ This\ is\ like\ a\ comment\ line.
+.EE
+.RE
+.
+.IP \(bu
+In long macro definitions, make ample use of comment lines or
+almost-empty lines (this is, lines which have a leading dot
+and nothing else) for a better structuring.
+.
+.IP \(bu
+To increase readability, use groff's indentation facility for
+requests and macro calls (arbitrary whitespace after the leading dot).
+.
+.
+.\" ====================================================================
+.SS Diversions
+.\" ====================================================================
+.
+Diversions can be used to implement quite advanced programming
+constructs.
+.
+They are comparable to pointers to large data structures in the
+C\~programming language, but their usage is quite different.
+.
+.
+.P
+In their simplest form, diversions are multi-line strings, but
+diversions get their power when used dynamically within macros.
+.
+The (formatted) information stored in a diversion can be retrieved by
+calling the diversion just like a macro.
+.
+.
+.P
+Most of the problems arising with diversions can be avoided if you
+remember that diversions always store complete lines.
+.
+Using diversions when the line buffer has not been flushed produces
+strange results; not knowing this, many people get desperate about
+diversions.
+.
+To ensure that a diversion works, add line breaks at the right
+places.
+.
+To be safe, enclose everything that has to do with diversions within
+a pair of line breaks; for example, by explicitly using
+.B .br
+requests.
+.
+This rule should be applied to diversion definition, both inside and
+outside, and to all calls of diversions.
+.
+This is a bit of overkill, but it works nicely.
+.
+.
+.P
+(If you really need diversions which should ignore the current partial
+line, use environments to save the current partial line and/\:or use the
+.B .box
+request.)
+.
+.
+.P
+The most powerful feature using diversions is to start a diversion
+within a macro definition and end it within another macro.
+.
+Then everything between each call of this macro pair is stored within
+the diversion and can be manipulated from within the macros.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME ,
+.MT wl@\:gnu\:.org
+Werner Lemberg
+.ME ,
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+.IR "Groff: The GNU Implementation of troff" ,
+by Trent A.\& Fisher and Werner Lemberg,
+is the primary
+.I groff
+manual.
+.
+You can browse it interactively with \[lq]info groff\[rq].
+.
+.
+.LP
+The
+.UR https://\:wiki\:.linuxfoundation\:.org/\:lsb/\:fhs
+Filesystem Hierarchy Standard
+.UE
+is maintained by the Linux Foundation.
+.
+.
+.TP
+.MR groff @MAN1EXT@
+is an overview of the
+.I groff
+system.
+.
+.
+.TP
+.MR groff_man @MAN7EXT@ ,
+.TQ
+.MR groff_mdoc @MAN7EXT@ ,
+.TQ
+.MR groff_me @MAN7EXT@ ,
+.TQ
+.MR groff_mm @MAN7EXT@ ,
+.TQ
+.MR groff_mom @MAN7EXT@ ,
+.TQ
+.MR groff_ms @MAN7EXT@ ,
+.TQ
+.MR groff_rfc1345 @MAN7EXT@ ,
+.TQ
+.MR groff_trace @MAN7EXT@ ,
+\~and
+.TQ
+.MR groff_www @MAN7EXT@
+are
+.I groff
+macro packages.
+.
+.
+.TP
+.MR groff @MAN7EXT@
+summarizes the language recognized by GNU
+.IR troff . \" GNU
+.
+.
+.TP
+.MR troff @MAN1EXT@
+documents the default macro file search path.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_groff_tmac_5_man_C]
+.do rr *groff_groff_tmac_5_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72:
diff --git a/man/man.am b/man/man.am
new file mode 100644
index 0000000..f37e906
--- /dev/null
+++ b/man/man.am
@@ -0,0 +1,46 @@
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
+#
+# 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 3 of the License, or
+# (at your option) any later version.
+#
+# 'groff' is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+man5_MANS += \
+ man/groff_font.5 \
+ man/groff_out.5 \
+ man/groff_tmac.5
+man7_MANS += \
+ man/groff_char.7 \
+ man/groff_diff.7 \
+ man/groff.7 \
+ man/roff.7
+EXTRA_DIST += \
+ man/groff_font.5.man \
+ man/groff_out.5.man \
+ man/groff_tmac.5.man \
+ man/groff_char.7.man \
+ man/groff_diff.7.man \
+ man/groff.7.man \
+ man/roff.7.man
+
+# Case of out-of-source build: we must create the 'man' directory.
+BUILT_SOURCES += man
+man:
+ $(MKDIR_P) $(top_builddir)/man
+
+
+# Local Variables:
+# mode: makefile-automake
+# fill-column: 72
+# End:
+# vim: set autoindent filetype=automake textwidth=72:
diff --git a/man/roff.7.man b/man/roff.7.man
new file mode 100644
index 0000000..2468a4b
--- /dev/null
+++ b/man/roff.7.man
@@ -0,0 +1,2613 @@
+'\" t
+.TH roff @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+roff \- concepts and history of
+.I roff
+typesetting
+.
+.
+.\" TODO: Synchronize this material with introductory section(s) of our
+.\" Texinfo manual, and then keep it that way.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2000-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, with no Front-Cover Texts,
+.\" and with no Back-Cover Texts.
+.\"
+.\" A copy of the Free Documentation License is included as a file
+.\" called FDL in the main directory of the groff source package.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_roff_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The term
+.I roff
+denotes a family of document formatting systems known by names like
+.IR troff ,
+.IR nroff ,
+and
+.IR ditroff .
+.
+A
+.I roff
+system consists of an interpreter for an extensible text formatting
+language and a set of programs for preparing output for various devices
+and file formats.
+.
+Unix-like operating systems often distribute a
+.I roff
+system.
+.
+The manual pages on Unix systems
+(\[lq]man\~pages\[rq])
+and bestselling books on software engineering,
+including Brian Kernighan and Dennis Ritchie's
+.I The C Programming Language
+and W.\& Richard Stevens's
+.I Advanced Programming in the Unix Environment
+have been written using
+.I roff
+systems.
+.
+GNU
+.IR roff \[em] groff \[em]is
+arguably the most widespread
+.I roff
+implementation.
+.
+.
+.P
+Below we present
+typographical concepts that form the background of all
+.I roff
+implementations,
+narrate the development history of some
+.I roff
+systems,
+detail the command pipeline managed by
+.MR groff @MAN1EXT@ ,
+survey the formatting language,
+suggest tips for editing
+.I roff
+input,
+and recommend further reading materials.
+.
+.
+.\" ====================================================================
+.SH Concepts
+.\" ====================================================================
+.
+.\" BEGIN Keep roughly parallel with groff.texi nodes "Text" through
+.\" "Tab Stops".
+.I roff
+input files contain text interspersed with instructions to control the
+formatter.
+.
+Even in the absence of such instructions,
+a
+.I roff
+formatter still processes its input in several ways,
+by filling,
+hyphenating,
+breaking,
+and adjusting it,
+and supplementing it with inter-sentence space.
+.
+These processes are basic to typesetting,
+and can be controlled at the input document's discretion.
+.
+.
+.P
+When a device-independent
+.I roff
+formatter starts up,
+it obtains information about the device for which it is preparing
+output from the latter's description file
+(see
+.MR groff_font @MAN5EXT@ ).
+.
+An essential property is the length of the output line,
+such as \[lq]6.5 inches\[rq].
+.
+.
+.P
+The formatter interprets plain text files employing the Unix line-ending
+convention.
+.
+It reads input a character at a time,
+collecting words as it goes,
+and fits as many words together on an output line as it can\[em]this
+is known as
+.I filling.
+.
+To a
+.I roff
+system,
+a
+.I word
+is any sequence of one or more characters that aren't spaces or
+newlines.
+.
+The exceptions separate words.
+.
+.
+.P
+A
+.I roff
+formatter attempts to detect boundaries between sentences,
+and supplies additional inter-sentence space between them.
+.
+It flags certain characters
+(normally
+.RB \[lq] !\& \[rq],
+.RB \[lq] ?\& \[rq],
+and
+.RB \[lq] .\& \[rq])
+as potentially ending a sentence.
+.
+When the formatter encounters one of these
+.I end-of-sentence characters
+at the end of an input line,
+or one of them is followed by two (unescaped) spaces on the same input
+line,
+it appends an inter-word space
+followed by an inter-sentence space in the output.
+.
+The dummy character escape sequence
+.B \[rs]&
+can be used after an end-of-sentence character to defeat end-of-sentence
+detection on a per-instance basis.
+.
+Normally,
+the occurrence of a visible non-end-of-sentence character
+(as opposed to a space or tab)
+immediately after an end-of-sentence
+character cancels detection of the end of a sentence.
+.
+However,
+several characters are treated
+.I transparently
+after the occurrence of an end-of-sentence character.
+.
+That is,
+a
+.I roff
+does not cancel end-of-sentence detection when it processes them.
+.
+This is because such characters are often used as footnote markers or to
+close quotations and parentheticals.
+.
+The default set is
+.BR \[dq] ,
+.BR \[aq] ,
+.BR ) ,
+.BR ] ,
+.BR * ,
+.BR \[rs][dg] ,
+.BR \[rs][dd] ,
+.BR \[rs][rq] ,
+and
+.BR \[rs][cq] .
+.
+The last four are examples of
+.I special characters,
+escape sequences whose purpose is to obtain glyphs that are not easily
+typed at the keyboard,
+or which have special meaning to the formatter
+(like
+.BR \[rs] ).
+.\" slack wording: itself).
+.
+.
+.P
+When an output line is nearly full,
+it is uncommon for the next word collected from the input to exactly
+fill it\[em]typically,
+there is room left over only for part of the next word.
+.
+The process of splitting a word so that it appears partially on one line
+(with a hyphen to indicate to the reader that the word has been broken)
+with its remainder on the next is
+.I hyphenation.
+.
+Hyphenation points can be manually specified;
+.I groff
+also uses a hyphenation algorithm and language-specific pattern files to
+decide which words can be hyphenated and where.
+.
+Hyphenation does not always occur even when the hyphenation rules for a
+word allow it;
+it can be disabled,
+and when not disabled there are several parameters that can prevent it
+in certain circumstances.
+.
+.
+.P
+Once an output line is full,
+the next word
+(or remainder of a hyphenated one)
+is placed on a different output line;
+this is called a
+.I break.
+.
+In this document and in
+.I roff
+discussions generally,
+a \[lq]break\[rq] if not further qualified always refers to the
+termination of an output line.
+.
+When the formatter is filling text,
+it introduces breaks automatically to keep output lines from exceeding
+the configured line length.
+.
+After an automatic break,
+a
+.I roff
+formatter
+.I adjusts
+the line if applicable
+(see below),
+and then resumes collecting and filling text on the next output line.
+.
+.
+.br
+.ne 2v
+.P
+Sometimes,
+a line cannot be broken automatically.
+.
+This usually does not happen with natural language text unless the
+output line length has been manipulated to be extremely short,
+but it can with specialized text like program source code.
+.
+.I groff
+provides a means of telling the formatter where the line may be broken
+without hyphens.
+.
+This is done with the non-printing break point escape sequence
+.BR \[rs]: .
+.
+.
+.P
+.\" What if the document author wants to stop filling lines temporarily,
+.\" for instance to start a new paragraph? There are several solutions.
+There are several ways to cause a break at a predictable location.
+.
+A blank input line not only causes a break,
+but by default it also outputs a one-line vertical space
+(effectively a blank output line).
+.
+Macro packages may discourage or disable this \[lq]blank line
+method\[rq] of paragraphing in favor of their own macros.
+.
+A line that begins with one or more spaces causes a break.
+.
+The spaces are output at the beginning of the next line without being
+.I adjusted
+(see below).
+.
+Again,
+macro packages may provide other methods of producing indented
+paragraphs.
+.
+Trailing spaces on
+.I text lines
+(see below)
+are discarded.
+.
+The end of input causes a break.
+.
+.
+.P
+After the formatter performs an automatic break,
+it may then
+.I adjust
+the line,
+widening inter-word spaces until the text reaches the right margin.
+.
+Extra spaces between words are preserved.
+.
+Leading and trailing spaces are handled as noted above.
+.
+Text can be aligned to the left or right margin only,
+or centered,
+using
+.I requests.
+.
+.
+.P
+A
+.I roff
+formatter translates horizontal tab characters,
+also called simply \[lq]tabs\[rq],
+in the input into movements to the next tab stop.
+.
+These tab stops are by default located every half inch measured from the
+current position on the input line.
+.
+With them,
+simple tables can be made.
+.
+However,
+this method can be deceptive,
+as the appearance
+(and width)
+of the text in an editor and the results from the formatter can vary
+greatly,
+particularly when proportional typefaces are used.
+.
+A tab character does not cause a break and therefore does not interrupt
+filling.
+.
+The formatter provides facilities for sophisticated table composition;
+there are many details to track
+when using the \[lq]tab\[rq] and \[lq]field\[rq] low-level features,
+so most users turn to the
+.MR @g@tbl @MAN1EXT@
+preprocessor to lay out tables.
+.\" END Keep roughly parallel with groff.texi nodes "Text" through "Tab
+.\" Stops".
+.
+.
+.\" ====================================================================
+.SS "Requests and macros"
+.\" ====================================================================
+.
+.\" BEGIN Keep roughly parallel with groff.texi node "Requests and
+.\" Macros".
+.\" We have now encountered almost all of the syntax there is in the
+.\" @code{roff} language, with an exception already noted in passing.
+A
+.I request
+is an instruction to the formatter that occurs after a
+.I control character,
+which is recognized at the beginning of an input line.
+.
+The regular control character is a dot
+.RB \[lq] .\& \[rq].
+.
+Its counterpart,
+the
+.I no-break control character,
+a neutral apostrophe
+.RB \[lq] \|\[aq]\| \[rq],
+suppresses the break
+.\" slack wording: that is
+implied by some requests.
+.
+These characters were chosen because it is uncommon for lines of text in
+natural languages to begin with them.
+.
+If you require a formatted period or apostrophe
+(closing single quotation mark)
+where
+.\" GNU @code{troff}
+the formatter is expecting a control character,
+prefix the dot or neutral apostrophe with the dummy character escape
+sequence,
+.RB \[lq] \[rs]& \[rq].
+.
+.
+.P
+An input line beginning with a control character is called a
+.I control line.
+.
+Every line of input that is not a control line is a
+.I text line.
+.
+.
+.P
+Requests often take
+.I arguments,
+words
+(separated from the request name and each other by spaces)
+that specify details of the action
+.\" GNU @code{troff}
+the formatter is expected to perform.
+.
+If a request is meaningless without arguments,
+it is typically ignored.
+.
+.\" TODO: roff(7): We haven't introduced escape sequences yet.
+.\" GNU @code{troff}'s requests and escape sequences comprise the
+.\" control language of the formatter.
+.
+Of key importance are the requests that define macros.
+.
+Macros are invoked like requests,
+enabling the request repertoire to be extended or overridden.
+.\" @footnote{Argument handling in macros is more flexible but also more
+.\" complex. @xref{Calling Macros}.}
+.
+.
+.P
+A
+.I macro
+can be thought of as an abbreviation you can define for a
+collection of control and text lines.
+.
+When the macro is
+.I called
+by giving its name after a control character,
+it is replaced with what it stands for.
+.
+The process of textual replacement is known as
+.I interpolation.
+.\" @footnote{Some escape sequences undergo interpolation as well.}
+Interpolations are handled as soon as they are recognized,
+and once performed,
+a
+.I roff
+formatter scans the replacement for further requests,
+macro calls,
+and escape sequences.
+.
+.
+.P
+In
+.I roff
+systems,
+the
+.RB \[lq] de \[rq]
+request defines a macro.
+.\" @footnote{GNU @code{troff} offers additional ones. @xref{Writing
+.\" Macros}.}
+.\" END Keep roughly parallel with groff.texi node "Requests and
+.\" Macros".
+.
+.
+.\" ====================================================================
+.SS "Page geometry"
+.\" ====================================================================
+.
+.\" BEGIN Keep parallel with groff.texi node "Page Geometry".
+.I roff
+systems format text under certain assumptions about the size of the
+output medium,
+or page.
+.
+For the formatter to correctly break a line it is filling,
+it must know the line length,
+which it derives from the page width.
+.\" (@pxref{Line Layout}).
+.
+For it to decide whether to write an output line to the current page or
+wait until the next one,
+it must know the page length.
+.\" (@pxref{Page Layout}).
+.
+.
+A device's
+.I resolution
+converts practical units like inches or centimeters to
+.I basic units,
+a convenient length measure for the output device or file format.
+.
+The formatter and output driver use basic units to reckon page
+measurements.
+.
+The device description file defines its resolution and page dimensions
+(see
+.MR groff_font @MAN5EXT@ ).
+.\" (@pxref{DESC File Format}).
+.
+.
+.P
+A
+.I page
+is a two-dimensional structure upon which a
+.I roff
+system imposes a rectangular coordinate system with its upper left
+corner as the origin.
+.
+Coordinate values are in basic units and increase down and to the right.
+Useful ones are therefore always positive and within numeric ranges
+corresponding to the page boundaries.
+.
+.
+.P
+While the formatter
+(and,
+later,
+output driver)
+is processing a page,
+it keeps track of its
+.I drawing position,
+which is the location at which the next glyph will be written,
+from which the next motion will be measured,
+or where a geometric object will commence rendering.
+.
+Notionally,
+glyphs are drawn from the text baseline upward and to the right.
+.RI ( groff
+does not yet support right-to-left scripts.)
+.
+The
+.I text baseline
+is a
+(usually invisible)
+line upon which the glyphs of a typeface are aligned.
+.
+A glyph therefore \[lq]starts\[rq] at its bottom-left corner.
+.
+If drawn at the origin,
+a typical letter glyph would lie partially or wholly off the page,
+depending on whether,
+like \[lq]g\[rq],
+it features a descender below the baseline.
+.
+.
+.P
+Such a situation is nearly always undesirable.
+.
+It is furthermore conventional not to write or draw at the extreme edges
+of the page.
+.
+Therefore the initial drawing position of a
+.I roff
+formatter is not at the origin,
+but below and to the right of it.
+.
+This rightward shift
+from the left edge is known as the
+.I page offset.
+.
+.RI ( groff 's
+terminal output devices have page offsets of zero.)
+.
+The downward shift leaves room for a text output line.
+.
+.
+.P
+Text is arranged on a one-dimensional lattice of text baselines from
+the top to the bottom of the page.
+.
+.I Vertical spacing
+is the distance between adjacent text baselines.
+.
+Typographic tradition sets this quantity to 120% of the type size.
+.
+The initial vertical drawing position is one unit of vertical spacing
+below the page top.
+.
+Typographers term this unit a
+.I vee.
+.
+.
+.P
+Vertical spacing has an impact on page-breaking decisions.
+.
+Generally,
+when a break occurs,
+the formatter moves the drawing position to the next text baseline
+automatically.
+.
+If the formatter were already writing to the last line that would fit on
+the page,
+advancing by one vee would place the next text baseline off the page.
+.
+Rather than let that happen,
+.I roff
+formatters instruct the output driver to eject the page,
+start a new one,
+and again set the drawing position to one vee below the page top;
+this is a
+.I page break.
+.
+.
+.P
+When the last line of input text corresponds to the last output line
+that fits on the page,
+the break caused by the end of input will also break the page,
+producing a useless blank one.
+.
+Macro packages keep users from having
+to confront this difficulty by setting \[lq]traps\[rq];
+.\" (@pxref{Traps});
+moreover,
+all but the simplest page layouts tend to have headers and footers,
+or at least bear vertical margins larger than one vee.
+.\" END Keep parallel with groff.texi node "Page Geometry".
+.
+.
+.\" ====================================================================
+.SS "Other language elements"
+.\" ====================================================================
+.
+.I Escape sequences
+start with the
+.I escape character,
+a backslash
+.BR \[rs] ,
+and are followed by at least one additional character.
+.
+They can appear anywhere in the input.
+.
+.
+.P
+With requests,
+the escape and control characters can be changed;
+further,
+escape sequence recognition can be turned off and back on.
+.
+.
+.P
+.I Strings
+store character sequences.
+.
+In
+.IR groff ,
+they can be parameterized as macros can.
+.
+.
+.P
+.I Registers
+store numerical values,
+including measurements.
+.
+The latter are generally in basic units;
+.I scaling units
+can be appended to numeric expressions to clarify their meaning when
+stored or interpolated.
+.
+Some read-only predefined registers interpolate text.
+.
+.
+.P
+.I Fonts
+are identified either by a name or by a mounting position
+(a non-negative number).
+.
+Four styles are available on all devices.
+.
+.B R
+is \[lq]roman\[rq]:
+normal,
+upright text.
+.
+.B B
+is
+.BR bold ,
+an upright typeface with a heavier weight.
+.
+.B I
+is
+.IR italic ,
+a face that is oblique on typesetter output devices and usually
+underlined instead on terminal devices.
+.
+.B BI
+is \f[BI]bold-italic\f[]\/, \" indulging a bit of man(7) evil here
+combining both of the foregoing style variations.
+.
+Typesetting devices group these four styles into
+.I families
+of text fonts;
+they also typically offer one or more
+.I special
+fonts that provide unstyled glyphs;
+see
+.MR groff_char @MAN7EXT@ .
+.
+.
+.P
+.I groff
+supports named
+.I colors
+for glyph rendering and drawing of geometric objects.
+.
+Stroke and fill colors are distinct;
+the stroke color is used for glyphs.
+.
+.
+.P
+.I Glyphs
+are visual representation forms of
+.I characters.
+.
+In
+.I groff,
+the distinction between those two elements is not always obvious
+(and a full discussion is beyond our scope).
+.
+In brief,
+\[lq]A\[rq] is a character when we consider it in the abstract:
+to make it a glyph,
+we must select a typeface with which to render it,
+and determine its type size and color.
+.
+The formatting process turns input characters into output glyphs.
+.
+A few characters commonly seen on keyboards are treated
+specially by the
+.I roff
+language and may not look correct in output if used unthinkingly;
+they are
+the (double) quotation mark
+.RB ( \|\[dq]\| ),
+the neutral apostrophe
+.RB ( \|\[aq]\| ),
+the minus sign
+.RB ( \- ),
+the backslash
+.RB ( \|\[rs]\| ),
+the caret or circumflex accent
+.RB ( \[ha] ),
+the grave accent
+.RB ( \|\[ga]\| ),
+and the tilde
+.RB ( \[ti] ).
+.
+All of these and more can be produced with
+.I special character
+escape sequences;
+see
+.MR groff_char @MAN7EXT@ .
+.
+.
+.P
+.I groff
+offers
+.IR streams ,
+identifiers for writable files,
+but for security reasons this feature is disabled by default.
+.
+.
+.\" BEGIN Keep roughly parallel with first paragraphs of groff.texi node
+.\" "Deferring Output".
+.P
+A further few language elements arise as page layouts become more
+sophisticated and demanding.
+.
+.I Environments
+collect formatting parameters like line length and typeface.
+.
+A
+.I diversion
+stores formatted output for later use.
+.
+A
+.I trap
+is a condition on the input or output,
+tested automatically by the formatter,
+that is associated with a macro,
+calling it when that condition is fulfilled.
+.
+.
+.P
+Footnote support often exercises all three of the foregoing features.
+.
+A simple implementation might work as follows.
+.
+A pair of macros is defined:
+one starts a footnote and the other ends it.
+.
+The author calls the first macro where a footnote marker is desired.
+.
+The macro establishes a diversion so that the footnote text is collected
+at the place in the body text where its corresponding marker appears.
+.
+An environment is created for the footnote so that it is set at a
+smaller typeface.
+.
+The footnote text is formatted in the diversion using that environment,
+but it does not yet appear in the output.
+.
+The document author calls the footnote end macro,
+which returns to the previous environment and ends the diversion.
+.
+Later,
+after much more body text in the document,
+a trap,
+set a small distance above the page bottom,
+is sprung.
+.
+The macro called by the trap draws a line across the page and emits the
+stored diversion.
+.
+Thus,
+the footnote is rendered.
+.\" END Keep roughly parallel with first paragraphs of groff.texi node
+.\" "Deferring Output".
+.
+.
+.\" ====================================================================
+.SH History
+.\" ====================================================================
+.
+Computer-driven document formatting dates back to the 1960s.
+.\" John Labovitz points out that Peter Samson's TJ-2 dates to 1963,
+.\" but since this is a *roff man page, we do not begin our story there.
+.\" https://johnlabovitz.com/publications/\
+.\" The-electric-typesetter--The-origins-of-computing-in-typography.pdf
+.
+The
+.I roff
+system is intimately connected with Unix,
+but its origins lie with the earlier operating systems CTSS,
+GECOS,
+and Multics.
+.
+.
+.\" ====================================================================
+.SS "The predecessor\[em]\f[I]RUNOFF\f[]"
+.\" ====================================================================
+.
+.IR roff 's
+ancestor
+.I RUNOFF
+was written in the MAD language by Jerry Saltzer
+to prepare his Ph.D.\& thesis on the Compatible Time Sharing System
+(CTSS),
+a project of the Massachusetts Institute of Technology (MIT).
+.
+This program is referred to in full capitals,
+both to distinguish it from its many descendants,
+and because bits were expensive in those days;
+five- and six-bit character encodings were still in widespread usage,
+and mixed-case alphabetics in file names seen as a luxury.
+.
+.I RUNOFF
+introduced a syntax of inlining formatting directives amid document
+text,
+by beginning a line with a period
+(an unlikely occurrence in human-readable material)
+followed by a \[lq]control word\[rq].
+.
+Control words with obvious meaning like \[lq].line length
+.IR n \[rq]
+were supported as well as an abbreviation system;
+the latter came to overwhelm the former in popular usage and later
+derivatives of the program.
+.
+A sample of control words from a
+.UR http://\:web\:.mit\:.edu/\:Saltzer/\:www/\:publications/\:ctss/\:AH\
+\:.9\:.01\:.html
+.I RUNOFF
+manual of December 1966
+.UE
+was documented as follows
+(with the parameter notation slightly altered).
+.
+The abbreviations will be familiar to
+.I roff
+veterans.
+.
+.
+.P
+.ne 10v
+.TS
+center;
+r l
+rB l.
+Abbreviation Control word
+\&.ad .adjust
+\&.bp .begin page
+\&.br .break
+\&.ce .center
+\&.in .indent \f[I]n\f[]
+\&.ll .line length \f[I]n\f[]
+\&.nf .nofill
+\&.pl .paper length \f[I]n\f[]
+\&.sp .space [\f[I]n\f[]]
+.TE
+.
+.
+.P
+In 1965,
+MIT's Project MAC teamed with Bell Telephone Laboratories and General
+Electric (GE) to inaugurate the
+.UR http://\:www\:.multicians\:.org
+Multics
+.UE
+project.
+.
+After a few years,
+Bell Labs discontinued its participation in Multics,
+famously prompting the development of Unix.
+.
+Meanwhile,
+Saltzer's
+.I RUNOFF
+proved influential,
+seeing many ports and derivations elsewhere.
+.
+.
+.\" "Morris did one port and called it roff. I did the BCPL one, adding
+.\" registers, but not macros. Molly Wagner contributed a hyphenation
+.\" algorithm. Ken and/or Dennis redid roff in PDP-11 assembler. Joe
+.\" started afresh for the grander nroff, including macros. Then Joe
+.\" bought a phototypesetter ..."
+.\" -- https://minnie.tuhs.org/pipermail/tuhs/2018-November/017052.html
+.P
+In 1969,
+Doug McIlroy wrote one such reimplementation,
+adding extensions,
+in the BCPL language for a GE 645 running GECOS at the Bell Labs
+location in Murray Hill,
+New Jersey.
+.
+In its manual,
+the control commands were termed \[lq]requests\[rq],
+their two-letter names were canonical,
+and the control character was configurable with a
+.B .cc
+request.
+.
+Other familiar requests emerged at this time;
+no-adjust
+.RB ( .na ),
+need
+.RB ( .ne ),
+page offset
+.RB ( .po ),
+tab configuration
+.RB ( .ta ,
+though it worked differently),
+temporary indent
+.RB ( .ti ),
+character translation
+.RB ( .tr ),
+and automatic underlining
+.RB ( .ul ;
+on
+.I RUNOFF
+you had to backspace and underscore in the input yourself).
+.B .fi
+to enable filling of output lines got the name it retains to this day.
+.
+McIlroy's program also featured a heuristic system for automatically
+placing hyphenation points,
+designed and implemented by Molly Wagner.
+.
+It furthermore introduced numeric variables,
+termed registers.
+.
+By 1971,
+this program had been ported to Multics and was known as
+.IR roff ,
+a name McIlroy attributes to Bob Morris,
+to distinguish it from CTSS
+.IR RUNOFF .
+.
+.\" GBR can't find a source for this claim (of Bernd's).
+.\"Multics
+.\".I runoff
+.\"added features such as the ability to do two-pass formatting;
+.\"it became the main system for Multics documentation and text
+.\"processing.
+.
+.
+.\" ====================================================================
+.SS "Unix and \f[I]roff\f[]"
+.\" ====================================================================
+.
+McIlroy's
+.I roff
+was one of the first Unix programs.
+.
+In Ritchie's term,
+it was \[lq]transliterated\[rq] from BCPL to DEC PDP-7 assembly language
+.\" see "The Evolution of the Unix Time-Sharing System", Ritchie, 1984
+for the fledgling Unix operating system.
+.
+Automatic hyphenation was managed with
+.B .hc
+and
+.B .hy
+requests,
+line spacing control was generalized with the
+.B .ls
+request,
+and what later
+.IR roff s
+would call diversions were available via \[lq]footnote\[rq] requests.
+.\" The foregoing features may have been in McIlroy's Multics roff, but
+.\" he no longer has documentation for that--only the GECOS version.
+.\" GBR's guess is that they were, if we take Ritchie's choice of the
+.\" term "transliterated" seriously. GBR further speculates that there
+.\" is no reason to suppose that McIlroy's roff was stagnant from
+.\" 1969-1971, whereas we have no record of any significant
+.\" post-transliteration development of Unix roff. Its request list did
+.\" not appear until the 3rd edition manual, and did not change
+.\" thereafter. In 7th edition, roff was characterized as "utterly
+.\" frozen".
+.
+This
+.I roff
+indirectly funded operating systems research at Murray Hill;
+AT&T prepared patent applications to the U.S.\& government with it.
+.
+This arrangement enabled the group to acquire a PDP-11;
+.I roff
+promptly proved equal to the task of formatting the manual for what
+would become known as \[lq]First Edition Unix\[rq],
+dated November 1971.
+.
+.
+.P
+Output from all of the foregoing programs was limited to line printers
+and paper terminals such as the IBM 2471
+(based on the Selectric line of typewriters)
+and the Teletype Corporation Model 37.
+.
+Proportionally spaced type was unavailable.
+.
+.
+.\" ====================================================================
+.SS "New \f[I]roff\f[] and Typesetter \f[I]roff\f[]"
+.\" ====================================================================
+.
+The first years of Unix were spent in rapid evolution.
+.
+The practicalities of preparing standardized documents like patent
+applications
+(and Unix manual pages),
+combined with McIlroy's enthusiasm for macro languages,
+perhaps created an irresistible pressure to make
+.I roff
+extensible.
+.
+Joe Ossanna's
+.IR nroff ,
+literally a \[lq]new roff\[rq],
+was the outlet for this pressure.
+.
+.\" nroff is listed in the table of contents of the Version 2 manual,
+.\" but no man page is present.
+By the time of Unix Version\~3
+(February 1973)\[em]and still in PDP-11 assembly language\[em]it sported
+a swath of features now considered essential to
+.I roff
+systems:
+.
+definition of macros
+.RB ( .de ),
+diversion of text thither
+.RB ( .di ),
+and removal thereof
+.RB ( .rm );
+.
+trap planting
+.RB ( .wh ;
+\[lq]when\[rq])
+and relocation
+.RB ( .ch ;
+\[lq]change\[rq]);
+.
+conditional processing
+.RB ( .if );
+.
+and environments
+.RB ( .ev ).
+.
+Incremental improvements included
+.
+assignment of the next page number
+.RB ( .pn );
+.
+no-space mode
+.RB ( .ns )
+and restoration of vertical spacing
+.RB ( .rs );
+.
+the saving
+.RB ( .sv )
+and output
+.RB ( .os )
+of vertical space;
+.
+specification of replacement characters for tabs
+.RB ( .tc )
+and leaders
+.RB ( .lc );
+.
+configuration of the no-break control character
+.RB ( .c2 );
+.
+shorthand to disable automatic hyphenation
+.RB ( .nh );
+.
+a condensation of what were formerly six different requests for
+configuration of page \[lq]titles\[rq]
+(headers and footers)
+into one
+.RB ( .tl )
+with a length controlled separately from the line length
+.RB ( .lt );
+.
+automatic line numbering
+.RB ( .nm );
+.
+interactive input
+.RB ( .rd ),
+which necessitated buffer-flushing
+.RB ( .fl ),
+and was made convenient with early program cessation
+.RB ( .ex );
+.
+source file inclusion in its modern form
+.RB ( .so ;
+though
+.I RUNOFF
+had an \[lq].append\[rq] control word for a similar purpose)
+and early advance to the next file argument
+.RB ( .nx );
+.
+ignorable content
+.RB ( .ig );
+.
+and programmable abort
+.RB ( .ab ).
+.
+.
+.P
+Third Edition Unix also brought the
+.MR pipe 2
+system call,
+the explosive growth of a componentized system based around it,
+and a \[lq]filter model\[rq] that remains perceptible today.
+.
+Equally importantly,
+the Bell Labs site in Murray Hill acquired a Graphic Systems C/A/T
+phototypesetter,
+and with it came the necessity of expanding the capabilities of a
+.I roff
+system to cope with a variety of proportionally spaced typefaces at
+multiple sizes.
+.
+Ossanna wrote a parallel implementation of
+.I nroff
+for the C/A/T,
+dubbing it
+.I troff
+(for \[lq]typesetter roff\[rq]).
+.
+Unfortunately,
+surviving documentation does not illustrate what requests were
+implemented at this time for C/A/T support;
+the
+.MR troff 1 \" AT&T
+man page in Fourth Edition Unix
+(November 1973)
+does not feature a request list, \" nor does Unix V6 troff(1) (1975)
+unlike
+.MR nroff 1 . \" AT&T
+.
+Apart from typesetter-driven features,
+Unix Version\~4
+.IR roff s
+added string definitions
+.RB ( .ds );
+made the escape character configurable
+.RB ( .ec );
+and enabled the user to write diagnostics to the standard error stream
+.RB ( .tm ).
+.
+Around 1974,
+empowered with multiple type sizes,
+italics,
+and a symbol font specially commissioned by Bell Labs from
+Graphic Systems,
+Kernighan and Lorinda Cherry implemented
+.I eqn \" AT&T
+for typesetting mathematics.
+.
+.
+In the same year,
+for Fifth Edition Unix,
+Ossanna combined and reimplemented the two
+.IR roff s
+in C,
+using that language's preprocessor to generate both from a single source
+tree.
+.
+.
+.P
+Ossanna documented the syntax of the input language to the
+.I nroff
+and
+.I troff
+programs in the \[lq]Troff User's Manual\[rq],
+first published in 1976,
+with further revisions as late as 1992 by Kernighan.
+.
+(The original version was entitled
+\[lq]Nroff/Troff User's Manual\[rq],
+which may partially explain why
+.I roff
+practitioners have tended to refer to it by its AT&T document
+identifier,
+\[lq]CSTR #54\[rq].)
+.
+Its final revision serves as the
+.I de facto
+specification of AT&T
+.IR troff , \" AT&T
+and all subsequent implementors of
+.I roff
+systems have done so in its shadow.
+.
+.
+.P
+A small and simple set of
+.I roff
+macros was first used for the manual pages of Unix Version\~4 and
+persisted for two further releases,
+but the first macro package to be formally described and installed was
+.I ms
+by Michael Lesk in Version\~6.
+.
+He also wrote a manual,
+\[lq]Typing Documents on the Unix System\[rq],
+describing
+.I ms
+and basic
+.IR nroff / troff
+usage,
+updating it as the package accrued features.
+.
+Sixth Edition additionally saw the debut of the
+.I tbl \" AT&T
+preprocessor for formatting tables,
+also by Lesk.
+.
+.
+.P
+For Unix Version\~7
+(January 1979),
+McIlroy designed,
+implemented,
+and documented the
+.I man
+macro package,
+introducing most of the macros described in
+.MR groff_man 7
+today,
+and edited volume 1 of the Version 7 manual using it.
+.
+Documents composed using
+.I ms
+featured in volume 2,
+edited by Kernighan.
+.
+.
+.\" Thanks to Clem Cole for the following account.
+.\" https://minnie.tuhs.org/pipermail/tuhs/2022-January/025143.html
+.P
+Meanwhile,
+.I troff
+proved popular even at Unix sites that lacked a C/A/T device.
+.
+Tom Ferrin of the University of California at San Francisco combined it
+with Allen Hershey's popular vector fonts to produce
+.IR vtroff ,
+which translated
+.IR troff 's
+output to the command language used by Versatec and Benson-Varian
+plotters.
+.
+.
+.P
+Ossanna had passed away unexpectedly in 1977,
+and after the release of Version 7,
+with the C/A/T typesetter becoming supplanted by alternative devices
+such as the Mergenthaler Linotron 202,
+Kernighan undertook a revision and rewrite of
+.I troff
+to generalize its design.
+.
+To implement this revised architecture,
+he developed the font and device description file formats and the
+page description language that remain in use today.
+.
+He described these novelties in the article
+\[lq]A Typesetter-independent TROFF\[rq],
+last revised in 1982,
+and like the
+.I troff
+manual itself,
+it is widely known by a shorthand,
+\[lq]CSTR #97\[rq].
+.\" Further entertaining reading can be found at:
+.\" <https://www.cs.princeton.edu/~bwk/202/summer.reconstructed.pdf>.
+.
+.
+.P
+Kernighan's innovations prepared
+.I troff
+well for the introduction of the Adobe PostScript language in 1982 and a
+vibrant market in laser printers with built-in interpreters for it.
+.
+An output driver for PostScript,
+.IR dpost ,
+was swiftly developed.
+.
+However,
+AT&T's software licensing practices kept
+Ossanna's
+.IR troff ,
+with its tight coupling to the C/A/T's capabilities,
+in parallel distribution with device-independent
+.I troff
+throughout the 1980s.
+.
+Today,
+however,
+all actively maintained
+.IR troff s
+follow Kernighan's device-independent design.
+.
+.
+.\" ====================================================================
+.SS "\f[I]groff\f[]\[em]a free \f[I]roff\f[] from GNU"
+.\" ====================================================================
+.
+The most important free
+.I roff
+project historically has been
+.IR groff ,
+the GNU implementation of
+.IR troff ,
+developed by James Clark starting in 1989 and distributed under
+.UR http://\:www\:.gnu\:.org/\:copyleft
+copyleft
+.UE
+licenses,
+ensuring to all the availability of source code and the freedom to
+modify and redistribute it,
+properties unprecedented in
+.I roff
+systems to that point.
+.
+.I groff
+rapidly attracted contributors,
+and has served as a replacement for almost all applications of AT&T
+.I troff
+(exceptions include
+.IR mv ,
+a macro package for preparation of viewgraphs and slides,
+and the
+.I ideal
+preprocessor,
+which produces diagrams from mathematical constraints).
+.
+Beyond that,
+it has added numerous features;
+see
+.MR groff_diff @MAN7EXT@ .
+.
+Since its inception and for at least the following three decades,
+it has been used by practically all GNU/Linux and BSD operating systems.
+.
+.
+.P
+.I groff
+continues to be developed,
+is available for almost all operating systems in common use
+(along with several obscure ones),
+and is free.
+.
+These factors make
+.I groff
+the
+.I de facto
+.I roff
+standard today.
+.
+.
+.\" ====================================================================
+.SS "Other free \f[I]roff\f[]s"
+.\" ====================================================================
+.
+In 2007, \" TODO: verify
+Caldera/SCO and Sun Microsystems,
+having acquired rights to AT&T Documenter's Workbench (DWB)
+.I troff
+(a descendant of the Bell Labs code),
+released it under a free but GPL-incompatible license.
+.
+.UR https://\:github\:.com/\:n\-t\-roff/\:DWB3.3
+This implementation
+.UE
+was made portable to modern POSIX systems,
+and adopted and enhanced first by Gunnar Ritter and then Carsten Kunze
+to produce
+.UR https://github.com/n-t-roff/heirloom-doctools
+Heirloom Doctools
+.I troff
+.UE .
+.
+.
+.P
+.\" https://lists.gnu.org/archive/html/groff/2013-07/msg00001.html
+In July 2013,
+Ali Gholami Rudi announced
+.UR https://\:github\:.com/\:aligrudi/\:neatroff
+.I neatroff
+.UE ,
+a permissively licensed new implementation.
+.
+.
+.P
+Another descendant of DWB
+.I troff \" DWB
+is part of
+.UR https://\:9fans\:.github\:.io/\:plan9port/
+Plan\~9 from User Space
+.UE .
+.
+Since 2021,
+this
+.I troff \" Plan 9 from User Space
+has been available under permissive terms.
+.
+.
+.\" ====================================================================
+.SH "Using \f[I]roff\f[]"
+.\" ====================================================================
+.
+When you read a man page,
+often a
+.I roff
+is the program rendering it.
+.
+Some
+.I roff
+implementations provide wrapper programs that make it easy to use the
+.I roff
+system from the shell's command line.
+.
+These can be specific to a macro package,
+like
+.MR mmroff @MAN1EXT@ ,
+or more general.
+.
+.MR groff @MAN1EXT@
+provides command-line options sparing the user from constructing the
+long,
+order-dependent pipelines familiar to AT&T
+.I troff
+users.
+.
+Further,
+a heuristic program,
+.MR grog @MAN1EXT@ ,
+is available to infer from a document's contents which
+.I groff
+arguments should be used to process it.
+.
+.
+.\" ====================================================================
+.SS "The \f[I]roff\f[] pipeline"
+.\" ====================================================================
+.
+A typical
+.I roff
+document is prepared by running one or more processors in series,
+followed by a a formatter program and then an output driver
+(or \[lq]device postprocessor\[rq]).
+.
+Commonly,
+these programs are structured into a pipeline;
+that is,
+each is run in sequence such that the output of one is
+taken as the input
+to the next,
+without passing through secondary storage.
+.
+(On non-Unix systems,
+pipelines may have to be simulated with temporary files.)
+.
+.
+.RS
+.PP
+.EX
+.RI $\~ preproc1 \~\c
+.BI <\~ input-file \~|\~ preproc2 \~|\~\c
+.RB .\|.\|.\&\~ "| troff\~"\c
+.RI [ option ]\~\c
+.RB .\|.\|.\&\~ \[rs]
+.BI " |\~" output-driver \" 4 leading spaces
+.EE
+.RE
+.
+.
+.P
+Once all preprocessors have run,
+they deliver pure
+.I roff
+language input to the formatter,
+which in turn generates a document in a page description language that
+is then interpreted by a postprocessor for viewing,
+printing,
+or further processing.
+.
+.
+.P
+Each program interprets input in a language that is independent of the
+others;
+some are purely descriptive,
+as with
+.MR @g@tbl @MAN1EXT@
+and
+.I roff
+output,
+and some permit the definition of macros,
+as with
+.MR @g@eqn @MAN1EXT@
+and
+.I roff
+input.
+.
+.
+Most
+.I roff
+input files employ the macros of a document formatting package,
+intermixed with instructions for one or more preprocessors,
+and seasoned with escape sequences and requests from the
+.I roff
+language.
+.
+Some documents are simpler still,
+since their formatting packages discourage direct use of
+.I roff
+requests;
+man pages are a prominent example.
+.
+Many features of the
+.I roff
+language are seldom needed by users;
+only authors of macro packages require a substantial command of them.
+.
+.
+.\" ====================================================================
+.SS Preprocessors
+.\" ====================================================================
+.
+A
+.I roff
+preprocessor is a program that,
+directly or ultimately,
+generates output in the
+.I roff
+language.
+.
+Typically, \" preconv is an exception.
+each preprocessor defines a language of its own that transforms its
+input into that for
+.I roff
+or another preprocessor.
+.
+As an example of the latter,
+.I chem \" generic
+produces
+.I pic \" generic
+input.
+.
+Preprocessors must consequently be run in an appropriate order;
+.MR groff @MAN1EXT@
+handles this automatically for all preprocessors supplied by the GNU
+.I roff
+system.
+.
+.
+.P
+Portions of the document written in preprocessor languages are usually
+.\" preconv is the exception again.
+bracketed by tokens that look like
+.I roff
+macro calls.
+.
+.I roff
+preprocessor programs transform only the regions of the document
+intended for them.
+.\" In preconv's case, that's the whole document.
+.
+When a preprocessor language is used by a document,
+its corresponding program must process it before the input is seen by
+the formatter,
+or incorrect rendering is almost guaranteed.
+.
+.
+.P
+GNU
+.I roff
+provides several preprocessors,
+including
+.IR @g@eqn ,
+.IR @g@grn ,
+.IR @g@pic ,
+.IR @g@tbl ,
+.IR @g@refer ,
+and
+.IR @g@soelim .
+.
+See
+.MR groff @MAN1EXT@
+for a complete list.
+.
+Other preprocessors for
+.I roff
+systems are known.
+.
+.
+.P
+.RS
+.TS
+tab (@);
+Li L.
+dformat@depicts data structures;
+grap@constructs statistical charts; and
+ideal@draws diagrams using a constraint-based language.
+.TE
+.RE
+.
+.
+.\" ====================================================================
+.SS "Formatter programs"
+.\" ====================================================================
+.
+A
+.I roff
+formatter transforms
+.I roff
+language input into a single file in a page description language,
+described in
+.MR groff_out @MAN5EXT@ ,
+intended for processing by a selected device.
+.
+This page description language is specialized in its parameters,
+but not its syntax,
+for the selected device;
+the format is
+.RI device- independent ,
+but not
+.RI device- agnostic .
+.
+The parameters the formatter uses to arrange the document are stored in
+.I device
+and
+.IR "font description files" ;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.P
+AT&T Unix
+had two formatters\[em]\c
+.I nroff
+for terminals,
+and
+.I troff
+for typesetters.
+.
+Often,
+the name
+.I troff
+is used loosely to refer to both.
+.
+When generalizing thus,
+.I groff
+documentation prefers the term
+.RI \[lq] roff \[rq].
+.
+In GNU
+.IR roff ,
+the formatter program is always
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.\" ====================================================================
+.SS "Devices and output drivers"
+.\" ====================================================================
+.
+To a
+.I roff
+system,
+a
+.I device
+is a hardware interface like a printer,
+a text or graphical terminal,
+or a standardized file format that unrelated software can interpret.
+.
+An
+.I output driver
+is a program that parses the output of
+.I troff \" generic
+and produces instructions specific to the device or file format it
+supports.
+.
+An output driver might support multiple devices,
+particularly if they are similar.
+.
+.
+.P
+The names of the devices and their driver programs are not standardized.
+.
+Technological fashions evolve;
+the devices used for document preparation when AT&T
+.I troff \" AT&T
+was first written in the 1970s are no longer used in production
+environments.
+.
+Device capabilities have tended to increase,
+improving resolution and font repertoire,
+and adding color output and hyperlinking.
+.
+Further,
+to reduce file size and processing time,
+AT&T
+.IR troff 's \" AT&T
+page description language placed low limits on the magnitudes of some
+quantities it could represent.
+.
+Its PostScript output driver,
+.MR dpost 1 ,
+had a resolution of 720 units per inch;
+.IR groff 's
+.MR grops @MAN1EXT@
+uses 72,000.
+.
+.
+.\".P
+.\"Today the operating systems provide device drivers for most
+.\"printer-like hardware, so it isn't necessary to write a special
+.\"hardware postprocessor for each printer.
+.\" XXX? No they don't. Instead printers interpret PS or PDF directly.
+.\" With a TCP/IP protocol stack and an HTTP server to accept POSTed
+.\" documents for printing.
+.
+.
+.\" ====================================================================
+.SH "\f[I]roff\f[] programming"
+.\" ====================================================================
+.
+Documents using
+.I roff
+are normal text files interleaved with
+.I roff
+formatting elements.
+.
+The
+.I roff
+language is powerful enough to support arbitrary computation and
+it supplies facilities that encourage extension.
+.
+The primary such facility is macro definition;
+with this feature,
+macro packages have been developed that are tailored for particular
+applications.
+.
+.
+.\" ====================================================================
+.SS "Macro packages"
+.\" ====================================================================
+.
+Macro packages can have a much smaller vocabulary than
+.I roff
+itself;
+this trait combined with their domain-specific nature can make them easy
+to acquire and master.
+.
+The macro definitions of a package are typically kept in a file called
+.IB name .tmac
+(historically,
+.BI tmac. name\/\c\" Italic correction comes before \c !
+).
+.
+Find details on the naming and placement of macro packages in
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.P
+A macro package anticipated for use in a document can be declared to
+the formatter by the command-line option
+.BR \-m ;
+see
+.MR @g@troff @MAN1EXT@ .
+.
+It can alternatively be specified within a document using the
+.B mso
+request of the
+.I groff
+language;
+see
+.MR groff @MAN7EXT@ .
+.
+.
+.P
+Well-known macro packages include
+.I man
+for traditional man pages and
+.I mdoc
+for BSD-style manual pages.
+.
+Macro packages for typesetting books,
+articles,
+and letters include
+.I ms
+(from \[lq]manuscript macros\[rq]),
+.I me
+(named by a system administrator from the first name of its creator,
+Eric Allman),
+.I mm
+(from \[lq]memorandum macros\[rq]),
+and
+.IR mom ,
+a punningly named package exercising many
+.I groff
+extensions.
+.
+See
+.MR groff_tmac @MAN5EXT@
+for more.
+.
+.
+.\" ====================================================================
+.SS "The \f[I]roff\f[] formatting language"
+.\" ====================================================================
+.
+.\" TODO: Integrate this subsection with subsection "Other language
+.\" elements".
+The
+.I roff
+language provides requests,
+escape sequences,
+macro definition facilities,
+string variables,
+registers for storage of numbers or dimensions,
+and control of execution flow.
+.
+The theoretically minded will observe that a
+.I roff
+is not a mere markup language,
+but Turing-complete.
+.
+It has storage
+(registers),
+it can perform tests
+(as in conditional expressions like
+.RB \[lq] "(\[rs]n[i] >= 1)" \[rq]),
+its
+.\" Kerning between bold "i" and "f" and roman \[lq], \[rq] is tight.
+.RB \[lq] \|if\| \[rq]
+and related requests alter the flow of control,
+and macro definition permits unbounded recursion.
+.
+.
+.P
+.I Requests
+and
+.I escape sequences
+are instructions,
+predefined parts of the language,
+that perform formatting operations,
+interpolate stored material,
+or otherwise change the state of the parser.
+.
+The user can define their own request-like elements by composing
+together text,
+requests,
+and escape sequences
+.I "ad libitum."
+.
+.
+A document writer will not (usually) note any difference in usage for
+requests or macros;
+both are found on control lines.
+.
+However,
+there is a distinction;
+requests take either a fixed number of arguments
+(sometimes zero),
+silently ignoring any excess,
+or consume the rest of the input line,
+whereas macros can take a variable number of arguments.
+.
+Since arguments are separated by spaces,
+macros require a means of embedding a space in an argument;
+in other words,
+of quoting it.
+.
+This then demands a mechanism of embedding the quoting character itself,
+in case
+.I it
+is needed literally in a macro argument.
+.
+AT&T
+.I troff
+had complex rules involving the placement and repetition of the double
+quote to achieve both aims.
+.
+.I groff
+cuts this knot by supporting a special character escape sequence for the
+neutral double quote,
+.\" The kerning between a roman \[lq] and a bold backslash is tight.
+.RB \[lq] \|\[rs][dq] \[rq],
+which never performs quoting in the typesetting language,
+but is simply a glyph,
+.RB \[oq] \[dq] \[cq].
+.
+.
+.P
+.I Escape sequences
+start with a backslash,
+.RB \[lq] \|\[rs] \[rq].
+.
+They can appear almost anywhere,
+even in the midst of text on a line,
+and implement various features,
+including the insertion of special characters with
+.RB \[lq] \|\[rs](\f[BI]xx\f[] \[rq]
+or
+.RB \[lq] \|\[rs][\f[BI]xxx\f[]] \[rq],
+break suppression at input line endings with
+.RB \[lq] \|\[rs]c \[rq],
+font changes with
+.RB \[lq] \|\[rs]f\| \[rq],
+type size changes with
+.RB \[lq] \|\[rs]s \[rq],
+in-line comments with
+.RB \[lq] \|\[rs]\[dq] \[rq],
+and many others.
+.
+.
+.P
+.I Strings
+store text.
+.
+They are populated with the
+.B ds
+request and interpolated using the
+.B \[rs]*
+escape sequence.
+.
+.
+.P
+.I Registers
+store numbers and measurements.
+.
+A register can be set with the request
+.B nr
+and its value can be retrieved by the escape sequence
+.BR "\[rs]n" .
+.
+.
+.\" ====================================================================
+.SH "File naming conventions"
+.\" ====================================================================
+.
+The structure or content of a file name,
+beyond its location in the file system,
+is not significant to
+.I roff
+tools.
+.
+.I roff
+documents employing \[lq]full-service\[rq] macro packages
+(see
+.MR groff_tmac @MAN5EXT@ )
+tend to be named with a suffix identifying the package;
+we thus see file names ending in
+.IR .man ,
+.IR .ms ,
+.IR .me ,
+.IR .mm ,
+and
+.IR .mom ,
+for instance.
+.
+When installed,
+man pages tend to be named with the manual's section number as the
+suffix.
+.
+For example,
+the file name for this document is
+.IR roff.7 .
+.
+Practice for
+\[lq]raw\[rq]
+.I roff
+documents is less consistent;
+they
+are sometimes seen with a
+.I .t
+suffix.
+.
+.
+.\" BEGIN Keep parallel with groff.texi node "Input Conventions".
+.\" ====================================================================
+.SH "Input conventions"
+.\" ====================================================================
+.
+Since
+.I @g@troff
+fills text automatically,
+it is common practice in the
+.I roff
+language to avoid visual composition of text in input files:
+the esthetic appeal of the formatted output is what matters.
+.
+Therefore,
+.I roff
+input should be arranged such that it is easy for authors and
+maintainers to compose and develop the document,
+understand the syntax of
+.I roff
+requests,
+macro calls,
+and preprocessor languages used,
+and predict the behavior of the
+formatter.
+.
+Several traditions have accrued in service of these goals.
+.
+.
+.IP \[bu] 2n
+Follow sentence endings in the input with newlines to ease their
+recognition.
+.\" Texinfo: (@pxref{Sentences}).
+It is frequently convenient to end text lines after colons and
+semicolons as well,
+as these typically precede independent clauses.
+.
+Consider doing so after commas;
+they often occur in lists that become easy to scan when itemized by
+line,
+or constitute supplements to the sentence that are added,
+deleted,
+or updated to clarify it.
+.
+Parenthetical and quoted phrases are also good candidates for placement
+on text lines by themselves.
+.
+.
+.IP \[bu]
+Set your text editor's line length to 72 characters or fewer;
+see the subsections below.
+.\" Texinfo:
+.\" @footnote{Emacs: @code{fill-column: 72}; Vim: @code{textwidth=72}}
+.
+This limit,
+combined with the previous item of advice,
+makes it less common that an input line will wrap in your text editor,
+and thus will help you perceive excessively long constructions in your
+text.
+.
+Recall that natural languages originate in speech,
+not writing,
+and that punctuation is correlated with pauses for breathing and changes
+in prosody.
+.
+.
+.IP \[bu]
+Use
+.B \[rs]&
+after
+.RB \[lq] !\& \[rq],
+.RB \[lq] ?\& \[rq],
+and
+.RB \[lq] .\& \[rq]
+if they are followed by space,
+tab,
+or newline characters and don't end a sentence.
+.
+.
+.IP \[bu]
+In filled text lines,
+use
+.B \[rs]&
+before
+.RB \[lq] .\& \[rq]
+and
+.RB \[lq] \[aq] \[rq]
+if they are preceded by space,
+so that reflowing the input doesn't turn them into control lines.
+.
+.
+.IP \[bu]
+Do not use spaces to perform indentation or align columns of a table.
+Leading spaces are reliable when text is not being filled.
+.
+.
+.IP \[bu]
+Comment your document.
+.
+It is never too soon to apply comments to record information of use to
+future document maintainers
+(including your future self).
+.\" Texinfo: We thus introduce another escape sequence, @code{\"}, which
+The
+.B \[rs]\[dq]
+escape sequence
+causes
+.I @g@troff
+to ignore the remainder of the input line.
+.
+.
+.IP \[bu]
+Use the empty request\[em]a control character followed immediately by a
+newline\[em]to visually manage separation of material in input files.
+.
+Many of the
+.I groff
+project's own documents use an empty request between sentences,
+after macro definitions,
+and where a break is expected,
+and two empty requests between paragraphs or other requests or macro
+calls that will introduce vertical space into the document.
+.
+You can combine the empty request with the comment escape sequence to
+include whole-line comments in your document,
+and even \[lq]comment out\[rq] sections of it.
+.
+.
+.P
+.\" Texinfo: We conclude this section with an example
+An example sufficiently long to illustrate most of the above suggestions
+in practice follows.
+.
+.\" Texinfo: For the purpose of fitting the example between the margins
+.\" of this manual with the font used for its typeset version,
+.\" we have shortened the input line length to 56
+.\" columns.
+.\" Texinfo: As before,
+.
+An arrow \[->] indicates a tab character.
+.
+.
+.P
+.RS
+.EX
+\&.\[rs]" nroff this_file.roff | less
+\&.\[rs]" groff \-T ps this_file.roff > this_file.ps
+\[->]The theory of relativity is intimately connected with
+the theory of space and time.
+\&.
+I shall therefore begin with a brief investigation of
+the origin of our ideas of space and time,
+although in doing so I know that I introduce a
+controversial subject.\& \[rs]" remainder of paragraph elided
+\&.
+.ne 3v \" Don't let a page break hide the blank line from the reader.
+\&.
+\&
+\[->]The experiences of an individual appear to us arranged
+in a series of events;
+in this series the single events which we remember
+appear to be ordered according to the criterion of
+\[rs][lq]earlier\[rs][rq] and \[rs][lq]later\[rs][rq], \[rs]" punct \
+swapped
+which cannot be analysed further.
+\&.
+There exists,
+therefore,
+for the individual,
+an I\-time,
+or subjective time.
+\&.
+This itself is not measurable.
+\&.
+I can,
+indeed,
+associate numbers with the events,
+in such a way that the greater number is associated with
+the later event than with an earlier one;
+but the nature of this association may be quite
+arbitrary.
+\&.
+This association I can define by means of a clock by
+comparing the order of events furnished by the clock
+with the order of a given series of events.
+\&.
+We understand by a clock something which provides a
+series of events which can be counted,
+and which has other properties of which we shall speak
+later.
+\&.\[rs]" Albert Einstein, _The Meaning of Relativity_, 1922
+.EE
+.RE
+.\" END Keep parallel with groff.texi node "Input Conventions".
+.
+.
+.\" ====================================================================
+.SS "Editing with Emacs"
+.\" ====================================================================
+.
+Official GNU doctrine holds that the best program for editing a
+.I roff
+document is Emacs; see
+.MR emacs 1 .
+.
+It provides an
+.I nroff
+major mode that is suitable for all kinds of
+.I roff
+dialects.
+.
+This mode can be activated by the following methods.
+.
+.
+.P
+When editing a file within Emacs the mode can be changed by typing
+.RI \[lq] M-x
+.BR nroff\-mode \[rq],
+where
+.I M-x
+means to hold down the meta key
+(often labelled \[lq]Alt\[rq])
+while pressing and releasing the \[lq]x\[rq] key.
+.\" Why is this sort of thing not in intro(1)?
+.
+.
+.P
+It is also possible to have the mode automatically selected when a
+.I roff
+file is loaded into the editor.
+.
+.
+.IP \(bu 2n
+The most general method is to include file-local variables at the end of
+the file;
+we can also configure the fill column this way.
+.
+.
+.RS
+.IP
+.EX
+\&.\[rs]" Local Variables:
+\&.\[rs]" fill\-column: 72
+\&.\[rs]" mode: nroff
+\&.\[rs]" End:
+.EE
+.RE
+.
+.IP \(bu
+Certain file name extensions,
+such as those commonly used by man pages,
+trigger the automatic activation of the
+.I nroff
+mode.
+.
+.
+.br
+.ne 3v
+.IP \(bu
+Technically,
+having the sequence
+.
+.
+.RS
+.IP
+.EX
+\&.\[rs]" \%\-*\- nroff \-*\-
+.EE
+.RE
+.
+.
+.IP
+in the first line of a file will cause Emacs to enter the
+.I nroff
+major mode when it is loaded into the buffer.
+.
+Unfortunately,
+some implementations of the
+.MR man 1
+program are confused by this practice,
+so we discourage it.
+.
+.
+.\" ====================================================================
+.SS "Editing with Vim"
+.\" ====================================================================
+.
+.\" TODO: elvis, vile. Nvi does not support highlighting at all, and
+.\" gedit does but has no rules for roff yet. Other editors TBD.
+Other editors provide support for
+.IR roff -style
+files too,
+such as
+.MR vim 1 ,
+an extension of the
+.MR vi 1
+program.
+.
+Vim's highlighting can be made to recognize
+.I roff
+files by setting the
+.B filetype
+option in a Vim
+.IR modeline .
+.
+For this feature to work,
+your copy of
+.I vim
+must be built with support for,
+and configured to enable,
+several features;
+consult the editor's online help topics
+\[lq]auto\-setting\[rq],
+\[lq]filetype\[rq],
+and \[lq]syntax\[rq].
+.
+Then put the following at the end of your
+.I roff
+files,
+after any Emacs configuration:
+.\" ...because Emacs pattern-matches against 3000 bytes from the end of
+.\" the buffer [or until hitting a 0x0C (FF, form-feed control)] for
+.\" "Local Variables:", but Vim only checks as many lines as its
+.\" 'modelines' variable tells it to. A common default is "5", but
+.\" Emacs settings can be longer than that.
+.
+.
+.RS
+.IP
+.EX
+\&.\[rs]" vim: set filetype=groff textwidth=72:
+.EE
+.RE
+.
+.
+.P
+Replace \[lq]groff\[rq] in the above with \[lq]nroff\[rq] if you want
+highlighting that does
+.I not
+recognize many of the GNU extensions to
+.IR roff ,
+such as request,
+register,
+and string names longer than two characters.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+Much
+.I roff
+documentation is available.
+.
+The Bell Labs papers describing AT&T
+.I troff
+remain available,
+and
+.I groff
+is documented comprehensively. \" ...one hopes.
+.
+.
+.\" ====================================================================
+.SS "Internet sites"
+.\" ====================================================================
+.
+.P
+.UR https://\:github\:.com/\:larrykollar/\:Unix\-Text\-Processing
+.I Unix Text Processing
+.UE ,
+by Dale Dougherty and Tim O'Reilly,
+1987,
+Hayden Books.
+.
+This well-regarded text brings the reader from a state of no knowledge
+of Unix or text editing
+(if necessary)
+to sophisticated computer-aided typesetting.
+.
+It has been placed under a free software license by its authors and
+updated by a team of
+.I groff
+contributors and enthusiasts.
+.
+.
+.P
+.UR http://\:manpages\:.bsd\:.lv/\:history\:.html
+\[lq]History of Unix Manpages\[rq]
+.UE ,
+an online article maintained by the mdocml project,
+provides an overview of
+.I roff
+development from Saltzer's
+.I RUNOFF
+to 2008,
+with links to original documentation and recollections of the authors
+and their contemporaries.
+.
+.
+.P
+.UR http://\:www\:.troff\:.org/
+troff.org
+.UE ,
+Ralph Corderoy's
+.I troff
+site,
+provides an overview and pointers to much historical
+.I roff
+information.
+.
+.
+.P
+.UR http://\:www\:.multicians\:.org/
+Multicians
+.UE ,
+a site by Multics enthusiasts,
+contains a lot of information on the MIT projects CTSS and Multics,
+including
+.IR RUNOFF ;
+it is especially useful for its glossary and the many links to
+historical documents.
+.
+.
+.P
+.UR http://\:www\:.tuhs\:.org/\:Archive/
+The Unix Archive
+.UE ,
+curated by the Unix Heritage Society,
+provides the source code and some binaries of historical Unices
+(including the source code of some versions of
+.I troff
+and its documentation)
+contributed by their copyright holders.
+.
+.
+.P
+.UR http://\:web\:.mit\:.edu/\:Saltzer/\:www/\:publications/\
+\:pubs\:.html
+Jerry Saltzer's home page
+.UE
+stores some documents using the original
+.I RUNOFF
+formatting language.
+.
+.
+.P
+.UR http://\:www\:.gnu\:.org/\:software/\:groff
+.I groff
+.UE ,
+GNU
+.IR roff 's
+web site,
+provides convenient access to
+.IR groff 's
+source code repository,
+bug tracker,
+and mailing lists
+(including archives and the subscription interface).
+.
+.
+.\" ====================================================================
+.SS "Historical \f[I]roff\f[] documentation"
+.\" ====================================================================
+.
+Many AT&T
+.I troff
+documents are available online,
+and can be found at Ralph Corderoy's site
+(see above)
+or via Internet search.
+.
+.
+.P
+Of foremost significance are two mentioned in section \[lq]History\[rq]
+above,
+describing the language and its device-independent implementation,
+respectively.
+.
+.
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54.
+.
+.
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97.
+.
+.
+.P
+You can obtain many relevant Bell Labs papers in PDF from
+.UR https://\:github\:.com/\:bwarken/\:roff_classical\:.git
+Bernd Warken's
+\[lq]roff classical\[rq]
+GitHub repository
+.UE .
+.
+.
+.\" ====================================================================
+.SS "Manual pages"
+.\" ====================================================================
+.
+As a system of multiple components,
+a
+.I roff
+system potentially has many man pages,
+each describing an aspect of it.
+.
+Unfortunately,
+there is no consistent naming scheme for these pages among the different
+.I roff
+implementations.
+.
+.
+.P
+For GNU
+.IR roff ,
+the
+.MR groff @MAN1EXT@
+man page enumerates all man pages distributed with the system,
+and individual pages frequently refer to external resources as well as
+manuals distributed with
+.I groff
+on a variety of topics.
+.
+.
+.P
+With other
+.IR roff s,
+you are on your own,
+but
+.MR troff 1 \" foreign troff
+might be a good starting point.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_roff_7_man_C]
+.do rr *groff_roff_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72: