]> git.lizzy.rs Git - plan9front.git/blob - sys/doc/troff.ms
add cycv kernel
[plan9front.git] / sys / doc / troff.ms
1 .nr *% \n(%#u+7u
2 .ds NR "\f2nroff\fP
3 .ds TR "\f2troff\|\fP
4 .ds Tr \f2Troff\|\fP
5 .ds Nr \f2Nroff\fP
6 .               \" CW - constant width font not from -ms
7 .de T&
8 .X "END US
9 .X "US T&
10 ..
11 .de CW
12 .nr PQ \\n(.f
13 .if \\n(.$=0 .ft CW
14 .if \\n(.$>0 \%\&\\$3\f(CW\\$1\\f\\n(PQ\\$2
15 ..
16 .de BI
17 .nr PQ \\n(.f
18 .if \\n(.$=0 .ft 4
19 .if \\n(.$>0 \%\&\\$3\f2\\$1\\f\\n(PQ\\$2
20 ..
21 .de UC
22 \\$3\s-2\\$1\s+2\\$2
23 ..
24 .am NH
25 .nr p \\np+1
26 .nr s 0 1
27 ..
28 .fp 4 BI LucidaSansI
29 .bd 4 3
30 .de sc
31 .LP
32 \f4\\np.\\n+s.\ \ \\$1\f1\0
33 ..
34 .de bt
35 .SP .25
36 .LP
37 .NE 2.1
38 .ta 1.5i 2.5i 3.5i 4.5i
39 \\$1    \\$2    \\$3    \\$4
40 .IP "" 0.8i
41 ....br
42 \\$5
43 ..
44 .
45 .
46 .
47 .
48 .
49 .
50 .
51 .TL
52 Troff User's Manual
53 .AU
54 Joseph F. Ossanna
55 Brian W. Kernighan
56 .sp
57 bwk@research.bell-labs.com
58 .EQ
59 delim @@
60 define cw % "\&" font CW %
61 .EN
62 .SH
63 Introduction
64 .PP
65 \*(Tr and \*(NR are text processors 
66 that format text for typesetter- and
67 typewriter-like terminals, respectively.
68 They accept lines of text interspersed with lines of
69 format control information and
70 format the text into a printable, paginated document
71 having a user-designed style.
72 \*(Tr and \*(NR offer
73 unusual freedom in document styling:
74 arbitrary style headers and footers;
75 arbitrary style footnotes;
76 multiple automatic sequence numbering for paragraphs, sections, etc;
77 multiple column output;
78 dynamic font and point-size control;
79 arbitrary horizontal and vertical local motions at any point;
80 and
81 a family of automatic overstriking, bracket construction, and
82 line-drawing functions.
83 .
84 .de TL
85 .LP
86 .ce
87 .ps +2
88 .ft B
89 ..
90 .
91 .PP
92 .I Troff
93 produces its output in a device-independent form,
94 although parameterized for a specific device;
95 \*(TR output must be processed by a driver for that
96 device to produce printed output.
97 .PP
98 \*(Tr and \*(NR are highly compatible with each other and it is almost always
99 possible to prepare input acceptable to both.
100 Conditional input is provided to enable
101 the user to embed input expressly destined for either program.
102 \*(Nr can prepare output directly for a variety of terminal types and
103 is capable of utilizing the full resolution of each terminal.
104 \*(Nr is the same program as \*(TR; in fact, on Plan 9 
105 \*(NR is a shell script that calls \*(TR with the
106 .CW -N
107 argument.
108 .SH
109 Background to the Plan 9 Edition
110 .PP
111 The primary change to \*(TR and \*(NR for Plan 9 is
112 support of the Unicode Standard, which was added during
113 1992 and 1993.  There are two results.  First, there is much
114 less need for the myriad of two-character names that are so
115 much a part of \*(TR lore; in Plan 9, for example, one naturally uses the
116 Unicode character ½ instead of \*(TR\|'s
117 .CW \\e(12 .
118 Second, the output device, though called
119 .CW utf ,
120 is almost always a form of PostScript printer;
121 the panoply of special drivers for different typesetters
122 has largely disappeared.
123 Unfortunately, not all PostScript printers can cope
124 with Unicode characters, so there remains a need for
125 programs that synthesize PostScript characters from bitmaps;
126 this is especially true for Asian languages.
127 .SH
128 Background to the Second Edition
129 .PP
130 \*(Tr
131 was originally written by the late Joe Ossanna
132 in about 1973, in assembly language for the
133 .UC PDP -11,
134 to drive the Graphic Systems CAT typesetter.
135 It was rewritten in C around 1975,
136 and underwent slow but steady evolution until
137 Ossanna's death late in 1977.
138 .PP
139 In 1979, Brian Kernighan
140 modified
141 \*(TR
142 so that it would produce output for a variety of typesetters,
143 while retaining its input specifications.
144 Over the decade from 1979 to 1989,
145 the internals
146 have been modestly revised,
147 though much of the code remains as it was when Ossanna wrote it.
148 .PP
149 \*(Tr
150 reads parameter files
151 each time it is invoked, to
152 set values for machine resolution,
153 legal type sizes and fonts, and character names,
154 character widths
155 and the like.
156 \*(Tr
157 output is
158 .UC ASCII
159 characters
160 in a simple language
161 that describes where each character is to be placed
162 and in what size and font.
163 A post-processor must be written for each device
164 to convert this typesetter-independent language
165 into specific instructions for that device.
166 .PP
167 The output language contains information that was not readily
168 identifiable in the older output.
169 In the newer language, the beginning of each page, line, and word
170 is marked,
171 so post-processors can do device-specific optimizations
172 such as sorting the data vertically or printing it boustrophedonically,
173 independent of
174 \*(TR.
175 .PP
176 Capabilities for graphics have been added:
177 \*(TR
178 recognizes commands for drawing diagonal lines,
179 circles, ellipses, circular arcs,
180 and quadratic B-splines.
181 There are also ways to pass arbitrary information to the output,
182 unprocessed by
183 \*(TR.
184 .PP
185 A number of limitations have been eased or eliminated.
186 A document may have an arbitrary number of fonts on any page
187 (if the output device permits it, of course).
188 Fonts may be accessed merely by naming them;
189 ``mounting'' is no longer necessary.
190 There are no limits on the number of characters.
191 \H'8'Character height\H'10' and \S'-1'sl\S'0'a\S'1'nt\S'0' may be set
192 independently of width.
193 .PP
194 The remainder of this document contains a description of
195 usage and command-line options;
196 a summary of requests, escape sequences, and pre-defined number registers;
197 a reference manual;
198 tutorial examples;
199 and a list of commonly-available characters.
200 .SH
201 Acknowledgements
202 .PP
203 Joe Ossanna's
204 \*(TR
205 remains a remarkable accomplishment.
206 For more than twenty years, it has proven a robust tool,
207 taking unbelievable abuse from a variety of preprocessors
208 and being forced into uses that were never conceived of
209 in the original design,
210 all with considerable grace under fire.
211 .PP
212 Recent versions of \*(TR have profited from
213 significant code improvements by
214 Jaap Akkerhuis, Dennis Ritchie, Ken Thompson, and Molly Wagner.
215 UTF facilities owe much to Jaap Akkerhuis.
216 Andrew Hume, Doug McIlroy, Peter Nelson and Ravi Sethi made valuable suggestions on the manual.
217 I fear that the remaining bugs are my fault.
218 .sp 100
219 .BP
220 .TL
221 Usage
222 .SP
223 .PP
224 \*(Tr or \*(NR is invoked as
225 .P1
226 troff  \fIoptions  files\fP
227 nroff  \fIoptions  files\fP
228 .P2
229 where @options@ represents any of a number of option arguments
230 and @files@ represents the list of files containing the document
231 to be formatted.
232 An argument consisting of a single minus
233 .CW - ' `
234 represents standard input.
235 If no filenames are given input is taken from the standard input.
236 The options, which may appear in any order so long as they appear
237 before the files, are:
238 .TS
239 center;
240 lfCW lw(4.5i).
241 -m@name@        T{
242 Read the macro file
243 @cw /sys/lib/tmac. name@
244 before the input @files@.
245 T}
246 -T@name@        T{
247 Specifies
248 the type of the output device.
249 Specific devices are site-dependent.
250 For
251 \*(TR,
252 the most useful name is
253 .CW utf .
254 For
255 \*(NR,
256 useful names include
257 @cw "37"@ for the (default) Model 37 Teletype,
258 @cw lp@ for ``dumb'' line printer terminals (no half-line motions,
259 no reverse motions),
260 and @cw think@ for the HP ThinkJet printer.
261 T}
262 -i      T{
263 Read standard input after the input files are exhausted.
264 T}
265 -o@list@        T{
266 Print only pages whose page numbers appear in @list@,
267 which consists of comma-separated numbers and number ranges.
268 A number range has the form @N-M@
269 and means pages @N@ through @M@;
270 a initial @-N@ means
271 from the beginning to page @N@; and a final @N-@ means
272 from @N@ to the end.
273 T}
274 -n@N@   T{
275 Number first generated page @N@.
276 T}
277 -r@aN@  T{
278 Set number register @a@ (one-character) to @N@.
279 T}
280 -s@N@   T{
281 Stop every @N@ pages.
282 \*(Nr will halt prior to every @N@ pages (default @N=1@)
283 to allow paper loading or
284 changing, and will resume upon receipt of a newline.
285 \*(Tr will include a ``pause'' code every @N@ pages;
286 its meaning, if any, depends on the output device.
287 T}
288 -u@N@   T{
289 Set amount of emboldening for the
290 .CW bd
291 request to @N@.
292 T}
293 -F@path@        T{
294 Look in directory @path@ for font information;
295 the defaults are
296 .CW /sys/lib/troff/font
297 and
298 .CW /sys/lib/troff/term
299 for \*(TR
300 and \*(NR respectively.
301 T}
302 .sp .5
303         T{
304                   \*(TR Only
305 T}
306 -a      T{
307 Send a printable approximation
308 of the results to the standard output.
309 T}
310 .sp .5
311         T{
312                   \*(NR Only
313 T}
314 -e      T{
315 Produce equally-spaced words in adjusted
316 lines, using full terminal resolution.
317 T}
318 -h      T{
319 Use tabs instead of spaces
320 to speed up printing.
321 T}
322 -q      T{
323 Invoke the simultaneous input-output mode of the @cw rd@ request.
324 T}
325 .TE
326 .PP
327 Each option is a separate argument;
328 for example,
329 .P1
330 troff -Tutf -ms -mpictures -o4,6,8-10 \f2file1 file2\fP
331 .P2
332 requests formatting of pages 4, 6, and 8 through 10 of a document contained in the files
333 named \f2file1\fP and \f2file2\fP,
334 specifies the output in UTF,
335 and invokes the macro packages
336 .CW -ms
337 and
338 .CW -mpictures .
339 .PP
340 Various pre- and post-processors are available for use with \*(NR and \*(TR.
341 These include the equation preprocessor
342 .I eqn
343 (for \*(TR only),
344 the table-construction preprocessor
345 .I tbl ,
346 and
347 .I pic 
348 and
349 .I grap
350 for various forms of graphics.
351 .sp 100
352 .BP
353 .TL
354 Request Summary
355 .PP
356 In the following table,
357 the notation @+- N@ in the
358 .BI "Request Form
359 column means that the forms @N@, @+N@, or @-N@ are permitted,
360 to set the parameter to @N@, increment it by @N@, or decrement it by @N@,
361 respectively.
362 Plain @N@ means that the value is used to set the parameter.
363 .BI "Initial Values
364 separated by 
365 .CW ;
366 are for
367 \*(TR
368 and
369 \*(NR
370 respectively.
371 In the 
372 .BI Notes
373 column,
374 .TS
375 center;
376 c lw(4.5i).
377 B       T{
378 Request normally causes a break.
379 The use of
380 .CW ' \&
381 as control character (instead of
382 .CW . )\&
383 suppresses the break function.
384 T}
385 D       T{
386 Mode or relevant parameters associated with current diversion level.
387 T}
388 E       T{
389 Relevant parameters are a part of the current environment.
390 T}
391 O       T{
392 Must stay in effect until logical output.
393 T}
394 P       T{
395 Mode must be still or again in effect at the time of physical output.
396 T}
397 T       T{
398 \*(TR only; no effect in \*(NR.
399 T}
400 @bold v@, @bold p@, @bold m@, @bold u@  T{
401 Default scale indicator; if not specified, scale indicators are ignored.
402 T}
403 .TE
404 .sp
405 .tr &.
406 .ps 9
407 .vs 11
408 .nr z 0 1
409 .TS
410 lf2 lf2 lf2 lf2 lf2
411 lf2 lf2 lf2 lf2 lf2
412 lfCW l l l l.
413 Request Initial If No
414 Form    Value   Argument        Notes   Explanation
415 .sp .5
416 .T&
417 lf3 s s s s.
418 \\n+z.  General Information
419 .sp .5
420 .T&
421 lf3 s s s s
422 lfCW l l l l.
423 \\n+z.  Font and Character Size Control
424 .sp .5
425 &ps @+- N@      10 point        previous        E,T     Point size; also @cw "\es" +- N@.
426 &ss @N@ 12/36\fBm\fP    ignored E,T     Space-character size set to @N/36@ em.
427 &cs @ F~N~ M@   off     -       P,T     Constant character space (width) mode (font @F@).
428 &bd @F~N@       off     -       P,T     Embolden font @F@ by @N-1@ units.
429 &bd S@~F~N@     off     -       P,T     Embolden Special Font when current font is @F@.
430 &ft@~F@ Roman   previous        E       Change to font @F@; also @cw "\ef" x@, @cw "\ef(" xx@, @cw "\ef" N@.
431 &fp@~N~F~L@     R,I,B,...,S     ignored -       Mount font named @F@ on physical position @N <= 1@;
432                                   long name is @L@ if given.
433 .sp .5
434 .T&
435 lf3 s s s s
436 lfCW l l l l.
437 \\n+z.  Page Control
438 &pl @+- N@      11i     11i     @bold v@        Page length.
439 &bp @+- N@      @N=1@   -       B,@bold v@      Eject current page; next page number @N@.
440 &pn @+- N@      @N=1@   ignored -       Next page number @N@.
441 &po @+- N@      1i; 0   previous        @bold v@        Page offset.
442 &ne @N@ -       @N=1 roman v@   D,@bold v@      Need @N@ vertical space.
443 &mk @R@ none    internal        D       Mark current vertical place in register @R@.
444 &rt @+- N@      none    internal        D,@bold v@      Return (upward only) to marked vertical place.
445 .sp .5
446 .T&
447 lf3 s s s s
448 lfCW l l l l.
449 \\n+z.  Text Filling, Adjusting, and Centering
450 &br     -       -       B       Break.
451 &fi     fill    -       B,E     Fill output lines.
452 &nf     fill    -       B,E     No filling or adjusting of output lines.
453 &ad @c@ adj, both       adjust  E       Adjust output lines with mode @c@;  @c = cw l , cw r , cw c , cw b , none@
454 &na     adjust  -       E       No output line adjusting.
455 &ce @N@ off     @N=1@   B,E     Center next @N@ input text lines.
456 .sp .5
457 .T&
458 lf3 s s s s
459 lfCW l l l l.
460 \\n+z.  Vertical Spacing
461 &vs @N@ 12p; 1/6i       previous        E,@bold p@      Vertical baseline spacing (@V@).
462 &ls @N@ @N=1@   previous        E       Output @N-1@ @bold v@'s after each text output line.
463 &sp @N@ -       @N=1@v  B,@bold v@      Space vertical distance @N@ in either direction.
464 &sv @N@ -       @N=1@v  @bold v@        Save vertical distance @N@.
465 &os     -       -       -       Output saved vertical distance.
466 &ns     space   -       D       Turn no-space mode on.
467 &rs     -       -       D       Restore spacing; turn no-space mode off.
468 .sp .5
469 .T&
470 lf3 s s s s
471 lfCW l l l l.
472 \\n+z.  Line Length and Indenting
473 &ll @+- N@      6.5i    previous        E,@bold m@      Line length.
474 &in @+- N@      @N=0@   previous        B,E,@bold m@    Indent.
475 &ti @+- N@      -       ignored B,E,@bold m@    Temporary indent.
476 .sp .5
477 .ne 2.1
478 .T&
479 lf3 s s s s
480 lfCW l l l l.
481 \\n+z.  Macros, Strings, Diversion, and Position Traps
482 &de @xx~yy@     -       @.yy= cw ".."@  -       Define or redefine macro @xx@; end at call of @yy@.
483 &am @xx~yy@     -       @.yy= cw ".."@  -       Append to a macro.
484 &ds @xx~string@ -       ignored -       Define a string @xx@ containing @string@.
485 &as @xx~string@ -       ignored -       Append @string@ to string @xx@.
486 &rm @xx@        -       ignored -       Remove request, macro, or string.
487 &rn @xx~yy@     -       ignored -       Rename request, macro, or string @xx@ to @yy@.
488 &di @xx@        -       end     D       Divert output to macro @xx@.
489 &da @xx@        -       end     D       Divert and append to @xx@.
490 &wh @N~xx@      -       -       @bold v@        Set location trap; negative is w.r.t. page bottom.
491 &ch @xx~N@      -       -       @bold v@        Change trap location.
492 &dt @N~xx@      -       off     D,@bold v@      Set a diversion trap.
493 &it @N~xx@      -       off     E       Set an input-line count trap.
494 &em @xx@        none    none    -       End macro is @xx@.
495 .sp .5
496 .T&
497 lf3 s s s s
498 lfCW l l l l.
499 \\n+z.  Number Registers
500 &nr @R~+- N~M@          -       @bold u@        Define and set number register @R@;
501                                   auto-increment by @M@.
502 &af @R~c@       arabic  -       -       Assign format to register @R@ (@c= cw "1" , cw i , cw I , cw a , cw A@).
503 &rr @R@ -       -       -       Remove register @R@.
504 .sp .5
505 .T&
506 lf3 s s s s
507 lfCW l l l l.
508 \\n+z.  Tabs, Leaders, and Fields
509 &ta@~Nt~. . .@  0.5i; 0.8n      none    E,@bold m@      Tab settings; left-adjusting, unless
510                                   @t= cw R@ (right), @cw C@ (centered).
511 &tc@~c@ none    none    E       Tab repetition character.
512 &lc@~c@ @cw "."@        none    E       Leader repetition character.
513 &fc@~a~b@       off     off     -       Set field delimiter @a@ and pad character @b@.
514 .sp .5
515 .T&
516 lf3 s s s s
517 lfCW l l l l.
518 \\n+z.  Input and Output Conventions and Character Translations
519 &ec@~c@ \e      \e      -       Set escape character.
520 &eo     on      -       -       Turn off escape character mechanism.
521 &lg@~N@ on; -   on      T       Ligature mode on if @N>0@.
522 &ul@~N@ off     @N=1@   E       Underline (italicize in \*(TR\^) @N@ input lines.
523 &cu@~N@ off     @N=1@   E       Continuous underline in \*(NR; in \*(TR, like @cw ul@.
524 &uf@~F@ Italic  Italic  -       Underline font set to @F@ (to be switched to by @cw ul@).
525 &cc@~c@ @cw .@  @cw .@  E       Set control character to @c@.
526 &c2@~c@ @cw "'"@        @cw "'"@        E       Set no-break control character to @c@.
527 &tr@~abcd....@  none    -       O       Translate @a@ to @b@, etc., on output.
528 .sp .5
529 .T&
530 lf3 s s s s.
531 \\n+z.  Local Horizontal and Vertical Motions, and the Width Function
532 .sp .5
533 .T&
534 lf3 s s s s.
535 \\n+z.  Overstrike, Bracket, Line-drawing, Graphics, and Zero-width Functions
536 .sp .5
537 .T&
538 lf3 s s s s
539 lfCW l l l l.
540 \\n+z.  Hyphenation.
541 &nh     hyphenate       -       E       No hyphenation.
542 &hy@~N@ hyphenate       hyphenate       E       Hyphenate; @N =@ mode.
543 &hc@~c@ @cw "\e%"@      @cw "\e%"@      E       Hyphenation indicator character @c@.
544 &hw@~word~. . .@                ignored -       Add words to hyphenation dictionary.
545 .sp .5
546 .T&
547 lf3 s s s s
548 lfCW l l l l.
549 \\n+z.  Three-Part Titles.
550 &tl@~'l'c'r'@           -       -       Three-part title; delimiter may be any character.
551 &pc@~c@ @cw %@  off     -       Page number character.
552 &lt@~+- N@      6.5i    previous        E,@bold m@      Length of title.
553 .sp .5
554 .T&
555 lf3 s s s s
556 lfCW l l l l.
557 \\n+z.  Output Line Numbering.
558 &nm@~+- N^M^S^I@                off     E       Number mode on or off, set parameters.
559 &nn@~N@ -       @N=1@   E       Do not number next @N@ lines.
560 .sp .5
561 .ne 2
562 .T&
563 lf3 s s s s
564 lfCW l l l l.
565 \\n+z.  Conditional Acceptance of Input
566 &if@~c~any@             -       -       If condition @c@ true, accept @any@ as input;
567                                   for multi-line, use @cw "\e{" any cw "\e}"@.
568 &if !@c~any@            -       -       If condition @c@ false, accept @any@.
569 &if@~N~any@             -       @bold u@        If expression @N > 0@, accept @any@.
570 &if !@N~any@            -       @bold u@        If expression @N <= 0@ [sic], accept @any@.
571 &if@~ 's1 's2 '~any@            -       -       If string @s1@ identical to @s2@, accept @any@.
572 &if !@ 's1 's2 '~any@           -       -       If string @s1@ not identical to @s2@, accept @any@.
573 &ie@~c~any@             -       @bold u@        If portion of if-else; all above forms (like @cw "if"@).
574 &el@~any@               -       -       Else portion of if-else.
575 .sp .5
576 .T&
577 lf3 s s s s
578 lfCW l l l l.
579 \\n+z.  Environment Switching
580 &ev@~N@ @N=0@   previous        -       Environment switch (push down).
581 .sp .5
582 .T&
583 lf3 s s s s
584 lfCW l l l l.
585 \\n+z.  Insertions from the Standard Input
586 &rd@~prompt@    -       @prompt@=\s-1BEL\s+1    -       Read insertion.
587 &ex     -       -       -       Exit.
588 .sp .5
589 .T&
590 lf3 s s s s
591 lfCW l l l l.
592 \\n+z.  Input/Output File Switching
593 &so@~filename@          -       -       Switch source file (push down).
594 &nx@~filename@          end-of-file     -       Next file.
595 &sy@~string@            -       -       Execute program @string@.  Output not interpolated.
596 &pi@~string@            -       -       Pipe output to program @string@.
597 &cf@~filename@          -       -       Copy file contents to \*(TR output.
598 .sp .5
599 .T&
600 lf3 s s s s
601 lfCW l l l l.
602 \\n+z.  Miscellaneous
603 &mc@~c~N@       -       off     E,@bold m@      Set margin character @c@ and separation @N@.
604 &tm@~string@    -       newline -       Print @string@ on terminal (standard error).
605 &ab@~string@    -       newline -       Print @string@ on standard error, exit program.
606 &ig@~yy@        -       @.yy= cw ".."@  -       Ignore input until call of @yy@.
607 &lf@~N ~f@              -       -       Set input line number to @N@ and filename to @f@.
608 &pm@~t@ -       all     -       Print macro names, sizes; if @t@ present, print total.
609 &fl     -       -       B       Flush output buffer.
610 .sp .5
611 .T&
612 lf3 s s s s.
613 \\n+z.  Output and Error Messages
614 .sp .5
615 \\n+z.  Output Language
616 .sp .5
617 \\n+z.  Device and Font Description Files
618 .TE
619 .br
620 .nr zz 9
621 .de cl
622 .ie \\n+(cl<\n(zz \{\
623 .       po +\\n(.lu/\n(zzu
624 .       rt\}
625 .el \{.po 1i\}
626 ..
627 .nr cl 0 1
628 .di zz
629 .ta .45iR
630 ... was .35
631 .nf
632 .ps 9
633 .vs 10.5
634 \f(CWab\fP      20
635 \f(CWad\fP      4
636 \f(CWaf\fP      8
637 \f(CWam\fP      7
638 \f(CWas\fP      7
639 \f(CWbd\fP      2
640 \f(CWbp\fP      3
641 \f(CWbr\fP      4
642 \f(CWc2\fP      10
643 \f(CWcc\fP      10
644 \f(CWce\fP      4
645 \f(CWcf\fP      19
646 \f(CWch\fP      7
647 \f(CWcs\fP      2
648 \f(CWcu\fP      10
649 \f(CWda\fP      7
650 \f(CWde\fP      7
651 \f(CWdi\fP      7
652 \f(CWds\fP      7
653 \f(CWdt\fP      7
654 \f(CWec\fP      10
655 \f(CWel\fP      16
656 \f(CWem\fP      7
657 \f(CWeo\fP      10
658 \f(CWev\fP      17
659 \f(CWex\fP      18
660 \f(CWfc\fP      9
661 \f(CWfi\fP      4
662 \f(CWfl\fP      20
663 \f(CWfp\fP      2
664 \f(CWft\fP      2
665 \f(CWhc\fP      13
666 \f(CWhw\fP      13
667 \f(CWhy\fP      13
668 \f(CWie\fP      16
669 \f(CWif\fP      16
670 \f(CWig\fP      20
671 \f(CWin\fP      6
672 \f(CWit\fP      7
673 \f(CWlc\fP      9
674 \f(CWlg\fP      10
675 \f(CWlf\fP      20
676 \f(CWll\fP      6
677 \f(CWls\fP      5
678 \f(CWlt\fP      14
679 \f(CWmc\fP      20
680 \f(CWmk\fP      3
681 \f(CWna\fP      4
682 \f(CWne\fP      3
683 \f(CWnf\fP      4
684 \f(CWnh\fP      13
685 \f(CWnm\fP      15
686 \f(CWnn\fP      15
687 \f(CWnr\fP      8
688 \f(CWns\fP      5
689 \f(CWnx\fP      19
690 \f(CWos\fP      5
691 \f(CWpc\fP      14
692 \f(CWpi\fP      19
693 \f(CWpl\fP      3
694 \f(CWpm\fP      20
695 \f(CWpn\fP      3
696 \f(CWpo\fP      3
697 \f(CWps\fP      2
698 \f(CWrd\fP      18
699 \f(CWrm\fP      7
700 \f(CWrn\fP      7
701 \f(CWrr\fP      8
702 \f(CWrs\fP      5
703 \f(CWrt\fP      3
704 \f(CWso\fP      19
705 \f(CWsp\fP      5
706 \f(CWss\fP      2
707 \f(CWsv\fP      5
708 \f(CWsy\fP      19
709 \f(CWta\fP      9
710 \f(CWtc\fP      9
711 \f(CWti\fP      6
712 \f(CWtl\fP      14
713 \f(CWtm\fP      20
714 \f(CWtr\fP      10
715 \f(CWuf\fP      10
716 \f(CWul\fP      10
717 \f(CWvs\fP      5
718 \f(CWwh\fP      7
719 .di
720 .nr aa \n(dn/\n(zz
721 .ne \\n(aau+10p
722 .sp
723 .SP 2
724 .TL
725 Alphabetical Request and Section Number Cross Reference
726 .SP .5
727 .LP
728 .sp .5
729 .nf
730 .wh \n(nlu+\n(aau cl
731 .nr qq \n(nlu+\n(aau
732 .ps
733 .vs
734 .mk
735 .zz
736 .rt
737 .sp \n(.tu
738 .ch cl 12i
739 .sp 100
740 .BP
741 .TL
742 Escape Sequences for Characters, Indicators, and Functions
743 .SP .5
744 .LP
745 .ps -1
746 .vs -1
747 .TS
748 center;
749 c2 l
750 c2 l2 l
751 n2 l2fCW l.
752 .ft 4
753 Section Escape
754 Reference       Sequence        Meaning
755 .ft
756 .sp .5
757 10.1    \e\e    \&\f(CW\e\fP prevents or delays the interpretation of \&\f(CW\e\fP
758 10.1    \ee     Printable version of the current escape character.
759 2.1     \e'     \' (acute accent); equivalent to \&\f(CW\e(aa\fP
760 2.1     \e`     \` (grave accent); equivalent to \&\f(CW\e(ga\fP
761 2.1     \e\-    \- Minus sign in the current font
762 7.      \e\^.   Period (dot) (see \&\f(CWde\fP)
763 11.1    \e\f2space\fP   Unpaddable space-size space character
764 11.1    \e0     Digit width space
765 11.1    \e|     1/6 em narrow space character (zero width in \*(NR\^)
766 11.1    \e^     1/12 em half-narrow space character (zero width in \*(NR\^)
767 .tr &&
768 4.1     \e&     Non-printing, zero width character
769 .tr &.
770 10.6    \e!     Transparent line indicator
771 10.8    \e"     Beginning of comment; continues to end of line
772 13.     \e%     Default optional hyphenation character
773 2.1     \e(@xx@ Character named @xx@
774 7.1     \e*@x,~@\e*(@xx@        Interpolate string @x@ or @xx@
775 7.3     \e$@N@  Interpolate argument @1 <= N <= 9@
776 9.1     \ea     Non-interpreted leader character
777 12.3    \eb'@abc...@'   Bracket building function
778 4.2     \ec     Connect to next input text
779 2.1     \eC'@xyz@'      Character named @xyz@
780 11.1    \ed     Downward 1/2 em vertical motion (1/2 line in \*(NR\^)
781 12.5    \eD'@c...@'     Draw graphics function @c@ with parameters @. . .@; @c= cw l , cw c , cw e , cw a , cw "~"@
782 2.2     \ef@x,~@\ef(@xx,~@\ef@N@        Change to font named @x@ or @xx@, or position @N@
783 8.      \eg@x,~@\eg(@xx@        Format of number register @x@ or @xx@
784 11.1    \eh'@N@'        Local horizontal motion; move right @N@ (negative left)
785 2.3     \eH'@N@'        Height of current font is @N@
786 11.3    \ek@x@  Mark horizontal input place in register @x@
787 12.4    \el'@Nc@'       Horizontal line drawing function (optionally with @c@ )
788 12.4    \eL'@Nc@'       Vertical line drawing function (optionally with @c@ )
789 8.      \en@x,~@\en(@xx@        Contents of number register @x@ or @xx@
790 2.1     \eN'@N@'        Character number @N@ on current font
791 12.1    \eo'@abc...@'   Overstrike characters @a,~ b,~ c@, ...
792 4.1     \ep     Break and spread output line
793 11.1    \er     Reverse 1 em vertical motion (reverse line in \*(NR\^)
794 2.3     \es@N,~@\es@+- N@       Point-size change function; also @cw "\es(" nn@, @cw "\es" +- cw "(" nn@
795 2.2     \eS'@N@'        Slant output @N@ degrees
796 9.1     \et     Non-interpreted horizontal tab
797 11.1    \eu     Reverse (up) 1/2 em vertical motion (1/2 line in \*(NR\^)
798 11.1    \ev'@N@'        Local vertical motion; move down N (negative up)
799 11.2    \ew'@string@'   Width of @string@
800 5.2     \ex'@N@'        Extra line-space function (negative before, positive after)
801 10.7    \eX'@string@'   Output @string@ as device control function
802 12.2    \ez@c@  Print @c@ with zero width (without spacing)
803 16.     \e{     Begin conditional input
804 16.     \e}     End conditional input
805 10.8    \e@newline@     Concealed (ignored) newline
806 -       \e@Z@   @Z@, any character not listed above
807 .TE
808 .ps +1
809 .vs +1
810 .LP
811 The escape sequences
812 .CW \e\e ,
813 .CW \e\^. ,
814 .CW \e" ,
815 .CW \e$ ,
816 .CW \e* ,
817 .CW \ea ,
818 .CW \en ,
819 .CW \et ,
820 .CW \eg ,
821 and
822 .CW \e@newline@
823 are interpreted in copy mode (§7.2).
824 .SP .5i
825 \0
826 .sp 100
827 .BP
828 .TL
829 Predefined Number Registers
830 .LP
831 .ps -1
832 .vs -1
833 .TS
834 c2l
835 c2 l2 l
836 n2 l2fCW l.
837 .ft 4
838 Section Register
839 Reference       Name    Description
840 .ft
841 .sp .5
842 3.      %       Current page number.
843 11.2    ct      Character type (set by \&\f(CW\ew\fP function).
844 7.4     dl      Width (maximum) of last completed diversion.
845 7.4     dn      Height (vertical size) of last completed diversion.
846 -       dw      Current day of the week (1-7).
847 -       dy      Current day of the month (1-31).
848 15.     ln      Output line number.
849 -       mo      Current month (1-12).
850 4.1     nl      Vertical position of last printed text baseline.
851 11.2    sb      Depth of string below baseline (generated by \&\f(CW\ew\fP function).
852 11.2    st      Height of string above baseline (generated by \&\f(CW\ew\fP function).
853 -       yr      Last two digits of current year.
854 .TE
855 .ps +1
856 .vs +1
857
858
859 .TL
860 Predefined Read-Only Number Registers
861 .LP
862 .ps -1
863 .vs -1
864 .TS
865 c2 l
866 c2 l2 l
867 n2 l2fCW l.
868 .ft 4
869 Section Register
870 Reference       Name    Description
871 .ft
872 .sp .5
873 19.     $$      Process id of \*(TR or \*(NR.
874 7.3     &$      Number of arguments available at the current macro level.
875 5.2     &a      Post-line extra line-space most recently used in @cw "\ex'" N cw "'" @.
876 -       &A      Set to 1 in \*(TR, if @cw -a@ option used; always 1 in \*(NR.
877 2.3     &b      Emboldening level.
878 20.     &c      Number of lines read from current input file.
879 7.4     &d      Current vertical place in current diversion; equal to @cw nl@, if no diversion.
880 2.2     &f      Current font number.
881 20.     &F      Current input file name [sic].
882 4.      &h      Text baseline high-water mark on current page or diversion.
883 11.1    &H      Available horizontal resolution in basic units.
884 6.      &i      Current indent.
885 4.2     &j      Current @cw ad@ mode.
886 4.1     &k      Current output horizontal position.
887 6.      &l      Current line length.
888 5.1     &L      Current @cw ls@ value.
889 4.      &n      Length of text portion on previous output line.
890 3.      &o      Current page offset.
891 3.      &p      Current page length.
892 7.5     .R      Number of unused number registers.
893 -       &T      Set to 1 in \*(NR, if \&\f(CW-T\fP option used; always 0 in \*(TR.
894 2.3     &s      Current point size.
895 7.5     &t      Distance to the next trap.
896 4.1     &u      Equal to 1 in fill mode and 0 in nofill mode.
897 5.1     &v      Current vertical line spacing.
898 11.1    &V      Available vertical resolution in basic units.
899 11.2    &w      Width of previous character.
900 -       &x      Reserved version-dependent register.
901 -       &y      Reserved version-dependent register.
902 7.4     &z      Name [sic] of current diversion.
903 .TE
904 .ps +1
905 .vs +1
906 .sp 100
907 .BP
908 .TL
909 Reference Manual
910 .NH
911 General Explanation
912 .sc "Form of input.
913 Input consists of \fItext lines\fR, which are destined to be printed,
914 interspersed with \fIcontrol lines\fR,
915 which set parameters or otherwise control subsequent processing.
916 Control lines begin with a \fIcontrol character\fR\(em\
917 normally \&\f(CW.\fR (period) or \&\f(CW'\fR (single quote)\(em\
918 followed by a one or two character name that specifies
919 a basic \fIrequest\fR or the substitution of
920 a user-defined \fImacro\fR in place of the control line.
921 The control character \&\f(CW'\fR suppresses the \fIbreak\fR function\(em\
922 the forced output of a partially filled line\(em\
923 caused by certain requests.
924 The control character may be separated from the request/macro name by
925 white space (spaces and/or tabs) for aesthetic reasons.
926 Names should be followed by either
927 space or newline.
928 Control lines with unrecognized names are ignored.
929 .PP
930 Various special functions may be introduced anywhere in the input by
931 means of an \fIescape\fR character, normally \&\f(CW\e\fR.
932 For example, the function
933 .CW \en@R@
934 causes the interpolation of the contents of the
935 \fInumber register R\fR
936 in place of the function;
937 here @R@ is either a single character name
938 as in \&\f(CW\en\fIx\fR,
939 or a two-character name introduced by
940 a left-parenthesis, as in \&\f(CW\en(\fIxx\fR.
941 .sc "Formatter and device resolution.
942 \*(Tr internally stores and processes dimensions in units that correspond to
943 the particular device for which output is being prepared;
944 values from 300 to 1200/inch are typical.
945 See §23.
946 \*(Nr internally uses 240 units/inch,
947 corresponding to the least common multiple of the
948 horizontal and vertical resolutions of various
949 typewriter-like output devices.
950 \*(Tr rounds horizontal/vertical numerical parameter input to the actual
951 horizontal/vertical resolution of the output device indicated by the \&\f(CW-T\fR option
952 (default
953 .CW post ).
954 \*(Nr similarly rounds numerical input to the actual resolution
955 of its output device
956 (default Model 37 Teletype).
957 .sc "Numerical parameter input.
958 Both \*(NR and \*(TR
959 accept numerical input with the appended scale
960 indicators
961 shown in the following table,
962 where
963 \fIS\fR is the current type size in points and
964 \fIV\fR is the current vertical line spacing in
965 basic units.
966 .TS
967 center box;
968 c|c
969 c|c
970 c|l.
971 Scale
972 Indicator       Meaning
973 _
974 \&\f(CWi\fR     Inch
975 \&\f(CWc\fR     Centimeter
976 \&\f(CWP\fR     Pica = 1/6 inch
977 \&\f(CWm\fR     Em = \fIS\fR points
978 \&\f(CWn\fR     En = Em/2
979 \&\f(CWp\fR     Point = 1/72 inch
980 \&\f(CWu\fR     Basic unit
981 \&\f(CWv\fR     Vertical line space \fIV\fR
982 none    Default, see below
983 .TE
984 In \*(NR, both the em and the en are taken to be equal to the
985 nominal character width,
986 which is output-device dependent;
987 common values are 1/10 and 1/12 inch.
988 Actual character widths in \*(NR need not be all the same and constructed characters
989 such as -> (→) are often extra wide.
990 The default scaling is
991 .CW m
992 for the horizontally-oriented requests
993 and functions
994 .CW ll ,
995 .CW in ,
996 .CW ti ,
997 .CW ta ,
998 .CW lt ,
999 .CW po ,
1000 .CW mc ,
1001 .CW \eh ,
1002 .CW \el ,
1003 and horizontal coordinates of
1004 .CW \eD ;
1005 .CW v
1006 for the vertically-oriented requests and functions
1007 .CW pl ,
1008 .CW wh ,
1009 .CW ch ,
1010 .CW dt ,
1011 .CW sp ,
1012 .CW sv ,
1013 .CW ne ,
1014 .CW rt ,
1015 .CW \ev ,
1016 .CW \ex ,
1017 .CW \eL ,
1018 and vertical coordinates of
1019 .CW \eD ;
1020 .CW p
1021 for the
1022 .CW vs
1023 request;
1024 and
1025 .CW u
1026 for the requests
1027 .CW nr ,
1028 .CW if ,
1029 and
1030 .CW ie .
1031 \fIAll\fR other requests ignore any scale indicators.
1032 When a number register containing an already appropriately scaled number
1033 is interpolated to provide numerical input,
1034 the unit scale indicator
1035 \&\f(CWu\fR may need to be appended to prevent
1036 an additional inappropriate default scaling.
1037 The number, @N@, may be specified in decimal-fraction form
1038 but the parameter finally stored is rounded to an integer number of basic units.
1039 Internal computations are performed in integer arithmetic.
1040 .PP
1041 The \fIabsolute position\fR indicator \&\f(CW|\fR may be prefixed
1042 to a number @N@
1043 to generate the distance to the vertical or horizontal place @N@.
1044 For vertically-oriented requests and functions, \&\f(CW|\fP@N@
1045 becomes the distance in basic units from the current vertical place on the page or in a \fIdiversion\fR (§7.4)
1046 to the vertical place @N@.
1047 For \fIall\fR other requests and functions,
1048 \&\f(CW|\fP@N@
1049 becomes the distance from
1050 the current horizontal place on the \fIinput\fR line to the horizontal place @N@.
1051 For example,
1052 .P1
1053 \&.sp |3.2c
1054 .P2
1055 will space in the required direction to 3.2 centimeters from the top of the page.
1056 .sc "Numerical expressions.
1057 .tr &&
1058 Wherever numerical input is expected,
1059 an expression involving parentheses,
1060 the arithmetic operators \&\f(CW+\fR, \&\f(CW-\fR, \&\f(CW/\fR, \&\f(CW\(**\fR, \&\f(CW%\fR (mod),
1061 and the logical operators
1062 \&\f(CW<\fR,
1063 \&\f(CW>\fR,
1064 \&\f(CW<=\fR,
1065 \&\f(CW>=\fR,
1066 \&\f(CW=\fR (or \&\f(CW==\fR),
1067 \&\f(CW&\fR\ (and),
1068 \&\f(CW:\fR\ (or)
1069 may be used.
1070 Except where controlled by parentheses, evaluation of expressions is left-to-right;
1071 there is no operator precedence.
1072 In the case of certain requests, an initial \&\f(CW+\fR or \&\f(CW-\fR is stripped
1073 and interpreted as an increment or decrement indicator respectively.
1074 In the presence of default scaling, the desired scale indicator must be
1075 attached to \fIevery\fR number in an expression
1076 for which the desired and default scaling differ.
1077 For example,
1078 if the number register \&\f(CWx\fR contains 2
1079 and the current point size is 10,
1080 then
1081 .P1
1082 \&.ll (4.25i+\enxP+3)/2u
1083 .P2
1084 will set the line length to 1/2 the sum of 4.25 inches + 2 picas + 3 ems.
1085 .sc "Notation.
1086 Numerical parameters are indicated in this manual in two ways.
1087 @+- N@ means that the argument may take the forms @N@, @+N@, or @-N@ and
1088 that the corresponding effect is to set the parameter
1089 to @N@, to increment it by @N@, or to decrement it by @N@ respectively.
1090 Plain @N@ means that an initial algebraic sign is \fInot\fR
1091 an increment indicator,
1092 but merely the sign of @N@.
1093 Generally, unreasonable numerical input is either ignored
1094 or truncated to a reasonable value.
1095 For example,
1096 most requests expect to set parameters to non-negative
1097 values;
1098 exceptions are
1099 .CW sp ,
1100 .CW wh ,
1101 .CW ch ,
1102 .CW nr ,
1103 and
1104 .CW if .
1105 The requests
1106 .CW ps ,
1107 .CW ft ,
1108 .CW po ,
1109 .CW vs ,
1110 .CW ls ,
1111 .CW ll ,
1112 .CW in ,
1113 and
1114 .CW lt 
1115 restore the previous parameter value in the absence
1116 of an argument.
1117 .PP
1118 Single character arguments are indicated by single lower case letters
1119 and
1120 one/two character arguments are indicated by a pair of lower case letters.
1121 Character string arguments are indicated by multi-character mnemonics.
1122 .NH
1123 Font and Character Size Control
1124 .sc "Character set.
1125 The \*(TR character set is defined by a description file specific to each output device (§23).
1126 There are normally several regular fonts and one or more special fonts.
1127 Characters are input as themselves,
1128 as @cw "\e(" xx@, as @cw "\eC'" name cw "'"@,
1129 or as 
1130 .CW \eN'@n@' .
1131 The form
1132 .CW \eC'@name@'
1133 permits a name of any length;
1134 the form
1135 .CW \eN'@n@'
1136 refers to the @n@-th character on the current font,
1137 whether named or not.
1138 .PP
1139 Normally the input characters
1140 .CW ` ,
1141 .CW ' ,
1142 and
1143 .CW -
1144 are printed as `, ', and - respectively;
1145 .CW \e` ,
1146 .CW \e' ,
1147 and
1148 .CW \e-
1149 produce \`, \', and \-.
1150 If the character does not exist in the font, \*(TR assumes the width is 1 em and
1151 outputs the character with a
1152 .CW C
1153 name as defined in Section 22.
1154 (This is independent of how the device handles characters unknown to it.)
1155 .PP
1156 \*(Nr has an analogous, but different, mechanism for defining legal characters
1157 and how to print them.
1158 By default all characters are valid.
1159 There are such
1160 additional characters as may be available on
1161 the output device,
1162 such characters as may be constructed
1163 by overstriking or other combination,
1164 and those that can reasonably be mapped
1165 into other printable characters.
1166 The exact behavior is determined by a driving
1167 table prepared for each device.
1168 .sc "Fonts.
1169 \*(Tr
1170 begins execution by reading information for a set of defaults fonts,
1171 said to be
1172 .I mounted ;
1173 conventionally, the first four are
1174 Times Roman (\&\f(CWR\fR),
1175 Times Italic
1176 (\&\f(CWI\fR),
1177 Times Bold
1178 (\&\f(CWB\fR),
1179 and
1180 Times Bold Italic
1181 (\&\f(CWBI\fR) ,
1182 and the last is a Special font
1183 .CW S ) (
1184 containing miscellaneous characters.
1185 (This document uses Lucida Sans in place of Times.)
1186 The set of fonts and positions is determined by the device description file,
1187 described in §23.
1188 .PP
1189 The current font, initially Roman, may be changed
1190 by the \&\f(CWft\fR request,
1191 or by embedding at any desired point
1192 \&\f(CW\ef\fIx\fR, \&\f(CW\ef(\fIxx\fR, or \&\f(CW\ef\fP@N@,
1193 where
1194 \fIx\fR and \fIxx\fR are the name of a font
1195 and @N@ is a numerical font position.
1196 .PP
1197 It is not necessary to change to the Special font;
1198 characters on that font are automatically handled
1199 as if they were physically part of the current font.
1200 The Special font may actually be several fonts;
1201 the name
1202 .CW S
1203 is reserved and is generally used for one of these.
1204 All special fonts must be mounted after regular fonts.
1205 .PP
1206 \*(Tr can be informed that any particular font is mounted
1207 by use of the \&\f(CWfp\fR request.
1208 The list of known fonts is installation dependent.
1209 In the subsequent discussion of font-related requests,
1210 @F@ represents either a one/two-character
1211 font name or the numerical font position.
1212 The current font is available (as a numerical position) in the read-only number register \&\f(CW.f\fR.
1213 .PP
1214 A request for a named but not-mounted font is honored
1215 if the font description information exists.
1216 In this way, there is no limit on the number of fonts that may be printed
1217 in any part of a document.
1218 Mounted fonts may be handled more efficiently,
1219 and they may be referred to by their mount positions,
1220 but there is no other difference.
1221 Mention of an unmounted font loads it temporarily at font position
1222 zero, which serves as a one-font cache.
1223 .PP
1224 The function
1225 .CW \eS'@+- N@'
1226 causes the current font to be slanted by
1227 @+- N@
1228 degrees.
1229 Not all devices support slanting.
1230 .PP
1231 \*(Nr understands font control
1232 and normally underlines italic characters (see §10.5).
1233 .sc "Character size.
1234 Character point sizes available depend on the specific output device;
1235 a typical (historical) set of values is
1236 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, and 36.
1237 This is a range of 1/12 inch to 1/2 inch.
1238 The \&\f(CWps\fR request is used to change or restore the point size.
1239 Alternatively the point size may be changed between any two characters
1240 by embedding a
1241 .CW \es@N@
1242 at the desired point
1243 to set the size to @N@,
1244 or a
1245 .CW "\&\f(CW\es@+- N@
1246 (@1 <= N <= 9@)
1247 to increment/decrement the size by @N@;
1248 .CW \es0
1249 restores the previous size.
1250 Requested point size values that are between two valid
1251 sizes yield the larger of the two.
1252 .PP
1253 Note that through an accident of history, a construction like
1254 .CW \es39
1255 is parsed as size 39, and thus converted to size 36 (given the sizes above),
1256 while
1257 .CW \es40
1258 is parsed as size 4 followed by
1259 .CW 0 .
1260 The forms
1261 @cw "\es(" nn@ and @cw "\es" +- cw "(" nn@
1262 permit specification of sizes that would otherwise be ambiguous.
1263 .PP
1264 The current size is available in the \&\f(CW.s\fR register.
1265 \*(Nr ignores type size requests.
1266 .PP
1267 The function
1268 .CW "\eH'@+- N@'
1269 sets \H'+2'the height of the current font\H'0' to
1270 @N@, or increments it by @+N@, or decrements it by @-N@;
1271 if @N=0@, the height is restored to the current point size.
1272 In each case, the width is unchanged.
1273 Not all devices support independent height and width for characters.
1274 .FS
1275 *The fields have the same meaning as described earlier in the Request Summary.
1276 .FE
1277 .SP .5
1278 .LP
1279 .ne 2.1
1280 .ta 1.5i 2.5i 3.5i 4.5i
1281 \f2Request\fR   \f2Initial\fR   \f2If\ No\fR
1282 .br
1283 \f2Form\fR      \f2Value\fR     \f2Argument\fR  \f2Notes\fR
1284 .bt "\&\f(CW.ps\fI \(+-N\fR*" "10\|point" "previous" "E" "Point size
1285 set to @+- N@.
1286 Alternatively, embed
1287 .CW \es@N@
1288 or
1289 .CW "\&\f(CW\es@+- N@" .
1290 Any positive size value may be requested;
1291 if invalid, the next larger valid size will result, with a
1292 maximum of 36.
1293 A paired sequence
1294 @+N@, @-N@
1295 will work because the previous requested value is also remembered.
1296 Ignored in \*(NR.
1297 .bt "\&\f(CW.ss\fI N\fR" "12/36\|em" "ignored" "E" "Space-character size
1298 (i.e., inter-word gap)
1299 is set to @N@/36 ems.
1300 This size is the minimum word spacing in adjusted text.
1301 Ignored in \*(NR.
1302 .bt "\&\f(CW.cs\fI\|F\|N\|M\fR" "off" "-" "P" "Constant character space
1303 (width) mode is
1304 set on for font @F@ (if mounted); the width of every character will be
1305 taken to be @N@/36 ems.
1306 If @M@ is absent,
1307 the em is that of the character's point size;
1308 if @M@ is given,
1309 the em is @M@ points.
1310 All affected characters
1311 are centered in this space, including those with an actual width
1312 larger than this space.
1313 Special Font characters occurring while the current font
1314 is @F@ are also so treated.
1315 If @N@ is absent, the mode is turned off.
1316 The mode must be in effect when the characters are physically printed.
1317 Ignored in \*(NR.
1318 .bt "\&\f(CW.bd\fI F N\fR" "off" "-" "P" "The characters in font @F@ will be artificially
1319 emboldened by printing each one twice, separated by @N-1@ basic units.
1320 A reasonable value for @N@ is 3 when the character size is near 10 points.
1321 If @N@ is missing the embolden mode is turned off.
1322 The emboldening value @N@ is in the \&\f(CW.b\fP register.
1323 .IP
1324 .bd R 3
1325 This paragraph is printed with \&\f(CW.bd R 3\fR.
1326 The mode must be in effect when the characters are physically printed.
1327 Ignored in \*(NR.
1328 .br
1329 .bd R
1330 .bt "\&\f(CW.bd S \fIF N\fR" "off" "-" "P" "The characters in the Special font
1331 will be emboldened whenever the current font is @F@.
1332 The mode must be in effect when the characters are physically printed.
1333 Ignored in \*(NR.
1334 .bt "\&\f(CW.ft\fP @F@" "Roman" "previous" "E" "Font changed to
1335 @F@.
1336 Alternatively, embed
1337 .CW \ef@F@ .
1338 The font name \&\f(CWP\fR is reserved to mean the previous font,
1339 and the name
1340 .CW S
1341 for the special font.
1342 .bt "\&\f(CW.fp \fIN F L\fR" "R,I,B,...,S" "ignored" "-" "Font position.
1343 This is a statement
1344 that a font named @F@ is associated with position @N@.
1345 It is a fatal error if @F@ is not known.
1346 For fonts with names longer than two characters,
1347 .I L
1348 refers to the long name,
1349 and
1350 .I F
1351 becomes a synonym.
1352 There is generally a limit of about 10 mounted fonts.
1353 .NH
1354 Page control
1355 .PP
1356 Top and bottom margins are not automatically provided;
1357 it is conventional to define two \fImacros\fR and to set \fItraps\fR
1358 for them at vertical positions 0 (top) and @-N@ (distance @N@ up from the bottom).
1359 See §7 and Tutorial Examples §T2.
1360 A pseudo-page transition onto the first page occurs
1361 either when the first \fIbreak\fR occurs or
1362 when the first \fInon-diverted\fR text processing occurs.
1363 Arrangements
1364 for a trap to occur at the top of the first page
1365 must be completed before this transition.
1366 In the following, references to the \fIcurrent diversion\fR (§7.4)
1367 mean that the mechanism being described works during both
1368 ordinary and diverted output (the former considered as the top diversion level).
1369 .PP
1370 The limitations on \*(TR and \*(NR output dimensions
1371 are device dependent.
1372 .bt "\&\f(CW.pl\fI \(+-N\fR" "11\|in" "11\|in" "\fBv\fR" "Page length set to @+- N@.
1373 The current page length is available in the \&\f(CW.p\fR register.
1374 .bt "\&\f(CW.bp\fI \(+-N\fR" "\fIN\(eq\fR1" "-" "B,\fBv\fR" "Begin page.
1375 The current page is ejected and a new page is begun.
1376 If @+- N@ is given, the new page number will be @+- N@.
1377 Also see request \&\f(CWns\fR.
1378 .bt "\&\f(CW.pn\fI \(+-N\fR" "@N@\(eq1" "ignored" "-" "Page number.
1379 The next page (when it occurs) will have the page number @+- N@.
1380 A \&\f(CWpn\fR must occur before the initial pseudo-page transition
1381 to affect the page number of the first page.
1382 The current page number is in the \&\f(CW%\fR register.
1383 .bt "\&\f(CW.po\fI \(+-N\fR" "1\|in; 0" "previous" "\fBv\fR" "Page offset.
1384 The current \fIleft margin\fR is set to @+- N@.
1385 The \*(TR initial value provides 1 inch of paper margin
1386 on a typical device.
1387 The current page offset is available in the \&\f(CW.o\fR register.
1388 .bt "\&\f(CW.ne\fI N\fR" "-" "\fIN\(eq\fR1\|\fIV\fR" "D,\fBv\fR" "Need @N@ vertical space.
1389 If the distance \fID\fR to the next trap position (see §7.5) is less than @N@,
1390 a forward vertical space of size \fID\fR occurs,
1391 which will spring the trap.
1392 If there are no remaining
1393 traps on the page,
1394 \fID\fR is the distance to the bottom of the page.
1395 If @D<V@, another line could still be output
1396 and spring the trap.
1397 In a diversion, \fID\fR is the distance to the \fIdiversion trap\fR, if any,
1398 or is very large.
1399 .bt "\&\f(CW.mk\fI R\fR" "none" "internal" "D" "Mark the current vertical place
1400 in an internal register (both associated with the current diversion level),
1401 or in register @R@, if given.
1402 See \&\f(CWrt\fR request.
1403 .bt "\&\f(CW.rt\fI \(+-N\fR" "none" "internal" "D,\fBv\fR" "Return \fIupward only\fR to a marked vertical place
1404 in the current diversion.
1405 If @+- N@ (with respect to current place) is given,
1406 the place is @+- N@ from the top of the page or diversion
1407 or, if @N@ is absent, to a
1408 place marked by a previous \&\f(CWmk\fR.
1409 The \&\f(CWsp\fR request (§5.3) may be used
1410 instead of \&\f(CWrt\fR
1411 by spacing to the absolute place stored in a explicit register,
1412 e.g., using
1413 .CW ".mk
1414 @R@ ...\&
1415 .CW ".sp
1416 .CW |\en@R@u ;
1417 this also works when the motion is downwards.
1418 .NH
1419 Text Filling, Adjusting, and Centering
1420 .sc "Filling and adjusting.
1421 Normally,
1422 words are collected from input text lines
1423 and assembled into a output text line
1424 until some word does not fit.
1425 An attempt is then made
1426 to hyphenate the word to put part
1427 of it into the output line.
1428 The spaces between the words on the output line
1429 are then increased to spread out the line
1430 to the current \fIline length\fR
1431 minus any current \fIindent\fR.
1432 A \fIword\fR is any string of characters delimited by
1433 the \fIspace\fR character or the beginning/end of the input line.
1434 Any adjacent pair of words that must be kept together
1435 (neither split across output lines nor spread apart
1436 in the adjustment process)
1437 can be tied together by separating them with the
1438 \fIunpaddable space\fR character
1439 ``\&\f(CW\e\ \fR'' (backslash-space).
1440 The adjusted word spacings are uniform in \*(TR
1441 and the minimum interword spacing can be controlled
1442 with the \&\f(CWss\fR request (§2).
1443 In \*(NR, they are normally nonuniform because of
1444 quantization to character-size spaces;
1445 however,
1446 the command line option \&\f(CW-e\fR causes uniform
1447 spacing with full output device resolution.
1448 Filling, adjustment, and hyphenation (§13) can all be
1449 prevented or controlled.
1450 The text length on the last line output is available in the \&\f(CW.n\fR register,
1451 and text baseline position on the page for this line is in the \&\f(CWnl\fR register.
1452 The text baseline high-water mark (lowest place) on the current page is in
1453 the \&\f(CW.h\fR register.
1454 The current horizontal output position is in the \&\f(CW.k\fP register.
1455 .PP
1456 An input text line
1457 .I ending
1458 with \&\f(CW.\fR\^, \&\f(CW?\fR, or \&\f(CW!\fR,
1459 optionally followed by any number of
1460 .CW \&" ,
1461 .CW ' ,
1462 .CW ) ,
1463 .CW ] ,
1464 .CW * ,
1465 or
1466 †,
1467 is taken
1468 to be the end of a sentence, and an additional space character is
1469 automatically provided during filling.
1470 To prevent this, add
1471 .CW \e&
1472 to the end of the input line.
1473 Multiple inter-word space characters found in the input are retained,
1474 except for trailing spaces;
1475 initial spaces also cause a break.
1476 .PP
1477 When filling is in effect, a \&\f(CW\ep\fR may be embedded or attached to a word to
1478 cause a break at the end of the word and have the resulting output
1479 line spread out to fill the current line length.
1480 .PP
1481 .tr &&
1482 A text input line that happens to begin
1483 with a control character can
1484 be made not to look like a control line
1485 by prefixing it with
1486 the non-printing, zero-width filler character \&\f(CW\e&\fR.
1487 Still another way is to specify output translation of some
1488 convenient character into the control character
1489 using \&\f(CWtr\fR (§10.5).
1490 .tr &.
1491 .sc "Interrupted text.
1492 The copying of a input line in \fInofill\f (non-fill) mode can be interrupted
1493 by terminating
1494 the partial line with a \&\f(CW\ec\fR.
1495 The next encountered input text line will be considered to be a continuation
1496 of the same line of input text.
1497 Similarly,
1498 a word within \fIfilled\fR text may be interrupted by terminating the
1499 word (and line) with \&\f(CW\ec\fR;
1500 the next encountered text will be taken as a continuation of the
1501 interrupted word.
1502 If the intervening control lines cause a break,
1503 any partial line will be forced out along with any partial word.
1504 .bt "\&\f(CW.br\fR" "-" "-" "B" "Break.
1505 The filling of the line currently
1506 being collected is stopped and
1507 the line is output without adjustment.
1508 Text lines beginning with space characters
1509 (but not tabs)
1510 and empty text lines (blank lines) also cause a break.
1511 .bt "\&\f(CW.fi\fR" "fill on" - B,E "Fill subsequent output lines.
1512 The register \&\f(CW.u\fR is 1 in fill mode and 0 in nofill mode.
1513 .bt "\&\f(CW.nf\fR" "fill on" "-" "B,E" "Nofill.
1514 Subsequent output lines are neither filled nor adjusted.
1515 Input text lines are copied directly to output lines
1516 without regard for the current line length.
1517 .bt "\&\f(CW.ad\fI c\fR" "adj, both" "adjust" "E" "Line adjustment is begun.
1518 If fill mode is not on, adjustment will be deferred until
1519 fill mode is back on.
1520 If the type indicator @c@ is present,
1521 the adjustment type is changed as shown in the following table.
1522 .TS
1523 center box;
1524 c|c
1525 c|l.
1526 Indicator       Adjust Type
1527 _
1528 \&\f(CWl\fR     adjust left margin only
1529 \&\f(CWr\fR     adjust right margin only
1530 \&\f(CWc\fR     center
1531 \&\f(CWb\fR or \&\f(CWn\fR      adjust both margins
1532 absent  unchanged
1533 .TE
1534 The number register
1535 .CW .j
1536 contains the current value of the
1537 .CW ad
1538 setting;
1539 its value can be recorded and used subsequently to set adjustment.
1540 .bt "\&\f(CW.na\fR" "adjust" "-" "E" "Noadjust.
1541 Adjustment is turned off;
1542 the right margin will be ragged.
1543 The adjustment type for \&\f(CWad\fR is not changed.
1544 Output line filling still occurs if fill mode is on.
1545 .bt "\&\f(CW.ce\fI N\fR" "off" "@N=1@" "B,E" "Center the next @N@ input text lines
1546 within the current available horizontal space (line-length minus indent).
1547 If @N=0@, any residual count is cleared.
1548 A break occurs after each of the @N@ input lines.
1549 If the input line is too long,
1550 it will be left adjusted.
1551 .NH
1552 Vertical Spacing
1553 .sc "Baseline spacing.
1554 The vertical spacing @(V)@ between the baselines of successive
1555 output lines can be set
1556 using the \&\f(CWvs\fR request.
1557 \fIV\fR should be large enough to accommodate the character sizes
1558 on the affected output lines.
1559 For the common type sizes (9-12 points),
1560 usual typesetting practice is to set \fIV\fR to 2 points greater than the
1561 point size;
1562 \*(TR default is 10-point type on a 12-point spacing
1563 (as in this document).
1564 The current \fIV\fR is available in the \&\f(CW.v\fR register.
1565 Multiple-\fIV\|\fR line separation (e.g., double spacing) may be requested
1566 with \&\f(CWls\fR,
1567 but it is better to use a large
1568 .CW vs
1569 instead;
1570 certain preprocessors assume single spacing.
1571 The current line spacing is available in the \&\f(CW.L\fP register.
1572 .sc "Extra line-space.
1573 If a word contains a tall construct requiring
1574 the output line containing it to have extra vertical space
1575 before and/or after it,
1576 the \fIextra-line-space\fR function \&\f(CW\ex'\fIN\fP'\fR
1577 can be embedded in or attached to that word.
1578 If @N@ is negative,
1579 the output line containing the word will
1580 be preceded by @N@ extra vertical space;
1581 if @N@ is positive,
1582 the output line containing the word
1583 will be followed by @N@ extra vertical space.
1584 If successive requests for extra space apply to the same line,
1585 the maximum values are used.
1586 The most recently utilized post-line extra line-space is available in the \&\f(CW.a\fR register.
1587 .PP
1588 In
1589 .CW \ex'\f2...\fP'
1590 and other functions having a pair of delimiters around
1591 their parameter,
1592 the delimiter choice (here 
1593 .CW ' )
1594 is arbitrary,
1595 except that it can not look like the continuation of a number expression for @N@.
1596 .sc "Blocks of vertical space.
1597 A block of vertical space is ordinarily requested using \&\f(CWsp\fR,
1598 which honors the \fIno-space\fR mode and which does
1599 not space past a trap.
1600 A contiguous block of vertical space may be reserved using \&\f(CWsv\fR.
1601 .bt "\&\f(CW.vs \fIN\fR" "12pts; 1/6in" "previous" "E,\fBp\fR" "Set vertical baseline spacing size \fIV\fR.
1602 Transient extra vertical space is available with \&\f(CW\ex\fI'N\|'\fR (see above).
1603 .bt "\&\f(CW.ls \fIN\fR" "@N=1@" "previous" "E" "\fILine\fR spacing
1604 set to @+- N@.
1605 @N-1@ \fIV\fR\^s (blank lines) are
1606 appended to each output text line.
1607 Appended blank lines are omitted, if the text or previous appended blank line reached a trap position.
1608 .bt "\&\f(CW.sp \fIN\fR" "-" "@N=1~V@" "B,\fBv\fR" "Space vertically in either direction.
1609 If @N@ is negative, the motion is backward (upward)
1610 and is limited to the distance to the top of the page.
1611 Forward (downward) motion is truncated to the distance to the
1612 nearest trap.
1613 (Recall the use of
1614 .CW ".sp |\f2N\fP
1615 from §1.3.)
1616 If the no-space mode is on,
1617 no spacing occurs (see \&\f(CWns\fR and \&\f(CWrs\fR below).
1618 .bt "\&\f(CW.sv\fI N\fR" "-" "@N=1~V@" "\fBv\fR" "Save a contiguous vertical block of size @N@.
1619 If the distance to the next trap is greater
1620 than @N@, @N@ vertical space is output.
1621 No-space mode has no effect.
1622 If this distance is less than @N@,
1623 no vertical space is immediately output,
1624 but @N@ is remembered for later output (see \&\f(CWos\fR).
1625 Subsequent \&\f(CWsv\fR requests will overwrite any still remembered @N@.
1626 .bt "\&\f(CW.os\fR" "-" "-" "-" "Output saved vertical space.
1627 No-space mode has no effect.
1628 Used to finally output a block of vertical space requested
1629 by an earlier \&\f(CWsv\fR request.
1630 .bt "\&\f(CW.ns\fR" "space" "-" "D" "No-space mode turned on.
1631 When on, no-space mode inhibits \&\f(CWsp\fR requests and
1632 \&\f(CWbp\fR requests \fIwithout\fR a next page number.
1633 No-space mode is turned off when a line of
1634 output occurs, or with \&\f(CWrs\fR.
1635 .bt "\&\f(CW.rs\fR" "space" "-" "D" "Restore spacing.
1636 The no-space mode is turned off.
1637 .bt "\&Blank text line." "" "-" "B" "Causes a break and
1638 output of a blank line exactly like \&\f(CWsp 1\fR.
1639 .NH
1640 Line Length and Indenting
1641 .PP
1642 The maximum line length for fill mode may be set with \&\f(CWll\fR.
1643 The indent may be set with \&\f(CWin\fR;
1644 an indent applicable to only the next output line may be set with \&\f(CWti\fR.
1645 The line length includes indent space but not
1646 page offset space.
1647 The line length minus the indent is the basis for centering with \&\f(CWce\fR.
1648 The effect of \&\f(CWll\fR, \&\f(CWin\fR, or \&\f(CWti\fR
1649 is delayed, if a partially collected line exists,
1650 until after that line is output.
1651 In fill mode the length of text on an output line is less than or equal to
1652 the line length minus the indent.
1653 The current line length and indent are available in registers \&\f(CW.l\fR and \&\f(CW.i\fR respectively.
1654 The length of \fIthree-part titles\fR produced by \&\f(CWtl\fR
1655 (see §14) is independently set by \&\f(CWlt\fR.
1656 .bt "\&\f(CW.ll\fI \(+-N\fR" "6.5\|in" "previous" "E,\fBm\fR" "Line length is set to \(+-@N@.
1657 .bt "\&\f(CW.in\fI \(+-N\fR" "\fIN\(eq\^\fR0" "previous" "B,E,\fBm\fR" "Indent is set to @+- N@.
1658 The indent is prefixed to each output line.
1659 .bt "\&\f(CW.ti\fI \(+-N\fR" "-" "ignored" "B,E,\fBm\fR" "Temporary indent.
1660 The next output text line will be indented a distance @+- N@
1661 with respect to the current indent.
1662 The resulting total indent may not be negative.
1663 The current indent is not changed.
1664 .NH
1665 Macros, Strings, Diversion, and Position Traps
1666 .sc "Macros and strings.
1667 A \fImacro\fR is a named set of arbitrary \fIlines\fR that may be invoked by name or
1668 with a \fItrap\fR.
1669 A \fIstring\fR is a named string of \fIcharacters\fR,
1670 not including a newline character,
1671 that may be interpolated by name at any point.
1672 Request, macro, and string names share the same name list.
1673 Macro and string names
1674 may be one or two characters long and may usurp previously defined
1675 request, macro, or string names;
1676 this implies that built-in operations may be (irrevocably) redefined.
1677 Any of these entities may be renamed with \&\f(CWrn\fR
1678 or removed with \&\f(CWrm\fR.
1679 .PP
1680 Macros are created by \&\f(CWde\fR and \&\f(CWdi\fR, and appended to by \&\f(CWam\fR and \&\f(CWda\fR;
1681 \&\f(CWdi\fR and \&\f(CWda\fR cause normal output to be stored in a macro.
1682 A macro is invoked in the same way as a request;
1683 a control line beginning \&\f(CW.\fIxx\fR will interpolate the contents of macro \fIxx\fR.
1684 The remainder of the line may contain up to nine \fIarguments\fR.
1685 .PP
1686 Strings are created by \&\f(CWds\fR and appended to by \&\f(CWas\fR.
1687 The strings \fIx\fR and \fIxx\fR are interpolated at any desired point with
1688 \&\f(CW\e\(**\fIx\fR and \&\f(CW\e\(**(\fIxx\fR respectively.
1689 String references and macro invocations may be nested.
1690 .sc "Copy mode input interpretation.
1691 During the definition and extension
1692 of strings and macros (not by diversion)
1693 the input is read in \fIcopy mode\fR.
1694 In copy mode, input is copied without interpretation
1695 except that:
1696 .IP
1697 .ds + \v'-.1m'\s-4\(bu\s+4\v'+.1m'
1698 .nf
1699 \*+ The contents of number registers indicated by \&\f(CW\en\fR are interpolated.
1700 \*+ Strings indicated by \&\f(CW\e\(**\fR are interpolated.
1701 \*+ Arguments indicated by \&\f(CW\e$\fR are interpolated.
1702 \*+ Concealed newlines indicated by \&\f(CW\e\fP\f2newline\fP are eliminated.
1703 \*+ Comments indicated by \&\f(CW\e"\fR are eliminated.
1704 \*+ \&\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).
1705 \*+ \&\f(CW\e\e\fR is interpreted as \&\f(CW\e\fR.
1706 \*+ \&\f(CW\e.\fR is interpreted as ``\&\f(CW.\fR''.
1707 .LP
1708 These interpretations can be suppressed by
1709 prefixing
1710 a \&\f(CW\e\fR.
1711 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
1712 will be interpreted as a number register indicator when the
1713 macro or string is reread.
1714 .sc "Arguments.
1715 When a macro is invoked by name, the remainder of the line is
1716 taken to contain up to nine arguments.
1717 The argument separator is the space character (not tab), and arguments
1718 may be surrounded by double quotes to permit embedded space characters.
1719 Pairs of double quotes may be embedded in double-quoted arguments to
1720 represent a single double-quote character.
1721 The argument
1722 .CW \&""
1723 is explicitly null.
1724 If the desired arguments won't fit on a line,
1725 a concealed newline may be used to continue on the next line.
1726 A trailing double quote may be omitted.
1727 .PP
1728 When a macro is invoked the \fIinput level\fR is \fIpushed down\fR and
1729 any arguments available at the previous level become unavailable
1730 until the macro is completely read and the previous level is restored.
1731 A macro's own arguments can be interpolated at any point
1732 within the macro with
1733 .CW \e$@N@ ,
1734 which interpolates the @N@\^th
1735 argument
1736 (@1 <= N <= 9@).
1737 If an invoked argument does not exist,
1738 a null string results.
1739 For example, the macro \fIxx\fR may be defined by
1740 .P1
1741 .ta .75i
1742 &de xx  \e" begin definition
1743 Today is \e\e$1 the \e\e$2.
1744 &.      \e" end definition
1745 .P2
1746 and called by
1747 .P1
1748 &xx Monday 14th
1749 .P2
1750 to produce the text
1751 .P1
1752 Today is Monday the 14th.
1753 .P2
1754 Note that each \&\f(CW\e$\fR
1755 was concealed in the definition with a prefixed \&\f(CW\e\fR.
1756 The number of
1757 arguments is in the \&\f(CW.$\fR register.
1758 .PP
1759 No arguments are available at the top (non-macro) level,
1760 within a string, or within a trap-invoked macro.
1761 .PP
1762 Arguments are copied in copy mode onto a stack
1763 where they are available for reference.
1764 It is advisable to
1765 conceal string references (with an extra \&\f(CW\e\fR\|)
1766 to delay interpolation until argument reference time.
1767 .sc "Diversions.
1768 Processed output may be diverted into a macro for purposes
1769 such as footnote processing (see Tutorial §T5)
1770 or determining the horizontal and vertical size of some text for
1771 conditional changing of pages or columns.
1772 A single diversion trap may be set at a specified vertical position.
1773 The number registers \&\f(CWdn\fR and \&\f(CWdl\fR respectively contain the
1774 vertical and horizontal size of the most
1775 recently ended diversion.
1776 Processed text that is diverted into a macro
1777 retains the vertical size of each of its lines when reread
1778 in \fInofill\fR mode
1779 regardless of the current \fIV\fR.
1780 Constant-spaced (\&\f(CWcs\fR) or emboldened (\&\f(CWbd\fR) text that is diverted
1781 can be reread correctly only if these modes are again or still in effect
1782 at reread time.
1783 One way to do this is to embed in the diversion the appropriate
1784 \&\f(CWcs\fR or \&\f(CWbd\fR requests with the \fItransparent\fR
1785 mechanism described in §10.6.
1786 .PP
1787 Diversions may be nested
1788 and certain parameters and registers
1789 are associated
1790 with the current diversion level
1791 (the top non-diversion level may be thought of as the
1792 0th diversion level).
1793 These are the diversion trap and associated macro,
1794 no-space mode,
1795 the internally-saved marked place (see \&\f(CWmk\fR and \&\f(CWrt\fR),
1796 the current vertical place (\&\f(CW.d\fR register),
1797 the current high-water text baseline (\&\f(CW.h\fR register),
1798 and the current diversion name (\&\f(CW.z\fR register).
1799 .sc "Traps.
1800 Three types of trap mechanisms are available\(empage traps, a diversion trap, and
1801 an input-line-count trap.
1802 Macro-invocation traps may be planted using \&\f(CWwh\fR at any page position including the top.
1803 This trap position may be changed using \&\f(CWch\fR.
1804 Trap positions at or below the bottom of the page
1805 have no effect unless or until
1806 moved to within the page or rendered effective by an increase in page length.
1807 Two traps may be planted at the same position only by first planting them at different
1808 positions and then moving one of the traps;
1809 the first planted trap will conceal the second unless and until the first one is moved
1810 (see Tutorial Examples).
1811 If the first one is moved back, it again conceals the second trap.
1812 The macro associated with a page trap is automatically
1813 invoked when a line of text is output whose vertical size reaches
1814 or sweeps past the trap position.
1815 Reaching the bottom of a page springs the top-of-page trap, if any,
1816 provided there is a next page.
1817 The distance to the next trap position is available in the \&\f(CW.t\fR register;
1818 if there are no traps between the current position and the bottom of the page,
1819 the distance returned is the distance to the page bottom.
1820 .PP
1821 A macro-invocation trap effective in the current diversion may be planted using \&\f(CWdt\fR.
1822 The \&\f(CW.t\fR register works in a diversion; if there is no subsequent trap a large
1823 distance is returned.
1824 For a description of input-line-count traps, see \&\f(CWit\fR below.
1825 .bt "\&\f(CW&de\fI xx yy\fR" "-" "\fI.yy=\&\f(CW..\fR" "-" "Define or redefine the macro \fIxx\fR.
1826 The contents of the macro begin on the next input line.
1827 Input lines are copied in \fIcopy mode\fR until the definition is terminated by a
1828 line beginning with \&\f(CW.\fIyy\fR,
1829 whereupon the macro \fIyy\fR is called.
1830 In the absence of \fIyy\fR, the definition
1831 is terminated by a
1832 line beginning with ``\&\f(CW..\fR''.
1833 A macro may contain \&\f(CWde\fR requests
1834 provided the terminating macros differ
1835 or the contained definition terminator is concealed.
1836 \&``\&\f(CW..\fR'' can be concealed as
1837 \&\f(CW\e\e..\fR which will copy as \&\f(CW\e..\fR and be reread as ``\&\f(CW..\fR''.
1838 .bt "\&\f(CW&am\fI xx yy\fR" "-" "\fI.yy=\&\f(CW..\fR" "-" "Append to macro
1839 .I xx
1840 (append version of \&\f(CWde\fR).
1841 .bt "\&\f(CW&ds\fI xx string\fR" "-" "ignored" "-" "Define a string
1842 \fIxx\fR containing \fIstring\fR.
1843 Any initial double quote in \fIstring\fR is stripped off to permit
1844 initial blanks.
1845 .bt "\&\f(CW&as\fI xx string\fR" "-" "ignored" "-" "Append
1846 \fIstring\fR to string \fIxx\fR
1847 (append version of \&\f(CWds\fR).
1848 .bt "\&\f(CW&rm\fI xx\fR" "-" "ignored" "-" "Remove
1849 request, macro, or string.
1850 The name \fIxx\fR is removed from the name list and
1851 any related storage space is freed.
1852 Subsequent references will have no effect.
1853 If many macros and strings are being created dynamically, it
1854 may become necessary to remove unused ones
1855 to recapture internal storage space for newer registers.
1856 .bt "\&\f(CW&rn\fI xx yy\fR" "-" "ignored" "-" "Rename request, macro, or string
1857 \fIxx\fR to \fIyy\fR.
1858 If \fIyy\fR exists, it is first removed.
1859 .bt "\&\f(CW&di\fI xx\fR" "-" "end" "D" "Divert output to macro \fIxx\fR.
1860 Normal text processing occurs during diversion
1861 except that page offsetting is not done.
1862 The diversion ends when the request \&\f(CWdi\fR or \&\f(CWda\fR is encountered without an argument;
1863 extraneous
1864 requests of this type should not appear when nested diversions are being used.
1865 .bt "\&\f(CW&da \fIxx\fR" "-" "end" "D" "Divert, appending to macro \fIxx\fR
1866 (append version of \&\f(CWdi\fR).
1867 .bt "\&\f(CW&wh\fI N xx\fR" "-" "-" "\fBv\fR" "Install
1868 a trap to invoke \fIxx\fR at page position \fIN\fR;
1869 a negative N will be interpreted as a distance from the
1870 page bottom.
1871 Any macro previously planted at @N@ is replaced by \fIxx\fR.
1872 A zero @N@ refers to the top of a page.
1873 In the absence of \fIxx\fR, the first trap found at @N@, if any, is removed.
1874 .bt "\&\f(CW&ch\fI xx N\fR" "-" "-" "\fBv\fR" "Change
1875 the trap position for macro \fIxx\fR to be @N@.
1876 In the absence of @N@, the trap, if any, is removed.
1877 .bt "\&\f(CW&dt\fI N xx\fR" "-" "off" "D,\fBv\fR" "Install a diversion trap
1878 at position @N@ in the \fIcurrent\fR diversion to invoke
1879 macro \fIxx\fR.
1880 Another \&\f(CWdt\fR will redefine the diversion trap.
1881 If no arguments are given, the diversion trap is removed.
1882 .bt "\&\f(CW&it\fI N xx\fR" "-" "off" "E" "Set an input-line-count trap
1883 to invoke the macro \fIxx\fR after @N@ lines of \fItext\fR input
1884 have been read
1885 (control or request lines do not count).
1886 The text may be inline text or
1887 text interpolated by inline or trap-invoked macros.
1888 .bt "\&\f(CW&em\fI xx\fR" "none" "none" "-" "The
1889 macro \fIxx\fR will be invoked
1890 when all input has ended.
1891 The effect is almost as if the contents of \fIxx\fR had been at the end
1892 of the last file processed,
1893 but all processing ceases at the next page eject.
1894 .NH
1895 Number Registers
1896 .PP
1897 A variety of parameters are available to the user as
1898 predefined \fInumber registers\fR (see Summary, page \n(*%).
1899 In addition, users may define their own registers.
1900 Register names are one or two characters long and do not conflict
1901 with request, macro, or string names.
1902 Except for certain predefined read-only registers,
1903 a number register can be read, written, automatically
1904 incremented or decremented, and interpolated
1905 into the input in a variety of formats.
1906 One common use of user-defined registers is to
1907 automatically number sections, paragraphs, lines, etc.
1908 A number register may be used any time numerical input is expected or desired
1909 and may be used in numerical \fIexpressions\fR (§1.4).
1910 .PP
1911 Number registers are created and modified using \&\f(CWnr\fR, which
1912 specifies the name, numerical value, and the auto-increment size.
1913 Registers are also modified, if accessed
1914 with an auto-incrementing sequence.
1915 If the registers \fIx\fR and \fIxx\fR both contain
1916 @N@ and have the auto-increment size @M@,
1917 the following access sequences have the effect shown:
1918 .TS
1919 center box;
1920 c2|c2|c
1921 c2|c2|c2
1922 l2|c2|c2
1923 l2|c2|c2
1924 l2|l2|c2.
1925         Effect on       Value
1926 Sequence        Register        Interpolated
1927 _
1928 \&\f(CW\en\fIx\fR       none    @N@
1929 \&\f(CW\en(\fIxx\fR     none    @N@
1930 \&\f(CW\en+\fIx\fR      \fIx\fR incremented by @M@      \fIN+M\fR
1931 \&\f(CW\en-\fIx\fR      \fIx\fR decremented by @M@      \fIN-M\fR
1932 \&\f(CW\en+(\fIxx\fR    \fIxx\fR incremented by @M@     \fIN+M\fR
1933 \&\f(CW\en-(\fIxx\fR    \fIxx\fR decremented by @M@     \fIN-M\fR
1934 .TE
1935 When interpolated, a number register is converted to
1936 decimal (default),
1937 decimal with leading zeros,
1938 lower-case Roman,
1939 upper-case Roman,
1940 lower-case sequential alphabetic,
1941 or
1942 upper-case sequential alphabetic
1943 according to the format specified by \&\f(CWaf\fR.
1944 .bt "\&\f(CW&nr\fI R \(+-N M\fR" "" "-" "\fBu\fR" "The number register
1945 @R@ is assigned the value @+- N@
1946 with respect to the previous value, if any.
1947 The increment for auto-incrementing is set to @M@.
1948 .bt "\&\f(CW&af\fI R c\fR" "arabic" "-" "-" "Assign
1949 format @c@ to register @R@.
1950 The available formats are:
1951 .Tm number register format      s
1952 .TS
1953 center box;
1954 c2|c
1955 c2|c
1956 c2|l.
1957         Numbering
1958 Format  Sequence
1959 _
1960 \&\f(CW1\fR     0, 1, 2, 3, 4, 5, ...
1961 \&\f(CW001\fR   000, 001, 002, 003, 004, 005, ...
1962 \&\f(CWi\fR     0, i, ii, iii, iv, v, ...
1963 \&\f(CWI\fR     0, I, II, III, IV, V, ...
1964 \&\f(CWa\fR     0, a, b, c, ..., z, aa, ab, ..., zz, aaa, ...
1965 \&\f(CWA\fR     0, A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, ...
1966 .TE
1967 An arabic format having @N@ digits
1968 specifies a field width of @N@ digits (example 2 above).
1969 The read-only registers and the width function
1970 .CW \ew
1971 (§11.2)
1972 are always arabic.
1973 Warning: the value of a number register in a non-Arabic format
1974 is not numeric, and will not produce the expected results in expressions.
1975 .IP
1976 The function
1977 .CW \eg@x@
1978 or
1979 .CW \eg(@xx@
1980 returns the format of a number register in a form suitable for
1981 .CW af ;
1982 it returns nothing if the register has not been used.
1983 .bt "\&\f(CW&rr\fI R\fR" "-" "ignored" "-" "Remove number register @R@.
1984 If many registers are being created dynamically, it
1985 may become necessary to remove unused registers
1986 to recapture internal storage space for newer registers.
1987 The register
1988 .CW .R
1989 contains the number of number registers still available.
1990 .NH
1991 Tabs, Leaders, and Fields
1992 .sc "Tabs and leaders.
1993 The \s-1ASCII\s+1 horizontal tab character and the \s-1ASCII\s+1
1994 \s-1SOH\s+1 (control-A, hereafter called the \fIleader\fR character)
1995 can both be used to generate either horizontal motion or
1996 a string of repeated characters.
1997 The length of the generated entity is governed
1998 by internal \fItab stops\fR specifiable
1999 with \&\f(CWta\fR.
2000 The default difference is that tabs generate motion and leaders generate
2001 a string of periods;
2002 \&\f(CWtc\fR and \&\f(CWlc\fR
2003 offer the choice of repeated character or motion.
2004 There are three types of internal tab stops\(em\
2005 \fIleft\fR adjusting, \fIright\fR adjusting,
2006 and \fIcentering\fR.
2007 In the following table,
2008 \fID\fR is the distance from the current position on the \fIinput\fR line
2009 (where a tab or leader was found)
2010 to the next tab stop,
2011 \fInext-string\fR consists
2012 of the input characters following the tab (or leader) up to the next tab (or leader) or end of line,
2013 and
2014 \fIW\fR is the width of \fInext-string\fR.
2015 .TS
2016 center box;
2017 c2|c2|c
2018 c2|c2|c
2019 c2|c2|l.
2020 Tab     Length of motion or     Location of
2021 type    repeated characters     \fInext-string\fR
2022 _
2023 Left    \fID\fR Following \fID\fR
2024 Right   \fID-W\fR       Right adjusted within \fID\fR
2025 Centered        \fID-W/\fR2     Centered on right end of \fID\fR
2026 .TE
2027 The length of generated motion is allowed to be negative, but
2028 that of a repeated character string cannot be.
2029 Repeated character strings contain an integer number of characters, and
2030 any residual distance is prepended as motion.
2031 Tabs or leaders found after the last tab stop are ignored, but may be used
2032 as \fInext-string\fR terminators.
2033 .PP
2034 Tabs and leaders are not interpreted in copy mode.
2035 \&\f(CW\et\fR and \&\f(CW\ea\fR always generate a non-interpreted
2036 tab and leader respectively, and
2037 are equivalent to actual tabs and leaders in copy mode.
2038 .sc "Fields.
2039 A \fIfield\fR is contained between
2040 a pair of \fIfield delimiter\fR characters,
2041 and consists of substrings
2042 separated by \fIpadding\fR indicator characters.
2043 The field length is the distance on the
2044 \fIinput\fR line from the position where the field begins to the next tab stop.
2045 The difference between the total length of all the substrings
2046 and the field length is incorporated as horizontal
2047 padding space that is divided among the indicated
2048 padding places.
2049 The incorporated padding is allowed to be negative.
2050 For example,
2051 if the field delimiter is \&\f(CW#\fR and the padding indicator is \&\f(CW^\fR,
2052 \&\f(CW#^\fIxxx\&\f(CW^\fIright\|\&\f(CW#\fR
2053 specifies a right-adjusted string with the string \fIxxx\fR centered
2054 in the remaining space.
2055 .h1
2056 .bt "\&\f(CW&ta\fI Nt ...\fR" "0.8; 0.5in" "none" "E,\fBm\fR" "Set tab stops and types.
2057 \fIt=\&\f(CWR\fR, right adjusting;
2058 \fIt=\&\f(CWC\fR, centering;
2059 \fIt\fR absent, left adjusting.
2060 \*(Tr tab stops are preset every 0.5in.,
2061 \*(NR every 0.8in.
2062 The stop values are separated by spaces, and
2063 a value preceded by \&\f(CW+\fR
2064 is treated as an increment to the previous stop value.
2065 .bt "\&\f(CW&tc\fI c\fR" "none" "none" "E" "The tab repetition character
2066 becomes @c@,
2067 or is removed, thus specifying motion.
2068 .bt "\&\f(CW&lc\fI c\fR" "\&\f(CW.\fR" "none" "E" "The leader repetition character
2069 becomes @c@,
2070 or is removed, thus specifying motion.
2071 .bt "\&\f(CW&fc\fI a b\fR" "off" "off" "-" "The field delimiter
2072 is set to \fIa\fR;
2073 the padding indicator is set to the space character or to
2074 \fIb\fR, if given.
2075 In the absence of arguments the field mechanism is turned off.
2076 .NH
2077 Input and Output Conventions and Character Translations
2078 .sc "Input character translations.
2079 Ways of inputting the valid character set were
2080 discussed in §2.1.
2081 The \s-1ASCII\s+1 control characters horizontal tab (§9.1),
2082 \s-1SOH\s+1 (§9.1), and backspace (§10.3) are discussed elsewhere.
2083 The newline delimits input lines.
2084 In addition,
2085 \s-1STX\s+1, \s-1ETX\s+1, \s-1ENQ\s+1, \s-1ACK\s+1, and \s-1BEL\s+1
2086 are accepted,
2087 and may be used as delimiters or translated into a graphic with \&\f(CWtr\fR (§10.5).
2088 All others are ignored.
2089 .PP
2090 The \fIescape\fR character \&\f(CW\e\fR
2091 introduces \fIescape sequences\fR,
2092 which cause the following character to mean
2093 another character, or to indicate
2094 some function.
2095 .nr %% \n(*%-1
2096 A complete list of such sequences is given in the Summary on page \n(*%.
2097 The escape character \&\f(CW\e\fR
2098 should not be confused with the \s-1ASCII\s+1 control character \s-1ESC\s+1.
2099 The escape character \&\f(CW\e\fR can be input with the sequence \&\f(CW\e\e\fR.
2100 The escape character can be changed with \&\f(CWec\fR,
2101 and all that has been said about the default \&\f(CW\e\fR becomes true
2102 for the new escape character.
2103 \&\f(CW\ee\fR can be used to print whatever the current escape character is.
2104 The escape mechanism may be turned off with \&\f(CWeo\fR,
2105 and restored with \&\f(CWec\fR.
2106 .h1
2107 .bt "\&\f(CW&ec\fI c\fR" "\&\f(CW\e\fR" "\&\f(CW\e\fR" "-" "Set escape character
2108 to \&\f(CW\e\fR, or to @c@, if given.
2109 .bt "\&\f(CW&eo\fR" "on" "-" "-" "Turn escape mechanism off.
2110 .sc "Ligatures.
2111 .lg0
2112 The set of available ligatures is device and font dependent,
2113 but is often a subset of
2114 \&\fBfi\fR, \&\fBfl\fR, \&\fBff\fR, \&\fBffi\fR, and \&\fBffl\fR.
2115 They may be input by
2116 \&\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.
2117 .lg
2118 The ligature mode is normally on in \*(TR, and automatically invokes 
2119 ligatures during input.
2120 .h1
2121 .bt "\&\f(CW&lg\fI N\fR" "on; off" "on" "-" "Ligature mode
2122 is turned on if @N@ is absent or non-zero,
2123 and turned off if @N=0@.
2124 If @N=2@, only the two-character ligatures are automatically invoked.
2125 Ligature mode is inhibited for
2126 request, macro, string, register, or file names,
2127 and in copy mode.
2128 No effect in \*(NR.
2129 .sc "Backspacing, underlining, overstriking, etc.
2130 Unless in copy mode, the \s-1ASCII\s+1 backspace character is replaced
2131 by a backward horizontal motion having the width of the
2132 space character.
2133 Underlining as a form of line-drawing is discussed in §12.4.
2134 A generalized overstriking function is described in §12.1.
2135 .PP
2136 \*(Nr automatically underlines
2137 characters in the \fIunderline\fR font,
2138 specifiable with \&\f(CWuf\fR,
2139 normally that on font position 2.
2140 In addition to \&\f(CWft\fR and
2141 .CW \ef@F@ ,
2142 the underline font may be selected by \&\f(CWul\fR and \&\f(CWcu\fR.
2143 Underlining is restricted to an output-device-dependent
2144 subset of reasonable characters.
2145 .bt "\&\f(CW&ul\fI N\fR" "off" "@N=1@" "E" "Italicize in \*(TR
2146 (underline in \*(NR) the next @N@
2147 input text lines.
2148 Actually, switch to underline font, saving the
2149 current font for later restoration;
2150 other font changes within the span of a \&\f(CWul\fR
2151 will take effect,
2152 but the restoration will undo the last change.
2153 Output generated by \&\f(CWtl\fR (§14) is affected by the
2154 font change, but does not decrement @N@.
2155 If @N>1@, there is the risk that
2156 a trap interpolated macro may provide text
2157 lines within the span;
2158 environment switching can prevent this.
2159 .bt "\&\f(CW&cu\fI N\fR" "off" "@N=1@" "E" "Continuous underline.
2160 A variant
2161 of \&\f(CWul\fR that causes \fIevery\fR character to be underlined in \*(NR.
2162 Identical to \&\f(CWul\fR in \*(TR.
2163 .bt "\&\f(CW&uf\fI F\fR" "Italic" "Italic" "-" "Underline font set to @F@.
2164 In \*(NR,
2165 @F@ may not be on position 1.
2166 .sc "Control characters.
2167 Both the control character \&\f(CW.\fR and the \fIno-break\fR
2168 control character \&\f(CW'\fR may be changed.
2169 Such a change must be compatible with the design
2170 of any macros used in the span of the change,
2171 and
2172 particularly of any trap-invoked macros.
2173 .bt "\&\f(CW&cc\fI c\fR" "\&\f(CW.\fR" "\&\f(CW.\fR" "E" "The basic control character
2174 is set to @c@,
2175 or reset to ``\&\f(CW.\fR''.
2176 .bt "\&\f(CW&c2\fI c\fR" "\&\f(CW'" "'\fR" "E" "The \fIno-break\fR control character is set
2177 to @c@, or reset to ``\&\f(CW'\fR''.
2178 .sc "Output translation.
2179 One character can be made a stand-in for another character using \&\f(CWtr\fR.
2180 All text processing (e.g., character comparisons) takes place
2181 with the input (stand-in) character, which appears to have the width of the final
2182 character.
2183 The graphic translation occurs at the moment of output
2184 (including diversion).
2185 .bt "\&\f(CW&tr\fI abcd....\fR" "none" "-" "O" "Translate
2186 \fIa\fR into \fIb\fR, @c@ into \fId\fR, etc.
2187 If an odd number of characters is given,
2188 the last one will be mapped into the space character.
2189 To be consistent, a particular translation
2190 must stay in effect from \fIinput\fR to \fIoutput\fR time.
2191 .sc "Transparent throughput.
2192 An input line beginning with a \&\f(CW\e!\fR is read in copy mode and \fItrans\%parently\fR output
2193 (without the initial \&\f(CW\e!\fR);
2194 the text processor is otherwise unaware of the line's presence.
2195 This mechanism may be used to pass control information to a post-processor
2196 or to embed control lines in a macro created by a diversion.
2197 .sc "Transparent output
2198 The sequence
2199 .CW \eX'@anything@'
2200 copies
2201 .I anything
2202 to the output, as a device control function of the form
2203 .CW x
2204 .CW X 
2205 .I anything 
2206 (§22).
2207 Escape sequences in
2208 .I anything
2209 are processed.
2210 .sc "Comments and concealed newlines.
2211 An uncomfortably long input line that must stay
2212 one line (e.g., a string definition, or nofilled text)
2213 can be split into several physical lines by ending all but
2214 the last one with the escape \&\f(CW\e\fR.
2215 The sequence \&\f(CW\e\fR@newline@ is always ignored,
2216 except in a comment.
2217 Comments may be embedded at the end of any line by
2218 prefacing them with \&\f(CW\e"\fR.
2219 The newline at the end of a comment cannot be concealed.
2220 A line beginning with \&\f(CW\e"\fR will appear as a blank line and
2221 behave like
2222 .CW ".sp\ 1" ;
2223 a comment can be on a line by itself by beginning the line with \&\f(CW.\e"\fR.
2224 .NH
2225 Local Horizontal and Vertical Motions, and the Width Function
2226 .sc "Local Motions.
2227 The functions \&\f(CW\ev'\fIN\&\f(CW'\fR and
2228 \&\f(CW\eh'\fIN\&\f(CW'\fR
2229 can be used for \fIlocal\fR vertical and horizontal motion respectively.
2230 The distance @N@ may be negative; the positive directions
2231 are rightward and downward.
2232 A local motion is one contained within a line.
2233 To avoid unexpected vertical dislocations, it is necessary that
2234 the net vertical local motion within a word in filled text
2235 and otherwise within a line balance to zero.
2236 The escape sequences providing local motion are
2237 summarized in the following table.
2238 .ds Y \0\0\0
2239 .KS
2240 .TS
2241 center box;
2242 c2|cs2||c2|cs2
2243 c1|c2c2||c2|c2c2.
2244 Vertical        Effect in       Horizontal      Effect in
2245 Local Motion    \*(TR   \*(NR   Local Motion    \*(TR   \*(NR
2246 _
2247 .sp.4
2248 .TC
2249 l2|ls2||l2|ls2.
2250 \&\f(CW\*Y\ev'\fIN\|\f(CW'\fR   Move distance @N@       \
2251 \&\f(CW\*Y\eh'\fIN\|\f(CW'\fR   Move distance @N@
2252 .TC
2253 _2|_2_2||l2|ls2.
2254 x       x       x       \&\f(CW\*Y\e\fP\f2space\fP      Unpaddable space-size space
2255 .TC
2256 l2|l2|l2||l2|ls2.
2257 \&\f(CW\*Y\eu\fR        ½ em up        ½ line up      \&\f(CW\*Y\e0\fR        Digit-size space
2258 .TC
2259 l2|l2|l2||_2|_2_2.
2260 \&\f(CW\*Y\ed\fR        ½ em down      ½ line down    x       x       x
2261 .TC
2262 l2|l2|l2||l2|l2|l2.
2263 \&\f(CW\*Y\er\fR        1 em up 1 line up       \&\f(CW\*Y\e|\fR        1/6 em space    ignored
2264                         \&\f(CW\*Y\e^\fR        1/12 em space   ignored
2265 .sp.4
2266 .TE
2267 .KE
2268 As an example,
2269 \&\f(CWE\s-2\v'-.4m'2\v'.4m'\s+2\fR
2270 could be generated by a sequence of size changes and motions:
2271 \&\f(CWE\es-2\ev'-0.4m'2\ev'0.4m'\es+2\fR;
2272 note that
2273 the 0.4 em vertical motions are at the smaller size.
2274 .sc "Width Function.
2275 The \fIwidth\fR function \&\f(CW\ew'\fIstring\&\f(CW'\fR
2276 generates the numerical width of \fIstring\fR (in basic units).
2277 Size and font changes may be embedded in \fIstring\fR,
2278 and will not affect the current environment.
2279 For example,
2280 \&\&\f(CW.ti\ -\ew'\efB1.\ 'u\fR could be used to
2281 temporarily indent leftward a distance equal to the
2282 size of the string ``\&\f(CW1.\ \fR'' in font
2283 .CW B .
2284 .PP
2285 The width function also sets three number registers.
2286 The registers \&\f(CWst\fR and \&\f(CWsb\fR are set respectively to the highest and
2287 lowest extent of \fIstring\fR relative to the baseline;
2288 then, for example,
2289 the total height of the string is \&\f(CW\en(stu-\en(sbu\fR.
2290 In \*(TR the number register \&\f(CWct\fR is set to a value
2291 between 0 and 3.
2292 The value
2293 0 means that all of the characters in \fIstring\fR were short lower
2294 case characters without descenders (like \&\f(CWe\fR);
2295 1 means that at least one character has a descender (like \&\f(CWy\fR);
2296 2 means that at least one character is tall (like \&\f(CWH\fR);
2297 and 3 means that both tall characters and characters with
2298 descenders are present.
2299 .sc "Mark horizontal place.
2300 The function \&\f(CW\ek\fIx\fR causes the current horizontal
2301 position in the \fIinput line\fR to be stored in register \fIx\fR.
2302 For example,
2303 the construction \&\f(CW\ekx\fIword\f(CW\eh'|\enxu+3u'\fIword\&\f(CW\fR
2304 will embolden \fIword\fR by backing up to almost its beginning and overprinting it,
2305 resulting in \kz\fIword\fR\h'|\nzu+3u'\fIword\fR.
2306 .NH
2307 Overstrike, Bracket, Line-drawing, Graphics, and Zero-width Functions
2308 .sc "Overstriking.
2309 Automatically centered overstriking of up to nine characters
2310 is provided by the \fIoverstrike\fR function
2311 \&\f(CW\eo'\fIstring\&\f(CW\|'\fR.
2312 The characters in \fIstring\fR are overprinted with centers aligned; the total width
2313 is that of the widest character.
2314 \fIstring\fR may not contain local vertical motion.
2315 As examples,
2316 \&\f(CW\eo'e\e''\fR produces \o'e\'', and
2317 \&\f(CW\eo'\e(mo\e(sl'\fR produces \o'\(mo\(sl'.
2318 .sc "Zero-width characters.
2319 The function
2320 .CW \ez@c@
2321 will output @c@ without spacing over
2322 it, and can be used to produce left-aligned overstruck
2323 combinations.
2324 As examples,
2325 \&\f(CW\ez□+\fR will produce \z□+, and
2326 \&\f(CW\e(br\ez\e(rn\e(ul\e(br\fR will produce a small
2327 badly constructed box \&\(br\z\(rn\(ul\(br\|.
2328 .sc "Large Brackets.
2329 The Special Font usually contains a number of bracket construction pieces
2330 \|\|\(lt\|\|\(lb\|\|\(rt\|\|\(rb\|\|\(lk\|\|\(rk\|\|\(bv\|\|\(lf\|\|\(rf\|\|\(lc\|\|\(rc\|\|
2331 that can be combined into various bracket styles.
2332 The function \&\f(CW\eb'\fIstring\&\f(CW\|'\fR may be used to pile
2333 up vertically the characters in \fIstring\fR
2334 (the first character on top and the last at the bottom);
2335 the characters are vertically separated by 1 em and the total
2336 pile is centered 1/2 em above the current baseline
2337 (½ line in \*(NR).
2338 For example,
2339 .P1
2340 \eb'\e(lc\e(lf'E\eb'\e(rc\e(rf'\ex'-0.5m'\ex'0.5m'
2341 .P2
2342 produces
2343 \x'-.5m'\x'.5m'\b'\(lc\(lf'E\b'\(rc\(rf'.
2344 .sc "Line drawing.
2345 .tr &&
2346 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@.
2347 If @c@ looks like a continuation of
2348 an expression for @N@, it may be insulated from @N@ with \&\f(CW\e&\fR.
2349 If @c@ is not specified, the \&\f(CW\(ru\fR (baseline rule) is used
2350 (underline character in \*(NR).
2351 If @N@ is negative, a backward horizontal motion
2352 of size @N@ is made before drawing the string.
2353 Any space resulting from @N@/(size of @c@) having a remainder is put at the beginning (left end)
2354 of the string.
2355 If @N@ is less than the width of @c@,
2356 a single @c@ is centered on a distance @N@.
2357 In the case of characters
2358 that are designed to be connected, such as
2359 baseline-rule\ \&\f(CW\(ru\fR\|,
2360 under-rule\ \&\f(CW\(ul\fR\|,
2361 and
2362 root-en\ \&\f(CW\(rn\fR\|,
2363 the remainder space is covered by overlapping.
2364 As an example, a macro to underscore a string can be written
2365 .tr &.
2366 .P1
2367 .ne 2.1
2368 &de us
2369 \e\e$1\e\|l\|'|0\e(ul'
2370 &&
2371 .P2
2372 .ne2.1
2373 .de xu
2374 \\$1\l'|0\(ul'
2375 ..
2376 or one to draw a box around a string
2377 .P1
2378 &de bx
2379 \e(br\e|\e\e$1\e|\e(br\e\|l\|'|0\e(rn'\e\|l\|'|0\e(ul'
2380 &&
2381 .P2
2382 .de bx
2383 \(br\|\\$1\|\(br\l'|0\(rn'\l'|0\(ul'
2384 ..
2385 such that
2386 .P1
2387 &ul "underlined words"
2388 .P2
2389 and
2390 .P1
2391 &bx "words in a box"
2392 .P2
2393 yield
2394 .xu "underlined words"
2395 and
2396 .bx "words in a box"
2397 \h'-\w'.'u'.
2398 .PP
2399 The function \&\f(CW\eL'\fINc\&\f(CW'\fR draws a vertical line consisting
2400 of the (optional) character @c@ stacked vertically apart 1\|em
2401 (1 line in \*(NR),
2402 with the first two characters overlapped,
2403 if necessary, to form a continuous line.
2404 The default character is the \fIbox rule\fR \|\(br\| (\&\f(CW\|\e(br\fR);
2405 the other suitable character is the \fIbold vertical\fR \|\(bv\| (\&\f(CW\|\e(bv\fR).
2406 The line is begun without any initial motion relative to the
2407 current baseline.
2408 A positive @N@ specifies a line drawn downward and
2409 a negative @N@ specifies a line drawn upward.
2410 After the line is drawn no compensating
2411 motions are made;
2412 the instantaneous baseline is at the end of the line.
2413 .PP
2414 .de eb
2415 .sp -1
2416 .nf
2417 \h'-.5n'\L'|\\nzu-1'\l'\\n(.lu+1n\(ul'\L'-|\\nzu+1'\l'|0u-.5n\(ul'
2418 .fi
2419 ..
2420 .ne 2i
2421 .mk z
2422 .nr z \nz+1
2423 The horizontal and vertical line drawing functions may be used
2424 in combination to produce large boxes.
2425 The zero-width \fIbox-rule\fR and the ½-em wide \fIunder-rule\fR
2426 were designed to form corners when using 1-em vertical
2427 spacings.
2428 For example the macro
2429 .nr x \n(DV
2430 .nr DV 0
2431 .P1 .15i
2432 .ps -1
2433 \&.de eb
2434 \&.sp -1        \e"compensate for next automatic baseline spacing
2435 \&.nf   \e"avoid possibly overflowing word buffer
2436 \&\eh'-.5n'\eL'|\e\enau-1'\el'\e\en(.lu+1n\e(ul'\eL'-|\e\enau+1'\el'|0u-.5n\e(ul'
2437 \&.fi
2438 \&..
2439 .ps +1
2440 .P2
2441 .nr DV \nx 
2442 will draw a box around some text whose beginning vertical place was
2443 saved in number register \fIa\fR
2444 (e.g., using \&\f(CW.mk\ a\fR)
2445 as was done for this paragraph.
2446 .eb
2447 .sc "Graphics.
2448 The function
2449 .CW \eD'@c...@'
2450 draws a graphic object of type @c@
2451 according to a sequence of parameters,
2452 which are generally pairs of numbers.
2453 .IP
2454 .nf
2455 .ta 1.7i
2456 \f(CW\eD'l @dh~ dv@'    \f1draw line from current position by @dh,~dv@\f(CW
2457 \f(CW\eD'c @d@' \f1draw circle of diameter @d@ with left side at current position\f(CW
2458 \f(CW\eD'e @d sub 1 d sub 2@'   \f1draw ellipse of diameters @d sub 1@ and @d sub 2@\f(CW
2459 \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
2460            \f1with center at @dh sub 1 ,~ dv sub 1@ from current position\f(CW
2461 \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
2462            \f1then by @dh sub 2 , dv sub 2@, then by @dh sub 2 , dv sub 2@, then ...\f(CW
2463 .LP
2464 For example,
2465 .CW "\eD'e0.2i 0.1i'"
2466 draws the ellipse
2467 \D'e.2i .1i'\|,
2468 and
2469 .CW "\eD'l.2i -.1i'\eD'l.1i .1i'"
2470 the line
2471 \D'l.2i -.1i'\D'l.1i .1i'\|.
2472 A
2473 .CW \\eD
2474 with an unknown @c@ is processed and copied through to the output
2475 for unspecified interpretation;
2476 coordinates are interpreted alternately as horizontal and vertical
2477 values.
2478 .PP
2479 Numbers taken as horizontal (first, third, etc.) have default scaling of ems;
2480 vertical numbers (second, fourth, etc.) have default scaling of @V^@s (§1.3).
2481 The position after a graphical object has been drawn is
2482 at its end; for circles and ellipses, the ``end''
2483 is at the right side.
2484 .NH
2485 Hyphenation.
2486 .PP
2487 Automatic hyphenation may be switched off and on.
2488 When switched on with \&\f(CWhy\fR,
2489 several variants may be set.
2490 A \fIhyphenation indicator\fR character may be embedded in a word to
2491 specify desired hyphenation points,
2492 or may be prefixed to suppress hyphenation.
2493 In addition,
2494 the user may specify a small list of exception words.
2495 .PP
2496 Only words that consist of a central alphabetic string
2497 surrounded by (usually null) non-alphabetic strings
2498 are candidates for automatic hyphenation.
2499 Words that contain hyphens
2500 (minus),
2501 em-dashes (\&\f(CW\e(em\fR),
2502 or hyphenation indicator characters
2503 are always subject to splitting after those characters,
2504 whether automatic hyphenation is on or off.
2505 .bt "\&\f(CW&nh\fR" "hyphenate" "-" "E" "Automatic hyphenation is turned off.
2506 .bt "\&\f(CW&hy\fP@~N@" "on, @N=1@" "on, @N=1@" "E" "Automatic hyphenation is turned on
2507 for @N >= 1@, or off for @N=0@.
2508 If @N=2@, last lines (ones that will cause a trap)
2509 are not hyphenated.
2510 For @N=4@ and 8, the last and first two characters
2511 respectively of a word are not split off.
2512 These values are additive;
2513 i.e., @N=14@ will invoke all three restrictions.
2514 .bt "\&\f(CW&hc\fI c\fR" "\&\f(CW\e%" "\e%\fR" "E" "Hyphenation indicator character is set
2515 to @c@ or to the default \&\f(CW\e%\fR.
2516 The indicator does not appear in the output.
2517 .bt "\&\f(CW&hw\fI word ...\fR" "" "ignored" "-" "Specify
2518 hyphenation points in words
2519 with embedded minus signs.
2520 Versions of a word with terminal \fIs\fR are implied;
2521 i.e.,
2522 .CW dig-it
2523 implies
2524 .CW dig-its .
2525 This list is examined initially and after
2526 each suffix stripping.
2527 The space available is small.
2528 .NH
2529 Three-Part Titles.
2530 .PP
2531 The titling function \&\f(CWtl\fR provides for automatic placement
2532 of three fields at the left, center, and right of a line
2533 with a title length
2534 specifiable with \&\f(CWlt\fR.
2535 \&\f(CWtl\fR may be used anywhere, and is independent of the
2536 normal text collecting process.
2537 A common use is in header and footer macros.
2538 .h1
2539 .bt "\&\f(CW&tl '\fIleft\fP'\fIcenter\fP'\fIright\fP'\fR" "-" "-" "" "The strings
2540 \fIleft\fR, \fIcenter\fR, and \fIright\fR are
2541 respectively left-adjusted, centered, and right-adjusted
2542 in the current title length.
2543 Any of the strings may be empty,
2544 and overlapping is permitted.
2545 If the page-number character (initially \&\f(CW%\fR) is found within any of the fields it is replaced
2546 by the current page number in the format assigned to register \&\f(CW%\fR.
2547 Any character may be used in place of
2548 .CW '
2549 as the string delimiter.
2550 .bt "\&\f(CW&pc\fI c\fR" "\&\f(CW%\fR" "off" "-" "The page number character is set to @c@,
2551 or removed.
2552 The page number register remains \&\f(CW%\fR.
2553 .bt "\&\f(CW&lt\fI \(+-N\fR" "6.5\|in" "previous" "E,\fBm\fR" "Length of title
2554 is set to @+- N@.
2555 The line length and the title length are independent.
2556 Indents do not apply to titles; page offsets do.
2557 .NH
2558 Output Line Numbering.
2559 .PP
2560 .ll -\w'0000'u
2561 .nm 1 3
2562 Automatic sequence numbering of output lines may be
2563 requested with \&\f(CWnm\fR.
2564 When in effect,
2565 a three-digit, arabic number plus a digit-space
2566 is prefixed to output text lines.
2567 The text lines are thus offset by four digit-spaces,
2568 and otherwise retain their line length;
2569 a reduction in line length may be desired to keep the right margin
2570 aligned with an earlier margin.
2571 Blank lines, other vertical spaces, and lines generated by \&\f(CWtl\fR
2572 are not numbered.
2573 Numbering can be temporarily suspended with \&\f(CWnn\fR,
2574 or with an \&\f(CW.nm\fR followed by a later \&\f(CW.nm +0\fR.
2575 In addition,
2576 a line number indent \fII\fR, and the number-text separation \fIS\fR
2577 may be specified in digit-spaces.
2578 Further, it can be specified that only those line numbers that are
2579 multiples of some number @M@ are to be printed (the others will appear
2580 as blank number fields).
2581 .br
2582 .nm
2583 .ll
2584 .bt "\&\f(CW&nm\fI \(+-N M S I\fR" "" "off" "E" "Line number mode.
2585 If @+- N@ is given,
2586 line numbering is turned on,
2587 and the next output line numbered is numbered @+- N@.
2588 Default values are @M=1@, @S=1@, and @I=0@.
2589 Parameters corresponding to missing arguments are unaffected;
2590 a non-numeric argument is considered missing.
2591 In the absence of all arguments, numbering is turned off;
2592 the next line number is preserved for possible further use
2593 in number register \&\f(CWln\fR.
2594 .bt "\&\f(CW&nn\fI N\fR" "-" "@N=1@" "E" "The next @N@ text output lines are not
2595 numbered.
2596 .PP
2597 .ll -\w'0000'u
2598 .nm +0
2599 As an example, the paragraph portions of this section
2600 are numbered with \fIM=\fR\|3:
2601 \&\&\f(CW.nm\ 1\ 3\fR was placed at the beginning;
2602 \&\&\f(CW.nm\fR was placed at the end of the first paragraph;
2603 and \&\f(CW.nm\ +0\fR was placed in front of this paragraph;
2604 and \&\f(CW.nm\fR finally placed at the end.
2605 Line lengths were also changed (by \&\f(CW\ew'0000'u\fR) to keep the right side aligned.
2606 Another example is
2607 .CW .nm
2608 .CW +5
2609 .CW 5
2610 .CW x
2611 .CW 3 ,
2612 which turns on numbering with the line number of the next
2613 line to be 5 greater than the last numbered line,
2614 with @M=5@, with spacing \fIS\fR untouched, and with the indent \fII\fR set to 3.
2615 .br
2616 .ll
2617 .nm
2618 .NH
2619 Conditional Acceptance of Input
2620 .PP
2621 In the following,
2622 @c@ is a one-character built-in \fIcondition\fR name,
2623 \&\f(CW!\fR signifies \fInot\fR,
2624 @N@ is a numerical expression,
2625 \fIstring1\fR and \fIstring2\fR are strings delimited by any non-blank, non-numeric character not in the strings,
2626 and
2627 \fIanything\fR represents what is conditionally accepted.
2628 .bt "\&\f(CW&if\fI c anything\fR" "-" "-" "" "If condition
2629 @c@ true, accept \fIanything\fR as input;
2630 in multi-line case use \e{\fIanything\|\fR\e}.
2631 .bt "\&\f(CW&if !\fIc anything\fR" "-" "-" "" "If condition @c@ false, accept \fIanything\fR.
2632 .bt "\&\f(CW&if\fI N anything\fR" "" "-" "\fBu\fR" "If expression @N@ > 0, accept \fIanything\fR.
2633 .bt "\&\f(CW&if !\fIN anything\fR" "" "-" "\fBu\fR" "If expression @N@ ≤ 0 [sic], accept \fIanything\fR.
2634 .bt "\&\f(CW&if '\fIstring1\f(CW'\fIstring2\f(CW'\fI anything\fR" "-" "" "" "If \fIstring1\fR identical to \fIstring2\fR,
2635 accept \fIanything\fR.
2636 .bt "\&\f(CW&if !'\fIstring1\f(CW'\fIstring2\f(CW'\fI anything\fR" "-" "" "" "If \fIstring1\fR not identical to \fIstring2\fR,
2637 accept \fIanything\fR.
2638 .bt "\&\f(CW&ie\fI c anything\fR" "" "-" "\fBu\fR" "If portion of if-else;
2639 all of the forms for \&\f(CWif\fR above are valid.
2640 .bt "\&\f(CW&el\fI anything\fR" "-" "-" "" "Else portion of if-else.
2641 .PP
2642 The built-in condition names are:
2643 .TS
2644 center box;
2645 c2|c2
2646 c2|c2
2647 c2|l2.
2648 Condition
2649 Name    True If
2650 _
2651 \&\f(CWo\fR     Current page number is odd
2652 \&\f(CWe\fR     Current page number is even
2653 \&\f(CWt\fR     Formatter is \*(TR
2654 \&\f(CWn\fR     Formatter is \*(NR
2655 .TE
2656 If the condition @c@ is true, or if the number @N@ is greater than zero,
2657 or if the strings compare identically (including motions and character size and font),
2658 \fIanything\fR is accepted as input.
2659 If a \&\f(CW!\fR precedes the condition, number, or string comparison,
2660 the sense of the acceptance is reversed.
2661 .PP
2662 Any spaces between the condition and the beginning of \fIanything\fR are skipped over.
2663 The \fIanything\fR can be either a single input line (text, macro, or whatever)
2664 or a number of input lines.
2665 In the multi-line case,
2666 the first line must begin with a left delimiter \&\f(CW\e{\fR and
2667 the last line must end with a right delimiter \&\f(CW\e}\fR.
2668 .PP
2669 The request \&\f(CWie\fR (if-else) is identical to \&\f(CWif\fR
2670 except that the acceptance state is remembered.
2671 A subsequent and matching \&\f(CWel\fR (else) request then uses the reverse sense of that state.
2672 \&\f(CWie\fR-\&\f(CWel\fR pairs may be nested.
2673 .PP
2674 Some examples are:
2675 .P1
2676 &if e .tl '\|Even Page %'''
2677 .P2
2678 which outputs a title if the page number is even; and
2679 .P1
2680 &ie \en%>1 \e{\e
2681 \&'     sp 0.5i
2682 &       tl 'Page %'''
2683 \&'     sp |1.2i \e}
2684 &el .sp |2.5i
2685 .P2
2686 which treats page 1 differently from other pages.
2687 .NH
2688 Environment Switching.
2689 .PP
2690 A number of the parameters that
2691 control the text processing are gathered together into an
2692 \fIenvironment\fR, which can be switched by the user.
2693 The environment parameters are those associated
2694 with requests noting E in their \fINotes\fR column;
2695 in addition, partially collected lines and words are in the environment.
2696 Everything else is global; examples are page-oriented parameters,
2697 diversion-oriented parameters, number registers, and macro and string definitions.
2698 All environments are initialized with default parameter values.
2699 .bt "\&\f(CW&ev\fI N\fR" "@N=0@" "previous" "-" "Environment switched to
2700 environment @0 <= N <= 2@.
2701 Switching is done in push-down fashion so that
2702 restoring a previous environment \fImust\fR be done with \&\f(CW.ev\fR
2703 rather than specific reference.
2704 Note that what is pushed down and restored is the environment
2705 .I number,
2706 not its contents.
2707 .NH
2708 Insertions from the Standard Input
2709 .PP
2710 The input can be temporarily switched to the system standard input
2711 with \&\f(CWrd\fR,
2712 which will switch back when two consecutive newlines
2713 are found (the extra blank line is not used).
2714 This mechanism is intended for insertions in form-letter-like documentation.
2715 The standard input can be the user's keyboard,
2716 a pipe, or a file.
2717 .bt "\&\f(CW&rd\fI prompt\fR" "-" "\fIprompt=\fR\s-1BEL\s+1" "-" "Read insertion
2718 from the standard input until two newlines in a row are found.
2719 If the standard input is the user's keyboard, \fIprompt\fR (or a \s-1BEL\s+1)
2720 is written onto the standard output.
2721 \&\f(CWrd\fR behaves like a macro,
2722 and arguments may be placed after \fIprompt\fR.
2723 .bt "\&\f(CW&ex\fR" "-" "-" "-" "Exit from \*(NR/\*(TR.
2724 Text processing is terminated exactly as if all input had ended.
2725 .PP
2726 If insertions are to be
2727 taken from the terminal keyboard while output is being printed
2728 on the terminal, the command line option \&\f(CW-q\fR will turn off the echoing
2729 of keyboard input and prompt only with \s-1BEL\s+1.
2730 The regular input and insertion input cannot
2731 simultaneously come from the standard input.
2732 .PP
2733 As an example,
2734 multiple copies of a form letter may be prepared by entering the insertions
2735 for all the copies in one file to be used as the standard input,
2736 and causing the file containing the letter to reinvoke itself with \&\f(CWnx\fR (§19);
2737 the process would ultimately be ended by an \&\f(CWex\fR in the insertion file.
2738 .NH
2739 Input/Output File Switching
2740 .bt "\&\f(CW&so\fI filename\fR" "" "-" "-" "Switch source file.
2741 The top input (file reading) level is switched to \fIfilename\fR.
2742 When the new file ends,
2743 input is again taken from the original file.
2744 \&\f(CWso\fR's may be nested.
2745 .bt "\&\f(CW&nx\fI filename\fR" "" "end-of-file" "-" "Next file is \fIfilename\fR.
2746 The current file is considered ended, and the input is immediately switched
2747 to \fIfilename\fR.
2748 .bt "\&\f(CW&sy\fI string\fR" "" "-" "-" "Execute program from \fIstring\fR,
2749 which is the rest of the input line.
2750 The output is not collected automatically.
2751 The number register
2752 .CW $$ ,
2753 which contains the process id of the \*(TR process,
2754 may be useful in generating unique filenames for output.
2755 .bt "\&\f(CW&pi\fI string\fR" "" "-" "-" "Pipe output to \fIstring\fR,
2756 which is the rest of the input line.
2757 This request must occur before any printing occurs;
2758 typically it is the first line of input.
2759 .bt "\&\f(CW&cf\fI filename\fR" "" "-" "-" "Copy
2760 contents of file
2761 .I filename
2762 to output, completely unprocessed.
2763 The file is assumed to contain something meaningful
2764 to subsequent processes.
2765 .NH
2766 Miscellaneous
2767 .br
2768 .mc \s12\(br\s0
2769 .bt "\&\f(CW.mc\fI c N\fR" - off E,\fBm\fR "Specifies
2770 that a \fImargin\fR character @c@ appear a distance
2771 @N@ to the right of the right margin
2772 after each non-empty text line (except those produced by \&\f(CWtl\fR).
2773 If the output line is too long (as can happen in nofill mode)
2774 the character will be appended to the line.
2775 If @N@ is not given, the previous @N@ is used; the initial @N@ is
2776 0.2 inches in \*(NR and 1 em in \*(TR.
2777 The margin character used with this paragraph was a 12-point box-rule.
2778 .br
2779 .mc
2780 .bt "\&\f(CW.tm\fI string\fR" "-" "newline" "-" "After skipping initial blanks,
2781 \fIstring\fR (rest of the line) is read in copy mode
2782 and written on the standard error.
2783 .bt "\&\f(CW&ab\fI string\fR" "-" "newline" "-" "After skipping initial blanks,
2784 \fIstring\fR (rest of the line) is read in copy mode
2785 and written on the standard error.
2786 \*(Tr or \*(NR then exit.
2787 .bt "\&\f(CW.ig\fI yy\fR" "-" "\fI.yy=\&\f(CW..\fR" "-" "Ignore
2788 input lines.
2789 \&\f(CWig\fR behaves exactly like \&\f(CWde\fR (§7) except that the
2790 input is discarded.
2791 The input is read in copy mode, and any auto-incremented
2792 registers will be affected.
2793 .bt "\&\f(CW.lf\fI N filename\fR" "" "-" "-" "Set
2794 line number to @N@ and filename to @filename@
2795 for purposes of subsequent error messages, etc.
2796 The number register [sic]
2797 .CW .F
2798 contains the name of the current input file,
2799 as set by command line argument,
2800 .CW so ,
2801 .CW nx ,
2802 or
2803 .CW lf .
2804 The number register
2805 .CW .c
2806 contains the number of input lines read from the current file,
2807 again perhaps as modified by
2808 .CW lf .
2809 .CW 
2810 .bt "\&\f(CW.pm\fI t\fR" "-" "all" "-" "Print macros.
2811 The names and sizes of all of the defined macros and strings are printed
2812 on the standard error;
2813 if \fIt\fR is given, only the total of the sizes is printed.
2814 The sizes is given in blocks
2815 of 128 characters.
2816 .bt "\&\f(CW.fl\fR" - - B "Flush output buffer.
2817 Force output, including any pending position information.
2818 ......
2819 .NH
2820 Output and Error Messages.
2821 .PP
2822 The output from \&\f(CWtm\fR, \&\f(CWpm\fR, and the prompt from \&\f(CWrd\fR,
2823 as well as various error messages, are written onto
2824 the standard error.
2825 The latter is different from the standard output,
2826 where formatted text goes.
2827 By default, both are written onto the user's terminal,
2828 but they can be independently redirected.
2829 .PP
2830 Various error conditions may occur during
2831 the operation of \*(NR and \*(TR.
2832 Certain less serious errors having only local impact do not
2833 cause processing to terminate.
2834 Two examples are \fIword overflow\fR, caused by a word that is too large
2835 to fit into the word buffer (in fill mode), and
2836 \fIline overflow\fR, caused by an output line that grew too large
2837 to fit in the line buffer.
2838 In both cases, a message is printed, the offending excess
2839 is discarded,
2840 and the affected word or line is marked at the point of truncation
2841 with a \(** in \*(NR and a \(lh in \*(TR.
2842 Processing continues if possible,
2843 on the grounds that output useful for debugging may be produced.
2844 If a serious error occurs, processing terminates,
2845 and a message is printed, along with a list of the macro names currently active.
2846 Examples of serious errors include the inability to create, read, or write files,
2847 and the exceeding of certain internal limits that
2848 make future output unlikely to be useful.
2849 .NH
2850 Output Language
2851 .PP
2852 \*(Tr
2853 produces its output in a language that is independent of any
2854 specific output device,
2855 except that the numbers in it have been computed on the basis
2856 of the resolution of the device,
2857 and the sizes, fonts, and characters that that device can print.
2858 Nevertheless it is quite possible to interpret that output
2859 on a different device, within the latter's capabilities.
2860 .IP
2861 .nf
2862 .ta .7i
2863 @cw s n@        set point size to @n@
2864 @cw f n@        set font to @n@
2865 @cw c c@        print character @c@
2866 @cw C name@     print the character called @name@; terminate @name@ by white space
2867 @cw N n@        print character @n@ on current font
2868 @cw H n@        go to absolute horizontal position \f2n\fP (@n >= 0@)
2869 @cw V n@        go to absolute vertical position \f2n\fP (@n >= 0@, down is positive)
2870 @cw h n@        go \f2n\fP units horizontally; @n < 0@ is to the left
2871 @cw v n@        go \f2n\fP units vertically; @n < 0@ is up
2872 @nnc@   move right \f2nn\fP, then print \s-1UTF\s0 character \f2c\fP;  \f2nn\fP must be exactly 2 digits
2873 @cw p n@        new page \f2n\fP begins\(emset vertical position to 0
2874 @cw n b~a@      end of line (information only\(emno action);  \f2b\fP = space before line, \f2a\fP = after
2875 @cw w@  paddable word space (information only\(emno action)
2876 @cw D c@ ...\en graphics function @c@; see below
2877 @cw x@ ...\en   device control functions; see below
2878 @cw "#"@ ...\en comment
2879 .LP
2880 All position values are in units.
2881 Sequences that end in digits must be followed by a non-digit.
2882 Blanks, tabs and newlines may occur as separators
2883 in the input, and are mandatory to separate constructions
2884 that would otherwise be confused.
2885 Graphics functions, device control functions, and comments extend to the
2886 end of the line they occur on.
2887 .PP
2888 The device control and graphics commands are intended as open-ended
2889 families, to be expanded as needed.
2890 The graphics functions coincide directly with the
2891 .CW \eD 
2892 sequences:
2893 .IP
2894 .nf
2895 .ta 1.7i
2896 @cw Dl@ \f2dh dv\fP     draw line from current position by @dh,~ dv@
2897 @cw Dc@ \f2d\fP draw circle of diameter \f2d\fP with left side here
2898 @cw De@ @dh sub 1~dv sub 2@     draw ellipse of diameters @dh sub 1@ and @ dv sub 2@\fP
2899 @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@,
2900                    center at @dh sub 1 ,~ dv sub 1@ from current position
2901 @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@,
2902                    then to @dh sub 2 , ~dv sub 2@, then to ...
2903 @cw "D"z ~dh sub 1 ~dv sub 1 ~dh sub 2 ~dv sub 2@ ...   for any other @z@ is uninterpreted
2904 .LP
2905 In all of these, @dh, ~dv@ is an increment on the current horizontal and
2906 vertical position,
2907 with down and right positive.
2908 All distances and dimensions are in units.
2909 .PP
2910 The device control functions begin with
2911 .CW x ,
2912 then a command, then other parameters.
2913 .IP
2914 .ta .8i 1.2i
2915 .nf
2916 .ft CW
2917 x T \f2s\fP     \f1name of typesetter is @s@\f(CW
2918 x r \f2n h v\fP \f1resolution is @n@ units/inch;\f(CW
2919                 \f1@h@ = minimum horizontal motion, @v@ = minimum vertical\f(CW
2920 x i     \f1initialize\fP
2921 x f \f2n s\fP   \f1mount font @s@ on font position @n@\f(CW
2922 x p     \f1pause\(emcan restart\f(CW
2923 x s     \f1stop\(emdone forever\f(CW
2924 x t     \f1generate trailer information, if any\f(CW
2925 x H \f2n\fP     \f1set character height to @n@\f(CW
2926 x S \f2n\fP     \f1set slant to @n@\f(CW
2927 x X \f2any\fP   \f1generated by the \&\f(CW\eX\fP function\f(CW
2928 x \f2any\fP     \f1to be ignored if not recognized\f(CW
2929 .LP
2930 Subcommands like
2931 .CW i '' ``
2932 may be spelled out like
2933 .CW init ''. ``
2934 .PP
2935 The commands
2936 .CW "x T" ,
2937 .CW "x r " ...,
2938 and
2939 .CW "x i"
2940 must occur first;
2941 fonts must be mounted before they can be used;
2942 .CW "x s
2943 comes last.
2944 There are no other order requirements.
2945 .PP
2946 The following is the output from
2947 .CW hello, "" ``
2948 .CW world ''
2949 for a typical printer,
2950 as described in §23:
2951 .P1
2952 x T utf
2953 x res 720 1 1
2954 x init
2955 V0
2956 p1
2957 .P2
2958 .P1
2959 x font 1 R
2960 x font 2 I
2961 x font 3 B
2962 x font 4 BI
2963 x font 5 CW
2964 x font 6 H
2965 x font 7 HB
2966 x font 8 HX
2967 x font 9 S1
2968 x font 10 S
2969 .P2
2970 .P1
2971 s10
2972 f1
2973 H0
2974 s10
2975 f1
2976 V0
2977 H720
2978 V120
2979 ch
2980 50e44l28l28o50,w58w72o50r33l28dn120 0
2981 x trailer
2982 V7920
2983 x stop
2984 .P2
2985 .PP
2986 \*(Tr output is normally not redundant;
2987 size and font changes and position information are not included
2988 unless needed.
2989 Nevertheless, each page is self-contained, for the benefit of postprocessors
2990 that re-order pages or process only a subset.
2991 .NH
2992 Device and Font Description Files
2993 .PP
2994 The parameters that describe a output device
2995 .I name
2996 are read
2997 from the directory
2998 .CW /sys/lib/troff/font/dev@name@ ,
2999 each time
3000 \*(TR
3001 is invoked.
3002 The device name is provided by default,
3003 by the environment variable
3004 .CW TYPESETTER ,
3005 or by a command-line argument
3006 .CW -T@name@ .
3007 The default device name is
3008 .CW utf ,
3009 for \s-1UTF\s0-encoded Unicode characters.
3010 The pre-defined string
3011 .CW .T
3012 contains the name of the device.
3013 The
3014 .CW -F
3015 command-line option may be used to change the default directory.
3016 .......
3017 .sc "Device description file.
3018 General parameters of the device are stored, one per line, in
3019 the file 
3020 .CW /sys/lib/troff/font/dev@name@/DESC ,
3021 as a sequence of names and values.
3022 \*(Tr recognizes these parameters, and ignores any
3023 others that may be present for specific drivers:
3024 .IP
3025 .nf
3026 .ta 1i
3027 @cw fonts ~ n ~ F sub 1  ~F sub 2  ~. . .~ F sub n@
3028 @cw sizes ~ s sub 1 ~ s sub 2 ~ . . . cw 0@
3029 @cw res ~n@
3030 @cw hor ~n@
3031 @cw vert ~n@
3032 @cw unitwidth ~n@
3033 @cw charset@
3034 \f2list of multi-character character names (optional)\fP
3035 .LP
3036 The @F sub i@ are font names
3037 to be initially mounted.
3038 The list of sizes is a set of integers representing
3039 some or all of the legal sizes the device can produce,
3040 terminated by a zero.
3041 The 
3042 .CW res
3043 parameter gives the resolution of the machine in units per inch;
3044 .CW hor
3045 and
3046 .CW ver
3047 give the minimum number of units that can be moved
3048 horizontally and vertically.
3049 .PP
3050 Character widths for each font are assumed to be given in machine units
3051 at point size
3052 .CW unitwidth .
3053 (In other words, a character with a width of
3054 @n@ is @n@ units wide at size
3055 .CW unitwidth .)
3056 All widths are integers at all sizes.
3057 .PP
3058 A list of valid character names may be introduced by
3059 .CW charset ;
3060 the list of names is optional.
3061 .PP
3062 A line whose first non-blank character is
3063 .CW #
3064 is a comment.
3065 Except that
3066 .CW charset
3067 must occur last, parameters may appear in any order.
3068 .PP
3069 Here is a subset of the
3070 .CW DESC
3071 file for a typical Postscript printer:
3072 .P1
3073 # Description file for Postscript printers.
3074
3075 fonts 10 R I B BI CW H HB HX S1 S
3076 sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
3077    24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 44 48 54 60 72 0
3078 res 720
3079 hor 1
3080 vert 1
3081 unitwidth 10
3082 charset
3083 hy ct fi fl ff Fi Fl dg em 14 34 12 en aa
3084 ga ru sc dd -> br Sl ps cs cy as os =. ld
3085 rd le ge pp -+ ob vr
3086 sq bx ci fa te ** pl mi eq ~= *A *B *X *D
3087 *E *F *G *Y *I *K *L *M *N *O *P *R *H *S *T *U *W
3088 *C *Q *Z ul rn *a *b *x *d *e *f *g *y *i *k
3089 *l *m *n *o *p *h *r *s *t *u *w *c *q *z
3090 .P2
3091 .sc "Font description files.
3092 Each font is described by an analogous description file,
3093 which begins with parameters of the font, one per line, followed by a
3094 list of characters and widths.
3095 The file for font
3096 .I f
3097 is
3098 .CW /sys/lib/troff/font/dev@name@/@f@ .
3099 .IP
3100 .ta 1.7i
3101 .nf
3102 @cw name ~str@  name of font is @str@
3103 @cw ligatures ~ ". . ." ~ cw "0"@       list of ligatures
3104 @cw spacewidth ~n@      width of a space on this font
3105 @cw special@    this is a special font
3106 @cw charset@
3107 \f2list of character name, width, ascender/descender, code\fP, tab separated
3108 .LP
3109 The
3110 .CW name
3111 and
3112 .CW charset
3113 fields are mandatory;
3114 .CW charset
3115 must be last.
3116 Comments are permitted,
3117 as are other unrecognized parameters.
3118 .PP
3119 Each line following
3120 .CW charset 
3121 describes one character: its name, its width in units as described above,
3122 ascender/descender information, and a decimal, octal or hexadecimal value
3123 by which the output device knows it
3124 (the
3125 .CW \eN
3126 ``number'' of the character).
3127 The character name is arbitrary, except that
3128 .CW ---
3129 signifies an unnamed character.
3130 If the width field contains
3131 .CW \&" ,
3132 the name is a synonym for the previous character.
3133 The ascender/descender field is 1 if
3134 the character has a descender (hangs below the baseline, like
3135 .CW y ),
3136 is 2 if it has an ascender (is tall, like
3137 .CW Y ),
3138 is 3 if both,
3139 and is 0 if neither.
3140 The value is returned
3141 in the 
3142 .CW ct
3143 register, as computed by the
3144 .CW \ew
3145 function (§11.2).
3146 .PP
3147 Here are excerpts from a typical font description file
3148 for the same Postscript printer.
3149 .P1
3150 hy      33      0       45      hyphen \e(hy
3151 -       "                       - is a synonym for \e(hy
3152 .sp .3
3153 Q       72      3       81
3154 .sp .3
3155 a       44      0       97
3156 b       50      2       98
3157 c       44      0       99
3158 d       50      2       100
3159 y       50      1       121
3160 .sp .3
3161 em      100     0       208
3162 ---     44      2       220     Pound symbol £, \eN'220'
3163 ---     36      0       221     centered dot \eN'221'
3164 .P2
3165 This says, for example, that the width of the letter
3166 .CW a
3167 is 44 units at point size 10,
3168 the value of 
3169 .CW unitwidth .
3170 Point sizes are scaled linearly and rounded, so the width of
3171 .CW a
3172 will be 44 at size 10, 40 at size 9, 35 at size 8,
3173 and so on.
3174 .sp 100
3175 .BP
3176 .fp 8 C CW
3177 .tr &.
3178 .tr |
3179 .tr ~|
3180 .TL
3181 Tutorial Examples
3182 .SP
3183 ....2C
3184 .sp .25i
3185 .SH
3186 Introduction
3187 .PP
3188 It is almost always necessary to
3189 prepare at least a small set of macro definitions
3190 to describe a document.
3191 Such common formatting needs
3192 as page margins and footnotes
3193 are deliberately not built into \*(NR and \*(TR.
3194 Instead,
3195 the macro and string definition, number register, diversion,
3196 environment switching, page-position trap, and conditional input mechanisms
3197 provide the basis for user-defined implementations.
3198 .PP
3199 For most uses, a standard package like
3200 .CW -ms
3201 or
3202 .CW -mm
3203 is the right choice.
3204 The next stage is to augment that,
3205 or to selectively replace macros from the standard package.
3206 The last stage, much harder,
3207 is to write one's own from scratch.
3208 This is not a task for the novice.
3209 .PP
3210 The examples discussed here are intended to be useful and somewhat realistic,
3211 but will not necessarily cover all relevant contingencies.
3212 Explicit numerical parameters are used
3213 in the examples
3214 to make them easier to read and to
3215 illustrate typical values.
3216 In many cases, number registers would be used
3217 to reduce the number of places where numerical
3218 information is kept,
3219 and to concentrate conditional parameter initialization
3220 like that which depends on whether \*(TR or \*(NR is being used.
3221 .SH
3222 Page Margins
3223 .PP
3224 As discussed in §3,
3225 header and footer macros are usually defined
3226 to describe the top and bottom page margin areas respectively.
3227 A trap is planted at page position 0 for the header, and at
3228 \fI-N\fR (\fIN\fR from the page bottom) for the footer.
3229 The simplest such definitions might be
3230 .P1 .1i
3231 &de hd  \e"define header
3232 \&'sp 1i
3233 &&      \e"end definition
3234 &de fo  \e"define footer
3235 \&'bp
3236 &&      \e"end definition
3237 &wh 0 hd
3238 &wh -1i fo
3239 .P2
3240 which provide blank 1 inch top and bottom margins.
3241 The header will occur on the \fIfirst\fR page
3242 only if the definition and trap exist prior to
3243 the initial pseudo-page transition (§3).
3244 In fill mode, the output line that springs the footer trap
3245 was typically forced out because some part or whole word didn't fit on it.
3246 If anything in the footer and header that follows causes a break,
3247 that word or part word will be forced out.
3248 In this and other examples,
3249 requests like \&\f(CWbp\fR and \&\f(CWsp\fR that normally cause breaks are invoked using
3250 the no-break control character \&\f(CW'\fR
3251 to avoid this.
3252 When the header/footer design contains material
3253 requiring independent text processing, the
3254 environment may be switched, avoiding
3255 most interaction with the running text.
3256 .PP
3257 A more realistic example would be
3258 .P1 .1i
3259 &de hd  \e"header
3260 &if \e\en%>1 \e{\e
3261 \&'sp ~0.5i-1   \e"tl base at 0.5i
3262 &tl ''- % -''   \e"centered page number
3263 &ps     \e"restore size
3264 &ft     \e"restore font
3265 &vs  \e}        \e"restore vs
3266 \&'sp ~1.0i     \e"space to 1.0i
3267 &ns     \e"turn on no-space mode
3268 &&
3269 &de fo  \e"footer
3270 &ps 10  \e"set footer/header size
3271 &ft R   \e"set font
3272 &vs 12p \e"set baseline spacing
3273 &if \e\en%=1 \e{\e
3274 \&'sp ~\e\en(.pu-0.5i-1  \e"tl base 0.5i up
3275 &tl ''- % -'' \e}  \e"first page number
3276 \&'bp
3277 &&
3278 &wh 0 hd
3279 &wh -1i fo
3280 .P2
3281 which sets the size, font, and baseline spacing for the
3282 header/footer material, and ultimately restores them.
3283 The material in this case is a page number at the bottom of the
3284 first page and at the top of the remaining pages.
3285 The \&\f(CWsp\fR's refer to absolute positions to avoid
3286 dependence on the baseline spacing.
3287 Another reason for doing this in the footer
3288 is that the footer is invoked by printing a line whose
3289 vertical spacing swept past the trap position by possibly
3290 as much as the baseline spacing.
3291 No-space mode is turned on at the end of \&\f(CWhd\fR
3292 to render ineffective
3293 accidental occurrences of \&\f(CWsp\fR at the top of the running text.
3294 .PP
3295 This method of restoring size, font, etc., presupposes
3296 that such requests (that set \fIprevious\fR value) are \fInot\fR
3297 used in the running text.
3298 A better scheme is to save and restore both the current \fIand\fR
3299 previous values as shown for size in the following:
3300 .P1 .1i
3301 &de fo
3302 &nr s1 \e\en(.s \e"current size
3303 &ps
3304 &nr s2 \e\en(.s \e"previous size
3305 &  ---  \e"rest of footer
3306 &&
3307 &de hd
3308 &  ---  \e"header stuff
3309 &ps \e\en(s2  \e"restore previous size
3310 &ps \e\en(s1  \e"restore current size
3311 &&
3312 .P2
3313 Page numbers may be printed in the bottom margin
3314 by a separate macro triggered during the footer's
3315 page ejection:
3316 .P1 .1i
3317 &de bn  \e"bottom number
3318 &tl ''- % -''   \e"centered page number
3319 &&
3320 &wh -0.5i-1v bn  \e"tl base 0.5i up
3321 .P2
3322 .SH
3323 Paragraphs and Headings
3324 .PP
3325 The housekeeping
3326 associated with starting a new paragraph should be collected
3327 in a paragraph macro
3328 that, for example,
3329 does the desired preparagraph spacing,
3330 forces the correct font, size, baseline spacing, and indent,
3331 checks that enough space remains for \fImore than one\fR line,
3332 and
3333 requests a temporary indent.
3334 .P1 .1i
3335 &de pg    \e"paragraph
3336 &br       \e"break
3337 &ft R     \e"force font,
3338 &ps 10    \e"size,
3339 &vs 12p   \e"spacing,
3340 &in 0     \e"and indent
3341 &sp 0.4   \e"prespace
3342 &ne 1+\e\en(.Vu  \e"want more than 1 line
3343 &ti 0.2i         \e"temp indent
3344 &&
3345 .P2
3346 The first break in \&\f(CWpg\fR
3347 will force out any previous partial lines,
3348 and must occur before the \&\f(CWvs\fR.
3349 The forcing of font, etc., is
3350 partly a defense against prior error and
3351 partly to permit
3352 things like section heading macros to
3353 set parameters only once.
3354 The prespacing parameter is suitable for \*(TR;
3355 a larger space, at least as big as the output device vertical resolution, would be
3356 more suitable in \*(NR.
3357 The choice of remaining space to test for in the \&\f(CWne\fR
3358 is the smallest amount greater than one line
3359 (the \&\f(CW.V\fR is the available vertical resolution).
3360 .PP
3361 A macro to automatically number section headings
3362 might look like:
3363 .P1 .1i
3364 &de sc  \e"section
3365 &  ---  \e"force font, etc.
3366 &sp 0.4 \e"prespace
3367 &ne 2.4+\e\en(.Vu \e"want 2.4+ lines
3368 .lg 0
3369 &fi
3370 .lg
3371 \e\en+S.
3372 &&
3373 &nr S 0 1       \e"init S
3374 .P2
3375 The usage is \&\f(CW.sc\fR,
3376 followed by the section heading text,
3377 followed by \&\f(CW.pg\fR.
3378 The \&\f(CWne\fR test value includes one line of heading,
3379 0.4 line in the following \&\f(CWpg\fR, and
3380 one line of the paragraph text.
3381 A word consisting of the next section number and a period is
3382 produced to begin the heading line.
3383 The format of the number may be set by \&\f(CWaf\fR (§8).
3384 .PP
3385 Another common form is the labeled, indented paragraph,
3386 where the label protrudes left into the indent space.
3387 .P1 .1i
3388 &de lp  \e"labeled paragraph
3389 &pg
3390 &in 0.5i        \e"paragraph indent
3391 &ta 0.2i 0.5i   \e"label, paragraph
3392 &ti 0
3393 \et\e\e$1\et\ec \e"flow into paragraph
3394 &&
3395 .P2
3396 The intended usage is ``\&\f(CW.lp\fR \fIlabel\fR\|'';
3397 \fIlabel\fR will begin at 0.2 inch, and
3398 cannot exceed a length of 0.3 inch without intruding into
3399 the paragraph.
3400 The label could be right adjusted against 0.4 inch by
3401 setting the tabs instead with \&\f(CW.ta|0.4iR|0.5i\fR.
3402 The last line of \&\f(CWlp\fR ends with \&\f(CW\ec\fR so that
3403 it will become a part of the first line of the text
3404 that follows.
3405 .SH
3406 Multiple Column Output
3407 .PP
3408 The production of multiple column pages requires
3409 the footer macro to decide whether it was
3410 invoked by other than the last column,
3411 so that it will begin a new column rather than
3412 produce the bottom margin.
3413 The header can initialize a column register that
3414 the footer will increment and test.
3415 The following is arranged for two columns, but
3416 is easily modified for more.
3417 .P1 .1i
3418 &de hd  \e"header
3419 &  ---
3420 &nr cl 0 1      \e"init column count
3421 &mk     \e"mark top of text
3422 &&
3423 .P2
3424 .P1 .1i
3425 &de fo  \e"footer
3426 &ie \e\en+(cl<2 \e{\e
3427 &po +3.4i       \e"next column; 3.1+0.3
3428 &rt     \e"back to mark
3429 &ns \e} \e"no-space mode
3430 &el \e{\e
3431 &po \e\enMu     \e"restore left margin
3432 &  ---
3433 \&'bp \e}
3434 &&
3435 &ll 3.1i        \e"column width
3436 &nr M \e\en(.o  \e"save left margin
3437 .P2
3438 Typically a portion of the top of the first page
3439 contains full width text;
3440 the request for the narrower line length,
3441 as well as another \&\f(CW.mk\fR would
3442 be made where the two column output was to begin.
3443 .SH
3444 Footnotes
3445 .PP
3446 The footnote mechanism to be described is used by
3447 embedding the footnotes in the input text at the
3448 point of reference,
3449 demarcated by an initial \&\f(CW.fn\fR and a terminal \&\f(CW.ef\fR:
3450 .P1 .1i
3451 &fn
3452 \fIFootnote text and control lines...\fP
3453 &ef
3454 .P2
3455 In the following,
3456 footnotes are processed in a separate environment and diverted
3457 for later printing in the space immediately prior to the bottom
3458 margin.
3459 There is provision for the case where the last collected
3460 footnote doesn't completely fit in the available space.
3461 .P1 .1i
3462 &de hd  \e"header
3463 &  ---
3464 &nr x 0 1       \e"init footnote count
3465 &nr y 0-\e\enb  \e"current footer place
3466 &ch fo -\e\enbu \e"reset footer trap
3467 &if \e\en(dn .fz        \e"leftover footnote
3468 &&
3469 .P2
3470 .P1 .1i
3471 &de fo  \e"footer
3472 &nr dn 0  \e"zero last diversion size
3473 &if \e\enx \e{\e
3474 &ev 1   \e"expand footnotes in ev1
3475 &nf     \e"retain vertical size
3476 &FN     \e"footnotes
3477 &rm FN  \e"delete it
3478 .P2
3479 .P1 .1i
3480 &if "\e\en(.z"fy" .di  \e"end overflow di
3481 &nr x 0 \e"disable fx
3482 &ev  \e}        \e"pop environment
3483 &  ---
3484 \&'bp
3485 &&
3486 .P2
3487 .P1 .1i
3488 &de fx  \e"process footnote overflow
3489 &if \e\enx .di fy       \e"divert overflow
3490 &&
3491 .P2
3492 .P1 .1i
3493 &de fn  \e"start footnote
3494 &da FN  \e"divert (append) footnote
3495 &ev 1   \e"in environment 1
3496 &if \e\en+x=1 .fs   \e"if 1st, separator
3497 &fi     \e"fill mode
3498 &&
3499 .P2
3500 .P1 .1i
3501 &de ef  \e"end footnote
3502 &br     \e"finish output
3503 &nr z \e\en(.v  \e"save spacing
3504 &ev     \e"pop ev
3505 &di     \e"end diversion
3506 &nr y -\e\en(dn \e"new footer position,
3507 &if \e\enx=1 .nr y -(\e\en(.v-\e\enz) \e
3508         \e"uncertainty correction
3509 &ch fo \e\enyu  \e"y is negative
3510 &if (\e\en(nl+1v)>(\e\en(.p+\e\eny) \e
3511 &ch fo \e\en(nlu+1v      \e"didn't fit
3512 &&
3513 .P2
3514 .P1 .1i
3515 &de fs  \e"separator
3516 \el'1i' \e"1 inch rule
3517 &br
3518 &&
3519 .P2
3520 .P1 .1i
3521 &de fz  \e"get leftover footnote
3522 &fn
3523 &nf     \e"retain vertical size
3524 &fy     \e"where fx put it
3525 &ef
3526 &&
3527 .P2
3528 .P1 .1i
3529 &nr b 1.0i  \e"bottom margin size
3530 &wh 0 hd    \e"header trap
3531 &wh 12i fo  \e"footer trap->temp pos
3532 &wh -\e\enbu fx \e"fx at footer position
3533 &ch fo -\e\enbu \e"conceal fx with fo
3534 .P2
3535 .PP
3536 The header \&\f(CWhd\fR initializes a footnote count register \&\f(CWx\fR,
3537 and sets both the current footer trap position register \&\f(CWy\fR and
3538 the footer trap itself to a nominal position specified in
3539 register \&\f(CWb\fR.
3540 In addition, if the register \&\f(CWdn\fR indicates a leftover footnote,
3541 \&\f(CWfz\fR is invoked to reprocess it.
3542 The footnote start macro \&\f(CWfn\fR begins a diversion (append) in environment 1,
3543 and increments the count \&\f(CWx\fR; if the count is one, the footnote separator \&\f(CWfs\fR
3544 is interpolated.
3545 The separator is kept in a separate macro to permit user redefinition.
3546 .PP
3547 The footnote end macro \&\f(CWef\fR restores
3548 the previous environment and ends the diversion after saving the spacing size in register \&\f(CWz\fR.
3549 \&\f(CWy\fR is then decremented by the size of the footnote, available in \&\f(CWdn\fR;
3550 then on the first footnote, \&\f(CWy\fR is further decremented by the difference
3551 in vertical baseline spacings of the two environments, to
3552 prevent the late triggering of the footer trap from causing the last
3553 line of the combined footnotes to overflow.
3554 The footer trap is then set to the lower (on the page) of \&\f(CWy\fR or the current page position (\&\f(CWnl\fR)
3555 plus one line, to allow for printing the reference line.
3556 .PP
3557 If indicated by \&\f(CWx\fR, the footer \&\f(CWfo\fR rereads the footnotes from \&\f(CWFN\fR in nofill mode
3558 in environment 1,
3559 and deletes \&\f(CWFN\fR.
3560 If the footnotes were too large to fit, the macro \&\f(CWfx\fR will be trap-invoked to redivert
3561 the overflow into \&\f(CWfy\fR,
3562 and the register \&\f(CWdn\fR will later indicate to the header whether \&\f(CWfy\fR is empty.
3563 .PP
3564 Both \&\f(CWfo\fR and \&\f(CWfx\fR are planted in the nominal footer trap position in an order
3565 that causes \&\f(CWfx\fR to be concealed unless the \&\f(CWfo\fR trap is moved.
3566 The footer then terminates the overflow diversion, if necessary, and
3567 zeros \&\f(CWx\fR to disable \&\f(CWfx\fR,
3568 because the uncertainty correction
3569 together with a not-too-late triggering of the footer can result
3570 in the footnote rereading finishing before reaching the \&\f(CWfx\fR trap.
3571 .PP
3572 A good exercise for the student is to combine the multiple-column and footnote mechanisms.
3573 .SH
3574 The Last Page
3575 .PP
3576 After the last input file has ended, \*(NR and \*(TR
3577 invoke the \fIend macro\fR (§7), if any,
3578 and when it finishes, eject the remainder of the page.
3579 During the eject, any traps encountered are processed normally.
3580 At the end of this last page, processing terminates
3581 unless a partial line, word, or partial word remains.
3582 If it is desired that another page be started, the end-macro
3583 .P1 .1i
3584 &de en  \e"end-macro
3585 \ec
3586 \&'bp
3587 &&
3588 &em en
3589 .P2
3590 will deposit a null partial word,
3591 and produce another last page.
3592 ....1C
3593 .sp 100
3594 .BP
3595 ........
3596 .TL
3597 Special Character Names
3598 .SP
3599 .PP
3600 The following table lists names for a set of characters,
3601 most of which have traditionally been provided by \*(TR using
3602 the `special' or `symbol' font.
3603 Many of these sequences are old ways to get what are now Unicode
3604 characters;
3605 Lucida Sans, for example, has glyphs corresponding to many of these
3606 but does not have the special sequences.
3607 Therefore
3608 the \*(TR sequence
3609 .CW \e(*F
3610 gives the character \(*F from the Times font instead of the
3611 character Φ from the current font, in this case Lucida Sans.
3612 Not all sequences print on any particular device, including this one; Peter
3613 faces appear in their place.
3614 .TS
3615 center;
3616 l l20fCW l l20fCW l l20fCW.
3617 \&\'    \e'     \(*m    \e(*m   \(~=    \e(~=
3618 \`      \e`     \(*n    \e(*n   \(ap    \e(ap
3619 \(em    \e(em   \(*c    \e(*c   \(!=    \e(!=
3620 \(en    \e(en   \(*o    \e(*o   \(->    \e(->
3621 \(hy    \e(hy   \(*p    \e(*p   \(<-    \e(<-
3622 \-      \e-     \(*r    \e(*r   \(ua    \e(ua
3623 \(bu    \e(bu   \(*s    \e(*s   \(da    \e(da
3624 \(sq    \e(sq   \(ts    \e(ts   \(mu    \e(mu
3625 \(ru    \e(ru   \(*t    \e(*t   \(di    \e(di
3626 \(14    \e(14   \(*u    \e(*u   \(+-    \e(+-
3627 \(12    \e(12   \(*f    \e(*f   \(cu    \e(cu
3628 \(34    \e(34   \(*x    \e(*x   \(ca    \e(ca
3629 \(fi    \e(fi   \(*q    \e(*q   \(sb    \e(sb
3630 \(fl    \e(fl   \(*w    \e(*w   \(sp    \e(sp
3631 \(ff    \e(ff   \(*A    \e(*A   \(ib    \e(ib
3632 \(Fi    \e(Fi   \(*B    \e(*B   \(ip    \e(ip
3633 \(Fl    \e(Fl   \(*G    \e(*G   \(if    \e(if
3634 \(de    \e(de   \(*D    \e(*D   \(pd    \e(pd
3635 \(dg    \e(dg   \(*E    \e(*E   \(gr    \e(gr
3636 \(fm    \e(fm   \(*Z    \e(*Z   \(no    \e(no
3637 \(ct    \e(ct   \(*Y    \e(*Y   \(is    \e(is
3638 \(rg    \e(rg   \(*H    \e(*H   \(pt    \e(pt
3639 \(co    \e(co   \(*I    \e(*I   \(es    \e(es
3640 \(pl    \e(pl   \(*K    \e(*K   \(mo    \e(mo
3641 \(mi    \e(mi   \(*L    \e(*L   \(br    \e(br
3642 \(eq    \e(eq   \(*M    \e(*M   \(dd    \e(dd
3643 \(**    \e(**   \(*N    \e(*N   \(rh    \e(rh
3644 \(sc    \e(sc   \(*C    \e(*C   \(lh    \e(lh
3645 \(aa    \e(aa   \(*O    \e(*O   \(L1    \e(bs
3646 \(ga    \e(ga   \(*P    \e(*P   \(or    \e(or
3647 \(ul    \e(ul   \(*R    \e(*R   \(ci    \e(ci
3648 \(sl    \e(sl   \(*S    \e(*S   \(lt    \e(lt
3649 \(*a    \e(*a   \(*T    \e(*T   \(lb    \e(lb
3650 \(*b    \e(*b   \(*U    \e(*U   \(rt    \e(rt
3651 \(*g    \e(*g   \(*F    \e(*F   \(rb    \e(rb
3652 \(*d    \e(*d   \(*X    \e(*X   \(lk    \e(lk
3653 \(*e    \e(*e   \(*Q    \e(*Q   \(rk    \e(rk
3654 \(*z    \e(*z   \(*W    \e(*W   \(bv    \e(bv
3655 \(*y    \e(*y   \(sr    \e(sr   \(lf    \e(lf
3656 \(*h    \e(*h   \(rn    \e(rn   \(rf    \e(rf
3657 \(*i    \e(*i   \(>=    \e(>=   \(lc    \e(lc
3658 \(*k    \e(*k   \(<=    \e(<=   \(rc    \e(rc
3659 \(*l    \e(*l   \(==    \e(==   \d\h'-5m'\(LH\u \e(LH
3660 .TE