diff options
Diffstat (limited to 'man/groff_diff.7.man')
-rw-r--r-- | man/groff_diff.7.man | 6188 |
1 files changed, 6188 insertions, 0 deletions
diff --git a/man/groff_diff.7.man b/man/groff_diff.7.man new file mode 100644 index 0000000..0d25cb6 --- /dev/null +++ b/man/groff_diff.7.man @@ -0,0 +1,6188 @@ +'\" e +.TH groff_diff @MAN7EXT@ "@MDATE@" "groff @VERSION@" +.SH Name +groff_diff \- differences between GNU +.I roff +and AT&T +.I troff +. +. +.\" ==================================================================== +.\" Legal Terms +.\" ==================================================================== +.\" +.\" Copyright (C) 1989-2023 Free Software Foundation, Inc. +.\" +.\" This file is part of groff, the GNU roff type-setting system. +.\" +.\" Permission is granted to copy, distribute and/or modify this +.\" document under the terms of the GNU Free Documentation License, +.\" Version 1.3 or any later version published by the Free Software +.\" Foundation; with no Invariant Sections, with no Front-Cover Texts, +.\" and with no Back-Cover Texts. +.\" +.\" A copy of the Free Documentation License is included as a file +.\" called FDL in the main directory of the groff source package. +. +. +.\" Save and disable compatibility mode (for, e.g., Solaris 10/11). +.do nr *groff_groff_diff_7_man_C \n[.cp] +.cp 0 +. +.\" Define fallback for groff 1.23's MR macro if the system lacks it. +.nr do-fallback 0 +.if !\n(.f .nr do-fallback 1 \" mandoc +.if \n(.g .if !d MR .nr do-fallback 1 \" older groff +.if !\n(.g .nr do-fallback 1 \" non-groff *roff +.if \n[do-fallback] \{\ +. de MR +. ie \\n(.$=1 \ +. I \%\\$1 +. el \ +. IR \%\\$1 (\\$2)\\$3 +. . +.\} +.rr do-fallback +. +. +.\" ==================================================================== +.\" Local definitions +.\" ==================================================================== +. +.\" define a string tx for the TeX logo +.ie t .ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X +.el .ds tx TeX +. +. +.\" from old groff_out.man +.ie \n(.g \ +. ds ic \/ +.el \ +. ds ic \^ +. +. +.\" ==================================================================== +.SH Description +.\" ==================================================================== +. +The GNU +.I roff +text processing system, +.IR groff , +is an extension of AT&T +.IR troff , \" AT&T +the typesetting system originating in Unix systems of the 1970s. +. +.I groff +removes many arbitrary limitations and adds features, +both to the input language and to the page description language output +by the +.I troff \" generic +formatter. +. +Differences arising from +.IR groff 's +implementation of AT&T +.I troff \" AT&T +features are also noted. +. +See +.MR roff @MAN7EXT@ +for background. +. +. +.\" ==================================================================== +.SH Language +.\" ==================================================================== +. +GNU +.I troff \" GNU +features identifiers of arbitrary length; +supports color output, +non-integral type sizes, +and user-defined characters; +adds more conditional expression operators; +recognizes additional scaling units and numeric operators; +enables general file I/O +(in \[lq]unsafe mode\[rq] only); +and exposes more formatter state. +. +. +.\" ==================================================================== +.SS "Long names" +.\" ==================================================================== +. +GNU +.I troff \" GNU +introduces many new requests; +with three exceptions +.RB ( cp , +.BR do , +.BR rj ), +they have names longer than two characters. +. +The names of registers, +fonts, +strings/\:macros/\:diversions, +environments, +special characters, +streams, +and colors can be of any length. +. +Anywhere AT&T +.I troff \" AT&T +supports a parameterized escape sequence that uses an opening +parenthesis \[lq](\[rq] to introduce a two-character argument, +.I groff +supports a square-bracketed form \[lq][]\[rq] where the argument +within can be of arbitrary length. +. +. +.\" ==================================================================== +.SS "Font families, abstract styles, and translation" +.\" ==================================================================== +. +GNU +.I troff \" GNU +can group text typefaces into +.I families +containing each of the styles +.RB \[lq] R \[rq], +.RB \[lq] I \[rq], +.RB \[lq] B \[rq], +and +.RB \[lq] BI \[rq]. +. +So that a document need not be coupled to a specific font family, +an output device can associate a style in the abstract sense with a +mounting position. +. +Thus the default family can be combined with a style dynamically, +producing a +.I "resolved font name." +. +A document can +.I translate, +or remap, +fonts with the +.B ftr +request. +. +. +.P +Applying the requests +.BR cs , +.BR bd , +.BR tkf , +.BR uf , +or +.B \%fspecial +to an abstract style affects the member of the default family +corresponding to that style. +. +The default family can be set with the +.B fam +request or +.B \-f +command-line option. +. +The +.B styles +directive in the output device's +.I DESC +file controls which mounting positions +(if any) +are initially associated with abstract styles rather than fonts, +and the +.B sty +request can update this association. +. +. +.\" ==================================================================== +.SS Colors +.\" ==================================================================== +. +.I groff +supports color output with a variety of color spaces and up to 16 bits +per channel. +. +Some devices, +particularly terminals, +may be more limited. +. +When color support is enabled, +two colors are current at any given time: +the +.I stroke color, +with which glyphs, +rules (lines), +and geometric figures are drawn, +and the +.I fill color, +which paints the interior of filled geometric figures. +. +The +.BR color , +.BR \%defcolor , +.BR gcolor , +and +.B fcolor +requests; +.B \[rs]m +and +.B \[rs]M +escape sequences; +and +.BR .color , +.BR .m , +and +.B .M +registers exercise color support. +. +. +.\" ==================================================================== +.SS "Fractional type sizes and new scaling units" +.\" ==================================================================== +. +.\" BEGIN Keep (roughly) parallel with groff.texi node "Using Fractional +.\" Type Sizes". +AT&T +.I troff \" AT&T +interpreted all type size measurements in points. +. +Combined with integer arithmetic, +this design choice made it impossible to support, +for instance, +ten and a half-point type. +. +In GNU +.IR troff , \" GNU +an output device can select a scaling factor that subdivides a point +into \[lq]scaled points\[rq]. +. +A type size expressed in scaled points can thus represent a non-integral +type size. +. +. +.P +A +.I scaled point +is equal to +.RI 1/ sizescale +points, +where +.I sizescale +is specified in the device description file, +.IR DESC , +and defaults to\~1; +see +.MR groff_font @MAN5EXT@ . +. +Requests and escape sequences in GNU +.I troff \" GNU +interpret arguments that represent a type size in points, +which the formatter multiplies by +.I sizescale +and converts to an integer. +. +Arguments treated in this way comprise those to the escape sequences +.B \[rs]H +and +.BR \[rs]s , +to the request +.BR ps , +the third argument to the +.B cs +request, +and the second and fourth arguments to the +.B tkf +request. +. +Scaled points may be specified explicitly with the +.B z +scaling unit. +. +In GNU +.IR troff , \" GNU +the register +.B \[rs]n[.s] +can interpolate a non-integral type size. +. +The register +.B \[rs]n[.ps] +interpolates the type size in scaled points. +. +. +.P +For example, +if +.I sizescale +is\~1000, +then a scaled point is one thousandth of a point. +. +Consequently, +.RB \[lq] ".ps 10.5" \[rq] +is synonymous with +.RB \[lq] ".ps 10.5z" \[rq]; +both set the type size to 10,500\~scaled points, +or 10.5\~points. +. +. +.P +It makes no sense to use the +.RB \[lq] z \[rq]\~scaling +unit in a numeric expression whose default scaling unit is neither +.RB \[lq] u \[rq] +.RB nor\~\[lq] z \[rq], +so GNU +.I troff \" GNU +disallows this. +. +Similarly, +it is nonsensical to use a scaling unit other +.RB than\~\[lq] z \[rq] +.RB or\~\[lq] u \[rq] +in a numeric expression whose default scaling unit +.RB is\~\[lq] z \[rq], +so GNU +.I troff +disallows this as well. +. +. +.br +.ne 2v +.P +Another new scaling unit, +.RB \[lq] s \[rq], +multiplies by the number of basic units in a scaled point. +. +Thus, +.RB \[lq]\^ \[rs]n[.ps]s \[rq] +is equal to +.RB \[lq] 1m \[rq] +by definition. +. +Do not confuse the +.RB \[lq] s \[rq] +and +.RB \[lq] z \[rq] +scaling units. +. +. +.br +.ne 2v +.P +Output devices may be limited in the type sizes they can employ. +. +The +.B .s +and +.B .ps +registers represent the type size as selected by the output driver as it +understands a device's capability. +. +The last +.I requested +type size is interpolated in scaled points by the read-only register +.B .psr +and in points as a decimal fraction by the read-only string-valued +register +.BR .sr . +. +Both are associated with the environment. +. +For example, +if a type size of 10.95\~points is requested, +and the nearest size permitted by a +.B sizes +request +(or by the +.B sizes +or +.B \%sizescale +directives in the device's +.I DESC +file) +is 11\~points, +the output driver uses the latter value. +.\" END Keep (roughly) parallel with groff.texi node "Using Fractional +.\" Type Sizes". +. +. +.P +A further two new measurement units available in +.I groff +are +.RB \[lq] M \[rq], +which indicates hundredths of an em, +and +.RB \[lq] f \^\[rq], +which multiplies by 65,536. +. +The latter provides convenient fractions for color definitions with the +.B \%defcolor +request. +. +For example, +0.5f equals 32768u. +. +. +.\" ==================================================================== +.SS "Numeric expressions" +.\" ==================================================================== +. +GNU +.I troff \" GNU +permits spaces in a numeric expression within parentheses, +and offers three new operators. +. +. +.TP +.IB e1 >? e2 +Interpolate the greater of +.I e1 +and +.IR e2 . +. +. +.TP +.IB e1 <? e2 +Interpolate the lesser of +.I e1 +and +.IR e2 . +. +. +.TP +.BI ( c ; e ) +Evaluate +.I e +using +.I c +as the default scaling unit, +ignoring scaling units in +.I e +if +.I c +is empty. +. +. +.\" ==================================================================== +.SS "Conditional expressions" +.\" ==================================================================== +. +More conditions can be tested with the +.RB \[lq]\| if \|\[rq] +and +.B ie +requests, +as well as the new +.RB \[lq] while \[rq] +request. +. +. +.TP +.BI c\~ chr +True if a character +.I chr +is available, +where +.I chr +is an ordinary character +(Unicode basic Latin excluding control characters and the space), +a special character, +or +.BI \[rs]N\[aq] index\c +.BR \[aq] . +. +. +.TP +.BI d\~ nam +True if a string, +macro, +diversion, +or request +.I nam +is defined. +. +. +.TP +.BI F\~ fnt +True if a font +.I fnt +is available; +.I fnt +can be an abstract style +or a font name. +. +.I fnt +is handled as if it +were accessed with the +.B ft +request +(that is, +abstract styles and font translation are applied), +but +.I fnt +cannot be a mounting position, +and no font is mounted. +. +. +.TP +.BI m\~ col +True if a color +.I col +is defined. +. +. +.TP +.BI r\~ reg +True if a register +.I reg +is defined. +. +. +.TP +.BI S\~ sty +True if a style +.I sty +is registered. +. +Font translation applies. +. +. +.TP +.B v +Always false. +. +This condition is for compatibility with certain other +.I troff +implementations only. +. +(This refers to +.IR vtroff , +a translator that would convert the C/A/T output from early-vintage AT&T +.I troff \" AT&T +to a form suitable for Versatec and Benson-Varian plotters.) +. +. +.\" ==================================================================== +.SS "Drawing commands" +.\" ==================================================================== +. +GNU +.I troff \" GNU +offers drawing commands to create filled +circles and ellipses, +and polygons. +.\" CSTR #54 did not countenance polygons, but DWB 3.3 had outlined ones +.\" as \D'p' as we do. Filled polygons appear to be a GNU innovation. +. +Stroked (outlined) objects are drawn with the stroke color and +filled (solid) ones shaded with the fill color. +. +These are independent properties; +if you want a filled, +stroked figure, +you must draw the same figure twice using each drawing command. +. +A filled figure is always smaller than a stroked one because the former +is drawn only within its defined area, +whereas strokes have a line thickness +(set with another new drawing command, +.BR \[rs]D\[aq]t\[aq] ). +. +. +.\" ==================================================================== +.SS "Escape sequences" +.\" ==================================================================== +. +.\" TODO: Some of the synopses here and in "New requests" get pretty +.\" discursive. It would be better to lift the introduction of new +.\" concepts in groff programming to new subsections above. Examples +.\" include: string parameterization, user-definable characters, +.\" character properties (cflags), character classes; the hyphenation +.\" language, code, and pattern file system; file stream manipulation... +.\" +.\" _Maybe_ output suppression. It's a big enough concept, but only +.\" well understood by retired contributors, only used by the grohtml +.\" output driver (still beta after 20 years), and we have some Savannah +.\" tickets that point the way to radically simplifying its design, +.\" eliminating its need to groff before you groff. +.I groff +introduces several new escape sequences +and extends the syntax of a few AT&T +.I troff \" AT&T +escape sequences +(namely, +.BR \[rs]D , +.BR \[rs]f , +.BR \[rs]k , +.BR \[rs]n , +.BR \[rs]s , +.BR \[rs]$ , +and +.BR \[rs]* ). +. +In the following list, +escape sequences are collated alphabetically at first, +and then by symbol roughly in Unicode code point order. +.\" Exceptions are made to group closely-related escape sequences in an +.\" order more agreeable to the development of a topic. +. +. +.TP 7.5 \" sinfully obtain better pagination on typesetters +.BI \[rs]A\[aq] anything \[aq] +Interpolate 1 if +.I anything +is a valid identifier, +and\~0 otherwise. +. +Because invalid input characters are removed, +invalid identifiers are empty or contain spaces, +tabs, +or newlines. +. +You can employ +.B \[rs]A +to validate a macro argument before using it to construct another escape +sequence or identifier. +. +.TP +.BI \[rs]B\[aq] anything \[aq] +Interpolate 1 if +.I anything +is a valid numeric expression, +and\~0 otherwise. +. +You might use +.B \[rs]B +along with the +.RB \[lq]\| if \|\[rq] +request to filter out invalid macro arguments. +. +. +.TP +.BI \[rs]D\[aq]C\~ "d" \[aq] +Draw filled circle of diameter +.I d +with its leftmost point at the drawing position. +. +. +.TP +.BI \[rs]D\[aq]E\~ "h v" \[aq] +Draw filled ellipse with +.I h +and +.I v +as the axes and the leftmost point at the drawing position. +. +. +.TP +.BI \[rs]D\[aq]p\~ "h1 v1"\~\c +.RI .\|.\|.\~ "hn vn"\c +.B \[aq] +Draw polygon with vertices at drawing position and each point +in sequence. +. +GNU +.I troff \" GNU +closes the polygon by drawing a line from +.RI ( hn ,\~ vn ) +back to the initial drawing position; +DWB and Heirloom +.IR troff s \" DWB, Heirloom +do not. +. +.\" XXX: This would be the "STUPID_DRAWING_POSITIONING" complained of in +.\" src/libs/libdriver/input.cpp. It is neither the rightmost point +.\" of the figure nor the initial drawing position that GNU troff +.\" automatically returned to to close the figure. +Afterward, +the drawing position is left at +.RI ( hn ,\~ vn ). +. +. +.TP +.BI \[rs]D\[aq]P\~ "h1 v1"\~\c +.RI .\|.\|.\~ "hn vn"\c +.B \[aq] +As +.BR \[rs]D\[aq]p\[aq] , +but the polygon is filled. +. +. +.TP +.BI \[rs]D\[aq]t\~ "n" \[aq] +Set line thickness of geometric objects to +.RI to\~ n +basic units. +. +A zero +.I n +selects the minimal supported thickness. +. +A negative +.I n +selects a thickness proportional to the type size; +this is the default. +. +. +.TP +.B \[rs]E +Embed an escape character that is not interpreted in copy mode +(compare with +.B \[rs]a +and +.BR \[rs]t ). +. +You can use it to ease the writing of nested macro definitions. +. +It is also convenient to define strings containing escape sequences that +need to work when used in copy mode +(for example, +as macro arguments), +or which will be interpolated at varying macro nesting depths. +. +. +.TP +.BI \[rs]f[ font ] +Select +.IR font , +which may be a mounting position, +abstract style, +or font name, +to choose the typeface. +. +.B \[rs]f[] +and +.B \[rs]fP +are synonyms; +we recommend the former. +. +. +.TP +.BI \[rs]F f +.TQ +.BI \[rs]F( fm +.TQ +.BI \[rs]F[ family ] +Select default font family. +. +.B \[rs]F[] +makes the previous font family the default. +. +.B \[rs]FP +is unlike +.BR \[rs]fP ; +it selects font family \[lq]P\[rq] as the default. +. +See the +.B fam +request below. +. +. +.TP +.BI \[rs]k( rg +.TQ +.BI \[rs]k[ reg ] +Mark horizontal drawing position in +two-character register +.RI name\~ rg +or arbitrary register +.RI name\~ reg . +. +. +.TP +.BI \[rs]m c +.TQ +.BI \[rs]m( cl +.TQ +.BI \[rs]m[ col ] +Set the stroke color. +. +.B \[rs]m[] +restores the previous stroke color, +or the default if there is none. +. +. +.TP +.BI \[rs]M c +.TQ +.BI \[rs]M( cl +.TQ +.BI \[rs]M[ col ] +Set the fill color. +. +.B \[rs]M[] +restores the previous fill color, +or the default if there is none. +. +. +.TP +.BI \[rs]n[ reg ] +Interpolate register +.IR reg . +. +. +.TP +.BI \[rs]O n +.TQ +.BI \[rs]O[ n ] +Suppress +.I @g@troff +output of glyphs and geometric objects. +. +The sequences +.BR \[rs]O2 , +.BR \[rs]O3 , +.BR \[rs]O4 , +and +.B \[rs]O5 +are intended for internal use by +.MR grohtml @MAN1EXT@ . +. +. +.RS +.TP +.B \[rs]O0 +.TQ +.B \[rs]O1 +Disable and enable, +respectively, +the emission of glyphs and geometric objects to the output driver, +provided that this sequence occurs at the outermost suppression level +(see +.B \[rs]O3 +and +.BR \[rs]O4 ). +. +Horizontal motions corresponding to non-overstruck glyph widths still +occur. +. +These sequences also reset the registers +.BR opminx , +.BR opminy , +.BR opmaxx , +and +.B opmaxy +to\~\-1. +. +These four registers mark the top left and bottom right hand corners of +a box encompassing all written or drawn output. +. +. +.TP +.B \[rs]O2 +At the outermost suppression level, +enable emission of glyphs and geometric objects, +and write to the standard error stream the page number and values of the +four aforementioned registers encompassing glyphs written since the last +interpolation of a +.B \[rs]O +sequence, +as well as the page offset, +line length, +image file name +(if any), +horizontal and vertical device motion quanta, +and input file name. +. +Numeric values are in basic units. +. +. +.TP +.B \[rs]O3 +.TQ +.B \[rs]O4 +Begin and end a nested suppression level, +respectively. +. +.I \%grohtml +uses this mechanism to create images of output preprocessed with +.IR @g@pic , +.IR @g@eqn , +and +.IR @g@tbl . +. +At startup, +.I @g@troff +is at the outermost suppression level. +. +.I \%pre\-grohtml +generates these sequences when processing the document, +using +.I @g@troff +with the +.B ps +output device, +Ghostscript, +and the PNM tools to produce images in PNG format. +. +These sequences start a new page if the device is not +.B html +or +.BR xhtml , +to reduce the number of images crossing a page boundary. +. +. +.TP +.BI \[rs]O5[ Pfile ] +At the outermost suppression level, +write the name +.I file +to the standard error stream at position +.IR P , +which must be one of +.BR l , +.BR r , +.BR c , +or +.BR i , +corresponding to +left, +right, +centered, +and inline alignments within the document, +respectively. +. +.I file +is is a name associated with the production of the next image. +.RE +. +. +.TP +.BI \[rs]R\[aq] name\~\[+-]n \[aq] +Synonymous with +.RB \[lq] .nr +.IR name\~\[+-]n \[rq]. +. +. +.TP +.BI \[rs]s[ \[+-]n ] +.TQ +.BI \[rs]s \[+-] [ n ] +.TQ +.BI \[rs]s\[aq] \[+-]n \[aq] +.TQ +.BI \[rs]s \[+-] \[aq] n \[aq] +Set the type size to, +or increment or decrement it by, +.I n +scaled points. +. +. +.br +.ne 5v +.TP +.BI \[rs]V e +.TQ +.BI \[rs]V( ev +.TQ +.BI \[rs]V[ env ] +Interpolate contents of the environment variable +.IR env , +as returned by +.MR getenv 3 . +. +.B \[rs]V +is interpreted even in copy mode. +. +. +.TP +.BI \[rs]X\[aq] anything \[aq] +Within +.B \[rs]X +arguments, +the escape sequences +.BR \[rs]& , +.BR \[rs]) , +.BR \[rs]% , +and +.B \[rs]: +are ignored; +.BI \[rs] space +and +.B \[rs]\[ti] +are converted to single space characters; +and +.B \[rs]\[rs] +is reduced to +.BR \[rs] . +. +So that the basic Latin subset of the Unicode character set +(that is, +ISO\~646:1991-IRV or, +popularly, +\[lq]US-ASCII\[rq]) +can be reliably encoded in +.I anything, +the special character escape sequences +.BR \[rs]\- , +.BR \[rs][aq] , +.BR \[rs][dq] , +.BR \[rs][ga] , +.BR \[rs][ha] , +.BR \[rs][rs] , +and +.B \[rs][ti] +are mapped to basic Latin characters; +see +.MR groff_char @MAN7EXT@ . +. +For this transformation, +character translations and definitions are ignored. +. +Other escape sequences are not supported. +. +. +.IP +If the +.B \%use_charnames_in_special +directive appears in the output device's +.I DESC +file, +the use of special character escape sequences is +.I not +an error; +they are simply output verbatim +(with the exception of the seven mapped to Unicode basic Latin +characters, +discussed above). +. +.B \%use_charnames_in_special +is currently employed only by +.MR grohtml @MAN1EXT@ . +. +. +.TP +.BI \[rs]Y m +.TQ +.BI \[rs]Y( ma +.TQ +.BI \[rs]Y[ mac ] +Interpolate a macro as a device control command. +. +This is similar to +.BI \[rs]X\[aq]\[rs]*[ mac ]\[aq]\f[R], +except the contents of +.I mac +are not interpreted, +and +.I mac +can be a macro and thus contain newlines, +whereas the argument to +.B \[rs]X +cannot. +. +This inclusion of newlines requires an extension to the AT&T +.I troff \" AT&T +output format, +and will confuse postprocessors that do not know about it. +. +. +.TP +.BI \[rs]Z\[aq] anything \[aq] +Save the drawing position, +format +.IR anything , +then restore it. +. +Tabs and leaders in the argument are ignored with an error diagnostic. +. +. +.TP +.B \[rs]# +Everything up to and including the next newline is ignored. +. +This escape sequence is interpreted even in copy mode. +. +.B \[rs]# +is like +.BR \[rs]" , +except that +.B \[rs]" +does not ignore a newline; +the latter therefore cannot be used by itself for a whole-line +comment\[em]it leaves a blank line on the input stream. +. +. +.\" Keep \$0 before \$( in spite of collation. +.TP +.B \[rs]$0 +Interpolate the name by which the macro being interpreted was called. +. +In GNU +.I troff \" GNU +this name can vary; +see the +.B als +request. +. +. +.TP +.BI \[rs]$( nn +.TQ +.BI \[rs]$[ nnn ] +In a macro or string definition, +interpolate +the +.IR nn th +or +.IR nnn th +argument. +. +Macros and strings can have an unlimited number of arguments. +. +. +.TP +.B \[rs]$* +In a macro or string definition, +interpolate the catenation of all arguments, +separated by spaces. +. +. +.TP +.B \[rs]$@ +In a macro or string definition, +interpolate the catenation of all arguments, +with each surrounded by double quotes and separated by spaces. +. +. +.TP +.B \[rs]$\[ha] +In a macro or string definition, +interpolate the catenation of all arguments +constructed in a form suitable for passage to the +.B ds +request. +. +. +.TP +.B \[rs]) +Interpolate a +.I transparent +dummy character\[em]one that is ignored by end-of-sentence detection. +. +It behaves as +.BR \[rs]& , +except that +.B \[rs]& +is treated as letters and numerals normally are after +\[lq].\[rq], +\[lq]?\[rq], +and +\[lq]!\[rq]; +.B \[rs]& +cancels end-of-sentence detection, +and +.B \[rs]) +does not. +. +. +.TP +.BI \[rs]*[ "string\~\c +.RI [ arg \~.\|.\|.]\c +.B ] +Interpolate +.I string, +passing it +.I arg +\&.\|.\|.\& +as arguments. +. +. +.\" Keep \/ before \, in spite of collation. +.TP +.B \[rs]/ +Apply an +.IR "italic correction" : +modify the spacing of the preceding glyph so that the distance between +it and the following glyph is correct if the latter is of upright shape. +. +For example, +if an italic\~\[lq]f\^\[rq] is followed immediately by a roman right +parenthesis, +then in many fonts the top right portion of the\~\[lq]f\^\[rq] overlaps +the top left of the right parenthesis, +.if t producing \f[I]f\f[R]), +which is ugly. +. +Inserting +.B \[rs]\^/ +between them +.if t \{\ +. nop produces +. ie \n(.g \f[I]f\/\f[R]) +. el \f[I]f\|\f[R]) +. nop and +.\} +avoids this problem. +. +Use this escape sequence whenever an oblique glyph is immediately +followed by an upright glyph without any intervening space. +. +. +.TP +.B \[rs], +Apply a +.IR "left italic correction" : +modify the spacing of the following glyph so that the distance between +it and the preceding glyph is correct if the latter is of upright shape. +. +For example, +if a roman left parenthesis is immediately followed by an +italic\~\[lq]f\^\[rq], +then in many fonts the bottom left portion of the\~\[lq]f\^\[rq] +overlaps the bottom of the left parenthesis, +.if t producing \f[R](\f[I]f\f[R], +which is ugly. +. +Inserting +.B \[rs], +between them +.if t \{\ +. nop produces +. ie \n(.g \f[R](\,\f[I]f\f[R] +. el \f[R](\^\f[I]f\f[R] +. nop and +.\} +avoids this problem. +. +Use this escape sequence whenever an upright glyph is followed +immediately by an oblique glyph without any intervening space. +. +. +.TP +.B \[rs]: +Insert a non-printing break point. +. +That is, +a word can break there, +but the soft hyphen character does not mark the break point if it does +(in contrast to +.RB \[lq]\^ \[rs]% \[rq]). +. +This escape sequence is an input word boundary, +so the remainder of the word is subject to hyphenation as normal. +. +. +.TP +.BI \[rs]? anything \[rs]? +When used in a diversion, +this transparently embeds +.I anything +in the diversion. +.I anything +is read in copy mode. +. +When the diversion is reread, +.I anything +is interpreted. +.I anything +may not contain newlines; +use +.B \[rs]!\& +if you want to embed newlines in a diversion. +. +The escape sequence +.B \[rs]?\& +is also recognized in copy mode and becomes an internal code; +it is this code that terminates +.IR anything . +Thus +. +. +.RS +.IP +.EX +.ne 14v+\n(.Vu +\&.nr x 1 +\&.nf +\&.di d +\&\[rs]?\[rs]\[rs]?\[rs]\[rs]\[rs]\[rs]?\[rs]\[rs]\[rs]\[rs]\[rs]\[rs]\ +\[rs]\c +\&\[rs]nx\[rs]\[rs]\[rs]\[rs]?\[rs]\[rs]?\[rs]? +\&.di +\&.nr x 2 +\&.di e +\&.d +\&.di +\&.nr x 3 +\&.di f +\&.e +\&.di +\&.nr x 4 +\&.f +.EE +.RE +. +. +.IP +prints\~\c +.BR 4 . +. +. +.TP +.BI \[rs][ char ] +Typeset the special character +.IR char . +. +. +.TP +.BI \[rs][ "base-char combining-component\~"\c +.RB .\|.\|. ] +Typeset a composite glyph consisting of +.I base-char +overlaid with one or more +.IR combining-component s. +. +For example, +.RB \[lq]\| \[rs][A\~ho] \^\[rq] +is a capital letter \[lq]A\[rq] with a \[lq]hook accent\[rq] (ogonek). +. +See the +.B \%composite +request below; +.IR "Groff: The GNU Implementation of troff" , +the +.I groff +Texinfo manual, +for details of composite glyph name construction; +and +.MR groff_char @MAN7EXT@ +for a list of components used in composite glyph names. +. +. +.TP +.B \[rs]\[ti] +Insert an unbreakable space that is adjustable like an ordinary space. +. +It is discarded from the end of an output line if a break is forced. +. +. +.\" ==================================================================== +.SS "Restricted requests" +.\" ==================================================================== +. +To mitigate risks from untrusted input documents, +the +.B pi +and +.B sy +requests are disabled by default. +. +.MR @g@troff @MAN1EXT@ 's +.B \-U +option enables the formatter's \[lq]unsafe mode\[rq], +restoring their function +(and enabling additional +.I groff +extension requests, +.BR open , +.BR opena , +and +.BR pso ). +. +. +.\" ==================================================================== +.SS "New requests" +.\" ==================================================================== +. +.TP +.BI .aln\~ "new old" +Create alias +.I new +for existing register named +.IR old , +causing the names to refer to the same stored value. +. +If +.I old +is undefined, +a warning in category +.RB \[lq] reg \[rq] +is generated and the request is ignored. +. +To remove a register alias, +invoke +.B rr +on its name. +. +A register's contents do not become inaccessible until it has no more +names. +. +. +.TP +.BI .als\~ "new old" +Create alias +.I new +for existing request, +string, +macro, +or diversion named +.IR old , +causing the names to refer to the same stored object. +. +If +.I old +is undefined, +a warning in category +.RB \[lq] mac \[rq] +is produced, +and the request is ignored. +. +The +.RB \[lq] am \[rq], +.RB \[lq] as \[rq], +.BR da , +.BR de , +.BR di , +and +.B ds +requests +(together with their variants) +create a new object only if the name of the macro, +diversion, +or string is currently undefined +or if it is defined as a request; +normally, +they modify the value of an existing object. +. +To remove an alias, +invoke +.B rm +on its name. +. +The object itself is not destroyed until it has no more names. +. +. +.IP +When a request, +macro, +string, +or diversion is aliased, +redefinitions and appendments \[lq]write through\[rq] alias names. +. +To replace an alias with a separately defined object, +you must use the +.B rm +request on its name first. +. +. +.TP +.BI .am1\~ name\~\c +.RI [ end-name ] +As +.RB \[lq] am \[rq], +but compatibility mode is disabled while the appendment to +.I name +is interpreted: +a \[lq]compatibility save\[rq] token is inserted at its beginning, +and a \[lq]compatibility restore\[rq] token at its end. +. +As a consequence, +the requests +.RB \[lq] am \[rq], +.BR am1 , +.BR de , +and +.B de1 +can be intermixed freely since the compatibility save/\:restore tokens +affect only the parts of the macro populated by +.B am1 +and +.BR de1 . +. +. +.TP +.BI .ami\~ name\~\c +.RI [ end-name ] +Append to macro indirectly. +. +See +.B dei +below. +. +. +.TP +.BI .ami1\~ name\~\c +.RI [ end-name ] +As +.BR ami , +but compatibility mode is disabled during interpretation of the +appendment. +. +. +.TP +.BI .as1\~ name\~\c +.RI [ contents ] +As +.RB \[lq] as \[rq], +but compatibility mode is disabled while the appendment to +.I name +is interpreted: +a \[lq]compatibility save\[rq] token is inserted at the beginning of +.IR contents , +and a \[lq]compatibility restore\[rq] token after it. +. +As a consequence, +the requests +.RB \[lq] as \[rq], +.BR as1 , +.BR ds , +and +.B ds1 +can be intermixed freely since the compatibility save/\:restore tokens +affect only the portions of the strings populated by +.B as1 +and +.BR ds1 . +. +. +.TP +.BI .asciify\~ div +.I Unformat +the diversion +.I div +in a way such that Unicode basic Latin (ASCII) characters, +characters translated with the +.B trin +request, +space characters, +and some escape sequences, +that were formatted in the diversion +.I div +are treated like ordinary input characters when +.I div +is reread. +. +Doing so can be useful in conjunction with the +.B writem +request. +. +.B asciify +can be also used for gross hacks; +for example, +the following sets +.RB register\~ n +to\~1. +. +. +.RS +.IP +.EX +.ne 8v+\n(.Vu +\&.tr @. +\&.di x +\&@nr n 1 +\&.br +\&.di +\&.tr @@ +\&.asciify x +\&.x +.EE +.RE +. +. +.IP +.B asciify +cannot return all items in a diversion to their source equivalent: +nodes such as those produced by +.BR \[rs]N[ .\|.\|.\& ] +will remain nodes, +so the result cannot be guaranteed to be a pure string. +. +See section \[lq]Copy mode\[rq] in +.MR groff @MAN7EXT@ . +. +Glyph parameters such as the type face and size are not preserved; +use +.B unformat +to achieve that. +. +. +.TP +.B .backtrace +Write backtrace of input stack to the standard error stream. +. +See the +.B \-b +option of +.MR @g@troff @MAN1EXT@ . +. +. +.TP +.BR .blm\~ [\c +.IR name ] +Set a blank line macro (trap). +. +If a blank line macro is thus defined, +.I groff +executes +.I macro +when a blank line is encountered in the input file, +instead of the usual behavior. +. +A line consisting only of spaces is also treated as blank and subject to +this trap. +. +If no argument is supplied, +the default blank line behavior is (re-)established. +. +. +.TP +.BR .box\~ [\c +.IR name ] +.TQ +.BR .boxa\~ [\c +.IR name ] +Divert +(or append) +output to +.I name, +similarly to the +.B di +and +.B da +requests, +respectively. +. +Any pending output line is +.I not +included in the diversion. +. +Without an argument, +stop diverting output; +any pending output line inside the diversion is discarded. +. +. +.TP +.B .break +Exit a +.RB \[lq] while \[rq] +loop. +. +Do not confuse this request with a typographical break or the +.B br +request. +. +See +.RB \[lq] continue \[rq]. +. +. +.TP +.B .brp +Break and adjust line; +this is the AT&T +.I troff \" AT&T +escape sequence +.B \[rs]p +in request form. +. +. +.TP +.BI .cflags\~ "n c1 c2\~"\c +\&.\|.\|. +Assign properties encoded by the number +.I n +to characters +.IR c1 , +.IR c2 , +and so on. +. +Ordinary and special characters have certain associated properties. +. +(Glyphs don't: +to GNU +.IR troff , \" GNU +like AT&T device-independent +.IR troff , \" AT&T +a glyph is an identifier corresponding to a rectangle with some metrics; +see +.MR groff_font @MAN5EXT@ .) +. +The first argument is the sum of the desired flags and the remaining +arguments are the characters to be assigned those properties. +. +Spaces between the +.I cn +arguments are optional. +. +Any argument +.I cn +can be a character class defined with the +.B class +request rather than an individual character. +. +. +.IP +The non-negative integer +.I n +is the sum of any of the following. +. +Some combinations are nonsensical, +such as +.RB \[lq] 33 \[rq] +(1 + 32). +. +. +.RS +.IP 1 +Recognize the character as ending a sentence if followed by a newline +or two spaces. +. +Initially, +characters +.RB \[lq] .?! \[rq] +have this property. +. +. +.IP 2 +Enable breaks before the character. +. +A line is not broken at a character with this property unless the +characters on each side both have non-zero hyphenation codes. +. +This exception can be overridden by adding 64. +. +Initially, +no characters have this property. +. +. +.IP 4 +Enable breaks after the character. +. +A line is not broken at a character with this property unless the +characters on each side both have non-zero hyphenation codes. +. +This exception can be overridden by adding 64. +. +Initially, +characters +.RB \[lq] \-\[rs][hy]\[rs][em] \^\[rq] +have this property. +. +. +.IP 8 +Mark the glyph associated with this character as overlapping other +instances of itself horizontally. +. +Initially, +characters +.RB \[lq]\^ \[rs][ul]\[rs][rn]\[rs][ru]\[rs][radicalex]\[rs][sqrtex]\ +\& \^\[rq] +have this property. +. +. +.IP 16 +Mark the glyph associated with this character as overlapping other +instances of itself vertically. +. +Initially, +the character +.RB \[lq]\^ \[rs][br] \^\[rq] +has this property. +. +. +.IP 32 +Mark the character as transparent for the purpose of end-of-sentence +recognition. +. +In other words, +an end-of-sentence character followed by any number of characters with +this property is treated as the end of a sentence if followed by a +newline or two spaces. +. +This is the same as having a zero space factor in \*[tx]. +. +Initially, +characters +.\" The following is ordered with the apostrophe and (single) closing +.\" quote on the ends so they are more easily visually distinguished +.\" from the double quotation marks in roman. +.RB \[lq]\| \[aq]\|"\|)]*\[rs][dg]\[rs][dd]\[rs][rq]\[rs]\^[cq] \|\[rq] +have this property. +. +. +.IP 64 +Ignore hyphenation codes of the surrounding characters. +. +Use this value in combination with values 2 and\~4. +. +Initially, +no characters have this property. +. +. +.IP +For example, +if you need an automatic break point after +the en-dash in numeric ranges like \[lq]3000\[en]5000\[rq], +insert +.RS +.RS +.EX +\&.cflags 68 \[rs][en] +.EE +.RE +into your document. +. +However, +this can lead to bad layout if done without thinking; +in most situations, +a better solution than +changing the +.B cflags +value is inserting +.RB \[lq] \[rs]: \[rq] +right after the hyphen at the places that really need a break point. +.RE +. +. +.P +The remaining values were implemented for East Asian language support; +those who use alphabetic scripts exclusively can disregard them. +. +. +.IP 128 +Prohibit a break before the character, +but allow a break after the character. +. +This works only in combination with values 256 and 512 and has no effect +otherwise. +. +Initially, +no characters have this property. +. +. +.IP 256 +Prohibit a break after the character, +but allow a break before the character. +. +This works only in combination with values 128 and 512 and has no effect +otherwise. +. +Initially, +no characters have this property. +. +. +.IP 512 +Allow a break before or after the character. +. +This works only in combination with values 128 and 256 and has no effect +otherwise. +. +Initially, +no characters have this property. +.RE +. +. +.IP +In contrast to values 2 and\~4, +the values 128, +256, +and 512 work +pairwise. +. +If, +for example, +the left character has value 512, +and the right character 128, +no break will be automatically inserted between them. +. +If we use value\~6 instead for the left character, +a break after the character can't be suppressed since the neighboring +character on the right doesn't get examined. +. +. +.TP +.BI .char\~ "c contents" +Define the ordinary or special +.RI character\~ c +as +.IR contents , +which can be empty. +. +More precisely, +.B char +defines a +.I groff +object +(or redefines an existing one) +that is accessed with the +.RI name\~ c +on input, +and produces +.I contents +on output. +. +Every time +.I c +is to be formatted, +.I contents +is processed in a temporary environment and the result is wrapped up +into a single object. +. +Compatibility mode is turned off and the escape character is +set +.RB to\~ \[rs] +while +.I contents +is processed. +. +Any emboldening, +constant spacing, +or track kerning is applied to this object as a whole, +not to each character in +.IR contents . +. +. +.IP +An object defined by this request can be used just like a glyph +provided by the output device. +. +In particular, +other characters can be translated to it with the +.B tr +request; +it can be made the tab or leader fill character with the +.B tc +and +.B lc +requests; +sequences of it can be drawn with the +.B \[rs]l +and +.B \[rs]L +escape sequences; +and, +if the +.B hcode +request is used on +.IR c , +it is subject to automatic hyphenation. +. +. +.IP +To prevent infinite recursion, +occurrences of +.I c +within its own definition are treated normally +(as if it were not being defined with +.BR char ). +. +The +.B tr +and +.B trin +requests take precedence if +.B char +both apply +.RI to\~ c . +. +A character definition can be removed with the +.B rchar +request. +. +. +.TP +.BI .chop\~ object +Remove the last character from the macro, +string, +or diversion +.IR object . +. +This is useful for removing the newline from the end of a diversion that +is to be interpolated as a string. +. +This request can be used repeatedly on the same +.IR object ; +see section \[lq]gtroff Internals\[rq] in +.IR "Groff: The GNU Implementation of troff" , +the +.I groff +Texinfo manual, +for discussion of nodes inserted by +.IR groff . +. +. +.TP +.BI .class\~ "name c1 c2\~"\c +\&.\|.\|. +Define a character class +(or simply \[lq]class\[rq]) +.I name +comprising the characters or range expressions +.IR c1 , +.IR c2 , +and so on. +. +. +.IP +A class thus defined can then be referred to in lieu of listing all the +characters within it. +. +Currently, +only the +.B cflags +request can handle references to character classes. +. +. +.IP +In the request's simplest form, +each +.I cn +is a character +(or special character). +. +.RS +.RS +.EX +\&.class [quotes] \[aq] \[rs][aq] \[rs][dq] \[rs][oq] \[rs][cq] \ +\[rs][lq] \[rs][rq] +.EE +.RE +.RE +. +. +.IP +Since class and special character names share the same name space, +we recommend starting and ending the class name with +.RB \[lq] [ \[rq] +and +.RB \[lq] ] \[rq], +respectively, +to avoid collisions with existing character names defined by +.I groff +or the user +(with +.B char +and related requests). +. +This practice applies the presence of +.RB \[lq] ] \[rq] +in the class name to prevent the usage of the special character escape +form +.RB \[lq] \[rs][ .\|.\|. ] \[rq], +thus you must use the +.B \[rs]C +escape to access a class with such a name. +. +. +.IP +You can also use a character range expression consisting of a start +character followed by +.RB \[lq] \- \[rq] +and then an end character. +. +Internally, +GNU +.I troff \" GNU +converts these two character names to Unicode code points +(according to the +.I groff +glyph list [GGL]), +which determine the start and end values of the range. +. +If that fails, +the class definition is skipped. +. +Furthermore, +classes can be nested. +. +.RS +.RS +.EX +\&.class [prepunct] , : ; > } +\&.class [prepunctx] \[rs]C\[aq][prepunct]\[aq] \ +\[rs][u2013]\-\[rs][u2016] +.EE +.RE +The class +.RB \[lq] [prepunctx] \[rq] +thus contains the contents of the class +.RB \[lq] [prepunct] \[rq] +and characters in the range U+2013\[en]U+2016. +.RE +. +. +.IP +If you want to include +.RB \[lq] \- \[rq] +in a class, +it must be the first character value in the argument list, +otherwise it gets misinterpreted as part of the range syntax. +. +. +.IP +It is not possible to use class names as end points of range +definitions. +. +. +.IP +A typical use of the +.B class +request is to control line-breaking and hyphenation rules as defined by +the +.B cflags +request. +. +For example, +to inhibit line breaks before the characters belonging to the +.RB \[lq] [prepunctx] \[rq] +class defined in the previous example, +you can write the following. +. +.RS +.RS +.EX +\&.cflags 2 \[rs]C\[aq][prepunctx]\[aq] +.EE +.RE +.RE +. +. +.TP +.BI .close\~ stream +Close the stream named +.IR stream , +invalidating it as an argument to the +.B write +request. +. +See +.BR open . +. +. +.TP +.BI .composite\~ c1\~c2 +Map character name +.I c1 +to character name +.I c2 +when +.I c1 +is a combining component in a composite glyph. +. +Typically, +this remaps a spacing glyph to a combining one. +. +. +.TP +.B .continue +Skip the remainder of a +.RB \[lq] while \[rq] +loop's body, +immediately starting the next iteration. +. +See +.BR break . +. +. +.TP +.BI .color\~ n +If +.I n +is non-zero or missing, +enable colors +(the default), +otherwise disable them. +. +. +.TP +.BI .cp\~ n +If +.I n +is non-zero or missing, +enable compatibility mode, +otherwise disable it. +. +In compatibility mode, +long names are not recognized, +and the incompatibilities they cause do not arise. +. +. +.TP +.BI .defcolor\~ "ident scheme color-component\~\c" +\&.\|.\|. +Define a color named +.I ident. +. +.I scheme +identifies a color space and determines the number of required +.IR color-component s; +it must be one of +.RB \[lq] rgb \[rq] +(three components), +.RB \[lq] cmy \[rq] +(three components), +.RB \[lq] cmyk \[rq] +(four components), +or +.RB \[lq] gray \[rq] +(one component). +. +.RB \[lq] grey \[rq] +is accepted as a synonym of +.RB \[lq] gray \[rq]. +. +The color components can be encoded as a hexadecimal value starting +with +.B # +or +.BR ## . +. +The former indicates that each component is in the range 0\[en]255 +(0\[en]FF), +the latter the range 0\[en]65535 (0\[en]FFFF). +. +Alternatively, +each color component can be specified as a decimal fraction in the range +0\[en]1, +interpreted using a default scaling unit +.RB of\~\[lq] f \[rq], +which multiplies its value by 65,536 +(but clamps it at 65,535). +. +. +.IP +Each output device has a color named +.RB \[lq] default \[rq], +which cannot be redefined. +. +A device's default stroke and fill colors are not necessarily the same. +. +. +.TP +.BI .de1\~ name\~\c +.RI [ end-name ] +Define a macro to be interpreted with compatibility mode disabled. +. +When +.I name +is called, +compatibility mode enablement status is saved; +it is restored when the call completes. +. +. +.TP +.BI .dei\~ name\~\c +.RI [ end-name ] +Define macro indirectly, +with the name of the macro to be defined in string +.I name +and the name of the end macro terminating its definition in string +.IR end-name . +. +. +.TP +.BI .dei1\~ name\~\c +.RI [ end-name ] +As +.BR dei , +but compatibility mode is disabled while the definition of the macro +named in string +.I name +is interpreted. +. +. +.TP +.BI .device\~ anything +Write +.IR anything , +read in copy mode, +to +.I @g@troff +output as a device control command. +. +An initial neutral double quote is stripped to allow the embedding of +leading spaces. +. +. +.TP +.BI .devicem\~ name +Write contents of macro or string +.I name +to +.I @g@troff +output as a device control command. +. +. +.TP +.BI .do\~ name\~\c +.RI [ arg \~.\|.\|.] +Interpret the string, +request, +diversion, +or macro +.I name +(along with any arguments) +with compatibility mode disabled. +. +Compatibility mode is restored +(only if it was active) +when the +.I expansion +of +.I name +is interpreted; +that is, +the restored compatibility state applies to the contents of the macro, +string, +or diversion +.I name +as well as data read from files or pipes if +.I name +is any of the +.BR so , +.BR soquiet , +.BR mso , +.BR msoquiet , +or +.B pso +requests. +. +. +.IP +For example, +.RS +.RS \" one "extra" RS to get us inboard of this indented paragraph +.EX +\&.de mac1 +FOO +\&.. +\&.de1 mac2 +groff +\&.mac1 +\&.. +\&.de mac3 +compatibility +\&.mac1 +\&.. +\&.de ma +\[rs]\[rs]$1 +\&.. +\&.cp 1 +\&.do mac1 +\&.do mac2 \[rs]" mac2, defined with .de1, calls "mac1" +\&.do mac3 \[rs]" mac3 calls "ma" with argument "c1" +\&.do mac3 \[rs][ti] \[rs]" groff syntax accepted in .do arguments +.EE +.RE +results in +.RS +.EX +FOO groff FOO compatibility c1 \[ti] +.EE +.RE +as output. +.RE \" this "extra" RE avoids indentation of the remaining paragraphs +. +. +.TP +.BI .ds1\~ "name contents" +As +.BR ds , +but compatibility mode is disabled while +.I name +is interpreted: +a \[lq]compatibility save\[rq] token is inserted at the beginning of +.IR contents , +and a \[lq]compatibility restore\[rq] token after it. +. +. +.TP +.B .ecr +Restore the escape character saved with +.BR ecs , +or set escape character to +.RB \[lq]\| \[rs] \[rq] +if none has been saved. +. +. +.TP +.B .ecs +Save the current escape character. +. +. +.TP +.BI .evc\~ env +Copy the properties of environment +.I env +to the current environment, +except for the following data. +. +. +.RS +.IP \[bu] 2n +a partially collected line, +if present; +. +. +.IP \[bu] +the interruption status of the previous input line +(due to use of the +.B \[rs]c +escape sequence); +. +. +.IP \[bu] +the count of remaining lines to center, +to right-justify, +or to underline +(with or without underlined spaces)\[em]these are set to zero; +. +. +.IP \[bu] +the activation status of temporary indentation; +. +. +.IP \[bu] +input traps and their associated data; +. +. +.IP \[bu] +the activation status of line numbering +(which can be reactivated with +.RB \[lq] .nm\~+0 \[rq]); +and +. +. +.IP \[bu] +the count of consecutive hyphenated lines +(set to zero). +.RE +. +. +.TP +.BR .fam\~ [\c +.IR family ] +Set default font family to +.IR family . +. +If no argument is given, +the previous font family is selected, +or the formatter's default family if there is none. +. +The formatter's default font family is \[lq]T\[rq] (Times), +but it can be overridden by the output device\[em]see +.MR groff_font @MAN5EXT@ . +. +The default font family is associated with the environment. +. +See +.BR \[rs]F . +. +. +.TP +.BI .fchar\~ c\~contents +Define fallback +.RI character\~ c +as +.IR contents . +. +The syntax of this request is the same as the +.B char +request; +the difference is that a character defined with +.B char +hides a glyph with the same name in the selected font, +whereas characters defined with +.B fchar +are checked only if +.I c +isn't found in the selected font. +. +This test happens before special fonts are searched. +. +. +.TP +.BI .fcolor\~ color +Set the fill color to +.IR color . +. +Without an argument, +the previous fill color is selected. +. +. +.TP +.BI .fschar\~ f\~c\~contents +Define fallback special +.RI character\~ c +for font\~\c +.I f +as +.IR contents . +. +A character defined by +.B fschar +is located after the list of fonts declared with +.B \%fspecial +is searched but before those declared with the +.RB \%\[lq] special \[rq] +request. +. +.TP +.BI .fspecial\~ "f s1 s2\~"\c +\&.\|.\|. +When +.RI font\~ f +is selected, +fonts +.IR s1 , +.IR s2 , +\&.\|.\|.\& +are treated as special; +that is, +they are searched for glyphs not found in +.IR f . +. +Any fonts specified in the +.RB \%\[lq] special \[rq] +request are searched after +.IR s1 , +.IR s2 , +and so on. +. +Without +.I s +arguments, +.B \%fspecial +clears the list of fonts treated as special when +.I f +is selected. +. +. +.TP +.BI .ftr\~ f\~g +Translate +.RI font\~ f +.RI to\~ g . +. +Whenever a font +.RI named\~ f +is referred to in an +.B \[rs]f +escape sequence, +in the +.B F +and +.B S +conditional expression operators, +or in the +.BR ft , +.BR ul , +.BR bd , +.BR cs , +.BR tkf , +.BR \%special , +.BR \%fspecial , +.BR fp , +or +.B sty +requests, +.RI font\~ g +is used. +If +.I g +is missing or identical +.RI to\~ f , +then +.RI font\~ f +is not translated. +. +. +.TP +.BI .fzoom\~ f\~zoom +Set zoom factor +.I zoom +for font\~\c +.IR f . +.I zoom +must a non-negative integer multiple of 1/1000th. +. +If it is missing or is equal to zero, +it means the same as 1000, +namely no magnification. +. +.IR f \~\c +must be a resolved font name, +not an abstract style. +.\" XXX: What about a mounting position? It's not rejected... +. +. +.TP +.BI .gcolor\~ color +Set the stroke color to +.IR color . +. +Without an argument, +the previous stroke color is selected. +. +. +.TP +.BI .hcode\~ "c1 code1\~"\c +.RI [ "c2 code2" "] .\|.\|." +Set the hyphenation code of character +.I c1 +to +.IR code1 , +that of +.I c2 +to +.IR code2 , +and so on. +. +A hyphenation code must be an ordinary character +(not a special character escape sequence) +other than a digit. +. +The request is ignored if given no arguments. +. +. +.IP +For hyphenation to work, +hyphenation codes must be set up. +. +At startup, +.I groff +assigns hyphenation codes to the letters \[lq]a\[en]z\[rq] +(mapped to themselves), +to the letters \[lq]A\[en]Z\[rq] +(mapped to \[lq]a\[en]z\[rq]), +and zero to all other characters. +. +Normally, +hyphenation patterns contain only lowercase letters which should be +applied regardless of case. +. +In other words, +they assume that the words \[lq]ABBOT\[rq] and \[lq]Abbot\[rq] should be +hyphenated exactly as \[lq]abbot\[rq] is. +. +.B hcode +extends this principle to letters outside the Unicode basic Latin +alphabet; +without it, +words containing such letters won't be hyphenated properly even if the +corresponding hyphenation patterns contain them. +. +. +.TP +.BI .hla\~ lang +Set the hyphenation language to +.IR lang . +. +Hyphenation exceptions specified with the +.B hw +request and hyphenation patterns and exceptions specified with the +.B hpf +and +.B hpfa +requests are associated with the hyphenation language. +. +The +.B hla +request is usually invoked by a localization file, +which is in turn loaded by the +.I troffrc +or +.I troffrc\-end +file; +see the +.B hpf +request below. +. +The hyphenation language is associated with the environment. +. +. +.TP +.BR .hlm\~ [\c +.IR n ] +Set the maximum number of consecutive hyphenated lines +.RI to\~ n . +. +If +.I n +is negative, +there is no maximum. +. +If omitted, +.I n +is\~\-1. +. +This value is associated with the environment. +. +Only lines output from a given environment count towards the maximum +associated with that environment. +. +Hyphens resulting from +.B \[rs]% +are counted; +explicit hyphens are not. +. +. +.TP +.BI .hpf\~ pattern-file +Read hyphenation patterns from +.IR pattern-file . +. +This file is sought in the same way that macro files are with the +.B mso +request or the +.BI \-m name +command-line option to +.MR groff @MAN1EXT@ +and +.MR @g@troff @MAN1EXT@ . +. +. +.IP +The +.I pattern-file +should have the same format as (simple) \*[tx] pattern files. +. +The following scanning rules are implemented. +. +. +.RS +.IP \[bu] 2n +A percent sign starts a comment +(up to the end of the line) +even if preceded by a backslash. +. +. +.IP \[bu] +\[lq]Digraphs\[rq] like +.B \[rs]$ +are not supported. +. +. +.IP \[bu] +.RB \[lq] \[ha]\[ha]\c +.IR xx \[rq] +(where each +.I x +is 0\[en]9 or a\[en]f) and +.BI \[ha]\[ha] c +.RI (character\~ c +in the code point range 0\[en]127 decimal) +are recognized; +other uses +.RB of\~ \[ha] +cause an error. +. +. +.IP \[bu] +No macro expansion is performed. +. +. +.IP \[bu] +.B hpf +checks for the expression +.BR \[rs]patterns{ .\|.\|. } +(possibly with whitespace before or after the braces). +. +Everything between the braces is taken as hyphenation patterns. +. +Consequently, +.RB \[lq] { \[rq] +and +.RB \[lq] } \[rq] +are not allowed in patterns. +. +. +.IP \[bu] +Similarly, +.BR \[rs]hyphenation{ .\|.\|. } +gives a list of hyphenation exceptions. +. +. +.IP \[bu] +.B \[rs]endinput +is recognized also. +. +. +.IP \[bu] +For backwards compatibility, +if +.B \[rs]patterns +is missing, +the whole file is treated as a list of hyphenation patterns +(but the +.RB \[lq] % \[rq] +character is still recognized as the start of a comment). +.RE +. +. +.IP +Use the +.B hpfcode +request +(see below) +to map the encoding used in hyphenation pattern files to +.IR groff 's +input encoding. +. +. +.IP +The set of hyphenation patterns is associated with the hyphenation +language set by the +.B hla +request. +. +The +.B hpf +request is usually invoked by a localization file loaded by the +.I troffrc +file. +. +By default, +.I troffrc +loads the localization file for English. +. +(As of +.I groff +1.23.0, +localization files for Czech +.RI ( cs ), +German +.RI ( de ), +English +.RI ( en ), +French +.RI ( fr ), +Japanese +.RI ( ja ), +Swedish +.RI ( sv ), +and Chinese +.RI ( zh ) +exist.) +. +For Western languages, +the localization file sets the hyphenation mode and loads hyphenation +patterns and exceptions. +. +. +.IP +A second call to +.B hpf +(for the same language) +replaces the old patterns with the new ones. +. +. +.IP +Invoking +.B hpf +causes an error if there is no hyphenation language. +. +. +.IP +If no +.B hpf +request is specified +(either in the document, +in a file loaded at startup, +or in a macro package), +GNU +.I troff \" GNU +won't automatically hyphenate at all. +. +. +.TP +.BI .hpfa\~ pattern-file +As +.BR hpf , +except that the hyphenation patterns and exceptions from +.I pattern-file +are appended to the patterns already applied to the hyphenation language +of the environment. +. +. +.TP +.BI .hpfcode\~ "a b"\c +.RI \~[ "c d" "] .\|.\|." +Define mapping values for character codes in pattern files. +. +This is an older mechanism no longer used by +.IR groff 's +own macro files; +for its successor, +see +.B hcode +above. +. +.B hpf +or +.B hpfa +apply the mapping +after reading or appending to the active list of patterns. +. +Its arguments are pairs of character codes\[em]integers from 0 to\~255. +. +The request maps character +.RI code\~ a +to +.RI code\~ b , +.RI code\~ c +to +.RI code\~ d , +and so on. +. +Character codes that would otherwise be invalid in +.I groff +can be used. +. +By default, +every code maps to itself except those for letters \[lq]A\[rq] to +\[lq]Z\[rq], +which map to those for \[lq]a\[rq] to \[lq]z\[rq]. +. +. +.TP +.BR .hym\~ [\c +.IR length ] +Set the (right) hyphenation margin +.RI to\~ length . +. +If the adjustment mode is not +.RB \[lq] b \[rq] +or +.RB \[lq] n \[rq], +the line is not hyphenated if it is shorter than +.IR length . +. +Without an argument, +the default hyphenation margin is reset to its default value, +0. +. +The default scaling unit +.RB is\~\[lq] m \[rq]. +. +The hyphenation margin is associated with the environment. +. +A negative argument resets the hyphenation margin to zero, +emitting a warning in category +.RB \[lq] range \[rq]. +. +. +.TP +.BR .hys\~ [\c +.IR hyphenation-space ] +Suppress hyphenation of the line in adjustment modes +.RB \[lq] b \[rq] +or +.RB \[lq] n \[rq], +if it can be justified by adding no more than +.I hyphenation-space +extra space to each inter-word space. +. +Without an argument, +the hyphenation space adjustment threshold is set to its default value, +0. +. +The default scaling unit +.RB is\~\[lq] m \[rq]. +. +The hyphenation space adjustment threshold is associated with the +current environment. +. +A negative argument resets the hyphenation space adjustment threshold to +zero, +emitting a warning in category +.RB \[lq] range \[rq]. +. +. +.TP +.BI .itc\~ n\~name +As +.RB \[lq] it \[rq], +but lines interrupted with the +.B \[rs]c +escape sequence are not applied to the line count. +. +. +.TP +.BI .kern\~ n +If +.I n +is non-zero or missing, +enable pairwise kerning +(the default), +otherwise disable it. +. +. +.TP +.BI .length\~ "reg anything" +Compute the number of characters in +.I anything +and return the count in the register +.IR reg . +. +If +.I reg +doesn't exist, +it is created. +. +.I anything +is read in copy mode. +. +. +.RS +.IP +.EX +.B .ds xxx abcd\eh\[aq]3i\[aq]efgh +.B .length yyy \e*[xxx] +.B \en[yyy] +14 +.EE +.RE +. +. +.TP +.BI .linetabs\~ n +.RS +If +.I n +is non-zero or missing, +enable line-tabs mode, +otherwise disable it +(the default). +. +In this mode, +tab stops are computed relative to the start of the pending output line, +instead of the drawing position corresponding to the start of the input +line. +. +Line-tabs mode is a property of the environment. +. +. +.P +For example, +the following +. +. +.RS +.P +.ne 6v+\n(.Vu +.EX +\&.ds x a\[rs]t\[rs]c +\&.ds y b\[rs]t\[rs]c +\&.ds z c +\&.ta 1i 3i +\&\[rs]*x +\&\[rs]*y +\&\[rs]*z +.EE +.RE +. +yields +. +.RS +.EX +a b c +.EE +.RE +. +whereas in line-tabs mode, +the same input gives +. +.RS +.EX +a b c +.EE +.RE +. +instead. +.RE +. +. +.TP +.BR .lsm\~ [\c +.IR name ] +Set the leading space macro (trap) to +.IR name . +. +If there are leading space characters on an input line, +.I name +is invoked in lieu of the usual +.I roff +behavior; +the leading spaces are removed. +. +The count of leading spaces on an input line is stored in +.BR \[rs]n[lsn] , +and the amount of corresponding horizontal motion in +.BR \[rs]n[lss] , +irrespective of whether a leading space trap is set. +. +When it is, +the leading spaces are removed from the input line, +and no motion is produced before calling +.IR name . +. +If no argument is supplied, +the default leading space behavior is (re-)established. +. +. +.TP +.BI .mso\~ file +As +.RB \[lq] so \[rq], +except that +.I file +is sought in the same directories as arguments to the +.MR groff @MAN1EXT@ +and +.MR @g@troff @MAN1EXT@ +.B \-m +command-line option are +(the \[lq]tmac path\[rq]). +. +If the file name to be interpolated has the form +.IB name .tmac +and it isn't found, +.B mso +tries to include +.BI tmac. name +instead and vice versa. +. +If +.I file +does not exist, +a warning in category +.RB \[lq] file \[rq] +is emitted +and the request has no other effect. +. +. +.TP +.BI .msoquiet\~ file +As +.BR mso , +but no warning is emitted if +.I file +does not exist. +. +. +.TP +.BI .nop \~anything +Interpret +.I anything +as if it were an input line. +. +.B nop +resembles +.RB \[lq] ".if 1" \[rq]; +it puts a break on the output if +.I anything +is empty. +. +Unlike +.RB \[lq]\| if \|\[rq], +it cannot govern conditional blocks. +. +Its application is to maintain consistent indentation within macro +definitions even when producing text lines. +. +. +.TP +.B .nroff +Make the +.B n +conditional expression evaluate true and +.B t +false. +. +See +.BR troff . +. +. +.TP +.BI .open\~ "stream file" +Open +.I file +for writing and associate +.I stream +with it. +. +See +.B write +and +.BR close . +. +. +.TP +.BI .opena\~ "stream file" +As +.BR open , +but if +.I file +exists, +append to it instead of truncating it. +. +. +.TP +.BI .output\~ contents +Emit +.IR contents , +which are read in copy mode, +to the formatter output; +this is similar to +.B \[rs]!\& +used in the top-level diversion. +. +An initial neutral double quote in +.I contents +is stripped to allow the embedding of leading spaces. +.\" XXX: useless request warning if no argument? +. +. +.TP +.B .pev +Report the state of the current environment followed by that of all +other environments to the standard error stream. +. +. +.TP +.B .pnr +Write the names and values of all currently defined registers to the +standard error stream. +. +. +.TP +.BI .psbb \~file +Get the bounding box of a PostScript image +.IR file . +. +This file must conform to Adobe's Document Structuring Conventions; +the request attempts to extract the bounding box values from a +.B \%%%BoundingBox +comment. +. +After invocation, +the +.I x +and +.I y +coordinates +(in PostScript units) +of the lower left and upper right corners can be found in the registers +.BR \[rs]n[llx] , +.BR \[rs]n[lly] , +.BR \[rs]n[urx] , +and +.BR \[rs]n[ury] , +respectively. +. +If an error occurs, +these four registers are set to zero. +. +. +.TP +.BI .pso \~command +As +.RB \[lq] so \[rq], +except that input comes from the standard output stream of +.IR command . +. +. +.TP +.B .ptr +Report the names and vertical positions of all page location traps +to the standard error stream. +. +Empty slots in the list are shown as well, +because they can affect the visibility of subsequently planted traps. +. +. +.TP +.BI .pvs \~\[+-]n +Set the post-vertical line spacing +.RI to\~ n ; +default scaling unit +.RB is\~\[lq] p \[rq]. +. +With no argument, +the post-vertical line space is set to its previous value. +. +. +.IP +In GNU +.IR troff , \" GNU +the distance between text baselines consists of the extra pre-vertical +line spacing set by the most negative +.B \[rs]x +argument on the pending output line, +the vertical spacing +.RB ( vs ), +the extra post-vertical line spacing set by the most positive +.B \[rs]x +argument on the pending output line, +and the post-vertical line spacing set by this request. +. +. +.TP +.BI .rchar\~ c\~\c +\&.\|.\|. +Remove definition of each ordinary or special character +.IR c , +undoing the effect of a +.BR char , +.BR fchar , +or +.B schar +request. +. +Glyphs, +which are defined by font description files, +cannot be removed. +. +Spaces and tabs may separate +.I c +arguments. +. +. +.TP +.B .return +Within a macro, +return immediately. +. +If called with an argument, +return twice, +namely from the current macro and from the macro one level higher. +. +No effect otherwise. +.\" XXX: useless request warning? +. +. +.TP +.BI .rfschar\~ "f c\~"\c +\&.\|.\|. +Remove each fallback special +.RI character\~ c +for font +.IR f . +. +Spaces and tabs may separate +.I c +arguments. +. +See +.BR fschar . +. +. +.TP +.BR .rj\~ [\c +.IR n ] +Right-align the +.RI next\~ n +input lines. +. +Without an argument, +right-align the next input line. +. +.B rj +implies +.RB \[lq] ".ce 0" \[rq], +and +.B ce +implies +.RB \[lq] ".rj 0" \[rq]. +. +. +.TP +.BI .rnn \~r1\~r2 +Rename register +.I r1 +to +.IR r2 . +. +If +.I r1 +doesn't exist, +the request is ignored. +. +. +.TP +.BI .schar\~ c\~contents +Define global fallback character +.I c +as +.IR contents . +. +See +.BR char ; +the distinction is that a character defined with +.B schar +is located after the list of fonts declared with the +.B \%special +request but before any mounted special fonts. +. +. +.TP +.BR .shc \~\c +.RI [ c ] +Set the soft hyphen character, +inserted when a word is hyphenated automatically or at a hyphenation +character, +.RI to\~ c . +. +If +.I c +is omitted, +the soft hyphen character is set to the default, +.BR \[rs][hy] . +. +If the selected glyph does not exist in the font in use at a potential +hyphenation point, +then the line is not broken at that point. +. +Neither character definitions +.RB ( char +and similar) +nor translations +.RB ( tr +and similar) +are considered when assigning the soft hyphen character. +. +. +.TP +.BI .shift\~ n +In a macro, +shift the arguments by +.I n +positions: +.RI argument\~ i +becomes argument +.IR i \|\-\| n ; +arguments 1 +.RI to\~ n +are no longer available. +. +.RI If\~ n +is missing, +arguments are shifted by\~1. +. +No effect otherwise. +.\" XXX: useless request warning? +. +. +.TP +.BI .sizes\~ "s1 s2\~"\c +.RI .\|.\|.\~ sn\~\c +.RB [ 0 ] +Set the available type sizes to +.IR s1 , +.IR s2 , +\&.\|.\|.\& +.I sn +scaled points. +. +The list of sizes can be terminated by an +.RB optional\~\[lq] 0 \[rq]. +. +Each +.I si +can also be a range +.IR m \(en n . +. +In contrast to the device description file directive of the same name +(see +.MR groff_font @MAN5EXT@ ), +the argument list can't extend over more than one line. +. +. +.TP +.BI .soquiet\~ file +As +.RB \[lq] so \[rq], +but no warning is emitted if +.I file +does not exist. +. +. +.TP +.BI .special\~ f\~\c +\&.\|.\|. +Declare each font +.I f +as special, +searching it for glyphs not found in the selected font. +. +Without arguments, +this list of special fonts is made empty. +. +. +.TP +.BR .spreadwarn\~ [\c +.IR limit ] +Emit a +.B break +warning if the additional space inserted for each space between words in +an output line adjusted to both margins with +.RB \[lq] .ad\~b \[rq] +is larger than or equal to +.IR limit . +. +A negative value is treated as zero; +an absent argument toggles the warning on and off without changing +.IR limit . +. +The default scaling unit is +.BR m . +. +At startup, +.B spreadwarn +is inactive and +.I limit +is 3\~m. +. +. +.IP +For example, +.RB \[lq] ".spreadwarn 0.2m" \[rq] +causes a warning if +.B break +warnings are not suppressed and +.I @g@troff +must add 0.2\~m or more for each inter-word space in a line. +. +. +.TP +.BI .stringdown \~str +.TQ +.BI .stringup \~str +Alter the string named +.I str +by replacing each of its bytes with its +lowercase +.RB ( down ) +or uppercase +.RB ( up ) +version +(if one exists). +. +Special characters +(see +.MR groff_char @MAN7EXT@ ) +will often transform in the expected way due to the regular naming +convention for accented characters. +. +When they do not, +use substrings and/or catenation. +. +. +.IP +.RS +.RS +.EX +.B .ds resume R\e[\[aq]e]sum\e[\[aq]e]\e" +.B \e*[resume] +.B .stringdown resume +.B \e*[resume] +.B .stringup resume +.B \e*[resume] +R\['e]sum\['e] r\['e]sum\['e] R\['E]SUM\['E] +.EE +.RE +.RE +. +. +.TP +.BI .sty\~ n\~s +Associate abstract +.RI style\~ s +with font mounting +.RI position\~ n . +. +. +.TP +.BI .substring\~ "string start\~"\c +.RI [ end ] +Replace the string named +.I string +with its substring bounded by the indices +.I start +and +.IR end , +inclusively. +. +The first character in the string has index\~0. +. +If +.I end +is omitted, +it is implicitly set to the largest valid value +(the string length minus one). +. +Negative indices count backwards from the end of the string: +the last character has index\~\-1, +the character before the last has index\~\-2, +and so on. +. +. +.RS +.IP +.EX +.B .ds xxx abcdefgh +.B .substring xxx 1 \-4 +.B \e*[xxx] +bcde +.B .substring xxx 2 +.B \e*[xxx] +de +.EE +.RE +. +. +.TP +.BI .tkf\~ f\~s1\~n1\~s2\~n2 +Enable track kerning for font\~\c +.IR f . +When the current font is\~\c +.I f +the width of every glyph is increased by an amount between +.I n1 +and +.IR n2 ; +when the current type size is less than or equal to +.I s1 +the width is increased by +.IR n1 ; +when it is greater than or equal to +.I s2 +the width is increased by +.IR n2 ; +when the type size is greater than or equal to +.I s1 +and less than or equal to +.I s2 +the increase in width is a linear function of the type size. +. +. +.TP +.BI .tm1\~ message +As +.B tm +request, +but strips a leading neutral double quote from +.I message +to allow the embedding of leading spaces. +. +. +.TP +.BI .tmc\~ message +As +.B tm1 +request, +but does not append a newline. +. +. +.TP +.BI .trf\~ file +Transparently output the contents of file +.IR file . +. +Each line is output as if preceded by +.BR \[rs]! ; +however, +the lines are not subject to copy-mode interpretation. +. +If the file does not end with a newline, +then a newline is added. +. +Unlike +.BR cf , +.I file +cannot contain characters +that are invalid as input to GNU +.IR troff . \" GNU +. +. +.IP +For example, +you can define a macro\~\c +.I x +containing the contents of file\~\c +.IR f , +using +. +. +.RS +.IP +.ne 2v+\n(.Vu +.EX +\&.di x +\&.trf f +\&.di +.EE +.RE +. +. +.TP +.BI .trin\~ abcd +This is the same as the +.B tr +request except that the +.B asciify +request uses the character code +(if any) +before the character translation. +. +Example: +. +. +.RS +.IP +.EX +\&.trin ax +\&.di xxx +\&a +\&.br +\&.di +\&.xxx +\&.trin aa +\&.asciify xxx +\&.xxx +.EE +.RE +. +. +.IP +The result is \[lq]x\~a\[rq]. +. +Using +.BR tr , +the result would be \[lq]x\~x\[rq]. +. +. +.TP +.BI .trnt\~ abcd +This is the same as the +.B tr +request except that the translations do not apply to text that is +transparently throughput into a diversion with +.BR \[rs]! . +For example, +. +. +.RS +.IP +.EX +\&.tr ab +\&.di x +\&\[rs]!.tm a +\&.di +\&.x +.EE +.RE +. +. +.IP +prints\~\c +.BR b ; +if +.B trnt +is used instead of +.B tr +it prints\~\c +.BR a . +. +. +.TP +.B .troff +Make the +.B t +conditional expression evaluate true and +.B n +false. +. +See +.BR nroff . +. +. +.TP +.BI .unformat\~ div +Unformat the diversion +.IR div . +. +Unlike +.BR asciify , +.B unformat +handles only tabs and spaces between words, +the latter usually arising from spaces or newlines in the input. +. +Tabs are treated as input tokens, +and spaces become adjustable again. +. +The vertical sizes of lines are not preserved, +but glyph information +(font, +type size, +space width, +and so on) +is retained. +. +. +.TP +.BI .vpt\~ n +If +.I n +is non-zero or missing, +enable vertical position traps +(the default), +otherwise disable them. +. +Vertical position traps are those set by the +.BR ch , +.BR wh , +and +.B dt +requests. +. +. +.TP +.BR .warn\~ [\c +.IR n ] +Select the categories, +or \[lq]types\[rq], +of reported warnings. +. +.IR n \~is +the sum of the numeric codes associated with each warning category that +is to be enabled; +all other categories are disabled. +. +The categories and their associated codes are listed in section +\[lq]Warnings\[rq] of +.MR @g@troff @MAN1EXT@ . +.\" TODO: Maybe move that table to groff(7). +. +For example, +.RB \[lq] ".warn 0" \[rq] +disables all warnings, +and +.RB \[lq] ".warn 1" \[rq] +disables all warnings except those about missing glyphs. +. +If no argument is given, +all warning categories are enabled. +. +. +.TP +.BI .warnscale\~ si +Set the scaling unit used in warnings to +.IR si . +. +Valid values for +.I si +are +.BR u , +.B i +(the default), +.BR c , +.BR p , +.RB and\~ P . +. +. +.TP +.BI .while \~cond-expr\~anything +Evaluate the conditional expression +.IR cond-expr , +and repeatedly execute +.I anything +unless and until +.I cond-expr +evaluates false. +. +.I anything, +which is often a conditional block, +is referred to as the +.B while +request's +.I body. +. +. +.IP +.I @g@troff +treats the body of a +.B while +request similarly to that of a +.B de +request +(albeit one not read in copy mode), +but stores it under an internal name and deletes it when the loop +finishes. +. +The operation of a macro containing a +.B while +request can slow significantly if the +.B while +body is large. +. +Each time the macro is executed, +the +.B while +body is parsed and stored again. +. +An often better solution\[em]and one that is more portable, +since AT&T +.I troff \" AT&T +lacked the +.B while +request\[em]is to instead write a recursive macro. +. +It will be parsed only once (unless you redefine it). +. +To prevent infinite loops, +the default number of available recursion levels is 1,000 or somewhat +less (because things other than macro calls can be on the input stack). +. +You can disable this protective measure, +or raise the limit, +by setting the +.B slimit +register. +. +See section \[lq]Debugging\[rq] below. +. +. +.IP +If a +.B while +body begins with a conditional block, +its closing brace must end an input line. +. +. +.IP +The +.B break +and +.B continue +requests alter a +.B while +loop's flow of control. +. +. +.TP +.BI .write\~ stream\~anything +Write +.I anything +to +.IR stream , +which must previously have been the subject of an +.B open +request, +followed by a newline. +. +.I anything +is read in copy mode. +. +An initial neutral double quote in +.I anything +is stripped to allow the embedding of leading spaces. +. +. +.TP +.BI .writec\~ stream\~anything +As +.BR write , +but without a trailing newline. +. +. +.TP +.BI .writem\~ "stream name" +Write the contents of the macro or string +.I name +to +.IR stream , +which must previously have been the subject of an +.B open +request. +. +.I name +is read in copy mode. +. +. +.br +.ne 6v +.\" ==================================================================== +.SS "Extended requests" +.\" ==================================================================== +. +.\" XXX: .cf might better belong in "Implementation differences". +.TP +.BI .cf\~ file +In a diversion, +embed an object which, +when reread, +will cause the contents of +.I file +to be copied verbatim to the output. +. +In AT&T +.IR troff , +the contents of +.I file +are immediately copied to the output regardless of whether a diversion +is being written to; +this behavior is so anomalous that it must be considered a bug. +. +. +.TP +.BI .de\~ name\~\c +.RI [ end-name ] +.TQ +.BI .am\~ name\~\c +.RI [ end-name ] +.TQ +.BI .ds\~ name\~\c +.RI [ contents ] +.TQ +.BI .as\~ name\~\c +.RI [ contents ] +In compatibility mode, +these requests behave similarly to +.BR de1 , +.BR am1 , +.BR ds1 , +and +.BR as1 , +respectively: +a \[lq]compatibility save\[rq] token is inserted at the beginning, +and a \[lq]compatibility restore\[rq] token at the end, +with compatibility mode switched on during execution. +. +. +.TP +.BI .hy\~ n +New values 16 and\~32 are available; +the former enables hyphenation before the last character in a word, +and the latter enables hyphenation after the first character in a word. +. +. +.TP +.BI .ss\~ word-space-size\~\c +.RI [ additional-sentence-space-size ] +A second argument sets the amount of additional space separating +sentences on the same output line. +. +If omitted, +this amount is set to +.IR word-space-size . +. +Both arguments are in twelfths of current font's space width +(typically one-fourth to one-third em for Western scripts; +see +.MR groff_font @MAN5EXT@ ). +. +The default for both parameters is\~12. +. +Negative values are erroneous. +. +. +.TP +.BR .ta\~ [[\c +.IR "n1 n2\~" .\|.\|.\~ nn \~]\c +.BR T \~\c \" space in roman because we must use 2-font macro with \c +.IR "r1 r2\~" .\|.\|.\~ rn ] +.I groff +supports an extended syntax to specify repeating tab stops after +the +.RB \[lq] T \[rq] +mark. +. +These values are always taken as relative distances from the previous +tab stop. +. +This is the idiomatic way to specify tab stops at equal intervals in +.IR groff . +. +. +.IP +The syntax summary above instructs +.I groff +to set tabs at positions +.IR n1 , +.IR n2 , +\&.\|.\|.\|, +.IR nn , +then at +.IR nn \|+\| r1 , +.IR nn \|+\| r2 , +\&.\|.\|.\|, +.IR nn \|+\| rn , +then at +.IR nn \|+\| rn \|+\| r1 , +.IR nn \|+\| rn \|+\| r2 , +\&.\|.\|.\|, +.IR nn \|+\| rn \|+\| rn , +and so on. +. +. +.\" ==================================================================== +.SS "New registers" +.\" ==================================================================== +. +GNU +.I troff \" GNU +exposes more formatter state via many new read-only registers. +. +Their names often correspond to the requests that affect them. +. +. +.TP 12n +.B \[rs]n[.br] +Within a macro call, +interpolate\~1 +if the macro is called with the \[lq]normal\[rq] control character +(\[lq].\[rq] by default), +and\~0 otherwise. +. +This facility allows the reliable modification of requests. +. +Using this register outside of a macro definition makes no sense. +. +. +.RS +.IP +.ne 6v+\n(.Vu +.EX +\&.als bp*orig bp +\&.de bp +\&.tm before bp +\&.ie \[rs]\[rs]n[.br] .bp*orig +\&.el \[aq]bp*orig +\&.tm after bp +\&.. +.EE +.RE +. +. +.TP +.B \[rs]n[.C] +Interpolate 1\~if compatibility mode is in effect, +0\~otherwise. +. +See +.BR cp . +. +. +.TP +.B \[rs]n[.cdp] +Interpolate depth of last glyph added to the environment. +. +It is positive if the glyph extends below the baseline. +. +. +.TP +.B \[rs]n[.ce] +Interpolate number of input lines remaining to be centered. +. +. +.TP +.B \[rs]n[.cht] +Interpolate height of last glyph added to the environment. +. +It is positive if the glyph extends above the baseline. +. +. +.TP +.B \[rs]n[.color] +Interpolate 1\~if colors are enabled, +0\~otherwise. +. +. +.TP +.B \[rs]n[.cp] +Within a +.RB \[lq] do \[rq] +request, +interpolate the saved value of compatibility mode +(see +.B \[rs]n[.C] +above). +. +. +.TP +.B \[rs]n[.csk] +Interpolate skew of last glyph added to the environment. +. +The +.I skew +of a glyph is how far to the right of the center of a glyph the center +of an accent over that glyph should be placed. +. +. +.TP +.B \[rs]n[.ev] +Interpolate name of current environment. +. +This is a string-valued register. +. +. +.TP +.B \[rs]n[.fam] +Interpolate name of default font family. +. +This is a string-valued register. +. +. +.TP +.B \[rs]n[.fn] +Interpolate resolved name of the selected font. +. +This is a string-valued register. +. +. +.TP +.B \[rs]n[.fp] +Interpolate next free font mounting position. +. +. +.TP +.B \[rs]n[.g] +Interpolate\~1. +. +Test with +.RB \[lq]\| if \|\[rq] +or +.B ie +to check whether GNU +.I troff \" GNU +is the formatter. +. +. +.TP +.B \[rs]n[.height] +Interpolate font height. +. +See +.BR \[rs]H . +. +. +.TP +.B \[rs]n[.hla] +Interpolate hyphenation language of the environment. +. +This is a string-valued register. +. +. +.TP +.B \[rs]n[.hlc] +Interpolate count of immediately preceding consecutive hyphenated lines +in the environment. +. +. +.TP +.B \[rs]n[.hlm] +Interpolate maximum number of consecutive hyphenated lines allowed in +the environment. +. +. +.TP +.B \[rs]n[.hy] +Interpolate hyphenation mode of the environment. +. +. +.TP +.B \[rs]n[.hym] +Inteprolate hyphenation margin of the environment. +. +. +.TP +.B \[rs]n[.hys] +Interpolate hyphenation space adjustment threshold of the environment. +. +. +.TP +.B \[rs]n[.in] +Interpolate indentation amount applicable to the pending output line. +. +. +.TP +.B \[rs]n[.int] +Interpolate\~1 if the previous output line was interrupted +(ended with +.BR \[rs]c ), +0\~otherwise. +. +. +.TP +.B \[rs]n[.kern] +Interpolate\~1 if pairwise kerning is enabled, +0\~otherwise. +. +. +.TP +.B \[rs]n[.lg] +Interpolate ligature mode. +. +. +.TP +.B \[rs]n[.linetabs] +Interpolate\~1 if line-tabs mode is enabled, +0\~otherwise. +. +. +.TP +.B \[rs]n[.ll] +Interpolate line length applicable to the pending output line. +. +. +.TP +.B \[rs]n[.lt] +Interpolate title line length. +. +. +.TP +.B \[rs]n[.m] +Interpolate name of the selected stroke color. +. +This is a string-valued register. +. +. +.TP +.B \[rs]n[.M] +Interpolate name of the selected fill color. +. +This is a string-valued register. +. +. +.TP +.B \[rs]n[.ne] +Interpolate amount of space demanded by the most recent +.B ne +request that caused a page location trap to be sprung. +. +See +.BR \[rs]n[.trunc] . +. +. +.TP +.B \[rs]n[.nm] +Interpolate\~1 if output line numbering is enabled +(even if temporarily suppressed), +0\~otherwise. +. +. +.TP +.B \[rs]n[.ns] +Interpolate\~1 if no-space mode is enabled, +0\~otherwise. +. +. +.TP +.B \[rs]n[.O] +Interpolate output suppression level. +. +See +.BR \[rs]O . +. +. +.TP +.B \[rs]n[.P] +Interpolate\~1 if the current page is selected for output. +. +See +.B \-o +command-line option to +.MR @g@troff @MAN1EXT@ . +. +. +.TP +.B \[rs]n[.pe] +Interpolate\~1 during page ejection, +0\~otherwise. +. +. +.TP +.B \[rs]n[.pn] +Interpolate next page number +(either that set by +.BR pn , +or that of the current page plus\~1). +. +. +.TP +.B \[rs]n[.ps] +Interpolate type size in scaled points. +. +. +.TP +.B \[rs]n[.psr] +Interpolate most recently requested type size in scaled points. +. +. +.TP +.B \[rs]n[.pvs] +Interpolate post-vertical line spacing amount. +. +. +.TP +.B \[rs]n[.rj] +Interpolate number of input lines remaining to be right-aligned. +. +. +.TP +.B \[rs]n[.slant] +Interpolate font slant. +. +See +.BR \[rs]S . +. +. +.TP +.B \[rs]n[.sr] +Interpolate most recently requested type size in points as a decimal +fraction. +. +This is a string-valued register. +. +. +.TP +.B \[rs]n[.ss] +.TQ +.B \[rs]n[.sss] +Interpolate values of minimal inter-word space and additional +inter-sentence space, +respectively, +in twelfths of the space width of the selected font. +. +. +.TP +.B \[rs]n[.sty] +Interpolate selected abstract font style, +if any. +. +This is a string-valued register. +. +. +.TP +.B \[rs]n[.tabs] +Interpolate representation of the tab stop settings in a form suitable +for passage to the +.B ta +request. +. +. +.TP +.B \[rs]n[.trunc] +Interpolate amount of vertical space truncated by the most recently +sprung page location trap, +or, +if the trap was sprung by an +.B ne +request, +minus the amount of vertical motion produced by the +.B ne +request. +. +In other words, +at the point a trap is sprung, +.B \[rs]n[.trunc] +represents the difference of what the vertical position would have +been but for the trap, +and what the vertical position actually is. +. +See +.BR \[rs]n[.ne] . +. +. +.TP +.B \[rs]n[.U] +Interpolate\~1 if in unsafe mode, +0\~otherwise. +. +See +.B \-U +command-line option to +.MR @g@troff @MAN1EXT@ . +. +. +.TP +.B \[rs]n[.vpt] +Interpolate\~1 if vertical position traps are enabled, +0\~otherwise. +. +. +.TP +.B \[rs]n[.warn] +Interpolate warning mode. +. +See section \[lq]Warnings\[rq] of +.MR @g@troff @MAN1EXT@ . +.\" TODO: Maybe move that table to groff(7). +. +. +.TP +.B \[rs]n[.x] +Interpolate major version number of the running +.I @g@troff +formatter. +. +For example, +if the version number is 1.23.0, +then +.B \[rs]n[.x] +contains\~1. +. +. +.TP +.B \[rs]n[.y] +Interpolate minor version number of the running +.I @g@troff +formatter. +. +For example, +if the version number is 1.23.0, +then +.B \[rs]n[.y] +contains\~23. +. +. +.TP +.B \[rs]n[.Y] +Interpolate revision number of the running +.I @g@troff +formatter. +. +For example, +if the version number is 1.23.0, +then +.B \[rs]n[.Y] +contains\~0. +. +. +.TP +.B \[rs]n[.zoom] +Interpolate magnification of font, +in thousandths, +or\~0 if magnification unused. +. +See +.BR fzoom . +. +. +.P +The following (writable) registers are set by the +.B psbb +request. +. +. +.TP +.B \[rs]n[llx] +.TQ +.B \[rs]n[lly] +.TQ +.B \[rs]n[urx] +.TQ +.B \[rs]n[ury] +Interpolate the +(upper, +lower, +left, +right) +bounding box values +(in PostScript units) of the most recently processed PostScript image. +. +. +.P +The following (writable) registers are set by the +.B \[rs]w +escape sequence. +. +. +.TP 8n +.B \[rs]n[rst] +.TQ +.B \[rs]n[rsb] +Like +.B \[rs]n[st] +and +.BR \[rs]n[sb] , +but taking account of the heights and depths of glyphs. +. +In other words, +these registers store the highest and lowest vertical positions attained +by the argument formatted by the +.B \[rs]w +escape sequence, +doing what AT&T +.I troff \" AT&T +documented +.B \[rs]n[st] +and +.B \[rs]n[sb] +as doing. +. +. +.TP +.B \[rs]n[ssc] +The amount of horizontal space (possibly negative) that should be +added to the last glyph before a subscript. +. +. +.TP +.B \[rs]n[skw] +How far to right of the center of the last glyph in the +.B \[rs]w +argument, +the center of an accent from a roman font should be placed +over that glyph. +. +. +.P +Other writable registers are as follows. +. +Those relating to date and time are initialized using +.MR localtime 3 +at formatter startup. +. +. +.\" The `c.` register was documented in the January 1981 "Addendum to +.\" the Nroff/Troff User's Manual" (presumably by Kernighan), and is +.\" widely supported by descendants of his device-independent troff, but +.\" appears to have been overlooked in his 1992 revision of CSTR #54. +.TP 12n +.B \[rs]n[c.] +Interpolate input line number. +. +.B \[rs]n[.c] +is a read-only alias of this register. +. +. +.TP +.B \[rs]n[hours] +Interpolate number of hours elapsed since midnight. +. +. +.TP +.B \[rs]n[hp] +Interpolate horizontal position relative to that at the start of the +input line. +. +. +.br +.ne 3v +.TP +.B \[rs]n[lsn] +.TQ +.B \[rs]n[lss] +Interpolate count of leading spaces on input line and amount of +corresponding horizontal motion, +respectively. +. +. +.TP +.B \[rs]n[minutes] +Interpolate number of minutes elapsed in the hour. +. +. +.TP +.B \[rs]n[seconds] +Interpolate number of seconds elapsed in the minute. +. +. +.TP +.B \[rs]n[systat] +Interpolate return value of +.MR system 3 +function executed by most recent +.B sy +request. +. +. +.TP +.B \[rs]n[slimit] +Interpolates maximum quantity of objects on +.IR @g@troff 's +internal input stack +(default: 1000). +. +If non-positive, +there is no limit: +recursion can continue until program memory is exhausted. +. +. +.TP +.B \[rs]n[year] +Interpolate Gregorian year. +. +AT&T +.IR troff 's \" AT&T +.B \[rs][yr] +interpolates the Gregorian year minus 1900. +. +. +.\" ==================================================================== +.SS Miscellaneous +.\" ==================================================================== +. +GNU +.I troff \" GNU +predefines one string, +.BR .T , +containing the argument given to the +.B \-T +command-line option, +namely the output device +(for example, +.B pdf +or +.BR utf8 ). +. +The (read-only) +.I register +.B .T +interpolates\~1 if GNU +.I troff \" GNU +is run with the +.B \-T +command-line option, +and 0\~otherwise. +. +. +.P +A font not listed in the output device's +.I DESC +file's +.B fonts +directive is automatically mounted at the next available font position +when it is selected. +. +If you mount a font explicitly with the +.B fp +request, +you should do so on the first unused position, +which can be found in the +.B .fp +register. +. +. +.P +Unparameterized string interpolation does not conceal the arguments to a +macro being interpreted. +. +Thus, +in a macro definition, +the call of another macro with the existing argument list, +. +.RS +.EX +.BI . xx\~ \[rs]\[rs]$@ +.EE +.RE +. +is more efficiently done with +. +.RS +.EX +.BI \[rs]\[rs]*[ xx ]\[rs]\[rs] +.EE +.RE +. +(that is, +with string interpolation). +. +The trailing backslashes prevent the final newline in the macro +definition from being interpolated, +potentially putting an unwanted blank line on the output. +. +See section \[lq]Punning Names\[rq] in +.MR groff @MAN7EXT@ . +. +. +.\" XXX: Is this really not an AT&T troff feature? +.P +If a font description file contains pairwise kerning information, +glyphs from that font are kerned. +. +Kerning between two glyphs can be inhibited by placing a dummy character +.B \[rs]& +between them. +. +. +.P +GNU +.I troff \" GNU +keeps track of the nesting depth of escape sequence +interpolations and other uses of delimiters, +as in the +.B tl +request and the output comparison operator +(that is, +input like +.B \[aq]foo\[aq]bar\[aq] +as a conditional expression), +so the only characters you need to avoid using as +delimiters are those that appear in the arguments you input, +not any that result from interpolation. +. +Typically, +.B \[aq] +works fine. +. +Use visible characters as delimiters in GNU +.IR troff , \" GNU +not \[lq]ASCII\[rq] controls like BEL (Control+G). +. +The implementation of +.B \[rs]$@ +ensures that the double quotes surrounding an argument appear at an +interpolation depth different from that of the arguments themselves. +. +Similarly, +in bracket-form escape sequences like +.B \[rs]f[ZCMI], +a right bracket +.B ] +does not end the sequence unless it occurs at the same interpolation +depth as the +.RB opening\~ [ , +so input like +. +.RS +.EX +\[rs]f[\[rs]*[my-family]\[rs]*[my-style]] +.EE +.RE +. +works as desired. +. +In compatibility mode, +no attention is paid to the interpolation depth. +. +. +.P +In +GNU +.IR troff , \" GNU +the +.B tr +request can map characters to the unbreakable space escape sequence +.B \[rs]\[ti] +as a special case +.RB ( tr +normally operates only on +.IR characters ). +. +This feature replaces the odd-parity +.B tr +mapping trick used in AT&T +.I troff \" AT&T +documents, +where a character, +often +.BR \[ti] , +was \[lq]sacrificed\[rq] by mapping it to \[lq]nothing\[rq], +drafting it into use as an unadjustable, +unbreakable space. +. +(This feature was gratuitous even in early AT&T +.I troff, \" AT&T +which supported the +.BI \[rs] space +escape sequence by 1976.) \" see CSTR #54 of that year +. +Often, +it makes more sense to use +GNU +.IR troff 's \" GNU +.B \[rs]\[ti] +escape sequence instead, +which has been adopted by every other active +.I troff +implementation except that of Illumos, +as well as by the +.RI non -troff +.IR mandoc . +. +Translation of a character to +.B \[rs]\[ti] +is unnecessary. +. +. +.P +GNU +.I troff \" GNU +permits tabs and spaces after the first dot on a control line that ends +a macro definition. +. +.RS +.ne 5v+\n(.Vu +.EX +\&.if t \[rs]{\[rs] +\&.\& de bar +\&.\& nop Hello, I\[aq]m \[aq]bar\[aq]. +\&.\& . +\&.\[rs]} +.EE +.RS +. +. +.\" ==================================================================== +.SH "Formatter output" +.\" ==================================================================== +. +The page description language output by GNU +.I troff \" GNU +is modeled after that used by AT&T +.I troff \" AT&T +once the latter adopted a device-independent approach in the early +1980s. +. +Only the differences are documented here. +. +For a fuller discussion, +see +.MR groff_out @MAN5EXT@ . +.\" +.\" +.\" XXX: This feature is unused and documenting it gives a valuable +.\" hostage to fortune. +.\".P +.\"Note that single characters can have the eighth bit set, as can the +.\"names of fonts and special characters. +. +. +.P +Glyph and font names can be of arbitrary length; +postprocessors should not assume that they are at most two characters. +. +A glyph to be formatted is always drawn from the current font; +in contrast to AT&T device-independent +.IR troff , \" AT&T +drivers need not search special fonts to find a glyph. +. +. +.\" ==================================================================== +.SS Units +.\" ==================================================================== +. +The argument to the +.BR s \~command +is in scaled points +(units of +.RI points/ n , +where +.I n +is the argument to the +.B sizescale +command in the +.I DESC +file). +. +The argument to the +.RB \[lq] "x H" \[rq] +command is also in scaled points. +. +. +.\" ==================================================================== +.SS "Simple commands" +.\" ==================================================================== +. +.\" BEGIN Keep in sync with relevant portions of section "Simple +.\" commands" from groff_out(5). +.P +If the +.B tcommand +directive is present in the output device's +.I DESC +file, +GNU +.I troff \" GNU +employs the following two commands. +. +. +.TP +.BI t\~ xyz\c +\&.\|.\|. +Typeset word +.IR xyz ; +that is, +set a sequence of ordinary glyphs named +.IR x , +.IR y , +.IR z , +\&.\|.\|.\|, +terminated by a space or newline; +an optional second integer argument is ignored +(this allows the formatter to generate an even number of arguments). +.\" XXX: Why? +. +Each glyph is set at the current drawing position, +and the position is then advanced horizontally by the glyph's width. +. +A glyph's width is read from its metrics in the font description file, +scaled to the current type size, +and rounded to a multiple of the horizontal motion quantum. +. +Use the +.B C +command to emplace glyphs of special characters. +. +. +.TP +.BI u\~ "n xyz"\c +\&.\|.\|. +Typeset word +.I xyz +with track kerning. +. +As +.BR t , +but after placing each glyph, +the drawing position is further advanced horizontally +.RI by\~ n +basic units. +.\" END Keep in sync with relevant portions of section "Simple commands" +.\" from groff_out(5). +. +. +.P +New commands implement color support. +. +. +.TP +.BI mc\~ "cyan magenta yellow" +.TQ +.B md +.TQ +.BI mg\~ gray +.TQ +.BI mk\~ "cyan magenta yellow black" +.TQ +.BI mr\~ "red green blue" +Set the components of the stroke color with respect to various color +spaces. +. +.B md +resets the stroke color to the default value. +. +The arguments are integers in the range 0 to 65535. +. +. +.P +A new device control subcommand is available. +. +. +.TP +.BI "x u\~" n +If +.I n +is\~1, +start underlining of spaces. +. +If +.I n +is\~0, +stop underlining of spaces. +. +This facility is needed for the +.B cu +request in +.I nroff \" mode +mode and is ignored otherwise. +. +. +.\" ==================================================================== +.SS "Extended drawing commands" +.\" ==================================================================== +. +GNU +.I pic \" GNU +does not produce +.I @g@troff +escape sequences employing these extensions if its +.B \-n +option is given. +. +. +.TP +.BI Df\~ n +Set the shade of gray used to fill geometric objects to +.IR n , +which must be an integer. +. +0 corresponds to white and 1000 to black. +. +A grayscale ramp spans the two. +. +A value outside this range uses the stroke color as the fill color. +. +The fill color is opaque. +. +Normally the default is black, +but some drivers may provide a way of changing this. +. +.B Df +is obsolete since 2002, \" commit ea5a42d080, 2002-01-24 +superseded by +.B DFg +below. +. +. +.IP +The corresponding +.B \[rs]D\[aq]f\^\[aq] +escape sequence should not be used: +its argument is rounded to an integer multiple of the horizontal motion +quantum, +which can limit the precision +.RI of\~ n . +. +. +.TP +.BI DC\~ d +Draw a filled circle of diameter +.I d +with its leftmost point at the drawing position. +. +. +.TP +.BI DE\~ "h v" +Draw a filled ellipse, +of horizontal axis +.I h +and vertical axis +.IR v , +with its leftmost point at the drawing position. +. +. +.br +.ne 4v +.EQ +delim $$ +.EN +.TP +.\" `BR`, not `BI`, here, because eqn will take care of font changes. +.BR Dp\~ "$dx sub 1 ~ dy sub 1 ~ ldots ~ dx sub n ~ dy sub n$" +Draw a polygon with, +for $i = 1 , ldots , n + 1$, +its +.IR i th +vertex at the drawing position +. +$+ sum from { j = 1 } to { i - 1 } ( dx sub j , dy sub j )$. +. +.\" The following is implied by the math above, but let's be kind. +.I groff +output drivers automatically close polygons, +drawing a line from $( dx sub n , dy sub n )$ back to +$( dx sub 1 , dy sub 1 )$. +. +The drawing position is left at the last +.I specified +vertex, +but this may change in a future version of GNU +.IR troff . \" GNU +. +Heirloom Doctools +.IR troff , \" Heirloom +like DWB +.IR troff , \" DWB +by default does not close the polygon. +. +In its +.I groff +compatibility mode, +Heirloom closes the polygon but leaves the drawing position +.IR unchanged \[em]that +is, +at the polygon's +.I initial +drawing position. +. +. +.IP +At the moment, +GNU +.I pic \" GNU +uses this command only to generate triangles and rectangles. +. +. +.TP +.BR DP\~ "$dx sub 1 ~ dy sub 1 ~ ldots ~ dx sub n ~ dy sub n$" +As +.BR Dp , +but draw a filled rather than a stroked polygon. +. +. +.TP +.BI Dt\~ n +Set the line thickness to +.IR n \~\c +basic units. +. +AT&T +.I troff \" AT&T +output drivers use a thickness proportional to the type size; +this is the GNU +.I troff \" GNU +default. +. +A +.RI negative\~ n +requests this explicitly. +. +.RI An\~ n +of zero selects the smallest available line thickness. +. +. +.P +A difficulty arises in how the drawing position should be changed after +the execution of these commands. +. +This has little importance to most users, +since the output of GNU +.I grn \" GNU +and +.I pic \" GNU +does not depend on it. +. +Given a drawing command of the form +.BI D z +$x sub 1 ~ y sub 1 ~ ldots ~ x sub n ~ y sub n$, +where +.I z +is not +.B c +or +.BR e , +AT&T +.I troff \" AT&T +treats each $x sub i$ as a horizontal motion, +each $y sub i$ as a vertical one, +and therefore assumes that the width of the drawn object is +$sum from { i = 1 } to n x sub i$, +and its height is $sum from { i = 1 } to n y sub i$. +. +(Verify its assumption about height by examining the +.B st +and +.B sb +registers after using such a drawing command in a +.B \[rs]w +escape sequence). +. +For the sake of compatibility, +GNU +.I troff \" GNU +also follows this rule, +even though it frustrates extensions to the +.B D +command that set drawing parameters rather than rendering objects, +producing ugly results in the case of +.B Dt +and +.BR Df , +or otherwise don't parameterize objects as a series of vertices, +as with +GNU +.IR troff 's \" GNU +filled ellipse, +.BR DE . +. +Thus after executing a +.BR D \~command +of the form +.BI D z +$x sub 1 ~ y sub 1 ~ ldots ~ x sub n ~ y sub n$, +the drawing position should be increased by +. +$( sum from { i = 1 } to n x sub i , sum from { i = 1 } to n y sub i )$. +.EQ +delim off +.EN +. +In a future release, +GNU +.I troff \" GNU +and its output drivers may abandon the application of this assumption to +drawing commands not explicitly specified in the AT&T \[lq]Troff User's +Manual\[rq]. +. +. +.P +Fill color selection is implemented with another set of extensions. +. +. +.TP +.BI DFc\~ "cyan magenta yellow" +.TQ +.B DFd +.TQ +.BI DFg\~ gray +.TQ +.BI DFk\~ "cyan magenta yellow black" +.TQ +.BI DFr\~ "red green blue" +Set the components of the fill color as described under the +.B \[rs]M +escape sequence above. +. +.B DFd +restores the device's default fill color. +. +The drawing position is not updated, +in contrast to +.BR Df . +. +. +.\" ==================================================================== +.SS "Device control syntax extension" +.\" ==================================================================== +. +GNU +.I troff \" GNU +introduces a line continuation convention, +permitting the argument to the +.B x X +command to contain newlines. +. +A newline in the input is transformed to the sequence +.RI \[lq] newline\c +.BR + \[rq]. +. +When interpreting an +.B x X +command, +a postprocessor should therefore be prepared for a plus sign after a +newline; +if it occurs, +preserve the newline, +discard the plus sign, +and continue to collect the input into the argument of the +.B x X +command. +. +A newline +.I not +followed by a plus sign terminates the +.B x X +command. +. +An application of this feature is the embedding of PostScript or PDF +language command streams into +.I troff \" +output. +. +. +.P +GNU +.I troff \" GNU +guarantees that the first three output commands it emits are as follows. +. +. +.P +.RS +.EX +.RI x\~T\~ device +.RI x\~res\~ n\~h\~v +x init +.EE +.RE +. +. +.br +.ne 4v +.\" ==================================================================== +.SH Debugging +.\" ==================================================================== +. +In addition to AT&T +.IR troff 's \" AT&T +debugging features, +GNU +.I troff \" GNU +emits more error diagnostics when syntactical or semantic nonsense is +encountered and supports several warning categories; +the output of these can be selected with +.BR warn . +. +Also see the +.BR \-E , +.BR \-w , +and +.B \-W +options of +.MR @g@troff @MAN1EXT@ . +. +Backtraces can be automatically produced when errors or warnings occur +(the +.B \-b +option of +.MR @g@troff @MAN1EXT@ ) +or generated on demand +.RB ( backtrace ). +. +. +.P +.I groff +also adds more flexible diagnostic output requests +.RB ( tmc +and +.BR tm1 ). +. +More aspects of formatter state can be examined with requests that write +lists of +defined registers +.RB ( pnr ), +environments +.RB ( pev ), +and page location traps +.RB ( ptr ) +to the standard error stream. +. +. +.\" ==================================================================== +.SH "Implementation differences" +.\" ==================================================================== +. +.\" TODO: Resync with the node of this name in our Texinfo manual. +GNU +.IR troff 's \" GNU +features sometimes cause incompatibilities with documents written +assuming old implementations of +.IR troff . \" generic +. +Some GNU extensions to +.I troff \" generic +are supported by other implementations. +. +. +.P +When adjusting to both margins, +AT&T +.I troff \" AT&T +at first adjusts spaces starting from the right; +GNU +.I troff \" GNU +begins from the left. +. +Both implementations adjust spaces from opposite ends on alternating +output lines to prevent \[lq]rivers\[rq] in the text. +. +. +.P +GNU +.I troff \" GNU +does not always hyphenate words as AT&T +.I troff \" AT&T +does. +. +The AT&T implementation uses a set of hard-coded rules specific to +U.S.\& English, +while GNU +.I troff \" GNU +uses language-specific hyphenation pattern files derived from \*[tx]. +. +In some versions of +.I troff \" generic +there was limited space to store hyphenation exceptions +(arguments to the +.B hw +request); +GNU +.I troff \" GNU +has no such restriction. +. +. +.P +Long names may be GNU +.IR troff 's \" GNU +most obvious innovation. +. +AT&T +.I troff \" AT&T +interprets +.RB \[lq] .dsabcd \[rq] +as defining a string +.RB \[lq] ab \[rq] +with contents +.RB \[lq] cd \[rq]. +. +Normally, +GNU +.I troff \" GNU +interprets this as a call of a macro named +.RB \[lq] dsabcd \[rq]. +. +AT&T +.I troff \" AT&T +also interprets +.B \[rs]*[ +and +.B \[rs]n[ +as an interpolation of a string or register, +respectively, +called +.RB \[lq] [ \[rq]. +. +In GNU +.IR troff , \" GNU +however, +the +.RB \[lq] [ \[rq] +is normally interpreted as beginning the enclosure of a long identifier. +. +In compatibility mode, +GNU +.I troff \" GNU +interprets names in the traditional way, +which means that they are limited to one or two characters. +. +See the +.B \-C +option in +.MR @g@troff @MAN1EXT@ +and, +above, +the +.B .C +and +.B .cp +registers, +and +.B cp +and +.RB \[lq] do \[rq] +requests, +for more on compatibility mode. +. +. +.P +The register +.B \[rs]n[.cp] +is specialized and may require a statement of rationale. +. +When writing macro packages or documents that use GNU +.I troff \" GNU +features and which may be mixed with other packages or documents that do +not\[em]common scenarios include serial processing of man pages or use +of the +.RB \[lq] so \[rq] +or +.B mso +requests\[em]you may desire correct operation regardless of +compatibility mode enablement in the surrounding context. +. +It may occur to you to save the existing value of +.B \[rs]n(.C +into a register, +say, +.BR _C , +at the beginning of your file, +turn compatibility mode off with +.RB \[lq] .cp\~0 \[rq], +then restore it from that register at the end with +.RB \[lq] .cp\~\[rs]n(_C \[rq]. +. +At the same time, +a modular design of a document or macro package may lead you to multiple +layers of inclusion. +. +You cannot use the same register name everywhere lest you +\[lq]clobber\[rq] the value from a preceding or enclosing context. +. +The two-character register name space of AT&T +.I troff \" AT&T +is confining and mnemonically challenging; +you may wish to use +GNU +.IR troff 's \" GNU +more capacious name space. +. +However, +attempting +.RB \[lq] ".nr _my_saved_C \[rs]n(.C" \[rq] +will not work in compatibility mode; +the register name is too long. +. +\[lq]This is exactly what +.B .do +is for,\[rq] you think, +.RB \[lq] ".do nr _my_saved_C \[rs]n(.C" \[rq]. +. +The foregoing will always save zero to your register, +because +.RB \[lq] do \[rq] +turns compatibility mode +.I off +while it interprets its argument list. +. +What you need is: +. +.RS +.EX +\&.do nr _my_saved_C \[rs]n[.cp] +\&.cp 0 +.EE +.RE +. +at the beginning of your file, +followed by +.RS +.EX +\&.cp \[rs]n[_my_saved_C] +\&.do rr _my_saved_C +.EE +.RE +at the end. +. +As in the C language, +we all have to share one big name space, +so choose a register name that is unlikely to collide with other uses. +. +. +.P +The existence of the +.B .T +string is a common feature of post-CSTR\~#54 +.IR troff s\[em]DWB\~3.3, \" others +Solaris, +Heirloom Doctools, +and Plan\~9 +.I troff \" foreign +all support it\[em]but valid values are specific to each implementation. +. +The behavior of the +.B .T +register in GNU +.I troff \" GNU +differs from AT&T +.IR troff , \" AT&T +which interpolated\~1 only if +.I nroff \" AT&T +was the formatter and was called with +.BR \-T . +. +. +.P +The +.B lf +request sets the number of the +.I current +input line in AT&T +.IR troff ,\" AT&T +and the +.I next +in GNU +.IR troff .\" GNU +. +. +.br +.ne 2v +.P +AT&T +.I troff +had only environments named +.RB \[lq] 0 \[rq], +.RB \[lq] 1 \[rq], +and +.RB \[lq] 2 \[rq]. +. +In GNU +.IR troff , +any number of environments may exist, +using any valid identifiers for their names. +. +. +.P +GNU +.I troff \" GNU +normally tracks the interpolation depth of escape sequence parameters +and other delimited structures, +but not in compatibility mode. +. +See section \[lq]Miscellaneous\[rq] above. +. +. +.P +In compatibility mode, +the escape sequences +.BR \[rs]f , +.BR \[rs]H , +.BR \[rs]m , +.BR \[rs]M , +.BR \[rs]R , +.BR \[rs]s , +and +.B \[rs]S +are transparent at the beginning of an input line for the purpose of +recognizing a control character, +because they modify formatter state +.RB ( \[rs]R ) +or properties of the environment +(the rest) +and therefore do not create output nodes. +. +For example, +this code produces bold output in both cases, +but the text differs, +. +.RS +.EX +\&.de xx \[aq] +Hello! +\&.. +\&\[rs]fB.xx\[rs]fP +.EE +.RE +. +formatting \[lq].xx\[rq] normally and \[lq]Hello!\[rq] in compatibility +mode. +. +. +.P +GNU +.I troff \" GNU +request names unrecognized by other +.I troff \" generic +implementations will likely be ignored; +escape sequences that are GNU +.I troff \" GNU +extensions are liable to format their function selector character. +. +For example, +the adjustable, +non-breaking space escape sequence +.B \[rs]\[ti] +.\" BEGIN Keep in sync with groff.texi node "Other Differences" and +.\" groff_man_style(7). +is also supported by Heirloom Doctools +.I troff \" Heirloom +050915 (September 2005), +.I mandoc +1.9.5 (2009-09-21), +.I neatroff +(commit 1c6ab0f6e, +2016-09-13), +and Plan\~9 from User Space +.I troff \" Plan 9 +(commit 93f8143600, +2022-08-12), +but not by Solaris/Illumos +.IR troff s, \" Solaris/Illumos +which will render it as +.BR \[ti] . +.\" as of this writing, 2022-08-13 +.\" END Keep in sync with groff.texi node "Other Differences" and +.\" groff_man_style(7). +. +. +.P +GNU +.I troff \" GNU +does not allow the use of the escape sequences +.BR \[rs]| , +.BR \[rs]\[ha] , +.BR \[rs]& , +.BR \[rs]{ , +.BR \[rs]} , +.BI \[rs] space\c +, +.BR \[rs]\[aq] , +.BR \[rs]\[ga] , +.BR \[rs]\- , +.BR \[rs]_ , +.BR \[rs]! , +.BR \[rs]% , +or +.B \[rs]c +in identifiers; +AT&T +.I troff \" AT&T +does. +. +The +.B \[rs]A +escape sequence +(see subsection \[lq]Escape sequences\[rq] above) +may be helpful in avoiding their use. +. +. +.P +Normally, +the syntax form +.BI \[rs]s n +accepts only a single character +(a digit) +for +.IR n , +consistently with other forms that originated in AT&T +.IR troff , \" AT&T +like +.BR \[rs]* , +.BR \[rs]$ , +.BR \[rs]f , +.BR \[rs]g , +.BR \[rs]k , +.BR \[rs]n , +and +.BR \[rs]z . +. +In compatibility mode only, +a +.RI non-zero\~ n +must be in the range 4\[en]39. +. +Legacy documents relying upon this quirk of parsing should be migrated +to another +.B \[rs]s +form. +. +[Background: +The Graphic Systems C/A/T phototypesetter +(the original device target for AT&T +.IR troff ) \" AT&T +supported only a few discrete type sizes in the range 6\[en]36 points, +so Ossanna contrived a special case in the parser to do what the user +must have meant. +. +Kernighan warned of this in the 1992 revision of CSTR\~#54 (\[sc]2.3), +and more recently, +McIlroy referred to it as a \[lq]living fossil\[rq].] +. +. +.P +Fractional type sizes cause one noteworthy incompatibility. +. +In AT&T +.I troff \" AT&T +the +.B ps +request ignores scaling units and thus +.RB \[lq] .ps\~10u \[rq] +sets the type size to 10\~points, +whereas in GNU +.I troff \" GNU +it sets the type size to +.RI 10\~ scaled +points, +which may be a much smaller measurement. +. +See subsection \[lq]Fractional type sizes and new scaling units\[rq] +above. +. +. +.P +The +.B ab +request differs from AT&T +.IR troff : \" AT&T +GNU +.I troff \" GNU +writes no message to the standard error stream if no arguments are +given, +and it exits with a failure status instead of a successful one. +. +. +.P +The +.B bp +request differs from AT&T +.IR troff : \" AT&T +GNU +.I troff \" GNU +does not accept a scaling unit on the argument, +a page number; +the former +(somewhat uselessly) +does. +. +. +.P +In AT&T +.I troff \" AT&T +the +.B pm +request reports +macro, +string, +and +diversion +sizes in units of 128-byte blocks, +and an argument reduces the report to a sum of the above in the same +units. +. +GNU +.I troff \" GNU +ignores any arguments and reports the sizes in bytes. +. +. +.P +Unlike AT&T +.IR troff , \" AT&T +GNU +.I troff \" GNU +does not ignore the +.B ss +request if the output is a terminal device; +instead, +the values of minimum inter-word and additional inter-sentence space are +each rounded down to the nearest multiple of\~12. +. +. +.P +In GNU +.I troff \" GNU +there is a fundamental difference between (unformatted) characters and +(formatted) glyphs. +. +Everything that affects how a glyph is output is stored with the glyph +node; +once a glyph node has been constructed, +it is unaffected by any subsequent requests that are executed, +including +.BR bd , +.BR cs , +.BR tkf , +.BR tr , +or +.B fp +requests. +. +Normally, +glyphs are constructed from characters immediately before the glyph is +added to an output line. +. +Macros, +diversions, +and strings are all, +in fact, +the same type of object; +they contain a sequence of intermixed character and glyph nodes. +. +Special characters transform from one to the other: +before being added to the output, +they behave as characters; +afterward, +they are glyphs. +. +A glyph node does not behave like a character node when it is processed +by a macro: +it does not inherit any of the special properties that the character +from which it was constructed might have had. +. +For example, +the input +. +.br +.ne 5v +.RS +.EX +\&.di x +\[rs]\[rs]\[rs]\[rs] +\&.br +\&.di +\&.x +.EE +.RE +. +produces +.RB \[lq]\^ \[rs]\[rs] \[rq] +in GNU +.IR troff . \" GNU +Each pair of backslashes becomes one backslash +.I glyph; +the resulting backslashes are thus not interpreted as escape +.I characters +when they are reread as the diversion is output. +. +AT&T +.I troff \" AT&T +.I would +interpret them as escape characters when rereading them and end up +printing one +.RB \[lq] \[rs] \[rq]. +. +. +.P +One way to format a backslash in most documents is with the +.B \[rs]e +escape sequence; +this formats the glyph of the current escape character, +regardless of whether it is used in a diversion; +it also works in both GNU +.I troff \" GNU +and AT&T +.IR troff . \" AT&T +. +(Naturally, +if you've changed the escape character, +you need to prefix the +.RB \[lq] e \[rq] +with whatever it is\[em]and you'll likely get something other than a +backslash in the output.) +. +. +.P +The other correct way, +appropriate in contexts independent of the backslash's common use as a +.I roff +escape character\[em]perhaps in discussion of character sets or other +programming languages\[em]is the character escape +.B \[rs](rs +or +.BR \[rs][rs] , +for \[lq]reverse solidus\[rq], +from its name in the ECMA-6 (ISO/IEC\~646) standard. +. +[This escape sequence is not portable to AT&T +.IR troff , \" AT&T +but is to its lineal descendant, +Heirloom Doctools +.IR troff , +as of its 060716 release (July 2006).] +. +. +.P +To store an escape sequence in a diversion that is interpreted when the +diversion is reread, +either use the traditional +.B \[rs]!\& +transparent output facility, +or, +if this is unsuitable, +the new +.B \[rs]?\& +escape sequence. +. +See subsection \[lq]Escape sequences\[rq] above and sections +\[lq]Diversions\[rq] and \[lq]gtroff Internals\[rq] in +.IR "Groff: The GNU Implementation of troff" , +the +.I groff +Texinfo manual. +. +. +.P +In the somewhat pathological case where a diversion exists containing a +partially collected line and a partially collected line at the top-level +diversion has never existed, +AT&T +.I troff +will output the partially collected line at the end of input; +GNU +.I troff \" GNU +will not. +. +. +.\" ==================================================================== +.SS "Formatter output incompatibilities" +.\" ==================================================================== +. +Its extensions notwithstanding, +the +.I groff +intermediate output format has some incompatibilities +with that of AT&T +.IR troff , \" AT&T +but better compatibility is sought; +problem reports and patches are welcome. +. +The following incompatibilities are known. +. +. +.IP \[bu] 2n +The drawing position after rendering polygons is inconsistent with AT&T +.I troff \" AT&T +practice. +. +Other implementations have diverged on this point as well. +. +. +.IP \[bu] +The output cannot be easily rescaled to other devices as AT&T +.IR troff 's \" AT&T +could. +.\" XXX: Why? What's the problem? sizescale? That could be written +.\" into the output as a comment or x command. --GBR +. +. +.\" ==================================================================== +.SH Authors +.\" ==================================================================== +. +This document was written by +.MT jjc@\:jclark\:.com +James Clark +.ME , +.MT wl@\:gnu\:.org +Werner Lemberg +.ME , +.MT groff\-bernd\:.warken\-72@\:web\:.de +Bernd Warken +.ME , +and +.MT g.branden\:.robinson@\:gmail\:.com +G.\& Branden Robinson +.ME . +. +. +.\" ==================================================================== +.SH "See also" +.\" ==================================================================== +. +.IR "Groff: The GNU Implementation of troff" , +by Trent A.\& Fisher and Werner Lemberg, +is the primary +.I groff +manual. +. +You can browse it interactively with \[lq]info groff\[rq]. +. +. +.br +.ne 4v +.P +\[lq]Troff User's Manual\[rq] +by Joseph F.\& Ossanna, +1976 +(revised by Brian W.\& Kernighan, +1992), +AT&T Bell Laboratories Computing Science Technical Report No.\& 54, +widely called simply \[lq]CSTR\~#54\[rq], +documents the language, +device and font description file formats, +and output format +referred to collectively in +.I groff +documentation as AT&T +.IR troff . \" AT&T +. +. +.P +\[lq]A Typesetter-independent TROFF\[rq] +by Brian W.\& Kernighan, +1982, +AT&T Bell Laboratories Computing Science Technical Report No.\& 97, +provides additional insights into the +device and font description file formats +and output format. +. +. +.P +.MR groff @MAN1EXT@ , +.MR groff @MAN7EXT@ , +.MR roff @MAN7EXT@ +. +. +.\" Clean up. +.rm tx +.rm ic +. +.\" Restore compatibility mode (for, e.g., Solaris 10/11). +.cp \n[*groff_groff_diff_7_man_C] +.do rr *groff_groff_diff_7_man_C +. +. +.\" Local Variables: +.\" fill-column: 72 +.\" mode: nroff +.\" End: +.\" vim: set filetype=groff textwidth=72: |