diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:44:05 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:44:05 +0000 |
commit | d318611dd6f23fcfedd50e9b9e24620b102ba96a (patch) | |
tree | 8b9eef82ca40fdd5a8deeabf07572074c236095d /man/groff.7.man | |
parent | Initial commit. (diff) | |
download | groff-upstream/1.23.0.tar.xz groff-upstream/1.23.0.zip |
Adding upstream version 1.23.0.upstream/1.23.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'man/groff.7.man')
-rw-r--r-- | man/groff.7.man | 8055 |
1 files changed, 8055 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: |