diff options
Diffstat (limited to 'contrib/groff/doc/groff-6')
-rw-r--r-- | contrib/groff/doc/groff-6 | 1415 |
1 files changed, 1415 insertions, 0 deletions
diff --git a/contrib/groff/doc/groff-6 b/contrib/groff/doc/groff-6 new file mode 100644 index 0000000..c7d9b81 --- /dev/null +++ b/contrib/groff/doc/groff-6 @@ -0,0 +1,1415 @@ +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: Strings, Next: Conditionals and Loops, Prev: Sizes, Up: gtroff Reference + +Strings +======= + + `gtroff' has string variables, which are entirely for user +convenience (i.e. there are no built-in strings exept `.T', but even +this is a read-write string variable). + + - Request: .ds name [string] + - Request: .ds1 name [string] + - Escape: \*N + - Escape: \*(NM + - Escape: \*[NAME ARG1 ARG2 ...] + Define and access a string variable NAME (one-character name N, + two-character name NM). If NAME already exists, `ds' overwrites + the previous definition. Only the syntax form using brackets can + take arguments which are handled identically to macro arguments; + the single exception is that a closing bracket as an argument must + be enclosed in double quotes. *Note Request Arguments::, and + *Note Parameters::. + + Example: + + + .ds foo a \\$1 test + . + This is \*[foo nice]. + => This is a nice test. + + The `\*' escape "interpolates" (expands in-place) a + previously-defined string variable. To be more precise, the stored + string is pushed onto the input stack which is then parsed by + `gtroff'. Similar to number registers, it is possible to nest + strings, i.e. string variables can be called within string + variables. + + If the string named by the `\*' escape does not exist, it is + defined as empty, and a warning of type `mac' is emitted (see + *Note Debugging::, for more details). + + *Caution:* Unlike other requests, the second argument to the `ds' + request takes up the entire line including trailing spaces. This + means that comments on a line with such a request can introduce + unwanted space into a string. + + + .ds UX \s-1UNIX\s0\u\s-3tm\s0\d \" UNIX trademark + + Instead the comment should be put on another line or have the + comment escape adjacent with the end of the string. + + + .ds UX \s-1UNIX\s0\u\s-3tm\s0\d\" UNIX trademark + + To produce leading space the string can be started with a double + quote. No trailing quote is needed; in fact, any trailing quote is + included in your string. + + + .ds sign " Yours in a white wine sauce, + + Strings are not limited to a single line of text. A string can + span several lines by escaping the newlines with a backslash. The + resulting string is stored _without_ the newlines. + + + .ds foo lots and lots \ + of text are on these \ + next several lines + + It is not possible to have real newlines in a string. To put a + single double quote character into a string, use two consecutive + double quote characters. + + The `ds1' request turns off compatibility mode while interpreting + a string. To be more precise, a "compatibility save" input token + is inserted at the beginning of the string, and a "compatibility + restore" input token at the end. + + + .nr xxx 12345 + .ds aa The value of xxx is \\n[xxx]. + .ds1 bb The value of xxx ix \\n[xxx]. + . + .cp 1 + . + \*(aa + => warning: number register `[' not defined + => The value of xxx is 0xxx]. + \*(bb + => The value of xxx ix 12345. + + Strings, macros, and diversions (and boxes) share the same name + space. Internally, even the same mechanism is used to store them. + This has some interesting consequences. For example, it is + possible to call a macro with string syntax and vice versa. + + + .de xxx + a funny test. + .. + This is \*[xxx] + => This is a funny test. + + .ds yyy a funny test + This is + .yyy + => This is a funny test. + + Diversions and boxes can be also called with string syntax. + + Another consequence is that you can copy one-line diversions or + boxes to a string. + + + .di xxx + a \fItest\fR + .br + .di + .ds yyy This is \*[xxx]\c + \*[yyy]. + => This is a test. + + As the previous example shows, it is possible to store formatted + output in strings. The `\c' escape prevents the insertion of an + additional blank line in the output. + + Copying diversions longer than a single output line produces + unexpected results. + + + .di xxx + a funny + .br + test + .br + .di + .ds yyy This is \*[xxx]\c + \*[yyy]. + => test This is a funny. + + Usually, it is not predictable whether a diversion contains one or + more output lines, so this mechanism should be avoided. With UNIX + `troff', this was the only solution to strip off a final newline + from a diversion. Another disadvantage is that the spaces in the + copied string are already formatted, making them unstretchable. + This can cause ugly results. + + A clean solution to this problem is available in GNU `troff', + using the requests `chop' to remove the final newline of a + diversion, and `unformat' to make the horizontal spaces + stretchable again. + + + .box xxx + a funny + .br + test + .br + .box + .chop xxx + .unformat xxx + This is \*[xxx]. + => This is a funny test. + + *Note Gtroff Internals::, for more information. + + - Request: .as name [string] + - Request: .as1 name [string] + The `as' request is similar to `ds' but appends STRING to the + string stored as NAME instead of redefining it. If NAME doesn't + exist yet, it is created. + + + .as sign " with shallots, onions and garlic, + + The `as1' request is similar to `as', but compatibility mode is + switched off while the appended string is interpreted. To be more + precise, a "compatibility save" input token is inserted at the + beginning of the appended string, and a "compatibility restore" + input token at the end. + + Rudimentary string manipulation routines are given with the next two +requests. + + - Request: .substring str n1 [n2] + Replace the string named STR with the substring defined by the + indices N1 and N2. The first character in the string has index 0. + If N2 is omitted, it is taken to be equal to the string's length. + If the index value N1 or N2 is negative, it is counted from the + end of the string, going backwards: The last character has + index -1, the character before the last character has index -2, + etc. + + + .ds xxx abcdefgh + .substring xxx 1 -4 + \*[xxx] + => bcde + + + - Request: .length reg str + Compute the number of characters of STR and return it in the + number register REG. If REG doesn't exist, it is created. `str' + is read in copy mode. + + + .ds xxx abcd\h'3i'efgh + .length yyy \n[xxx] + \n[yyy] + => 14 + + + - Request: .rn xx yy + Rename the request, macro, diversion, or string XX to YY. + + - Request: .rm xx + Remove the request, macro, diversion, or string XX. `gtroff' + treats subsequent invocations as if the object had never been + defined. + + - Request: .als new old + Create an alias named NEW for the request, string, macro, or + diversion object named OLD. The new name and the old name are + exactly equivalent (it is similar to a hard rather than a soft + link). If OLD is undefined, `gtroff' generates a warning of type + `mac' and ignores the request. + + - Request: .chop xx + Remove (chop) the last character from the macro, string, or + diversion named XX. This is useful for removing the newline from + the end of diversions that are to be interpolated as strings. + This command can be used repeatedly; see *Note Gtroff Internals::, + for details on nodes inserted additionally by `gtroff'. + + *Note Identifiers::, and *Note Comments::. + + +File: groff, Node: Conditionals and Loops, Next: Writing Macros, Prev: Strings, Up: gtroff Reference + +Conditionals and Loops +====================== + +* Menu: + +* Operators in Conditionals:: +* if-else:: +* while:: + + +File: groff, Node: Operators in Conditionals, Next: if-else, Prev: Conditionals and Loops, Up: Conditionals and Loops + +Operators in Conditionals +------------------------- + + In `if' and `while' requests, there are several more operators +available: + +`e' +`o' + True if the current page is even or odd numbered (respectively). + +`n' + True if the document is being processed in nroff mode (i.e., the + `.nroff' command has been issued). + +`t' + True if the document is being processed in troff mode (i.e., the + `.troff' command has been issued). + +`v' + Always false. This condition is for compatibility with other + `troff' versions only. + +`'XXX'YYY'' + True if the string XXX is equal to the string YYY. Other + characters can be used in place of the single quotes; the same set + of delimiters as for the `\D' escape is used (*note Escapes::). + `gtroff' formats the strings before being compared: + + + .ie "|"\fR|\fP" \ + true + .el \ + false + => true + + The resulting motions, glyph sizes, and fonts have to match,(1) + (*note Operators in Conditionals-Footnote-1::) and not the + individual motion, size, and font requests. In the previous + example, `|' and `\fR|\fP' both result in a roman `|' glyph with + the same point size and at the same location on the page, so the + strings are equal. If `.ft I' had been added before the `.ie', + the result would be "false" because (the first) `|' produces an + italic `|' rather than a roman one. + +`r XXX' + True if there is a number register named XXX. + +`d XXX' + True if there is a string, macro, diversion, or request named XXX. + +`m XXX' + True if there is a color named XXX. + +`c G' + True if there is a glyph G available(2) (*note Operators in + Conditionals-Footnote-2::); G is either an ASCII character or a + special character (`\(GG' or `\[GGG]'); the condition is also true + if G has been defined by the `char' request. + + Note that these operators can't be combined with other operators like +`:' or `&'; only a leading `!' (without whitespace between the +exclamation mark and the operator) can be used to negate the result. + + + .nr xxx 1 + .ie !r xxx \ + true + .el \ + false + => false + + A whitespace after `!' always evaluates to zero (this bizarre +behaviour is due to compatibility with UNIX `troff'). + + + .nr xxx 1 + .ie ! r xxx \ + true + .el \ + false + => r xxx true + + It is possible to omit the whitespace before the argument to the +`r', `d', and `c' operators. + + *Note Expressions::. + + +File: groff, Node: Operators in Conditionals-Footnotes, Up: Operators in Conditionals + + (1) The created output nodes must be identical. *Note Gtroff +Internals::. + + (2) The name of this conditional operator is a misnomer since it +tests names of output glyphs. + + +File: groff, Node: if-else, Next: while, Prev: Operators in Conditionals, Up: Conditionals and Loops + +if-else +------- + + `gtroff' has if-then-else constructs like other languages, although +the formatting can be painful. + + - Request: .if expr anything + Evaluate the expression EXPR, and executes ANYTHING (the remainder + of the line) if EXPR evaluates to non-zero (true). ANYTHING is + interpreted as though it was on a line by itself (except that + leading spaces are swallowed). *Note Expressions::, for more info. + + + .nr xxx 1 + .nr yyy 2 + .if ((\n[xxx] == 1) & (\n[yyy] == 2)) true + => true + + + - Request: .nop anything + Executes ANYTHING. This is similar to `.if 1'. + + - Request: .ie expr anything + - Request: .el anything + Use the `ie' and `el' requests to write an if-then-else. The + first request is the `if' part and the latter is the `else' part. + + + .ie n .ls 2 \" double-spacing in nroff + .el .ls 1 \" single-spacing in troff + + + - Escape: \{ + - Escape: \} + In many cases, an if (or if-else) construct needs to execute more + than one request. This can be done using the `\{' and `\}' + escapes. The following example shows the possible ways to use + these escapes (note the position of the opening and closing + braces). + + + .ie t \{\ + . ds lq `` + . ds rq '' + .\} + .el \ + .\{\ + . ds lq " + . ds rq "\} + + + *Note Expressions::. + + +File: groff, Node: while, Prev: if-else, Up: Conditionals and Loops + +while +----- + + `gtroff' provides a looping construct using the `while' request, +which is used much like the `if' (and related) requests. + + - Request: .while expr anything + Evaluate the expression EXPR, and repeatedly execute ANYTHING (the + remainder of the line) until EXPR evaluates to 0. + + + .nr a 0 1 + .while (\na < 9) \{\ + \n+a, + .\} + \n+a + => 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + + Some remarks. + + * The body of a `while' request is treated like the body of a + `de' request: `gtroff' temporarily stores it in a macro which + is deleted after the loop has been exited. 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. + + + .de xxx + . nr num 10 + . while (\\n[num] > 0) \{\ + . \" many lines of code + . nr num -1 + . \} + .. + + The traditional and ofter better solution (UNIX `troff' + doesn't have the `while' request) is to use a recursive macro + instead which is parsed only once during its definition. + + + .de yyy + . if (\\n[num] > 0) \{\ + . \" many lines of code + . nr num -1 + . yyy + . \} + .. + . + .de xxx + . nr num 10 + . yyy + .. + + Note that the number of available recursion levels is set + to 1000 (this is a compile-time constant value of `gtroff'). + + * The closing brace of a `while' body must end a line. + + + .if 1 \{\ + . nr a 0 1 + . while (\n[a] < 10) \{\ + . nop \n+[a] + .\}\} + => unbalanced \{ \} + + + - Request: .break + Break out of a `while' loop. Be sure not to confuse this with the + `br' request (causing a line break). + + - Request: .continue + Finish the current iteration of a `while' loop, immediately + restarting the next iteration. + + *Note Expressions::. + + +File: groff, Node: Writing Macros, Next: Page Motions, Prev: Conditionals and Loops, Up: gtroff Reference + +Writing Macros +============== + + A "macro" is a collection of text and embedded commands which can be +invoked multiple times. Use macros to define common operations. + + - Request: .de name [end] + - Request: .de1 name [end] + - Request: .dei name [end] + Define a new macro named NAME. `gtroff' copies subsequent lines + (starting with the next one) into an internal buffer until it + encounters the line `..' (two dots). The optional second argument + to `de' changes this to a macro to `.END'. + + There can be whitespace after the first dot in the line containing + the ending token (either `.' or macro `END'). + + Here a small example macro called `P' which causes a break and + inserts some vertical space. It could be used to separate + paragraphs. + + + .de P + . br + . sp .8v + .. + + The following example defines a macro within another. Remember + that expansion must be protected twice; once for reading the macro + and once for executing. + + + \# a dummy macro to avoid a warning + .de end + .. + . + .de foo + . de bar end + . nop \f[B]Hallo \\\\$1!\f[] + . end + .. + . + .foo + .bar Joe + => Hallo Joe! + + Since `\f' has no expansion, it isn't necessary to protect its + backslash. Had we defined another macro within `bar' which takes + a parameter, eight backslashes would be necessary before `$1'. + + The `de1' request turns off compatibility mode while executing the + macro. On entry, the current compatibility mode is saved and + restored at exit. + + + .nr xxx 12345 + . + .de aa + The value of xxx is \\n[xxx]. + .. + .de1 bb + The value of xxx ix \\n[xxx]. + .. + . + .cp 1 + . + .aa + => warning: number register ' not defined + => The value of xxx is 0xxx]. + .bb + => The value of xxx ix 12345. + + The `dei' request defines a macro indirectly. That is, it expands + strings whose names are NAME or END before performing the append. + + This: + + + .ds xx aa + .ds yy bb + .dei xx yy + + is equivalent to: + + + .de aa bb + + Using `trace.tmac', you can trace calls to `de' and `de1'. + + Note that macro identifiers are shared with identifiers for + strings and diversions. + + - Request: .am xx + - Request: .am1 xx + - Request: .ami xx yy + Works similarly to `de' except it appends onto the macro named XX. + So, to make the previously defined `P' macro actually do indented + instead of block paragraphs, add the necessary code to the + existing macro like this: + + + .am P + .ti +5n + .. + + The `am1' request turns off compatibility mode while executing the + appended macro piece. To be more precise, a "compatibility save" + input token is inserted at the beginning of the appended code, and + a "compatibility restore" input token at the end. + + The `ami' request appends indirectly, meaning that `gtroff' + expands strings whose names are XX or YY before performing the + append. + + Using `trace.tmac', you can trace calls to `am' and `am1'. + + *Note Strings::, for the `als' request to rename a macro. + + The `de', `am', `di', `da', `ds', and `as' requests (together with +its variants) only create a new object if the name of the macro, +diversion or string diversion is currently undefined or if it is +defined to be a request; normally they modify the value of an existing +object. + + - Request: .return + Exit a macro, immediately returning to the caller. + +* Menu: + +* Copy-in Mode:: +* Parameters:: + + +File: groff, Node: Copy-in Mode, Next: Parameters, Prev: Writing Macros, Up: Writing Macros + +Copy-in Mode +------------ + + When `gtroff' reads in the text for a macro, string, or diversion, +it copies the text (including request lines, but excluding escapes) into +an internal buffer. Escapes are converted into an internal form, +except for `\n', `\$', `\*', `\\' and `\<RET>' which are evaluated and +inserted into the text where the escape was located. This is known as +"copy-in" mode or "copy" mode. + + What this means is that you can specify when these escapes are to be +evaluated (either at copy-in time or at the time of use) by insulating +the escapes with an extra backslash. Compare this to the `\def' and +`\edef' commands in TeX. + + The following example prints the numbers 20 and 10: + + + .nr x 20 + .de y + .nr x 10 + \&\nx + \&\\nx + .. + .y + + +File: groff, Node: Parameters, Prev: Copy-in Mode, Up: Writing Macros + +Parameters +---------- + + The arguments to a macro or string can be examined using a variety of +escapes. + + - Register: \n[.$] + The number of arguments passed to a macro or string. This is a + read-only number register. + + Any individual argument can be retrieved with one of the following +escapes: + + - Escape: \$N + - Escape: \$(NN + - Escape: \$[NNN] + Retrieve the Nth, NNth or NNNth argument. As usual, the first + form only accepts a single number (larger than zero), the second a + two-digit number (larger or equal to 10), and the third any + positive integer value (larger than zero). Macros and strings can + have an unlimited number of arguments. Note that due to copy-in + mode, use two backslashes on these in actual use to prevent + interpolation until the macro is actually invoked. + + - Request: .shift [n] + Shift the arguments 1 position, or as many positions as specified + by its argument. After executing this request, argument I becomes + argument I-N; arguments 1 to N are no longer available. Shifting + by negative amounts is currently undefined. + + - Escape: \$* + - Escape: \$@ + In some cases it is convenient to use all of the arguments at once + (for example, to pass the arguments along to another macro). The + `\$*' escape concatenates all the arguments separated by spaces. A + similar escape is `\$@', which concatenates all the arguments with + each surrounded by double quotes, and separated by spaces. If not + in compatibility mode, the input level of double quotes is + preserved (see *Note Request Arguments::). + + - Escape: \$0 + The name used to invoke the current macro. The `als' request can + make a macro have more than one name. + + + .de generic-macro + . ... + . if \\n[error] \{\ + . tm \\$0: Houston, we have a problem. + . return + . \} + .. + . + .als foo generic-macro + .als bar generic-macro + + + *Note Request Arguments::. + + +File: groff, Node: Page Motions, Next: Drawing Requests, Prev: Writing Macros, Up: gtroff Reference + +Page Motions +============ + + *Note Manipulating Spacing::, for a discussion of the main request +for vertical motion, `sp'. + + - Request: .mk [reg] + - Request: .rt [dist] + The request `mk' can be used to mark a location on a page, for + movement to later. This request takes a register name as an + argument in which to store the current page location. With no + argument it stores the location in an internal register. The + results of this can be used later by the `rt' or the `sp' request + (or the `\v' escape). + + The `rt' request returns _upwards_ to the location marked with the + last `mk' request. If used with an argument, return to a position + which distance from the top of the page is DIST (no previous call + to `mk' is necessary in this case). Default scaling indicator is + `v'. + + Here a primitive solution for a two-column macro. + + + .nr column-length 1.5i + .nr column-gap 4m + .nr bottom-margin 1m + . + + + .de 2c + . br + . mk + . ll \\n[column-length]u + . wh -\\n[bottom-margin]u 2c-trap + . nr right-side 0 + .. + . + + + .de 2c-trap + . ie \\n[right-side] \{\ + . nr right-side 0 + . po -(\\n[column-length]u + \\n[column-gap]u) + . \" remove trap + . wh -\\n[bottom-margin]u + . \} + . el \{\ + . \" switch to right side + . nr right-side 1 + . po +(\\n[column-length]u + \\n[column-gap]u) + . rt + . \} + .. + . + + + .pl 1.5i + .ll 4i + This is a small test which shows how the + rt request works in combination with mk. + + .2c + Starting here, text is typeset in two columns. + Note that this implementation isn't robust + and thus not suited for a real two-column + macro. + + Result: + + + This is a small test which shows how the + rt request works in combination with mk. + + Starting here, isn't robust + text is typeset and thus not + in two columns. suited for a + Note that this real two-column + implementation macro. + + + The following escapes give fine control of movements about the page. + + - Escape: \v'E' + Move vertically, usually from the current location on the page (if + no absolute position operator `|' is used). The argument E + specifies the distance to move; positive is downwards and negative + upwards. The default scaling indicator for this escape is `v'. + Beware, however, that `gtroff' continues text processing at the + point where the motion ends, so you should always balance motions + to avoid interference with text processing. + + `\v' doesn't trigger a trap. This can be quite useful; for + example, consider a page bottom trap macro which prints a marker + in the margin to indicate continuation of a footnote or something + similar. + + There are some special-case escapes for vertical motion. + + - Escape: \r + Move upwards 1v. + + - Escape: \u + Move upwards .5v. + + - Escape: \d + Move down .5v. + + - Escape: \h'E' + Move horizontally, usually from the current location (if no + absolute position operator `|' is used). The expression E + indicates how far to move: positive is rightwards and negative + leftwards. The default scaling indicator for this escape is `m'. + + There are a number of special-case escapes for horizontal motion. + + - Escape: \<SP> + An unbreakable and unpaddable (i.e. not expanded during filling) + space. (Note: This is a backslash followed by a space.) + + - Escape: \~ + An unbreakable space that stretches like a normal inter-word space + when a line is adjusted. + + - Escape: \| + A 1/6th em space. Ignored for TTY output devices (rounded to + zero). + + - Escape: \^ + A 1/12th em space. Ignored for TTY output devices (rounded to + zero). + + - Escape: \0 + A space the size of a digit. + + The following string sets the TeX logo: + + + .ds TeX T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X + + - Escape: \w'TEXT' + - Register: \n[st] + - Register: \n[sb] + - Register: \n[rst] + - Register: \n[rsb] + - Register: \n[ct] + - Register: \n[ssc] + - Register: \n[skw] + Return the width of the specified TEXT in basic units. This + allows horizontal movement based on the width of some arbitrary + text (e.g. given as an argument to a macro). + + + The length of the string `abc' is \w'abc'u. + => The length of the string `abc' is 72u. + + Font changes may occur in TEXT which don't affect current settings. + + After use, `\w' sets several registers: + + `st' + `sb' + The highest and lowest point of the baseline, respectively, + in TEXT. + + `rst' + `rsb' + Like the `st' and `sb' registers, but takes account of the + heights and depths of glyphs. With other words, this gives + the highest and lowest point of TEXT. + + `ct' + Defines the kinds of glyphs occurring in TEXT: + + 0 + only short glyphs, no descenders or tall glyphs. + + 1 + at least one descender. + + 2 + at least one tall glyph. + + 3 + at least one each of a descender and a tall glyph. + + `ssc' + The amount of horizontal space (possibly negative) that + should be added to the last glyph before a subscript. + + `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. + + - Escape: \kP + - Escape: \k(PS + - Escape: \k[POSITION] + Store the current horizontal position in the _input_ line in + number register with name POSITION (one-character name P, + two-character name PS). Use this, for example, to return to the + beginning of a string for highlighting or other decoration. + + - Register: \n[hp] + The current horizontal position at the input line. + + - Register: \n[.k] + A read-only number register containing the current horizontal + output position. + + - Escape: \o'ABC' + Overstrike glyphs A, B, C, ...; the glyphs are centered, and the + resulting spacing is the largest width of the affected glyphs. + + - Escape: \zG + Print glyph G with zero width, i.e., without spacing. Use this to + overstrike glyphs left-aligned. + + - Escape: \Z'ANYTHING' + Print ANYTHING, then restore the horizontal and vertical position. + The argument may not contain tabs or leaders. + + The following is an example of a strike-through macro: + + + .de ST + .nr ww \w'\\$1' + \Z@\v'-.25m'\l'\\n[ww]u'@\\$1 + .. + . + This is + .ST "a test" + an actual emergency! + + + +File: groff, Node: Drawing Requests, Next: Traps, Prev: Page Motions, Up: gtroff Reference + +Drawing Requests +================ + + `gtroff' provides a number of ways to draw lines and other figures +on the page. Used in combination with the page motion commands (see +*Note Page Motions::, for more info), a wide variety of figures can be +drawn. However, for complex drawings these operations can be quite +cumbersome, and it may be wise to use graphic preprocessors like `gpic' +or `ggrn'. *Note gpic::, and *Note ggrn::, for more information. + + All drawing is done via escapes. + + - Escape: \l'L' + - Escape: \l'LG' + Draw a line horizontally. L is the length of the line to be + drawn. If it is positive, start the line at the current location + and draw to the right; its end point is the new current location. + Negative values are handled differently: The line starts at the + current location and draws to the left, but the current location + doesn't move. + + L can also be specified absolutely (i.e. with a leading `|') which + draws back to the beginning of the input line. Default scaling + indicator is `m'. + + The optional second parameter G is a glyph to draw the line with. + If this second argument is not specified, `gtroff' uses the + underscore glyph, `\[ru]'. + + To separate the two arguments (to prevent `gtroff' from + interpreting a drawing glyph as a scaling indicator if the glyph is + represented by a single character) use `\&'. + + Here a small useful example: + + + .de box + \[br]\\$*\[br]\l'|0\[rn]'\l'|0\[ul]' + .. + + Note that this works by outputting a box rule (a vertical line), + then the text given as an argument and then another box rule. + Finally, the line drawing escapes both draw from the current + location to the beginning of the _input_ line - this works because + the line length is negative, not moving the current point. + + - Escape: \L'L' + - Escape: \L'LG' + Draw vertical lines. Its parameters are similar to the `\l' + escape, except that the default scaling indicator is `v'. The + movement is downwards for positive values, and upwards for + negative values. The default glyph is the box rule glyph, + `\[br]'. As with the vertical motion escapes, text processing + blindly continues where the line ends. + + + This is a \L'3v'test. + + Here the result, produced with `grotty'. + + + This is a + | + | + |test. + + + - Escape: \D'COMMAND ARG ...' + The `\D' escape provides a variety of drawing functions. Note + that on character devices, only vertical and horizontal lines are + supported within `grotty'; other devices may only support a subset + of the available drawing functions. + + The default scaling indicator for all subcommands of `\D' is `m' + for horizontal distances and `v' for vertical ones. Exceptions + are `\D'f ...'' and `\D't ...'' which use `u' as the default. + + `\D'l DX DY'' + Draw a line from the current location to the relative point + specified by (DX,DY). + + The following example is a macro for creating a box around a + text string; for simplicity, the box margin is taken as a + fixed value, 0.2m. + + + .de BOX + . nr @wd \w'\\$1' + \h'.2m'\ + \h'-.2m'\v'(.2m - \\n[rsb]u)'\ + \D'l 0 -(\\n[rst]u - \\n[rsb]u + .4m)'\ + \D'l (\\n[@wd]u + .4m) 0'\ + \D'l 0 (\\n[rst]u - \\n[rsb]u + .4m)'\ + \D'l -(\\n[@wd]u + .4m) 0'\ + \h'.2m'\v'-(.2m - \\n[rsb]u)'\ + \\$1\ + \h'.2m' + .. + + First, the width of the string is stored in register `@wd'. + Then, four lines are drawn to form a box, properly offset by + the box margin. The registers `rst' and `rsb' are set by the + `\w' escape, containing the largest height and depth of the + whole string. + + `\D'c D'' + Draw a circle with a diameter of D with the leftmost point at + the current position. + + `\D'C D'' + Draw a solid circle with the same parameters as an outlined + circle. No outline is drawn. + + `\D'e X Y'' + Draw an ellipse with a horizontal diameter of X and a vertical + diameter of Y with the leftmost point at the current position. + + `\D'E X Y'' + Draw a solid ellipse with the same parameters as an outlined + ellipse. No outline is drawn. + + `\D'a DX1 DY1 DX2 DY2'' + Draw an arc clockwise from the current location through the + two specified relative locations (DX1,DY1) and (DX2,DY2). + The coordinates of the first point are relative to the + current position, and the coordinates of the second point are + relative to the first point. + + `\D'~ DX1 DY1 DX2 DY2 ...'' + Draw a spline from the current location to the relative point + (DX1,DY1) and then to (DX2,DY2), and so on. + + `\D'f N'' + Set the shade of gray to be used for filling solid objects + to N; N must be an integer between 0 and 1000, where 0 + corresponds solid white and 1000 to solid black, and values + in between correspond to intermediate shades of gray. This + applies only to solid circles, solid ellipses, and solid + polygons. By default, a level of 1000 is used. + + `\D'p DX1 DY1 DX2 DY2 ...'' + Draw a polygon from the current location to the relative + position (DX1,DY1) and then to (DX2,DY2) and so on. When the + specified data points are exhausted, a line is drawn back to + the starting point. + + `\D'P DX1 DY1 DX2 DY2 ...'' + Draw a solid polygon with the same parameters as an outlined + polygon. No outline is drawn. + + Here a better variant of the box macro to fill the box with + some color. Note that the box must be drawn before the text + since colors in `gtroff' are not transparent; the filled + polygon would hide the text completely. + + + .de BOX + . nr @wd \w'\\$1' + \h'.2m'\ + \h'-.2m'\v'(.2m - \\n[rsb]u)'\ + \M[lightcyan]\ + \D'P 0 -(\\n[rst]u - \\n[rsb]u + .4m) \ + (\\n[@wd]u + .4m) 0 \ + 0 (\\n[rst]u - \\n[rsb]u + .4m) \ + -(\\n[@wd]u + .4m) 0'\ + \h'.2m'\v'-(.2m - \\n[rsb]u)'\ + \M[]\ + \\$1\ + \h'.2m' + .. + + `\D't N'' + Set the current line thickness to N machine units. A value of + zero selects the smallest available line thickness. A + negative value makes the line thickness proportional to the + current point size (this is the default behaviour of AT&T + `troff'). + + *Note Graphics Commands::. + + - Escape: \b'STRING' + "Pile" a sequence of glyphs vertically, and center it vertically + on the current line. Use it to build large brackets and braces. + + Here an example how to create a large opening brace: + + + \b'\[lt]\[bv]\[lk]\[bv]\[lb]' + + The first glyph is on the top, the last glyph in STRING is at the + bottom. Note that `gtroff' separates the glyphs vertically by 1m, + and the whole object is centered 0.5m above the current baseline; + the largest glyph width is used as the width for the whole object. + This rather unflexible positioning algorithm doesn't work with + `-Tdvi' since the bracket pieces vary in height for this device. + Instead, use the `eqn' preprocessor. + + *Note Manipulating Spacing::, how to adjust the vertical spacing + with the `\x' escape. + + +File: groff, Node: Traps, Next: Diversions, Prev: Drawing Requests, Up: gtroff Reference + +Traps +===== + + "Traps" are locations, which, when reached, call a specified macro. +These traps can occur at a given location on the page, at a given +location in the current diversion, at a blank line, after a certain +number of input lines, or at the end of input. + + Setting a trap is also called "planting". It is also said that a +trap is "sprung" if the associated macro is executed. + +* Menu: + +* Page Location Traps:: +* Diversion Traps:: +* Input Line Traps:: +* Blank Line Traps:: +* End-of-input Traps:: + + +File: groff, Node: Page Location Traps, Next: Diversion Traps, Prev: Traps, Up: Traps + +Page Location Traps +------------------- + + "Page location traps" perform an action when `gtroff' reaches or +passes a certain vertical location on the page. Page location traps +have a variety of purposes, including: + + * setting headers and footers + + * setting body text in multiple columns + + * setting footnotes + + - Request: .vpt flag + - Register: \n[.vpt] + Enable vertical position traps if FLAG is non-zero, or disables + 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. The current setting of this is available in the + `.vpt' read-only number register. + + - Request: .wh dist [macro] + Set a page location trap. Positive values for DIST set the trap + relative to the top of the page; negative values set the trap + relative to the bottom of the page. Default scaling indicator is + `v'. + + MACRO is the name of the macro to execute when the trap is sprung. + If MACRO is missing, remove the first trap (if any) at DIST. + + The following is a simple example of how many macro packages set + headers and footers. + + + .de hd \" Page header + ' sp .5i + . tl 'Title''date' + ' sp .3i + .. + . + .de fo \" Page footer + ' sp 1v + . tl ''%'' + ' bp + .. + . + .wh 0 hd \" trap at top of the page + .wh -1i fo \" trap one inch from bottom + + A trap at or below the bottom of the page is ignored; it can be + made active by either moving it up or increasing the page length + so that the trap is on the page. + + It is possible to have more than one trap at the same location; to + do so, the traps must be defined at different locations, then + moved together with the `ch' request; otherwise the second trap + would replace the first one. Earlier defined traps hide later + defined traps if moved to the same position (the many empty lines + caused by the `bp' request are omitted): + + + .de a + . nop a + .. + .de b + . nop b + .. + .de c + . nop c + .. + . + .wh 1i a + .wh 2i b + .wh 3i c + .bp + => a b c + + + .ch b 1i + .ch c 1i + .bp + => a + + + .ch a 0.5i + .bp + => a b + + + - Register: \n[.t] + A read-only number register holding the distance to the next trap. + + If there are no traps between the current position and the bottom + of the page, it contains the distance to the page bottom. In a + diversion, the distance to the page bottom is infinite (the + returned value is the biggest integer which can be represented in + `groff') if there are no diversion traps. + + - Request: .ch macro dist + Change the location of a trap. The first argument is the name of + the macro to be invoked at the trap, and the second argument is + the new location for the trap (note that the parameters are + specified the opposite of the `wh' request). This is useful for + building up footnotes in a diversion to allow more space at the + bottom of the page for them. + + Default scaling indicator for DIST is `v'. If DIST is missing, + the trap is removed. + + + - Register: \n[.ne] + The read-only number register `.ne' contains the amount of space + that was needed in the last `ne' request that caused a trap to be + sprung. Useful in conjunction with the `.trunc' register. *Note + Page Control::, for more information. + + - Register: \n[.trunc] + A read-only register containing 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. + + +File: groff, Node: Diversion Traps, Next: Input Line Traps, Prev: Page Location Traps, Up: Traps + +Diversion Traps +--------------- + + - Request: .dt dist macro + Set a trap _within_ a diversion. DIST is the location of the trap + (identical to the `.wh' request; default scaling indicator is `v') + and MACRO is the name of the macro to be invoked. The number + register `.t' still works within diversions. *Note Diversions::, + for more information. + + +File: groff, Node: Input Line Traps, Next: Blank Line Traps, Prev: Diversion Traps, Up: Traps + +Input Line Traps +---------------- + + - Request: .it n macro + - Request: .itc n macro + Set an input line trap. N is the number of lines of input which + may be read before springing the trap, MACRO is the macro to be + invoked. Request lines are not counted as input lines. + + For example, one possible use is to have a macro which prints the + next N lines in a bold font. + + + .de B + . it \\$1 B-end + . ft B + .. + . + .de B-end + . ft R + .. + + The `itc' request is identical, except that a line interrupted + with `\c' counts as one input line. + + Both requests are associated with the current environment (*note + Environments::); switching to another environment disables the + current input trap, and going back reactivates it, restoring the + number of already processed lines. + + +File: groff, Node: Blank Line Traps, Next: End-of-input Traps, Prev: Input Line Traps, Up: Traps + +Blank Line Traps +---------------- + + - Request: .blm macro + Set a blank line trap. `gtroff' executes MACRO when it encounters + a blank line in the input file. + + +File: groff, Node: End-of-input Traps, Prev: Blank Line Traps, Up: Traps + +End-of-input Traps +------------------ + + - Request: .em macro + Set a trap at the end of input. MACRO is executed after the last + line of the input file has been processed. + + For example, if the document had to have a section at the bottom + of the last page for someone to approve it, the `em' request could + be used. + + + .de approval + . ne 5v + . sp |(\\n[.t] - 6v) + . in +4i + . lc _ + . br + Approved:\t\a + . sp + Date:\t\t\a + .. + . + .em approval + + |