summaryrefslogtreecommitdiff
path: root/sys/doc/troff.ms
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2011-07-18 11:01:22 +0200
committeraiju <aiju@phicode.de>2011-07-18 11:01:22 +0200
commit8c4c1f39f4e369d7c590c9d119f1150a2215e56d (patch)
treecd430740860183fc01de1bc1ddb216ceff1f7173 /sys/doc/troff.ms
parent11bf57fb2ceb999e314cfbe27a4e123bf846d2c8 (diff)
added /sys/doc
Diffstat (limited to 'sys/doc/troff.ms')
-rw-r--r--sys/doc/troff.ms3660
1 files changed, 3660 insertions, 0 deletions
diff --git a/sys/doc/troff.ms b/sys/doc/troff.ms
new file mode 100644
index 000000000..e3911812f
--- /dev/null
+++ b/sys/doc/troff.ms
@@ -0,0 +1,3660 @@
+.nr *% \n(%#u+7u
+.ds NR "\f2nroff\fP
+.ds TR "\f2troff\|\fP
+.ds Tr \f2Troff\|\fP
+.ds Nr \f2Nroff\fP
+. \" CW - constant width font not from -ms
+.de T&
+.X "END US
+.X "US T&
+..
+.de CW
+.nr PQ \\n(.f
+.if \\n(.$=0 .ft CW
+.if \\n(.$>0 \%\&\\$3\f(CW\\$1\\f\\n(PQ\\$2
+..
+.de BI
+.nr PQ \\n(.f
+.if \\n(.$=0 .ft 4
+.if \\n(.$>0 \%\&\\$3\f2\\$1\\f\\n(PQ\\$2
+..
+.de UC
+\\$3\s-2\\$1\s+2\\$2
+..
+.am NH
+.nr p \\np+1
+.nr s 0 1
+..
+.fp 4 BI LucidaSansI
+.bd 4 3
+.de sc
+.LP
+\f4\\np.\\n+s.\ \ \\$1\f1\0
+..
+.de bt
+.SP .25
+.LP
+.NE 2.1
+.ta 1.5i 2.5i 3.5i 4.5i
+\\$1 \\$2 \\$3 \\$4
+.IP "" 0.8i
+....br
+\\$5
+..
+.
+.
+.
+.
+.
+.
+.
+.TL
+Troff User's Manual
+.AU
+Joseph F. Ossanna
+Brian W. Kernighan
+.sp
+bwk@research.bell-labs.com
+.EQ
+delim @@
+define cw % "\&" font CW %
+.EN
+.SH
+Introduction
+.PP
+\*(Tr and \*(NR are text processors
+that format text for typesetter- and
+typewriter-like terminals, respectively.
+They accept lines of text interspersed with lines of
+format control information and
+format the text into a printable, paginated document
+having a user-designed style.
+\*(Tr and \*(NR offer
+unusual freedom in document styling:
+arbitrary style headers and footers;
+arbitrary style footnotes;
+multiple automatic sequence numbering for paragraphs, sections, etc;
+multiple column output;
+dynamic font and point-size control;
+arbitrary horizontal and vertical local motions at any point;
+and
+a family of automatic overstriking, bracket construction, and
+line-drawing functions.
+.
+.de TL
+.LP
+.ce
+.ps +2
+.ft B
+..
+.
+.PP
+.I Troff
+produces its output in a device-independent form,
+although parameterized for a specific device;
+\*(TR output must be processed by a driver for that
+device to produce printed output.
+.PP
+\*(Tr and \*(NR are highly compatible with each other and it is almost always
+possible to prepare input acceptable to both.
+Conditional input is provided to enable
+the user to embed input expressly destined for either program.
+\*(Nr can prepare output directly for a variety of terminal types and
+is capable of utilizing the full resolution of each terminal.
+\*(Nr is the same program as \*(TR; in fact, on Plan 9
+\*(NR is a shell script that calls \*(TR with the
+.CW -N
+argument.
+.SH
+Background to the Plan 9 Edition
+.PP
+The primary change to \*(TR and \*(NR for Plan 9 is
+support of the Unicode Standard, which was added during
+1992 and 1993. There are two results. First, there is much
+less need for the myriad of two-character names that are so
+much a part of \*(TR lore; in Plan 9, for example, one naturally uses the
+Unicode character ½ instead of \*(TR\|'s
+.CW \\e(12 .
+Second, the output device, though called
+.CW utf ,
+is almost always a form of PostScript printer;
+the panoply of special drivers for different typesetters
+has largely disappeared.
+Unfortunately, not all PostScript printers can cope
+with Unicode characters, so there remains a need for
+programs that synthesize PostScript characters from bitmaps;
+this is especially true for Asian languages.
+.SH
+Background to the Second Edition
+.PP
+\*(Tr
+was originally written by the late Joe Ossanna
+in about 1973, in assembly language for the
+.UC PDP -11,
+to drive the Graphic Systems CAT typesetter.
+It was rewritten in C around 1975,
+and underwent slow but steady evolution until
+Ossanna's death late in 1977.
+.PP
+In 1979, Brian Kernighan
+modified
+\*(TR
+so that it would produce output for a variety of typesetters,
+while retaining its input specifications.
+Over the decade from 1979 to 1989,
+the internals
+have been modestly revised,
+though much of the code remains as it was when Ossanna wrote it.
+.PP
+\*(Tr
+reads parameter files
+each time it is invoked, to
+set values for machine resolution,
+legal type sizes and fonts, and character names,
+character widths
+and the like.
+\*(Tr
+output is
+.UC ASCII
+characters
+in a simple language
+that describes where each character is to be placed
+and in what size and font.
+A post-processor must be written for each device
+to convert this typesetter-independent language
+into specific instructions for that device.
+.PP
+The output language contains information that was not readily
+identifiable in the older output.
+In the newer language, the beginning of each page, line, and word
+is marked,
+so post-processors can do device-specific optimizations
+such as sorting the data vertically or printing it boustrophedonically,
+independent of
+\*(TR.
+.PP
+Capabilities for graphics have been added:
+\*(TR
+recognizes commands for drawing diagonal lines,
+circles, ellipses, circular arcs,
+and quadratic B-splines.
+There are also ways to pass arbitrary information to the output,
+unprocessed by
+\*(TR.
+.PP
+A number of limitations have been eased or eliminated.
+A document may have an arbitrary number of fonts on any page
+(if the output device permits it, of course).
+Fonts may be accessed merely by naming them;
+``mounting'' is no longer necessary.
+There are no limits on the number of characters.
+\H'8'Character height\H'10' and \S'-1'sl\S'0'a\S'1'nt\S'0' may be set
+independently of width.
+.PP
+The remainder of this document contains a description of
+usage and command-line options;
+a summary of requests, escape sequences, and pre-defined number registers;
+a reference manual;
+tutorial examples;
+and a list of commonly-available characters.
+.SH
+Acknowledgements
+.PP
+Joe Ossanna's
+\*(TR
+remains a remarkable accomplishment.
+For more than twenty years, it has proven a robust tool,
+taking unbelievable abuse from a variety of preprocessors
+and being forced into uses that were never conceived of
+in the original design,
+all with considerable grace under fire.
+.PP
+Recent versions of \*(TR have profited from
+significant code improvements by
+Jaap Akkerhuis, Dennis Ritchie, Ken Thompson, and Molly Wagner.
+UTF facilities owe much to Jaap Akkerhuis.
+Andrew Hume, Doug McIlroy, Peter Nelson and Ravi Sethi made valuable suggestions on the manual.
+I fear that the remaining bugs are my fault.
+.sp 100
+.BP
+.TL
+Usage
+.SP
+.PP
+\*(Tr or \*(NR is invoked as
+.P1
+troff \fIoptions files\fP
+nroff \fIoptions files\fP
+.P2
+where @options@ represents any of a number of option arguments
+and @files@ represents the list of files containing the document
+to be formatted.
+An argument consisting of a single minus
+.CW - ' `
+represents standard input.
+If no filenames are given input is taken from the standard input.
+The options, which may appear in any order so long as they appear
+before the files, are:
+.TS
+center;
+lfCW lw(4.5i).
+-m@name@ T{
+Read the macro file
+@cw /sys/lib/tmac. name@
+before the input @files@.
+T}
+-T@name@ T{
+Specifies
+the type of the output device.
+Specific devices are site-dependent.
+For
+\*(TR,
+the most useful name is
+.CW utf .
+For
+\*(NR,
+useful names include
+@cw "37"@ for the (default) Model 37 Teletype,
+@cw lp@ for ``dumb'' line printer terminals (no half-line motions,
+no reverse motions),
+and @cw think@ for the HP ThinkJet printer.
+T}
+-i T{
+Read standard input after the input files are exhausted.
+T}
+-o@list@ T{
+Print only pages whose page numbers appear in @list@,
+which consists of comma-separated numbers and number ranges.
+A number range has the form @N-M@
+and means pages @N@ through @M@;
+a initial @-N@ means
+from the beginning to page @N@; and a final @N-@ means
+from @N@ to the end.
+T}
+-n@N@ T{
+Number first generated page @N@.
+T}
+-r@aN@ T{
+Set number register @a@ (one-character) to @N@.
+T}
+-s@N@ T{
+Stop every @N@ pages.
+\*(Nr will halt prior to every @N@ pages (default @N=1@)
+to allow paper loading or
+changing, and will resume upon receipt of a newline.
+\*(Tr will include a ``pause'' code every @N@ pages;
+its meaning, if any, depends on the output device.
+T}
+-u@N@ T{
+Set amount of emboldening for the
+.CW bd
+request to @N@.
+T}
+-F@path@ T{
+Look in directory @path@ for font information;
+the defaults are
+.CW /sys/lib/troff/font
+and
+.CW /sys/lib/troff/term
+for \*(TR
+and \*(NR respectively.
+T}
+.sp .5
+ T{
+ \*(TR Only
+T}
+-a T{
+Send a printable approximation
+of the results to the standard output.
+T}
+.sp .5
+ T{
+ \*(NR Only
+T}
+-e T{
+Produce equally-spaced words in adjusted
+lines, using full terminal resolution.
+T}
+-h T{
+Use tabs instead of spaces
+to speed up printing.
+T}
+-q T{
+Invoke the simultaneous input-output mode of the @cw rd@ request.
+T}
+.TE
+.PP
+Each option is a separate argument;
+for example,
+.P1
+troff -Tutf -ms -mpictures -o4,6,8-10 \f2file1 file2\fP
+.P2
+requests formatting of pages 4, 6, and 8 through 10 of a document contained in the files
+named \f2file1\fP and \f2file2\fP,
+specifies the output in UTF,
+and invokes the macro packages
+.CW -ms
+and
+.CW -mpictures .
+.PP
+Various pre- and post-processors are available for use with \*(NR and \*(TR.
+These include the equation preprocessor
+.I eqn
+(for \*(TR only),
+the table-construction preprocessor
+.I tbl ,
+and
+.I pic
+and
+.I grap
+for various forms of graphics.
+.sp 100
+.BP
+.TL
+Request Summary
+.PP
+In the following table,
+the notation @+- N@ in the
+.BI "Request Form
+column means that the forms @N@, @+N@, or @-N@ are permitted,
+to set the parameter to @N@, increment it by @N@, or decrement it by @N@,
+respectively.
+Plain @N@ means that the value is used to set the parameter.
+.BI "Initial Values
+separated by
+.CW ;
+are for
+\*(TR
+and
+\*(NR
+respectively.
+In the
+.BI Notes
+column,
+.TS
+center;
+c lw(4.5i).
+B T{
+Request normally causes a break.
+The use of
+.CW ' \&
+as control character (instead of
+.CW . )\&
+suppresses the break function.
+T}
+D T{
+Mode or relevant parameters associated with current diversion level.
+T}
+E T{
+Relevant parameters are a part of the current environment.
+T}
+O T{
+Must stay in effect until logical output.
+T}
+P T{
+Mode must be still or again in effect at the time of physical output.
+T}
+T T{
+\*(TR only; no effect in \*(NR.
+T}
+@bold v@, @bold p@, @bold m@, @bold u@ T{
+Default scale indicator; if not specified, scale indicators are ignored.
+T}
+.TE
+.sp
+.tr &.
+.ps 9
+.vs 11
+.nr z 0 1
+.TS
+lf2 lf2 lf2 lf2 lf2
+lf2 lf2 lf2 lf2 lf2
+lfCW l l l l.
+Request Initial If No
+Form Value Argument Notes Explanation
+.sp .5
+.T&
+lf3 s s s s.
+\\n+z. General Information
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Font and Character Size Control
+.sp .5
+&ps @+- N@ 10 point previous E,T Point size; also @cw "\es" +- N@.
+&ss @N@ 12/36\fBm\fP ignored E,T Space-character size set to @N/36@ em.
+&cs @ F~N~ M@ off - P,T Constant character space (width) mode (font @F@).
+&bd @F~N@ off - P,T Embolden font @F@ by @N-1@ units.
+&bd S@~F~N@ off - P,T Embolden Special Font when current font is @F@.
+&ft@~F@ Roman previous E Change to font @F@; also @cw "\ef" x@, @cw "\ef(" xx@, @cw "\ef" N@.
+&fp@~N~F~L@ R,I,B,...,S ignored - Mount font named @F@ on physical position @N <= 1@;
+ long name is @L@ if given.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Page Control
+&pl @+- N@ 11i 11i @bold v@ Page length.
+&bp @+- N@ @N=1@ - B,@bold v@ Eject current page; next page number @N@.
+&pn @+- N@ @N=1@ ignored - Next page number @N@.
+&po @+- N@ 1i; 0 previous @bold v@ Page offset.
+&ne @N@ - @N=1 roman v@ D,@bold v@ Need @N@ vertical space.
+&mk @R@ none internal D Mark current vertical place in register @R@.
+&rt @+- N@ none internal D,@bold v@ Return (upward only) to marked vertical place.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Text Filling, Adjusting, and Centering
+&br - - B Break.
+&fi fill - B,E Fill output lines.
+&nf fill - B,E No filling or adjusting of output lines.
+&ad @c@ adj, both adjust E Adjust output lines with mode @c@; @c = cw l , cw r , cw c , cw b , none@
+&na adjust - E No output line adjusting.
+&ce @N@ off @N=1@ B,E Center next @N@ input text lines.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Vertical Spacing
+&vs @N@ 12p; 1/6i previous E,@bold p@ Vertical baseline spacing (@V@).
+&ls @N@ @N=1@ previous E Output @N-1@ @bold v@'s after each text output line.
+&sp @N@ - @N=1@v B,@bold v@ Space vertical distance @N@ in either direction.
+&sv @N@ - @N=1@v @bold v@ Save vertical distance @N@.
+&os - - - Output saved vertical distance.
+&ns space - D Turn no-space mode on.
+&rs - - D Restore spacing; turn no-space mode off.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Line Length and Indenting
+&ll @+- N@ 6.5i previous E,@bold m@ Line length.
+&in @+- N@ @N=0@ previous B,E,@bold m@ Indent.
+&ti @+- N@ - ignored B,E,@bold m@ Temporary indent.
+.sp .5
+.ne 2.1
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Macros, Strings, Diversion, and Position Traps
+&de @xx~yy@ - @.yy= cw ".."@ - Define or redefine macro @xx@; end at call of @yy@.
+&am @xx~yy@ - @.yy= cw ".."@ - Append to a macro.
+&ds @xx~string@ - ignored - Define a string @xx@ containing @string@.
+&as @xx~string@ - ignored - Append @string@ to string @xx@.
+&rm @xx@ - ignored - Remove request, macro, or string.
+&rn @xx~yy@ - ignored - Rename request, macro, or string @xx@ to @yy@.
+&di @xx@ - end D Divert output to macro @xx@.
+&da @xx@ - end D Divert and append to @xx@.
+&wh @N~xx@ - - @bold v@ Set location trap; negative is w.r.t. page bottom.
+&ch @xx~N@ - - @bold v@ Change trap location.
+&dt @N~xx@ - off D,@bold v@ Set a diversion trap.
+&it @N~xx@ - off E Set an input-line count trap.
+&em @xx@ none none - End macro is @xx@.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Number Registers
+&nr @R~+- N~M@ - @bold u@ Define and set number register @R@;
+ auto-increment by @M@.
+&af @R~c@ arabic - - Assign format to register @R@ (@c= cw "1" , cw i , cw I , cw a , cw A@).
+&rr @R@ - - - Remove register @R@.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Tabs, Leaders, and Fields
+&ta@~Nt~. . .@ 0.5i; 0.8n none E,@bold m@ Tab settings; left-adjusting, unless
+ @t= cw R@ (right), @cw C@ (centered).
+&tc@~c@ none none E Tab repetition character.
+&lc@~c@ @cw "."@ none E Leader repetition character.
+&fc@~a~b@ off off - Set field delimiter @a@ and pad character @b@.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Input and Output Conventions and Character Translations
+&ec@~c@ \e \e - Set escape character.
+&eo on - - Turn off escape character mechanism.
+&lg@~N@ on; - on T Ligature mode on if @N>0@.
+&ul@~N@ off @N=1@ E Underline (italicize in \*(TR\^) @N@ input lines.
+&cu@~N@ off @N=1@ E Continuous underline in \*(NR; in \*(TR, like @cw ul@.
+&uf@~F@ Italic Italic - Underline font set to @F@ (to be switched to by @cw ul@).
+&cc@~c@ @cw .@ @cw .@ E Set control character to @c@.
+&c2@~c@ @cw "'"@ @cw "'"@ E Set no-break control character to @c@.
+&tr@~abcd....@ none - O Translate @a@ to @b@, etc., on output.
+.sp .5
+.T&
+lf3 s s s s.
+\\n+z. Local Horizontal and Vertical Motions, and the Width Function
+.sp .5
+.T&
+lf3 s s s s.
+\\n+z. Overstrike, Bracket, Line-drawing, Graphics, and Zero-width Functions
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Hyphenation.
+&nh hyphenate - E No hyphenation.
+&hy@~N@ hyphenate hyphenate E Hyphenate; @N =@ mode.
+&hc@~c@ @cw "\e%"@ @cw "\e%"@ E Hyphenation indicator character @c@.
+&hw@~word~. . .@ ignored - Add words to hyphenation dictionary.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Three-Part Titles.
+&tl@~'l'c'r'@ - - Three-part title; delimiter may be any character.
+&pc@~c@ @cw %@ off - Page number character.
+&lt@~+- N@ 6.5i previous E,@bold m@ Length of title.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Output Line Numbering.
+&nm@~+- N^M^S^I@ off E Number mode on or off, set parameters.
+&nn@~N@ - @N=1@ E Do not number next @N@ lines.
+.sp .5
+.ne 2
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Conditional Acceptance of Input
+&if@~c~any@ - - If condition @c@ true, accept @any@ as input;
+ for multi-line, use @cw "\e{" any cw "\e}"@.
+&if !@c~any@ - - If condition @c@ false, accept @any@.
+&if@~N~any@ - @bold u@ If expression @N > 0@, accept @any@.
+&if !@N~any@ - @bold u@ If expression @N <= 0@ [sic], accept @any@.
+&if@~ 's1 's2 '~any@ - - If string @s1@ identical to @s2@, accept @any@.
+&if !@ 's1 's2 '~any@ - - If string @s1@ not identical to @s2@, accept @any@.
+&ie@~c~any@ - @bold u@ If portion of if-else; all above forms (like @cw "if"@).
+&el@~any@ - - Else portion of if-else.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Environment Switching
+&ev@~N@ @N=0@ previous - Environment switch (push down).
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Insertions from the Standard Input
+&rd@~prompt@ - @prompt@=\s-1BEL\s+1 - Read insertion.
+&ex - - - Exit.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Input/Output File Switching
+&so@~filename@ - - Switch source file (push down).
+&nx@~filename@ end-of-file - Next file.
+&sy@~string@ - - Execute program @string@. Output not interpolated.
+&pi@~string@ - - Pipe output to program @string@.
+&cf@~filename@ - - Copy file contents to \*(TR output.
+.sp .5
+.T&
+lf3 s s s s
+lfCW l l l l.
+\\n+z. Miscellaneous
+&mc@~c~N@ - off E,@bold m@ Set margin character @c@ and separation @N@.
+&tm@~string@ - newline - Print @string@ on terminal (standard error).
+&ab@~string@ - newline - Print @string@ on standard error, exit program.
+&ig@~yy@ - @.yy= cw ".."@ - Ignore input until call of @yy@.
+&lf@~N ~f@ - - Set input line number to @N@ and filename to @f@.
+&pm@~t@ - all - Print macro names, sizes; if @t@ present, print total.
+&fl - - B Flush output buffer.
+.sp .5
+.T&
+lf3 s s s s.
+\\n+z. Output and Error Messages
+.sp .5
+\\n+z. Output Language
+.sp .5
+\\n+z. Device and Font Description Files
+.TE
+.br
+.nr zz 9
+.de cl
+.ie \\n+(cl<\n(zz \{\
+. po +\\n(.lu/\n(zzu
+. rt\}
+.el \{.po 1i\}
+..
+.nr cl 0 1
+.di zz
+.ta .45iR
+... was .35
+.nf
+.ps 9
+.vs 10.5
+\f(CWab\fP 20
+\f(CWad\fP 4
+\f(CWaf\fP 8
+\f(CWam\fP 7
+\f(CWas\fP 7
+\f(CWbd\fP 2
+\f(CWbp\fP 3
+\f(CWbr\fP 4
+\f(CWc2\fP 10
+\f(CWcc\fP 10
+\f(CWce\fP 4
+\f(CWcf\fP 19
+\f(CWch\fP 7
+\f(CWcs\fP 2
+\f(CWcu\fP 10
+\f(CWda\fP 7
+\f(CWde\fP 7
+\f(CWdi\fP 7
+\f(CWds\fP 7
+\f(CWdt\fP 7
+\f(CWec\fP 10
+\f(CWel\fP 16
+\f(CWem\fP 7
+\f(CWeo\fP 10
+\f(CWev\fP 17
+\f(CWex\fP 18
+\f(CWfc\fP 9
+\f(CWfi\fP 4
+\f(CWfl\fP 20
+\f(CWfp\fP 2
+\f(CWft\fP 2
+\f(CWhc\fP 13
+\f(CWhw\fP 13
+\f(CWhy\fP 13
+\f(CWie\fP 16
+\f(CWif\fP 16
+\f(CWig\fP 20
+\f(CWin\fP 6
+\f(CWit\fP 7
+\f(CWlc\fP 9
+\f(CWlg\fP 10
+\f(CWlf\fP 20
+\f(CWll\fP 6
+\f(CWls\fP 5
+\f(CWlt\fP 14
+\f(CWmc\fP 20
+\f(CWmk\fP 3
+\f(CWna\fP 4
+\f(CWne\fP 3
+\f(CWnf\fP 4
+\f(CWnh\fP 13
+\f(CWnm\fP 15
+\f(CWnn\fP 15
+\f(CWnr\fP 8
+\f(CWns\fP 5
+\f(CWnx\fP 19
+\f(CWos\fP 5
+\f(CWpc\fP 14
+\f(CWpi\fP 19
+\f(CWpl\fP 3
+\f(CWpm\fP 20
+\f(CWpn\fP 3
+\f(CWpo\fP 3
+\f(CWps\fP 2
+\f(CWrd\fP 18
+\f(CWrm\fP 7
+\f(CWrn\fP 7
+\f(CWrr\fP 8
+\f(CWrs\fP 5
+\f(CWrt\fP 3
+\f(CWso\fP 19
+\f(CWsp\fP 5
+\f(CWss\fP 2
+\f(CWsv\fP 5
+\f(CWsy\fP 19
+\f(CWta\fP 9
+\f(CWtc\fP 9
+\f(CWti\fP 6
+\f(CWtl\fP 14
+\f(CWtm\fP 20
+\f(CWtr\fP 10
+\f(CWuf\fP 10
+\f(CWul\fP 10
+\f(CWvs\fP 5
+\f(CWwh\fP 7
+.di
+.nr aa \n(dn/\n(zz
+.ne \\n(aau+10p
+.sp
+.SP 2
+.TL
+Alphabetical Request and Section Number Cross Reference
+.SP .5
+.LP
+.sp .5
+.nf
+.wh \n(nlu+\n(aau cl
+.nr qq \n(nlu+\n(aau
+.ps
+.vs
+.mk
+.zz
+.rt
+.sp \n(.tu
+.ch cl 12i
+.sp 100
+.BP
+.TL
+Escape Sequences for Characters, Indicators, and Functions
+.SP .5
+.LP
+.ps -1
+.vs -1
+.TS
+center;
+c2 l
+c2 l2 l
+n2 l2fCW l.
+.ft 4
+Section Escape
+Reference Sequence Meaning
+.ft
+.sp .5
+10.1 \e\e \&\f(CW\e\fP prevents or delays the interpretation of \&\f(CW\e\fP
+10.1 \ee Printable version of the current escape character.
+2.1 \e' \' (acute accent); equivalent to \&\f(CW\e(aa\fP
+2.1 \e` \` (grave accent); equivalent to \&\f(CW\e(ga\fP
+2.1 \e\- \- Minus sign in the current font
+7. \e\^. Period (dot) (see \&\f(CWde\fP)
+11.1 \e\f2space\fP Unpaddable space-size space character
+11.1 \e0 Digit width space
+11.1 \e| 1/6 em narrow space character (zero width in \*(NR\^)
+11.1 \e^ 1/12 em half-narrow space character (zero width in \*(NR\^)
+.tr &&
+4.1 \e& Non-printing, zero width character
+.tr &.
+10.6 \e! Transparent line indicator
+10.8 \e" Beginning of comment; continues to end of line
+13. \e% Default optional hyphenation character
+2.1 \e(@xx@ Character named @xx@
+7.1 \e*@x,~@\e*(@xx@ Interpolate string @x@ or @xx@
+7.3 \e$@N@ Interpolate argument @1 <= N <= 9@
+9.1 \ea Non-interpreted leader character
+12.3 \eb'@abc...@' Bracket building function
+4.2 \ec Connect to next input text
+2.1 \eC'@xyz@' Character named @xyz@
+11.1 \ed Downward 1/2 em vertical motion (1/2 line in \*(NR\^)
+12.5 \eD'@c...@' Draw graphics function @c@ with parameters @. . .@; @c= cw l , cw c , cw e , cw a , cw "~"@
+2.2 \ef@x,~@\ef(@xx,~@\ef@N@ Change to font named @x@ or @xx@, or position @N@
+8. \eg@x,~@\eg(@xx@ Format of number register @x@ or @xx@
+11.1 \eh'@N@' Local horizontal motion; move right @N@ (negative left)
+2.3 \eH'@N@' Height of current font is @N@
+11.3 \ek@x@ Mark horizontal input place in register @x@
+12.4 \el'@Nc@' Horizontal line drawing function (optionally with @c@ )
+12.4 \eL'@Nc@' Vertical line drawing function (optionally with @c@ )
+8. \en@x,~@\en(@xx@ Contents of number register @x@ or @xx@
+2.1 \eN'@N@' Character number @N@ on current font
+12.1 \eo'@abc...@' Overstrike characters @a,~ b,~ c@, ...
+4.1 \ep Break and spread output line
+11.1 \er Reverse 1 em vertical motion (reverse line in \*(NR\^)
+2.3 \es@N,~@\es@+- N@ Point-size change function; also @cw "\es(" nn@, @cw "\es" +- cw "(" nn@
+2.2 \eS'@N@' Slant output @N@ degrees
+9.1 \et Non-interpreted horizontal tab
+11.1 \eu Reverse (up) 1/2 em vertical motion (1/2 line in \*(NR\^)
+11.1 \ev'@N@' Local vertical motion; move down N (negative up)
+11.2 \ew'@string@' Width of @string@
+5.2 \ex'@N@' Extra line-space function (negative before, positive after)
+10.7 \eX'@string@' Output @string@ as device control function
+12.2 \ez@c@ Print @c@ with zero width (without spacing)
+16. \e{ Begin conditional input
+16. \e} End conditional input
+10.8 \e@newline@ Concealed (ignored) newline
+- \e@Z@ @Z@, any character not listed above
+.TE
+.ps +1
+.vs +1
+.LP
+The escape sequences
+.CW \e\e ,
+.CW \e\^. ,
+.CW \e" ,
+.CW \e$ ,
+.CW \e* ,
+.CW \ea ,
+.CW \en ,
+.CW \et ,
+.CW \eg ,
+and
+.CW \e@newline@
+are interpreted in copy mode (§7.2).
+.SP .5i
+\0
+.sp 100
+.BP
+.TL
+Predefined Number Registers
+.LP
+.ps -1
+.vs -1
+.TS
+c2l
+c2 l2 l
+n2 l2fCW l.
+.ft 4
+Section Register
+Reference Name Description
+.ft
+.sp .5
+3. % Current page number.
+11.2 ct Character type (set by \&\f(CW\ew\fP function).
+7.4 dl Width (maximum) of last completed diversion.
+7.4 dn Height (vertical size) of last completed diversion.
+- dw Current day of the week (1-7).
+- dy Current day of the month (1-31).
+15. ln Output line number.
+- mo Current month (1-12).
+4.1 nl Vertical position of last printed text baseline.
+11.2 sb Depth of string below baseline (generated by \&\f(CW\ew\fP function).
+11.2 st Height of string above baseline (generated by \&\f(CW\ew\fP function).
+- yr Last two digits of current year.
+.TE
+.ps +1
+.vs +1
+
+
+.TL
+Predefined Read-Only Number Registers
+.LP
+.ps -1
+.vs -1
+.TS
+c2 l
+c2 l2 l
+n2 l2fCW l.
+.ft 4
+Section Register
+Reference Name Description
+.ft
+.sp .5
+19. $$ Process id of \*(TR or \*(NR.
+7.3 &$ Number of arguments available at the current macro level.
+5.2 &a Post-line extra line-space most recently used in @cw "\ex'" N cw "'" @.
+- &A Set to 1 in \*(TR, if @cw -a@ option used; always 1 in \*(NR.
+2.3 &b Emboldening level.
+20. &c Number of lines read from current input file.
+7.4 &d Current vertical place in current diversion; equal to @cw nl@, if no diversion.
+2.2 &f Current font number.
+20. &F Current input file name [sic].
+4. &h Text baseline high-water mark on current page or diversion.
+11.1 &H Available horizontal resolution in basic units.
+6. &i Current indent.
+4.2 &j Current @cw ad@ mode.
+4.1 &k Current output horizontal position.
+6. &l Current line length.
+5.1 &L Current @cw ls@ value.
+4. &n Length of text portion on previous output line.
+3. &o Current page offset.
+3. &p Current page length.
+7.5 .R Number of unused number registers.
+- &T Set to 1 in \*(NR, if \&\f(CW-T\fP option used; always 0 in \*(TR.
+2.3 &s Current point size.
+7.5 &t Distance to the next trap.
+4.1 &u Equal to 1 in fill mode and 0 in nofill mode.
+5.1 &v Current vertical line spacing.
+11.1 &V Available vertical resolution in basic units.
+11.2 &w Width of previous character.
+- &x Reserved version-dependent register.
+- &y Reserved version-dependent register.
+7.4 &z Name [sic] of current diversion.
+.TE
+.ps +1
+.vs +1
+.sp 100
+.BP
+.TL
+Reference Manual
+.NH
+General Explanation
+.sc "Form of input.
+Input consists of \fItext lines\fR, which are destined to be printed,
+interspersed with \fIcontrol lines\fR,
+which set parameters or otherwise control subsequent processing.
+Control lines begin with a \fIcontrol character\fR\(em\
+normally \&\f(CW.\fR (period) or \&\f(CW'\fR (single quote)\(em\
+followed by a one or two character name that specifies
+a basic \fIrequest\fR or the substitution of
+a user-defined \fImacro\fR in place of the control line.
+The control character \&\f(CW'\fR suppresses the \fIbreak\fR function\(em\
+the forced output of a partially filled line\(em\
+caused by certain requests.
+The control character may be separated from the request/macro name by
+white space (spaces and/or tabs) for aesthetic reasons.
+Names should be followed by either
+space or newline.
+Control lines with unrecognized names are ignored.
+.PP
+Various special functions may be introduced anywhere in the input by
+means of an \fIescape\fR character, normally \&\f(CW\e\fR.
+For example, the function
+.CW \en@R@
+causes the interpolation of the contents of the
+\fInumber register R\fR
+in place of the function;
+here @R@ is either a single character name
+as in \&\f(CW\en\fIx\fR,
+or a two-character name introduced by
+a left-parenthesis, as in \&\f(CW\en(\fIxx\fR.
+.sc "Formatter and device resolution.
+\*(Tr internally stores and processes dimensions in units that correspond to
+the particular device for which output is being prepared;
+values from 300 to 1200/inch are typical.
+See §23.
+\*(Nr internally uses 240 units/inch,
+corresponding to the least common multiple of the
+horizontal and vertical resolutions of various
+typewriter-like output devices.
+\*(Tr rounds horizontal/vertical numerical parameter input to the actual
+horizontal/vertical resolution of the output device indicated by the \&\f(CW-T\fR option
+(default
+.CW post ).
+\*(Nr similarly rounds numerical input to the actual resolution
+of its output device
+(default Model 37 Teletype).
+.sc "Numerical parameter input.
+Both \*(NR and \*(TR
+accept numerical input with the appended scale
+indicators
+shown in the following table,
+where
+\fIS\fR is the current type size in points and
+\fIV\fR is the current vertical line spacing in
+basic units.
+.TS
+center box;
+c|c
+c|c
+c|l.
+Scale
+Indicator Meaning
+_
+\&\f(CWi\fR Inch
+\&\f(CWc\fR Centimeter
+\&\f(CWP\fR Pica = 1/6 inch
+\&\f(CWm\fR Em = \fIS\fR points
+\&\f(CWn\fR En = Em/2
+\&\f(CWp\fR Point = 1/72 inch
+\&\f(CWu\fR Basic unit
+\&\f(CWv\fR Vertical line space \fIV\fR
+none Default, see below
+.TE
+In \*(NR, both the em and the en are taken to be equal to the
+nominal character width,
+which is output-device dependent;
+common values are 1/10 and 1/12 inch.
+Actual character widths in \*(NR need not be all the same and constructed characters
+such as -> (→) are often extra wide.
+The default scaling is
+.CW m
+for the horizontally-oriented requests
+and functions
+.CW ll ,
+.CW in ,
+.CW ti ,
+.CW ta ,
+.CW lt ,
+.CW po ,
+.CW mc ,
+.CW \eh ,
+.CW \el ,
+and horizontal coordinates of
+.CW \eD ;
+.CW v
+for the vertically-oriented requests and functions
+.CW pl ,
+.CW wh ,
+.CW ch ,
+.CW dt ,
+.CW sp ,
+.CW sv ,
+.CW ne ,
+.CW rt ,
+.CW \ev ,
+.CW \ex ,
+.CW \eL ,
+and vertical coordinates of
+.CW \eD ;
+.CW p
+for the
+.CW vs
+request;
+and
+.CW u
+for the requests
+.CW nr ,
+.CW if ,
+and
+.CW ie .
+\fIAll\fR other requests ignore any scale indicators.
+When a number register containing an already appropriately scaled number
+is interpolated to provide numerical input,
+the unit scale indicator
+\&\f(CWu\fR may need to be appended to prevent
+an additional inappropriate default scaling.
+The number, @N@, may be specified in decimal-fraction form
+but the parameter finally stored is rounded to an integer number of basic units.
+Internal computations are performed in integer arithmetic.
+.PP
+The \fIabsolute position\fR indicator \&\f(CW|\fR may be prefixed
+to a number @N@
+to generate the distance to the vertical or horizontal place @N@.
+For vertically-oriented requests and functions, \&\f(CW|\fP@N@
+becomes the distance in basic units from the current vertical place on the page or in a \fIdiversion\fR (§7.4)
+to the vertical place @N@.
+For \fIall\fR other requests and functions,
+\&\f(CW|\fP@N@
+becomes the distance from
+the current horizontal place on the \fIinput\fR line to the horizontal place @N@.
+For example,
+.P1
+\&.sp |3.2c
+.P2
+will space in the required direction to 3.2 centimeters from the top of the page.
+.sc "Numerical expressions.
+.tr &&
+Wherever numerical input is expected,
+an expression involving parentheses,
+the arithmetic operators \&\f(CW+\fR, \&\f(CW-\fR, \&\f(CW/\fR, \&\f(CW\(**\fR, \&\f(CW%\fR (mod),
+and the logical operators
+\&\f(CW<\fR,
+\&\f(CW>\fR,
+\&\f(CW<=\fR,
+\&\f(CW>=\fR,
+\&\f(CW=\fR (or \&\f(CW==\fR),
+\&\f(CW&\fR\ (and),
+\&\f(CW:\fR\ (or)
+may be used.
+Except where controlled by parentheses, evaluation of expressions is left-to-right;
+there is no operator precedence.
+In the case of certain requests, an initial \&\f(CW+\fR or \&\f(CW-\fR is stripped
+and interpreted as an increment or decrement indicator respectively.
+In the presence of default scaling, the desired scale indicator must be
+attached to \fIevery\fR number in an expression
+for which the desired and default scaling differ.
+For example,
+if the number register \&\f(CWx\fR contains 2
+and the current point size is 10,
+then
+.P1
+\&.ll (4.25i+\enxP+3)/2u
+.P2
+will set the line length to 1/2 the sum of 4.25 inches + 2 picas + 3 ems.
+.sc "Notation.
+Numerical parameters are indicated in this manual in two ways.
+@+- N@ means that the argument may take the forms @N@, @+N@, or @-N@ and
+that the corresponding effect is to set the parameter
+to @N@, to increment it by @N@, or to decrement it by @N@ respectively.
+Plain @N@ means that an initial algebraic sign is \fInot\fR
+an increment indicator,
+but merely the sign of @N@.
+Generally, unreasonable numerical input is either ignored
+or truncated to a reasonable value.
+For example,
+most requests expect to set parameters to non-negative
+values;
+exceptions are
+.CW sp ,
+.CW wh ,
+.CW ch ,
+.CW nr ,
+and
+.CW if .
+The requests
+.CW ps ,
+.CW ft ,
+.CW po ,
+.CW vs ,
+.CW ls ,
+.CW ll ,
+.CW in ,
+and
+.CW lt
+restore the previous parameter value in the absence
+of an argument.
+.PP
+Single character arguments are indicated by single lower case letters
+and
+one/two character arguments are indicated by a pair of lower case letters.
+Character string arguments are indicated by multi-character mnemonics.
+.NH
+Font and Character Size Control
+.sc "Character set.
+The \*(TR character set is defined by a description file specific to each output device (§23).
+There are normally several regular fonts and one or more special fonts.
+Characters are input as themselves,
+as @cw "\e(" xx@, as @cw "\eC'" name cw "'"@,
+or as
+.CW \eN'@n@' .
+The form
+.CW \eC'@name@'
+permits a name of any length;
+the form
+.CW \eN'@n@'
+refers to the @n@-th character on the current font,
+whether named or not.
+.PP
+Normally the input characters
+.CW ` ,
+.CW ' ,
+and
+.CW -
+are printed as `, ', and - respectively;
+.CW \e` ,
+.CW \e' ,
+and
+.CW \e-
+produce \`, \', and \-.
+If the character does not exist in the font, \*(TR assumes the width is 1 em and
+outputs the character with a
+.CW C
+name as defined in Section 22.
+(This is independent of how the device handles characters unknown to it.)
+.PP
+\*(Nr has an analogous, but different, mechanism for defining legal characters
+and how to print them.
+By default all characters are valid.
+There are such
+additional characters as may be available on
+the output device,
+such characters as may be constructed
+by overstriking or other combination,
+and those that can reasonably be mapped
+into other printable characters.
+The exact behavior is determined by a driving
+table prepared for each device.
+.sc "Fonts.
+\*(Tr
+begins execution by reading information for a set of defaults fonts,
+said to be
+.I mounted ;
+conventionally, the first four are
+Times Roman (\&\f(CWR\fR),
+Times Italic
+(\&\f(CWI\fR),
+Times Bold
+(\&\f(CWB\fR),
+and
+Times Bold Italic
+(\&\f(CWBI\fR) ,
+and the last is a Special font
+.CW S ) (
+containing miscellaneous characters.
+(This document uses Lucida Sans in place of Times.)
+The set of fonts and positions is determined by the device description file,
+described in §23.
+.PP
+The current font, initially Roman, may be changed
+by the \&\f(CWft\fR request,
+or by embedding at any desired point
+\&\f(CW\ef\fIx\fR, \&\f(CW\ef(\fIxx\fR, or \&\f(CW\ef\fP@N@,
+where
+\fIx\fR and \fIxx\fR are the name of a font
+and @N@ is a numerical font position.
+.PP
+It is not necessary to change to the Special font;
+characters on that font are automatically handled
+as if they were physically part of the current font.
+The Special font may actually be several fonts;
+the name
+.CW S
+is reserved and is generally used for one of these.
+All special fonts must be mounted after regular fonts.
+.PP
+\*(Tr can be informed that any particular font is mounted
+by use of the \&\f(CWfp\fR request.
+The list of known fonts is installation dependent.
+In the subsequent discussion of font-related requests,
+@F@ represents either a one/two-character
+font name or the numerical font position.
+The current font is available (as a numerical position) in the read-only number register \&\f(CW.f\fR.
+.PP
+A request for a named but not-mounted font is honored
+if the font description information exists.
+In this way, there is no limit on the number of fonts that may be printed
+in any part of a document.
+Mounted fonts may be handled more efficiently,
+and they may be referred to by their mount positions,
+but there is no other difference.
+Mention of an unmounted font loads it temporarily at font position
+zero, which serves as a one-font cache.
+.PP
+The function
+.CW \eS'@+- N@'
+causes the current font to be slanted by
+@+- N@
+degrees.
+Not all devices support slanting.
+.PP
+\*(Nr understands font control
+and normally underlines italic characters (see §10.5).
+.sc "Character size.
+Character point sizes available depend on the specific output device;
+a typical (historical) set of values is
+6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, and 36.
+This is a range of 1/12 inch to 1/2 inch.
+The \&\f(CWps\fR request is used to change or restore the point size.
+Alternatively the point size may be changed between any two characters
+by embedding a
+.CW \es@N@
+at the desired point
+to set the size to @N@,
+or a
+.CW "\&\f(CW\es@+- N@
+(@1 <= N <= 9@)
+to increment/decrement the size by @N@;
+.CW \es0
+restores the previous size.
+Requested point size values that are between two valid
+sizes yield the larger of the two.
+.PP
+Note that through an accident of history, a construction like
+.CW \es39
+is parsed as size 39, and thus converted to size 36 (given the sizes above),
+while
+.CW \es40
+is parsed as size 4 followed by
+.CW 0 .
+The forms
+@cw "\es(" nn@ and @cw "\es" +- cw "(" nn@
+permit specification of sizes that would otherwise be ambiguous.
+.PP
+The current size is available in the \&\f(CW.s\fR register.
+\*(Nr ignores type size requests.
+.PP
+The function
+.CW "\eH'@+- N@'
+sets \H'+2'the height of the current font\H'0' to
+@N@, or increments it by @+N@, or decrements it by @-N@;
+if @N=0@, the height is restored to the current point size.
+In each case, the width is unchanged.
+Not all devices support independent height and width for characters.
+.FS
+*The fields have the same meaning as described earlier in the Request Summary.
+.FE
+.SP .5
+.LP
+.ne 2.1
+.ta 1.5i 2.5i 3.5i 4.5i
+\f2Request\fR \f2Initial\fR \f2If\ No\fR
+.br
+\f2Form\fR \f2Value\fR \f2Argument\fR \f2Notes\fR
+.bt "\&\f(CW.ps\fI \(+-N\fR*" "10\|point" "previous" "E" "Point size
+set to @+- N@.
+Alternatively, embed
+.CW \es@N@
+or
+.CW "\&\f(CW\es@+- N@" .
+Any positive size value may be requested;
+if invalid, the next larger valid size will result, with a
+maximum of 36.
+A paired sequence
+@+N@, @-N@
+will work because the previous requested value is also remembered.
+Ignored in \*(NR.
+.bt "\&\f(CW.ss\fI N\fR" "12/36\|em" "ignored" "E" "Space-character size
+(i.e., inter-word gap)
+is set to @N@/36 ems.
+This size is the minimum word spacing in adjusted text.
+Ignored in \*(NR.
+.bt "\&\f(CW.cs\fI\|F\|N\|M\fR" "off" "-" "P" "Constant character space
+(width) mode is
+set on for font @F@ (if mounted); the width of every character will be
+taken to be @N@/36 ems.
+If @M@ is absent,
+the em is that of the character's point size;
+if @M@ is given,
+the em is @M@ points.
+All affected characters
+are centered in this space, including those with an actual width
+larger than this space.
+Special Font characters occurring while the current font
+is @F@ are also so treated.
+If @N@ is absent, the mode is turned off.
+The mode must be in effect when the characters are physically printed.
+Ignored in \*(NR.
+.bt "\&\f(CW.bd\fI F N\fR" "off" "-" "P" "The characters in font @F@ will be artificially
+emboldened by printing each one twice, separated by @N-1@ basic units.
+A reasonable value for @N@ is 3 when the character size is near 10 points.
+If @N@ is missing the embolden mode is turned off.
+The emboldening value @N@ is in the \&\f(CW.b\fP register.
+.IP
+.bd R 3
+This paragraph is printed with \&\f(CW.bd R 3\fR.
+The mode must be in effect when the characters are physically printed.
+Ignored in \*(NR.
+.br
+.bd R
+.bt "\&\f(CW.bd S \fIF N\fR" "off" "-" "P" "The characters in the Special font
+will be emboldened whenever the current font is @F@.
+The mode must be in effect when the characters are physically printed.
+Ignored in \*(NR.
+.bt "\&\f(CW.ft\fP @F@" "Roman" "previous" "E" "Font changed to
+@F@.
+Alternatively, embed
+.CW \ef@F@ .
+The font name \&\f(CWP\fR is reserved to mean the previous font,
+and the name
+.CW S
+for the special font.
+.bt "\&\f(CW.fp \fIN F L\fR" "R,I,B,...,S" "ignored" "-" "Font position.
+This is a statement
+that a font named @F@ is associated with position @N@.
+It is a fatal error if @F@ is not known.
+For fonts with names longer than two characters,
+.I L
+refers to the long name,
+and
+.I F
+becomes a synonym.
+There is generally a limit of about 10 mounted fonts.
+.NH
+Page control
+.PP
+Top and bottom margins are not automatically provided;
+it is conventional to define two \fImacros\fR and to set \fItraps\fR
+for them at vertical positions 0 (top) and @-N@ (distance @N@ up from the bottom).
+See §7 and Tutorial Examples §T2.
+A pseudo-page transition onto the first page occurs
+either when the first \fIbreak\fR occurs or
+when the first \fInon-diverted\fR text processing occurs.
+Arrangements
+for a trap to occur at the top of the first page
+must be completed before this transition.
+In the following, references to the \fIcurrent diversion\fR (§7.4)
+mean that the mechanism being described works during both
+ordinary and diverted output (the former considered as the top diversion level).
+.PP
+The limitations on \*(TR and \*(NR output dimensions
+are device dependent.
+.bt "\&\f(CW.pl\fI \(+-N\fR" "11\|in" "11\|in" "\fBv\fR" "Page length set to @+- N@.
+The current page length is available in the \&\f(CW.p\fR register.
+.bt "\&\f(CW.bp\fI \(+-N\fR" "\fIN\(eq\fR1" "-" "B,\fBv\fR" "Begin page.
+The current page is ejected and a new page is begun.
+If @+- N@ is given, the new page number will be @+- N@.
+Also see request \&\f(CWns\fR.
+.bt "\&\f(CW.pn\fI \(+-N\fR" "@N@\(eq1" "ignored" "-" "Page number.
+The next page (when it occurs) will have the page number @+- N@.
+A \&\f(CWpn\fR must occur before the initial pseudo-page transition
+to affect the page number of the first page.
+The current page number is in the \&\f(CW%\fR register.
+.bt "\&\f(CW.po\fI \(+-N\fR" "1\|in; 0" "previous" "\fBv\fR" "Page offset.
+The current \fIleft margin\fR is set to @+- N@.
+The \*(TR initial value provides 1 inch of paper margin
+on a typical device.
+The current page offset is available in the \&\f(CW.o\fR register.
+.bt "\&\f(CW.ne\fI N\fR" "-" "\fIN\(eq\fR1\|\fIV\fR" "D,\fBv\fR" "Need @N@ vertical space.
+If the distance \fID\fR to the next trap position (see §7.5) is less than @N@,
+a forward vertical space of size \fID\fR occurs,
+which will spring the trap.
+If there are no remaining
+traps on the page,
+\fID\fR is the distance to the bottom of the page.
+If @D<V@, another line could still be output
+and spring the trap.
+In a diversion, \fID\fR is the distance to the \fIdiversion trap\fR, if any,
+or is very large.
+.bt "\&\f(CW.mk\fI R\fR" "none" "internal" "D" "Mark the current vertical place
+in an internal register (both associated with the current diversion level),
+or in register @R@, if given.
+See \&\f(CWrt\fR request.
+.bt "\&\f(CW.rt\fI \(+-N\fR" "none" "internal" "D,\fBv\fR" "Return \fIupward only\fR to a marked vertical place
+in the current diversion.
+If @+- N@ (with respect to current place) is given,
+the place is @+- N@ from the top of the page or diversion
+or, if @N@ is absent, to a
+place marked by a previous \&\f(CWmk\fR.
+The \&\f(CWsp\fR request (§5.3) may be used
+instead of \&\f(CWrt\fR
+by spacing to the absolute place stored in a explicit register,
+e.g., using
+.CW ".mk
+@R@ ...\&
+.CW ".sp
+.CW |\en@R@u ;
+this also works when the motion is downwards.
+.NH
+Text Filling, Adjusting, and Centering
+.sc "Filling and adjusting.
+Normally,
+words are collected from input text lines
+and assembled into a output text line
+until some word does not fit.
+An attempt is then made
+to hyphenate the word to put part
+of it into the output line.
+The spaces between the words on the output line
+are then increased to spread out the line
+to the current \fIline length\fR
+minus any current \fIindent\fR.
+A \fIword\fR is any string of characters delimited by
+the \fIspace\fR character or the beginning/end of the input line.
+Any adjacent pair of words that must be kept together
+(neither split across output lines nor spread apart
+in the adjustment process)
+can be tied together by separating them with the
+\fIunpaddable space\fR character
+``\&\f(CW\e\ \fR'' (backslash-space).
+The adjusted word spacings are uniform in \*(TR
+and the minimum interword spacing can be controlled
+with the \&\f(CWss\fR request (§2).
+In \*(NR, they are normally nonuniform because of
+quantization to character-size spaces;
+however,
+the command line option \&\f(CW-e\fR causes uniform
+spacing with full output device resolution.
+Filling, adjustment, and hyphenation (§13) can all be
+prevented or controlled.
+The text length on the last line output is available in the \&\f(CW.n\fR register,
+and text baseline position on the page for this line is in the \&\f(CWnl\fR register.
+The text baseline high-water mark (lowest place) on the current page is in
+the \&\f(CW.h\fR register.
+The current horizontal output position is in the \&\f(CW.k\fP register.
+.PP
+An input text line
+.I ending
+with \&\f(CW.\fR\^, \&\f(CW?\fR, or \&\f(CW!\fR,
+optionally followed by any number of
+.CW \&" ,
+.CW ' ,
+.CW ) ,
+.CW ] ,
+.CW * ,
+or
+†,
+is taken
+to be the end of a sentence, and an additional space character is
+automatically provided during filling.
+To prevent this, add
+.CW \e&
+to the end of the input line.
+Multiple inter-word space characters found in the input are retained,
+except for trailing spaces;
+initial spaces also cause a break.
+.PP
+When filling is in effect, a \&\f(CW\ep\fR may be embedded or attached to a word to
+cause a break at the end of the word and have the resulting output
+line spread out to fill the current line length.
+.PP
+.tr &&
+A text input line that happens to begin
+with a control character can
+be made not to look like a control line
+by prefixing it with
+the non-printing, zero-width filler character \&\f(CW\e&\fR.
+Still another way is to specify output translation of some
+convenient character into the control character
+using \&\f(CWtr\fR (§10.5).
+.tr &.
+.sc "Interrupted text.
+The copying of a input line in \fInofill\f (non-fill) mode can be interrupted
+by terminating
+the partial line with a \&\f(CW\ec\fR.
+The next encountered input text line will be considered to be a continuation
+of the same line of input text.
+Similarly,
+a word within \fIfilled\fR text may be interrupted by terminating the
+word (and line) with \&\f(CW\ec\fR;
+the next encountered text will be taken as a continuation of the
+interrupted word.
+If the intervening control lines cause a break,
+any partial line will be forced out along with any partial word.
+.bt "\&\f(CW.br\fR" "-" "-" "B" "Break.
+The filling of the line currently
+being collected is stopped and
+the line is output without adjustment.
+Text lines beginning with space characters
+(but not tabs)
+and empty text lines (blank lines) also cause a break.
+.bt "\&\f(CW.fi\fR" "fill on" - B,E "Fill subsequent output lines.
+The register \&\f(CW.u\fR is 1 in fill mode and 0 in nofill mode.
+.bt "\&\f(CW.nf\fR" "fill on" "-" "B,E" "Nofill.
+Subsequent output lines are neither filled nor adjusted.
+Input text lines are copied directly to output lines
+without regard for the current line length.
+.bt "\&\f(CW.ad\fI c\fR" "adj, both" "adjust" "E" "Line adjustment is begun.
+If fill mode is not on, adjustment will be deferred until
+fill mode is back on.
+If the type indicator @c@ is present,
+the adjustment type is changed as shown in the following table.
+.TS
+center box;
+c|c
+c|l.
+Indicator Adjust Type
+_
+\&\f(CWl\fR adjust left margin only
+\&\f(CWr\fR adjust right margin only
+\&\f(CWc\fR center
+\&\f(CWb\fR or \&\f(CWn\fR adjust both margins
+absent unchanged
+.TE
+The number register
+.CW .j
+contains the current value of the
+.CW ad
+setting;
+its value can be recorded and used subsequently to set adjustment.
+.bt "\&\f(CW.na\fR" "adjust" "-" "E" "Noadjust.
+Adjustment is turned off;
+the right margin will be ragged.
+The adjustment type for \&\f(CWad\fR is not changed.
+Output line filling still occurs if fill mode is on.
+.bt "\&\f(CW.ce\fI N\fR" "off" "@N=1@" "B,E" "Center the next @N@ input text lines
+within the current available horizontal space (line-length minus indent).
+If @N=0@, any residual count is cleared.
+A break occurs after each of the @N@ input lines.
+If the input line is too long,
+it will be left adjusted.
+.NH
+Vertical Spacing
+.sc "Baseline spacing.
+The vertical spacing @(V)@ between the baselines of successive
+output lines can be set
+using the \&\f(CWvs\fR request.
+\fIV\fR should be large enough to accommodate the character sizes
+on the affected output lines.
+For the common type sizes (9-12 points),
+usual typesetting practice is to set \fIV\fR to 2 points greater than the
+point size;
+\*(TR default is 10-point type on a 12-point spacing
+(as in this document).
+The current \fIV\fR is available in the \&\f(CW.v\fR register.
+Multiple-\fIV\|\fR line separation (e.g., double spacing) may be requested
+with \&\f(CWls\fR,
+but it is better to use a large
+.CW vs
+instead;
+certain preprocessors assume single spacing.
+The current line spacing is available in the \&\f(CW.L\fP register.
+.sc "Extra line-space.
+If a word contains a tall construct requiring
+the output line containing it to have extra vertical space
+before and/or after it,
+the \fIextra-line-space\fR function \&\f(CW\ex'\fIN\fP'\fR
+can be embedded in or attached to that word.
+If @N@ is negative,
+the output line containing the word will
+be preceded by @N@ extra vertical space;
+if @N@ is positive,
+the output line containing the word
+will be followed by @N@ extra vertical space.
+If successive requests for extra space apply to the same line,
+the maximum values are used.
+The most recently utilized post-line extra line-space is available in the \&\f(CW.a\fR register.
+.PP
+In
+.CW \ex'\f2...\fP'
+and other functions having a pair of delimiters around
+their parameter,
+the delimiter choice (here
+.CW ' )
+is arbitrary,
+except that it can not look like the continuation of a number expression for @N@.
+.sc "Blocks of vertical space.
+A block of vertical space is ordinarily requested using \&\f(CWsp\fR,
+which honors the \fIno-space\fR mode and which does
+not space past a trap.
+A contiguous block of vertical space may be reserved using \&\f(CWsv\fR.
+.bt "\&\f(CW.vs \fIN\fR" "12pts; 1/6in" "previous" "E,\fBp\fR" "Set vertical baseline spacing size \fIV\fR.
+Transient extra vertical space is available with \&\f(CW\ex\fI'N\|'\fR (see above).
+.bt "\&\f(CW.ls \fIN\fR" "@N=1@" "previous" "E" "\fILine\fR spacing
+set to @+- N@.
+@N-1@ \fIV\fR\^s (blank lines) are
+appended to each output text line.
+Appended blank lines are omitted, if the text or previous appended blank line reached a trap position.
+.bt "\&\f(CW.sp \fIN\fR" "-" "@N=1~V@" "B,\fBv\fR" "Space vertically in either direction.
+If @N@ is negative, the motion is backward (upward)
+and is limited to the distance to the top of the page.
+Forward (downward) motion is truncated to the distance to the
+nearest trap.
+(Recall the use of
+.CW ".sp |\f2N\fP
+from §1.3.)
+If the no-space mode is on,
+no spacing occurs (see \&\f(CWns\fR and \&\f(CWrs\fR below).
+.bt "\&\f(CW.sv\fI N\fR" "-" "@N=1~V@" "\fBv\fR" "Save a contiguous vertical block of size @N@.
+If the distance to the next trap is greater
+than @N@, @N@ vertical space is output.
+No-space mode has no effect.
+If this distance is less than @N@,
+no vertical space is immediately output,
+but @N@ is remembered for later output (see \&\f(CWos\fR).
+Subsequent \&\f(CWsv\fR requests will overwrite any still remembered @N@.
+.bt "\&\f(CW.os\fR" "-" "-" "-" "Output saved vertical space.
+No-space mode has no effect.
+Used to finally output a block of vertical space requested
+by an earlier \&\f(CWsv\fR request.
+.bt "\&\f(CW.ns\fR" "space" "-" "D" "No-space mode turned on.
+When on, no-space mode inhibits \&\f(CWsp\fR requests and
+\&\f(CWbp\fR requests \fIwithout\fR a next page number.
+No-space mode is turned off when a line of
+output occurs, or with \&\f(CWrs\fR.
+.bt "\&\f(CW.rs\fR" "space" "-" "D" "Restore spacing.
+The no-space mode is turned off.
+.bt "\&Blank text line." "" "-" "B" "Causes a break and
+output of a blank line exactly like \&\f(CWsp 1\fR.
+.NH
+Line Length and Indenting
+.PP
+The maximum line length for fill mode may be set with \&\f(CWll\fR.
+The indent may be set with \&\f(CWin\fR;
+an indent applicable to only the next output line may be set with \&\f(CWti\fR.
+The line length includes indent space but not
+page offset space.
+The line length minus the indent is the basis for centering with \&\f(CWce\fR.
+The effect of \&\f(CWll\fR, \&\f(CWin\fR, or \&\f(CWti\fR
+is delayed, if a partially collected line exists,
+until after that line is output.
+In fill mode the length of text on an output line is less than or equal to
+the line length minus the indent.
+The current line length and indent are available in registers \&\f(CW.l\fR and \&\f(CW.i\fR respectively.
+The length of \fIthree-part titles\fR produced by \&\f(CWtl\fR
+(see §14) is independently set by \&\f(CWlt\fR.
+.bt "\&\f(CW.ll\fI \(+-N\fR" "6.5\|in" "previous" "E,\fBm\fR" "Line length is set to \(+-@N@.
+.bt "\&\f(CW.in\fI \(+-N\fR" "\fIN\(eq\^\fR0" "previous" "B,E,\fBm\fR" "Indent is set to @+- N@.
+The indent is prefixed to each output line.
+.bt "\&\f(CW.ti\fI \(+-N\fR" "-" "ignored" "B,E,\fBm\fR" "Temporary indent.
+The next output text line will be indented a distance @+- N@
+with respect to the current indent.
+The resulting total indent may not be negative.
+The current indent is not changed.
+.NH
+Macros, Strings, Diversion, and Position Traps
+.sc "Macros and strings.
+A \fImacro\fR is a named set of arbitrary \fIlines\fR that may be invoked by name or
+with a \fItrap\fR.
+A \fIstring\fR is a named string of \fIcharacters\fR,
+not including a newline character,
+that may be interpolated by name at any point.
+Request, macro, and string names share the same name list.
+Macro and string names
+may be one or two characters long and may usurp previously defined
+request, macro, or string names;
+this implies that built-in operations may be (irrevocably) redefined.
+Any of these entities may be renamed with \&\f(CWrn\fR
+or removed with \&\f(CWrm\fR.
+.PP
+Macros are created by \&\f(CWde\fR and \&\f(CWdi\fR, and appended to by \&\f(CWam\fR and \&\f(CWda\fR;
+\&\f(CWdi\fR and \&\f(CWda\fR cause normal output to be stored in a macro.
+A macro is invoked in the same way as a request;
+a control line beginning \&\f(CW.\fIxx\fR will interpolate the contents of macro \fIxx\fR.
+The remainder of the line may contain up to nine \fIarguments\fR.
+.PP
+Strings are created by \&\f(CWds\fR and appended to by \&\f(CWas\fR.
+The strings \fIx\fR and \fIxx\fR are interpolated at any desired point with
+\&\f(CW\e\(**\fIx\fR and \&\f(CW\e\(**(\fIxx\fR respectively.
+String references and macro invocations may be nested.
+.sc "Copy mode input interpretation.
+During the definition and extension
+of strings and macros (not by diversion)
+the input is read in \fIcopy mode\fR.
+In copy mode, input is copied without interpretation
+except that:
+.IP
+.ds + \v'-.1m'\s-4\(bu\s+4\v'+.1m'
+.nf
+\*+ The contents of number registers indicated by \&\f(CW\en\fR are interpolated.
+\*+ Strings indicated by \&\f(CW\e\(**\fR are interpolated.
+\*+ Arguments indicated by \&\f(CW\e$\fR are interpolated.
+\*+ Concealed newlines indicated by \&\f(CW\e\fP\f2newline\fP are eliminated.
+\*+ Comments indicated by \&\f(CW\e"\fR are eliminated.
+\*+ \&\f(CW\et\fR and \&\f(CW\ea\fR are interpreted as \s-1ASCII\s+1 horizontal tab and \s-1SOH\s+1 respectively (§9).
+\*+ \&\f(CW\e\e\fR is interpreted as \&\f(CW\e\fR.
+\*+ \&\f(CW\e.\fR is interpreted as ``\&\f(CW.\fR''.
+.LP
+These interpretations can be suppressed by
+prefixing
+a \&\f(CW\e\fR.
+For example, since \&\f(CW\e\e\fR maps into a \&\f(CW\e\fR, \&\f(CW\e\en\fR will copy as \&\f(CW\en\fR, which
+will be interpreted as a number register indicator when the
+macro or string is reread.
+.sc "Arguments.
+When a macro is invoked by name, the remainder of the line is
+taken to contain up to nine arguments.
+The argument separator is the space character (not tab), and arguments
+may be surrounded by double quotes to permit embedded space characters.
+Pairs of double quotes may be embedded in double-quoted arguments to
+represent a single double-quote character.
+The argument
+.CW \&""
+is explicitly null.
+If the desired arguments won't fit on a line,
+a concealed newline may be used to continue on the next line.
+A trailing double quote may be omitted.
+.PP
+When a macro is invoked the \fIinput level\fR is \fIpushed down\fR and
+any arguments available at the previous level become unavailable
+until the macro is completely read and the previous level is restored.
+A macro's own arguments can be interpolated at any point
+within the macro with
+.CW \e$@N@ ,
+which interpolates the @N@\^th
+argument
+(@1 <= N <= 9@).
+If an invoked argument does not exist,
+a null string results.
+For example, the macro \fIxx\fR may be defined by
+.P1
+.ta .75i
+&de xx \e" begin definition
+Today is \e\e$1 the \e\e$2.
+&. \e" end definition
+.P2
+and called by
+.P1
+&xx Monday 14th
+.P2
+to produce the text
+.P1
+Today is Monday the 14th.
+.P2
+Note that each \&\f(CW\e$\fR
+was concealed in the definition with a prefixed \&\f(CW\e\fR.
+The number of
+arguments is in the \&\f(CW.$\fR register.
+.PP
+No arguments are available at the top (non-macro) level,
+within a string, or within a trap-invoked macro.
+.PP
+Arguments are copied in copy mode onto a stack
+where they are available for reference.
+It is advisable to
+conceal string references (with an extra \&\f(CW\e\fR\|)
+to delay interpolation until argument reference time.
+.sc "Diversions.
+Processed output may be diverted into a macro for purposes
+such as footnote processing (see Tutorial §T5)
+or determining the horizontal and vertical size of some text for
+conditional changing of pages or columns.
+A single diversion trap may be set at a specified vertical position.
+The number registers \&\f(CWdn\fR and \&\f(CWdl\fR respectively contain the
+vertical and horizontal size of the most
+recently ended diversion.
+Processed text that is diverted into a macro
+retains the vertical size of each of its lines when reread
+in \fInofill\fR mode
+regardless of the current \fIV\fR.
+Constant-spaced (\&\f(CWcs\fR) or emboldened (\&\f(CWbd\fR) text that is diverted
+can be reread correctly only if these modes are again or still in effect
+at reread time.
+One way to do this is to embed in the diversion the appropriate
+\&\f(CWcs\fR or \&\f(CWbd\fR requests with the \fItransparent\fR
+mechanism described in §10.6.
+.PP
+Diversions may be nested
+and certain parameters and registers
+are associated
+with the current diversion level
+(the top non-diversion level may be thought of as the
+0th diversion level).
+These are the diversion trap and associated macro,
+no-space mode,
+the internally-saved marked place (see \&\f(CWmk\fR and \&\f(CWrt\fR),
+the current vertical place (\&\f(CW.d\fR register),
+the current high-water text baseline (\&\f(CW.h\fR register),
+and the current diversion name (\&\f(CW.z\fR register).
+.sc "Traps.
+Three types of trap mechanisms are available\(empage traps, a diversion trap, and
+an input-line-count trap.
+Macro-invocation traps may be planted using \&\f(CWwh\fR at any page position including the top.
+This trap position may be changed using \&\f(CWch\fR.
+Trap positions at or below the bottom of the page
+have no effect unless or until
+moved to within the page or rendered effective by an increase in page length.
+Two traps may be planted at the same position only by first planting them at different
+positions and then moving one of the traps;
+the first planted trap will conceal the second unless and until the first one is moved
+(see Tutorial Examples).
+If the first one is moved back, it again conceals the second trap.
+The macro associated with a page trap is automatically
+invoked when a line of text is output whose vertical size reaches
+or sweeps past the trap position.
+Reaching the bottom of a page springs the top-of-page trap, if any,
+provided there is a next page.
+The distance to the next trap position is available in the \&\f(CW.t\fR register;
+if there are no traps between the current position and the bottom of the page,
+the distance returned is the distance to the page bottom.
+.PP
+A macro-invocation trap effective in the current diversion may be planted using \&\f(CWdt\fR.
+The \&\f(CW.t\fR register works in a diversion; if there is no subsequent trap a large
+distance is returned.
+For a description of input-line-count traps, see \&\f(CWit\fR below.
+.bt "\&\f(CW&de\fI xx yy\fR" "-" "\fI.yy=\&\f(CW..\fR" "-" "Define or redefine the macro \fIxx\fR.
+The contents of the macro begin on the next input line.
+Input lines are copied in \fIcopy mode\fR until the definition is terminated by a
+line beginning with \&\f(CW.\fIyy\fR,
+whereupon the macro \fIyy\fR is called.
+In the absence of \fIyy\fR, the definition
+is terminated by a
+line beginning with ``\&\f(CW..\fR''.
+A macro may contain \&\f(CWde\fR requests
+provided the terminating macros differ
+or the contained definition terminator is concealed.
+\&``\&\f(CW..\fR'' can be concealed as
+\&\f(CW\e\e..\fR which will copy as \&\f(CW\e..\fR and be reread as ``\&\f(CW..\fR''.
+.bt "\&\f(CW&am\fI xx yy\fR" "-" "\fI.yy=\&\f(CW..\fR" "-" "Append to macro
+.I xx
+(append version of \&\f(CWde\fR).
+.bt "\&\f(CW&ds\fI xx string\fR" "-" "ignored" "-" "Define a string
+\fIxx\fR containing \fIstring\fR.
+Any initial double quote in \fIstring\fR is stripped off to permit
+initial blanks.
+.bt "\&\f(CW&as\fI xx string\fR" "-" "ignored" "-" "Append
+\fIstring\fR to string \fIxx\fR
+(append version of \&\f(CWds\fR).
+.bt "\&\f(CW&rm\fI xx\fR" "-" "ignored" "-" "Remove
+request, macro, or string.
+The name \fIxx\fR is removed from the name list and
+any related storage space is freed.
+Subsequent references will have no effect.
+If many macros and strings are being created dynamically, it
+may become necessary to remove unused ones
+to recapture internal storage space for newer registers.
+.bt "\&\f(CW&rn\fI xx yy\fR" "-" "ignored" "-" "Rename request, macro, or string
+\fIxx\fR to \fIyy\fR.
+If \fIyy\fR exists, it is first removed.
+.bt "\&\f(CW&di\fI xx\fR" "-" "end" "D" "Divert output to macro \fIxx\fR.
+Normal text processing occurs during diversion
+except that page offsetting is not done.
+The diversion ends when the request \&\f(CWdi\fR or \&\f(CWda\fR is encountered without an argument;
+extraneous
+requests of this type should not appear when nested diversions are being used.
+.bt "\&\f(CW&da \fIxx\fR" "-" "end" "D" "Divert, appending to macro \fIxx\fR
+(append version of \&\f(CWdi\fR).
+.bt "\&\f(CW&wh\fI N xx\fR" "-" "-" "\fBv\fR" "Install
+a trap to invoke \fIxx\fR at page position \fIN\fR;
+a negative N will be interpreted as a distance from the
+page bottom.
+Any macro previously planted at @N@ is replaced by \fIxx\fR.
+A zero @N@ refers to the top of a page.
+In the absence of \fIxx\fR, the first trap found at @N@, if any, is removed.
+.bt "\&\f(CW&ch\fI xx N\fR" "-" "-" "\fBv\fR" "Change
+the trap position for macro \fIxx\fR to be @N@.
+In the absence of @N@, the trap, if any, is removed.
+.bt "\&\f(CW&dt\fI N xx\fR" "-" "off" "D,\fBv\fR" "Install a diversion trap
+at position @N@ in the \fIcurrent\fR diversion to invoke
+macro \fIxx\fR.
+Another \&\f(CWdt\fR will redefine the diversion trap.
+If no arguments are given, the diversion trap is removed.
+.bt "\&\f(CW&it\fI N xx\fR" "-" "off" "E" "Set an input-line-count trap
+to invoke the macro \fIxx\fR after @N@ lines of \fItext\fR input
+have been read
+(control or request lines do not count).
+The text may be inline text or
+text interpolated by inline or trap-invoked macros.
+.bt "\&\f(CW&em\fI xx\fR" "none" "none" "-" "The
+macro \fIxx\fR will be invoked
+when all input has ended.
+The effect is almost as if the contents of \fIxx\fR had been at the end
+of the last file processed,
+but all processing ceases at the next page eject.
+.NH
+Number Registers
+.PP
+A variety of parameters are available to the user as
+predefined \fInumber registers\fR (see Summary, page \n(*%).
+In addition, users may define their own registers.
+Register names are one or two characters long and do not conflict
+with request, macro, or string names.
+Except for certain predefined read-only registers,
+a number register can be read, written, automatically
+incremented or decremented, and interpolated
+into the input in a variety of formats.
+One common use of user-defined registers is to
+automatically number sections, paragraphs, lines, etc.
+A number register may be used any time numerical input is expected or desired
+and may be used in numerical \fIexpressions\fR (§1.4).
+.PP
+Number registers are created and modified using \&\f(CWnr\fR, which
+specifies the name, numerical value, and the auto-increment size.
+Registers are also modified, if accessed
+with an auto-incrementing sequence.
+If the registers \fIx\fR and \fIxx\fR both contain
+@N@ and have the auto-increment size @M@,
+the following access sequences have the effect shown:
+.TS
+center box;
+c2|c2|c
+c2|c2|c2
+l2|c2|c2
+l2|c2|c2
+l2|l2|c2.
+ Effect on Value
+Sequence Register Interpolated
+_
+\&\f(CW\en\fIx\fR none @N@
+\&\f(CW\en(\fIxx\fR none @N@
+\&\f(CW\en+\fIx\fR \fIx\fR incremented by @M@ \fIN+M\fR
+\&\f(CW\en-\fIx\fR \fIx\fR decremented by @M@ \fIN-M\fR
+\&\f(CW\en+(\fIxx\fR \fIxx\fR incremented by @M@ \fIN+M\fR
+\&\f(CW\en-(\fIxx\fR \fIxx\fR decremented by @M@ \fIN-M\fR
+.TE
+When interpolated, a number register is converted to
+decimal (default),
+decimal with leading zeros,
+lower-case Roman,
+upper-case Roman,
+lower-case sequential alphabetic,
+or
+upper-case sequential alphabetic
+according to the format specified by \&\f(CWaf\fR.
+.bt "\&\f(CW&nr\fI R \(+-N M\fR" "" "-" "\fBu\fR" "The number register
+@R@ is assigned the value @+- N@
+with respect to the previous value, if any.
+The increment for auto-incrementing is set to @M@.
+.bt "\&\f(CW&af\fI R c\fR" "arabic" "-" "-" "Assign
+format @c@ to register @R@.
+The available formats are:
+.Tm number register format s
+.TS
+center box;
+c2|c
+c2|c
+c2|l.
+ Numbering
+Format Sequence
+_
+\&\f(CW1\fR 0, 1, 2, 3, 4, 5, ...
+\&\f(CW001\fR 000, 001, 002, 003, 004, 005, ...
+\&\f(CWi\fR 0, i, ii, iii, iv, v, ...
+\&\f(CWI\fR 0, I, II, III, IV, V, ...
+\&\f(CWa\fR 0, a, b, c, ..., z, aa, ab, ..., zz, aaa, ...
+\&\f(CWA\fR 0, A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, ...
+.TE
+An arabic format having @N@ digits
+specifies a field width of @N@ digits (example 2 above).
+The read-only registers and the width function
+.CW \ew
+(§11.2)
+are always arabic.
+Warning: the value of a number register in a non-Arabic format
+is not numeric, and will not produce the expected results in expressions.
+.IP
+The function
+.CW \eg@x@
+or
+.CW \eg(@xx@
+returns the format of a number register in a form suitable for
+.CW af ;
+it returns nothing if the register has not been used.
+.bt "\&\f(CW&rr\fI R\fR" "-" "ignored" "-" "Remove number register @R@.
+If many registers are being created dynamically, it
+may become necessary to remove unused registers
+to recapture internal storage space for newer registers.
+The register
+.CW .R
+contains the number of number registers still available.
+.NH
+Tabs, Leaders, and Fields
+.sc "Tabs and leaders.
+The \s-1ASCII\s+1 horizontal tab character and the \s-1ASCII\s+1
+\s-1SOH\s+1 (control-A, hereafter called the \fIleader\fR character)
+can both be used to generate either horizontal motion or
+a string of repeated characters.
+The length of the generated entity is governed
+by internal \fItab stops\fR specifiable
+with \&\f(CWta\fR.
+The default difference is that tabs generate motion and leaders generate
+a string of periods;
+\&\f(CWtc\fR and \&\f(CWlc\fR
+offer the choice of repeated character or motion.
+There are three types of internal tab stops\(em\
+\fIleft\fR adjusting, \fIright\fR adjusting,
+and \fIcentering\fR.
+In the following table,
+\fID\fR is the distance from the current position on the \fIinput\fR line
+(where a tab or leader was found)
+to the next tab stop,
+\fInext-string\fR consists
+of the input characters following the tab (or leader) up to the next tab (or leader) or end of line,
+and
+\fIW\fR is the width of \fInext-string\fR.
+.TS
+center box;
+c2|c2|c
+c2|c2|c
+c2|c2|l.
+Tab Length of motion or Location of
+type repeated characters \fInext-string\fR
+_
+Left \fID\fR Following \fID\fR
+Right \fID-W\fR Right adjusted within \fID\fR
+Centered \fID-W/\fR2 Centered on right end of \fID\fR
+.TE
+The length of generated motion is allowed to be negative, but
+that of a repeated character string cannot be.
+Repeated character strings contain an integer number of characters, and
+any residual distance is prepended as motion.
+Tabs or leaders found after the last tab stop are ignored, but may be used
+as \fInext-string\fR terminators.
+.PP
+Tabs and leaders are not interpreted in copy mode.
+\&\f(CW\et\fR and \&\f(CW\ea\fR always generate a non-interpreted
+tab and leader respectively, and
+are equivalent to actual tabs and leaders in copy mode.
+.sc "Fields.
+A \fIfield\fR is contained between
+a pair of \fIfield delimiter\fR characters,
+and consists of substrings
+separated by \fIpadding\fR indicator characters.
+The field length is the distance on the
+\fIinput\fR line from the position where the field begins to the next tab stop.
+The difference between the total length of all the substrings
+and the field length is incorporated as horizontal
+padding space that is divided among the indicated
+padding places.
+The incorporated padding is allowed to be negative.
+For example,
+if the field delimiter is \&\f(CW#\fR and the padding indicator is \&\f(CW^\fR,
+\&\f(CW#^\fIxxx\&\f(CW^\fIright\|\&\f(CW#\fR
+specifies a right-adjusted string with the string \fIxxx\fR centered
+in the remaining space.
+.h1
+.bt "\&\f(CW&ta\fI Nt ...\fR" "0.8; 0.5in" "none" "E,\fBm\fR" "Set tab stops and types.
+\fIt=\&\f(CWR\fR, right adjusting;
+\fIt=\&\f(CWC\fR, centering;
+\fIt\fR absent, left adjusting.
+\*(Tr tab stops are preset every 0.5in.,
+\*(NR every 0.8in.
+The stop values are separated by spaces, and
+a value preceded by \&\f(CW+\fR
+is treated as an increment to the previous stop value.
+.bt "\&\f(CW&tc\fI c\fR" "none" "none" "E" "The tab repetition character
+becomes @c@,
+or is removed, thus specifying motion.
+.bt "\&\f(CW&lc\fI c\fR" "\&\f(CW.\fR" "none" "E" "The leader repetition character
+becomes @c@,
+or is removed, thus specifying motion.
+.bt "\&\f(CW&fc\fI a b\fR" "off" "off" "-" "The field delimiter
+is set to \fIa\fR;
+the padding indicator is set to the space character or to
+\fIb\fR, if given.
+In the absence of arguments the field mechanism is turned off.
+.NH
+Input and Output Conventions and Character Translations
+.sc "Input character translations.
+Ways of inputting the valid character set were
+discussed in §2.1.
+The \s-1ASCII\s+1 control characters horizontal tab (§9.1),
+\s-1SOH\s+1 (§9.1), and backspace (§10.3) are discussed elsewhere.
+The newline delimits input lines.
+In addition,
+\s-1STX\s+1, \s-1ETX\s+1, \s-1ENQ\s+1, \s-1ACK\s+1, and \s-1BEL\s+1
+are accepted,
+and may be used as delimiters or translated into a graphic with \&\f(CWtr\fR (§10.5).
+All others are ignored.
+.PP
+The \fIescape\fR character \&\f(CW\e\fR
+introduces \fIescape sequences\fR,
+which cause the following character to mean
+another character, or to indicate
+some function.
+.nr %% \n(*%-1
+A complete list of such sequences is given in the Summary on page \n(*%.
+The escape character \&\f(CW\e\fR
+should not be confused with the \s-1ASCII\s+1 control character \s-1ESC\s+1.
+The escape character \&\f(CW\e\fR can be input with the sequence \&\f(CW\e\e\fR.
+The escape character can be changed with \&\f(CWec\fR,
+and all that has been said about the default \&\f(CW\e\fR becomes true
+for the new escape character.
+\&\f(CW\ee\fR can be used to print whatever the current escape character is.
+The escape mechanism may be turned off with \&\f(CWeo\fR,
+and restored with \&\f(CWec\fR.
+.h1
+.bt "\&\f(CW&ec\fI c\fR" "\&\f(CW\e\fR" "\&\f(CW\e\fR" "-" "Set escape character
+to \&\f(CW\e\fR, or to @c@, if given.
+.bt "\&\f(CW&eo\fR" "on" "-" "-" "Turn escape mechanism off.
+.sc "Ligatures.
+.lg0
+The set of available ligatures is device and font dependent,
+but is often a subset of
+\&\fBfi\fR, \&\fBfl\fR, \&\fBff\fR, \&\fBffi\fR, and \&\fBffl\fR.
+They may be input by
+\&\f(CW\e(fi\fR, \&\f(CW\e(fl\fR, \&\f(CW\e(ff\fR, \&\f(CW\e(Fi\fR, and \&\f(CW\e(Fl\fR respectively.
+.lg
+The ligature mode is normally on in \*(TR, and automatically invokes
+ligatures during input.
+.h1
+.bt "\&\f(CW&lg\fI N\fR" "on; off" "on" "-" "Ligature mode
+is turned on if @N@ is absent or non-zero,
+and turned off if @N=0@.
+If @N=2@, only the two-character ligatures are automatically invoked.
+Ligature mode is inhibited for
+request, macro, string, register, or file names,
+and in copy mode.
+No effect in \*(NR.
+.sc "Backspacing, underlining, overstriking, etc.
+Unless in copy mode, the \s-1ASCII\s+1 backspace character is replaced
+by a backward horizontal motion having the width of the
+space character.
+Underlining as a form of line-drawing is discussed in §12.4.
+A generalized overstriking function is described in §12.1.
+.PP
+\*(Nr automatically underlines
+characters in the \fIunderline\fR font,
+specifiable with \&\f(CWuf\fR,
+normally that on font position 2.
+In addition to \&\f(CWft\fR and
+.CW \ef@F@ ,
+the underline font may be selected by \&\f(CWul\fR and \&\f(CWcu\fR.
+Underlining is restricted to an output-device-dependent
+subset of reasonable characters.
+.bt "\&\f(CW&ul\fI N\fR" "off" "@N=1@" "E" "Italicize in \*(TR
+(underline in \*(NR) the next @N@
+input text lines.
+Actually, switch to underline font, saving the
+current font for later restoration;
+other font changes within the span of a \&\f(CWul\fR
+will take effect,
+but the restoration will undo the last change.
+Output generated by \&\f(CWtl\fR (§14) is affected by the
+font change, but does not decrement @N@.
+If @N>1@, there is the risk that
+a trap interpolated macro may provide text
+lines within the span;
+environment switching can prevent this.
+.bt "\&\f(CW&cu\fI N\fR" "off" "@N=1@" "E" "Continuous underline.
+A variant
+of \&\f(CWul\fR that causes \fIevery\fR character to be underlined in \*(NR.
+Identical to \&\f(CWul\fR in \*(TR.
+.bt "\&\f(CW&uf\fI F\fR" "Italic" "Italic" "-" "Underline font set to @F@.
+In \*(NR,
+@F@ may not be on position 1.
+.sc "Control characters.
+Both the control character \&\f(CW.\fR and the \fIno-break\fR
+control character \&\f(CW'\fR may be changed.
+Such a change must be compatible with the design
+of any macros used in the span of the change,
+and
+particularly of any trap-invoked macros.
+.bt "\&\f(CW&cc\fI c\fR" "\&\f(CW.\fR" "\&\f(CW.\fR" "E" "The basic control character
+is set to @c@,
+or reset to ``\&\f(CW.\fR''.
+.bt "\&\f(CW&c2\fI c\fR" "\&\f(CW'" "'\fR" "E" "The \fIno-break\fR control character is set
+to @c@, or reset to ``\&\f(CW'\fR''.
+.sc "Output translation.
+One character can be made a stand-in for another character using \&\f(CWtr\fR.
+All text processing (e.g., character comparisons) takes place
+with the input (stand-in) character, which appears to have the width of the final
+character.
+The graphic translation occurs at the moment of output
+(including diversion).
+.bt "\&\f(CW&tr\fI abcd....\fR" "none" "-" "O" "Translate
+\fIa\fR into \fIb\fR, @c@ into \fId\fR, etc.
+If an odd number of characters is given,
+the last one will be mapped into the space character.
+To be consistent, a particular translation
+must stay in effect from \fIinput\fR to \fIoutput\fR time.
+.sc "Transparent throughput.
+An input line beginning with a \&\f(CW\e!\fR is read in copy mode and \fItrans\%parently\fR output
+(without the initial \&\f(CW\e!\fR);
+the text processor is otherwise unaware of the line's presence.
+This mechanism may be used to pass control information to a post-processor
+or to embed control lines in a macro created by a diversion.
+.sc "Transparent output
+The sequence
+.CW \eX'@anything@'
+copies
+.I anything
+to the output, as a device control function of the form
+.CW x
+.CW X
+.I anything
+(§22).
+Escape sequences in
+.I anything
+are processed.
+.sc "Comments and concealed newlines.
+An uncomfortably long input line that must stay
+one line (e.g., a string definition, or nofilled text)
+can be split into several physical lines by ending all but
+the last one with the escape \&\f(CW\e\fR.
+The sequence \&\f(CW\e\fR@newline@ is always ignored,
+except in a comment.
+Comments may be embedded at the end of any line by
+prefacing them with \&\f(CW\e"\fR.
+The newline at the end of a comment cannot be concealed.
+A line beginning with \&\f(CW\e"\fR will appear as a blank line and
+behave like
+.CW ".sp\ 1" ;
+a comment can be on a line by itself by beginning the line with \&\f(CW.\e"\fR.
+.NH
+Local Horizontal and Vertical Motions, and the Width Function
+.sc "Local Motions.
+The functions \&\f(CW\ev'\fIN\&\f(CW'\fR and
+\&\f(CW\eh'\fIN\&\f(CW'\fR
+can be used for \fIlocal\fR vertical and horizontal motion respectively.
+The distance @N@ may be negative; the positive directions
+are rightward and downward.
+A local motion is one contained within a line.
+To avoid unexpected vertical dislocations, it is necessary that
+the net vertical local motion within a word in filled text
+and otherwise within a line balance to zero.
+The escape sequences providing local motion are
+summarized in the following table.
+.ds Y \0\0\0
+.KS
+.TS
+center box;
+c2|cs2||c2|cs2
+c1|c2c2||c2|c2c2.
+Vertical Effect in Horizontal Effect in
+Local Motion \*(TR \*(NR Local Motion \*(TR \*(NR
+_
+.sp.4
+.TC
+l2|ls2||l2|ls2.
+\&\f(CW\*Y\ev'\fIN\|\f(CW'\fR Move distance @N@ \
+\&\f(CW\*Y\eh'\fIN\|\f(CW'\fR Move distance @N@
+.TC
+_2|_2_2||l2|ls2.
+x x x \&\f(CW\*Y\e\fP\f2space\fP Unpaddable space-size space
+.TC
+l2|l2|l2||l2|ls2.
+\&\f(CW\*Y\eu\fR ½ em up ½ line up \&\f(CW\*Y\e0\fR Digit-size space
+.TC
+l2|l2|l2||_2|_2_2.
+\&\f(CW\*Y\ed\fR ½ em down ½ line down x x x
+.TC
+l2|l2|l2||l2|l2|l2.
+\&\f(CW\*Y\er\fR 1 em up 1 line up \&\f(CW\*Y\e|\fR 1/6 em space ignored
+ \&\f(CW\*Y\e^\fR 1/12 em space ignored
+.sp.4
+.TE
+.KE
+As an example,
+\&\f(CWE\s-2\v'-.4m'2\v'.4m'\s+2\fR
+could be generated by a sequence of size changes and motions:
+\&\f(CWE\es-2\ev'-0.4m'2\ev'0.4m'\es+2\fR;
+note that
+the 0.4 em vertical motions are at the smaller size.
+.sc "Width Function.
+The \fIwidth\fR function \&\f(CW\ew'\fIstring\&\f(CW'\fR
+generates the numerical width of \fIstring\fR (in basic units).
+Size and font changes may be embedded in \fIstring\fR,
+and will not affect the current environment.
+For example,
+\&\&\f(CW.ti\ -\ew'\efB1.\ 'u\fR could be used to
+temporarily indent leftward a distance equal to the
+size of the string ``\&\f(CW1.\ \fR'' in font
+.CW B .
+.PP
+The width function also sets three number registers.
+The registers \&\f(CWst\fR and \&\f(CWsb\fR are set respectively to the highest and
+lowest extent of \fIstring\fR relative to the baseline;
+then, for example,
+the total height of the string is \&\f(CW\en(stu-\en(sbu\fR.
+In \*(TR the number register \&\f(CWct\fR is set to a value
+between 0 and 3.
+The value
+0 means that all of the characters in \fIstring\fR were short lower
+case characters without descenders (like \&\f(CWe\fR);
+1 means that at least one character has a descender (like \&\f(CWy\fR);
+2 means that at least one character is tall (like \&\f(CWH\fR);
+and 3 means that both tall characters and characters with
+descenders are present.
+.sc "Mark horizontal place.
+The function \&\f(CW\ek\fIx\fR causes the current horizontal
+position in the \fIinput line\fR to be stored in register \fIx\fR.
+For example,
+the construction \&\f(CW\ekx\fIword\f(CW\eh'|\enxu+3u'\fIword\&\f(CW\fR
+will embolden \fIword\fR by backing up to almost its beginning and overprinting it,
+resulting in \kz\fIword\fR\h'|\nzu+3u'\fIword\fR.
+.NH
+Overstrike, Bracket, Line-drawing, Graphics, and Zero-width Functions
+.sc "Overstriking.
+Automatically centered overstriking of up to nine characters
+is provided by the \fIoverstrike\fR function
+\&\f(CW\eo'\fIstring\&\f(CW\|'\fR.
+The characters in \fIstring\fR are overprinted with centers aligned; the total width
+is that of the widest character.
+\fIstring\fR may not contain local vertical motion.
+As examples,
+\&\f(CW\eo'e\e''\fR produces \o'e\'', and
+\&\f(CW\eo'\e(mo\e(sl'\fR produces \o'\(mo\(sl'.
+.sc "Zero-width characters.
+The function
+.CW \ez@c@
+will output @c@ without spacing over
+it, and can be used to produce left-aligned overstruck
+combinations.
+As examples,
+\&\f(CW\ez□+\fR will produce \z□+, and
+\&\f(CW\e(br\ez\e(rn\e(ul\e(br\fR will produce a small
+badly constructed box \&\(br\z\(rn\(ul\(br\|.
+.sc "Large Brackets.
+The Special Font usually contains a number of bracket construction pieces
+\|\|\(lt\|\|\(lb\|\|\(rt\|\|\(rb\|\|\(lk\|\|\(rk\|\|\(bv\|\|\(lf\|\|\(rf\|\|\(lc\|\|\(rc\|\|
+that can be combined into various bracket styles.
+The function \&\f(CW\eb'\fIstring\&\f(CW\|'\fR may be used to pile
+up vertically the characters in \fIstring\fR
+(the first character on top and the last at the bottom);
+the characters are vertically separated by 1 em and the total
+pile is centered 1/2 em above the current baseline
+(½ line in \*(NR).
+For example,
+.P1
+\eb'\e(lc\e(lf'E\eb'\e(rc\e(rf'\ex'-0.5m'\ex'0.5m'
+.P2
+produces
+\x'-.5m'\x'.5m'\b'\(lc\(lf'E\b'\(rc\(rf'.
+.sc "Line drawing.
+.tr &&
+The function \&\f(CW\el'\fINc\f(CW'\fR (backslash-ell) draws a string of repeated @c@'s towards the right for a distance @N@.
+If @c@ looks like a continuation of
+an expression for @N@, it may be insulated from @N@ with \&\f(CW\e&\fR.
+If @c@ is not specified, the \&\f(CW\(ru\fR (baseline rule) is used
+(underline character in \*(NR).
+If @N@ is negative, a backward horizontal motion
+of size @N@ is made before drawing the string.
+Any space resulting from @N@/(size of @c@) having a remainder is put at the beginning (left end)
+of the string.
+If @N@ is less than the width of @c@,
+a single @c@ is centered on a distance @N@.
+In the case of characters
+that are designed to be connected, such as
+baseline-rule\ \&\f(CW\(ru\fR\|,
+under-rule\ \&\f(CW\(ul\fR\|,
+and
+root-en\ \&\f(CW\(rn\fR\|,
+the remainder space is covered by overlapping.
+As an example, a macro to underscore a string can be written
+.tr &.
+.P1
+.ne 2.1
+&de us
+\e\e$1\e\|l\|'|0\e(ul'
+&&
+.P2
+.ne2.1
+.de xu
+\\$1\l'|0\(ul'
+..
+or one to draw a box around a string
+.P1
+&de bx
+\e(br\e|\e\e$1\e|\e(br\e\|l\|'|0\e(rn'\e\|l\|'|0\e(ul'
+&&
+.P2
+.de bx
+\(br\|\\$1\|\(br\l'|0\(rn'\l'|0\(ul'
+..
+such that
+.P1
+&ul "underlined words"
+.P2
+and
+.P1
+&bx "words in a box"
+.P2
+yield
+.xu "underlined words"
+and
+.bx "words in a box"
+\h'-\w'.'u'.
+.PP
+The function \&\f(CW\eL'\fINc\&\f(CW'\fR draws a vertical line consisting
+of the (optional) character @c@ stacked vertically apart 1\|em
+(1 line in \*(NR),
+with the first two characters overlapped,
+if necessary, to form a continuous line.
+The default character is the \fIbox rule\fR \|\(br\| (\&\f(CW\|\e(br\fR);
+the other suitable character is the \fIbold vertical\fR \|\(bv\| (\&\f(CW\|\e(bv\fR).
+The line is begun without any initial motion relative to the
+current baseline.
+A positive @N@ specifies a line drawn downward and
+a negative @N@ specifies a line drawn upward.
+After the line is drawn no compensating
+motions are made;
+the instantaneous baseline is at the end of the line.
+.PP
+.de eb
+.sp -1
+.nf
+\h'-.5n'\L'|\\nzu-1'\l'\\n(.lu+1n\(ul'\L'-|\\nzu+1'\l'|0u-.5n\(ul'
+.fi
+..
+.ne 2i
+.mk z
+.nr z \nz+1
+The horizontal and vertical line drawing functions may be used
+in combination to produce large boxes.
+The zero-width \fIbox-rule\fR and the ½-em wide \fIunder-rule\fR
+were designed to form corners when using 1-em vertical
+spacings.
+For example the macro
+.nr x \n(DV
+.nr DV 0
+.P1 .15i
+.ps -1
+\&.de eb
+\&.sp -1 \e"compensate for next automatic baseline spacing
+\&.nf \e"avoid possibly overflowing word buffer
+\&\eh'-.5n'\eL'|\e\enau-1'\el'\e\en(.lu+1n\e(ul'\eL'-|\e\enau+1'\el'|0u-.5n\e(ul'
+\&.fi
+\&..
+.ps +1
+.P2
+.nr DV \nx
+will draw a box around some text whose beginning vertical place was
+saved in number register \fIa\fR
+(e.g., using \&\f(CW.mk\ a\fR)
+as was done for this paragraph.
+.eb
+.sc "Graphics.
+The function
+.CW \eD'@c...@'
+draws a graphic object of type @c@
+according to a sequence of parameters,
+which are generally pairs of numbers.
+.IP
+.nf
+.ta 1.7i
+\f(CW\eD'l @dh~ dv@' \f1draw line from current position by @dh,~dv@\f(CW
+\f(CW\eD'c @d@' \f1draw circle of diameter @d@ with left side at current position\f(CW
+\f(CW\eD'e @d sub 1 d sub 2@' \f1draw ellipse of diameters @d sub 1@ and @d sub 2@\f(CW
+\f(CW\eD'a @dh sub 1~ dv sub 1~ dh sub 2~ dv sub 2@'\f(CW \f1draw arc from current position to @dh sub 1 +dh sub 2@, @dv sub 1 +dv sub 2@,\f(CW
+ \f1with center at @dh sub 1 ,~ dv sub 1@ from current position\f(CW
+\f(CW\eD'~ @dh sub 1 dv sub 1 dh sub 2 dv sub 2 "..."@'\f(CW \f1draw B-spline from current position by @dh sub 1, dv sub 1@,\f(CW
+ \f1then by @dh sub 2 , dv sub 2@, then by @dh sub 2 , dv sub 2@, then ...\f(CW
+.LP
+For example,
+.CW "\eD'e0.2i 0.1i'"
+draws the ellipse
+\D'e.2i .1i'\|,
+and
+.CW "\eD'l.2i -.1i'\eD'l.1i .1i'"
+the line
+\D'l.2i -.1i'\D'l.1i .1i'\|.
+A
+.CW \\eD
+with an unknown @c@ is processed and copied through to the output
+for unspecified interpretation;
+coordinates are interpreted alternately as horizontal and vertical
+values.
+.PP
+Numbers taken as horizontal (first, third, etc.) have default scaling of ems;
+vertical numbers (second, fourth, etc.) have default scaling of @V^@s (§1.3).
+The position after a graphical object has been drawn is
+at its end; for circles and ellipses, the ``end''
+is at the right side.
+.NH
+Hyphenation.
+.PP
+Automatic hyphenation may be switched off and on.
+When switched on with \&\f(CWhy\fR,
+several variants may be set.
+A \fIhyphenation indicator\fR character may be embedded in a word to
+specify desired hyphenation points,
+or may be prefixed to suppress hyphenation.
+In addition,
+the user may specify a small list of exception words.
+.PP
+Only words that consist of a central alphabetic string
+surrounded by (usually null) non-alphabetic strings
+are candidates for automatic hyphenation.
+Words that contain hyphens
+(minus),
+em-dashes (\&\f(CW\e(em\fR),
+or hyphenation indicator characters
+are always subject to splitting after those characters,
+whether automatic hyphenation is on or off.
+.bt "\&\f(CW&nh\fR" "hyphenate" "-" "E" "Automatic hyphenation is turned off.
+.bt "\&\f(CW&hy\fP@~N@" "on, @N=1@" "on, @N=1@" "E" "Automatic hyphenation is turned on
+for @N >= 1@, or off for @N=0@.
+If @N=2@, last lines (ones that will cause a trap)
+are not hyphenated.
+For @N=4@ and 8, the last and first two characters
+respectively of a word are not split off.
+These values are additive;
+i.e., @N=14@ will invoke all three restrictions.
+.bt "\&\f(CW&hc\fI c\fR" "\&\f(CW\e%" "\e%\fR" "E" "Hyphenation indicator character is set
+to @c@ or to the default \&\f(CW\e%\fR.
+The indicator does not appear in the output.
+.bt "\&\f(CW&hw\fI word ...\fR" "" "ignored" "-" "Specify
+hyphenation points in words
+with embedded minus signs.
+Versions of a word with terminal \fIs\fR are implied;
+i.e.,
+.CW dig-it
+implies
+.CW dig-its .
+This list is examined initially and after
+each suffix stripping.
+The space available is small.
+.NH
+Three-Part Titles.
+.PP
+The titling function \&\f(CWtl\fR provides for automatic placement
+of three fields at the left, center, and right of a line
+with a title length
+specifiable with \&\f(CWlt\fR.
+\&\f(CWtl\fR may be used anywhere, and is independent of the
+normal text collecting process.
+A common use is in header and footer macros.
+.h1
+.bt "\&\f(CW&tl '\fIleft\fP'\fIcenter\fP'\fIright\fP'\fR" "-" "-" "" "The strings
+\fIleft\fR, \fIcenter\fR, and \fIright\fR are
+respectively left-adjusted, centered, and right-adjusted
+in the current title length.
+Any of the strings may be empty,
+and overlapping is permitted.
+If the page-number character (initially \&\f(CW%\fR) is found within any of the fields it is replaced
+by the current page number in the format assigned to register \&\f(CW%\fR.
+Any character may be used in place of
+.CW '
+as the string delimiter.
+.bt "\&\f(CW&pc\fI c\fR" "\&\f(CW%\fR" "off" "-" "The page number character is set to @c@,
+or removed.
+The page number register remains \&\f(CW%\fR.
+.bt "\&\f(CW&lt\fI \(+-N\fR" "6.5\|in" "previous" "E,\fBm\fR" "Length of title
+is set to @+- N@.
+The line length and the title length are independent.
+Indents do not apply to titles; page offsets do.
+.NH
+Output Line Numbering.
+.PP
+.ll -\w'0000'u
+.nm 1 3
+Automatic sequence numbering of output lines may be
+requested with \&\f(CWnm\fR.
+When in effect,
+a three-digit, arabic number plus a digit-space
+is prefixed to output text lines.
+The text lines are thus offset by four digit-spaces,
+and otherwise retain their line length;
+a reduction in line length may be desired to keep the right margin
+aligned with an earlier margin.
+Blank lines, other vertical spaces, and lines generated by \&\f(CWtl\fR
+are not numbered.
+Numbering can be temporarily suspended with \&\f(CWnn\fR,
+or with an \&\f(CW.nm\fR followed by a later \&\f(CW.nm +0\fR.
+In addition,
+a line number indent \fII\fR, and the number-text separation \fIS\fR
+may be specified in digit-spaces.
+Further, it can be specified that only those line numbers that are
+multiples of some number @M@ are to be printed (the others will appear
+as blank number fields).
+.br
+.nm
+.ll
+.bt "\&\f(CW&nm\fI \(+-N M S I\fR" "" "off" "E" "Line number mode.
+If @+- N@ is given,
+line numbering is turned on,
+and the next output line numbered is numbered @+- N@.
+Default values are @M=1@, @S=1@, and @I=0@.
+Parameters corresponding to missing arguments are unaffected;
+a non-numeric argument is considered missing.
+In the absence of all arguments, numbering is turned off;
+the next line number is preserved for possible further use
+in number register \&\f(CWln\fR.
+.bt "\&\f(CW&nn\fI N\fR" "-" "@N=1@" "E" "The next @N@ text output lines are not
+numbered.
+.PP
+.ll -\w'0000'u
+.nm +0
+As an example, the paragraph portions of this section
+are numbered with \fIM=\fR\|3:
+\&\&\f(CW.nm\ 1\ 3\fR was placed at the beginning;
+\&\&\f(CW.nm\fR was placed at the end of the first paragraph;
+and \&\f(CW.nm\ +0\fR was placed in front of this paragraph;
+and \&\f(CW.nm\fR finally placed at the end.
+Line lengths were also changed (by \&\f(CW\ew'0000'u\fR) to keep the right side aligned.
+Another example is
+.CW .nm
+.CW +5
+.CW 5
+.CW x
+.CW 3 ,
+which turns on numbering with the line number of the next
+line to be 5 greater than the last numbered line,
+with @M=5@, with spacing \fIS\fR untouched, and with the indent \fII\fR set to 3.
+.br
+.ll
+.nm
+.NH
+Conditional Acceptance of Input
+.PP
+In the following,
+@c@ is a one-character built-in \fIcondition\fR name,
+\&\f(CW!\fR signifies \fInot\fR,
+@N@ is a numerical expression,
+\fIstring1\fR and \fIstring2\fR are strings delimited by any non-blank, non-numeric character not in the strings,
+and
+\fIanything\fR represents what is conditionally accepted.
+.bt "\&\f(CW&if\fI c anything\fR" "-" "-" "" "If condition
+@c@ true, accept \fIanything\fR as input;
+in multi-line case use \e{\fIanything\|\fR\e}.
+.bt "\&\f(CW&if !\fIc anything\fR" "-" "-" "" "If condition @c@ false, accept \fIanything\fR.
+.bt "\&\f(CW&if\fI N anything\fR" "" "-" "\fBu\fR" "If expression @N@ > 0, accept \fIanything\fR.
+.bt "\&\f(CW&if !\fIN anything\fR" "" "-" "\fBu\fR" "If expression @N@ ≤ 0 [sic], accept \fIanything\fR.
+.bt "\&\f(CW&if '\fIstring1\f(CW'\fIstring2\f(CW'\fI anything\fR" "-" "" "" "If \fIstring1\fR identical to \fIstring2\fR,
+accept \fIanything\fR.
+.bt "\&\f(CW&if !'\fIstring1\f(CW'\fIstring2\f(CW'\fI anything\fR" "-" "" "" "If \fIstring1\fR not identical to \fIstring2\fR,
+accept \fIanything\fR.
+.bt "\&\f(CW&ie\fI c anything\fR" "" "-" "\fBu\fR" "If portion of if-else;
+all of the forms for \&\f(CWif\fR above are valid.
+.bt "\&\f(CW&el\fI anything\fR" "-" "-" "" "Else portion of if-else.
+.PP
+The built-in condition names are:
+.TS
+center box;
+c2|c2
+c2|c2
+c2|l2.
+Condition
+Name True If
+_
+\&\f(CWo\fR Current page number is odd
+\&\f(CWe\fR Current page number is even
+\&\f(CWt\fR Formatter is \*(TR
+\&\f(CWn\fR Formatter is \*(NR
+.TE
+If the condition @c@ is true, or if the number @N@ is greater than zero,
+or if the strings compare identically (including motions and character size and font),
+\fIanything\fR is accepted as input.
+If a \&\f(CW!\fR precedes the condition, number, or string comparison,
+the sense of the acceptance is reversed.
+.PP
+Any spaces between the condition and the beginning of \fIanything\fR are skipped over.
+The \fIanything\fR can be either a single input line (text, macro, or whatever)
+or a number of input lines.
+In the multi-line case,
+the first line must begin with a left delimiter \&\f(CW\e{\fR and
+the last line must end with a right delimiter \&\f(CW\e}\fR.
+.PP
+The request \&\f(CWie\fR (if-else) is identical to \&\f(CWif\fR
+except that the acceptance state is remembered.
+A subsequent and matching \&\f(CWel\fR (else) request then uses the reverse sense of that state.
+\&\f(CWie\fR-\&\f(CWel\fR pairs may be nested.
+.PP
+Some examples are:
+.P1
+&if e .tl '\|Even Page %'''
+.P2
+which outputs a title if the page number is even; and
+.P1
+&ie \en%>1 \e{\e
+\&' sp 0.5i
+& tl 'Page %'''
+\&' sp |1.2i \e}
+&el .sp |2.5i
+.P2
+which treats page 1 differently from other pages.
+.NH
+Environment Switching.
+.PP
+A number of the parameters that
+control the text processing are gathered together into an
+\fIenvironment\fR, which can be switched by the user.
+The environment parameters are those associated
+with requests noting E in their \fINotes\fR column;
+in addition, partially collected lines and words are in the environment.
+Everything else is global; examples are page-oriented parameters,
+diversion-oriented parameters, number registers, and macro and string definitions.
+All environments are initialized with default parameter values.
+.bt "\&\f(CW&ev\fI N\fR" "@N=0@" "previous" "-" "Environment switched to
+environment @0 <= N <= 2@.
+Switching is done in push-down fashion so that
+restoring a previous environment \fImust\fR be done with \&\f(CW.ev\fR
+rather than specific reference.
+Note that what is pushed down and restored is the environment
+.I number,
+not its contents.
+.NH
+Insertions from the Standard Input
+.PP
+The input can be temporarily switched to the system standard input
+with \&\f(CWrd\fR,
+which will switch back when two consecutive newlines
+are found (the extra blank line is not used).
+This mechanism is intended for insertions in form-letter-like documentation.
+The standard input can be the user's keyboard,
+a pipe, or a file.
+.bt "\&\f(CW&rd\fI prompt\fR" "-" "\fIprompt=\fR\s-1BEL\s+1" "-" "Read insertion
+from the standard input until two newlines in a row are found.
+If the standard input is the user's keyboard, \fIprompt\fR (or a \s-1BEL\s+1)
+is written onto the standard output.
+\&\f(CWrd\fR behaves like a macro,
+and arguments may be placed after \fIprompt\fR.
+.bt "\&\f(CW&ex\fR" "-" "-" "-" "Exit from \*(NR/\*(TR.
+Text processing is terminated exactly as if all input had ended.
+.PP
+If insertions are to be
+taken from the terminal keyboard while output is being printed
+on the terminal, the command line option \&\f(CW-q\fR will turn off the echoing
+of keyboard input and prompt only with \s-1BEL\s+1.
+The regular input and insertion input cannot
+simultaneously come from the standard input.
+.PP
+As an example,
+multiple copies of a form letter may be prepared by entering the insertions
+for all the copies in one file to be used as the standard input,
+and causing the file containing the letter to reinvoke itself with \&\f(CWnx\fR (§19);
+the process would ultimately be ended by an \&\f(CWex\fR in the insertion file.
+.NH
+Input/Output File Switching
+.bt "\&\f(CW&so\fI filename\fR" "" "-" "-" "Switch source file.
+The top input (file reading) level is switched to \fIfilename\fR.
+When the new file ends,
+input is again taken from the original file.
+\&\f(CWso\fR's may be nested.
+.bt "\&\f(CW&nx\fI filename\fR" "" "end-of-file" "-" "Next file is \fIfilename\fR.
+The current file is considered ended, and the input is immediately switched
+to \fIfilename\fR.
+.bt "\&\f(CW&sy\fI string\fR" "" "-" "-" "Execute program from \fIstring\fR,
+which is the rest of the input line.
+The output is not collected automatically.
+The number register
+.CW $$ ,
+which contains the process id of the \*(TR process,
+may be useful in generating unique filenames for output.
+.bt "\&\f(CW&pi\fI string\fR" "" "-" "-" "Pipe output to \fIstring\fR,
+which is the rest of the input line.
+This request must occur before any printing occurs;
+typically it is the first line of input.
+.bt "\&\f(CW&cf\fI filename\fR" "" "-" "-" "Copy
+contents of file
+.I filename
+to output, completely unprocessed.
+The file is assumed to contain something meaningful
+to subsequent processes.
+.NH
+Miscellaneous
+.br
+.mc \s12\(br\s0
+.bt "\&\f(CW.mc\fI c N\fR" - off E,\fBm\fR "Specifies
+that a \fImargin\fR character @c@ appear a distance
+@N@ to the right of the right margin
+after each non-empty text line (except those produced by \&\f(CWtl\fR).
+If the output line is too long (as can happen in nofill mode)
+the character will be appended to the line.
+If @N@ is not given, the previous @N@ is used; the initial @N@ is
+0.2 inches in \*(NR and 1 em in \*(TR.
+The margin character used with this paragraph was a 12-point box-rule.
+.br
+.mc
+.bt "\&\f(CW.tm\fI string\fR" "-" "newline" "-" "After skipping initial blanks,
+\fIstring\fR (rest of the line) is read in copy mode
+and written on the standard error.
+.bt "\&\f(CW&ab\fI string\fR" "-" "newline" "-" "After skipping initial blanks,
+\fIstring\fR (rest of the line) is read in copy mode
+and written on the standard error.
+\*(Tr or \*(NR then exit.
+.bt "\&\f(CW.ig\fI yy\fR" "-" "\fI.yy=\&\f(CW..\fR" "-" "Ignore
+input lines.
+\&\f(CWig\fR behaves exactly like \&\f(CWde\fR (§7) except that the
+input is discarded.
+The input is read in copy mode, and any auto-incremented
+registers will be affected.
+.bt "\&\f(CW.lf\fI N filename\fR" "" "-" "-" "Set
+line number to @N@ and filename to @filename@
+for purposes of subsequent error messages, etc.
+The number register [sic]
+.CW .F
+contains the name of the current input file,
+as set by command line argument,
+.CW so ,
+.CW nx ,
+or
+.CW lf .
+The number register
+.CW .c
+contains the number of input lines read from the current file,
+again perhaps as modified by
+.CW lf .
+.CW
+.bt "\&\f(CW.pm\fI t\fR" "-" "all" "-" "Print macros.
+The names and sizes of all of the defined macros and strings are printed
+on the standard error;
+if \fIt\fR is given, only the total of the sizes is printed.
+The sizes is given in blocks
+of 128 characters.
+.bt "\&\f(CW.fl\fR" - - B "Flush output buffer.
+Force output, including any pending position information.
+......
+.NH
+Output and Error Messages.
+.PP
+The output from \&\f(CWtm\fR, \&\f(CWpm\fR, and the prompt from \&\f(CWrd\fR,
+as well as various error messages, are written onto
+the standard error.
+The latter is different from the standard output,
+where formatted text goes.
+By default, both are written onto the user's terminal,
+but they can be independently redirected.
+.PP
+Various error conditions may occur during
+the operation of \*(NR and \*(TR.
+Certain less serious errors having only local impact do not
+cause processing to terminate.
+Two examples are \fIword overflow\fR, caused by a word that is too large
+to fit into the word buffer (in fill mode), and
+\fIline overflow\fR, caused by an output line that grew too large
+to fit in the line buffer.
+In both cases, a message is printed, the offending excess
+is discarded,
+and the affected word or line is marked at the point of truncation
+with a \(** in \*(NR and a \(lh in \*(TR.
+Processing continues if possible,
+on the grounds that output useful for debugging may be produced.
+If a serious error occurs, processing terminates,
+and a message is printed, along with a list of the macro names currently active.
+Examples of serious errors include the inability to create, read, or write files,
+and the exceeding of certain internal limits that
+make future output unlikely to be useful.
+.NH
+Output Language
+.PP
+\*(Tr
+produces its output in a language that is independent of any
+specific output device,
+except that the numbers in it have been computed on the basis
+of the resolution of the device,
+and the sizes, fonts, and characters that that device can print.
+Nevertheless it is quite possible to interpret that output
+on a different device, within the latter's capabilities.
+.IP
+.nf
+.ta .7i
+@cw s n@ set point size to @n@
+@cw f n@ set font to @n@
+@cw c c@ print character @c@
+@cw C name@ print the character called @name@; terminate @name@ by white space
+@cw N n@ print character @n@ on current font
+@cw H n@ go to absolute horizontal position \f2n\fP (@n >= 0@)
+@cw V n@ go to absolute vertical position \f2n\fP (@n >= 0@, down is positive)
+@cw h n@ go \f2n\fP units horizontally; @n < 0@ is to the left
+@cw v n@ go \f2n\fP units vertically; @n < 0@ is up
+@nnc@ move right \f2nn\fP, then print \s-1UTF\s0 character \f2c\fP; \f2nn\fP must be exactly 2 digits
+@cw p n@ new page \f2n\fP begins\(emset vertical position to 0
+@cw n b~a@ end of line (information only\(emno action); \f2b\fP = space before line, \f2a\fP = after
+@cw w@ paddable word space (information only\(emno action)
+@cw D c@ ...\en graphics function @c@; see below
+@cw x@ ...\en device control functions; see below
+@cw "#"@ ...\en comment
+.LP
+All position values are in units.
+Sequences that end in digits must be followed by a non-digit.
+Blanks, tabs and newlines may occur as separators
+in the input, and are mandatory to separate constructions
+that would otherwise be confused.
+Graphics functions, device control functions, and comments extend to the
+end of the line they occur on.
+.PP
+The device control and graphics commands are intended as open-ended
+families, to be expanded as needed.
+The graphics functions coincide directly with the
+.CW \eD
+sequences:
+.IP
+.nf
+.ta 1.7i
+@cw Dl@ \f2dh dv\fP draw line from current position by @dh,~ dv@
+@cw Dc@ \f2d\fP draw circle of diameter \f2d\fP with left side here
+@cw De@ @dh sub 1~dv sub 2@ draw ellipse of diameters @dh sub 1@ and @ dv sub 2@\fP
+@cw Da ~dh sub 1~ dv sub 1 ~ dh sub 2 ~dv sub 2@ draw arc from current position to @dh sub 1 +dh sub 2 ,~ dv sub 1 +dv sub 2@,
+ center at @dh sub 1 ,~ dv sub 1@ from current position
+@cw "D~" ~dh sub 1 ~dv sub 1 ~dh sub 2 ~dv sub 2@ ... draw B-spline from current position to @dh sub 1 ,~ dv sub 1@,
+ then to @dh sub 2 , ~dv sub 2@, then to ...
+@cw "D"z ~dh sub 1 ~dv sub 1 ~dh sub 2 ~dv sub 2@ ... for any other @z@ is uninterpreted
+.LP
+In all of these, @dh, ~dv@ is an increment on the current horizontal and
+vertical position,
+with down and right positive.
+All distances and dimensions are in units.
+.PP
+The device control functions begin with
+.CW x ,
+then a command, then other parameters.
+.IP
+.ta .8i 1.2i
+.nf
+.ft CW
+x T \f2s\fP \f1name of typesetter is @s@\f(CW
+x r \f2n h v\fP \f1resolution is @n@ units/inch;\f(CW
+ \f1@h@ = minimum horizontal motion, @v@ = minimum vertical\f(CW
+x i \f1initialize\fP
+x f \f2n s\fP \f1mount font @s@ on font position @n@\f(CW
+x p \f1pause\(emcan restart\f(CW
+x s \f1stop\(emdone forever\f(CW
+x t \f1generate trailer information, if any\f(CW
+x H \f2n\fP \f1set character height to @n@\f(CW
+x S \f2n\fP \f1set slant to @n@\f(CW
+x X \f2any\fP \f1generated by the \&\f(CW\eX\fP function\f(CW
+x \f2any\fP \f1to be ignored if not recognized\f(CW
+.LP
+Subcommands like
+.CW i '' ``
+may be spelled out like
+.CW init ''. ``
+.PP
+The commands
+.CW "x T" ,
+.CW "x r " ...,
+and
+.CW "x i"
+must occur first;
+fonts must be mounted before they can be used;
+.CW "x s
+comes last.
+There are no other order requirements.
+.PP
+The following is the output from
+.CW hello, "" ``
+.CW world ''
+for a typical printer,
+as described in §23:
+.P1
+x T utf
+x res 720 1 1
+x init
+V0
+p1
+.P2
+.P1
+x font 1 R
+x font 2 I
+x font 3 B
+x font 4 BI
+x font 5 CW
+x font 6 H
+x font 7 HB
+x font 8 HX
+x font 9 S1
+x font 10 S
+.P2
+.P1
+s10
+f1
+H0
+s10
+f1
+V0
+H720
+V120
+ch
+50e44l28l28o50,w58w72o50r33l28dn120 0
+x trailer
+V7920
+x stop
+.P2
+.PP
+\*(Tr output is normally not redundant;
+size and font changes and position information are not included
+unless needed.
+Nevertheless, each page is self-contained, for the benefit of postprocessors
+that re-order pages or process only a subset.
+.NH
+Device and Font Description Files
+.PP
+The parameters that describe a output device
+.I name
+are read
+from the directory
+.CW /sys/lib/troff/font/dev@name@ ,
+each time
+\*(TR
+is invoked.
+The device name is provided by default,
+by the environment variable
+.CW TYPESETTER ,
+or by a command-line argument
+.CW -T@name@ .
+The default device name is
+.CW utf ,
+for \s-1UTF\s0-encoded Unicode characters.
+The pre-defined string
+.CW .T
+contains the name of the device.
+The
+.CW -F
+command-line option may be used to change the default directory.
+.......
+.sc "Device description file.
+General parameters of the device are stored, one per line, in
+the file
+.CW /sys/lib/troff/font/dev@name@/DESC ,
+as a sequence of names and values.
+\*(Tr recognizes these parameters, and ignores any
+others that may be present for specific drivers:
+.IP
+.nf
+.ta 1i
+@cw fonts ~ n ~ F sub 1 ~F sub 2 ~. . .~ F sub n@
+@cw sizes ~ s sub 1 ~ s sub 2 ~ . . . cw 0@
+@cw res ~n@
+@cw hor ~n@
+@cw vert ~n@
+@cw unitwidth ~n@
+@cw charset@
+\f2list of multi-character character names (optional)\fP
+.LP
+The @F sub i@ are font names
+to be initially mounted.
+The list of sizes is a set of integers representing
+some or all of the legal sizes the device can produce,
+terminated by a zero.
+The
+.CW res
+parameter gives the resolution of the machine in units per inch;
+.CW hor
+and
+.CW ver
+give the minimum number of units that can be moved
+horizontally and vertically.
+.PP
+Character widths for each font are assumed to be given in machine units
+at point size
+.CW unitwidth .
+(In other words, a character with a width of
+@n@ is @n@ units wide at size
+.CW unitwidth .)
+All widths are integers at all sizes.
+.PP
+A list of valid character names may be introduced by
+.CW charset ;
+the list of names is optional.
+.PP
+A line whose first non-blank character is
+.CW #
+is a comment.
+Except that
+.CW charset
+must occur last, parameters may appear in any order.
+.PP
+Here is a subset of the
+.CW DESC
+file for a typical Postscript printer:
+.P1
+# Description file for Postscript printers.
+
+fonts 10 R I B BI CW H HB HX S1 S
+sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
+ 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 44 48 54 60 72 0
+res 720
+hor 1
+vert 1
+unitwidth 10
+charset
+hy ct fi fl ff Fi Fl dg em 14 34 12 en aa
+ga ru sc dd -> br Sl ps cs cy as os =. ld
+rd le ge pp -+ ob vr
+sq bx ci fa te ** pl mi eq ~= *A *B *X *D
+*E *F *G *Y *I *K *L *M *N *O *P *R *H *S *T *U *W
+*C *Q *Z ul rn *a *b *x *d *e *f *g *y *i *k
+*l *m *n *o *p *h *r *s *t *u *w *c *q *z
+.P2
+.sc "Font description files.
+Each font is described by an analogous description file,
+which begins with parameters of the font, one per line, followed by a
+list of characters and widths.
+The file for font
+.I f
+is
+.CW /sys/lib/troff/font/dev@name@/@f@ .
+.IP
+.ta 1.7i
+.nf
+@cw name ~str@ name of font is @str@
+@cw ligatures ~ ". . ." ~ cw "0"@ list of ligatures
+@cw spacewidth ~n@ width of a space on this font
+@cw special@ this is a special font
+@cw charset@
+\f2list of character name, width, ascender/descender, code\fP, tab separated
+.LP
+The
+.CW name
+and
+.CW charset
+fields are mandatory;
+.CW charset
+must be last.
+Comments are permitted,
+as are other unrecognized parameters.
+.PP
+Each line following
+.CW charset
+describes one character: its name, its width in units as described above,
+ascender/descender information, and a decimal, octal or hexadecimal value
+by which the output device knows it
+(the
+.CW \eN
+``number'' of the character).
+The character name is arbitrary, except that
+.CW ---
+signifies an unnamed character.
+If the width field contains
+.CW \&" ,
+the name is a synonym for the previous character.
+The ascender/descender field is 1 if
+the character has a descender (hangs below the baseline, like
+.CW y ),
+is 2 if it has an ascender (is tall, like
+.CW Y ),
+is 3 if both,
+and is 0 if neither.
+The value is returned
+in the
+.CW ct
+register, as computed by the
+.CW \ew
+function (§11.2).
+.PP
+Here are excerpts from a typical font description file
+for the same Postscript printer.
+.P1
+hy 33 0 45 hyphen \e(hy
+- " - is a synonym for \e(hy
+.sp .3
+Q 72 3 81
+.sp .3
+a 44 0 97
+b 50 2 98
+c 44 0 99
+d 50 2 100
+y 50 1 121
+.sp .3
+em 100 0 208
+--- 44 2 220 Pound symbol £, \eN'220'
+--- 36 0 221 centered dot \eN'221'
+.P2
+This says, for example, that the width of the letter
+.CW a
+is 44 units at point size 10,
+the value of
+.CW unitwidth .
+Point sizes are scaled linearly and rounded, so the width of
+.CW a
+will be 44 at size 10, 40 at size 9, 35 at size 8,
+and so on.
+.sp 100
+.BP
+.fp 8 C CW
+.tr &.
+.tr |
+.tr ~|
+.TL
+Tutorial Examples
+.SP
+....2C
+.sp .25i
+.SH
+Introduction
+.PP
+It is almost always necessary to
+prepare at least a small set of macro definitions
+to describe a document.
+Such common formatting needs
+as page margins and footnotes
+are deliberately not built into \*(NR and \*(TR.
+Instead,
+the macro and string definition, number register, diversion,
+environment switching, page-position trap, and conditional input mechanisms
+provide the basis for user-defined implementations.
+.PP
+For most uses, a standard package like
+.CW -ms
+or
+.CW -mm
+is the right choice.
+The next stage is to augment that,
+or to selectively replace macros from the standard package.
+The last stage, much harder,
+is to write one's own from scratch.
+This is not a task for the novice.
+.PP
+The examples discussed here are intended to be useful and somewhat realistic,
+but will not necessarily cover all relevant contingencies.
+Explicit numerical parameters are used
+in the examples
+to make them easier to read and to
+illustrate typical values.
+In many cases, number registers would be used
+to reduce the number of places where numerical
+information is kept,
+and to concentrate conditional parameter initialization
+like that which depends on whether \*(TR or \*(NR is being used.
+.SH
+Page Margins
+.PP
+As discussed in §3,
+header and footer macros are usually defined
+to describe the top and bottom page margin areas respectively.
+A trap is planted at page position 0 for the header, and at
+\fI-N\fR (\fIN\fR from the page bottom) for the footer.
+The simplest such definitions might be
+.P1 .1i
+&de hd \e"define header
+\&'sp 1i
+&& \e"end definition
+&de fo \e"define footer
+\&'bp
+&& \e"end definition
+&wh 0 hd
+&wh -1i fo
+.P2
+which provide blank 1 inch top and bottom margins.
+The header will occur on the \fIfirst\fR page
+only if the definition and trap exist prior to
+the initial pseudo-page transition (§3).
+In fill mode, the output line that springs the footer trap
+was typically forced out because some part or whole word didn't fit on it.
+If anything in the footer and header that follows causes a break,
+that word or part word will be forced out.
+In this and other examples,
+requests like \&\f(CWbp\fR and \&\f(CWsp\fR that normally cause breaks are invoked using
+the no-break control character \&\f(CW'\fR
+to avoid this.
+When the header/footer design contains material
+requiring independent text processing, the
+environment may be switched, avoiding
+most interaction with the running text.
+.PP
+A more realistic example would be
+.P1 .1i
+&de hd \e"header
+&if \e\en%>1 \e{\e
+\&'sp ~0.5i-1 \e"tl base at 0.5i
+&tl ''- % -'' \e"centered page number
+&ps \e"restore size
+&ft \e"restore font
+&vs \e} \e"restore vs
+\&'sp ~1.0i \e"space to 1.0i
+&ns \e"turn on no-space mode
+&&
+&de fo \e"footer
+&ps 10 \e"set footer/header size
+&ft R \e"set font
+&vs 12p \e"set baseline spacing
+&if \e\en%=1 \e{\e
+\&'sp ~\e\en(.pu-0.5i-1 \e"tl base 0.5i up
+&tl ''- % -'' \e} \e"first page number
+\&'bp
+&&
+&wh 0 hd
+&wh -1i fo
+.P2
+which sets the size, font, and baseline spacing for the
+header/footer material, and ultimately restores them.
+The material in this case is a page number at the bottom of the
+first page and at the top of the remaining pages.
+The \&\f(CWsp\fR's refer to absolute positions to avoid
+dependence on the baseline spacing.
+Another reason for doing this in the footer
+is that the footer is invoked by printing a line whose
+vertical spacing swept past the trap position by possibly
+as much as the baseline spacing.
+No-space mode is turned on at the end of \&\f(CWhd\fR
+to render ineffective
+accidental occurrences of \&\f(CWsp\fR at the top of the running text.
+.PP
+This method of restoring size, font, etc., presupposes
+that such requests (that set \fIprevious\fR value) are \fInot\fR
+used in the running text.
+A better scheme is to save and restore both the current \fIand\fR
+previous values as shown for size in the following:
+.P1 .1i
+&de fo
+&nr s1 \e\en(.s \e"current size
+&ps
+&nr s2 \e\en(.s \e"previous size
+& --- \e"rest of footer
+&&
+&de hd
+& --- \e"header stuff
+&ps \e\en(s2 \e"restore previous size
+&ps \e\en(s1 \e"restore current size
+&&
+.P2
+Page numbers may be printed in the bottom margin
+by a separate macro triggered during the footer's
+page ejection:
+.P1 .1i
+&de bn \e"bottom number
+&tl ''- % -'' \e"centered page number
+&&
+&wh -0.5i-1v bn \e"tl base 0.5i up
+.P2
+.SH
+Paragraphs and Headings
+.PP
+The housekeeping
+associated with starting a new paragraph should be collected
+in a paragraph macro
+that, for example,
+does the desired preparagraph spacing,
+forces the correct font, size, baseline spacing, and indent,
+checks that enough space remains for \fImore than one\fR line,
+and
+requests a temporary indent.
+.P1 .1i
+&de pg \e"paragraph
+&br \e"break
+&ft R \e"force font,
+&ps 10 \e"size,
+&vs 12p \e"spacing,
+&in 0 \e"and indent
+&sp 0.4 \e"prespace
+&ne 1+\e\en(.Vu \e"want more than 1 line
+&ti 0.2i \e"temp indent
+&&
+.P2
+The first break in \&\f(CWpg\fR
+will force out any previous partial lines,
+and must occur before the \&\f(CWvs\fR.
+The forcing of font, etc., is
+partly a defense against prior error and
+partly to permit
+things like section heading macros to
+set parameters only once.
+The prespacing parameter is suitable for \*(TR;
+a larger space, at least as big as the output device vertical resolution, would be
+more suitable in \*(NR.
+The choice of remaining space to test for in the \&\f(CWne\fR
+is the smallest amount greater than one line
+(the \&\f(CW.V\fR is the available vertical resolution).
+.PP
+A macro to automatically number section headings
+might look like:
+.P1 .1i
+&de sc \e"section
+& --- \e"force font, etc.
+&sp 0.4 \e"prespace
+&ne 2.4+\e\en(.Vu \e"want 2.4+ lines
+.lg 0
+&fi
+.lg
+\e\en+S.
+&&
+&nr S 0 1 \e"init S
+.P2
+The usage is \&\f(CW.sc\fR,
+followed by the section heading text,
+followed by \&\f(CW.pg\fR.
+The \&\f(CWne\fR test value includes one line of heading,
+0.4 line in the following \&\f(CWpg\fR, and
+one line of the paragraph text.
+A word consisting of the next section number and a period is
+produced to begin the heading line.
+The format of the number may be set by \&\f(CWaf\fR (§8).
+.PP
+Another common form is the labeled, indented paragraph,
+where the label protrudes left into the indent space.
+.P1 .1i
+&de lp \e"labeled paragraph
+&pg
+&in 0.5i \e"paragraph indent
+&ta 0.2i 0.5i \e"label, paragraph
+&ti 0
+\et\e\e$1\et\ec \e"flow into paragraph
+&&
+.P2
+The intended usage is ``\&\f(CW.lp\fR \fIlabel\fR\|'';
+\fIlabel\fR will begin at 0.2 inch, and
+cannot exceed a length of 0.3 inch without intruding into
+the paragraph.
+The label could be right adjusted against 0.4 inch by
+setting the tabs instead with \&\f(CW.ta|0.4iR|0.5i\fR.
+The last line of \&\f(CWlp\fR ends with \&\f(CW\ec\fR so that
+it will become a part of the first line of the text
+that follows.
+.SH
+Multiple Column Output
+.PP
+The production of multiple column pages requires
+the footer macro to decide whether it was
+invoked by other than the last column,
+so that it will begin a new column rather than
+produce the bottom margin.
+The header can initialize a column register that
+the footer will increment and test.
+The following is arranged for two columns, but
+is easily modified for more.
+.P1 .1i
+&de hd \e"header
+& ---
+&nr cl 0 1 \e"init column count
+&mk \e"mark top of text
+&&
+.P2
+.P1 .1i
+&de fo \e"footer
+&ie \e\en+(cl<2 \e{\e
+&po +3.4i \e"next column; 3.1+0.3
+&rt \e"back to mark
+&ns \e} \e"no-space mode
+&el \e{\e
+&po \e\enMu \e"restore left margin
+& ---
+\&'bp \e}
+&&
+&ll 3.1i \e"column width
+&nr M \e\en(.o \e"save left margin
+.P2
+Typically a portion of the top of the first page
+contains full width text;
+the request for the narrower line length,
+as well as another \&\f(CW.mk\fR would
+be made where the two column output was to begin.
+.SH
+Footnotes
+.PP
+The footnote mechanism to be described is used by
+embedding the footnotes in the input text at the
+point of reference,
+demarcated by an initial \&\f(CW.fn\fR and a terminal \&\f(CW.ef\fR:
+.P1 .1i
+&fn
+\fIFootnote text and control lines...\fP
+&ef
+.P2
+In the following,
+footnotes are processed in a separate environment and diverted
+for later printing in the space immediately prior to the bottom
+margin.
+There is provision for the case where the last collected
+footnote doesn't completely fit in the available space.
+.P1 .1i
+&de hd \e"header
+& ---
+&nr x 0 1 \e"init footnote count
+&nr y 0-\e\enb \e"current footer place
+&ch fo -\e\enbu \e"reset footer trap
+&if \e\en(dn .fz \e"leftover footnote
+&&
+.P2
+.P1 .1i
+&de fo \e"footer
+&nr dn 0 \e"zero last diversion size
+&if \e\enx \e{\e
+&ev 1 \e"expand footnotes in ev1
+&nf \e"retain vertical size
+&FN \e"footnotes
+&rm FN \e"delete it
+.P2
+.P1 .1i
+&if "\e\en(.z"fy" .di \e"end overflow di
+&nr x 0 \e"disable fx
+&ev \e} \e"pop environment
+& ---
+\&'bp
+&&
+.P2
+.P1 .1i
+&de fx \e"process footnote overflow
+&if \e\enx .di fy \e"divert overflow
+&&
+.P2
+.P1 .1i
+&de fn \e"start footnote
+&da FN \e"divert (append) footnote
+&ev 1 \e"in environment 1
+&if \e\en+x=1 .fs \e"if 1st, separator
+&fi \e"fill mode
+&&
+.P2
+.P1 .1i
+&de ef \e"end footnote
+&br \e"finish output
+&nr z \e\en(.v \e"save spacing
+&ev \e"pop ev
+&di \e"end diversion
+&nr y -\e\en(dn \e"new footer position,
+&if \e\enx=1 .nr y -(\e\en(.v-\e\enz) \e
+ \e"uncertainty correction
+&ch fo \e\enyu \e"y is negative
+&if (\e\en(nl+1v)>(\e\en(.p+\e\eny) \e
+&ch fo \e\en(nlu+1v \e"didn't fit
+&&
+.P2
+.P1 .1i
+&de fs \e"separator
+\el'1i' \e"1 inch rule
+&br
+&&
+.P2
+.P1 .1i
+&de fz \e"get leftover footnote
+&fn
+&nf \e"retain vertical size
+&fy \e"where fx put it
+&ef
+&&
+.P2
+.P1 .1i
+&nr b 1.0i \e"bottom margin size
+&wh 0 hd \e"header trap
+&wh 12i fo \e"footer trap->temp pos
+&wh -\e\enbu fx \e"fx at footer position
+&ch fo -\e\enbu \e"conceal fx with fo
+.P2
+.PP
+The header \&\f(CWhd\fR initializes a footnote count register \&\f(CWx\fR,
+and sets both the current footer trap position register \&\f(CWy\fR and
+the footer trap itself to a nominal position specified in
+register \&\f(CWb\fR.
+In addition, if the register \&\f(CWdn\fR indicates a leftover footnote,
+\&\f(CWfz\fR is invoked to reprocess it.
+The footnote start macro \&\f(CWfn\fR begins a diversion (append) in environment 1,
+and increments the count \&\f(CWx\fR; if the count is one, the footnote separator \&\f(CWfs\fR
+is interpolated.
+The separator is kept in a separate macro to permit user redefinition.
+.PP
+The footnote end macro \&\f(CWef\fR restores
+the previous environment and ends the diversion after saving the spacing size in register \&\f(CWz\fR.
+\&\f(CWy\fR is then decremented by the size of the footnote, available in \&\f(CWdn\fR;
+then on the first footnote, \&\f(CWy\fR is further decremented by the difference
+in vertical baseline spacings of the two environments, to
+prevent the late triggering of the footer trap from causing the last
+line of the combined footnotes to overflow.
+The footer trap is then set to the lower (on the page) of \&\f(CWy\fR or the current page position (\&\f(CWnl\fR)
+plus one line, to allow for printing the reference line.
+.PP
+If indicated by \&\f(CWx\fR, the footer \&\f(CWfo\fR rereads the footnotes from \&\f(CWFN\fR in nofill mode
+in environment 1,
+and deletes \&\f(CWFN\fR.
+If the footnotes were too large to fit, the macro \&\f(CWfx\fR will be trap-invoked to redivert
+the overflow into \&\f(CWfy\fR,
+and the register \&\f(CWdn\fR will later indicate to the header whether \&\f(CWfy\fR is empty.
+.PP
+Both \&\f(CWfo\fR and \&\f(CWfx\fR are planted in the nominal footer trap position in an order
+that causes \&\f(CWfx\fR to be concealed unless the \&\f(CWfo\fR trap is moved.
+The footer then terminates the overflow diversion, if necessary, and
+zeros \&\f(CWx\fR to disable \&\f(CWfx\fR,
+because the uncertainty correction
+together with a not-too-late triggering of the footer can result
+in the footnote rereading finishing before reaching the \&\f(CWfx\fR trap.
+.PP
+A good exercise for the student is to combine the multiple-column and footnote mechanisms.
+.SH
+The Last Page
+.PP
+After the last input file has ended, \*(NR and \*(TR
+invoke the \fIend macro\fR (§7), if any,
+and when it finishes, eject the remainder of the page.
+During the eject, any traps encountered are processed normally.
+At the end of this last page, processing terminates
+unless a partial line, word, or partial word remains.
+If it is desired that another page be started, the end-macro
+.P1 .1i
+&de en \e"end-macro
+\ec
+\&'bp
+&&
+&em en
+.P2
+will deposit a null partial word,
+and produce another last page.
+....1C
+.sp 100
+.BP
+........
+.TL
+Special Character Names
+.SP
+.PP
+The following table lists names for a set of characters,
+most of which have traditionally been provided by \*(TR using
+the `special' or `symbol' font.
+Many of these sequences are old ways to get what are now Unicode
+characters;
+Lucida Sans, for example, has glyphs corresponding to many of these
+but does not have the special sequences.
+Therefore
+the \*(TR sequence
+.CW \e(*F
+gives the character \(*F from the Times font instead of the
+character Φ from the current font, in this case Lucida Sans.
+Not all sequences print on any particular device, including this one; Peter
+faces appear in their place.
+.TS
+center;
+l l20fCW l l20fCW l l20fCW.
+\&\' \e' \(*m \e(*m \(~= \e(~=
+\` \e` \(*n \e(*n \(ap \e(ap
+\(em \e(em \(*c \e(*c \(!= \e(!=
+\(en \e(en \(*o \e(*o \(-> \e(->
+\(hy \e(hy \(*p \e(*p \(<- \e(<-
+\- \e- \(*r \e(*r \(ua \e(ua
+\(bu \e(bu \(*s \e(*s \(da \e(da
+\(sq \e(sq \(ts \e(ts \(mu \e(mu
+\(ru \e(ru \(*t \e(*t \(di \e(di
+\(14 \e(14 \(*u \e(*u \(+- \e(+-
+\(12 \e(12 \(*f \e(*f \(cu \e(cu
+\(34 \e(34 \(*x \e(*x \(ca \e(ca
+\(fi \e(fi \(*q \e(*q \(sb \e(sb
+\(fl \e(fl \(*w \e(*w \(sp \e(sp
+\(ff \e(ff \(*A \e(*A \(ib \e(ib
+\(Fi \e(Fi \(*B \e(*B \(ip \e(ip
+\(Fl \e(Fl \(*G \e(*G \(if \e(if
+\(de \e(de \(*D \e(*D \(pd \e(pd
+\(dg \e(dg \(*E \e(*E \(gr \e(gr
+\(fm \e(fm \(*Z \e(*Z \(no \e(no
+\(ct \e(ct \(*Y \e(*Y \(is \e(is
+\(rg \e(rg \(*H \e(*H \(pt \e(pt
+\(co \e(co \(*I \e(*I \(es \e(es
+\(pl \e(pl \(*K \e(*K \(mo \e(mo
+\(mi \e(mi \(*L \e(*L \(br \e(br
+\(eq \e(eq \(*M \e(*M \(dd \e(dd
+\(** \e(** \(*N \e(*N \(rh \e(rh
+\(sc \e(sc \(*C \e(*C \(lh \e(lh
+\(aa \e(aa \(*O \e(*O \(L1 \e(bs
+\(ga \e(ga \(*P \e(*P \(or \e(or
+\(ul \e(ul \(*R \e(*R \(ci \e(ci
+\(sl \e(sl \(*S \e(*S \(lt \e(lt
+\(*a \e(*a \(*T \e(*T \(lb \e(lb
+\(*b \e(*b \(*U \e(*U \(rt \e(rt
+\(*g \e(*g \(*F \e(*F \(rb \e(rb
+\(*d \e(*d \(*X \e(*X \(lk \e(lk
+\(*e \e(*e \(*Q \e(*Q \(rk \e(rk
+\(*z \e(*z \(*W \e(*W \(bv \e(bv
+\(*y \e(*y \(sr \e(sr \(lf \e(lf
+\(*h \e(*h \(rn \e(rn \(rf \e(rf
+\(*i \e(*i \(>= \e(>= \(lc \e(lc
+\(*k \e(*k \(<= \e(<= \(rc \e(rc
+\(*l \e(*l \(== \e(== \d\h'-5m'\(LH\u \e(LH
+.TE