View source | |
# Writing Effective Manual Pages | |
Larry Kollar | |
Manual pages (or manpages) are an important, if not essential, part | |
of UNIXsoftware documentation. This document discusses the | |
challenges and benefits of this time-tested documentation format, and | |
provides hints and tips for creating documents that are readable and | |
display well under a variety of conditions. | |
This document is not about the mechanics of the man or mdoc macro | |
packages; see the Writing Manpages HOWTO for a good tutorial. | |
Writing Manpages HOWTO | |
# Table of contents | |
1. Background | |
1.1. Common Conventions | |
1.2. Why Manpages are Still Relevant in the 21st Century | |
1.3. Software Related to Manpages | |
2. One Source, Myriad Outputs | |
2.1. Challenges | |
3. General Hints and Tips | |
3.1. Content is King | |
3.1.1. Start at the Top | |
3.1.2. Make the Synopsis Useful | |
3.1.3. Include Examples | |
3.2. Avoid Raw groff Markup | |
3.3. Short as Possible, Long as Necessary | |
3.3.1. Separate Manpages by Section | |
3.3.2. Separate Manpages by Function | |
3.3.3. Full and Short Versions | |
3.4. Use Subsections Where Necessary | |
3.5. Use Tables Sparingly | |
3.6. Use Other Preprocessors Even More Sparingly | |
4. Conditional Pagination | |
5. Testing | |
6. Conclusion | |
7. Miscellany | |
7.1. History | |
7.2. Acknowledgments | |
7.3. Legalese | |
# 1. Background | |
The earliest manpages extant as of mid-2004 are from UNIX3rd Edition, | |
dated February 1973. [1] | |
> [1] Barring the existence of an as-yet undiscovered tape in a | |
> dusty storage room somewhere, the manpages are all that survives of | |
> UNIX3rd Edition. | |
They may be found at the TUHS archive. | |
In those days, UNIXdocumentation consisted primarily of the manpages | |
collected into a printed book, using a permuted or KWIC (Key Word In | |
Context) index to provide both table of contents and index. A few | |
articles from the Bell System Technical Journal (BSTJ) and | |
miscellaneous papers rounded out the collection. However, since | |
manpages were also stored on the system's disk drive, they also | |
provided a rudimentary "help" system. | |
# 1.1. Common Conventions | |
The storage constraints of early UNIXsystems, as well as display | |
constraints (the typical display was a 24−line "dumb terminal"), | |
led to a set of manpage conventions that has largely survived to the | |
present day: | |
* A manpage should be short and complete. Tiny displays (by | |
today's standards) and the limits of human short-term memory | |
allowed for little more. | |
* Information only peripherally related to the subject was not | |
included in a manpage--that is, glossaries, tutorials, | |
bibliographies, and similar information became part of the | |
miscellaneous papers and (perhaps) referred to as needed. | |
* A manpage should describe any bugs or other limitations that a | |
user might see under normal circumstances. In some circles, this | |
is called the "Principle of Least Surprise." This requirement made | |
for more satisfied users--and often led to better programs, as | |
developers might prefer fixing bugs to admitting their existence. | |
# 1.2. Why Manpages are Still Relevant in the 21st Century | |
There are several reasons that manpages are still an essential part | |
of UNIXafter over 30 years: | |
* Of all the different documentation systems available on | |
UNIX,manpages are the most likely to be installed and nearly always | |
installed. | |
* Long-time users expect manpages to be available. A program that | |
is missing a manpage, or has a manpage that simply points the | |
reader to an info or off-site HTMLdocument, is considered highly | |
annoying. HTMLand info documents are not universally unwelcome, | |
but should be considered supplementary rather than replacements. | |
* The manpage format is still the only lightweight, widespread | |
document format that can be displayed on a text screen, printed, or | |
converted to HTMLwithout a great deal of work or conversion | |
glitches. | |
* While a well-written manual can supplement a manpage, there is no | |
search facility like apropos that indexes a library of documents. | |
In addition, the directories used for storing manuals vary wildly | |
from system to system. | |
# 1.3. Software Related to Manpages | |
Most UNIXsystems include the following manpage-related utilities: | |
* man - Displays manpages on a terminal or text console, formatting | |
the manpage using nroff when necessary. Some versions of man can | |
also typeset manpages using troff. | |
* groff - Formats manpages using the man macro package. Groff | |
supports output to text, PostScript, HTML,and several | |
non-PostScript printers. | |
* apropos and whatis - Displays a list of manpages with the | |
specified keywords (which can be regular expressions). Whatis | |
matches only on complete words, while apropos supports partial-word | |
searches. | |
* makewhatis - Builds the manpage search database. | |
# 2. One Source, Myriad Outputs | |
The man macro package is an early method of single sourcing, a | |
documentation technique that allows writers and publishers to publish | |
documents in multiple formats--printed and on-line--without changing | |
the document source code. [2] | |
> [2] In terms of longevity and number of documents produced, it is | |
> easily the most successful single-sourcing technique as well. | |
For example, typing man ls at a shell prompt immediately shows the | |
documentation for the ls command. The man command formats the manpage | |
source and displays it in the shell window. [3] | |
> [3] Many systems cache the formatted manpage, allowing man to | |
> skip the formatting step after the first request. | |
Using the -t option (as in man -t ls | lpr) on some systems typesets | |
the manpage source for a PostScript printer. Thus, manpages provide | |
source for both on-line help and typeset documents. | |
A variety of other methods are available for displaying manpages, | |
again without changing the manpage source: | |
* The groff typesetting system, the de facto replacement for troff, | |
provides an HTMLoutput "device" for generating HTMLfrom manpage | |
source. | |
* Several UNIXbrowsers support URLs such as man:ls for reading and | |
displaying manpages. They recognize references to other manpages | |
and convert them to links. | |
* Applications such as xman or TkMan simulate (to a point) printed | |
output in a graphical interface. | |
* A variety of scripts are available from the Internet for direct | |
conversion from manpage format to HTMLor even DocBook. | |
# 2.1. Challenges | |
While having several major output formats to choose from is a great | |
advantage, there are several challenges to writing a manpage that | |
works well in all circumstances: | |
* Text-only output (as produced by the man command) is difficult to | |
read once the manpage exceeds a certain length (the exact length is | |
debatable, but is probably less than 10 printed pages). | |
* While there are no specific prohibitions against using groff | |
preprocessor output (including tbl, eqn, and pic) in a manpage, the | |
output may not be useful in many situations. The xman command in | |
particular has trouble displaying tables. | |
Even if you can ignore these problems, printed output has its own | |
challenges: | |
* Standard paper sizes differ depending on locale (for example, | |
8.5x11 inch in North America vs. A4 in most other countries). | |
Printing to a bound book introduces even more page sizes, including | |
paperback pocket reference and 7x9 inch format (used by O'Reilly | |
and many other publishers). | |
* You cannot assume even basic typesetting parameters, such as | |
typeface (font) or point size, are constant. For example, the | |
command groff -man -fBM -rS11 foo.n | lpr prints the manpage using | |
the Bookman Medium typeface in 11 point type. | |
* Many people have printers that do not support PostScript. | |
* People may alter man.local to change the default manpage layout. | |
Fortunately, groff can handle all but the most oddball layouts on its | |
own with a minimum of help. Indeed, the best way to get good output | |
usually is to simply allow groff to handle things. The trick is to | |
guide rather than force the typesetting process. | |
# 3. General Hints and Tips | |
Keep these hints and tips in mind when writing effective manpages. | |
# 3.1. Content is King | |
An effective manpage contains the information necessary for readers | |
to make best use of the program. While the types and order of | |
content expected stem from long-standing convention, there are | |
several places where a little thought and work can make a big | |
difference. | |
# 3.1.1. Start at the Top | |
The first body text in any manpage--that is, the line following the | |
.SH Name line--is the name of the manpage and a brief description of | |
its subject. The makewhatis program uses this text to build a search | |
index; whatis and apropos read the index. | |
Therefore, consider carefully the content of this line: it must be a | |
short, clear description of the subject; and it must provide hooks | |
for searching. Think about what keywords that readers would give to | |
apropos to find your manpage, work them into the description, and | |
make it all fit on one line. | |
# 3.1.2. Make the Synopsis Useful | |
If there are several ways to use your program, list each way | |
separately in the Synopsis section of your manpage. For example, the | |
BSD version of cp(1) shows separate commands for file-to-file and | |
file-to-directory copies. Not only is it easier on the reader, it is | |
easier to write than trying to compress two ideas into a single line. | |
# 3.1.3. Include Examples | |
One or two brief examples can serve to illuminate a procedure that | |
might otherwise be difficult to explain. | |
# 3.2. Avoid Raw groff Markup | |
Sometimes, you may be tempted to use raw groff requests or inlines to | |
make the output look a little better. While man can deal with them | |
(since it uses groff to do the formatting), readers may run into | |
problems when using a man-enabled browser to display the document. | |
Translation programs may have a hard time dealing with raw markup as | |
well. As mentioned earlier, attempting to force groff to do | |
something in a particular way can have unintended effects. | |
In nearly all cases, the man macros provide proper formatting, | |
eliminating the need for typographical bon mots. For example, format | |
a reference to another manpage using the macro .IR ls (1) rather than | |
using inline font changes like \fIls\fR(1). Similarly, use the .TP | |
macro rather than .in and .ti requests to format list items. See | |
groff_man(7) for a complete list of available formatting macros. | |
There are several exceptions to the rule, described in sections | |
following. | |
# 3.3. Short as Possible, Long as Necessary | |
In 1973, meeting the "short and complete" requirement was fairly | |
simple: the two largest manpages in the UNIX3rd Edition archive are | |
ed(1) and sh(1). If printed on a typesetter, ed(1) may have run 5 | |
pages and sh(1) would have run about 4 pages. Nowadays, it is not | |
uncommon for manpages to run dozens of pages (see the bash(1) manpage | |
for an example). | |
As mentioned earlier, readers can easily lose their place in long, | |
unfamiliar manpages when using the man command. However, many | |
long-time UNIXusers expect to find any reference information about a | |
command in its manpage and get annoyed if items are missing. | |
Balancing these needs when an application gets complex can be | |
difficult. | |
There are several possible ways to provide manpages that work for | |
most people. Some of these methods are conventional, some are not. | |
# 3.3.1. Separate Manpages by Section | |
For example, your foo program might use a particular file format. | |
Instead of discussing the program and the file format in the same | |
manpage, create a foo(1) manpage describing the program, and a foo(5) | |
manpage describing the file format. [4] | |
> [4] The actual section number may vary. Linux and BSD use | |
> section 5 to describe file formats, while traditional UNIX uses | |
> section 4. A later version may cover this topic more thoroughly. | |
# 3.3.2. Separate Manpages by Function | |
Some writers split large manpages to cover separate functions; perl | |
(over)uses this method. If you use this approach, limit it to no | |
more than two or three manpages. | |
# 3.3.3. Full and Short Versions | |
A seldom-used but potentially effective method involves creating both | |
full and short versions of the manpage. The common pitfalls to using | |
this method are: | |
* Maintaining two completely separate manpages is extra effort and | |
can result in diverging information if not handled properly. One | |
way to avoid this problem is to use nroff and make to create two | |
manpages from a common base document as shown below. | |
* Using the short version as the default. As mentioned earlier, | |
experienced UNIXusers expect manpages to cover everything. Make | |
the full version the default manpage and mention the short version | |
near the beginning. | |
The following is an example of a master manpage that can be processed | |
to create full and short versions. | |
.cc @ | |
@ec | | |
@nf | |
@ie rSHORT .TH foo_short 1 | |
@el .TH foo 1 | |
.SH Name | |
foo −the canonical example | |
.SH Synopsis | |
.B foo | |
.RB [ -b ] | |
.RB [ -a ] | |
.RB [ -r ] | |
@if !rSHORT |{| | |
.RB [ -q ] | |
.RB [ -x ] | |
.RB [ -z ] | |
@|} | |
.RI [ file ...] | |
.SH Description | |
The | |
.B foo | |
program reads a file and processes it. | |
@ie rSHORT |{| | |
This document is a quick reference, | |
describing only basic features; see | |
.IR foo (1) | |
for a complete description. | |
.|} | |
@el |{| | |
For a quick reference to | |
.BR foo , | |
see | |
.IR foo_short (1). | |
@|} | |
.P | |
And so it goes... | |
An example Makefile fragment that creates the manpages would resemble | |
the following: | |
manpages: foo.n foo_short.n | |
foo.n: foo_master.n | |
nroff -Tlatin1 foo_master.n | sed -e '/^$/d' > foo.n | |
foo_short.n: foo_master.n | |
nroff -Tlatin1 -nSHORT=1 foo_master.n |\ | |
sed -e '/^$/d' > foo_short.n | |
The sed command in the pipeline removes blank lines from the nroff | |
output. | |
# 3.4. Use Subsections Where Necessary | |
In some cases, there may not be any way to minimize your document. | |
One way to make such a manpage easier to follow is to organize it | |
into subsections and use the .SS macro to add subheadings. See the | |
groff_ms(7) manpage in version 1.18.1 or later versions of groff for | |
an example. | |
# 3.5. Use Tables Sparingly | |
Tables are useful for organizing data, but wider tables do not | |
display well on a text screen due to line-wrapping. For HTML output, | |
groff currently converts tables to PNG images. | |
Keep the following in mind when creating tables for manpages: | |
* You can usually replace two-column tables with the .TP macro. | |
* Avoid over-using vertical lines to separate columns (specified by | |
the allbox option or as a vertical bar in the column specification | |
section). Vertical lines use a great deal of space in a | |
text-formatted table. | |
* Horizontal lines may be useful to organize groups of table rows, | |
if the table is very long. | |
Again, the groff_ms(7) manpage in version 1.18.1 or later versions of | |
groff provides examples. | |
# 3.6. Use Other Preprocessors Even More Sparingly | |
Besides tbl, the two most common preprocessors are pic (to generate | |
line drawings) and eqn (to format equations). While they work with | |
printed output, programs like xman are known to have problems with at | |
least some instances of pictures or equations. In addition, neither | |
do very well on text displays (nroff, man). If you must use them at | |
all, make them conditional. | |
There are a handful of other preprocessors, either part of the groff | |
distribution or compatible with it (gremlin, grap, and others). | |
However, these preprocessors have the same limitations as do eqn and | |
pic. Some systems may not even have them installed. Avoid using | |
these preprocessors at all unless absolutely necessary. | |
# 4. Conditional Pagination | |
The .ne request is convenient for creating conditional pagination, | |
and is indeed one of the few low-level requests that can be used | |
without problems in manpages. The simplest form is a construct like | |
.ne 6, which forces a page break if less than six lines (or 6v) | |
separate the current vertical position from the beginning of the | |
footer. [5] | |
> [5] Actually, from the vertical position to the next trap, but | |
> for manpages they should be the same. | |
If there is more distance available than what you require, the | |
request has no effect. | |
You can also specify an absolute distance like .ne 1i, but in most | |
cases specifying the number of lines works better since line height | |
changes with the point size. | |
# 5. Testing | |
All the different combinations of font, point size, page size, and | |
output media can add up to dozens--if not hundreds--of possibilities. | |
However, you should at least try the following four methods: | |
* nroff -man foo.man | less (normal on-screen version) | |
* groff -man foo.man | lpr (normal printed version) | |
* groff -man -rS12 foo.man | lpr ("large print" version) | |
* groff -man -Thtml foo.man > foo.html (HTMLversion) | |
Don't forget to add preprocessor options, if necessary. Naturally, | |
you can replace the pipelines for the printed versions with a | |
redirect and check the PostScript output with gv or some other online | |
viewer. | |
You should also test your manpage under conditions that you could | |
reasonably expect your audience to see. For example, if your | |
software is aimed toward KDE users, test the manpage with Konqueror. | |
If the pagination and output look correct for these, you may want to | |
try variations on font and point size; try different page sizes if | |
time allows. If you can reasonably test different printer outputs | |
such as -Tlj4 or -Tlbp, by all means test them. | |
# 6. Conclusion | |
Technical writing, even--or especially--for short documents like | |
manpages, is both art and science. The goal is to provide needed | |
information without overwhelming your audience. By carefully | |
controlling document content, you can create more useful manpages | |
with a minimum of extra effort. | |
# 7. Miscellany | |
# 7.1. History | |
* 26 Apr 2004 | |
V0.5, first public draft. | |
* 20 May 2004 | |
V0.6, extensive changes based on voluminous feedback from the | |
grofflist. | |
* 7 June 2004 | |
V1.0, first common release. | |
# 7.2. Acknowledgments | |
Thanks to the many people on the groff list who provided feedback and | |
encouragement, including Meg McRoberts, Alejandro López-Valencia, | |
Pete Phillips, Clarke Echols, and others. | |
# 7.3. Legalese | |
Copyright ©2004 by Larry Kollar. Copying and distribution of this | |
paper are allowed under the terms of either the GNU Free | |
Documentation License (FDL) or the Creative Commons Attribution | |
License. | |
Source |