troff can trace its origins back to a formatting program called
RUNOFF, written by Jerry Saltzer, which ran on the CTSS
(Compatible Time Sharing System, a project of MIT, the
Massachusetts Institute of Technology) in the
mid-sixties.2 The name came from the use of the phrase “run off a
document”, meaning to print it out.
Bob Morris ported it to the 635 architecture and called the program
roff (an abbreviation of
runoff). It was rewritten as
rf for the PDP-7 (before having Unix), and at the
same time (1969), Doug McIlroy rewrote an extended and simplified
roff in the BCPL programming language.
In 1971, the Unix developers wanted to get a PDP-11, and to justify
the cost, proposed the development of a document formatting system for
the AT&T patents division. This first formatting program was
a reimplementation of McIlroy’s
roff, written by J. F.
When they needed a more flexible language, a new version of
roff”) was written. It had a much
more complicated syntax, but provided the basis for all future versions.
When they got a Graphic Systems CAT Phototypesetter, Ossanna wrote a
nroff that would drive it. It was dubbed
troff, for “typesetter
roff”, although many people have
speculated that it actually means “Times
roff” because of the
use of the Times font family in
troff by default. As such, the
troff is pronounced ‘t-roff’ rather than ‘trough’.
nroff (they were actually the same program
except for some ‘#ifdef’s), which was for producing output for line
printers and character terminals. It understood everything
did, and ignored the commands that were not applicable (e.g. font
Since there are several things that cannot be done easily in
troff, work on several preprocessors began. These programs would
transform certain parts of a document into
troff, which made a
very natural use of pipes in Unix.
eqn preprocessor allowed mathematical formulae to be specified
in a much simpler and more intuitive manner.
tbl is a
preprocessor for formatting tables. The
refer preprocessor (and
the similar program,
bib) processes citations in a document
according to a bibliographic database.
troff was written in PDP-11 assembly
language and produced output specifically for the CAT phototypesetter.
He rewrote it in C, although it was now 7000 lines of uncommented
code and still dependent on the CAT. As the CAT became less common, and
was no longer supported by the manufacturer, the need to make it support
other devices became a priority. However, before this could be done,
Ossanna died by a severe heart attack in a hospital while recovering
from a previous one.
So, Brian Kernighan took on the task of rewriting
newly rewritten version produced device independent code that was very
easy for postprocessors to read and translate to the appropriate printer
codes. Also, this new version of
for “device independent
troff”) had several extensions, which
included drawing functions.
Due to the additional abilities of the new version of
several new preprocessors appeared. The
provides a wide range of drawing functions. Likewise the
preprocessor did the same, although via a much different paradigm. The
grap preprocessor took specifications for graphs, but, unlike
other preprocessors, produced
James Clark began work on a GNU implementation of
early 1989. The first version,
groff 0.3.1, was
released June 1990.
ditroffwith many extensions.
troffalso eliminated the need for a separate
nroffprogram with a postprocessor that would produce ASCII output.
Also, a front-end was included that could construct the, sometimes painfully long, pipelines required for all the post- and preprocessors.
Development of GNU
troff progressed rapidly, and saw the
additions of a replacement for
refer, an implementation of the
ms and mm macros, and a program to deduce how to format a
It was declared a stable (i.e. non-beta) package with the release of version 1.04 around November 1991.
Beginning in 1999,
groff has new maintainers (the package
was an orphan for a few years). As a result, new features and programs
grn, a preprocessor for gremlin images, and an output device
to produce HTML and XHTML have been added.