Annotation of researchv10dc/vol2/troff/indep_tr, revision 1.1

1.1     ! root        1: ...\" Thu May 22 16:54:35 EDT 1986
        !             2: .de UC
        !             3: \&\\$3\s-2\\$1\s+2\&\\$2
        !             4: ..
        !             5: .fp 1 PA
        !             6: .fp 2 PI
        !             7: .fp 3 PB
        !             8: .nr dT 8       \" tab stops this far apart in .P1/.P2
        !             9: .hy 14         \" set hyphenation: 2=not last lines; 4= no -xx; 8=no xx-
        !            10: .\"
        !            11: .\"
        !            12: .ND  "Revised, March, 1982"
        !            13: .TR 97
        !            14: ....TM 80-1272-8 39199 39199-11
        !            15: .TL
        !            16: A Typesetter-independent TROFF
        !            17: .AU "MH 2C-518" 6021
        !            18: Brian W. Kernighan
        !            19: .AI
        !            20: .MH
        !            21: .AB
        !            22: .PP
        !            23: Although 
        !            24: .UC TROFF
        !            25: has been the mainstay of document preparation
        !            26: at Bell Labs for several years,
        !            27: it has heretofore been very dependent
        !            28: on one particular typesetter,
        !            29: the Graphic Systems CAT.
        !            30: .PP
        !            31: This paper describes conversion of 
        !            32: .UC TROFF
        !            33: to deal with a wide class of typesetters.
        !            34: .PP
        !            35: Some of these typesetters provide many more facilities
        !            36: than the CAT does.
        !            37: Typical extra features include
        !            38: more sizes and fonts,
        !            39: larger alphabets,
        !            40: and the ability to
        !            41: create new characters
        !            42: and to draw graphical objects.
        !            43: The paper describes the enhancements that permit
        !            44: .UC TROFF
        !            45: to take advantage of some
        !            46: of these capabilities as well.
        !            47: .AE
        !            48: .CS 12 1 13 0 0 2 
        !            49: .NH
        !            50: A Bit of History
        !            51: .LP
        !            52: .QS
        !            53: ``I will be speaking today about work in progress,
        !            54: instead of completed research;
        !            55: this was not my original intention when I chose the subject
        !            56: of this lecture,
        !            57: but the fact is I couldn't get my
        !            58: computer programs working in time.''
        !            59: .sp .5
        !            60: .ta 4i
        !            61:        Donald E. Knuth
        !            62: .[
        !            63: %A Donald E. Knuth
        !            64: %T Mathematical typography
        !            65: %J Bulletin (New Series) of the American Mathematical Society
        !            66: %V 1
        !            67: %N 2
        !            68: %D 1979
        !            69: .]
        !            70: .QE
        !            71: .PP
        !            72: The
        !            73: .UC TROFF
        !            74: text formatter
        !            75: .[
        !            76: %A J. F. Ossanna
        !            77: %T NROFF/TROFF User's Manual
        !            78: %D October 1976
        !            79: %R Comp. Sci. Tech. Rep. 54
        !            80: %I Bell Laboratories
        !            81: %C Murray Hill, NJ
        !            82: .]
        !            83: was originally written by the late Joe Ossanna
        !            84: in about 1973, in assembly language for the PDP-11.
        !            85: .UC NROFF , (
        !            86: which drives terminals instead of a typesetter,
        !            87: is essentially identical to
        !            88: .UC TROFF ;
        !            89: we will use
        !            90: .UC TROFF '' ``
        !            91: as a generic term hence\%forth.)
        !            92: It was rewritten in C around 1975,
        !            93: and underwent slow but steady evolution until
        !            94: Ossanna's death late in 1977.
        !            95: .PP
        !            96: In spite of some obvious deficiencies
        !            97: \(em a rebarbative input syntax,
        !            98: mysterious and undocumented properties in some areas,
        !            99: and a voracious appetite for computer resources
        !           100: (especially when used with macro packages and preprocessors like
        !           101: .UC EQN
        !           102: and
        !           103: .UC TBL )
        !           104: \(em
        !           105: .UC TROFF
        !           106: has been the basis of document preparation at
        !           107: Bell Labs for some years,
        !           108: and is likely to remain so for years to come.
        !           109: .PP
        !           110: Early in 1979,
        !           111: the Computing Science Research Center
        !           112: decided to acquire a new typesetter,
        !           113: primarily because of our interests in typesetting graphics.
        !           114: At the same time,
        !           115: the Murray Hill Computer Center
        !           116: began to investigate the possibility of replacing their
        !           117: family of aging CAT's
        !           118: with a new, high-performance typesetter,
        !           119: simply to keep up with their rapidly expanding load.
        !           120: .PP
        !           121: My first thought
        !           122: (a thought shared by many others)
        !           123: was that this would be a glorious opportunity
        !           124: to replace 
        !           125: .UC TROFF
        !           126: with a new formatting language:
        !           127: better designed,
        !           128: easier to work with,
        !           129: and of course much faster.
        !           130: This remains a desirable goal,
        !           131: but, after quite a bit of thought spread over several
        !           132: years,
        !           133: I am still not really much closer to a better design,
        !           134: let alone an implementation.
        !           135: Furthermore,
        !           136: a great deal of software depends on 
        !           137: .UC TROFF 
        !           138: \(em
        !           139: the preprocessors, the macro packages,
        !           140: and of course all of their documentation and our accumulated expertise.
        !           141: Tossing this aside is not something to be done lightly.
        !           142: .PP
        !           143: Accordingly, in the spring of 1979,
        !           144: I set about to modify
        !           145: .UC TROFF
        !           146: so that it would run hence\%forth without change
        !           147: on a variety of typesetters.
        !           148: The ground rule was that
        !           149: .UC TROFF
        !           150: should retain its current specifications,
        !           151: so that existing software like
        !           152: .UC EQN ,
        !           153: .UC TBL
        !           154: and the macro packages would continue to work with it.
        !           155: .PP
        !           156: Since much of the rest of this paper
        !           157: is encrusted with details that could appeal only to
        !           158: maintainers or masochists,
        !           159: I will give here a brief summary of what has been done.
        !           160: Non-specialists can stop reading at the end of the section.
        !           161: .PP
        !           162: .UC TROFF
        !           163: is highly dependent on the Graphic Systems CAT typesetter,
        !           164: not just in details of code
        !           165: but also in many aspects of its design.
        !           166: The language design issues have been largely ignored
        !           167: (few are truly fundamental),
        !           168: while the code has been modified
        !           169: so that dependencies are either eliminated
        !           170: or at least parameterized.
        !           171: .PP
        !           172: .UC TROFF
        !           173: originally had parameters of the typesetter
        !           174: compiled into the code,
        !           175: often in non-obvious ways.
        !           176: The new version reads a parameter file
        !           177: each time it is invoked, to
        !           178: set values for machine resolution,
        !           179: legal sizes, fonts and characters,
        !           180: character widths
        !           181: and the like.
        !           182: .PP
        !           183: .UC TROFF
        !           184: output used to be binary device codes
        !           185: specific to the CAT and arcane beyond description.
        !           186: The output of the new version is
        !           187: .UC ASCII
        !           188: characters
        !           189: in a simple and (I hope) universal language
        !           190: that describes where each character is to be placed
        !           191: and in what size and font.
        !           192: A post-processor must be written for each typesetter
        !           193: to convert this typesetter-independent language
        !           194: into specific codes for that typesetter.
        !           195: Post-processors currently exist
        !           196: for the CAT,
        !           197: the Mergenthaler Linotron 202,
        !           198: the Autologic APS-5,
        !           199: the Tektronix 4014 terminal,
        !           200: The Imagen Canon laser printer,
        !           201: Versatec printers,
        !           202: and a bit-map terminal.
        !           203: New ones can generally be written in less than a day;
        !           204: they share much of their code with previous ones.
        !           205: .PP
        !           206: The new output language contains information that is not readily
        !           207: identifiable in the older output.
        !           208: Most notably, the beginning of each page and line
        !           209: is marked,
        !           210: so post-processors can do device-specific optimizations
        !           211: such as sorting the data vertically or printing it boustrophedonically,
        !           212: independently of
        !           213: .UC TROFF .
        !           214: .PP
        !           215: Since actual output is done by a post-processor,
        !           216: not
        !           217: .UC TROFF ,
        !           218: new capabilities for graphics have been easy to add.
        !           219: .UC TROFF
        !           220: now recognizes commands for drawing diagonal lines,
        !           221: circles, ellipses, circular arcs,
        !           222: and quadratic B-splines;
        !           223: these are used in the
        !           224: PIC
        !           225: .[
        !           226: %A Brian W. Kernighan
        !           227: %T PIC \(em A Crude Graphics Language for Typesetting
        !           228: %R Comp. Sci. Tech. Rep. 85
        !           229: %I Bell Laboratories
        !           230: %C Murray Hill, NJ
        !           231: %O Also in SIGPLAN Symposium on Text Manipulation, Portland, June 1981.
        !           232: .]
        !           233: and
        !           234: IDEAL
        !           235: .[
        !           236: %A Christopher J. Van Wyk
        !           237: %T A Graphics Typesetting Language
        !           238: %R SIGPLAN Symposium on Text Manipulation, Portland
        !           239: %D June, 1981
        !           240: .]
        !           241: languages.
        !           242: .PP
        !           243: A number of limitations have been eased or eliminated.
        !           244: A document may have an arbitrary number of fonts on any page
        !           245: (if the output device permits it, of course).
        !           246: Fonts may be accessed merely by naming them;
        !           247: ``mounting'' is no longer necessary.
        !           248: Character \H'8'height\H'10' and \S'-10'sl\S'0'a\S'10'nt\S'0' may be set
        !           249: independently of width.
        !           250: .PP
        !           251: The new
        !           252: .UC TROFF
        !           253: is about 1000 bytes larger in instruction space
        !           254: and 13000 bytes larger in data space
        !           255: (thus guaranteeing that it will not run on
        !           256: PDP-11/40 style machines).
        !           257: It runs about as fast as the original version,
        !           258: though
        !           259: a simple improvement that I made could be retrofitted into 
        !           260: the earlier version to keep it about 20% faster.
        !           261: The post-processors are not included in these time comparisons;
        !           262: they typically take 10-20% of the
        !           263: .UC TROFF
        !           264: time.
        !           265: .NH
        !           266: Typesetter Dependencies
        !           267: .PP
        !           268: .UC TROFF
        !           269: turns out to be surprisingly dependent on
        !           270: the Graphic Systems CAT,
        !           271: not just in the code but in its design.
        !           272: .PP
        !           273: Some of the design dependencies are pretty obvious.
        !           274: For example, the CAT provides four fonts
        !           275: (of 102 characters each) and 15 sizes.
        !           276: The specific sizes
        !           277: are wired into the syntax of the language:
        !           278: since the CAT has no sizes larger than 36 points,
        !           279: .CW \es46
        !           280: can be uniquely decoded as a 4-point 
        !           281: .CW 6 ,
        !           282: while
        !           283: .CW \es36 
        !           284: is simply a switch into size 36.
        !           285: .PP
        !           286: .UC TROFF
        !           287: makes the assumption that there are four fonts,
        !           288: three of which are physically isomorphic
        !           289: (that is, the same characters appear in the same position in each)
        !           290: and one ``special'' font
        !           291: that is logically a part of each of the others.
        !           292: The reserved font name
        !           293: .CW S
        !           294: finds its way into several commands
        !           295: and receives special treatment in a variety of contexts.
        !           296: .PP
        !           297: Some commands have the basic resolution of the
        !           298: CAT wired into their definition;
        !           299: for example, the units of the
        !           300: .CW .ss
        !           301: command (which sets the size of the inter-word spacing)
        !           302: are 36th's of an em,
        !           303: because the CAT typesetter itself works in those units.
        !           304: .PP
        !           305: Some command line options reflect idiosyncrasies of the CAT.
        !           306: For example, the option
        !           307: .CW -p
        !           308: requests that the output all be printed in one size;
        !           309: since the CAT is excruciatingly slow at changing point sizes,
        !           310: this
        !           311: prints an approximation to final output
        !           312: comparatively quickly.
        !           313: The
        !           314: .CW -g
        !           315: option causes font information to appear in the output file
        !           316: for the benefit of the operations staff at the Murray Hill
        !           317: Computer Center.
        !           318: .PP
        !           319: At the same time,
        !           320: there are myriad places
        !           321: where the characteristics of the CAT are an integral part of
        !           322: the code for
        !           323: .UC TROFF .
        !           324: Some of these are quite evident;
        !           325: others are subtle indeed.
        !           326: .PP
        !           327: The most obvious instance is the internal encoding of
        !           328: a character.
        !           329: Within
        !           330: .UC TROFF ,
        !           331: objects are passed around as 16 bit quantities.
        !           332: There are two fundamental objects \(em
        !           333: printable characters and motions.
        !           334: An object looks like this:
        !           335: .TS
        !           336: center;
        !           337: cw(2) cw(8) cw(4) cw(2) cw(16)
        !           338: |c0|c0|c0|c0|c0|.
        !           339: 1      4       2       1       8
        !           340: _
        !           341: .ft CW
        !           342: m      s       f       z       c
        !           343: .ft
        !           344: _
        !           345: .TE
        !           346: If the
        !           347: .CW m
        !           348: bit is a 1, the object represents a motion;
        !           349: if it is zero, the object is something to be printed.
        !           350: In that case,
        !           351: .CW s
        !           352: is the size (actually an index into a table of legal sizes),
        !           353: .CW f
        !           354: is the font,
        !           355: .CW z
        !           356: is the zero-motion bit
        !           357: (i.e., no space after printing),
        !           358: and
        !           359: .CW c
        !           360: is the character.
        !           361: If the high order bit of
        !           362: .CW c
        !           363: is set,
        !           364: the character is to be looked up in a table of
        !           365: special names
        !           366: (for example,
        !           367: .CW 0200
        !           368: is the hyphen
        !           369: .CW \e(hy );
        !           370: otherwise it is
        !           371: .UC ASCII .
        !           372: Furthermore,
        !           373: if
        !           374: .CW c
        !           375: is less than octal 40 or greater than octal 370,
        !           376: the character is actually some encoded control function
        !           377: or very special character
        !           378: such as
        !           379: .CW \ee 
        !           380: or
        !           381: .CW \e{ .
        !           382: .PP
        !           383: Clearly the tight packing makes it utterly impossible
        !           384: to add another size or font \(em
        !           385: there are no bits left over.
        !           386: It also implies limits on the number of characters
        !           387: in a font and on the number of special names
        !           388: (names of the form
        !           389: .CW \e(xx ).
        !           390: .PP
        !           391: Motions are encoded as
        !           392: .TS
        !           393: center;
        !           394: cw(2) cw(2) cw(2) cw(26)
        !           395: |c0|c0|c0|c0|.
        !           396: 1      1       1       13
        !           397: _
        !           398: .ft CW
        !           399: m      v       n       mag
        !           400: .ft
        !           401: _
        !           402: .TE
        !           403: .CW m
        !           404: is the ``motion bit'', which is 1 for a motion,
        !           405: .CW v
        !           406: is 1 for a vertical motion,
        !           407: and
        !           408: .CW n
        !           409: is 1 for a negative motion.
        !           410: The remaining 13 bits give the magnitude.
        !           411: Since there are only 13 bits,
        !           412: the maximum amount of motion is 
        !           413: 8191 machine units.
        !           414: With the CAT's resolution of 432 units per inch,
        !           415: this is a generous 19 inches.
        !           416: But for the Linotron 202 (resolution 972/inch),
        !           417: it is only 8.5 inches.
        !           418: .PP
        !           419: Within the code,
        !           420: certain character values are used in tests and assignments
        !           421: without identification.
        !           422: For instance the octal value
        !           423: .CW 0200
        !           424: is used (without identification) as a hyphen.
        !           425: But of course the mask
        !           426: .CW 0200
        !           427: also occurs many times.
        !           428: As might be imagined, it takes some study to determine whether
        !           429: any particular
        !           430: .CW 0200
        !           431: is a hyphen or a mask.
        !           432: .PP
        !           433: The basic resolution of the CAT is 432 units per inch
        !           434: horizontally and 144 vertically.
        !           435: Character widths are given as the number of units at size 6 points.
        !           436: There are 72 points in an inch.
        !           437: Thus the program contains as magic numbers
        !           438: every factor of 432,
        !           439: and \(+-1 from each factor as well.
        !           440: .PP
        !           441: Finally, 
        !           442: .UC TROFF
        !           443: is simply a big program (at least by my standards) \(em
        !           444: about 7000 lines of virtually uncommented C.
        !           445: (I am indebted to Lorinda Cherry for a new version of the C beautifier
        !           446: that made
        !           447: the code legible, if not comprehensible.)
        !           448: It was implemented before the recent additions to C,
        !           449: so there are no
        !           450: .CW typedef 's
        !           451: to distinguish among the various kinds of integers,
        !           452: relatively few macros with arguments,
        !           453: no internal
        !           454: .CW static
        !           455: variables,
        !           456: and a startling number of global variables
        !           457: with two-character names.
        !           458: .PP
        !           459: None of these remarks should be taken as denigrating
        !           460: Ossanna's accomplishment with
        !           461: .UC TROFF .
        !           462: It has proven a remarkably robust tool,
        !           463: taking unbelievable abuse from a variety of preprocessors
        !           464: and being forced into uses that were never conceived of
        !           465: in the original design,
        !           466: all with considerable grace under fire.
        !           467: .NH
        !           468: Modifying TROFF
        !           469: .PP
        !           470: The first step was to widen the 16-bit internal representation of a character
        !           471: to 32 bits, to accommodate more sizes and fonts.
        !           472: The current representation is
        !           473: .TS
        !           474: center;
        !           475: cw(2) cw(14) cw(16) cw(2) cw(30)
        !           476: |c0|c0|c0|c0|c0|.
        !           477: 1      7       8       1       15
        !           478: _
        !           479: .ft CW
        !           480: z      s       f       m       c
        !           481: .ft
        !           482: _
        !           483: .TE
        !           484: If
        !           485: .CW m
        !           486: is 1, bits 16 and 17 are
        !           487: .CW v
        !           488: and
        !           489: .CW n .
        !           490: Access to this representation is entirely through
        !           491: macros;
        !           492: for example, a macro called
        !           493: .CW cbits
        !           494: fetches the character bits,
        !           495: another called
        !           496: .CW setsfbits
        !           497: sets the size and font bits, and so on.
        !           498: .PP
        !           499: This stage took several weeks of meticulous checking,
        !           500: since it was necessary to examine every integer
        !           501: constant, variable and function in the program
        !           502: to decide whether it was being used to store
        !           503: an internal character.
        !           504: These are now all identified and
        !           505: .CW typedef 'd
        !           506: for future reference.
        !           507: .PP
        !           508: Widening 16 bits to 32 turns out to be quite costly on the PDP-11,
        !           509: since the program must process
        !           510: .CW long
        !           511: integers instead of short ones.
        !           512: The result is approximately a 25% increase in program size
        !           513: and perhaps 25% increase in run time.
        !           514: Furthermore the temporary file in which
        !           515: .UC TROFF
        !           516: keeps its macro and string definitions doubles in size
        !           517: (to 256k bytes).
        !           518: .PP
        !           519: Note that at this stage the program has not been changed in any fundamental
        !           520: way \(em
        !           521: it still generates CAT output,
        !           522: so a bit-for-bit regression test against the original version can be performed after each change.
        !           523: This proved to be very important for maintaining sanity
        !           524: in both program and programmer.
        !           525: .NH
        !           526: Dynamic Machine Parameters
        !           527: .PP
        !           528: The next step was to find all the the numbers in the program that depend
        !           529: on the CAT and replace them by variables.
        !           530: This also contributed marginally to slower execution,
        !           531: since many values and expressions that were constants now became variables.
        !           532: .PP
        !           533: With parameters identified as such,
        !           534: the next step was
        !           535: to make it possible to load a description of
        !           536: the typesetter each time
        !           537: .UC TROFF
        !           538: is run, rather than creating a compiled version for each typesetter.
        !           539: Accordingly, a set of description files was designed and created
        !           540: for each typesetter and each font.
        !           541: The description really comes in two pieces \(em
        !           542: a table describing parameters of the machine,
        !           543: and a table of widths for each font.
        !           544: To illustrate, here is the parameter file for the CAT:
        !           545: .P1 .2i
        !           546: # Graphic Systems CAT-4
        !           547: res 432
        !           548: hor 1
        !           549: vert 3
        !           550: unitwidth 6
        !           551: sizes 6 7 8 9 10 11 12 14 16 18 20 22 24 28 36 0
        !           552: fonts 4 R I B S
        !           553: charset
        !           554: \e|  \e^  \e-  \e_
        !           555: hy  bu  sq  em  ru  14  12  34  mi  fi  fl  ff  Fi  Fl  de  dg  sc  fm  aa  ga
        !           556: ul  sl  *a  *b  *g  *d  *e  *z  *y  *h  *i  *k  *l  *m  *n  *c  *o  *p  *r  *s
        !           557: *t  *u  *f  *x  *q  *w  *A  *B  *G  *D  *E  *Z  *Y  *H  *I  *K  *L  *M  *N  *C
        !           558: *O  *P  *R  *S  *T  *U  *F  *X  *Q  *W  sr  ts  rn  >=  <=  ==  ~=  ap  !=  ->
        !           559: <-  ua  da  eq  mu  di  +-  cu  ca  sb  sp  ib  ip  if  pd  gr  no  is  pt  es
        !           560: mo  pl  rg  co  br  ct  dd  rh  lh  **  bs  or  ci  lt  lb  rt  rb  lk  rk  bv
        !           561: lf  rf  lc  rc
        !           562: .P2
        !           563: A
        !           564: .CW #
        !           565: introduces a comment.
        !           566: .CW res
        !           567: is the machine resolution in units per inch.
        !           568: .CW hor
        !           569: and
        !           570: .CW vert
        !           571: give the minimum number of machine units that it is possible
        !           572: to move in the corresponding direction.
        !           573: .CW unitwidth
        !           574: specifies the point size at which the character widths map directly
        !           575: into machine units.
        !           576: .CW sizes
        !           577: lists the set of legal point sizes,
        !           578: terminated by a zero.
        !           579: .CW fonts
        !           580: lists the default set of fonts 
        !           581: (which can be overridden by subsequent 
        !           582: .CW .fp
        !           583: commands).
        !           584: .CW charset
        !           585: introduces the set of legitimate special names
        !           586: (names of the form
        !           587: .CW \e(xx ,
        !           588: including some special cases like
        !           589: .CW \e| ).
        !           590: .PP
        !           591: For comparison, here is the description file for the
        !           592: Mergenthaler Linotron 202.
        !           593: The 202 has many more sizes and fonts than the CAT,
        !           594: and quite a few more characters as well.
        !           595: (The 202 actually permits nearly 250 sizes;
        !           596: no use has yet been found for most of them.)
        !           597: .P1
        !           598: # Mergenthaler Linotron 202
        !           599: fonts 10 R I B BI H HB HK PO CH S
        !           600: sizes 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
        !           601:    21 22 23 24 25 26 27 28 29 30 32 34 36 38 40
        !           602:    45 50 55 60 66 72 78 84 90 96 102 108 0
        !           603: res 972
        !           604: hor 1
        !           605: vert 2
        !           606: unitwidth 4
        !           607: paperwidth 7500
        !           608: charset
        !           609: \e|  \e^  \e-  \e_
        !           610: **  *C  *D  *F  *G  *H  *L  *P  *Q  *S  *W  *a  *b  *c  *d  *e  *f  *g  *h
        !           611: *i  *k  *l  *m  *n  *p  *q  *r  *s  *t  *w  *x  *y  *z  +-  ->  <-  <=
        !           612: ==  >=  L.  Sl  al  aa  ap  b0  br  bs  bu  bv  ca
        !           613: cd  ci  co  ct  cu  dd  de  dg  di  em  eq  es  fe  fm  ga  gr  hy
        !           614: ib  if  ip  is  l.  lh  ma  mi  mo  mu  no  or  pd  pl  pp  pt  rg  rh  ru
        !           615: sb  sc  sl  sp  sq  sr  tm  tp  ts  ~=  ~~  ul  rn  en
        !           616: lf  rf  lc  rc  lt  rt  lb  rb  lk  rk  !=  ua  da  12  fa  te  ma  fe
        !           617: hc  ..  ob  bx  *o  *u  b9  14  34  ss  vr
        !           618: .P2
        !           619: .CW paperwidth
        !           620: specifies the maximum width of paper in units,
        !           621: overriding the default 7\(34".
        !           622: .PP
        !           623: In addition to this description file (one per typesetter),
        !           624: there is one file per font that lists properties of that font.
        !           625: Here is part of the description of Times Roman
        !           626: for the CAT:
        !           627: .P1
        !           628: # Times Roman for CAT-4
        !           629: name R
        !           630: internalname 1
        !           631: ligatures ff fi fl ffi ffl 0
        !           632: charset
        !           633: \e|    6       0       0
        !           634: \e^    3       0       0
        !           635: a      17      0       025
        !           636: b      20      2       012
        !           637: c      16      0       027
        !           638: d      20      2       011
        !           639: e      18      0       031
        !           640: f      13      2       014
        !           641: \&...
        !           642: !      12      2       0145
        !           643: &      28      2       050
        !           644: (      16      2       0132
        !           645: )      16      2       0133
        !           646: *      16      0       0122
        !           647: +      36      0       0143
        !           648: ,      12      0       047
        !           649: hy     13      0       040     hyphen
        !           650: -      "       =hy
        !           651: \e-    36      0       0123
        !           652: \&.    10      0       044
        !           653: de     15      0       0136    degree
        !           654: dg     20      0       0137    dagger
        !           655: fm     8       0       0150
        !           656: rg     20      0       0141
        !           657: co     20      0       0153
        !           658: ct     19      0       0127
        !           659: \&...
        !           660: .P2
        !           661: .PP
        !           662: The
        !           663: .CW name
        !           664: is the external 
        !           665: .UC TROFF
        !           666: name, one or two characters,
        !           667: as used in
        !           668: .CW .ft
        !           669: and
        !           670: .CW \ef
        !           671: commands.
        !           672: The internal name is not used by
        !           673: .UC TROFF
        !           674: itself, but is necessary for the postprocessors.
        !           675: If the font has
        !           676: ligatures, they are listed.
        !           677: It is possible to set the width of the space for each font
        !           678: separately with the
        !           679: .CW spacewidth 
        !           680: command,
        !           681: not illustrated here.
        !           682: There is also a keyword
        !           683: .CW special
        !           684: to indicate that the font is a ``special'' font \(em
        !           685: one that is to be searched if the regular font
        !           686: does not contain the character requested.
        !           687: There is no limit on the number of special fonts,
        !           688: but they should be listed last in the
        !           689: .CW fonts
        !           690: part of the description file.
        !           691: .PP
        !           692: The four columns of data are
        !           693: the character name,
        !           694: its width,
        !           695: its ascender/descender information
        !           696: (1 \(-> descender, 2 \(-> ascender, 3 \(-> both),
        !           697: and the actual typesetter code required to print it.
        !           698: When the point size is
        !           699: .CW unitwidth ,
        !           700: the width
        !           701: is the character width in machine units.
        !           702: If the name is a single character,
        !           703: it is taken simply as a normal
        !           704: .UC ASCII
        !           705: character.
        !           706: Two or more characters
        !           707: indicate a name of the form
        !           708: .CW \e(xx  ;
        !           709: there are a handful of historical exceptions like
        !           710: .CW \e- .
        !           711: A width of
        !           712: .CW \&"
        !           713: indicates that the character is a synonym for the
        !           714: immediately preceding character,
        !           715: as in
        !           716: .CW -
        !           717: and
        !           718: .CW hy
        !           719: above.
        !           720: Comments may follow the four data fields.
        !           721: .PP
        !           722: There are significant advantages to having the font and typesetter
        !           723: descriptions merely text files that can be edited easily,
        !           724: but it is too time-consuming to load all this
        !           725: .UC ASCII
        !           726: information
        !           727: each time
        !           728: .UC TROFF
        !           729: is invoked.
        !           730: Thus a separate program called
        !           731: .CW makedev
        !           732: is used to compile
        !           733: it into a binary file that can be read by 
        !           734: .UC TROFF
        !           735: in a single read.
        !           736: When
        !           737: .UC TROFF
        !           738: is invoked,
        !           739: an argument of the form
        !           740: .CW -Txxx
        !           741: tells it to load the description file for typesetter
        !           742: .CW xxx 
        !           743: from a standard directory.
        !           744: .PP
        !           745: Descriptions for the default fonts are compiled into the description file;
        !           746: if a new font is requested by a
        !           747: .CW .fp
        !           748: command,
        !           749: its description data replaces the original values.
        !           750: The
        !           751: .CW .ft
        !           752: command has been modified so that if the requested font
        !           753: is not currently ``mounted'',
        !           754: its description data will be placed in the hidden
        !           755: font position 0.
        !           756: Since there is only one such position,
        !           757: each new non-standard font overlays the previous one.
        !           758: This mechanism is intended to make
        !           759: occasional use of non-standard fonts easy;
        !           760: the
        !           761: .CW .fp
        !           762: mechanism remains necessary for other purposes.
        !           763: .PP
        !           764: The notion of special fonts has been generalized somewhat \(em
        !           765: rather than a single special font,
        !           766: there can be several.
        !           767: The algorithm currently used is to search for each character
        !           768: on the current font;
        !           769: if it is not found there, then the special fonts are searched
        !           770: in order (as given in the description file).
        !           771: Other than that,
        !           772: the treatment of special fonts is essentially unchanged.
        !           773: .PP
        !           774: At this stage in the modifications to
        !           775: .UC TROFF ,
        !           776: all internal arithmetic is done in terms of
        !           777: the resolution of the specified typesetter.
        !           778: The character set and character widths are defined by
        !           779: the values loaded from the font description.
        !           780: Indeed, the mapping from character name to what gets printed
        !           781: is determined by this table \(em
        !           782: fonts are no longer all isomorphic.
        !           783: .PP
        !           784: Although it is certainly convenient for testing during
        !           785: program development,
        !           786: it is not clear that loading the font information for
        !           787: the typesetter each time
        !           788: .UC TROFF
        !           789: is invoked is the right way to operate in an environment
        !           790: that supports only a single kind of typesetter.
        !           791: In a production mode it might be desirable to compile in
        !           792: the default information for the standard typesetter.
        !           793: .NH
        !           794: Output Language
        !           795: .PP
        !           796: The final step is to modify the output of 
        !           797: .UC TROFF
        !           798: so that it is typesetter-independent.
        !           799: The new version of
        !           800: .UC TROFF
        !           801: produces output that is not intended to go directly to
        !           802: a typesetter.
        !           803: Rather, it is more or less independent of any typesetter,
        !           804: except that the numbers in it have been computed on the
        !           805: basis of the resolution specified in the description
        !           806: file for the intended typesetter.
        !           807: .PP
        !           808: The output language is simple:
        !           809: .P1
        !           810: .ta .7i
        !           811: s\f2n\fP       size in points
        !           812: f\f2n\fP       font as number from 1 to \f2n\fP
        !           813: c\f2x\fP       ASCII character \f2x\fP
        !           814: C\f2xy\fP      character \e(\f2xy\fP; terminate \f2xy\fP by white space
        !           815: H\f2n\fP       go to absolute horizontal position \f2n\fP. (\f2n\fP > 0)
        !           816: V\f2n\fP       go to absolute vertical position \f2n\fP (down is positive)
        !           817: h\f2n\fP       go \f2n\fP units horizontally (to the right; \f2n\fP > 0)
        !           818: v\f2n\fP       go \f2n\fP units vertically (down; \f2n\fP > 0)
        !           819: \f2nnc\fP      move right \f2nn\fP, then print \f2c\fP (\f2nn\fP is exactly 2 digits!)
        !           820: n\f2b a\fP     end of line (information only -- no action needed)
        !           821:        \f2b\fP = space before line, \f2a\fP = after
        !           822: w      paddable word space (information only -- no action needed)
        !           823: p\f2n\fP       new page \f2n\fP begins -- set V to 0
        !           824: x ...\en       device control functions
        !           825: D ...\en       drawing functions (graphics)
        !           826: .P2
        !           827: Encoding small horizontal motions followed by a character as
        !           828: .I nnc
        !           829: shrinks the output file size by about 35%
        !           830: and run-time by about 15%.
        !           831: .PP
        !           832: The device control and graphics commands are intended as open-ended
        !           833: families, to be expanded as needed.
        !           834: .P1
        !           835: .ta .7i
        !           836: x i    init
        !           837: x T \f2s\fP    name of typesetter is \f2s\fP
        !           838: x r \f2n h v\fP        resolution is \f2n\fP/inch, \f2h\fP = minimum horizontal motion, \f2v\fP = min vert
        !           839: x p    pause (can restart)
        !           840: x s    stop -- done forever
        !           841: x t    generate trailer
        !           842: x f \f2n s\fP  font position \f2n\fP contains font \f2s\fP
        !           843: x H \f2n\fP    set character height to \f2n\fP
        !           844: x S \f2n\fP    set slant to \f2n\fP
        !           845: .P2
        !           846: Subcommands like
        !           847: .CW i '' ``
        !           848: are often spelled out like
        !           849: .CW init ''. ``
        !           850: .PP
        !           851: The drawing functions are
        !           852: .P1
        !           853: .ta 1i
        !           854: Dl \f2dh dv\fP draw line from current position by \f2dh dv\fP
        !           855: Dc \f2d\fP     draw circle of diameter \f2d\fP with left side here
        !           856: De \f2d1 d2\fP draw ellipse of diameters \f2d1 d2\fP
        !           857: Da \f2dh1 dv1 dh2 dv2\fP
        !           858:                draw arc from current position to \f2dh1+dh2 dv1+dv2\fP,
        !           859:                center at \f2dh1 dv1\fP from current position
        !           860: D~ \f2dh1 dv1 dh2 dv2 ...\fP
        !           861:                draw B-spline from current position to \f2dh1 dv1\fP,
        !           862:                then to \f2dh2 dv2\fP, then to ...
        !           863: .P2
        !           864: In all of these, \f2dh dv\fP is an increment on the current horizontal and
        !           865: vertical position,
        !           866: with down and right positive.
        !           867: .PP
        !           868: Blanks, tabs and newlines may occur as separators
        !           869: in the input, and are mandatory to separate constructions
        !           870: that would otherwise be confused.
        !           871: .PP
        !           872: To illustrate, the following is the output from the input
        !           873: .P1
        !           874: hello
        !           875: \&.br
        !           876: \&.ps 20
        !           877: \&.ft H
        !           878: goodbye
        !           879: .P2
        !           880: using
        !           881: .CW -Tcat :
        !           882: .P1
        !           883: x T cat
        !           884: x res 432 1 3
        !           885: x init
        !           886: x font 1 R
        !           887: x font 2 I
        !           888: x font 3 B
        !           889: x font 4 S
        !           890: V0
        !           891: p1
        !           892: s10
        !           893: f1
        !           894: H416
        !           895: V72
        !           896: ch
        !           897: 35e30l17l17on72 0
        !           898: x font 0 H
        !           899: f1
        !           900: H416
        !           901: f0
        !           902: s20
        !           903: V144
        !           904: cg
        !           905: 70o70o70d73b73y67en72 0
        !           906: x trailer
        !           907: V4752
        !           908: x stop
        !           909: .P2
        !           910: Here is the same output from the 202.
        !           911: Notice how the numbers are more than twice as big,
        !           912: reflecting the higher resolution of the 202.
        !           913: Also notice that the font
        !           914: .CW H
        !           915: is a standard font on the 202 so no special loading is needed
        !           916: to switch to it.
        !           917: .P1
        !           918: x T 202
        !           919: x res 972 1 2
        !           920: x init
        !           921: x font 1 R
        !           922: x font 2 I
        !           923: x font 3 B
        !           924: x font 4 BI
        !           925: x font 5 H
        !           926: x font 6 HB
        !           927: x font 7 HK
        !           928: x font 8 PO
        !           929: x font 9 CH
        !           930: x font 10 S
        !           931: V0
        !           932: p1
        !           933: s10
        !           934: f1
        !           935: H936
        !           936: V156
        !           937: ch
        !           938: 73e63l35l35on156 0
        !           939: H936
        !           940: f5
        !           941: s20
        !           942: V312
        !           943: cg
        !           944: h150co
        !           945: h150co
        !           946: h150cd
        !           947: h150cb
        !           948: h150cy
        !           949: h135ce
        !           950: n156 0
        !           951: x trailer
        !           952: V10692
        !           953: x stop
        !           954: .P2
        !           955: .PP
        !           956: The output is guaranteed to be
        !           957: .UC ASCII ,
        !           958: and thus amenable to processing by all the normal
        !           959: Unix
        !           960: tools.
        !           961: The language is simple \(em
        !           962: it is straightforward to write a prototype driver
        !           963: for a particular typesetter,
        !           964: especially when one can steal an existing one
        !           965: as a model,
        !           966: although it may take some effort to make one of production quality.
        !           967: This form also demystifies
        !           968: .UC TROFF
        !           969: output
        !           970: and makes it possible for anyone to write other programs
        !           971: to process or generate it.
        !           972: .PP
        !           973: On the other hand,
        !           974: it is about twice as voluminous as the output intended for
        !           975: the CAT.
        !           976: Cleverness (or sacrificing
        !           977: .UC ASCII -ness)
        !           978: could bring
        !           979: it down to not much more than one byte per character printed,
        !           980: but so far I have not felt this to be very important.
        !           981: .PP
        !           982: There is not really much to say about the post-processors.
        !           983: .UC D202
        !           984: drives the 202,
        !           985: .UC DCAT
        !           986: drives the CAT (although not very efficiently \(em
        !           987: the vital boustrophedon and size-sorting features are not there),
        !           988: .UC DAPS
        !           989: drives the APS-5,
        !           990: .UC DCAN
        !           991: drives the Canon,
        !           992: and
        !           993: .UC TC
        !           994: (notice the parallel name structure)
        !           995: drives the Tektronix 4014.
        !           996: There are also rough and ready drivers for other display terminals.
        !           997: .PP
        !           998: Since it is easy to identify page and line boundaries,
        !           999: some drivers are able to offer useful features
        !          1000: that were not feasible with the older
        !          1001: .UC TROFF .
        !          1002: For example,
        !          1003: .UC TC
        !          1004: permits the user to ask for specific pages by number,
        !          1005: and to skip back and forth in the document.
        !          1006: .UC D202
        !          1007: displays the output page number on the operator's control panel and will also
        !          1008: stop at specified pages if requested.
        !          1009: An experimental postprocessor
        !          1010: called
        !          1011: .UC DSORT
        !          1012: sorts the intermediate language by vertical position,
        !          1013: to minimize vertical motion;
        !          1014: it is intended for printing complicated 
        !          1015: .UC PIC
        !          1016: diagrams and for circuit diagrams produced by
        !          1017: .UC PLTROFF .
        !          1018: .UC PLTROFF \& (
        !          1019: converts the standard Unix
        !          1020: plot language into
        !          1021: .UC TROFF
        !          1022: commands.)
        !          1023: All of the post-processors can scan their input relatively quickly
        !          1024: to print only selected pages.
        !          1025: .NH
        !          1026: New Things
        !          1027: .PP
        !          1028: During the process of making these changes to
        !          1029: .UC TROFF ,
        !          1030: I have made some changes to the program
        !          1031: that are visible to users
        !          1032: (thus violating the avowed goal of keeping it compatible).
        !          1033: .PP
        !          1034: Some changes are simply the easing of restrictions.
        !          1035: For example,
        !          1036: there is no longer any limit on the number of fonts
        !          1037: that can occur on a page
        !          1038: (if one's typesetter is up to it),
        !          1039: nor does the
        !          1040: .CW .fp
        !          1041: command that requests ``mounting'' a new font
        !          1042: have to occur only at the beginning.
        !          1043: Furthermore, a font may be accessed merely by naming it \(em
        !          1044: the command
        !          1045: .P1
        !          1046: \ef(ARBell Laboratories\efP
        !          1047: .P2
        !          1048: will produce
        !          1049: .P1
        !          1050: \f(ARBell Laboratories\fP
        !          1051: .P2
        !          1052: (The font
        !          1053: .CW AR
        !          1054: is Avant-Garde Book. 
        !          1055: Obviously two-letter font names will have to go.)
        !          1056: .PP
        !          1057: Character sets can be sensibly defined
        !          1058: since they no longer have to all be isomorphic.
        !          1059: Thus, for example, on the 202 the ``printout'' font
        !          1060: .P1
        !          1061: This one
        !          1062: .P2
        !          1063: includes a complete
        !          1064: .UC ASCII
        !          1065: alphabet.
        !          1066: All of the characters have the same width,
        !          1067: even the word space
        !          1068: (defined by the
        !          1069: .CW spacewidth
        !          1070: attribute in the font description file).
        !          1071: Thus this font is suitable for printing program listings
        !          1072: without any special precautions.
        !          1073: On the other hand,
        !          1074: some fonts are rather small,
        !          1075: containing only a handful of characters.
        !          1076: .PP
        !          1077: Larger and smaller point sizes are available,
        !          1078: although there are still some limitations.
        !          1079: For example,
        !          1080: .CW \es72
        !          1081: is still parsed as a 7 point
        !          1082: .CW 2 ,
        !          1083: since changing this would affect at least
        !          1084: .UC EQN
        !          1085: and probably other programs as well.
        !          1086: (Sadly,
        !          1087: .UC EQN
        !          1088: had to be changed
        !          1089: anyway \(em
        !          1090: it also accepts an option of the form
        !          1091: .CW -Txxx .)
        !          1092: But
        !          1093: .CW .ps\ 72
        !          1094: works fine:
        !          1095: each input size is mapped into the closest legal size
        !          1096: for the current typesetter.
        !          1097: Fractional point sizes are not allowed
        !          1098: and may never be.
        !          1099: .PP
        !          1100: Character height and slant may be set independently of character
        !          1101: width, for those typesetters that allow these operations.
        !          1102: .CW \eH'n'
        !          1103: sets the character height to
        !          1104: .CW n
        !          1105: points,
        !          1106: .CW \eH'\(+-n'
        !          1107: sets it to
        !          1108: .CW \(+-n
        !          1109: from the current point size,
        !          1110: and
        !          1111: .CW \eH'0'
        !          1112: restores it to normal height.
        !          1113: .CW \eS'n'
        !          1114: sets the slant to
        !          1115: .CW n
        !          1116: degrees positive or negative;
        !          1117: if 
        !          1118: .CW n
        !          1119: is zero, slanting is turned off.
        !          1120: .PP
        !          1121: Some obsolete commands have been eliminated
        !          1122: (e.g.,
        !          1123: .CW .fz ,
        !          1124: .CW .li ;
        !          1125: the command line options for constant-size printing and
        !          1126: suppressing boustrophedon;
        !          1127: all code related to
        !          1128: .UC GCOS ).
        !          1129: .PP
        !          1130: A new command
        !          1131: .CW .sy
        !          1132: has been added to permit calling another program from
        !          1133: within
        !          1134: .UC TROFF :
        !          1135: .P1
        !          1136: \&.sy \f2command line \fP
        !          1137: .P2
        !          1138: causes 
        !          1139: .I "command line"
        !          1140: to be executed.
        !          1141: The output is
        !          1142: .I not
        !          1143: automatically collected anywhere,
        !          1144: but the new number register
        !          1145: .CW \en($$
        !          1146: (the process id of the
        !          1147: .UC TROFF
        !          1148: process)
        !          1149: can be used
        !          1150: to create unique file names
        !          1151: to be picked up with subsequent
        !          1152: .CW .so
        !          1153: commands.
        !          1154: The built-in string 
        !          1155: .CW \e*(.T
        !          1156: contains the name of the current typesetter
        !          1157: obtained from the
        !          1158: .CW -T
        !          1159: argument or its default.
        !          1160: .NH
        !          1161: Graphics Commands
        !          1162: .PP
        !          1163: The most significant new facility is the ability to draw
        !          1164: simple graphical objects  
        !          1165: \(em diagonal lines, circles, ellipses, arcs, and splines \(em
        !          1166: in
        !          1167: .UC TROFF .
        !          1168: .PP
        !          1169: The new graphical commands are
        !          1170: .P1
        !          1171: .ta 1i
        !          1172: \eD'l\f2 dh dv\fP'     draw line from current position by \f2dh, dv\fP
        !          1173: \eD'c\f2 d\fP' draw circle of diameter \f2d\fP with left side at current position
        !          1174: \eD'e\f2 d1 d2\fP'     draw ellipse of diameters \f2d1 d2\fP
        !          1175: \eD'a\f2 dh1 dv1 dh2 dv2\fP'
        !          1176:        draw arc from current position to \f2dh1+dh2 dv1+dv2\fP,
        !          1177:        with center at \f2dh1 dv1\fP from current position
        !          1178: \eD'~\f2 dh1 dv1 dh2 dv2 ...\fP'
        !          1179:        draw B-spline from current position by \f2dh1 dv1\fP
        !          1180:        then by \f2dh2 dv2\fP, then by \f2dh2, dv2\fP, then ...
        !          1181: .P2
        !          1182: For example, the input
        !          1183: .CW "\eD'e0.2i 0.1i'"
        !          1184: draws the ellipse
        !          1185: \D'e.2i .1i'\|,
        !          1186: and the input
        !          1187: .CW "\eD'l.2i -.1i'\eD'l.1i .1i'"
        !          1188: will draw the line
        !          1189: \D'l.2i -.1i'\D'l.1i .1i'\|.
        !          1190: The position after a graphical object has been drawn is
        !          1191: at its ``end'', where for circles and ellipses, the end
        !          1192: is at the right side.
        !          1193: As with other commands,
        !          1194: default units are ems horizontally and line spaces vertically.
        !          1195: .PP
        !          1196: Realistically, these commands are not intended for direct use,
        !          1197: but for preprocessors like
        !          1198: .UC PIC  
        !          1199: and
        !          1200: .UC IDEAL .
        !          1201: .PP
        !          1202: The output generated by these commands is shown in the
        !          1203: discussion of 
        !          1204: the
        !          1205: .UC TROFF
        !          1206: output language in an earlier section.
        !          1207: Rather than drawing the shape in 
        !          1208: .UC TROFF ,
        !          1209: a command with the proper parameters is passed through to the device
        !          1210: post-processor,
        !          1211: which does whatever it can with the request.
        !          1212: .NH
        !          1213: Loose Ends
        !          1214: .PP
        !          1215: This version of
        !          1216: .UC TROFF
        !          1217: has been in use
        !          1218: since September of 1979.
        !          1219: Most of our experience with it has been on the
        !          1220: 202 and Tektronix scopes, but the CAT and APS-5 drivers have been
        !          1221: exercised to some degree.
        !          1222: .PP
        !          1223: As mentioned, there are some obvious things that could
        !          1224: be improved or that remain to be added.
        !          1225: For instance,
        !          1226: .UC TROFF 's
        !          1227: bracket-building function
        !          1228: .CW \eb
        !          1229: really ought to be implemented by postprocessor,
        !          1230: so that typesetters like the 202 can draw a character like
        !          1231: \v'1'\H'48'{\H'10'\v'-1' directly instead of synthesizing it from pieces.
        !          1232: It also appears to be necessary to add ``modes''
        !          1233: to permit graphical objects to be dotted, dashed, etc.
        !          1234: .PP
        !          1235: Efficiency is always a problem,
        !          1236: and is likely to be so forever,
        !          1237: especially with the proliferation of preprocessors
        !          1238: generating ever more complicated input.
        !          1239: Small improvements (perhaps 10 percent)
        !          1240: can be had from artifices like better table searching.
        !          1241: Placing the temporary file upon which 
        !          1242: .UC TROFF
        !          1243: stores macro definitions in memory is good for another 10-20 percent
        !          1244: on machines like the
        !          1245: .UC VAX 
        !          1246: that have enough memory.
        !          1247: But no order-of-magnitude speedup is likely without a gross revision
        !          1248: of the basic design.
        !          1249: .PP
        !          1250: It is clear that
        !          1251: .UC TROFF
        !          1252: ought to be replaced by something better,
        !          1253: but, as I said above,
        !          1254: it is far from clear how to do the job
        !          1255: a lot better.
        !          1256: So for better or worse,
        !          1257: .UC TROFF
        !          1258: is likely to be with us for a long time.
        !          1259: .SH
        !          1260: Acknowledgements
        !          1261: .PP
        !          1262: I am deeply indebted to Ken Thompson and Joe Condon,
        !          1263: without whose efforts in taming the Mergenthaler Linotron 202
        !          1264: the
        !          1265: .UC TROFF
        !          1266: modifications discussed here would be irrelevant.
        !          1267: Thompson also provided most of the character-generating software.
        !          1268: I am also grateful to Chris Van Wyk for the line and circle drawing
        !          1269: algorithms and to Theo Pavlidis for the spline algorithm
        !          1270: used by all the postprocessors.
        !          1271: .[
        !          1272: $LIST$
        !          1273: .]
        !          1274: .sp 100
        !          1275: .SH
        !          1276: Appendix:  Summary of Language Changes
        !          1277: .PP
        !          1278: This appendix enumerates the changes to the
        !          1279: .UC TROFF
        !          1280: language since the last printing of
        !          1281: the 
        !          1282: manual.
        !          1283: .SH
        !          1284: Command line arguments
        !          1285: .PP
        !          1286: The argument
        !          1287: .CW -Txxx
        !          1288: loads parameters and character definitions for typesetter
        !          1289: .CW xxx ,
        !          1290: which at the moment is typically one of
        !          1291: .CW 202 ,
        !          1292: .CW aps
        !          1293: or
        !          1294: .CW cat .
        !          1295: .PP
        !          1296: .CW -Fxxx
        !          1297: causes font information to be loaded from
        !          1298: directory
        !          1299: .CW xxx
        !          1300: instead of the default
        !          1301: .CW /usr/lib/font/dev202 .
        !          1302: .SH
        !          1303: Graphics commands
        !          1304: .PP
        !          1305: As described in section 7.
        !          1306: .SH
        !          1307: Other new commands
        !          1308: .PP
        !          1309: .CW .sy
        !          1310: .I commandline
        !          1311: executes the command, then returns.
        !          1312: Output is not captured anyplace.
        !          1313: .PP
        !          1314: .CW .cf
        !          1315: .I file
        !          1316: copies
        !          1317: .I file
        !          1318: into the
        !          1319: .UC TROFF
        !          1320: output file at this point, uninterpreted.
        !          1321: Havoc ensues unless the motions in the file
        !          1322: restore current horizontal and vertical position.
        !          1323: This command hasn't been used much,
        !          1324: and is probably a bad idea anyway.
        !          1325: .PP
        !          1326: .CW .pi
        !          1327: .I program
        !          1328: (pipe the output into
        !          1329: .I program )
        !          1330: now works in  
        !          1331: .UC TROFF
        !          1332: as well as
        !          1333: .UC NROFF ,
        !          1334: since it makes somewhat more sense to allow it.
        !          1335: .PP
        !          1336: .CW \eH'n'
        !          1337: sets the character height to
        !          1338: .CW n
        !          1339: points.
        !          1340: A height of the form
        !          1341: .I \(+-n
        !          1342: is an increment on the current point size;
        !          1343: a height of zero restores the height to the point size.
        !          1344: .PP
        !          1345: .CW \eS'n'
        !          1346: sets the slant to
        !          1347: .CW n
        !          1348: degrees.
        !          1349: .I n
        !          1350: may be negative.
        !          1351: .PP
        !          1352: The number register
        !          1353: .CW $$
        !          1354: contains the process id of the 
        !          1355: .UC TROFF
        !          1356: process.
        !          1357: .PP
        !          1358: The string
        !          1359: .CW .T
        !          1360: contains the name of the current typesetter
        !          1361: (e.g.,
        !          1362: .CW 202 ,
        !          1363: .CW aps ,
        !          1364: .CW cat ).
        !          1365: .PP
        !          1366: The 
        !          1367: .CW .fp
        !          1368: command accepts a third argument that causes the
        !          1369: data for the font to be loaded from that directory.
        !          1370: This has been added as a first step to allowing dynamic character definitions.
        !          1371: .PP
        !          1372: The
        !          1373: .CW .ft
        !          1374: command causes the named font to be loaded on font position 0
        !          1375: (which is in all other ways inaccessible) if the font exists and is not currently mounted
        !          1376: by default or by
        !          1377: a
        !          1378: .CW .fp
        !          1379: command.
        !          1380: The font must be still or again in position 0 when the line is printed.
        !          1381: .PP
        !          1382: Transparent mode 
        !          1383: .CW \e! ) (
        !          1384: has been fixed so that transparent output actually appears
        !          1385: in the output;
        !          1386: thus special commands can be passed through to postprocessors
        !          1387: by witchcraft like
        !          1388: .P1
        !          1389: \&.if "\e*(.T"202" \e!x ...
        !          1390: .P2
        !          1391: (If this makes no sense to you,
        !          1392: you shouldn't be using it anyway.)
        !          1393: .SH
        !          1394: Deletions
        !          1395: .PP
        !          1396: The
        !          1397: .CW .fz
        !          1398: and
        !          1399: .CW .li
        !          1400: commands are no more.
        !          1401: The
        !          1402: .CW -p ,
        !          1403: .CW -g
        !          1404: and
        !          1405: .CW +n
        !          1406: command line arguments have also been eliminated,
        !          1407: as has the
        !          1408: .CW hp
        !          1409: number register.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.