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