diff options
Diffstat (limited to 'contrib/groff/doc/groff-7')
-rw-r--r-- | contrib/groff/doc/groff-7 | 1608 |
1 files changed, 1608 insertions, 0 deletions
diff --git a/contrib/groff/doc/groff-7 b/contrib/groff/doc/groff-7 new file mode 100644 index 0000000..382e218 --- /dev/null +++ b/contrib/groff/doc/groff-7 @@ -0,0 +1,1608 @@ +This is groff, produced by makeinfo version 4.2 from ./groff.texinfo. + +This manual documents GNU `troff' version 1.18. + + Copyright (C) 1994-2000, 2001, 2002 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.1 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover texts + being `A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + `GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: `You have freedom to copy and + modify this GNU Manual, like GNU software. Copies published by + the Free Software Foundation raise funds for GNU development." + +INFO-DIR-SECTION Miscellaneous +START-INFO-DIR-ENTRY +* Groff: (groff). The GNU troff document formatting system. +END-INFO-DIR-ENTRY + + +File: groff, Node: Diversions, Next: Environments, Prev: Traps, Up: gtroff Reference + +Diversions +========== + + In `gtroff' it is possible to "divert" text into a named storage +area. Due to the similarity to defining macros it is sometimes said to +be stored in a macro. This is used for saving text for output at a +later time, which is useful for keeping blocks of text on the same +page, footnotes, tables of contents, and indices. + + For orthogonality it is said that `gtroff' is in the "top-level +diversion" if no diversion is active (i.e., the data is diverted to the +output device). + + - Request: .di macro + - Request: .da macro + Begin a diversion. Like the `de' request, it takes an argument of + a macro name to divert subsequent text into. The `da' macro + appends to an existing diversion. + + `di' or `da' without an argument ends the diversion. + + - Request: .box macro + - Request: .boxa macro + Begin (or appends to) a diversion like the `di' and `da' requests. + The difference is that `box' and `boxa' do not include a + partially-filled line in the diversion. + + Compare this: + + + Before the box. + .box xxx + In the box. + .br + .box + After the box. + .br + => Before the box. After the box. + .xxx + => In the box. + + with this: + + + Before the diversion. + .di yyy + In the diversion. + .br + .di + After the diversion. + .br + => After the diversion. + .yyy + => Before the diversion. In the diversion. + + `box' or `boxa' without an argument ends the diversion. + + - Register: \n[.z] + - Register: \n[.d] + Diversions may be nested. The read-only number register `.z' + contains the name of the current diversion (this is a string-valued + register). The read-only number register `.d' contains the current + vertical place in the diversion. If not in a diversion it is the + same as the register `nl'. + + - Register: \n[.h] + The "high-water mark" on the current page. It corresponds to the + text baseline of the lowest line on the page. This is a read-only + register. + + + .tm .h==\n[.h], nl==\n[nl] + => .h==0, nl==-1 + This is a test. + .br + .sp 2 + .tm .h==\n[.h], nl==\n[nl] + => .h==40, nl==120 + + As can be seen in the previous example, empty lines are not + considered in the return value of the `.h' register. + + - Register: \n[dn] + - Register: \n[dl] + After completing a diversion, the read-write number registers `dn' + and `dl' contain the vertical and horizontal size of the diversion. + + + .\" Center text both horizontally & vertically + . + .\" Enclose macro definitions in .eo and .ec + .\" to avoid the doubling of the backslash + .eo + .\" macro .(c starts centering mode + .de (c + . br + . ev (c + . evc 0 + . in 0 + . nf + . di @c + .. + + + .\" macro .)c terminates centering mode + .de )c + . br + . ev + . di + . nr @s (((\n[.t]u - \n[dn]u) / 2u) - 1v) + . sp \n[@s]u + . ce 1000 + . @c + . ce 0 + . sp \n[@s]u + . br + . fi + . rr @s + . rm @s + . rm @c + .. + .\" End of macro definitions, restore escape mechanism + .ec + + + - Escape: \! + - Escape: \?ANYTHING\? + Prevent requests, macros, and escapes from being interpreted when + read into a diversion. This takes the given text and + "transparently" embeds it into the diversion. This is useful for + macros which shouldn't be invoked until the diverted text is + actually output. + + The `\!' escape transparently embeds text up to and including the + end of the line. The `\?' escape transparently embeds text until + the next occurrence of the `\?' escape. For example: + + + \?ANYTHING\? + + ANYTHING may not contain newlines; use `\!' 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 the following example prints 4. + + + .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 + + Both escapes read the data in copy mode. + + If `\!' is used in the top-level diversion, its argument is + directly embedded into the `gtroff' intermediate output. This can + be used for example to control a postprocessor which processes the + data before it is sent to the device driver. + + The `\?' escape used in the top-level diversion produces no output + at all; its argument is simply ignored. + + - Request: .output string + Emit STRING directly to the `gtroff' 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. + + This request can't be used before the first page has started - if + you get an error, simply insert `.br' before the `output' request. + + Without argument, `output' is ignored. + + Use with caution! It is normally only needed for mark-up used by a + postprocessor which does something with the output before sending + it to the output device, filtering out `string' again. + + - Request: .asciify div + "Unformat" the diversion specified by DIV in such a way that ASCII + characters, characters translated with the `trin' request, space + characters, and some escape sequences that were formatted and + diverted are treated like ordinary input characters when the + diversion is reread. It 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 + + *Note Copy-in Mode::. + + - Request: .unformat div + Like `asciify', unformat the specified diversion. However, + `unformat' only unformats spaces and tabs between words. + Unformatted tabs are treated as input tokens, and spaces are + stretchable again. + + The vertical size of lines is not preserved; glyph information + (font, font size, space width, etc.) is retained. + + +File: groff, Node: Environments, Next: Suppressing output, Prev: Diversions, Up: gtroff Reference + +Environments +============ + + It happens frequently that some text should be printed in a certain +format regardless of what may be in effect at the time, for example, in +a trap invoked macro to print headers and footers. To solve this +`gtroff' processes text in "environments". An environment contains +most of the parameters that control text processing. It is possible to +switch amongst these environments; by default `gtroff' processes text +in environment 0. The following is the information kept in an +environment. + + * font parameters (size, family, style, glyph height and slant, space + and sentence space size) + + * page parameters (line length, title length, vertical spacing, line + spacing, indentation, line numbering, centering, right-justifying, + underlining, hyphenation data) + + * fill and adjust mode + + * tab stops, tab and leader characters, escape character, no-break + and hyphen indicators, margin character data + + * partially collected lines + + * input traps + + * drawing and fill colours + + These environments may be given arbitrary names (see *Note +Identifiers::, for more info). Old versions of `troff' only had +environments named `0', `1', and `2'. + + - Request: .ev [env] + - Register: \n[.ev] + Switch to another environment. The argument ENV is the name of + the environment to switch to. With no argument, `gtroff' switches + back to the previous environment. There is no limit on the number + of named environments; they are created the first time that they + are referenced. The `.ev' read-only register contains the name or + number of the current environment. This is a string-valued + register. + + Note that a call to `ev' (with argument) pushes the previously + active environment onto a stack. If, say, environments `foo', + `bar', and `zap' are called (in that order), the first `ev' + request without parameter switches back to environment `bar' + (which is popped off the stack), and a second call switches back + to environment `foo'. + + Here is an example: + + + .ev footnote-env + .fam N + .ps 6 + .vs 8 + .ll -.5i + .ev + + ... + + .ev footnote-env + \(dg Note the large, friendly letters. + .ev + + + - Request: .evc env + Copy the environment ENV into the current environment. + + The following environment data is not copied: + + * Partially filled lines. + + * The status whether the previous line was interrupted. + + * The number of lines still to center, or to right-justify, or + to underline (with or without underlined spaces); they are + set to zero. + + * The status whether a temporary indent is active. + + * Input traps and its associated data. + + * Line numbering mode is disabled; it can be reactivated with + `.nm +0'. + + * The number of consecutive hyphenated lines (set to zero). + + - Register: \n[.cht] + - Register: \n[.cdp] + - Register: \n[.csk] + The `\n[.cht]' register contains the maximum extent (above the + baseline) of the last glyph added to the current environment. + + The `\n[.cdp]' register contains the maximum extent (below the + baseline) of the last glyph added to the current environment. + + The `\n[.csk]' register contains the "skew" (how far to the right + of the glyph's center that `gtroff' shold place an accent) of the + last glyph added to the current environment. + + +File: groff, Node: Suppressing output, Next: Colors, Prev: Environments, Up: gtroff Reference + +Suppressing output +================== + + - Escape: \ONUM + Disable or enable output depending on the value of NUM: + + `\O0' + Disable any glyphs from being emitted to the device driver, + provided that the escape occurs at the outer level (see + `\O[3]' and `\O[4]'). Motion is not suppressed so + effectively `\O[0]' means _pen up_. + + `\O1' + Enable output of glyphs, provided that the escape occurs at + the outer level. + + `\O0' and `\O1' also reset the four registers `opminx', `opminy', + `opmaxx', and `opmaxy' to -1. *Note Register Index::. These four + registers mark the top left and bottom right hand corners of a box + which encompasses all written glyphs. + + For example the input text: + + + Hello \O[0]world \O[1]this is a test. + + produces the following output: + + + Hello this is a test. + + `\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, `gtroff' is at outer + level. + + `\O4' + End a nesting level. + + `\O[5PFILENAME]' + This escape is `grohtml' specific. Provided that this escape + occurs at the outer nesting level write the `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 will be associated with the + production of the next inline image. + + +File: groff, Node: Colors, Next: I/O, Prev: Suppressing output, Up: gtroff Reference + +Colors +====== + + - Request: .color [n] + - Register: \n[.color] + If N is missing or non-zero, activate colors (this is the default); + otherwise, turn it off. + + The read-only number register `.color' is 1 if colors are active, + 0 otherwise. + + Internally, `color' sets a global flag; it does not produce a + token. Similar to the `cp' request, you should use it at the + beginning of your document to control color output. + + Colors can be also turned off with the `-c' command line option. + + - Request: .defcolor ident scheme color_components + Define color with name IDENT. SCHEME can be one of the following + values: `rgb' (three components), `cym' (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). The default color name value is device-specific + (usually black). It is possible that the default color for `\m' + and `\M' is not identical. + + A new scaling indicator `f' 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 (1f equals 65536u). + 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 + + + - Escape: \mC + - Escape: \m(CO + - Escape: \m[COLOR] + Set drawing color. The following example shows how to turn the + next four words red. + + + \m[red]these are in red\m[] and these words are in black. + + The escape `\m[]' returns to the previous color. + + The drawing color is associated with the current environment + (*note Environments::). + + Note that `\m' doesn't produce an input token in `gtroff'. As a + consequence, it can be used in requests like `mc' (which expects a + single character as an argument) to change the color on the fly: + + + .mc \m[red]x\m[] + + + - Escape: \MC + - Escape: \M(CO + - Escape: \M[COLOR] + Set background color for filled objects drawn with the `\D'...'' + commands. + + A red ellipse can be created with the following code: + + + \M[red]\h'0.5i'\D'E 2i 1i'\M[] + + The escape `\M[]' returns to the previous fill color. + + The fill color is associated with the current environment (*note + Environments::). + + Note that `\M' doesn't produce an input token in `gtroff'. + + +File: groff, Node: I/O, Next: Postprocessor Access, Prev: Colors, Up: gtroff Reference + +I/O +=== + + `gtroff' has several requests for including files: + + - Request: .so file + Read in the specified FILE and includes it in place of the `so' + request. This is quite useful for large documents, e.g. keeping + each chapter in a separate file. *Note gsoelim::, for more + information. + + Since `gtroff' replaces the `so' request with the contents of + `file', it makes a difference whether the data is terminated with + a newline or not: Assuming that file `xxx' contains the word `foo' + without a final newline, this + + + This is + .so xxx + bar + + yields `This is foobar'. + + - Request: .pso command + Read the standard output from the specified COMMAND and includes + it in place of the `pso' request. + + This request causes an error if used in safer mode (which is the + default). Use `groff''s or `troff''s `-U' option to activate + unsafe mode. + + The comment regarding a final newline for the `so' request is valid + for `pso' also. + + - Request: .mso file + Identical to the `so' request except that `gtroff' searches for + the specified FILE in the same directories as macro files for the + 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' and vice versa. + + - Request: .trf file + - Request: .cf file + Transparently output the contents of FILE. Each line is output as + if it were 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 (`trf' only). For example, to define a + macro `x' containing the contents of file `f', use + + + .di x + .trf f + .di + + Both `trf' and `cf', when used in a diversion, embeds an object in + the diversion which, when reread, causes the contents of FILE to + be transparently copied through to the output. In UNIX `troff', + the contents of FILE is immediately copied through to the output + regardless of whether there is a current diversion; this behaviour + is so anomalous that it must be considered a bug. + + While `cf' copies the contents of FILE completely unprocessed, + `trf' disallows characters such as NUL that are not valid `gtroff' + input characters (*note Identifiers::). + + Both requests cause a line break. + + - Request: .nx [file] + Force `gtroff' to continue processing of the file specified as an + argument. If no argument is given, immediately jump to the end of + file. + + - Request: .rd [prompt [arg1 arg2 ...]] + Read from standard input, and include what is read as though it + were part of the input file. Text is read until a blank line is + encountered. + + If standard input is a TTY input device (keyboard), write PROMPT + to standard error, followed by a colon (or send BEL for a beep if + no argument is given). + + Arguments after PROMPT are available for the input. For example, + the line + + + .rd data foo bar + + with the input `This is \$2.' prints + + + This is bar. + + + Using the `nx' and `rd' requests, it is easy to set up form letters. +The form letter template is constructed like this, putting the +following lines into a file called `repeat.let': + + + .ce + \*(td + .sp 2 + .nf + .rd + .sp + .rd + .fi + Body of letter. + .bp + .nx repeat.let + +When this is run, a file containing the following lines should be +redirected in. Note that requests included in this file are executed +as though they were part of the form letter. The last block of input +is the `ex' request which tells `groff' to stop processing. If this +was not there, `groff' would not know when to stop. + + + Trent A. Fisher + 708 NW 19th Av., #202 + Portland, OR 97209 + + Dear Trent, + + Len Adollar + 4315 Sierra Vista + San Diego, CA 92103 + + Dear Mr. Adollar, + + .ex + + - Request: .pi pipe + Pipe the output of `gtroff' to the shell command(s) specified by + PIPE. This request must occur before `gtroff' has a chance to + print anything. + + `pi' causes an error if used in safer mode (which is the default). + Use `groff''s or `troff''s `-U' option to activate unsafe mode. + + Multiple calls to `pi' are allowed, acting as a chain. For + example, + + + .pi foo + .pi bar + ... + + is the same as `.pi foo | bar'. + + Note that the intermediate output format of `gtroff' is piped to + the specified commands. Consequently, calling `groff' without the + `-Z' option normally causes a fatal error. + + - Request: .sy cmds + - Register: \n[systat] + Execute the shell command(s) specified by CMDS. The output is not + saved anyplace, so it is up to the user to do so. + + This request causes an error if used in safer mode (which is the + default). Use `groff''s or `troff''s `-U' option to activate + unsafe mode. + + For example, the following code fragment introduces the current + time into a document: + + + .sy perl -e 'printf ".nr H %d\\n.nr M %d\\n.nr S %d\\n",\ + (localtime(time))[2,1,0]' > /tmp/x\n[$$] + .so /tmp/x\n[$$] + .sy rm /tmp/x\n[$$] + \nH:\nM:\nS + + Note that this works by having the `perl' script (run by `sy') + print out the `nr' requests which set the number registers `H', + `M', and `S', and then reads those commands in with the `so' + request. + + For most practical purposes, the number registers `seconds', + `minutes', and `hours' which are initialized at start-up of + `gtroff' should be sufficient. Use the `af' request to get a + formatted output: + + + .af hours 00 + .af minutes 00 + .af seconds 00 + \n[hours]:\n[minutes]:\n[seconds] + + The `systat' read-write number register contains the return value + of the `system()' function executed by the last `sy' request. + + - Request: .open stream file + - Request: .opena stream file + Open the specified FILE for writing and associates the specified + STREAM with it. + + The `opena' request is like `open', but if the file exists, append + to it instead of truncating it. + + Both `open' and `opena' cause an error if used in safer mode + (which is the default). Use `groff''s or `troff''s `-U' option to + activate unsafe mode. + + - Request: .write stream data + - Request: .writec stream data + Write to the file associated with the specified STREAM. The + stream must previously have been the subject of an open request. + The remainder of the line is interpreted as the `ds' request reads + its second argument: A leading `"' is stripped, and it is read in + copy-in mode. + + The `writec' request is like `write', but only `write' appends a + newline to the data. + + - Request: .writem stream xx + Write the contents of the macro or string XX to the file + associated with the specified STREAM. + + XX is read in copy mode, i.e., already formatted elements are + ignored. Consequently, diversions must be unformatted with the + `asciify' request before calling `writem'. Usually, this means a + loss of information. + + - Request: .close stream + Close the specified STREAM; the stream is no longer an acceptable + argument to the `write' request. + + Here a simple macro to write an index entry. + + + .open idx test.idx + . + .de IX + . write idx \\n[%] \\$* + .. + . + .IX test entry + . + .close idx + + + - Escape: \VE + - Escape: \V(EV + - Escape: \V[ENV] + Interpolate the contents of the specified environment variable ENV + (one-character name E, two-character name EV) as returned by the + function `getenv'. `\V' is interpreted in copy-in mode. + + +File: groff, Node: Postprocessor Access, Next: Miscellaneous, Prev: I/O, Up: gtroff Reference + +Postprocessor Access +==================== + + There are two escapes which give information directly to the +postprocessor. This is particularly useful for embedding POSTSCRIPT +into the final document. + + - Escape: \X'XXX' + Embeds its argument into the `gtroff' output preceded with `x X'. + + The escapes `\&', `\)', `\%', and `\:' are ignored within `\X', + `\ ' and `\~' are converted to single space characters. All other + escapes (except `\\' which produces a backslash) cause an error. + + If the `use_charnames_in_special' keyword is set in the `DESC' + file, special characters no longer cause an error; the name XX is + represented as `\(XX)' in the `x X' output command. Additionally, + the backslash is represented as `\\'. + + `use_charnames_in_special' is currently used by `grohtml' only. + + - Escape: \YN + - Escape: \Y(NM + - Escape: \Y[NAME] + This is approximately equivalent to `\X'\*[NAME]'' (one-character + name N, two-character name NM). However, the contents of the + string or macro NAME are not interpreted; also it is permitted for + NAME 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 UNIX `troff' + output format, and confuses drivers that do not know about this + extension (*note Device Control Commands::). + + *Note Output Devices::. + + +File: groff, Node: Miscellaneous, Next: Gtroff Internals, Prev: Postprocessor Access, Up: gtroff Reference + +Miscellaneous +============= + + This section documents parts of `gtroff' which cannot (yet) be +categorized elsewhere in this manual. + + - Request: .nm [start [inc [space [indent]]]] + Print line numbers. START is the line number of the _next_ output + line. INC indicates which line numbers are printed. For example, + the value 5 means to emit only line numbers which are multiples + of 5; this defaults to 1. SPACE is the space to be left between + the number and the text; this defaults to one digit space. The + fourth argument is the indentation of the line numbers, defaulting + to zero. Both SPACE and INDENT are given as multiples of digit + spaces; they can be negative also. Without any arguments, line + numbers are turned off. + + `gtroff' reserves three digit spaces for the line number (which is + printed right-justified) plus the amount given by INDENT; the + output lines are concatenated to the line numbers, separated by + SPACE, and _without_ reducing the line length. Depending on the + value of the horizontal page offset (as set with the `po' + request), line numbers which are longer than the reserved space + stick out to the left, or the whole line is moved to the right. + + Parameters corresponding to missing arguments are not changed; any + non-digit argument (to be more precise, any argument starting with + a character valid as a delimiter for identifiers) is also treated + as missing. + + If line numbering has been disabled with a call to `nm' without an + argument, it can be reactivated with `.nm +0', using the + previously active line numbering parameters. + + The parameters of `nm' are associated with the current environment + (*note Environments::). The current output line number is + available in the number register `ln'. + + + .po 1m + .ll 2i + This test shows how line numbering works with groff. + .nm 999 + This test shows how line numbering works with groff. + .br + .nm xxx 3 2 + .ll -\w'0'u + This test shows how line numbering works with groff. + .nn 2 + This test shows how line numbering works with groff. + + And here the result: + + + This test shows how + line numbering works + 999 with groff. This + 1000 test shows how line + 1001 numbering works with + 1002 groff. + This test shows how + line numbering + works with groff. + This test shows how + 1005 line numbering + works with groff. + + + - Request: .nn [skip] + Temporarily turn off line numbering. The argument is the number + of lines not to be numbered; this defaults to 1. + + - Request: .mc glyph [dist] + Print a "margin character" to the right of the text.(1) (*note + Miscellaneous-Footnote-1::) The first argument is the glyph to be + printed. The second argument is the distance away from the right + margin. If missing, the previously set value is used; default is + 10pt). For text lines that are too long (that is, longer than the + text length plus DIST), the margin character is directly appended + to the lines. + + With no arguments the margin character is turned off. If this + occurs before a break, no margin character is printed. + + For empty lines and lines produced by the `tl' request no margin + character is emitted. + + The margin character is associated with the current environment + (*note Environments::). + + This is quite useful for indicating text that has changed, and, in + fact, there are programs available for doing this (they are called + `nrchbar' and `changebar' and can be found in any + `comp.sources.unix' archive. + + + .ll 3i + .mc | + This paragraph is highlighted with a margin + character. + .sp + Note that vertical space isn't marked. + .br + \& + .br + But we can fake it with `\&'. + + Result: + + + This paragraph is highlighted | + with a margin character. | + + Note that vertical space isn't | + marked. | + | + But we can fake it with `\&'. | + + + - Request: .psbb filename + - Register: \n[llx] + - Register: \n[lly] + - Register: \n[urx] + - Register: \n[ury] + Retrieve the bounding box of the PostScript image found in + FILENAME. The file must conform to Adobe's "Document Structuring + Conventions" (DSC); the command searches for a `%%BoundingBox' + comment and extracts the bounding box values into the number + registers `llx', `lly', `urx', and `ury'. If an error occurs (for + example, `psbb' cannot find the `%%BoundingBox' comment), it sets + the four number registers to zero. + + +File: groff, Node: Miscellaneous-Footnotes, Up: Miscellaneous + + (1) "Margin character" is a misnomer since it is an output glyph. + + +File: groff, Node: Gtroff Internals, Next: Debugging, Prev: Miscellaneous, Up: gtroff Reference + +`gtroff' Internals +================== + + `gtroff' processes input in three steps. One or more input +characters are converted to an "input token".(1) (*note Gtroff +Internals-Footnote-1::) Then, one or more input tokens are converted +to an "output node". Finally, output nodes are converted to the +intermediate output language understood by all output devices. + + Actually, before step one happens, `gtroff' converts certain escape +sequences into reserved input characters (not accessible by the user); +such reserved characters are used for other internal processing also - +this is the very reason why not all characters are valid input. *Note +Identifiers::, for more on this topic. + + For example, the input string `fi\[:u]' is converted into a +character token `f', a character token `i', and a special token `:u' +(representing u umlaut). Later on, the character tokens `f' and `i' +are merged to a single output node representing the ligature glyph `fi' +(provided the current font has a glyph for this ligature); the same +happens with `:u'. All output glyph nodes are `processed' which means +that they are invariably associated with a given font, font size, +advance width, etc. During the formatting process, `gtroff' itself +adds various nodes to control the data flow. + + Macros, diversions, and strings collect elements in two chained +lists: a list of input tokens which have been passed unprocessed, and a +list of output nodes. Consider the following the diversion. + + + .di xxx + a + \!b + c + .br + .di + +It contains these elements. + +node list token list element number +line start node -- 1 +glyph node `a' -- 2 +word space node -- 3 +-- `b' 4 +-- `\n' 5 +glyph node `c' -- 6 +vertical size node -- 7 +vertical size node -- 8 +-- `\n' 9 + +Elements 1, 7, and 8 are inserted by `gtroff'; the latter two (which +are always present) specify the vertical extent of the last line, +possibly modified by `\x'. The `br' request finishes the current +partial line, inserting a newline input token which is subsequently +converted to a space when the diversion is reread. Note that the word +space node has a fixed width which isn't stretchable anymore. To +convert horizontal space nodes back to input tokens, use the `unformat' +request. + + Macros only contain elements in the token list (and the node list is +empty); diversions and strings can contain elements in both lists. + + Note that the `chop' request simply reduces the number of elements +in a macro, string, or diversion by one. Exceptions are "compatibility +save" and "compatibility ignore" input tokens which are ignored. The +`substring' request also ignores those input tokens. + + Some requests like `tr' or `cflags' work on glyph identifiers only; +this means that the associated glyph can be changed without destroying +this association. This can be very helpful for substituting glyphs. +In the following example, we assume that glyph `foo' isn't available by +default, so we provide a substitution using the `fchar' request and map +it to input character `x'. + + + .fchar \[foo] foo + .tr x \[foo] + +Now let us assume that we install an additional special font `bar' +which has glyph `foo'. + + + .special bar + .rchar \[foo] + +Since glyphs defined with `fchar' are searched before glyphs in special +fonts, we must call `rchar' to remove the definition of the fallback +glyph. Anyway, the translation is still active; `x' now maps to the +real glyph `foo'. + + +File: groff, Node: Gtroff Internals-Footnotes, Up: Gtroff Internals + + (1) Except the escapes `\f', `\F', `\H', `\m', `\M', `\R', `\s', and +`\S' which are processed immediately if not in copy-in mode. + + +File: groff, Node: Debugging, Next: Implementation Differences, Prev: Gtroff Internals, Up: gtroff Reference + +Debugging +========= + + `gtroff' is not easy to debug, but there are some useful features +and strategies for debugging. + + - Request: .lf line filename + Change the line number and the file name `gtroff' shall use for + error and warning messages. LINE is the input line number of the + _next_ line. + + Without argument, the request is ignored. + + This is a debugging aid for documents which are split into many + files, then put together with `soelim' and other preprocessors. + Usually, it isn't invoked manually. + + - Request: .tm string + - Request: .tm1 string + - Request: .tmc string + Send STRING to the standard error output; this is very useful for + printing debugging messages among other things. + + STRING is read in copy mode. + + The `tm' request ignores leading spaces of STRING; `tm1' handles + its argument similar to the `ds' request: a leading double quote + in STRING is stripped to allow initial blanks. + + The `tmc' request is similar to `tm1' but does not append a + newline (as is done in `tm' and `tm1'). + + - Request: .ab [string] + Similar to the `tm' request, except that it causes `gtroff' to + stop processing. With no argument it prints `User Abort.' to + standard error. + + - Request: .ex + The `ex' request also causes `gtroff' to stop processing; see also + *Note I/O::. + + When doing something involved it is useful to leave the debugging +statements in the code and have them turned on by a command line flag. + + + .if \n(DB .tm debugging output + +To activate these statements say + + + groff -rDB=1 file + + If it is known in advance that there will be many errors and no +useful output, `gtroff' can be forced to suppress formatted output with +the `-z' flag. + + - Request: .pm + Print the entire symbol table on `stderr'. Names of all defined + macros, strings, and diversions are print together with their size + in bytes. Since `gtroff' sometimes adds nodes by itself, the + returned size can be larger than expected. + + This request differs from UNIX `troff': `gtroff' reports the sizes + of diversions, ignores an additional argument to print only the + total of the sizes, and the size isn't returned in blocks of 128 + characters. + + - Request: .pnr + Print the names and contents of all currently defined number + registers on `stderr'. + + - Request: .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. + + - Request: .fl + Instruct `gtroff' to flush its output immediately. The intent is + for interactive use, but this behaviour is currently not + implemented in `gtroff'. Contrary to UNIX `troff', TTY output is + sent to a device driver also (`grotty'), making it non-trivial to + communicate interactively. + + This request causes a line break. + + - Request: .backtrace + Print a backtrace of the input stack to the standard error stream. + + Consider the following in file `test': + + + .de xxx + . backtrace + .. + .de yyy + . xxx + .. + . + .yyy + + On execution, `gtroff' prints the following: + + + test:2: backtrace: macro `xxx' + test:5: backtrace: macro `yyy' + test:8: backtrace: file `test' + + The option `-b' of `gtroff' internally calls a variant of this + request on each error and warning. + + - Register: \n[slimit] + Use the `slimit' number register to set the maximum number of + objects on the input stack. If `slimit' is less than or equal + to 0, there is no limit set. With no limit, a buggy recursive + macro can exhaust virtual memory. + + The default value is 1000; this is a compile-time constant. + + - Request: .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'. + + - Request: .spreadwarn [limit] + Make `gtroff' emit a warning if the additional space inserted for + each space between words in an output line is larger or equal to + LIMIT. A negative value is changed to zero; no argument toggles + the warning on and off without changing LIMIT. The default scaling + indicator is `m'. At startup, `spreadwarn' is deactivated, and + LIMIT is set to 3m. + + For example, + + + .spreadwarn 0.2m + + will cause a warning if `gtroff' must add 0.2m or more for each + interword space in a line. + + This request is active only if text is justified to both margins + (using `.ad b'). + + `gtroff' has command line options for printing out more warnings +(`-w') and for printing backtraces (`-b') when a warning or an error +occurs. The most verbose level of warnings is `-ww'. + + - Request: .warn [flags] + - Register: \n[.warn] + Control the level of warnings checked for. The FLAGS are 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 below. For example, `.warn 0' disables all + warnings, and `.warn 1' disables all warnings except that about + missing glyphs. If no argument is given, all warnings are enabled. + + The read-only number register `.warn' contains the current warning + level. + +* Menu: + +* Warnings:: + + +File: groff, Node: Warnings, Prev: Debugging, Up: Debugging + +Warnings +-------- + + The warnings that can be given to `gtroff' are divided into the +following categories. The name associated with each warning is used by +the `-w' and `-W' options; the number is used by the `warn' request and +by the `.warn' register. + +`char' +`1' + Non-existent glyphs.(1) (*note Warnings-Footnote-1::) This is + enabled by default. + +`number' +`2' + Invalid numeric expressions. This is enabled by default. *Note + Expressions::. + +`break' +`4' + In fill mode, lines which could not be broken so that their length + was less than the line length. This is enabled by default. + +`delim' +`8' + Missing or mismatched closing delimiters. + +`el' +`16' + Use of the `el' request with no matching `ie' request. *Note + if-else::. + +`scale' +`32' + Meaningless scaling indicators. + +`range' +`64' + Out of range arguments. + +`syntax' +`128' + Dubious syntax in numeric expressions. + +`di' +`256' + Use of `di' or `da' without an argument when there is no current + diversion. + +`mac' +`512' + Use of undefined strings, macros and diversions. When an undefined + string, macro, or diversion is used, that string is automatically + defined as empty. So, in most cases, at most one warning is given + for each name. + +`reg' +`1024' + Use of undefined number registers. When an undefined number + register is used, that register is automatically defined to have a + value of 0. So, in most cases, at most one warning is given for + use of a particular name. + +`tab' +`2048' + Use of a tab character where a number was expected. + +`right-brace' +`4096' + Use of `\}' where a number was expected. + +`missing' +`8192' + Requests that are missing non-optional arguments. + +`input' +`16384' + Invalid input characters. + +`escape' +`32768' + Unrecognized escape sequences. When an unrecognized escape + sequence `\X' is encountered, the escape character is ignored, and + X is printed. + +`space' +`65536' + Missing space between a request or macro and its argument. This + warning is given when an undefined name longer than two characters + is encountered, and the first two characters of the name make a + defined name. The request or macro is not invoked. When this + warning is given, no macro is automatically defined. This is + enabled by default. This warning never occurs in compatibility + mode. + +`font' +`131072' + Non-existent fonts. This is enabled by default. + +`ig' +`262144' + Invalid escapes in text ignored with the `ig' request. These are + conditions that are errors when they do not occur in ignored text. + +`color' +`524288' + Color related warnings. + +`all' + All warnings except `di', `mac' and `reg'. It is intended that + this covers all warnings that are useful with traditional macro + packages. + +`w' + All warnings. + + +File: groff, Node: Warnings-Footnotes, Up: Warnings + + (1) `char' is a misnomer since it reports missing glyphs - there +aren't missing input characters, only invalid ones. + + +File: groff, Node: Implementation Differences, Prev: Debugging, Up: gtroff Reference + +Implementation Differences +========================== + + GNU `troff' has a number of features which cause incompatibilities +with documents written with old versions of `troff'. + + Long names cause some incompatibilities. UNIX `troff' interprets + + + .dsabcd + +as defining a string `ab' with contents `cd'. Normally, GNU `troff' +interprets this as a call of a macro named `dsabcd'. Also UNIX `troff' +interprets `\*[' or `\n[' as references to a string or number register +called `['. In GNU `troff', however, this is normally interpreted as +the start of a long name. In compatibility mode GNU `troff' interprets +long names in the traditional way (which means that they are not +recognized as names). + + - Request: .cp [n] + - Request: .do cmd + - Register: \n[.C] + If N is missing or non-zero, turn on compatibility mode; + otherwise, turn it off. + + The read-only number register `.C' is 1 if compatibility mode is + on, 0 otherwise. + + Compatibility mode can be also turned on with the `-C' command line + option. + + The `do' request turns off compatibility mode while executing its + arguments as a `gtroff' command. + + + .do fam T + + executes the `fam' request when compatibility mode is enabled. + + `gtroff' restores the previous compatibility setting before + interpreting any files sourced by the CMD. + + Two other features are controlled by `-C'. If not in compatibility +mode, GNU `troff' preserves the input level in delimited arguments: + + + .ds xx ' + \w'abc\*(xxdef' + +In compatibility mode, the string `72def'' is returned; without `-C' +the resulting string is `168' (assuming a TTY output device). + + Finally, the escapes `\f', `\H', `\m', `\M', `\R', `\s', and `\S' +are transparent for recognizing the beginning of a line only in +compatibility mode (this is a rather obscure feature). For example, +the code + + + .de xx + Hallo! + .. + \fB.xx\fP + + prints `Hallo!' in bold face if in compatibility mode, and `.xx' in +bold face otherwise. + + GNU `troff' does not allow the use of the escape sequences `\|', +`\^', `\&', `\{', `\}', `\<SP>', `\'', `\`', `\-', `\_', `\!', `\%', +and `\c' in names of strings, macros, diversions, number registers, +fonts or environments; UNIX `troff' does. The `\A' escape sequence +(*note Identifiers::) may be helpful in avoiding use of these escape +sequences in names. + + Fractional point sizes cause one noteworthy incompatibility. In +UNIX `troff' the `ps' request ignores scale indicators and thus + + + .ps 10u + +sets the point size to 10 points, whereas in GNU `troff' it sets the +point size to 10 scaled points. *Note Fractional Type Sizes::, for +more information. + + In GNU `troff' there is a fundamental difference between +(unformatted) input characters and (formatted) output 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 `bd', `cs', `tkf', +`tr', or `fp' requests. Normally glyphs are constructed from input +characters at the moment immediately before the glyph is added to the +current output line. Macros, diversions and strings are all, in fact, +the same type of object; they contain lists of input characters and +glyph nodes in any combination. A glyph node does not behave like an +input character for the purposes of macro processing; it does not +inherit any of the special properties that the input character from +which it was constructed might have had. For example, + + + .di x + \\\\ + .br + .di + .x + +prints `\\' in GNU `troff'; each pair of input backslashes is turned +into one output backslash and the resulting output backslashes are not +interpreted as escape characters when they are reread. UNIX `troff' +would interpret them as escape characters when they were reread and +would end up printing one `\'. The correct way to obtain a printable +backslash is to use the `\e' escape sequence: This always prints a +single instance of the current escape character, regardless of whether +or not it is used in a diversion; it also works in both GNU `troff' and +UNIX `troff'.(1) (*note Implementation Differences-Footnote-1::) To +store, for some reason, an escape sequence in a diversion that will be +interpreted when the diversion is reread, either use the traditional +`\!' transparent output facility, or, if this is unsuitable, the new +`\?' escape sequence. + + *Note Diversions::, and *Note Gtroff Internals::, for more +information. + + +File: groff, Node: Implementation Differences-Footnotes, Up: Implementation Differences + + (1) To be completely independent of the current escape character, +use `\(rs' which represents a reverse solidus (backslash) glyph. + + +File: groff, Node: Preprocessors, Next: Output Devices, Prev: gtroff Reference, Up: Top + +Preprocessors +************* + + This chapter describes all preprocessors that come with `groff' or +which are freely available. + +* Menu: + +* geqn:: +* gtbl:: +* gpic:: +* ggrn:: +* grap:: +* grefer:: +* gsoelim:: + + +File: groff, Node: geqn, Next: gtbl, Prev: Preprocessors, Up: Preprocessors + +`geqn' +====== + +* Menu: + +* Invoking geqn:: + + +File: groff, Node: Invoking geqn, Prev: geqn, Up: geqn + +Invoking `geqn' +--------------- + + +File: groff, Node: gtbl, Next: gpic, Prev: geqn, Up: Preprocessors + +`gtbl' +====== + +* Menu: + +* Invoking gtbl:: + + +File: groff, Node: Invoking gtbl, Prev: gtbl, Up: gtbl + +Invoking `gtbl' +--------------- + + +File: groff, Node: gpic, Next: ggrn, Prev: gtbl, Up: Preprocessors + +`gpic' +====== + +* Menu: + +* Invoking gpic:: + + +File: groff, Node: Invoking gpic, Prev: gpic, Up: gpic + +Invoking `gpic' +--------------- + + +File: groff, Node: ggrn, Next: grap, Prev: gpic, Up: Preprocessors + +`ggrn' +====== + +* Menu: + +* Invoking ggrn:: + + +File: groff, Node: Invoking ggrn, Prev: ggrn, Up: ggrn + +Invoking `ggrn' +--------------- + + +File: groff, Node: grap, Next: grefer, Prev: ggrn, Up: Preprocessors + +`grap' +====== + + A free implementation of `grap', written by Ted Faber, is available +as an extra package from the following address: + + <http://www.lunabase.org/~faber/Vault/software/grap/> + + +File: groff, Node: grefer, Next: gsoelim, Prev: grap, Up: Preprocessors + +`grefer' +======== + +* Menu: + +* Invoking grefer:: + + +File: groff, Node: Invoking grefer, Prev: grefer, Up: grefer + +Invoking `grefer' +----------------- + + +File: groff, Node: gsoelim, Prev: grefer, Up: Preprocessors + +`gsoelim' +========= + +* Menu: + +* Invoking gsoelim:: + + +File: groff, Node: Invoking gsoelim, Prev: gsoelim, Up: gsoelim + +Invoking `gsoelim' +------------------ + + +File: groff, Node: Output Devices, Next: File formats, Prev: Preprocessors, Up: Top + +Output Devices +************** + +* Menu: + +* Special Characters:: +* grotty:: +* grops:: +* grodvi:: +* grolj4:: +* grolbp:: +* grohtml:: +* gxditview:: + + +File: groff, Node: Special Characters, Next: grotty, Prev: Output Devices, Up: Output Devices + +Special Characters +================== + + *Note Font Files::. + + +File: groff, Node: grotty, Next: grops, Prev: Special Characters, Up: Output Devices + +`grotty' +======== + +* Menu: + +* Invoking grotty:: + + +File: groff, Node: Invoking grotty, Prev: grotty, Up: grotty + +Invoking `grotty' +----------------- + |