summaryrefslogtreecommitdiffstats
path: root/man/roff.7.man
diff options
context:
space:
mode:
Diffstat (limited to 'man/roff.7.man')
-rw-r--r--man/roff.7.man2613
1 files changed, 2613 insertions, 0 deletions
diff --git a/man/roff.7.man b/man/roff.7.man
new file mode 100644
index 0000000..2468a4b
--- /dev/null
+++ b/man/roff.7.man
@@ -0,0 +1,2613 @@
+'\" t
+.TH roff @MAN7EXT@ "@MDATE@" "groff @VERSION@"
+.SH Name
+roff \- concepts and history of
+.I roff
+typesetting
+.
+.
+.\" TODO: Synchronize this material with introductory section(s) of our
+.\" Texinfo manual, and then keep it that way.
+.
+.\" ====================================================================
+.\" Legal Terms
+.\" ====================================================================
+.\"
+.\" Copyright (C) 2000-2023 Free Software Foundation, Inc.
+.\"
+.\" This file is part of groff, the GNU roff type-setting system.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this
+.\" document under the terms of the GNU Free Documentation License,
+.\" Version 1.3 or any later version published by the Free Software
+.\" Foundation; with no Invariant Sections, with no Front-Cover Texts,
+.\" and with no Back-Cover Texts.
+.\"
+.\" A copy of the Free Documentation License is included as a file
+.\" called FDL in the main directory of the groff source package.
+.
+.
+.\" Save and disable compatibility mode (for, e.g., Solaris 10/11).
+.do nr *groff_roff_7_man_C \n[.cp]
+.cp 0
+.
+.\" Define fallback for groff 1.23's MR macro if the system lacks it.
+.nr do-fallback 0
+.if !\n(.f .nr do-fallback 1 \" mandoc
+.if \n(.g .if !d MR .nr do-fallback 1 \" older groff
+.if !\n(.g .nr do-fallback 1 \" non-groff *roff
+.if \n[do-fallback] \{\
+. de MR
+. ie \\n(.$=1 \
+. I \%\\$1
+. el \
+. IR \%\\$1 (\\$2)\\$3
+. .
+.\}
+.rr do-fallback
+.
+.
+.\" ====================================================================
+.SH Description
+.\" ====================================================================
+.
+The term
+.I roff
+denotes a family of document formatting systems known by names like
+.IR troff ,
+.IR nroff ,
+and
+.IR ditroff .
+.
+A
+.I roff
+system consists of an interpreter for an extensible text formatting
+language and a set of programs for preparing output for various devices
+and file formats.
+.
+Unix-like operating systems often distribute a
+.I roff
+system.
+.
+The manual pages on Unix systems
+(\[lq]man\~pages\[rq])
+and bestselling books on software engineering,
+including Brian Kernighan and Dennis Ritchie's
+.I The C Programming Language
+and W.\& Richard Stevens's
+.I Advanced Programming in the Unix Environment
+have been written using
+.I roff
+systems.
+.
+GNU
+.IR roff \[em] groff \[em]is
+arguably the most widespread
+.I roff
+implementation.
+.
+.
+.P
+Below we present
+typographical concepts that form the background of all
+.I roff
+implementations,
+narrate the development history of some
+.I roff
+systems,
+detail the command pipeline managed by
+.MR groff @MAN1EXT@ ,
+survey the formatting language,
+suggest tips for editing
+.I roff
+input,
+and recommend further reading materials.
+.
+.
+.\" ====================================================================
+.SH Concepts
+.\" ====================================================================
+.
+.\" BEGIN Keep roughly parallel with groff.texi nodes "Text" through
+.\" "Tab Stops".
+.I roff
+input files contain text interspersed with instructions to control the
+formatter.
+.
+Even in the absence of such instructions,
+a
+.I roff
+formatter still processes its input in several ways,
+by filling,
+hyphenating,
+breaking,
+and adjusting it,
+and supplementing it with inter-sentence space.
+.
+These processes are basic to typesetting,
+and can be controlled at the input document's discretion.
+.
+.
+.P
+When a device-independent
+.I roff
+formatter starts up,
+it obtains information about the device for which it is preparing
+output from the latter's description file
+(see
+.MR groff_font @MAN5EXT@ ).
+.
+An essential property is the length of the output line,
+such as \[lq]6.5 inches\[rq].
+.
+.
+.P
+The formatter interprets plain text files employing the Unix line-ending
+convention.
+.
+It reads input a character at a time,
+collecting words as it goes,
+and fits as many words together on an output line as it can\[em]this
+is known as
+.I filling.
+.
+To a
+.I roff
+system,
+a
+.I word
+is any sequence of one or more characters that aren't spaces or
+newlines.
+.
+The exceptions separate words.
+.
+.
+.P
+A
+.I roff
+formatter attempts to detect boundaries between sentences,
+and supplies additional inter-sentence space between them.
+.
+It flags certain characters
+(normally
+.RB \[lq] !\& \[rq],
+.RB \[lq] ?\& \[rq],
+and
+.RB \[lq] .\& \[rq])
+as potentially ending a sentence.
+.
+When the formatter encounters one of these
+.I end-of-sentence characters
+at the end of an input line,
+or one of them is followed by two (unescaped) spaces on the same input
+line,
+it appends an inter-word space
+followed by an inter-sentence space in the output.
+.
+The dummy character escape sequence
+.B \[rs]&
+can be used after an end-of-sentence character to defeat end-of-sentence
+detection on a per-instance basis.
+.
+Normally,
+the occurrence of a visible non-end-of-sentence character
+(as opposed to a space or tab)
+immediately after an end-of-sentence
+character cancels detection of the end of a sentence.
+.
+However,
+several characters are treated
+.I transparently
+after the occurrence of an end-of-sentence character.
+.
+That is,
+a
+.I roff
+does not cancel end-of-sentence detection when it processes them.
+.
+This is because such characters are often used as footnote markers or to
+close quotations and parentheticals.
+.
+The default set is
+.BR \[dq] ,
+.BR \[aq] ,
+.BR ) ,
+.BR ] ,
+.BR * ,
+.BR \[rs][dg] ,
+.BR \[rs][dd] ,
+.BR \[rs][rq] ,
+and
+.BR \[rs][cq] .
+.
+The last four are examples of
+.I special characters,
+escape sequences whose purpose is to obtain glyphs that are not easily
+typed at the keyboard,
+or which have special meaning to the formatter
+(like
+.BR \[rs] ).
+.\" slack wording: itself).
+.
+.
+.P
+When an output line is nearly full,
+it is uncommon for the next word collected from the input to exactly
+fill it\[em]typically,
+there is room left over only for part of the next word.
+.
+The process of splitting a word so that it appears partially on one line
+(with a hyphen to indicate to the reader that the word has been broken)
+with its remainder on the next is
+.I hyphenation.
+.
+Hyphenation points can be manually specified;
+.I groff
+also uses a hyphenation algorithm and language-specific pattern files to
+decide which words can be hyphenated and where.
+.
+Hyphenation does not always occur even when the hyphenation rules for a
+word allow it;
+it can be disabled,
+and when not disabled there are several parameters that can prevent it
+in certain circumstances.
+.
+.
+.P
+Once an output line is full,
+the next word
+(or remainder of a hyphenated one)
+is placed on a different output line;
+this is called a
+.I break.
+.
+In this document and in
+.I roff
+discussions generally,
+a \[lq]break\[rq] if not further qualified always refers to the
+termination of an output line.
+.
+When the formatter is filling text,
+it introduces breaks automatically to keep output lines from exceeding
+the configured line length.
+.
+After an automatic break,
+a
+.I roff
+formatter
+.I adjusts
+the line if applicable
+(see below),
+and then resumes collecting and filling text on the next output line.
+.
+.
+.br
+.ne 2v
+.P
+Sometimes,
+a line cannot be broken automatically.
+.
+This usually does not happen with natural language text unless the
+output line length has been manipulated to be extremely short,
+but it can with specialized text like program source code.
+.
+.I groff
+provides a means of telling the formatter where the line may be broken
+without hyphens.
+.
+This is done with the non-printing break point escape sequence
+.BR \[rs]: .
+.
+.
+.P
+.\" What if the document author wants to stop filling lines temporarily,
+.\" for instance to start a new paragraph? There are several solutions.
+There are several ways to cause a break at a predictable location.
+.
+A blank input line not only causes a break,
+but by default it also outputs a one-line vertical space
+(effectively a blank output line).
+.
+Macro packages may discourage or disable this \[lq]blank line
+method\[rq] of paragraphing in favor of their own macros.
+.
+A line that begins with one or more spaces causes a break.
+.
+The spaces are output at the beginning of the next line without being
+.I adjusted
+(see below).
+.
+Again,
+macro packages may provide other methods of producing indented
+paragraphs.
+.
+Trailing spaces on
+.I text lines
+(see below)
+are discarded.
+.
+The end of input causes a break.
+.
+.
+.P
+After the formatter performs an automatic break,
+it may then
+.I adjust
+the line,
+widening inter-word spaces until the text reaches the right margin.
+.
+Extra spaces between words are preserved.
+.
+Leading and trailing spaces are handled as noted above.
+.
+Text can be aligned to the left or right margin only,
+or centered,
+using
+.I requests.
+.
+.
+.P
+A
+.I roff
+formatter translates horizontal tab characters,
+also called simply \[lq]tabs\[rq],
+in the input into movements to the next tab stop.
+.
+These tab stops are by default located every half inch measured from the
+current position on the input line.
+.
+With them,
+simple tables can be made.
+.
+However,
+this method can be deceptive,
+as the appearance
+(and width)
+of the text in an editor and the results from the formatter can vary
+greatly,
+particularly when proportional typefaces are used.
+.
+A tab character does not cause a break and therefore does not interrupt
+filling.
+.
+The formatter provides facilities for sophisticated table composition;
+there are many details to track
+when using the \[lq]tab\[rq] and \[lq]field\[rq] low-level features,
+so most users turn to the
+.MR @g@tbl @MAN1EXT@
+preprocessor to lay out tables.
+.\" END Keep roughly parallel with groff.texi nodes "Text" through "Tab
+.\" Stops".
+.
+.
+.\" ====================================================================
+.SS "Requests and macros"
+.\" ====================================================================
+.
+.\" BEGIN Keep roughly parallel with groff.texi node "Requests and
+.\" Macros".
+.\" We have now encountered almost all of the syntax there is in the
+.\" @code{roff} language, with an exception already noted in passing.
+A
+.I request
+is an instruction to the formatter that occurs after a
+.I control character,
+which is recognized at the beginning of an input line.
+.
+The regular control character is a dot
+.RB \[lq] .\& \[rq].
+.
+Its counterpart,
+the
+.I no-break control character,
+a neutral apostrophe
+.RB \[lq] \|\[aq]\| \[rq],
+suppresses the break
+.\" slack wording: that is
+implied by some requests.
+.
+These characters were chosen because it is uncommon for lines of text in
+natural languages to begin with them.
+.
+If you require a formatted period or apostrophe
+(closing single quotation mark)
+where
+.\" GNU @code{troff}
+the formatter is expecting a control character,
+prefix the dot or neutral apostrophe with the dummy character escape
+sequence,
+.RB \[lq] \[rs]& \[rq].
+.
+.
+.P
+An input line beginning with a control character is called a
+.I control line.
+.
+Every line of input that is not a control line is a
+.I text line.
+.
+.
+.P
+Requests often take
+.I arguments,
+words
+(separated from the request name and each other by spaces)
+that specify details of the action
+.\" GNU @code{troff}
+the formatter is expected to perform.
+.
+If a request is meaningless without arguments,
+it is typically ignored.
+.
+.\" TODO: roff(7): We haven't introduced escape sequences yet.
+.\" GNU @code{troff}'s requests and escape sequences comprise the
+.\" control language of the formatter.
+.
+Of key importance are the requests that define macros.
+.
+Macros are invoked like requests,
+enabling the request repertoire to be extended or overridden.
+.\" @footnote{Argument handling in macros is more flexible but also more
+.\" complex. @xref{Calling Macros}.}
+.
+.
+.P
+A
+.I macro
+can be thought of as an abbreviation you can define for a
+collection of control and text lines.
+.
+When the macro is
+.I called
+by giving its name after a control character,
+it is replaced with what it stands for.
+.
+The process of textual replacement is known as
+.I interpolation.
+.\" @footnote{Some escape sequences undergo interpolation as well.}
+Interpolations are handled as soon as they are recognized,
+and once performed,
+a
+.I roff
+formatter scans the replacement for further requests,
+macro calls,
+and escape sequences.
+.
+.
+.P
+In
+.I roff
+systems,
+the
+.RB \[lq] de \[rq]
+request defines a macro.
+.\" @footnote{GNU @code{troff} offers additional ones. @xref{Writing
+.\" Macros}.}
+.\" END Keep roughly parallel with groff.texi node "Requests and
+.\" Macros".
+.
+.
+.\" ====================================================================
+.SS "Page geometry"
+.\" ====================================================================
+.
+.\" BEGIN Keep parallel with groff.texi node "Page Geometry".
+.I roff
+systems format text under certain assumptions about the size of the
+output medium,
+or page.
+.
+For the formatter to correctly break a line it is filling,
+it must know the line length,
+which it derives from the page width.
+.\" (@pxref{Line Layout}).
+.
+For it to decide whether to write an output line to the current page or
+wait until the next one,
+it must know the page length.
+.\" (@pxref{Page Layout}).
+.
+.
+A device's
+.I resolution
+converts practical units like inches or centimeters to
+.I basic units,
+a convenient length measure for the output device or file format.
+.
+The formatter and output driver use basic units to reckon page
+measurements.
+.
+The device description file defines its resolution and page dimensions
+(see
+.MR groff_font @MAN5EXT@ ).
+.\" (@pxref{DESC File Format}).
+.
+.
+.P
+A
+.I page
+is a two-dimensional structure upon which a
+.I roff
+system imposes a rectangular coordinate system with its upper left
+corner as the origin.
+.
+Coordinate values are in basic units and increase down and to the right.
+Useful ones are therefore always positive and within numeric ranges
+corresponding to the page boundaries.
+.
+.
+.P
+While the formatter
+(and,
+later,
+output driver)
+is processing a page,
+it keeps track of its
+.I drawing position,
+which is the location at which the next glyph will be written,
+from which the next motion will be measured,
+or where a geometric object will commence rendering.
+.
+Notionally,
+glyphs are drawn from the text baseline upward and to the right.
+.RI ( groff
+does not yet support right-to-left scripts.)
+.
+The
+.I text baseline
+is a
+(usually invisible)
+line upon which the glyphs of a typeface are aligned.
+.
+A glyph therefore \[lq]starts\[rq] at its bottom-left corner.
+.
+If drawn at the origin,
+a typical letter glyph would lie partially or wholly off the page,
+depending on whether,
+like \[lq]g\[rq],
+it features a descender below the baseline.
+.
+.
+.P
+Such a situation is nearly always undesirable.
+.
+It is furthermore conventional not to write or draw at the extreme edges
+of the page.
+.
+Therefore the initial drawing position of a
+.I roff
+formatter is not at the origin,
+but below and to the right of it.
+.
+This rightward shift
+from the left edge is known as the
+.I page offset.
+.
+.RI ( groff 's
+terminal output devices have page offsets of zero.)
+.
+The downward shift leaves room for a text output line.
+.
+.
+.P
+Text is arranged on a one-dimensional lattice of text baselines from
+the top to the bottom of the page.
+.
+.I Vertical spacing
+is the distance between adjacent text baselines.
+.
+Typographic tradition sets this quantity to 120% of the type size.
+.
+The initial vertical drawing position is one unit of vertical spacing
+below the page top.
+.
+Typographers term this unit a
+.I vee.
+.
+.
+.P
+Vertical spacing has an impact on page-breaking decisions.
+.
+Generally,
+when a break occurs,
+the formatter moves the drawing position to the next text baseline
+automatically.
+.
+If the formatter were already writing to the last line that would fit on
+the page,
+advancing by one vee would place the next text baseline off the page.
+.
+Rather than let that happen,
+.I roff
+formatters instruct the output driver to eject the page,
+start a new one,
+and again set the drawing position to one vee below the page top;
+this is a
+.I page break.
+.
+.
+.P
+When the last line of input text corresponds to the last output line
+that fits on the page,
+the break caused by the end of input will also break the page,
+producing a useless blank one.
+.
+Macro packages keep users from having
+to confront this difficulty by setting \[lq]traps\[rq];
+.\" (@pxref{Traps});
+moreover,
+all but the simplest page layouts tend to have headers and footers,
+or at least bear vertical margins larger than one vee.
+.\" END Keep parallel with groff.texi node "Page Geometry".
+.
+.
+.\" ====================================================================
+.SS "Other language elements"
+.\" ====================================================================
+.
+.I Escape sequences
+start with the
+.I escape character,
+a backslash
+.BR \[rs] ,
+and are followed by at least one additional character.
+.
+They can appear anywhere in the input.
+.
+.
+.P
+With requests,
+the escape and control characters can be changed;
+further,
+escape sequence recognition can be turned off and back on.
+.
+.
+.P
+.I Strings
+store character sequences.
+.
+In
+.IR groff ,
+they can be parameterized as macros can.
+.
+.
+.P
+.I Registers
+store numerical values,
+including measurements.
+.
+The latter are generally in basic units;
+.I scaling units
+can be appended to numeric expressions to clarify their meaning when
+stored or interpolated.
+.
+Some read-only predefined registers interpolate text.
+.
+.
+.P
+.I Fonts
+are identified either by a name or by a mounting position
+(a non-negative number).
+.
+Four styles are available on all devices.
+.
+.B R
+is \[lq]roman\[rq]:
+normal,
+upright text.
+.
+.B B
+is
+.BR bold ,
+an upright typeface with a heavier weight.
+.
+.B I
+is
+.IR italic ,
+a face that is oblique on typesetter output devices and usually
+underlined instead on terminal devices.
+.
+.B BI
+is \f[BI]bold-italic\f[]\/, \" indulging a bit of man(7) evil here
+combining both of the foregoing style variations.
+.
+Typesetting devices group these four styles into
+.I families
+of text fonts;
+they also typically offer one or more
+.I special
+fonts that provide unstyled glyphs;
+see
+.MR groff_char @MAN7EXT@ .
+.
+.
+.P
+.I groff
+supports named
+.I colors
+for glyph rendering and drawing of geometric objects.
+.
+Stroke and fill colors are distinct;
+the stroke color is used for glyphs.
+.
+.
+.P
+.I Glyphs
+are visual representation forms of
+.I characters.
+.
+In
+.I groff,
+the distinction between those two elements is not always obvious
+(and a full discussion is beyond our scope).
+.
+In brief,
+\[lq]A\[rq] is a character when we consider it in the abstract:
+to make it a glyph,
+we must select a typeface with which to render it,
+and determine its type size and color.
+.
+The formatting process turns input characters into output glyphs.
+.
+A few characters commonly seen on keyboards are treated
+specially by the
+.I roff
+language and may not look correct in output if used unthinkingly;
+they are
+the (double) quotation mark
+.RB ( \|\[dq]\| ),
+the neutral apostrophe
+.RB ( \|\[aq]\| ),
+the minus sign
+.RB ( \- ),
+the backslash
+.RB ( \|\[rs]\| ),
+the caret or circumflex accent
+.RB ( \[ha] ),
+the grave accent
+.RB ( \|\[ga]\| ),
+and the tilde
+.RB ( \[ti] ).
+.
+All of these and more can be produced with
+.I special character
+escape sequences;
+see
+.MR groff_char @MAN7EXT@ .
+.
+.
+.P
+.I groff
+offers
+.IR streams ,
+identifiers for writable files,
+but for security reasons this feature is disabled by default.
+.
+.
+.\" BEGIN Keep roughly parallel with first paragraphs of groff.texi node
+.\" "Deferring Output".
+.P
+A further few language elements arise as page layouts become more
+sophisticated and demanding.
+.
+.I Environments
+collect formatting parameters like line length and typeface.
+.
+A
+.I diversion
+stores formatted output for later use.
+.
+A
+.I trap
+is a condition on the input or output,
+tested automatically by the formatter,
+that is associated with a macro,
+calling it when that condition is fulfilled.
+.
+.
+.P
+Footnote support often exercises all three of the foregoing features.
+.
+A simple implementation might work as follows.
+.
+A pair of macros is defined:
+one starts a footnote and the other ends it.
+.
+The author calls the first macro where a footnote marker is desired.
+.
+The macro establishes a diversion so that the footnote text is collected
+at the place in the body text where its corresponding marker appears.
+.
+An environment is created for the footnote so that it is set at a
+smaller typeface.
+.
+The footnote text is formatted in the diversion using that environment,
+but it does not yet appear in the output.
+.
+The document author calls the footnote end macro,
+which returns to the previous environment and ends the diversion.
+.
+Later,
+after much more body text in the document,
+a trap,
+set a small distance above the page bottom,
+is sprung.
+.
+The macro called by the trap draws a line across the page and emits the
+stored diversion.
+.
+Thus,
+the footnote is rendered.
+.\" END Keep roughly parallel with first paragraphs of groff.texi node
+.\" "Deferring Output".
+.
+.
+.\" ====================================================================
+.SH History
+.\" ====================================================================
+.
+Computer-driven document formatting dates back to the 1960s.
+.\" John Labovitz points out that Peter Samson's TJ-2 dates to 1963,
+.\" but since this is a *roff man page, we do not begin our story there.
+.\" https://johnlabovitz.com/publications/\
+.\" The-electric-typesetter--The-origins-of-computing-in-typography.pdf
+.
+The
+.I roff
+system is intimately connected with Unix,
+but its origins lie with the earlier operating systems CTSS,
+GECOS,
+and Multics.
+.
+.
+.\" ====================================================================
+.SS "The predecessor\[em]\f[I]RUNOFF\f[]"
+.\" ====================================================================
+.
+.IR roff 's
+ancestor
+.I RUNOFF
+was written in the MAD language by Jerry Saltzer
+to prepare his Ph.D.\& thesis on the Compatible Time Sharing System
+(CTSS),
+a project of the Massachusetts Institute of Technology (MIT).
+.
+This program is referred to in full capitals,
+both to distinguish it from its many descendants,
+and because bits were expensive in those days;
+five- and six-bit character encodings were still in widespread usage,
+and mixed-case alphabetics in file names seen as a luxury.
+.
+.I RUNOFF
+introduced a syntax of inlining formatting directives amid document
+text,
+by beginning a line with a period
+(an unlikely occurrence in human-readable material)
+followed by a \[lq]control word\[rq].
+.
+Control words with obvious meaning like \[lq].line length
+.IR n \[rq]
+were supported as well as an abbreviation system;
+the latter came to overwhelm the former in popular usage and later
+derivatives of the program.
+.
+A sample of control words from a
+.UR http://\:web\:.mit\:.edu/\:Saltzer/\:www/\:publications/\:ctss/\:AH\
+\:.9\:.01\:.html
+.I RUNOFF
+manual of December 1966
+.UE
+was documented as follows
+(with the parameter notation slightly altered).
+.
+The abbreviations will be familiar to
+.I roff
+veterans.
+.
+.
+.P
+.ne 10v
+.TS
+center;
+r l
+rB l.
+Abbreviation Control word
+\&.ad .adjust
+\&.bp .begin page
+\&.br .break
+\&.ce .center
+\&.in .indent \f[I]n\f[]
+\&.ll .line length \f[I]n\f[]
+\&.nf .nofill
+\&.pl .paper length \f[I]n\f[]
+\&.sp .space [\f[I]n\f[]]
+.TE
+.
+.
+.P
+In 1965,
+MIT's Project MAC teamed with Bell Telephone Laboratories and General
+Electric (GE) to inaugurate the
+.UR http://\:www\:.multicians\:.org
+Multics
+.UE
+project.
+.
+After a few years,
+Bell Labs discontinued its participation in Multics,
+famously prompting the development of Unix.
+.
+Meanwhile,
+Saltzer's
+.I RUNOFF
+proved influential,
+seeing many ports and derivations elsewhere.
+.
+.
+.\" "Morris did one port and called it roff. I did the BCPL one, adding
+.\" registers, but not macros. Molly Wagner contributed a hyphenation
+.\" algorithm. Ken and/or Dennis redid roff in PDP-11 assembler. Joe
+.\" started afresh for the grander nroff, including macros. Then Joe
+.\" bought a phototypesetter ..."
+.\" -- https://minnie.tuhs.org/pipermail/tuhs/2018-November/017052.html
+.P
+In 1969,
+Doug McIlroy wrote one such reimplementation,
+adding extensions,
+in the BCPL language for a GE 645 running GECOS at the Bell Labs
+location in Murray Hill,
+New Jersey.
+.
+In its manual,
+the control commands were termed \[lq]requests\[rq],
+their two-letter names were canonical,
+and the control character was configurable with a
+.B .cc
+request.
+.
+Other familiar requests emerged at this time;
+no-adjust
+.RB ( .na ),
+need
+.RB ( .ne ),
+page offset
+.RB ( .po ),
+tab configuration
+.RB ( .ta ,
+though it worked differently),
+temporary indent
+.RB ( .ti ),
+character translation
+.RB ( .tr ),
+and automatic underlining
+.RB ( .ul ;
+on
+.I RUNOFF
+you had to backspace and underscore in the input yourself).
+.B .fi
+to enable filling of output lines got the name it retains to this day.
+.
+McIlroy's program also featured a heuristic system for automatically
+placing hyphenation points,
+designed and implemented by Molly Wagner.
+.
+It furthermore introduced numeric variables,
+termed registers.
+.
+By 1971,
+this program had been ported to Multics and was known as
+.IR roff ,
+a name McIlroy attributes to Bob Morris,
+to distinguish it from CTSS
+.IR RUNOFF .
+.
+.\" GBR can't find a source for this claim (of Bernd's).
+.\"Multics
+.\".I runoff
+.\"added features such as the ability to do two-pass formatting;
+.\"it became the main system for Multics documentation and text
+.\"processing.
+.
+.
+.\" ====================================================================
+.SS "Unix and \f[I]roff\f[]"
+.\" ====================================================================
+.
+McIlroy's
+.I roff
+was one of the first Unix programs.
+.
+In Ritchie's term,
+it was \[lq]transliterated\[rq] from BCPL to DEC PDP-7 assembly language
+.\" see "The Evolution of the Unix Time-Sharing System", Ritchie, 1984
+for the fledgling Unix operating system.
+.
+Automatic hyphenation was managed with
+.B .hc
+and
+.B .hy
+requests,
+line spacing control was generalized with the
+.B .ls
+request,
+and what later
+.IR roff s
+would call diversions were available via \[lq]footnote\[rq] requests.
+.\" The foregoing features may have been in McIlroy's Multics roff, but
+.\" he no longer has documentation for that--only the GECOS version.
+.\" GBR's guess is that they were, if we take Ritchie's choice of the
+.\" term "transliterated" seriously. GBR further speculates that there
+.\" is no reason to suppose that McIlroy's roff was stagnant from
+.\" 1969-1971, whereas we have no record of any significant
+.\" post-transliteration development of Unix roff. Its request list did
+.\" not appear until the 3rd edition manual, and did not change
+.\" thereafter. In 7th edition, roff was characterized as "utterly
+.\" frozen".
+.
+This
+.I roff
+indirectly funded operating systems research at Murray Hill;
+AT&T prepared patent applications to the U.S.\& government with it.
+.
+This arrangement enabled the group to acquire a PDP-11;
+.I roff
+promptly proved equal to the task of formatting the manual for what
+would become known as \[lq]First Edition Unix\[rq],
+dated November 1971.
+.
+.
+.P
+Output from all of the foregoing programs was limited to line printers
+and paper terminals such as the IBM 2471
+(based on the Selectric line of typewriters)
+and the Teletype Corporation Model 37.
+.
+Proportionally spaced type was unavailable.
+.
+.
+.\" ====================================================================
+.SS "New \f[I]roff\f[] and Typesetter \f[I]roff\f[]"
+.\" ====================================================================
+.
+The first years of Unix were spent in rapid evolution.
+.
+The practicalities of preparing standardized documents like patent
+applications
+(and Unix manual pages),
+combined with McIlroy's enthusiasm for macro languages,
+perhaps created an irresistible pressure to make
+.I roff
+extensible.
+.
+Joe Ossanna's
+.IR nroff ,
+literally a \[lq]new roff\[rq],
+was the outlet for this pressure.
+.
+.\" nroff is listed in the table of contents of the Version 2 manual,
+.\" but no man page is present.
+By the time of Unix Version\~3
+(February 1973)\[em]and still in PDP-11 assembly language\[em]it sported
+a swath of features now considered essential to
+.I roff
+systems:
+.
+definition of macros
+.RB ( .de ),
+diversion of text thither
+.RB ( .di ),
+and removal thereof
+.RB ( .rm );
+.
+trap planting
+.RB ( .wh ;
+\[lq]when\[rq])
+and relocation
+.RB ( .ch ;
+\[lq]change\[rq]);
+.
+conditional processing
+.RB ( .if );
+.
+and environments
+.RB ( .ev ).
+.
+Incremental improvements included
+.
+assignment of the next page number
+.RB ( .pn );
+.
+no-space mode
+.RB ( .ns )
+and restoration of vertical spacing
+.RB ( .rs );
+.
+the saving
+.RB ( .sv )
+and output
+.RB ( .os )
+of vertical space;
+.
+specification of replacement characters for tabs
+.RB ( .tc )
+and leaders
+.RB ( .lc );
+.
+configuration of the no-break control character
+.RB ( .c2 );
+.
+shorthand to disable automatic hyphenation
+.RB ( .nh );
+.
+a condensation of what were formerly six different requests for
+configuration of page \[lq]titles\[rq]
+(headers and footers)
+into one
+.RB ( .tl )
+with a length controlled separately from the line length
+.RB ( .lt );
+.
+automatic line numbering
+.RB ( .nm );
+.
+interactive input
+.RB ( .rd ),
+which necessitated buffer-flushing
+.RB ( .fl ),
+and was made convenient with early program cessation
+.RB ( .ex );
+.
+source file inclusion in its modern form
+.RB ( .so ;
+though
+.I RUNOFF
+had an \[lq].append\[rq] control word for a similar purpose)
+and early advance to the next file argument
+.RB ( .nx );
+.
+ignorable content
+.RB ( .ig );
+.
+and programmable abort
+.RB ( .ab ).
+.
+.
+.P
+Third Edition Unix also brought the
+.MR pipe 2
+system call,
+the explosive growth of a componentized system based around it,
+and a \[lq]filter model\[rq] that remains perceptible today.
+.
+Equally importantly,
+the Bell Labs site in Murray Hill acquired a Graphic Systems C/A/T
+phototypesetter,
+and with it came the necessity of expanding the capabilities of a
+.I roff
+system to cope with a variety of proportionally spaced typefaces at
+multiple sizes.
+.
+Ossanna wrote a parallel implementation of
+.I nroff
+for the C/A/T,
+dubbing it
+.I troff
+(for \[lq]typesetter roff\[rq]).
+.
+Unfortunately,
+surviving documentation does not illustrate what requests were
+implemented at this time for C/A/T support;
+the
+.MR troff 1 \" AT&T
+man page in Fourth Edition Unix
+(November 1973)
+does not feature a request list, \" nor does Unix V6 troff(1) (1975)
+unlike
+.MR nroff 1 . \" AT&T
+.
+Apart from typesetter-driven features,
+Unix Version\~4
+.IR roff s
+added string definitions
+.RB ( .ds );
+made the escape character configurable
+.RB ( .ec );
+and enabled the user to write diagnostics to the standard error stream
+.RB ( .tm ).
+.
+Around 1974,
+empowered with multiple type sizes,
+italics,
+and a symbol font specially commissioned by Bell Labs from
+Graphic Systems,
+Kernighan and Lorinda Cherry implemented
+.I eqn \" AT&T
+for typesetting mathematics.
+.
+.
+In the same year,
+for Fifth Edition Unix,
+Ossanna combined and reimplemented the two
+.IR roff s
+in C,
+using that language's preprocessor to generate both from a single source
+tree.
+.
+.
+.P
+Ossanna documented the syntax of the input language to the
+.I nroff
+and
+.I troff
+programs in the \[lq]Troff User's Manual\[rq],
+first published in 1976,
+with further revisions as late as 1992 by Kernighan.
+.
+(The original version was entitled
+\[lq]Nroff/Troff User's Manual\[rq],
+which may partially explain why
+.I roff
+practitioners have tended to refer to it by its AT&T document
+identifier,
+\[lq]CSTR #54\[rq].)
+.
+Its final revision serves as the
+.I de facto
+specification of AT&T
+.IR troff , \" AT&T
+and all subsequent implementors of
+.I roff
+systems have done so in its shadow.
+.
+.
+.P
+A small and simple set of
+.I roff
+macros was first used for the manual pages of Unix Version\~4 and
+persisted for two further releases,
+but the first macro package to be formally described and installed was
+.I ms
+by Michael Lesk in Version\~6.
+.
+He also wrote a manual,
+\[lq]Typing Documents on the Unix System\[rq],
+describing
+.I ms
+and basic
+.IR nroff / troff
+usage,
+updating it as the package accrued features.
+.
+Sixth Edition additionally saw the debut of the
+.I tbl \" AT&T
+preprocessor for formatting tables,
+also by Lesk.
+.
+.
+.P
+For Unix Version\~7
+(January 1979),
+McIlroy designed,
+implemented,
+and documented the
+.I man
+macro package,
+introducing most of the macros described in
+.MR groff_man 7
+today,
+and edited volume 1 of the Version 7 manual using it.
+.
+Documents composed using
+.I ms
+featured in volume 2,
+edited by Kernighan.
+.
+.
+.\" Thanks to Clem Cole for the following account.
+.\" https://minnie.tuhs.org/pipermail/tuhs/2022-January/025143.html
+.P
+Meanwhile,
+.I troff
+proved popular even at Unix sites that lacked a C/A/T device.
+.
+Tom Ferrin of the University of California at San Francisco combined it
+with Allen Hershey's popular vector fonts to produce
+.IR vtroff ,
+which translated
+.IR troff 's
+output to the command language used by Versatec and Benson-Varian
+plotters.
+.
+.
+.P
+Ossanna had passed away unexpectedly in 1977,
+and after the release of Version 7,
+with the C/A/T typesetter becoming supplanted by alternative devices
+such as the Mergenthaler Linotron 202,
+Kernighan undertook a revision and rewrite of
+.I troff
+to generalize its design.
+.
+To implement this revised architecture,
+he developed the font and device description file formats and the
+page description language that remain in use today.
+.
+He described these novelties in the article
+\[lq]A Typesetter-independent TROFF\[rq],
+last revised in 1982,
+and like the
+.I troff
+manual itself,
+it is widely known by a shorthand,
+\[lq]CSTR #97\[rq].
+.\" Further entertaining reading can be found at:
+.\" <https://www.cs.princeton.edu/~bwk/202/summer.reconstructed.pdf>.
+.
+.
+.P
+Kernighan's innovations prepared
+.I troff
+well for the introduction of the Adobe PostScript language in 1982 and a
+vibrant market in laser printers with built-in interpreters for it.
+.
+An output driver for PostScript,
+.IR dpost ,
+was swiftly developed.
+.
+However,
+AT&T's software licensing practices kept
+Ossanna's
+.IR troff ,
+with its tight coupling to the C/A/T's capabilities,
+in parallel distribution with device-independent
+.I troff
+throughout the 1980s.
+.
+Today,
+however,
+all actively maintained
+.IR troff s
+follow Kernighan's device-independent design.
+.
+.
+.\" ====================================================================
+.SS "\f[I]groff\f[]\[em]a free \f[I]roff\f[] from GNU"
+.\" ====================================================================
+.
+The most important free
+.I roff
+project historically has been
+.IR groff ,
+the GNU implementation of
+.IR troff ,
+developed by James Clark starting in 1989 and distributed under
+.UR http://\:www\:.gnu\:.org/\:copyleft
+copyleft
+.UE
+licenses,
+ensuring to all the availability of source code and the freedom to
+modify and redistribute it,
+properties unprecedented in
+.I roff
+systems to that point.
+.
+.I groff
+rapidly attracted contributors,
+and has served as a replacement for almost all applications of AT&T
+.I troff
+(exceptions include
+.IR mv ,
+a macro package for preparation of viewgraphs and slides,
+and the
+.I ideal
+preprocessor,
+which produces diagrams from mathematical constraints).
+.
+Beyond that,
+it has added numerous features;
+see
+.MR groff_diff @MAN7EXT@ .
+.
+Since its inception and for at least the following three decades,
+it has been used by practically all GNU/Linux and BSD operating systems.
+.
+.
+.P
+.I groff
+continues to be developed,
+is available for almost all operating systems in common use
+(along with several obscure ones),
+and is free.
+.
+These factors make
+.I groff
+the
+.I de facto
+.I roff
+standard today.
+.
+.
+.\" ====================================================================
+.SS "Other free \f[I]roff\f[]s"
+.\" ====================================================================
+.
+In 2007, \" TODO: verify
+Caldera/SCO and Sun Microsystems,
+having acquired rights to AT&T Documenter's Workbench (DWB)
+.I troff
+(a descendant of the Bell Labs code),
+released it under a free but GPL-incompatible license.
+.
+.UR https://\:github\:.com/\:n\-t\-roff/\:DWB3.3
+This implementation
+.UE
+was made portable to modern POSIX systems,
+and adopted and enhanced first by Gunnar Ritter and then Carsten Kunze
+to produce
+.UR https://github.com/n-t-roff/heirloom-doctools
+Heirloom Doctools
+.I troff
+.UE .
+.
+.
+.P
+.\" https://lists.gnu.org/archive/html/groff/2013-07/msg00001.html
+In July 2013,
+Ali Gholami Rudi announced
+.UR https://\:github\:.com/\:aligrudi/\:neatroff
+.I neatroff
+.UE ,
+a permissively licensed new implementation.
+.
+.
+.P
+Another descendant of DWB
+.I troff \" DWB
+is part of
+.UR https://\:9fans\:.github\:.io/\:plan9port/
+Plan\~9 from User Space
+.UE .
+.
+Since 2021,
+this
+.I troff \" Plan 9 from User Space
+has been available under permissive terms.
+.
+.
+.\" ====================================================================
+.SH "Using \f[I]roff\f[]"
+.\" ====================================================================
+.
+When you read a man page,
+often a
+.I roff
+is the program rendering it.
+.
+Some
+.I roff
+implementations provide wrapper programs that make it easy to use the
+.I roff
+system from the shell's command line.
+.
+These can be specific to a macro package,
+like
+.MR mmroff @MAN1EXT@ ,
+or more general.
+.
+.MR groff @MAN1EXT@
+provides command-line options sparing the user from constructing the
+long,
+order-dependent pipelines familiar to AT&T
+.I troff
+users.
+.
+Further,
+a heuristic program,
+.MR grog @MAN1EXT@ ,
+is available to infer from a document's contents which
+.I groff
+arguments should be used to process it.
+.
+.
+.\" ====================================================================
+.SS "The \f[I]roff\f[] pipeline"
+.\" ====================================================================
+.
+A typical
+.I roff
+document is prepared by running one or more processors in series,
+followed by a a formatter program and then an output driver
+(or \[lq]device postprocessor\[rq]).
+.
+Commonly,
+these programs are structured into a pipeline;
+that is,
+each is run in sequence such that the output of one is
+taken as the input
+to the next,
+without passing through secondary storage.
+.
+(On non-Unix systems,
+pipelines may have to be simulated with temporary files.)
+.
+.
+.RS
+.PP
+.EX
+.RI $\~ preproc1 \~\c
+.BI <\~ input-file \~|\~ preproc2 \~|\~\c
+.RB .\|.\|.\&\~ "| troff\~"\c
+.RI [ option ]\~\c
+.RB .\|.\|.\&\~ \[rs]
+.BI " |\~" output-driver \" 4 leading spaces
+.EE
+.RE
+.
+.
+.P
+Once all preprocessors have run,
+they deliver pure
+.I roff
+language input to the formatter,
+which in turn generates a document in a page description language that
+is then interpreted by a postprocessor for viewing,
+printing,
+or further processing.
+.
+.
+.P
+Each program interprets input in a language that is independent of the
+others;
+some are purely descriptive,
+as with
+.MR @g@tbl @MAN1EXT@
+and
+.I roff
+output,
+and some permit the definition of macros,
+as with
+.MR @g@eqn @MAN1EXT@
+and
+.I roff
+input.
+.
+.
+Most
+.I roff
+input files employ the macros of a document formatting package,
+intermixed with instructions for one or more preprocessors,
+and seasoned with escape sequences and requests from the
+.I roff
+language.
+.
+Some documents are simpler still,
+since their formatting packages discourage direct use of
+.I roff
+requests;
+man pages are a prominent example.
+.
+Many features of the
+.I roff
+language are seldom needed by users;
+only authors of macro packages require a substantial command of them.
+.
+.
+.\" ====================================================================
+.SS Preprocessors
+.\" ====================================================================
+.
+A
+.I roff
+preprocessor is a program that,
+directly or ultimately,
+generates output in the
+.I roff
+language.
+.
+Typically, \" preconv is an exception.
+each preprocessor defines a language of its own that transforms its
+input into that for
+.I roff
+or another preprocessor.
+.
+As an example of the latter,
+.I chem \" generic
+produces
+.I pic \" generic
+input.
+.
+Preprocessors must consequently be run in an appropriate order;
+.MR groff @MAN1EXT@
+handles this automatically for all preprocessors supplied by the GNU
+.I roff
+system.
+.
+.
+.P
+Portions of the document written in preprocessor languages are usually
+.\" preconv is the exception again.
+bracketed by tokens that look like
+.I roff
+macro calls.
+.
+.I roff
+preprocessor programs transform only the regions of the document
+intended for them.
+.\" In preconv's case, that's the whole document.
+.
+When a preprocessor language is used by a document,
+its corresponding program must process it before the input is seen by
+the formatter,
+or incorrect rendering is almost guaranteed.
+.
+.
+.P
+GNU
+.I roff
+provides several preprocessors,
+including
+.IR @g@eqn ,
+.IR @g@grn ,
+.IR @g@pic ,
+.IR @g@tbl ,
+.IR @g@refer ,
+and
+.IR @g@soelim .
+.
+See
+.MR groff @MAN1EXT@
+for a complete list.
+.
+Other preprocessors for
+.I roff
+systems are known.
+.
+.
+.P
+.RS
+.TS
+tab (@);
+Li L.
+dformat@depicts data structures;
+grap@constructs statistical charts; and
+ideal@draws diagrams using a constraint-based language.
+.TE
+.RE
+.
+.
+.\" ====================================================================
+.SS "Formatter programs"
+.\" ====================================================================
+.
+A
+.I roff
+formatter transforms
+.I roff
+language input into a single file in a page description language,
+described in
+.MR groff_out @MAN5EXT@ ,
+intended for processing by a selected device.
+.
+This page description language is specialized in its parameters,
+but not its syntax,
+for the selected device;
+the format is
+.RI device- independent ,
+but not
+.RI device- agnostic .
+.
+The parameters the formatter uses to arrange the document are stored in
+.I device
+and
+.IR "font description files" ;
+see
+.MR groff_font @MAN5EXT@ .
+.
+.
+.P
+AT&T Unix
+had two formatters\[em]\c
+.I nroff
+for terminals,
+and
+.I troff
+for typesetters.
+.
+Often,
+the name
+.I troff
+is used loosely to refer to both.
+.
+When generalizing thus,
+.I groff
+documentation prefers the term
+.RI \[lq] roff \[rq].
+.
+In GNU
+.IR roff ,
+the formatter program is always
+.MR @g@troff @MAN1EXT@ .
+.
+.
+.\" ====================================================================
+.SS "Devices and output drivers"
+.\" ====================================================================
+.
+To a
+.I roff
+system,
+a
+.I device
+is a hardware interface like a printer,
+a text or graphical terminal,
+or a standardized file format that unrelated software can interpret.
+.
+An
+.I output driver
+is a program that parses the output of
+.I troff \" generic
+and produces instructions specific to the device or file format it
+supports.
+.
+An output driver might support multiple devices,
+particularly if they are similar.
+.
+.
+.P
+The names of the devices and their driver programs are not standardized.
+.
+Technological fashions evolve;
+the devices used for document preparation when AT&T
+.I troff \" AT&T
+was first written in the 1970s are no longer used in production
+environments.
+.
+Device capabilities have tended to increase,
+improving resolution and font repertoire,
+and adding color output and hyperlinking.
+.
+Further,
+to reduce file size and processing time,
+AT&T
+.IR troff 's \" AT&T
+page description language placed low limits on the magnitudes of some
+quantities it could represent.
+.
+Its PostScript output driver,
+.MR dpost 1 ,
+had a resolution of 720 units per inch;
+.IR groff 's
+.MR grops @MAN1EXT@
+uses 72,000.
+.
+.
+.\".P
+.\"Today the operating systems provide device drivers for most
+.\"printer-like hardware, so it isn't necessary to write a special
+.\"hardware postprocessor for each printer.
+.\" XXX? No they don't. Instead printers interpret PS or PDF directly.
+.\" With a TCP/IP protocol stack and an HTTP server to accept POSTed
+.\" documents for printing.
+.
+.
+.\" ====================================================================
+.SH "\f[I]roff\f[] programming"
+.\" ====================================================================
+.
+Documents using
+.I roff
+are normal text files interleaved with
+.I roff
+formatting elements.
+.
+The
+.I roff
+language is powerful enough to support arbitrary computation and
+it supplies facilities that encourage extension.
+.
+The primary such facility is macro definition;
+with this feature,
+macro packages have been developed that are tailored for particular
+applications.
+.
+.
+.\" ====================================================================
+.SS "Macro packages"
+.\" ====================================================================
+.
+Macro packages can have a much smaller vocabulary than
+.I roff
+itself;
+this trait combined with their domain-specific nature can make them easy
+to acquire and master.
+.
+The macro definitions of a package are typically kept in a file called
+.IB name .tmac
+(historically,
+.BI tmac. name\/\c\" Italic correction comes before \c !
+).
+.
+Find details on the naming and placement of macro packages in
+.MR groff_tmac @MAN5EXT@ .
+.
+.
+.P
+A macro package anticipated for use in a document can be declared to
+the formatter by the command-line option
+.BR \-m ;
+see
+.MR @g@troff @MAN1EXT@ .
+.
+It can alternatively be specified within a document using the
+.B mso
+request of the
+.I groff
+language;
+see
+.MR groff @MAN7EXT@ .
+.
+.
+.P
+Well-known macro packages include
+.I man
+for traditional man pages and
+.I mdoc
+for BSD-style manual pages.
+.
+Macro packages for typesetting books,
+articles,
+and letters include
+.I ms
+(from \[lq]manuscript macros\[rq]),
+.I me
+(named by a system administrator from the first name of its creator,
+Eric Allman),
+.I mm
+(from \[lq]memorandum macros\[rq]),
+and
+.IR mom ,
+a punningly named package exercising many
+.I groff
+extensions.
+.
+See
+.MR groff_tmac @MAN5EXT@
+for more.
+.
+.
+.\" ====================================================================
+.SS "The \f[I]roff\f[] formatting language"
+.\" ====================================================================
+.
+.\" TODO: Integrate this subsection with subsection "Other language
+.\" elements".
+The
+.I roff
+language provides requests,
+escape sequences,
+macro definition facilities,
+string variables,
+registers for storage of numbers or dimensions,
+and control of execution flow.
+.
+The theoretically minded will observe that a
+.I roff
+is not a mere markup language,
+but Turing-complete.
+.
+It has storage
+(registers),
+it can perform tests
+(as in conditional expressions like
+.RB \[lq] "(\[rs]n[i] >= 1)" \[rq]),
+its
+.\" Kerning between bold "i" and "f" and roman \[lq], \[rq] is tight.
+.RB \[lq] \|if\| \[rq]
+and related requests alter the flow of control,
+and macro definition permits unbounded recursion.
+.
+.
+.P
+.I Requests
+and
+.I escape sequences
+are instructions,
+predefined parts of the language,
+that perform formatting operations,
+interpolate stored material,
+or otherwise change the state of the parser.
+.
+The user can define their own request-like elements by composing
+together text,
+requests,
+and escape sequences
+.I "ad libitum."
+.
+.
+A document writer will not (usually) note any difference in usage for
+requests or macros;
+both are found on control lines.
+.
+However,
+there is a distinction;
+requests take either a fixed number of arguments
+(sometimes zero),
+silently ignoring any excess,
+or consume the rest of the input line,
+whereas macros can take a variable number of arguments.
+.
+Since arguments are separated by spaces,
+macros require a means of embedding a space in an argument;
+in other words,
+of quoting it.
+.
+This then demands a mechanism of embedding the quoting character itself,
+in case
+.I it
+is needed literally in a macro argument.
+.
+AT&T
+.I troff
+had complex rules involving the placement and repetition of the double
+quote to achieve both aims.
+.
+.I groff
+cuts this knot by supporting a special character escape sequence for the
+neutral double quote,
+.\" The kerning between a roman \[lq] and a bold backslash is tight.
+.RB \[lq] \|\[rs][dq] \[rq],
+which never performs quoting in the typesetting language,
+but is simply a glyph,
+.RB \[oq] \[dq] \[cq].
+.
+.
+.P
+.I Escape sequences
+start with a backslash,
+.RB \[lq] \|\[rs] \[rq].
+.
+They can appear almost anywhere,
+even in the midst of text on a line,
+and implement various features,
+including the insertion of special characters with
+.RB \[lq] \|\[rs](\f[BI]xx\f[] \[rq]
+or
+.RB \[lq] \|\[rs][\f[BI]xxx\f[]] \[rq],
+break suppression at input line endings with
+.RB \[lq] \|\[rs]c \[rq],
+font changes with
+.RB \[lq] \|\[rs]f\| \[rq],
+type size changes with
+.RB \[lq] \|\[rs]s \[rq],
+in-line comments with
+.RB \[lq] \|\[rs]\[dq] \[rq],
+and many others.
+.
+.
+.P
+.I Strings
+store text.
+.
+They are populated with the
+.B ds
+request and interpolated using the
+.B \[rs]*
+escape sequence.
+.
+.
+.P
+.I Registers
+store numbers and measurements.
+.
+A register can be set with the request
+.B nr
+and its value can be retrieved by the escape sequence
+.BR "\[rs]n" .
+.
+.
+.\" ====================================================================
+.SH "File naming conventions"
+.\" ====================================================================
+.
+The structure or content of a file name,
+beyond its location in the file system,
+is not significant to
+.I roff
+tools.
+.
+.I roff
+documents employing \[lq]full-service\[rq] macro packages
+(see
+.MR groff_tmac @MAN5EXT@ )
+tend to be named with a suffix identifying the package;
+we thus see file names ending in
+.IR .man ,
+.IR .ms ,
+.IR .me ,
+.IR .mm ,
+and
+.IR .mom ,
+for instance.
+.
+When installed,
+man pages tend to be named with the manual's section number as the
+suffix.
+.
+For example,
+the file name for this document is
+.IR roff.7 .
+.
+Practice for
+\[lq]raw\[rq]
+.I roff
+documents is less consistent;
+they
+are sometimes seen with a
+.I .t
+suffix.
+.
+.
+.\" BEGIN Keep parallel with groff.texi node "Input Conventions".
+.\" ====================================================================
+.SH "Input conventions"
+.\" ====================================================================
+.
+Since
+.I @g@troff
+fills text automatically,
+it is common practice in the
+.I roff
+language to avoid visual composition of text in input files:
+the esthetic appeal of the formatted output is what matters.
+.
+Therefore,
+.I roff
+input should be arranged such that it is easy for authors and
+maintainers to compose and develop the document,
+understand the syntax of
+.I roff
+requests,
+macro calls,
+and preprocessor languages used,
+and predict the behavior of the
+formatter.
+.
+Several traditions have accrued in service of these goals.
+.
+.
+.IP \[bu] 2n
+Follow sentence endings in the input with newlines to ease their
+recognition.
+.\" Texinfo: (@pxref{Sentences}).
+It is frequently convenient to end text lines after colons and
+semicolons as well,
+as these typically precede independent clauses.
+.
+Consider doing so after commas;
+they often occur in lists that become easy to scan when itemized by
+line,
+or constitute supplements to the sentence that are added,
+deleted,
+or updated to clarify it.
+.
+Parenthetical and quoted phrases are also good candidates for placement
+on text lines by themselves.
+.
+.
+.IP \[bu]
+Set your text editor's line length to 72 characters or fewer;
+see the subsections below.
+.\" Texinfo:
+.\" @footnote{Emacs: @code{fill-column: 72}; Vim: @code{textwidth=72}}
+.
+This limit,
+combined with the previous item of advice,
+makes it less common that an input line will wrap in your text editor,
+and thus will help you perceive excessively long constructions in your
+text.
+.
+Recall that natural languages originate in speech,
+not writing,
+and that punctuation is correlated with pauses for breathing and changes
+in prosody.
+.
+.
+.IP \[bu]
+Use
+.B \[rs]&
+after
+.RB \[lq] !\& \[rq],
+.RB \[lq] ?\& \[rq],
+and
+.RB \[lq] .\& \[rq]
+if they are followed by space,
+tab,
+or newline characters and don't end a sentence.
+.
+.
+.IP \[bu]
+In filled text lines,
+use
+.B \[rs]&
+before
+.RB \[lq] .\& \[rq]
+and
+.RB \[lq] \[aq] \[rq]
+if they are preceded by space,
+so that reflowing the input doesn't turn them into control lines.
+.
+.
+.IP \[bu]
+Do not use spaces to perform indentation or align columns of a table.
+Leading spaces are reliable when text is not being filled.
+.
+.
+.IP \[bu]
+Comment your document.
+.
+It is never too soon to apply comments to record information of use to
+future document maintainers
+(including your future self).
+.\" Texinfo: We thus introduce another escape sequence, @code{\"}, which
+The
+.B \[rs]\[dq]
+escape sequence
+causes
+.I @g@troff
+to ignore the remainder of the input line.
+.
+.
+.IP \[bu]
+Use the empty request\[em]a control character followed immediately by a
+newline\[em]to visually manage separation of material in input files.
+.
+Many of the
+.I groff
+project's own documents use an empty request between sentences,
+after macro definitions,
+and where a break is expected,
+and two empty requests between paragraphs or other requests or macro
+calls that will introduce vertical space into the document.
+.
+You can combine the empty request with the comment escape sequence to
+include whole-line comments in your document,
+and even \[lq]comment out\[rq] sections of it.
+.
+.
+.P
+.\" Texinfo: We conclude this section with an example
+An example sufficiently long to illustrate most of the above suggestions
+in practice follows.
+.
+.\" Texinfo: For the purpose of fitting the example between the margins
+.\" of this manual with the font used for its typeset version,
+.\" we have shortened the input line length to 56
+.\" columns.
+.\" Texinfo: As before,
+.
+An arrow \[->] indicates a tab character.
+.
+.
+.P
+.RS
+.EX
+\&.\[rs]" nroff this_file.roff | less
+\&.\[rs]" groff \-T ps this_file.roff > this_file.ps
+\[->]The theory of relativity is intimately connected with
+the theory of space and time.
+\&.
+I shall therefore begin with a brief investigation of
+the origin of our ideas of space and time,
+although in doing so I know that I introduce a
+controversial subject.\& \[rs]" remainder of paragraph elided
+\&.
+.ne 3v \" Don't let a page break hide the blank line from the reader.
+\&.
+\&
+\[->]The experiences of an individual appear to us arranged
+in a series of events;
+in this series the single events which we remember
+appear to be ordered according to the criterion of
+\[rs][lq]earlier\[rs][rq] and \[rs][lq]later\[rs][rq], \[rs]" punct \
+swapped
+which cannot be analysed further.
+\&.
+There exists,
+therefore,
+for the individual,
+an I\-time,
+or subjective time.
+\&.
+This itself is not measurable.
+\&.
+I can,
+indeed,
+associate numbers with the events,
+in such a way that the greater number is associated with
+the later event than with an earlier one;
+but the nature of this association may be quite
+arbitrary.
+\&.
+This association I can define by means of a clock by
+comparing the order of events furnished by the clock
+with the order of a given series of events.
+\&.
+We understand by a clock something which provides a
+series of events which can be counted,
+and which has other properties of which we shall speak
+later.
+\&.\[rs]" Albert Einstein, _The Meaning of Relativity_, 1922
+.EE
+.RE
+.\" END Keep parallel with groff.texi node "Input Conventions".
+.
+.
+.\" ====================================================================
+.SS "Editing with Emacs"
+.\" ====================================================================
+.
+Official GNU doctrine holds that the best program for editing a
+.I roff
+document is Emacs; see
+.MR emacs 1 .
+.
+It provides an
+.I nroff
+major mode that is suitable for all kinds of
+.I roff
+dialects.
+.
+This mode can be activated by the following methods.
+.
+.
+.P
+When editing a file within Emacs the mode can be changed by typing
+.RI \[lq] M-x
+.BR nroff\-mode \[rq],
+where
+.I M-x
+means to hold down the meta key
+(often labelled \[lq]Alt\[rq])
+while pressing and releasing the \[lq]x\[rq] key.
+.\" Why is this sort of thing not in intro(1)?
+.
+.
+.P
+It is also possible to have the mode automatically selected when a
+.I roff
+file is loaded into the editor.
+.
+.
+.IP \(bu 2n
+The most general method is to include file-local variables at the end of
+the file;
+we can also configure the fill column this way.
+.
+.
+.RS
+.IP
+.EX
+\&.\[rs]" Local Variables:
+\&.\[rs]" fill\-column: 72
+\&.\[rs]" mode: nroff
+\&.\[rs]" End:
+.EE
+.RE
+.
+.IP \(bu
+Certain file name extensions,
+such as those commonly used by man pages,
+trigger the automatic activation of the
+.I nroff
+mode.
+.
+.
+.br
+.ne 3v
+.IP \(bu
+Technically,
+having the sequence
+.
+.
+.RS
+.IP
+.EX
+\&.\[rs]" \%\-*\- nroff \-*\-
+.EE
+.RE
+.
+.
+.IP
+in the first line of a file will cause Emacs to enter the
+.I nroff
+major mode when it is loaded into the buffer.
+.
+Unfortunately,
+some implementations of the
+.MR man 1
+program are confused by this practice,
+so we discourage it.
+.
+.
+.\" ====================================================================
+.SS "Editing with Vim"
+.\" ====================================================================
+.
+.\" TODO: elvis, vile. Nvi does not support highlighting at all, and
+.\" gedit does but has no rules for roff yet. Other editors TBD.
+Other editors provide support for
+.IR roff -style
+files too,
+such as
+.MR vim 1 ,
+an extension of the
+.MR vi 1
+program.
+.
+Vim's highlighting can be made to recognize
+.I roff
+files by setting the
+.B filetype
+option in a Vim
+.IR modeline .
+.
+For this feature to work,
+your copy of
+.I vim
+must be built with support for,
+and configured to enable,
+several features;
+consult the editor's online help topics
+\[lq]auto\-setting\[rq],
+\[lq]filetype\[rq],
+and \[lq]syntax\[rq].
+.
+Then put the following at the end of your
+.I roff
+files,
+after any Emacs configuration:
+.\" ...because Emacs pattern-matches against 3000 bytes from the end of
+.\" the buffer [or until hitting a 0x0C (FF, form-feed control)] for
+.\" "Local Variables:", but Vim only checks as many lines as its
+.\" 'modelines' variable tells it to. A common default is "5", but
+.\" Emacs settings can be longer than that.
+.
+.
+.RS
+.IP
+.EX
+\&.\[rs]" vim: set filetype=groff textwidth=72:
+.EE
+.RE
+.
+.
+.P
+Replace \[lq]groff\[rq] in the above with \[lq]nroff\[rq] if you want
+highlighting that does
+.I not
+recognize many of the GNU extensions to
+.IR roff ,
+such as request,
+register,
+and string names longer than two characters.
+.
+.
+.\" ====================================================================
+.SH Authors
+.\" ====================================================================
+.
+This document was written by
+.MT groff\-bernd\:.warken\-72@\:web\:.de
+Bernd Warken
+.ME
+and
+.MT g.branden\:.robinson@\:gmail\:.com
+G.\& Branden Robinson
+.ME .
+.
+.
+.\" ====================================================================
+.SH "See also"
+.\" ====================================================================
+.
+Much
+.I roff
+documentation is available.
+.
+The Bell Labs papers describing AT&T
+.I troff
+remain available,
+and
+.I groff
+is documented comprehensively. \" ...one hopes.
+.
+.
+.\" ====================================================================
+.SS "Internet sites"
+.\" ====================================================================
+.
+.P
+.UR https://\:github\:.com/\:larrykollar/\:Unix\-Text\-Processing
+.I Unix Text Processing
+.UE ,
+by Dale Dougherty and Tim O'Reilly,
+1987,
+Hayden Books.
+.
+This well-regarded text brings the reader from a state of no knowledge
+of Unix or text editing
+(if necessary)
+to sophisticated computer-aided typesetting.
+.
+It has been placed under a free software license by its authors and
+updated by a team of
+.I groff
+contributors and enthusiasts.
+.
+.
+.P
+.UR http://\:manpages\:.bsd\:.lv/\:history\:.html
+\[lq]History of Unix Manpages\[rq]
+.UE ,
+an online article maintained by the mdocml project,
+provides an overview of
+.I roff
+development from Saltzer's
+.I RUNOFF
+to 2008,
+with links to original documentation and recollections of the authors
+and their contemporaries.
+.
+.
+.P
+.UR http://\:www\:.troff\:.org/
+troff.org
+.UE ,
+Ralph Corderoy's
+.I troff
+site,
+provides an overview and pointers to much historical
+.I roff
+information.
+.
+.
+.P
+.UR http://\:www\:.multicians\:.org/
+Multicians
+.UE ,
+a site by Multics enthusiasts,
+contains a lot of information on the MIT projects CTSS and Multics,
+including
+.IR RUNOFF ;
+it is especially useful for its glossary and the many links to
+historical documents.
+.
+.
+.P
+.UR http://\:www\:.tuhs\:.org/\:Archive/
+The Unix Archive
+.UE ,
+curated by the Unix Heritage Society,
+provides the source code and some binaries of historical Unices
+(including the source code of some versions of
+.I troff
+and its documentation)
+contributed by their copyright holders.
+.
+.
+.P
+.UR http://\:web\:.mit\:.edu/\:Saltzer/\:www/\:publications/\
+\:pubs\:.html
+Jerry Saltzer's home page
+.UE
+stores some documents using the original
+.I RUNOFF
+formatting language.
+.
+.
+.P
+.UR http://\:www\:.gnu\:.org/\:software/\:groff
+.I groff
+.UE ,
+GNU
+.IR roff 's
+web site,
+provides convenient access to
+.IR groff 's
+source code repository,
+bug tracker,
+and mailing lists
+(including archives and the subscription interface).
+.
+.
+.\" ====================================================================
+.SS "Historical \f[I]roff\f[] documentation"
+.\" ====================================================================
+.
+Many AT&T
+.I troff
+documents are available online,
+and can be found at Ralph Corderoy's site
+(see above)
+or via Internet search.
+.
+.
+.P
+Of foremost significance are two mentioned in section \[lq]History\[rq]
+above,
+describing the language and its device-independent implementation,
+respectively.
+.
+.
+.P
+\[lq]Troff User's Manual\[rq]
+by Joseph F.\& Ossanna,
+1976
+(revised by Brian W.\& Kernighan,
+1992),
+AT&T Bell Laboratories Computing Science Technical Report No.\& 54.
+.
+.
+.P
+\[lq]A Typesetter-independent TROFF\[rq]
+by Brian W.\& Kernighan,
+1982,
+AT&T Bell Laboratories Computing Science Technical Report No.\& 97.
+.
+.
+.P
+You can obtain many relevant Bell Labs papers in PDF from
+.UR https://\:github\:.com/\:bwarken/\:roff_classical\:.git
+Bernd Warken's
+\[lq]roff classical\[rq]
+GitHub repository
+.UE .
+.
+.
+.\" ====================================================================
+.SS "Manual pages"
+.\" ====================================================================
+.
+As a system of multiple components,
+a
+.I roff
+system potentially has many man pages,
+each describing an aspect of it.
+.
+Unfortunately,
+there is no consistent naming scheme for these pages among the different
+.I roff
+implementations.
+.
+.
+.P
+For GNU
+.IR roff ,
+the
+.MR groff @MAN1EXT@
+man page enumerates all man pages distributed with the system,
+and individual pages frequently refer to external resources as well as
+manuals distributed with
+.I groff
+on a variety of topics.
+.
+.
+.P
+With other
+.IR roff s,
+you are on your own,
+but
+.MR troff 1 \" foreign troff
+might be a good starting point.
+.
+.
+.\" Restore compatibility mode (for, e.g., Solaris 10/11).
+.cp \n[*groff_roff_7_man_C]
+.do rr *groff_roff_7_man_C
+.
+.
+.\" Local Variables:
+.\" fill-column: 72
+.\" mode: nroff
+.\" End:
+.\" vim: set filetype=groff textwidth=72: