Manpage HOWTO

Manpage HOWTO

V.0.1

        If there are any questions or comments, please direct them to
walt@erudition.net. The newest copy of this How-To can always be retrieved
from www.freebsd-howto.com. All rights for the reproduction of this
document are reserved.


	Summary.

	This Howto will make a quick overview of manpage formatting
and creation in FreeBSD 2.2.x, 3.x and 4.x. It is geared to those
interested in a quick introduction to man page creation and editing.

	Outline.

        1.	Introduction
        2.      Man Page Location & Types
        3.      Man Page Macros
       		
		3.1.     Page Structure Macros
	        3.2.    Manual & General Text Macros

	4.	References













	1.  Introduction	

	Man pages are formatted by the UNIX utility nroff(1) with the
batch package historically called man(7). nroff/troff/groff are powerful
formatting utilities which can use special batch packages for defining
special macros for a given purpose. The man(7) batch package defines
macros for use with creating man pages. To display a particular man page
source manually wih nroff, the following commands can be issued at the
prompt:

	nroff -man <man page file> | more

	This will display the man page source file with the man batch
package, and pipe it to more(1) for easy scrolling display. This is
exactly what the man(1) command does. At first glance, man page source
files will appear extremely cryptic, and to those used to using WYSIWYG
word processors, they will seem archaic. However, the formatting tools
nroff/troff/groff offer powerful formatting tools for precise layout. The
man batch package for nroff defines specific macros that need to be filled
out in the source file which allows for stong control over how man pages
will look. This is important as it allows a relatively uniform look for
man pages; yet, the batch package allows for enough flexibility to allow
one to document everything from system libraries and header files to
configuration files.

	In BSD systems, the man(7) batch packages, although available, has
been deprecated and the more powerful mdoc(7) batch package is used
instead; so, the follow line will work to display man pages as well:

        nroff -mdoc <man page file> | more

	2.	Man Page Location & Types

	To take a glance at a man page source file, go to /usr/local/man/,
choose the man directory of your choice, and select the man page source
file you wish to view. You will need to copy it to a temporary directory,
gunzip it, and open it with your favourite text editor. Man pages are
usually compressed to save space. Each man directory under /usr/local/man
corresponds to special groups of man pages. For instance, basic system
utilities and commands are under /usr/local/man/man1, and system call
documentation is under /usr/local/man2. The MANPATH environment variable
defines all of the paths which should be checked for man1, man2, man3, and
so on, and is usually set in one's shell init files. Here is the complete
list of man page numbers and what types of man pages they correspond to:
 
	Type			Description
	Number			-----------
	------			
	1			General Command
	2			System Calls
	3			Library Functions
	4			Kernel Interfaces
	5			File Formats
	6			Games
	7			Miscellaneous Information
	8			System Manager's Manuals
	9			Kernel Developer's Manual

	3.	Man Page Macros

	Man page macros are divided into two major groups: Page Structure
Macros and Manual & General Text Macros. The first outline the general
sections that each man pages has (you may recall some as "NAME" and
"SYNOPSIS." For a quick refresher, look at the man page of any command you
can think of, for instance, ls(1) or inetd.conf(5). You will see general
section divisions; each of them are defined by Page Structure Macros. Page
Structure Macros also define the title for each man page, which contains
the name of the man page, type of man page, and so on. General Text Macros
define all of the formatting for the remaining bold, underlined, indented
text, etc.

	3.1.	Page Structure Macros

	The Page Structure Macros are further subdivided into two parts:
Title Macros and Page Layout Macros. The former define the title and the
latter define the layout of the man page sections. The first Macros that
must be used in any man page source file are the Title Macros; they number
three:

	Macro			Description
	-----			-----------
	.Dd			Document date
	.Dt			Title, in upper case
	.Os			Operating System (FreeBSD)

	The .Dd macro's syntax is: '[month] [day], [year]', the .Dt
syntax is '[document title] [section] [volume]', and the .Os syntax is
'[operating system] [version/release]'. For example, a man page source
file for a utility named "magicbin" may begin thusly:

	.Dd June 6, 2000
	.Dt MAGICBIN 1 URM
	.Os FreeBSD 4.0

	The volume type "URM" is one of four possible volume types, and is
optional. The four possible volumes types are:

	AMD    UNIX Ancestral Manual Documents
	SMM    UNIX System Manager's Manual
	URM    UNIX Reference Manual
	PRM    UNIX Programmer's Manual
	
	After the Title Macros, come the the Page Layout Macros with their
corresponding General Text Macros. The first section of each man page is
the NAME section which shows the name of the utility in bold followed by a
quick description of what it does. So, following the Title Macros in the
source file, the beginning of the NAME section must be specified with an
.Sh macro, after which would follow a few short Manual & General Text
Macros defining the quick summary. In the following example we will use
the .Nm and .Nd General Text Macros macros and explain their usage more
clearly later.

	.Sh NAME
	.Nm magicbin
	.Nd this utility does some special operations on your system

	If you would like to see how this looks so far, save the previous
Title Macros and the above Page Layout and Manual & General Text Macros in
a file and call it with:

	nroff -mdoc <file> | more

	You will notice the man page is neatly formatted, with a date on
the bottom, the page type in the top middle, and so on. You may be slowly
seeing the power of nroff in formatting documents.

	The next section we will specify is the SYNOPSIS, which outlines
the syntax for our utility:

	.Sh SYNOPSIS
	.Nm magicbin
	.Op Fl cxz Ar time Ar number
		
	Here we define the utility "magicbin" as having three options,
'c,' 'x,' 'z' and two parameters, 'time' and 'number.'

	The remainder of the sections and how they are started off in the
man page source is as follows:

	.Sh DESCRIPTION
	.Sh IMPLEMENTATION NOTES
	.Sh RETURN VALUES	
	.Sh ENVIRONMENT
	.Sh FILES
	.Sh EXAMPLES
	.Sh DIAGNOSTICS
	.Sh COMPATIBILITY
	.Sh ERRORS
	.Sh SEE ALSO
	.Sh STANDARDS
	.Sh HISTORY
	.Sh AUTHORS
	.Sh BUGS

	These are the three main sections that may be used, and obviously,
all do not need to be used in a man page. One can also define custom
sections with the .Sh macro. In addition, one may define sub-sections with
the .Ss macro. 
	
	To create paragraph breaks, use the .Pp on a line by itself. To
display a line literally, that is, with all of its tabs and spaces
literally as outlined in the source file, use the .Dl macro, followed by
the text. To create blocks of indented text, either as literal text (as
described above) or not, use two macros: .Bd and .Ed. The former macro
defines the beginning of the display block and the latter macro defines
the end of the display block. Various options can be passed to the display
block to specify special formatting. These options must be specified on
the .Bd line. For example, to define a display-block literally as
formatted with spaces and tabs in the source file, one would do the
follow:

	.Bd -literal
	some test here with tabs		and more tabs
	on this line too 	and maybe some spaces    like this.
	.Ed

	Other options that can be passed to the display-block macros are:

	-ragged			Unjustified text
	-filled			Justified text
	-file <name>		Read in named <file> and display
	-offset	<parameters>	Offset the display with parameter
				specified with the <string> option.
				Some -offset options are:

				"left"		Align block on left
				"center"	Center the text
				"indent"	A Tab indent
				"indent-two"	Two Tab indent
				"right"		Align block on right

	In addition to defining display-blocks, one can define display
lists with the .Bl and .El macros. Items in dislay-lists must use the .It
macro, for instance:

	.Bl
	.It
	First Item
	.It
	Second Item
	.El

	This will make a list with no <return>s after each list item. To
number the items on separate lines, pass the "-num" parameter on the .Bl
macro line, for instance:

        .Bl -enum
        .It
        First Item
        .It
        Second Item
        .El
	
	To list the items with bullets, use the -bullet parameter to the
.Bl macro line instead. Altogether there are 11 parameters that can be
sent to the .Bl macro:

	-bullet    Bullet Item List
	-item      Unlabeled List
	-enum      Enumerated List
	-tag       Tag Labeled List
	-diag      Diagnostic List
	-hang      Hanging Labeled List
	-ohang     Overhanging Labeled List
	-inset     Inset or Run-on Labeled List
	-offset    (All lists.) See `.Bd' begin-display above.
	-width     (-tag and -hang lists only.)  See `.Bd'.
	-compact   (All lists.)  Suppresses blank lines.


	3.2.	Manual & General Text Macros

	You have already seen some Manual & General Text macros in our
above examples, namely .Nm, .Fl, .Ar, and .Op. The .Nm macro is used to
display commands in bold. In our case, the command was "magicbin." .Fl is
used to define command parameters, .Ar is used to define command
arguments, and .Op is a special macro that is used to combine multiple
callable macros for easy formatting. For instance, in our original example
we had:

	.Op Fl cxz Ar time Ar number

	Here, the .Op macro operated on the text "Fl cxz Ar time Ar
number". The callable Fl macro worked on its following text, the "cxz" and
prefixed them with a hyphen and made them bold. The callable macros Ar
took their subsequent text, underlined it, and all the .Ar macros were
bracketted. For a clear illustration of this, use our earlier examples and
display them with nroff(1). Not all .Op macros are callable and the full
list of Manual & General Text macros, with the callable and non-callable
ones indicated, can be found in the mdoc(7) man page.

	Other often-used macros are:

	.Xr <reference> <number> Underline system man page reference
	.An <author>		 Man page Author
	.Aq <text>		 Block off given text in angle quotes
	.Fx			 OS version

	When formatting macro parameters with punctuation, one must put a
space between the text and the commas and periods for the commas and
periods to be placed properly, for instance, to display "FreeBSD
4.0." the followed must be put in the source file:

	.Fx 4.0 .

	When typing regular text for display, one needn't preceed
punctuation with spaces. For instance:

	.Sh DESCRIPTION
	This man page, among other things, displays some interesting stuff
	and then explains some cool things, such as how the command
	.Nm magicbin ,
	is used and all of its parameters.

	When indicating path names to files, use the .Pa macro, when
indicating variable names, use the .Va macro, and when trying to display
literal text use the .Li macro. The full list of macros found in the
mdoc(7) man page numbers far more than those quickly referred to here, and
it is strongly suggested that one reads over them to be aware of all
macros that one can use to format their man pages. 

	For an full example of a man page, one should look over the three
documents in /usr/share/examples/mdoc. The three documents in there are
samples for three different types of man pages, specifically, 1, 3, and
4. In addition, mdoc.samples(7) offers many sample macros and snippets of
man page layouts. It is an extremely powerful reference and should be used
by anyone who requires advanced mdoc(7) functionality.


	4. References

	mdoc(7)
	mdoc.samples(7)
	man(1)
	man(7)
	/usr/share/examples/mdoc/
	/usr/share/tmac/mdoc/

Leave a Reply

Your email address will not be published. Required fields are marked *