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