(TXT) 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.
       
 (HTM) 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.
       
 (HTM) Source