]> git.cameronkatri.com Git - mandoc.git/blob - roff.7
Ignore .ns (no-space mode), .ps (change point size), .ta (tab control)
[mandoc.git] / roff.7
1 .\" $Id: roff.7,v 1.26 2011/01/25 01:12:02 schwarze Exp $
2 .\"
3 .\" Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
4 .\" Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
5 .\"
6 .\" Permission to use, copy, modify, and distribute this software for any
7 .\" purpose with or without fee is hereby granted, provided that the above
8 .\" copyright notice and this permission notice appear in all copies.
9 .\"
10 .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 .\"
18 .Dd $Mdocdate: January 25 2011 $
19 .Dt ROFF 7
20 .Os
21 .Sh NAME
22 .Nm roff
23 .Nd roff language reference for mandoc
24 .Sh DESCRIPTION
25 The
26 .Nm roff
27 language is a general purpose text formatting language.
28 In particular, it serves as the basis for the
29 .Xr mdoc 7
30 and
31 .Xr man 7
32 manual formatting macro languages.
33 This manual describes the subset of the
34 .Nm
35 language accepted by the
36 .Xr mandoc 1
37 utility.
38 .Pp
39 Input lines beginning with the control characters
40 .Sq \&.
41 or
42 .Sq \(aq
43 are parsed for requests and macros.
44 These define the document structure, change the processing state
45 and manipulate the formatting.
46 Some requests and macros also produce formatted output,
47 while others do not.
48 .Pp
49 All other input lines provide free-form text to be printed;
50 the formatting of free-form text depends on the respective
51 processing context.
52 .Sh LANGUAGE SYNTAX
53 .Nm
54 documents may contain only graphable 7-bit ASCII characters, the space
55 character, and, in certain circumstances, the tab character.
56 To produce other characters in the output, use the escape sequences
57 documented in the
58 .Xr mandoc_char 7
59 manual.
60 .Sh REQUEST SYNTAX
61 A request or macro line consists of:
62 .Pp
63 .Bl -enum -compact
64 .It
65 the control character
66 .Sq \&.
67 or
68 .Sq \(aq
69 at the beginning of the line,
70 .It
71 optionally an arbitrary amount of whitespace,
72 .It
73 the name of the request or the macro, which is one word of arbitrary
74 length, terminated by whitespace,
75 .It
76 and zero or more arguments delimited by whitespace.
77 .El
78 .Pp
79 Thus, the following request lines are all equivalent:
80 .Bd -literal -offset indent
81 \&.ig end
82 \&.ig end
83 \&. ig end
84 .Ed
85 .Sh MACRO SYNTAX
86 Macros can be defined by the
87 .Sx \&de
88 request.
89 When called, they follow the same syntax as requests, except that
90 macro arguments may optionally be quoted by enclosing them
91 in double quote characters
92 .Pq Sq \(dq .
93 To be recognized as the beginning of a quoted argument, the opening
94 quote character must be preceded by a space character.
95 .Pp
96 A quoted argument may contain whitespace, and pairs of double quote
97 characters
98 .Pq Sq Qq
99 resolve to single double quote characters.
100 A quoted argument extends to the next double quote character that is not
101 part of a pair, or to the end of the input line, whichever comes earlier.
102 Leaving out the terminating double quote character at the end of the line
103 is discouraged.
104 For clarity, if more arguments follow on the same input line,
105 it is recommended to follow the terminating double quote character
106 by a space character; in case the next character after the terminating
107 double quote character is anything else, it is regarded as the beginning
108 of the next, unquoted argument.
109 .Pp
110 Both in quoted and unquoted arguments, pairs of backslashes
111 .Pq Sq \e\e
112 resolve to single backslashes.
113 In unquoted arguments, space characters can alternatively be included
114 by preceding them with a backslash
115 .Pq Sq \e\~ ,
116 but quoting is usually better for clarity.
117 .Sh REQUEST REFERENCE
118 The
119 .Xr mandoc 1
120 .Nm
121 parser recognizes the following requests.
122 Note that the
123 .Nm
124 language defines many more requests not implemented in
125 .Xr mandoc 1 .
126 .Ss \&ad
127 Set line adjustment mode.
128 This line-scoped request is intended to have one argument to select
129 normal, left, right, or center adjustment for subsequent text.
130 Currently, it is ignored including its arguments,
131 and the number of arguments is not checked.
132 .Ss \&am
133 Append to a macro definition.
134 The syntax of this request is the same as that of
135 .Sx \&de .
136 It is currently ignored by
137 .Xr mandoc 1 ,
138 as are its children.
139 .Ss \&ami
140 Append to a macro definition, specifying the macro name indirectly.
141 The syntax of this request is the same as that of
142 .Sx \&dei .
143 It is currently ignored by
144 .Xr mandoc 1 ,
145 as are its children.
146 .Ss \&am1
147 Append to a macro definition, switching roff compatibility mode off
148 during macro execution.
149 The syntax of this request is the same as that of
150 .Sx \&de1 .
151 It is currently ignored by
152 .Xr mandoc 1 ,
153 as are its children.
154 .Ss \&de
155 Define a
156 .Nm
157 macro.
158 Its syntax can be either
159 .Bd -literal -offset indent
160 .Pf . Cm \&de Ar name
161 .Ar macro definition
162 \&..
163 .Ed
164 .Pp
165 or
166 .Bd -literal -offset indent
167 .Pf . Cm \&de Ar name Ar end
168 .Ar macro definition
169 .Pf . Ar end
170 .Ed
171 .Pp
172 Both forms define or redefine the macro
173 .Ar name
174 to represent the
175 .Ar macro definition ,
176 which may consist of one or more input lines, including the newline
177 characters terminating each line, optionally containing calls to
178 .Nm
179 requests,
180 .Nm
181 macros or high-level macros like
182 .Xr man 7
183 or
184 .Xr mdoc 7
185 macros, whichever applies to the document in question.
186 .Pp
187 Specifying a custom
188 .Ar end
189 macro works in the same way as for
190 .Sx \&ig ;
191 namely, the call to
192 .Sq Pf . Ar end
193 first ends the
194 .Ar macro definition ,
195 and after that, it is also evaluated as a
196 .Nm
197 request or
198 .Nm
199 macro, but not as a high-level macro.
200 .Pp
201 The macro can be invoked later using the syntax
202 .Pp
203 .D1 Pf . Ar name Op Ar argument Op Ar argument ...
204 .Pp
205 Regarding argument parsing, see
206 .Sx MACRO SYNTAX
207 above.
208 .Pp
209 The line invoking the macro will be replaced
210 in the input stream by the
211 .Ar macro definition ,
212 replacing all occurrences of
213 .No \e\e$ Ns Ar N ,
214 where
215 .Ar N
216 is a digit, by the
217 .Ar N Ns th Ar argument .
218 For example,
219 .Bd -literal -offset indent
220 \&.de ZN
221 \efI\e^\e\e$1\e^\efP\e\e$2
222 \&..
223 \&.ZN XtFree .
224 .Ed
225 .Pp
226 produces
227 .Pp
228 .D1 \efI\e^XtFree\e^\efP.
229 .Pp
230 in the input stream, and thus in the output: \fI\^XtFree\^\fP.
231 .Pp
232 Since macros and user-defined strings share a common string table,
233 defining a macro
234 .Ar name
235 clobbers the user-defined string
236 .Ar name ,
237 and the
238 .Ar macro definition
239 can also be printed using the
240 .Sq \e*
241 string interpolation syntax described below
242 .Sx ds ,
243 but this is rarely useful because every macro definition contains at least
244 one explicit newline character.
245 .Pp
246 In order to prevent endless recursion, both groff and
247 .Xr mandoc 1
248 limit the stack depth for expanding macros and strings
249 to a large, but finite number.
250 Do not rely on the exact value of this limit.
251 .Ss \&dei
252 Define a
253 .Nm
254 macro, specifying the macro name indirectly.
255 The syntax of this request is the same as that of
256 .Sx \&de .
257 It is currently ignored by
258 .Xr mandoc 1 ,
259 as are its children.
260 .Ss \&de1
261 Define a
262 .Nm
263 macro that will be executed with
264 .Nm
265 compatibility mode switched off during macro execution.
266 This is a GNU extension not available in traditional
267 .Nm
268 implementations and not even in older versions of groff.
269 Since
270 .Xr mandoc 1
271 does not implement
272 .Nm
273 compatibility mode at all, it handles this request as an alias for
274 .Sx \&de .
275 .Ss \&ds
276 Define a user-defined string.
277 Its syntax is as follows:
278 .Pp
279 .D1 Pf . Cm \&ds Ar name Oo \(dq Oc Ns Ar string
280 .Pp
281 The
282 .Ar name
283 and
284 .Ar string
285 arguments are space-separated.
286 If the
287 .Ar string
288 begins with a double-quote character, that character will not be part
289 of the string.
290 All remaining characters on the input line form the
291 .Ar string ,
292 including whitespace and double-quote characters, even trailing ones.
293 .Pp
294 The
295 .Ar string
296 can be interpolated into subsequent text by using
297 .No \e* Ns Bq Ar name
298 for a
299 .Ar name
300 of arbitrary length, or \e*(NN or \e*N if the length of
301 .Ar name
302 is two or one characters, respectively.
303 Interpolation can be prevented by escaping the leading backslash;
304 that is, an asterisk preceded by an even number of backslashes
305 does not trigger string interpolation.
306 .Pp
307 Since user-defined strings and macros share a common string table,
308 defining a string
309 .Ar name
310 clobbers the macro
311 .Ar name ,
312 and the
313 .Ar name
314 used for defining a string can also be invoked as a macro,
315 in which case the following input line will be appended to the
316 .Ar string ,
317 forming a new input line passed to the
318 .Nm
319 parser.
320 For example,
321 .Bd -literal -offset indent
322 \&.ds badidea .S
323 \&.badidea
324 H SYNOPSIS
325 .Ed
326 .Pp
327 invokes the
328 .Cm SH
329 macro when used in a
330 .Xr man 7
331 document.
332 Such abuse is of course strongly discouraged.
333 .Ss \&el
334 The
335 .Qq else
336 half of an if/else conditional.
337 Pops a result off the stack of conditional evaluations pushed by
338 .Sx \&ie
339 and uses it as its conditional.
340 If no stack entries are present (e.g., due to no prior
341 .Sx \&ie
342 calls)
343 then false is assumed.
344 The syntax of this request is similar to
345 .Sx \&if
346 except that the conditional is missing.
347 .Ss \&hy
348 Set automatic hyphenation mode.
349 This line-scoped request is currently ignored.
350 .Ss \&ie
351 The
352 .Qq if
353 half of an if/else conditional.
354 The result of the conditional is pushed into a stack used by subsequent
355 invocations of
356 .Sx \&el ,
357 which may be separated by any intervening input (or not exist at all).
358 Its syntax is equivalent to
359 .Sx \&if .
360 .Ss \&if
361 Begins a conditional.
362 Right now, the conditional evaluates to true
363 if and only if it starts with the letter
364 .Sy n ,
365 indicating processing in nroff style as opposed to troff style.
366 If a conditional is false, its children are not processed, but are
367 syntactically interpreted to preserve the integrity of the input
368 document.
369 Thus,
370 .Pp
371 .D1 \&.if t .ig
372 .Pp
373 will discard the
374 .Sq \&.ig ,
375 which may lead to interesting results, but
376 .Pp
377 .D1 \&.if t .if t \e{\e
378 .Pp
379 will continue to syntactically interpret to the block close of the final
380 conditional.
381 Sub-conditionals, in this case, obviously inherit the truth value of
382 the parent.
383 This request has the following syntax:
384 .Bd -literal -offset indent
385 \&.if COND \e{\e
386 BODY...
387 \&.\e}
388 .Ed
389 .Bd -literal -offset indent
390 \&.if COND \e{ BODY
391 BODY... \e}
392 .Ed
393 .Bd -literal -offset indent
394 \&.if COND \e{ BODY
395 BODY...
396 \&.\e}
397 .Ed
398 .Bd -literal -offset indent
399 \&.if COND \e
400 BODY
401 .Ed
402 .Pp
403 COND is a conditional statement.
404 roff allows for complicated conditionals; mandoc is much simpler.
405 At this time, mandoc supports only
406 .Sq n ,
407 evaluating to true;
408 and
409 .Sq t ,
410 .Sq e ,
411 and
412 .Sq o ,
413 evaluating to false.
414 All other invocations are read up to the next end of line or space and
415 evaluate as false.
416 .Pp
417 If the BODY section is begun by an escaped brace
418 .Sq \e{ ,
419 scope continues until a closing-brace escape sequence
420 .Sq \.\e} .
421 If the BODY is not enclosed in braces, scope continues until
422 the end of the line.
423 If the COND is followed by a BODY on the same line, whether after a
424 brace or not, then requests and macros
425 .Em must
426 begin with a control character.
427 It is generally more intuitive, in this case, to write
428 .Bd -literal -offset indent
429 \&.if COND \e{\e
430 \&.foo
431 bar
432 \&.\e}
433 .Ed
434 .Pp
435 than having the request or macro follow as
436 .Pp
437 .D1 \&.if COND \e{ .foo
438 .Pp
439 The scope of a conditional is always parsed, but only executed if the
440 conditional evaluates to true.
441 .Pp
442 Note that text following an
443 .Sq \&.\e}
444 escape sequence is discarded.
445 Furthermore, if an explicit closing sequence
446 .Sq \e}
447 is specified in a free-form line, the entire line is accepted within the
448 scope of the prior request, not only the text preceding the close, with the
449 .Sq \e}
450 collapsing into a zero-width space.
451 .Ss \&ig
452 Ignore input.
453 Its syntax can be either
454 .Bd -literal -offset indent
455 .Pf . Cm \&ig
456 .Ar ignored text
457 \&..
458 .Ed
459 .Pp
460 or
461 .Bd -literal -offset indent
462 .Pf . Cm \&ig Ar end
463 .Ar ignored text
464 .Pf . Ar end
465 .Ed
466 .Pp
467 In the first case, input is ignored until a
468 .Sq \&..
469 request is encountered on its own line.
470 In the second case, input is ignored until the specified
471 .Sq Pf . Ar end
472 macro is encountered.
473 Do not use the escape character
474 .Sq \e
475 anywhere in the definition of
476 .Ar end ;
477 it would cause very strange behaviour.
478 .Pp
479 When the
480 .Ar end
481 macro is a roff request or a roff macro, like in
482 .Pp
483 .D1 \&.ig if
484 .Pp
485 the subsequent invocation of
486 .Sx \&if
487 will first terminate the
488 .Ar ignored text ,
489 then be invoked as usual.
490 Otherwise, it only terminates the
491 .Ar ignored text ,
492 and arguments following it or the
493 .Sq \&..
494 request are discarded.
495 .Ss \&ne
496 Declare the need for the specified minimum vertical space
497 before the next trap or the bottom of the page.
498 This line-scoped request is currently ignored.
499 .Ss \&nh
500 Turn off automatic hyphenation mode.
501 This line-scoped request is currently ignored.
502 .Ss \&rm
503 Remove a request, macro or string.
504 This request is intended to have one argument,
505 the name of the request, macro or string to be undefined.
506 Currently, it is ignored including its arguments,
507 and the number of arguments is not checked.
508 .Ss \&nr
509 Define a register.
510 A register is an arbitrary string value that defines some sort of state,
511 which influences parsing and/or formatting.
512 Its syntax is as follows:
513 .Pp
514 .D1 Pf \. Cm \&nr Ar name Ar value
515 .Pp
516 The
517 .Ar value
518 may, at the moment, only be an integer.
519 So far, only the following register
520 .Ar name
521 is recognised:
522 .Bl -tag -width Ds
523 .It Cm nS
524 If set to a positive integer value, certain
525 .Xr mdoc 7
526 macros will behave in the same way as in the
527 .Em SYNOPSIS
528 section.
529 If set to 0, these macros will behave in the same way as outside the
530 .Em SYNOPSIS
531 section, even when called within the
532 .Em SYNOPSIS
533 section itself.
534 Note that starting a new
535 .Xr mdoc 7
536 section with the
537 .Cm \&Sh
538 macro will reset this register.
539 .El
540 .Ss \&ns
541 Turn on no-space mode.
542 This line-scoped request is intended to take no arguments.
543 Currently, it is ignored including its arguments,
544 and the number of arguments is not checked.
545 .Ss \&ps
546 Change point size.
547 This line-scoped request is intended to take one numerical argument.
548 Currently, it is ignored including its arguments,
549 and the number of arguments is not checked.
550 .Ss \&so
551 Include a source file.
552 Its syntax is as follows:
553 .Pp
554 .D1 Pf \. Cm \&so Ar file
555 .Pp
556 The
557 .Ar file
558 will be read and its contents processed as input in place of the
559 .Sq \&.so
560 request line.
561 To avoid inadvertant inclusion of unrelated files,
562 .Xr mandoc 1
563 only accepts relative paths not containing the strings
564 .Qq ../
565 and
566 .Qq /.. .
567 .Ss \&ta
568 Set tab stops.
569 This line-scoped request can take an arbitrary number of arguments.
570 Currently, it is ignored including its arguments.
571 .Ss \&tr
572 Output character translation.
573 This request is intended to have one argument,
574 consisting of an even number of characters.
575 Currently, it is ignored including its arguments,
576 and the number of arguments is not checked.
577 .Ss \&T&
578 Re-start a table layout, retaining the options of the prior table
579 invocation.
580 See
581 .Sx \&TS .
582 .Ss \&TE
583 End a table context.
584 See
585 .Sx \&TS .
586 .Ss \&TS
587 Begin a table, which formats input in aligned rows and columns.
588 See
589 .Xr tbl 7
590 for a description of the tbl language.
591 .Sh COMPATIBILITY
592 This section documents compatibility between mandoc and other other
593 .Nm
594 implementations, at this time limited to GNU troff
595 .Pq Qq groff .
596 The term
597 .Qq historic groff
598 refers to groff version 1.15.
599 .Pp
600 .Bl -dash -compact
601 .It
602 The
603 .Cm nS
604 register is only compatible with OpenBSD's groff-1.15.
605 .It
606 Historic groff did not accept white-space before a custom
607 .Ar end
608 macro for the
609 .Sx \&ig
610 request.
611 .It
612 The
613 .Sx \&if
614 and family would print funny white-spaces with historic groff when
615 using the next-line syntax.
616 .El
617 .Sh SEE ALSO
618 .Xr mandoc 1 ,
619 .Xr man 7 ,
620 .Xr mandoc_char 7 ,
621 .Xr mdoc 7 ,
622 .Xr tbl 7
623 .Rs
624 .%A Joseph F. Ossanna
625 .%A Brian W. Kernighan
626 .%I AT&T Bell Laboratories
627 .%T Troff User's Manual
628 .%R Computing Science Technical Report
629 .%N 54
630 .%C Murray Hill, New Jersey
631 .%D 1976 and 1992
632 .%U http://www.kohala.com/start/troff/cstr54.ps
633 .Re
634 .Rs
635 .%A Joseph F. Ossanna
636 .%A Brian W. Kernighan
637 .%A Gunnar Ritter
638 .%T Heirloom Documentation Tools Nroff/Troff User's Manual
639 .%D September 17, 2007
640 .%U http://heirloom.sourceforge.net/doctools/troff.pdf
641 .Re
642 .Sh HISTORY
643 The RUNOFF typesetting system was written in PL/1 for the CTSS
644 operating system by Jerome ("Jerry") E. Saltzer in 1961.
645 It was first used as the main documentation tool by Multics since 1963.
646 Robert ("Bob") H. Morris ported it to the GE-635 and called it
647 .Nm ,
648 Doug McIlroy rewrote it in BCPL in 1969,
649 Joseph F. Ossanna rewrote it in PDP-11 assembly in 1973,
650 and Brian W. Kernighan rewrote it in C in 1975.
651 .Sh AUTHORS
652 .An -nosplit
653 This partial
654 .Nm
655 reference was written by
656 .An Kristaps Dzonsons Aq kristaps@bsd.lv
657 and
658 .An Ingo Schwarze Aq schwarze@openbsd.org .