If there are any questions or comments, please direct them to email@example.com. 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.
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.
2. Man Page Location & Types
3. Man Page Macros
3.1. Page Structure Macros
3.2. Manual & General Text Macros
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:
8System Manager's Manuals
9Kernel 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:
.DtTitle, in upper case
.OsOperating 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.
.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:
.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 IMPLEMENTATION NOTES
.Sh RETURN VALUES
.Sh SEE ALSO
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:
some test here with tabsand more tabs on this line too and maybe some spaces like this.
Other options that can be passed to the display-block macros are:
-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:
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:
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:
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.