Puffy mdocml – UNIX manpage compiler, current version @VERSION@ (@VDATE@)

Sources: current, cvsweb (archives)


mdocml is a suite of tools compiling mdoc, the roff macro package of choice for BSD manual pages, and man, the predominant historical package for UNIX manuals. It is small, ISO C, ISC-licensed, and quite fast.

The tool set features mandoc, based on the libmandoc validating compiler, to format output for UNIX terminals (with support for wide-character locales), XHTML, HTML, PostScript, and PDF. It also includes preconv, for recoding multibyte manuals; demandoc, for emitting only text parts of manuals; mandocdb, for indexing manuals; and apropos, whatis, and man.cgi (via catman) for semantic search of manual content.

mdocml has predominantly been developed on OpenBSD and is both an OpenBSD and a BSD.lv project. We strive to support all interested free operating systems, in particular DragonFly, NetBSD, FreeBSD, Minix 3, and GNU/Linux, as well as all systems running the pkgsrc portable package build system. All of these projects have helped to make mdocml better, by providing feedback and advice, bug reports, and patches.

Disambiguation: mdocml is often referred to by its installed binary, mandoc.


mdocml should build and run on any modern system with libdb (this is installed by default on BSD UNIX systems — see the Makefile if you're running Linux). To build and install into /usr/local/, just run make install. Be careful: the preconv, apropos, and whatis installed binary names may be taken by existing utilities.


Several systems come bundled with mdocml utilities. If your system does not appear below, the maintainers have not contacted me and it should not be considered official, so please contact us if you plan on maintaining a downstream version!

DragonFly BSD contrib/mdocml (1.12.3 sources) lib/libmandoc usr.bin/mandoc (build system)
FreeBSD 10.0, -CURRENT contrib/mdocml (1.12.1 sources) usr.bin/mandoc (build system)
FreeBSD 9.x, 8.x ports/textproc/mdocml (1.12.2 port)
NetBSD src/external/bsd/mdocml (1.12.1 sources plus patches and build system)
OpenBSD src/usr.bin/mandoc (1.12.3 sources under active development and build system)
pkgsrc textproc/mdocml (1.12.2 port)
Minix3 external/bsd/mdocml (1.10.9 sources and build system)
Alpine Linux aports/main/mdocml (1.12.2 port)


These manuals are generated automatically and refer to the current release. They are the authoritative documentation for the mdocml system.

apropos(1) search the manual page database
demandoc(1) emit only text of UNIX manuals
mandoc(1) format and display UNIX manuals
preconv(1) recode multibyte UNIX manuals
whatis(1) search the manual page database
mandoc(3) mandoc macro compiler library
tbl(3) roff table parser library for mandoc
eqn(7) eqn-mandoc language reference
man(7) man language reference
man.cgi(7) cgi for manpage query and display
mandoc_char(7) mandoc special characters
mdoc(7) mdoc language reference
roff(7) roff-mandoc language reference
tbl(7) tbl-mandoc language reference
catman(8) update a man.cgi manpage cache
mandocdb(8) index UNIX manuals

Supplementary Information


Use the mailing lists for bug-reports, patches, questions, etc. Please check the TODO for known issues before posting. All lists are subscription-only: send a blank e-mail to the listed address to subscribe. Beyond that, contact Kristaps at kris...@bsd.lv. Archives are available at Gmane.

disc...@mdocml.bsd.lv bug-reports, general questions, and announcements
tec...@mdocml.bsd.lv patches and system discussions
sou...@mdocml.bsd.lv source commit messages


31-12-2013: version 1.12.3

In the mdoc(7) SYNOPSIS, line breaks and hanging indentation now work correctly for .Fo/.Fa/.Fc and .Fn blocks. Thanks to Franco Fichtner for doing part of the work.

The mdoc(7) .Bk macro got some addititonal bugfixes.

In mdoc(7) macro arguments, double quotes can now be quoted by doubling them, just like in man(7). Thanks to Tsugutomo ENAMI for the patch.

At the end of man(7) macro lines, end-of-sentence spacing now works. Thanks to Franco Fichtner for the patch.

For backward compatibility, the man(7) parser now supports the man-ext .UR/.UE (uniform resource identifier) block macros.

The man(7) parser now handles closing blocks that are not open more gracefully.

The man(7) parser now ignores blank lines right after .SH and .SS.

In the man(7) formatter, reset indentation when leaving a block, not just when entering the next one.

The roff(7) .nr request now supports incrementing and decrementing number registers and stops parsing the number right before the first non-digit character.

The roff(7) parser now supports the alternative escape sequence syntax \C'uXXXX' for Unicode characters.

The roff(7) parser now parses and ignores the .fam (font family) and .hw (hyphenation points) requests and the \d and \u escape sequences.

The roff(7) manual got a new ESCAPE SEQUENCE REFERENCE.

05-10-2013: version 1.12.2

The mdoc(7) to man(7) converter, to be called as mandoc -Tman, is now fully functional.

The mandoc(1) utility now supports the -Ios (default operating system) input option, and the -Tutf8 output mode now actually works.

The mandocdb(8) utility no longer truncates existing databases when starting to build new ones, but only replaces them when the build actually succeeds.

The man(7) parser now supports the PD macro (paragraph distance), and (for GNU man-ext compatibility only) EX (example block) and EE (example end). Plus several bugfixes regarding indentation, line breaks, and vertical spacing, and regarding RS following TP.

The roff(7) parser now supports the \f(BI (bold+italic) font escape, the \z (zero cursor advance) escape and the cc (change control character) and it (input line trap) requests. Plus bugfixes regarding the \t (tab) escape, nested escape sequences, and conditional requests.

In mdoc(7), several bugs were fixed related to UTF-8 output of quoting enclosures, delimiter handling, list indentation and horizontal and vertical spacing, formatting of the Lk, %U, and %C macros, plus some bugfixes related to the handling of syntax errors like badly nested font blocks, stray Ta macros outside column lists, unterminated It Xo blocks, and non-text children of Nm blocks.

In tbl(7), the width of horizontal spans and the vertical spacing around tables was corrected, and in man(7) files, a crash was fixed that was triggered by some particular unclosed T{ macros.

For mandoc developers, we now provide a tbl(3) library manual and gmdiff, a very small, very simplistic groff-versus-mandoc output comparison tool.


Copyright © 2008–2011 Kristaps Dzonsons, © 2013 Ingo Schwarze, $Date: 2013/12/31 11:23:23 $