305 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.\"	$Id: roff.7,v 1.9 2010/06/10 21:42:02 kristaps Exp $
 | 
						|
.\"
 | 
						|
.\" Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
 | 
						|
.\"
 | 
						|
.\" Permission to use, copy, modify, and distribute this software for any
 | 
						|
.\" purpose with or without fee is hereby granted, provided that the above
 | 
						|
.\" copyright notice and this permission notice appear in all copies.
 | 
						|
.\"
 | 
						|
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
						|
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
						|
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
						|
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
						|
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | 
						|
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | 
						|
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
						|
.\"
 | 
						|
.Dd $Mdocdate: June 10 2010 $
 | 
						|
.Dt ROFF 7
 | 
						|
.Os
 | 
						|
.Sh NAME
 | 
						|
.Nm roff
 | 
						|
.Nd roff language reference
 | 
						|
.Sh DESCRIPTION
 | 
						|
The
 | 
						|
.Nm roff
 | 
						|
language is a general-purpose text-formatting language.  The purpose of
 | 
						|
this document is to consistently describe those language constructs
 | 
						|
accepted by the
 | 
						|
.Xr mandoc 1
 | 
						|
utility.  It is a work in progress.
 | 
						|
.Pp
 | 
						|
An
 | 
						|
.Nm
 | 
						|
document follows simple rules:  lines beginning with the control
 | 
						|
characters
 | 
						|
.Sq \.
 | 
						|
or
 | 
						|
.Sq \(aq
 | 
						|
are parsed for macros.  Other lines are interpreted within the scope of
 | 
						|
prior macros:
 | 
						|
.Bd -literal -offset indent
 | 
						|
\&.xx Macro lines change control state.
 | 
						|
Other lines are interpreted within the current state.
 | 
						|
.Ed
 | 
						|
.Sh LANGUAGE SYNTAX
 | 
						|
.Nm
 | 
						|
documents may contain only graphable 7-bit ASCII characters, the space
 | 
						|
character, and, in certain circumstances, the tab character.  All
 | 
						|
manuals must have
 | 
						|
.Ux
 | 
						|
line terminators.
 | 
						|
.Sh MACRO SYNTAX
 | 
						|
Macros are arbitrary in length and begin with a control character ,
 | 
						|
.Sq \.
 | 
						|
or
 | 
						|
.Sq \(aq ,
 | 
						|
at the beginning of the line.
 | 
						|
An arbitrary amount of whitespace may sit between the control character
 | 
						|
and the macro name.
 | 
						|
Thus, the following are equivalent:
 | 
						|
.Bd -literal -offset indent
 | 
						|
\&.if
 | 
						|
\&.\ \ \ \&if
 | 
						|
.Ed
 | 
						|
.Sh REFERENCE
 | 
						|
This section is a canonical reference of all macros, arranged
 | 
						|
alphabetically.
 | 
						|
.Ss \&am
 | 
						|
The syntax of this macro is the same as that of
 | 
						|
.Sx \&ig ,
 | 
						|
except that a leading argument must be specified.
 | 
						|
It is ignored, as are its children.
 | 
						|
.Ss \&ami
 | 
						|
The syntax of this macro is the same as that of
 | 
						|
.Sx \&ig ,
 | 
						|
except that a leading argument must be specified.
 | 
						|
It is ignored, as are its children.
 | 
						|
.Ss \&am1
 | 
						|
The syntax of this macro is the same as that of
 | 
						|
.Sx \&ig ,
 | 
						|
except that a leading argument must be specified.
 | 
						|
It is ignored, as are its children.
 | 
						|
.Ss \&de
 | 
						|
The syntax of this macro is the same as that of
 | 
						|
.Sx \&ig ,
 | 
						|
except that a leading argument must be specified.
 | 
						|
It is ignored, as are its children.
 | 
						|
.Ss \&dei
 | 
						|
The syntax of this macro is the same as that of
 | 
						|
.Sx \&ig ,
 | 
						|
except that a leading argument must be specified.
 | 
						|
It is ignored, as are its children.
 | 
						|
.Ss \&ds
 | 
						|
Define a string.
 | 
						|
This macro is intended to have two arguments,
 | 
						|
the name of the string to define and its content.
 | 
						|
Currently, it is ignored including its arguments,
 | 
						|
and the number of arguments is not checked.
 | 
						|
.Ss \&de1
 | 
						|
The syntax of this macro is the same as that of
 | 
						|
.Sx \&ig ,
 | 
						|
except that a leading argument must be specified.
 | 
						|
It is ignored, as are its children.
 | 
						|
.Ss \&el
 | 
						|
The
 | 
						|
.Qq else
 | 
						|
half of an if/else conditional.
 | 
						|
Pops a result off the stack of conditional evaluations pushed by
 | 
						|
.Sx \&ie
 | 
						|
and uses it as its conditional.
 | 
						|
If no stack entries are present (e.g., due to no prior
 | 
						|
.Sx \&ie
 | 
						|
calls)
 | 
						|
then false is assumed.
 | 
						|
The syntax of this macro is similar to
 | 
						|
.Sx \&if
 | 
						|
except that the conditional is missing.
 | 
						|
.Ss \&ie
 | 
						|
The
 | 
						|
.Qq if
 | 
						|
half of an if/else conditional.
 | 
						|
The result of the conditional is pushed into a stack used by subsequent
 | 
						|
invocations of
 | 
						|
.Sx \&el ,
 | 
						|
which may be separated by any intervening input (or not exist at all).
 | 
						|
Its syntax is equivalent to
 | 
						|
.Sx \&if .
 | 
						|
.Ss \&if
 | 
						|
Begins a conditional.
 | 
						|
Right now, the conditional evaluates to true
 | 
						|
if and only if it starts with the letter
 | 
						|
.Sy n ,
 | 
						|
indicating processing in
 | 
						|
.Xr nroff 1
 | 
						|
style as opposed to
 | 
						|
.Xr troff 1
 | 
						|
style.
 | 
						|
If a conditional is false, its children are not processed, but are
 | 
						|
syntactically interpreted to preserve the integrity of the input
 | 
						|
document.
 | 
						|
Thus,
 | 
						|
.Pp
 | 
						|
.D1 \&.if t \e .ig
 | 
						|
.Pp
 | 
						|
will discard the
 | 
						|
.Sq \&.ig ,
 | 
						|
which may lead to interesting results, but
 | 
						|
.Pp
 | 
						|
.D1 \&.if t \e .if t \e{\e
 | 
						|
.Pp
 | 
						|
will continue to syntactically interpret to the block close of the final
 | 
						|
conditional.
 | 
						|
Sub-conditionals, in this case, obviously inherit the truth value of
 | 
						|
the parent.
 | 
						|
This macro has the following syntax:
 | 
						|
.Pp
 | 
						|
.Bd -literal -offset indent -compact
 | 
						|
\&.if COND \e{\e
 | 
						|
BODY...
 | 
						|
\&.\e}
 | 
						|
.Ed
 | 
						|
.Bd -literal -offset indent -compact
 | 
						|
\&.if COND \e{ BODY
 | 
						|
BODY... \e}
 | 
						|
.Ed
 | 
						|
.Bd -literal -offset indent -compact
 | 
						|
\&.if COND \e{ BODY
 | 
						|
BODY...
 | 
						|
\&.\e}
 | 
						|
.Ed
 | 
						|
.Bd -literal -offset indent -compact
 | 
						|
\&.if COND \e
 | 
						|
BODY
 | 
						|
.Ed
 | 
						|
.Pp
 | 
						|
COND is a conditional statement.
 | 
						|
roff allows for complicated conditionals; mandoc is much simpler.
 | 
						|
At this time, mandoc supports only
 | 
						|
.Sq n ,
 | 
						|
evaluating to true;
 | 
						|
and
 | 
						|
.Sq t ,
 | 
						|
.Sq e ,
 | 
						|
and
 | 
						|
.Sq o ,
 | 
						|
evaluating to false.
 | 
						|
All other invocations are read up to the next end of line or space and
 | 
						|
evaluate as false.
 | 
						|
.Pp
 | 
						|
If the BODY section is begun by an escaped brace
 | 
						|
.Sq \e{ ,
 | 
						|
scope continues until a closing-brace macro
 | 
						|
.Sq \.\e} .
 | 
						|
If the BODY is not enclosed in braces, scope continues until the next
 | 
						|
macro or word.
 | 
						|
If the COND is followed by a BODY on the same line, whether after a
 | 
						|
brace or not, then macros
 | 
						|
.Em must
 | 
						|
begin with a control character.
 | 
						|
It is generally more intuitive, in this case, to write
 | 
						|
.Bd -literal -offset indent
 | 
						|
\&.if COND \e{\e
 | 
						|
\&.foo
 | 
						|
bar
 | 
						|
\&.\e}
 | 
						|
.Ed
 | 
						|
.Pp
 | 
						|
than having the macro follow as
 | 
						|
.Pp
 | 
						|
.D1 \&.if COND \e{ .foo
 | 
						|
.Pp
 | 
						|
The scope of a conditional is always parsed, but only executed if the
 | 
						|
conditional evaluates to true.
 | 
						|
.Pp
 | 
						|
Note that text subsequent a
 | 
						|
.Sq \&.\e}
 | 
						|
macro is discarded.
 | 
						|
Furthermore, if an explicit closing sequence
 | 
						|
.Sq \e}
 | 
						|
is specified in a free-form line, the entire line is accepted within the
 | 
						|
scope of the prior macro, not only the text preceding the close, with the
 | 
						|
.Sq \e}
 | 
						|
collapsing into a zero-width space.
 | 
						|
.Ss \&ig
 | 
						|
Ignore input.
 | 
						|
Accepts the following syntax:
 | 
						|
.Pp
 | 
						|
.Bd -literal -offset indent -compact
 | 
						|
\&.ig
 | 
						|
BODY...
 | 
						|
\&..
 | 
						|
.Ed
 | 
						|
.Bd -literal -offset indent -compact
 | 
						|
\&.ig END
 | 
						|
BODY...
 | 
						|
\&.END
 | 
						|
.Ed
 | 
						|
.Pp
 | 
						|
In the first case, input is ignored until a
 | 
						|
.Sq \&..
 | 
						|
macro is encountered on its own line.
 | 
						|
In the second case, input is ignored until a
 | 
						|
.Sq \&.END
 | 
						|
is encountered.
 | 
						|
Text subsequent the
 | 
						|
.Sq \&.END
 | 
						|
or
 | 
						|
.Sq \&..
 | 
						|
is discarded.
 | 
						|
.Pp
 | 
						|
Do not use the escape
 | 
						|
.Sq \e
 | 
						|
anywhere in the definition of END.
 | 
						|
It causes very strange behaviour.
 | 
						|
Furthermore, if you redefine a
 | 
						|
.Nm
 | 
						|
macro, such as
 | 
						|
.Pp
 | 
						|
.D1 \&.ig if
 | 
						|
.Pp
 | 
						|
the subsequent invocation of
 | 
						|
.Sx \&if
 | 
						|
will first signify the end of comment, then be invoked as a macro.
 | 
						|
This behaviour really shouldn't be counted upon.
 | 
						|
.Ss \&rm
 | 
						|
Remove a request, macro or string.
 | 
						|
This macro is intended to have one argument,
 | 
						|
the name of the request, macro or string to be undefined.
 | 
						|
Currently, it is ignored including its arguments,
 | 
						|
and the number of arguments is not checked.
 | 
						|
.Ss \&tr
 | 
						|
Output character translation.
 | 
						|
This macro is intended to have one argument,
 | 
						|
consisting of an even number of characters.
 | 
						|
Currently, it is ignored including its arguments,
 | 
						|
and the number of arguments is not checked.
 | 
						|
.Sh COMPATIBILITY
 | 
						|
This section documents compatibility between mandoc and other other
 | 
						|
troff implementations, at this time limited to GNU troff
 | 
						|
.Pq Qq groff .
 | 
						|
The term
 | 
						|
.Qq historic groff
 | 
						|
refers to groff versions before the
 | 
						|
.Pa doc.tmac
 | 
						|
file re-write
 | 
						|
.Pq somewhere between 1.15 and 1.19 .
 | 
						|
.Pp
 | 
						|
.Bl -dash -compact
 | 
						|
.It
 | 
						|
Historic groff did not accept white-space buffering the custom END tag
 | 
						|
for the
 | 
						|
.Sx \&ig
 | 
						|
macro.
 | 
						|
.It
 | 
						|
The
 | 
						|
.Sx \&if
 | 
						|
and family would print funny white-spaces with historic groff when
 | 
						|
depending on next-line syntax.
 | 
						|
.El
 | 
						|
.Sh AUTHORS
 | 
						|
The
 | 
						|
.Nm
 | 
						|
reference was written by
 | 
						|
.An Kristaps Dzonsons Aq kristaps@bsd.lv .
 |