[Go to CFHT Home Page] Man Pages
Back to Software Index  BORDER=0Manpage Top Level
    .ds tx TeX
GROFF_DIFF(7) manual page Table of Contents

Name

groff_diff - differences between GNU troff and classical troff

Description

This manual page describes the language differences between groff, the GNU roff text processing system, and the classical roff formatter of the freely available Unix~7 of the 1970s, documented in the Troff User’s Manual by Ossanna and Kernighan. This includes the roff language as well as the intermediate output format (troff output).

The section SEE ALSO gives pointers to both the classical roff and the modern groff documentation.

Groff Language

In this section, all additional features of groff compared to the classical Unix~7 troff are described in detail.

Long names

The names of number registers, fonts, strings/:macros/:diversions, special characters (glyphs), and colors can be of any length. In escape sequences, additionally to the classical ‘(xx’ construction for a two-character glyph name, you can use ‘[xxx]’ for a name of arbitrary length.
[rs][xxx]
Print the special character (glyph) called xxx.
[rs][comp1 comp2 ...]
Print composite glyph consisting of multiple components. Example: ‘[rs][A~ho]’ is capital letter A with ogonek which finally maps to glyph name ‘u0041_0328’. See the groff info file for details 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.
[rs]f[xxx]
Set font xxx. Additionally, [rs]f[] is a new syntax form equal to [rs]fP, i.e., to return to the previous font.
[rs]*[xxx arg1 arg2 ...]
Interpolate string xxx, taking arg1, arg2, ..., as arguments.
[rs]n[xxx]
Interpolate number register xxx.

Fractional point sizes

A scaled point is equal to 1/sizescale points, where sizescale is specified in the DESC file (1 by default). There is a new scale indicator~z that has the effect of multiplying by sizescale. Requests and escape sequences in troff interpret arguments that represent a point size as being in units of scaled points, but they evaluate each such argument using a default scale indicator of~z. Arguments treated in this way are the argument to the ps request, the third argument to the cs request, the second and fourth arguments to the tkf request, the argument to the [rs]H escape sequence, and those variants of the [rs]s escape sequence that take a numeric expression as their argument.

For example, suppose sizescale is 1000; then a scaled point is equivalent to a millipoint; the call .ps 10.25 is equivalent to .ps 10.25z and so sets the point size to 10250 scaled points, which is equal to 10.25 points.

The number register [rs]n[.s] returns the point size in points as decimal fraction. There is also a new number register [rs]n[.ps] that returns the point size in scaled points.

It would make no sense to use the z~scale indicator in a numeric expression whose default scale indicator was neither u nor~z, and so troff disallows this. Similarly it would make no sense to use a scaling indicator other than z or~u in a numeric expression whose default scale indicator was~z, and so troff disallows this as well.

There is also new scale indicator~s which multiplies by the number of units in a scaled point. So, for example, [rs]n[.ps]s is equal to 1m. Be sure not to confuse the s and z~scale indicators.

Numeric expressions

Spaces are permitted in a number expression within parentheses.

M indicates a scale of 100ths of an em. f indicates a scale of 65536 units, providing fractions for color definitions with the defcolor request. For example, 0.5f = 32768u.

e1>?e2
The maximum of e1 and e2.
e1<?e2
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.

New escape sequences

[rs]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.
[rs]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.
[rs]C’xxx
Typeset glyph named xxx. Normally it is more convenient to use [rs][xxx]R]. But [rs]C has the advantage that it is compatible with recent versions of UNIX and is available in compatibility mode.
[rs]E
This is equivalent to an escape character, but it is not interpreted in copy mode. For example, strings to start and end superscripting could be defined like this
.ds { [rs]v’-.3m’[rs]s’[rs]En[.s]*6u/10u’
.ds } [rs]s0[rs]v’.3m’
The use of
[rs]E ensures that these definitions work even if [rs]*{ gets interpreted in copy mode (for example, by being used in a macro argument).
[rs]Ff
[rs]F(fm [rs]F[fam] Change font family. This is the same as the fam request. [rs]F[] switches back to the previous font family (note that [rs]FP won’t work; it selects font family ‘P’ instead).
[rs]mx
[rs]m(xx [rs]m[xxx] Set drawing color. [rs]m[] switches back to the previous color.
[rs]Mx
[rs]M(xx [rs]M[xxx] Set background color for filled objects drawn with the [rs]D’... commands. [rs]M[] switches back to the previous color.
[rs]N’n
Typeset the glyph with index~n in the current font. n~can be any integer. Most devices only have glyphs with indices between 0 and 255. If the current font does not contain a glyph with that code, special fonts are not searched. The [rs]N escape sequence can be conveniently used in conjunction with the char request, for example
.char [rs][phone] [rs]f(ZD[rs]N’37’
The index of each glyph is given in the fourth column in the font
description file after the charset command. It is possible to include unnamed glyphs in the font description file by using a name of ---; the [rs]N escape sequence is the only way to use these.
[rs]On
[rs]O[n] Suppress troff output. The escapes [rs]O2, [rs]O3, [rs]O4, and [rs]O5 are intended for internal use by grohtml.
[rs]O0
Disable any ditroff glyphs from being emitted to the device driver, provided that the escape occurs at the outer level (see [rs]O3 and [rs]O4).
[rs]O1
Enable output of glyphs, provided that the escape occurs at the outer level.
[rs]O0
and [rs]O1 also reset the registers [rs]n[opminx], [rs]n[opminy], [rs]n[opmaxx], and [rs]n[opmaxy] to~-1. These four registers mark the top left and bottom right hand corners of a box which encompasses all written glyphs.
[rs]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 [rs]O.
[rs]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 [rs]O3 escape starts a new page if the device is not html (to reduce the possibility of images crossing a page boundary).
[rs]O4
End a nesting level.
[rs]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.
[rs]R’name [+-]n
This has the same effect as
 -
  • [rs]s(nn
    [rs]s[+-](nn Set the point size to nn points; nn must be exactly two digits.
    [rs]s[[+-]n]
    [rs]s[+-][n] [rs]s’[+-]n [rs]s[+-]’n Set the point size to n scaled points; n is a numeric expression with a default scale indicator of~z.
    [rs]Vx
    [rs]V(xx [rs]V[xxx] Interpolate the contents of the environment variable xxx, as returned by getenv(3) . [rs]V is interpreted in copy mode.
    [rs]Yx
    [rs]Y(xx [rs]Y[xxx] This is approximately equivalent to [rs]X’[rs]*[xxx]’R]. 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 [rs]X to contain newlines). The inclusion of newlines requires an extension to the UNIX troff output format, and confuses drivers that do not know about this extension.
    [rs]Z’anything
    Print anything and then restore the horizontal and vertical position; anything may not contain tabs or leaders.
    [rs]$0
    The name by which the current macro was invoked. The als request can make a macro have more than one name.
    [rs]$*
    In a macro or string, the concatenation of all the arguments separated by spaces.
    [rs]$@
    In a macro or string, the concatenation of all the arguments with each surrounded by double quotes, and separated by spaces.
    [rs]$^
    In a macro, the representation of all parameters as if they were an argument to the ds request.
    [rs]$(nn
    [rs]$[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.
    [rs]?anything[rs]?
    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 [rs]! if you want to embed newlines in a diversion. The escape sequence [rs]? 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 [rs]?[rs][rs]?[rs][rs][rs][rs]?[rs][rs][rs][rs][rs][rs][rs][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
    prints~4.
    [rs]/
    This increases 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.


    Table of Contents