A translation is a mapping of an input character to an output
glyph. The mapping occurs at output time, i.e., the input character
gets assigned the metric information of the mapped output character
right before input tokens are converted to nodes (see gtroff Internals, for more on this process).
.tr abcd… ¶.trin abcd… ¶Translate character a to glyph b, character c to
glyph d, and so on. If there is an odd number of characters
in the argument, the last one is translated to a fixed-width space (the
same one obtained by the \SP escape sequence).
The trin request is identical to tr, but when you unformat
a diversion with asciify it ignores the translation.
See Diversions, for details about the asciify request.
Some notes:
\(xx, \[xxx],
\C'xxx', \', \`, \-, \_),
glyphs defined with the char request, and numbered glyphs
(\N'xxx') can be translated also.
\e escape can be translated also.
\% and \~ escape
sequences (but \% and \~ can’t be mapped onto another
glyph).
\a), tab (and
\t).
shc request.
.tr a\&
foo bar
⇒ foo br
Even the space character can be mapped to the dummy character.
.tr aa \&
foo bar
⇒ foobar
As shown in the example, the space character can’t be the first
character/glyph pair as an argument of tr. Additionally, it is
not possible to map the space character to any other glyph; requests
like ‘.tr aa x’ undo ‘.tr aa \&’ instead.
If justification is active, lines are justified in spite of the ‘empty’ space character (but there is no minimal distance, i.e., the space character, between words).
tr.
tr does not check whether the elements of its
argument exist.
See gtroff Internals.
tr request is ignored.
.trnt abcd… ¶trnt is the same as the tr request except that the
translations do not apply to text that is transparently throughput into
a diversion with \!. See Diversions.
For example,
.tr ab .di x \!.tm a .di .x
prints ‘b’ to the standard error stream; if trnt is used
instead of tr it prints ‘a’.