Путеводитель по Руководству Linux

  User  |  Syst  |  Libr  |  Device  |  Files  |  Other  |  Admin  |  Head  |



   groff_diff    ( 7 )

различия между GNU roff и AT&T troff (differences between GNU roff and AT&T troff)

Язык (Language)

groff features identifiers of arbitrary length, supports non- integral point sizes, adds new escapes and requests, provides new conditional tests, recognizes additional scaling indicators and numerical operators, and extends the function of some escapes and requests already present in AT&T troff.

Long names groff introduces many new requests; with three exceptions, they all have names longer than two characters. The names of number registers, fonts, strings/macros/diversions, environments, special characters (glyphs), and colors can be of any length. More generally, anywhere AT&T troff supports an escape form that uses an opening parenthesis '(' to introduce a two-character argument, groff supports a square-bracketed form '[]' where the argument within can be of arbitrary length.

Fractional point sizes and new scaling indicators A scaled point is equal to 1/sizescale points, where sizescale is a parameter specified in the device description file, DESC, and defaults to 1. A new scale indicator 'z' has the effect of multiplying by sizescale. Requests and escapes in groff interpret arguments that represent a point size as being in units of scaled points; that is, they evaluate such arguments using an implied default scaling indicator of 'z'. Arguments treated in this way comprise those to the escapes \H and \s, to the request .ps, the third argument to the .cs request, and the second and fourth arguments to the .tkf request.

For example, if sizescale is 1000, then a scaled point is one one-thousandth of a point. The request '.ps 10.25' is synonymous with '.ps 10.25z' and sets the point size to 10250 scaled points, or 10.25 points.

Consequently, in groff, the number register \n[.s] can contain a non-integral point size. The new number register \n[.ps] returns the point size in scaled points.

It makes no sense to use the 'z' scale indicator in a numeric expression whose default scaling indicator is neither 'u' nor 'z', so groff disallows this. Similarly, it is nonsensical to use a scaling indicator other than 'z' or 'u' in a numeric expression whose default scaling indicator is 'z', so groff disallows this as well.

Another new scaling indicator, 's', multiplies by the number of basic units in a scaled point. For instance, '\n[.ps]s' is equal to '1m' by definition. Do not confuse the 's' and 'z' scaling indicators.

A further two new measurement units available in groff are 'M', which indicates hundredths of an em, and 'f', which is defined as 65536 basic units. The latter provides convenient fractions for color definitions with the .defcolor request. For example, 0.5f equals 32768u.

Numeric expressions Spaces are permitted in a numeric expression within parentheses. Three new operators are available as well.

e1>?e2 Compute the maximum of e1 and e2.

e1<?e2 Compute the minimum of e1 and e2.

(c;e) Evaluate e using c as the default scaling indicator. If c is missing, ignore scaling indicators in the evaluation of e.

Conditional expressions More conditions can be tested with the .if and .ie requests, as well as the new .while request.

c g True if a glyph g is available, where g is a Unicode basic Latin character; a groff special character \(xx or \[xxx]; \N'xxx'; or has been defined by any of the .char, .fchar, .fschar, or .schar requests.

d name True if there is a string, macro, diversion, or request called name.

F font True if a font called font exists. font is handled as if it were opened with the .ft request (that is, font translation and styles are applied), without actually mounting it. This test doesn't load the complete font, but only its header, to verify its validity.

m color True if there is a color called color.

r reg True if there is a number register called reg.

S style True if a style called style has been registered. Font translation is applied.

v Always false. This condition is for compatibility with certain other troff implementations only. (This refers to vtroff, a translator that would convert the C/A/T output from early-vintage AT&T troff to a form suitable for Versatec and Benson-Varian plotters.)

Escape sequences groff introduces several new escape sequences and extends the syntax of a few AT&T troff escapes (namely, \D, \f, \k, \n, \$, and \*). In the following list, escapes are collated alphabetically at first, and then by symbol roughly in Unicode code point order.

\A'anything' This expands to 1 or 0, depending on whether anything is or is not acceptable as the name of a string, macro, diversion, number register, environment, font, or color. It returns 0 if anything is empty. This is useful if you want to look up user input in some sort of associative table.

\B'anything' This expands to 1 or 0, depending on whether anything is or is not a valid numeric expression. It returns 0 if anything is empty.

\D'...' All drawing commands supported by the AT&T troff device- independent intermediate output format are accepted. See subsection 'Drawing Commands' below for GNU extensions.

\E This is equivalent to an escape character, but it is not interpreted in copy mode. Strings to start and end superscripting could be defined as follows.

.ds { \v'-.3m'\s'\En[.s]*6u/10u' .ds } \s0\v'.3m'

The use of \E ensures that these definitions work even if \*{ gets interpreted in copy mode (for example, by being used in a macro argument).

\f[xxx] Set font xxx. Additionally, \f[] is a new syntax form equal to \fP, i.e., to return to the previous font.

\Ff \F(fm \F[fam] Change font family. See the .fam request below. \F[] switches to the previous font family, or to the default family if there is none. \FP won't do this; it selects font family 'P' instead.

\k(rg \k[reg] Mark horizontal position in register with two-character name rg or arbitrarily long name reg.

\mx \m(xx \m[xxx] Set drawing color. \m[] switches back to the previous color.

\Mx \M(xx \M[xxx] Set background color for filled objects drawn with the \D'...' commands. \M[] switches back to the previous color.

\n[xxx] Interpolate number register xxx.

\On \O[n] Suppress troff output. The escapes \O2, \O3, \O4, and \O5 are intended for internal use by grohtml.

\O0 Disable glyphs from being emitted to the device driver, provided that the escape occurs at the outer level (see \O3 and \O4).

\O1 Enable output of glyphs, provided that the escape occurs at the outer level.

\O0 and \O1 also reset the registers \n[opminx], \n[opminy], \n[opmaxx], and \n[opmaxy] to -1. These four registers mark the top left and bottom right hand corners of a box which encompasses all written glyphs.

\O2 Provided that the escape occurs at the outer level, enable output of glyphs and also write out to stderr the page number and four registers encompassing the glyphs previously written since the last call to \O.

\O3 Begin a nesting level. At start-up, troff is at outer level. This is really an internal mechanism for grohtml while producing images. They are generated by running the troff source through troff to the PostScript device and ghostscript to produce images in PNG format. The \O3 escape starts a new page if the device is not html (to reduce the possibility of images crossing a page boundary).

\O4 End a nesting level.

\O5[Pfilename] This escape is grohtml specific. Provided that this escape occurs at the outer nesting level, write filename to stderr. The position of the image, P, must be specified and must be one of l, r, c, or i (left, right, centered, inline). filename is associated with the production of the next inline image.

\R'name ±n' This has the same effect as

.nr name ±n

\s[±n] \s±[n] \s'±n' \s±'n' Set the point size to n scaled points; n is a numeric expression with a default scaling indicator of 'z'.

\Vx \V(xx \V[xxx] Interpolate the contents of the environment variable xxx, as returned by getenv(3). \V is interpreted in copy mode.

\Yx \Y(xx \Y[xxx] This is approximately equivalent to \X'\*[xxx]'. However the contents of the string or macro xxx are not interpreted; also it is permitted for xxx to have been defined as a macro and thus contain newlines (it is not permitted for the argument to \X to contain newlines). The inclusion of newlines requires an extension to the AT&T troff output format, and confuses drivers that do not know about this extension.

\Z'anything' Print anything and then restore the horizontal and vertical position; anything may not contain tabs or leaders.

\# Everything up to and including the next newline is ignored. This escape is interpreted even in copy mode. \# is like \", except that \" does not ignore a newline; the latter therefore cannot be used by itself for a whole- line comment—it leaves a blank line on the input stream.

\$0 The name by which the current macro was invoked. The als request can make a macro have more than one name.

\$(nn \$[nnn] In a macro or string, this gives the nn-th or nnn-th argument. Macros and strings can have an unlimited number of arguments.

\$* In a macro or string, the concatenation of all the arguments separated by spaces.

\$@ In a macro or string, the concatenation of all the arguments with each surrounded by double quotes, and separated by spaces.

\$^ In a macro, the representation of all parameters as if they were an argument to the ds request.

\) Like \& except that it behaves like a character declared with the .cflags request to be transparent for the purposes of end-of-sentence recognition.

\*[xxx arg1 arg2 ...] Interpolate string xxx, taking arg1, arg2, ... as arguments.

\/ Apply an italic correction: increase the width of the preceding glyph so that the spacing between that glyph and the following glyph is correct if the following glyph is a roman glyph. For example, if an italic 'f' is immediately followed by a roman right parenthesis, then in many fonts the top right portion of the 'f' overlaps the top left of the right parenthesis, which is ugly. Inserting \/ between them avoids this problem. Use this escape sequence whenever an italic glyph is immediately followed by a roman glyph without any intervening space.

\, Apply a left italic correction: modify the spacing of the following glyph so that the spacing between that glyph and the preceding glyph is correct if the preceding glyph is a roman glyph. For example, if a roman left parenthesis is immediately followed by an italic 'f', then in many fonts the bottom left portion of the 'f' overlaps the bottom of the left parenthesis, which is ugly. Inserting \, between them avoids this problem. Use this escape sequence whenever a roman glyph is immediately followed by an italic glyph without any intervening space.

\: Insert a non-printing break point. That is, the word can break there, but the soft hyphen glyph is not written to the output if it does (in contrast to '\%'). This escape is an input word boundary, so the remainder of the word is subject to hyphenation as normal.

\?anything\? When used in a diversion, this transparently embeds anything in the diversion. anything is read in copy mode. When the diversion is reread, anything is interpreted. anything may not contain newlines; use \! if you want to embed newlines in a diversion. The escape sequence \? is also recognized in copy mode and turned into a single internal code; it is this code that terminates anything. Thus

.nr x 1 .nf .di d \?\\?\\\\?\\\\\\\\nx\\\\?\\?\? .di .nr x 2 .di e .d .di .nr x 3 .di f .e .di .nr x 4 .f

prints 4.

\[xxx] Print the special character (glyph) called xxx.

\[comp1 comp2 ...] Print composite glyph consisting of multiple components. Example: '\[A ho]' is capital letter A with ogonek which finally maps to glyph name 'u0041_0328'. See Groff: The GNU Implementation of troff, the groff Texinfo manual, for details of how a glyph name for a composite glyph is constructed, and groff_char(7) for a list of glyph name components used in composite glyph names.

\~ This produces an unbreakable space that stretches like a normal inter-word space when a line is adjusted.

Restricted requests To mitigate risks from untrusted input documents, the pi and sy requests are disabled by default. troff(1)'s -U option enables the formatter's 'unsafe mode', restoring their function (and enabling additional groff extension requests, open, opena, and pso).

New requests .aln new old Create an alias new for an existing number register named old, causing the names to refer to the same stored object. If old is undefined, a warning of type 'reg' is generated and the request is ignored. To remove a number register alias, call .rr on its name. A number register's contents do not become inaccessible until it has no more names.

.als new old Create an alias new for the existing request, string, macro, or diversion named old, causing the names to refer to the same stored object. If old is undefined, a warning of type 'mac' is generated and the request is ignored. The .am, .as, .da, .de, .di, and .ds requests (together with their variants) only create a new object 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, simply call .rm on its name. The object itself is not destroyed until it has no more names.

.am1 xx yy Similar to .am, but compatibility mode is switched off during execution. To be more precise, a 'compatibility save' token is inserted at the beginning, and a 'compatibility restore' token at the end. As a consequence, the requests .am, .am1, .de, and .de1 can be intermixed freely since the compatibility save/restore tokens only affect the macro parts defined by .am1 and .ds1.

.ami xx yy Append to macro indirectly. See the dei request below.

.ami1 xx yy Same as the ami request but compatibility mode is switched off during execution.

.as1 name string Similar to .as, but compatibility mode is switched off when the appended portion of the string is later interpolated. To be more precise, a 'compatibility save' token is inserted at the beginning of the appended string string, and a 'compatibility restore' token at the end. As a consequence, the requests .as, .as1, .ds, and .ds1 can be intermixed freely since the compatibility save/ restore tokens only affect the (sub)strings defined by .as1 and .ds1.

.asciify div Unformat the diversion div in a way such that Unicode basic Latin (ASCII) characters, characters translated with the .trin request, space characters, and some escape sequences, that were formatted and diverted into div are treated like ordinary input characters when div is reread. Doing so can be useful in conjunction with the .writem request. .asciify can be also used for gross hacks; for example, the following sets register n to 1.

.tr @. .di x @nr n 1 .br .di .tr @@ .asciify x .x

.asciify cannot return all items in a diversion to their source equivalent: nodes such as those produced by \N[...] will remain nodes, so the result cannot be guaranteed to be a pure string. See section 'Copy mode' in groff(7). Glyph parameters such as the type face and size are not preserved; use .unformat to achieve that.

.backtrace Write a backtrace of the input stack to the standard error stream. Also see the -b option of troff(1).

.blm [name] Set a blank line macro (trap). If a blank line macro is thus defined, groff executes 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.

.box name .boxa name These requests are similar to the di and da requests, respectively, with the exception that any pending output line does not become part of the diversion (i.e., a box diversion always starts on a new output line) but is restored after ending the diversion, discarding any partially collected line in the diversion.

.break Break out of a while loop. See also the while and continue requests. Be sure not to confuse this with the br request.

.brp This is the same as \p.

.cflags n c1 c2 ... Assign properties encoded by the number n to characters c1, c2, and so on.

Input characters, including special characters introduced by an escape, have certain properties associated with them. (Note that output glyphs don't have such properties. In groff, a glyph is a numbered box with a given height above and depth below the baseline, and a width—nothing more.) These properties can be modified with this request. 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 cn arguments are optional. Any argument cn can be a character class defined with the .class request rather than an individual character.

The non-negative integer n is the sum of any of the following. Some combinations are nonsensical, such as '33' (1 + 32).

1 Recognize the character as ending a sentence if followed by a newline or two spaces. Initially, characters '.?!' have this property.

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.

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 '-\[hy]\[em]' have this property.

8 Mark the glyph associated with this character as overlapping other instances of itself horizontally. Initially, characters '\[ul]\[rn]\[ru]\[radicalex]\[sqrtex]' have this property.

16 Mark the glyph associated with this character as overlapping other instances of itself vertically. Initially, the character '\[br]' has this property.

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 TeX. Initially, characters ''")]*\[dg]\[dd]\[rq]\[cq]' have this property.

64 Ignore hyphenation codes of the surrounding characters. Use this value in combination with values 2 and 4. Initially, no characters have this property.

For example, if you need an automatic break point after the en-dash in numerical ranges like '3000–5000', insert .cflags 68 \[en] into your document. Note, however, that this can lead to bad layout if done without thinking; in most situations, a better solution than changing the .cflags value is inserting '\:' right after the hyphen at the places that really need a break point.

The remaining values were implemented for East Asian language support; those who use alphabetic scripts exclusively can disregard them.

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.

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.

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.

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.

.char g string Define a new character or glyph g to be string, which can be empty. More precisely, .char defines a groff object (or redefines an existing one) that is accessed with the name g on input, and produces string on output. Every time glyph g needs to be printed, string 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 to \ while string is processed. Any emboldening, constant spacing, or track kerning is applied to this object rather than to individual glyphs in string.

An object defined by this request can be used just like a normal glyph provided by the output device. In particular, other characters can be translated to it with the .tr request; it can be made the leader glyph with the .lc request; repeated patterns can be drawn with it using the \l and \L escape sequences; and words containing g can be hyphenated correctly, if the .hcode request is used to give the object a hyphenation code.

There is a special anti-recursion feature: use of the object within its own definition is handled like a normal character (one not defined with .char).

The .tr and .trin requests take precedence if .char accesses the same symbol.

A glyph definition can be removed with the .rchar request.

.chop object Remove the last character from the macro, string, or diversion named 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 object; see section 'Gtroff Internals' in Groff: The GNU Implementation of troff, the groff Texinfo manual, for details on nodes inserted additionally by groff.

.class name c1 c2 ... Define a character class (or simply 'class') name comprising the characters or range expressions c1, c2, and so on.

A class thus defined can then be referred to in lieu of listing all the characters within it. Currently, only the .cflags request can handle references to character classes.

In the request's simplest form, each cn is a character (or special character). .class [quotes] ' \[aq] \[dq] \[oq] \[cq] \[lq] \[rq]

Since class and glyph names share the same name space, it is recommended to start and end the class name with '[' and ']', respectively, to avoid collisions with existing character names defined by groff or the user (with .char and related requests). This practice applies the presence of ']' in the class name to prevent the usage of the special character escape form '\[...]', thus you must use the \C escape to access a class with such a name.

You can also use a character range expression consisting of a start character followed by '-' and then an end character. Internally, groff converts these two character names to Unicode code points (according to the 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. .class [prepunct] , : ; > } .class [prepunctx] \C'[prepunct]' \[u2013]-\[u2016] The class '[prepunctx]' thus contains the contents of the class '[prepunct]' and characters in the range U+2013–U+2016.

If you want to include '-' in a class, it must be the first character value in the argument list, otherwise it gets misinterpreted as part of the range syntax.

Note that it is not possible to use class names as end points of range definitions.

A typical use of the .class request is to control line- breaking and hyphenation rules as defined by the .cflags request. For example, to inhibit line breaks before the characters belonging to the '[prepunctx]' class defined in the previous example, you can write the following. .cflags 2 \C'[prepunctx]'

.close stream Close the stream named stream; stream will no longer be an acceptable argument to the write request. See the open request.

.composite glyph1 glyph2 Map glyph name glyph1 to glyph name glyph2 if it is used in \[...] with more than one component.

.continue Finish the current iteration of a while loop. See also the while and break requests.

.color n If n is non-zero or missing, enable colors (this is the default), otherwise disable them.

.cp n If n is non-zero or missing, enable compatibility mode, otherwise disable it. In compatibility mode, long names are not recognized, and the incompatibilities caused by long names do not arise.

.defcolor xxx scheme color_components Define color xxx. scheme can be one of the following values: rgb (three components), cmy (three components), cmyk (four components), and gray or grey (one component). Color components can be given either as a hexadecimal string or as positive decimal integers in the range 0–65535. A hexadecimal string contains all color components concatenated; it must start with either # or ##. The former specifies hex values in the range 0–255 (which are internally multiplied by 257), the latter in the range 0–65535. Examples: #FFC0CB (pink), ##ffff0000ffff (magenta). A new scaling indicator, 'f' has has been introduced which multiplies its value by 65536; this makes it convenient to specify color components as fractions in the range 0 to 1. Example:

.defcolor darkgreen rgb 0.1f 0.5f 0.2f

Note that f is the default scaling indicator for the defcolor request, thus the above statement is equivalent to

.defcolor darkgreen rgb 0.1 0.5 0.2

The color named default (which is device-specific) can't be redefined. It is possible that the default color for \M and \m is not the same.

.de1 xx yy Similar to .de, but compatibility mode is switched off during execution. On entry, the current compatibility mode is saved and restored at exit.

.dei xx [yy] Define macro indirectly, with the name of the macro to be defined in string xx and the name of the end macro terminating its definition in string yy.

.dei1 xx [yy] As .dei, but compatibility mode is switched off when the definition of the macro named in the string xx is executed.

.device anything This is (almost) the same as the \X escape. anything is read in copy mode; a leading " is stripped.

.devicem xx This is the same as the \Y escape (to embed the contents of a macro into the intermediate output preceded with 'x X').

.do name ... Interpret the string, request, diversion, or macro name (along with any arguments) with compatibility mode disabled. Note that compatibility mode is restored (only if it was active) when the expansion of name is interpreted; that is, the restored compatibility state applies to the contents of the macro, string, or diversion name as well as data read from files or pipes if name is any of the so, soquiet, mso, msoquiet, or pso requests.

For example, .de mac1 FOO .. .de1 mac2 groff .mac1 .. .de mac3 compatibility .mac1 .. .de ma \\$1 .. .cp 1 .do mac1 .do mac2 \" mac2, defined with .de1, calls "mac1" .do mac3 \" mac3 calls "ma" with argument "c1" .do mac3 \[ti] \" groff syntax accepted in .do arguments results in FOO groff FOO compatibility c1 ~ as output.

.ds1 name string Similar to .ds, but compatibility mode is switched off when the string is later interpolated. To be more precise, a 'compatibility save' token is inserted at the beginning of the string, and a 'compatibility restore' token at the end.

.ecr Restore the escape character saved with ecs, or set escape character to '\' if none has been saved.

.ecs Save the current escape character.

.evc environment Copy the contents of environment to the current environment.

The following environment data are not copied:

• a partially collected line, if present;

• the interruption status of the previous input line (due to use of the \c escape sequence);

• the count of remaining lines to center, to right- justify, or to underline (with or without underlined spaces; all set to zero);

• the activation status of temporary indentation;

• input traps and their associated data;

• the activation status of line numbering (which can be reactivated with '.nm +0'); and

• the count of consecutive hyphenated lines (set to zero).

.fam [family] Set the font family to family. If no argument is given, switch to the previous font family, or the default family if there is none. Use '\F[]' to do this with an escape sequence; '\FP' selects font family 'P' instead. The initial font family is 'T' (Times), but can be overridden by the output device—see groff_font(5)). The current font family is associated with the environment.

.fchar c string Define fallback character (or glyph) c to be string. The syntax of this request is the same as the char request; the only difference is that a glyph defined with char hides the glyph with the same name in the current font, whereas a glyph defined with .fchar is checked only if the particular glyph isn't found in the current font. This test happens before checking special fonts.

.fcolor c Set the fill color to c. If c is missing, switch to the previous fill color.

.fschar f c string Define fallback character (or glyph) c for font f to be string. The syntax of this request is the same as the char request (with an additional argument to specify the font); a glyph defined with fschar is searched after the list of fonts declared with the fspecial request but before the list of fonts declared with .special.

.fspecial f s1 s2 ... When the current font is f, fonts s1, s2, ... are special, that is, they are searched for glyphs not in the current font. Any fonts specified in the .special request are searched after fonts specified in the .fspecial request. Without argument, reset the list of global special fonts to be empty.

.ftr f g Translate font f to g. Whenever a font named f is referred to in an \f escape sequence, in the F and S conditional operators, or in the ft, ul, bd, cs, tkf, special, fspecial, fp, or sty requests, font g is used. If g is missing, or equal to f then font f is not translated.

.fzoom f zoom Set zoom factor zoom for font f. 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. f must be a real font name, not a style.

.gcolor c Set the glyph color to c. If c is missing, switch to the previous glyph color.

.hcode c1 code1 [c2 code2] ... Set the hyphenation code of character c1 to code1, that of c2 to code2, and so on. A hyphenation code must be a single input character (not a special character) other than a digit or a space. The request is ignored if it has no parameters.

For hyphenation to work, hyphenation codes must be set up. At start-up, groff assigns hyphenation codes to the letters 'a–z' (mapped to themselves), to the letters 'A–Z' (mapped to 'a–z'), 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 'FOO' and 'Foo' should be hyphenated exactly as 'foo' is. The .hcode request 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.

.hla lang Set the hyphenation language to lang. Hyphenation exceptions specified with the .hw request and hyphenation patterns and exceptions specified with the .hpf and .hpfa requests are associated with the hyphenation language. The .hla request is usually invoked by a localization file, which is in turn loaded by the troffrc or troffrc-end file; see the .hpf request below.

The hyphenation language is associated with the environment.

.hlm [n] Set the maximum number of consecutive hyphenated lines to n. If n is negative, there is no maximum. If omitted, 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 \% are counted; explicit hyphens are not.

.hpf pattern-file Read hyphenation patterns from pattern-file. This file is sought in the same way that macro files are with the .mso request or the -mname command-line option to groff(1).

The pattern-file should have the same format as (simple) TeX pattern files. More specifically, the following scanning rules are implemented.

• A percent sign starts a comment (up to the end of the line) even if preceded by a backslash.

• 'Digraphs' like \$ are not supported.

• '^^xx' (where each x is 0–9 or a–f) and ^^c (character c in the code point range 0–127 decimal) are recognized; other uses of ^ cause an error.

• No macro expansion is performed.

hpf checks for the expression \patterns{...} (possibly with whitespace before or after the braces). Everything between the braces is taken as hyphenation patterns. Consequently, '{' and '}' are not allowed in patterns.

• Similarly, \hyphenation{...} gives a list of hyphenation exceptions.

\endinput is recognized also.

• For backwards compatibility, if \patterns is missing, the whole file is treated as a list of hyphenation patterns (except that the '%' character is recognized as the start of a comment).

Use the .hpfcode request (see below) to map the encoding used in hyphenation pattern files to groff's input encoding.

The set of hyphenation patterns is associated with the hyphenation language set by the .hla request. The .hpf request is usually invoked by a localization file loaded by the troffrc file. By default, troffrc loads the localization file for English. (As of groff 1.23.0, localization files for Czech (cs), German (de), English (en), French (fr), Japanese (ja), Swedish (sv), and Chinese (zh) exist.) For Western languages, the localization file sets the hyphenation mode and loads hyphenation patterns and exceptions.

A second call to .hpf (for the same language) replaces the old patterns with the new ones.

Invoking .hpf causes an error if there is no hyphenation language.

If no .hpf request is specified (either in the document, in a file loaded at start-up, or in a macro package), groff won't automatically hyphenate at all.

.hpfa pattern-file As .hpf, except that the hyphenation patterns and exceptions from pattern-file are appended to the patterns already applied to the hyphenation language of the environment.

.hpfcode a b [c d] ... Define mapping values for character codes in pattern files. This is an older mechanism no longer used by groff's own macro files; for its successor, see .hcode above. .hpf or .hpfa aplly the mapping after reading or appending to the active list of patterns. Its arguments are pairs of character codes—integers from 0 to 255. The request maps character code a to code b, code c to code d, and so on. Character codes that would otherwise be invalid in groff can be used. By default, every code maps to itself except those for letters 'A' to 'Z', which map to those for 'a' to 'z'.

.hym [length] Set the (right) hyphenation margin to length. If the adjustment mode is not 'b' or 'n', the line is not hyphenated if it is shorter than length. Without an argument, the default hyphenation margin is reset to its default value, 0. The default scaling indicator is 'm'. The hyphenation margin is associated with the environment.

A negative argument resets the hyphenation margin to zero, emitting a warning of type 'range'.

.hys [hyphenation-space] Suppress hyphenation of the line in adjustment modes 'b' or 'n', if it can be justified by adding no more than 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 indicator is 'm'. 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 of type 'range'.

.itc n name As .it, but text lines interrupted with the \c escape are not applied to the line count.

.kern n If n is non-zero or missing, enable pairwise kerning, otherwise disable it.

.length reg anything Compute the number of characters in anything and return the count in the number register reg. If reg doesn't exist, it is created. anything is read in copy mode.

.ds xxx abcd\h'3i'efgh .length yyy \*[xxx] \n[yyy] 14

.linetabs n If n is non-zero or missing, enable line-tabs mode, otherwise disable it (which is the default). In line-tabs mode, tab distances are computed relative to the (current) output line. Otherwise they are taken relative to the input line. For example, the following

.ds x a\t\c .ds y b\t\c .ds z c .ta 1i 3i \*x \*y \*z

yields

a b c

In line-tabs mode, the same code gives

a b c

Line-tabs mode is associated with the current environment; the read-only number register \n[.linetabs] is set to 1 if in line-tabs mode, and 0 otherwise.

.lsm [name] Set the leading space macro (trap) to name. If there are leading space characters on an input line, name is invoked in lieu of the usual roff behavior; the leading spaces are removed. The count of leading spaces on an input line is stored in \n[lsn], and the amount of corresponding horizontal motion in \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 name. If no argument is supplied, the default leading space behavior is (re-)established.

.mso file The same as the so request except that file is searched for in the same directories as macro files for the -m command-line option. If the file name to be included has the form name.tmac and it isn't found, .mso tries to include tmac.name instead and vice versa. If file does not exist, a warning of type 'file' is emitted and the request has no other effect.

.msoquiet file As .mso, but no warning is emitted if file does not exist.

.nop anything Interpret anything as if it were an input line. This is similar to '.if 1'. .nop is not really 'no operation'; its argument is processed—unconditionally. It can be used to cause text lines to share indentation with surrounding control lines.

.nroff Make the n built-in condition true and the t built-in condition false. This can be reversed using the troff request.

.open stream filename Open filename for writing and associate the stream named stream with it. See also the close and write requests.

.opena stream filename Like open, but if filename exists, append to it instead of truncating it.

.output string Emit string directly to the intermediate output (subject to copy-mode interpretation); this is similar to \! used at the top level. An initial double quote in string is stripped off to allow initial blanks.

.pev Report the state of the current environment followed by that of all other environments to the standard error stream.

.pnr Print the names and contents of all currently defined number registers on stderr.

.psbb filename Get the bounding box of a PostScript image filename. This file must conform to Adobe's Document Structuring Conventions; the command looks for a %%BoundingBox comment to extract the bounding box values. After a successful call, the coordinates (in PostScript units) of the lower left and upper right corner can be found in the registers \n[llx], \n[lly], \n[urx], and \n[ury], respectively. If some error has occurred, the four registers are set to zero.

.pso command This behaves like the so request except that input comes from the standard output of command.

.ptr Print the names and positions of all traps (not including input line traps and diversion traps) on stderr. Empty slots in the page trap list are printed as well, because they can affect the priority of subsequently planted traps.

.pvs ±n Set the post-vertical line space to n; default scaling indicator is 'p'. This value is added to each line after it has been output. With no argument, the post-vertical line space is set to its previous value.

The total vertical line spacing consists of four components: .vs and \x with a negative value which are applied before the line is output, and .pvs and \x with a positive value which are applied after the line is output.

.rchar c1 c2 ... Remove the definitions of glyphs c1, c2, and so on. This undoes the effect of a .char request.

.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.

.rfschar f c1 c2 ... Remove the font-specific definitions of glyphs c1, c2, ... for font f. Whitespace is optional between cn arguments. See .fschar.

.rj .rj n Right justify the next n input lines. Without an argument right justify the next input line. The number of lines to be right justified is available in the \n[.rj] register. This implicitly does .ce 0. The ce request implicitly does .rj 0.

.rnn xx yy Rename number register xx to yy. If xx doesn't exist, the request is ignored.

.schar c string Define global fallback character (or glyph) c to be string. The syntax of this request is the same as the char request; a glyph defined with schar is searched after the list of fonts declared with the special request but before the mounted special fonts.

.shc glyph Set the soft hyphen glyph, inserted when a word is hyphenated automatically or at a hyphenation character, to glyph. If the argument is omitted, the soft hyphen glyph is set to the default, \[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 (specified with the .char request) nor translations (specified with the .tr request) are considered when assigning the soft hyphen glyph.

.shift n In a macro, shift the arguments by n positions: argument i becomes argument i-n; arguments 1 to n are no longer available. If n is missing, arguments are shifted by 1. Shifting by negative amounts is currently undefined.

.sizes s1 s2 ... sn [0] This request is similar to the sizes command of a DESC file. It sets the available font sizes for the current font to s1, s2, ... sn scaled points. The list of sizes can be terminated by an optional '0'. Each si can also be a range of sizes mn. Contrary to the font file command, the list can't extend over more than a single line.

.soquiet file As .so, but no warning is emitted if file does not exist.

.special s1 s2 ... Fonts s1, s2, ... are special and are searched for glyphs not in the current font. Without arguments, reset the list of special fonts to be empty.

.spreadwarn [limit] Emit a break warning if the additional space inserted for each space between words in an output line adjusted to both margins with '.ad b' is larger than or equal to limit. A negative value is treated as zero; an absent argument toggles the warning on and off without changing limit. The default scaling indicator is m. At startup, .spreadwarn is inactive and limit is 3 m.

For example,

.spreadwarn 0.2m

causes a warning if break warnings are not suppressed and troff must add 0.2 m or more for each interword space in a line. See troff(1) for warning types and control.

.stringdown str .stringup str Alter the string named str by replacing each of its bytes with its lowercase (down) or uppercase (up) version (if one exists). groff special characters (see groff_char(7)) can be used and the output will usually transform in the expected way due to the regular naming convention of the special character escapes.

.ds resume R\['e]sum\['e]\" \*[resume] \# Résumé .stringdown resume \*[resume] \# résumé .stringup resume \*[resume] \# RÉSUMÉ

.sty n f Associate style f with font position n. A font position can be associated either with a font or with a style. The current font is the index of a font position and so is also either a font or a style. When it is a style, the font that is actually used is the font the name of which is the concatenation of the name of the current family and the name of the current style. For example, if the current font is 1 and font position 1 is associated with style R and the current font family is T, then font TR is used. If the current font is not a style, then the current family is ignored. When the requests cs, bd, tkf, uf, or fspecial are applied to a style, then they are applied instead to the member of the current family corresponding to that style. The default family can be set with the -f command-line option. The styles command in the DESC file controls which font positions (if any) are initially associated with styles rather than fonts.

.substring str start [end] Replace the string named str with its substring bounded by the indices start and end, inclusive. The first character in the string has index 0. If 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.

.ds xxx abcdefgh .substring xxx 1 -4 \*[xxx] bcde .substring xxx 2 \*[xxx] de

.tkf f s1 n1 s2 n2 Enable track kerning for font f. When the current font is f the width of every glyph is increased by an amount between n1 and n2; when the current point size is less than or equal to s1 the width is increased by n1; when it is greater than or equal to s2 the width is increased by n2; when the point size is greater than or equal to s1 and less than or equal to s2 the increase in width is a linear function of the point size.

.tm1 string Similar to the tm request, string is read in copy mode and written on the standard error, but an initial double quote in string is stripped off to allow initial blanks.

.tmc string Similar to tm1 but without writing a final newline.

.trf filename Transparently output the contents of file filename. Each line is output as if preceded by \!; however, the lines are not subject to copy-mode interpretation. If the file does not end with a newline, then a newline is added. For example, you can define a macro x containing the contents of file f, using

.di x .trf f .di

Unlike with the cf request, the file cannot contain characters, such as NUL, that are not valid troff input characters.

.trin abcd This is the same as the tr request except that the asciify request uses the character code (if any) before the character translation. Example:

.trin ax .di xxx a .br .di .xxx .trin aa .asciify xxx .xxx

The result is x a. Using tr, the result would be x x.

.trnt abcd This is the same as the tr request except that the translations do not apply to text that is transparently throughput into a diversion with \!. For example,

.tr ab .di x \!.tm a .di .x

prints b; if trnt is used instead of tr it prints a.

.troff Make the n built-in condition false, and the t built-in condition true. This undoes the effect of the nroff request.

.unformat div Like .asciify, unformat the diversion div. However, .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.

.vpt n Enable vertical position traps if n is non-zero, disable them otherwise. Vertical position traps are traps set by the wh or dt requests. Traps set by the it request are not vertical position traps. The parameter that controls whether vertical position traps are enabled is global. Initially, vertical position traps are enabled.

.warn n Control warnings. n is the sum of the numbers associated with each warning that is to be enabled; all other warnings are disabled. The number associated with each warning is listed in troff(1). For example, .warn 0 disables all warnings, and .warn 1 disables all warnings except that about missing glyphs. If n is not given, all warnings are enabled.

.warnscale si Set the scaling indicator used in warnings to si. Valid values for si are u, i, c, p, and P. At startup, it is set to i.

.while cond-expr anything Evaluate the conditional expression cond-expr, and repeatedly execute anything unless and until cond-expr evaluates false. See also the break and continue requests.

The body of a while request is treated like the body of a de request: troff temporarily stores it in a macro that is deleted after the loop exits. It can considerably slow down a macro if the body of the while request (within the macro) is large. Each time the macro is executed, the while body is parsed and stored again as a temporary macro.

The traditional and often better solution (AT&T troff lacked the while request) is to use a recursive macro instead that is parsed only once during its definition. The number of available recursion levels is set to 1000 (this is a compile-time constant value of troff).

The closing brace of a while body must end a line.

.write stream anything Write anything to the stream named stream. stream must previously have been the subject of an open request. anything is read in copy mode; a leading " is stripped.

.writec stream anything Similar to write but without writing a final newline.

.writem stream xx Write the contents of the macro or string xx to the stream named stream. stream must previously have been the subject of an open request. xx is read in copy mode.

Extended requests .cf filename When used in a diversion, this embeds in the diversion an object which, when reread, will cause the contents of filename to be transparently copied through to the output. In AT&T troff, the contents of filename are immediately copied through to the output regardless of whether there is a current diversion; this behavior is so anomalous that it must be considered a bug.

.de xx yy .am xx yy .ds xx yy .as xx yy In compatibility mode, these requests behave similarly to .de1, .am1, .ds1, and .as1, respectively: a 'compatibility save' token is inserted at the beginning, and a 'compatibility restore' token at the end, with compatibility mode switched on during execution.

.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.

.ss word-space-size additional-sentence-space-size A second argument to the .ss request sets the amount of additional space separating sentences on the same output line. If omitted, this amount is set to word-space-size. The arguments' units are twelfths of the space width of the current font (see groff_font(5)) and default to 12.

.ta [[n1 n2 ... nn ]T r1 r2 ... rn] groff supports an extended syntax to specify repeating tab stops after the 'T' 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 groff.

The syntax summary above instructs groff to set tabs at positions n1, n2, ..., nn, then at nn+r1, nn+r2, ..., nn+rn, then at nn+rn+r1, nn+rn+r2, ..., nn+rn+rn, and so on.

New number registers The following read-only registers are available:

\n[.br] Within a macro call, it is set to 1 if the macro is called with the 'normal' control character ('.' by default), and set to 0 otherwise. This allows the reliable modification of requests.

.als bp*orig bp .de bp .tm before bp .ie \\n[.br] .bp*orig .el 'bp*orig .tm after bp ..

Using this register outside of a macro makes no sense (it always returns zero in such cases).

\n[.C] 1 if compatibility mode is in effect, 0 otherwise.

\n[.cdp] The depth of the last glyph added to the current environment. It is positive if the glyph extends below the baseline.

\n[.ce] The number of lines remaining to be centered, as set by the ce request.

\n[.cht] The height of the last glyph added to the current environment. It is positive if the glyph extends above the baseline.

\n[.color] 1 if colors are enabled, 0 otherwise.

\n[.cp] Within a .do request, holds the saved value of compatibility mode (see \n[.C] above).

\n[.csk] The skew of the last glyph added to the current environment. The 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.

\n[.ev] The name or number of the current environment. This is a string-valued register.

\n[.fam] The current font family. This is a string-valued register.

\n[.fn] The current (internal) real font name. This is a string- valued register. If the current font is a style, the value of \n[.fn] is the proper concatenation of family and style name.

\n[.fp] The number of the next free font position.

\n[.g] Always 1. Macros should use this to determine whether they are running under GNU troff.

\n[.height] The current height of the font as set with \H.

\n[.hla] The hyphenation language in the current environment.

\n[.hlc] The count of immediately preceding consecutive hyphenated lines in the current environment.

\n[.hlm] The maximum number of consecutive hyphenated lines allowed in the current environment.

\n[.hy] The hyphenation mode in the current environment.

\n[.hym] The hyphenation margin in the current environment.

\n[.hys] The hyphenation space adjustment threshold in the current environment.

\n[.in] The indentation that applies to the current output line.

\n[.int] Set to a positive value if last output line is interrupted (i.e., if it contains \c).

\n[.kern] 1 if pairwise kerning is enabled, 0 otherwise.

\n[.lg] The current ligature mode (as set by the lg request).

\n[.linetabs] The current line-tabs mode (as set by the linetabs request).

\n[.ll] The line length that applies to the current output line.

\n[.lt] The title length as set by the lt request.

\n[.m] The name of the current drawing color. This is a string- valued register.

\n[.M] The name of the current background color. This is a string-valued register.

\n[.ne] The amount of space that was needed in the last ne request that caused a trap to be sprung. Useful in conjunction with the \n[.trunc] register.

\n[.nm] 1 if output line numbering is enabled (even if temporarily suppressed), 0 otherwise.

\n[.ns] 1 if no-space mode is active, 0 otherwise.

\n[.O] The current output level as set with \O.

\n[.P] 1 if the current page is in the output list set with -o.

\n[.pe] 1 during a page ejection caused by the bp request, 0 otherwise.

\n[.pn] The number of the next page, either the value set by a pn request, or the number of the current page plus 1.

\n[.ps] The current point size in scaled points.

\n[.psr] The last-requested point size in scaled points.

\n[.pvs] The current post-vertical line space as set with the pvs request.

\n[.rj] The number of lines to be right-justified as set by the rj request.

\n[.slant] The slant of the current font as set with \S.

\n[.sr] The last requested point size in points as a decimal fraction. This is a string-valued register.

\n[.ss] \n[.sss] The values of minimal inter-word spacing and additional inter-sentence spacing, respectively, in twelfths of the space width of the current font. Set by the .ss request.

\n[.sty] The current font style. This is a string-valued register.

\n[.tabs] A string representation of the current tab settings suitable for use as an argument to the ta request.

\n[.trunc] The amount of vertical space truncated by the most recently sprung vertical position trap, or, if the trap was sprung by an ne request, minus the amount of vertical motion produced by the ne request. In other words, at the point a trap is sprung, it represents the difference of what the vertical position would have been but for the trap, and what the vertical position actually is. Useful in conjunction with the \n[.ne] register.

\n[.U] Set to 1 if in unsafe mode (as determined by troff's -U command-line option) and 0 otherwise.

\n[.vpt] 1 if vertical position traps are enabled, 0 otherwise.

\n[.warn] The sum of the numbers associated with each of the currently enabled warnings. The number associated with each warning is listed in troff(1).

\n[.x] The major version number of the running troff formatter. For example, if the version number is 1.23.0, then \n[.x] contains 1.

\n[.y] The minor version number of the running troff formatter. For example, if the version number is 1.23.0, then \n[.y] contains 23.

\n[.Y] The revision number of the running troff formatter. For example, if the version number is 1.23.0, then \n[.Y] contains 0.

\n[.zoom] The zoom value of the current font, in multiples of 1/1000th. Zero if no magnification.

\n[llx] \n[lly] \n[urx] \n[ury] These four read/write registers are set by the psbb request and contain the bounding box values (in PostScript units) of a given PostScript image.

The following read/write registers are set by the \w escape sequence:

\n[rst] \n[rsb] Like the st and sb registers, but take account of the heights and depths of glyphs.

\n[ssc] The amount of horizontal space (possibly negative) that should be added to the last glyph before a subscript.

\n[skw] How far to right of the center of the last glyph in the \w argument, the center of an accent from a roman font should be placed over that glyph.

Other available read/write number registers are:

\n[c.] The current input line number. \n[.c] is a read-only alias to this register.

\n[hours] The number of hours past midnight. Initialized at start- up.

\n[hp] The current horizontal position at input line.

\n[lsn] \n[lss] If there are leading spaces on an input line, these registers hold the count of leading spaces and the amount of corresponding horizontal motion, respectively.

\n[minutes] The number of minutes after the hour. Initialized at start-up.

\n[seconds] The number of seconds after the minute. Initialized at start-up.

\n[systat] The return value of the system() function executed by the last sy request.

\n[slimit] If greater than 0, the maximum number of objects on the input stack. If less than or equal to 0, there is no limit on the number of objects on the input stack. With no limit, recursion can continue until virtual memory is exhausted.

\n[year] The current year. AT&T troff's \n[yr] register stores the current year minus 1900.

Miscellaneous GNU troff predefines a string, \*[.T] containing the argument given to the -T command-line option, namely the output device (for example, pdf or utf8). The (read-only) register \n[.T] interpolates 1 if troff is called with the -T command-line option, and 0 otherwise.

Fonts not listed in the DESC file are automatically mounted on the next available font position when they are referenced. If a font is to be mounted explicitly with the .fp request on an unused font position, it should be mounted on the first unused font position, which can be found in the \n[.fp] register; although troff does not enforce that strictly. Rather, it does not allow a font to be mounted at a position whose number is much greater than that of any currently used position.

Interpolating a string does not hide existing macro arguments. Thus, in a macro, a more efficient way of doing

.xx \\$@

is

\\*[xx]\\

If the font description file contains pairwise kerning information, glyphs from that font are kerned. Kerning between two glyphs can be inhibited by placing a non-printing input break \& between them.

In a string comparison in a condition, characters that appear at different interpolation depths from the first delimiter character are not recognized as the second or third delimiters. This also applies to the .tl request. In a \w escape sequence, a character that appears at a different interpolation depth from the starting delimiter character is not recognized as the closing delimiter character. The same is true for \A, \b, \B, \C, \l, \L, \o, \X, and \Z. When decoding a macro or string argument that is delimited by double quotes, a character that appears at a different interpolation depth from the starting delimiter character is not recognized as the closing delimiter character. The implementation of \$@ ensures that the double quotes surrounding an argument appear at the same interpolation depth, which is differs from the depth of the argument itself. In a long escape name ] is not recognized as a closing delimiter except when it occurs at the same interpolation depth as the opening [. In compatibility mode, no attention is paid to the interpolation depth.

In groff, the .tr request can map characters onto \~.

A font can control the widths of spaces emitted by the \| and \^ escape sequences, by defining glyphs of these names (including the leading backslash).

In groff, tabs and spaces are allowed between the first and second dots (or between the dot and the name of the ending macro) that end a macro definition. Example:

.if t \{\ . de bar . nop Hello, I'm 'bar'. . . .\}