budd@arizona.UUCP (06/29/83)
Having waited in vain several years for somebody else to do this task, I've started to think maybe I should do it myself. The task is a total rewrite of n/troff. Tentatively, I've titled the project broff (as in "there are too many cooks in this broff already"). There are two major reasons for undertaking a project this onerous (other than escaping from all the even more onerous tasks i should be doing). The first is that troff is a notoriously obscure program which is extremely difficult to understand or to make local modifications to. A rewrite would, hopefully, be clean, structured, and easy to understand. The second reasons is that there are several "bugs", "features" or whatever in troff that have bothered me for years, and some of this I would hope to clean up. Like the recent ditroff system, broff would be mostly device independent, producing some sort of intermediate output which would then be processed by a postprocessor. The goal is to produce a system which is compatible with existing troff at the macroscopic level, but not necessarily identical at the command level. That is, it should be possible to write macros identical with ms or me or whatever so that most documents can be formatted without change on either system. However, some of the commands which I felt were given wrong or clumsy semantics in troff I've altered slightly. The project is still only at the conceptual stage. The purpose of this note is to solicit other comments on what troff does badly and how a newer system might improve things without making too radical a change. What follows are my ideas on various topics. Fonts There should be essentially an infinite (at least 20 or 30) number of fonts. The commands bd, cs, ul, and uf are eliminated, since these can be produced by an appropriate sequence in font tables. (The command cu is retained, since in filled and justified mode it is difficult to produce the desired effect just with fonts). Font tables are a little more general than they are now. Each entry in the font table specifies the character (as a number), the width of the character, the TYPE of the character, and the character information. (Several years ago I looked at some of the SCRIBE internal tables, and I believe this is somewhat similar to what is done there, although my memory is dim on the particulars). There are three TYPES of characters. The first type is just a single character for character translation - If you want an 'a', print an 'a'. The second type is a string - if you want an 'a', print the following sequence (the characters are transmitted directly to the output, and are not processed by broff). The third type is also a string, but is reprocessed by broff - if you want an 'a' print \fWx\fPwyz. Example - 1 - 141 1 1 a 142 7 2 abcdefg 143 3 3 \fIabc\fP This generality would permit users to make "virtual fonts", for example fonts where the actual characters are from various other fonts, etc. Environments Here is a major change from troff. In broff, environments can be named and there can be any number of them. Furthermore, environments are named (two character name) rather than numbered. Finally, attributes that are not defined in an environment are inherited from the outside, rather than having all attributes defined in all environments. There are two new commands for defining environments. The dv command starts the definition of a new environment. It is typically followed by a list of environment setting commands: Example: .dv XE .ls 3 .po 2i .ps 14p .vs 16p .. The av command appends to an environment. The ev command then pushes the current environment, resets those attributes associated with the named environment, inheriting all other attributes from the previous environment. Setting environmental parameters inside an ev does not effect the definition of the environment. Initializations The troff manual lists initial values for almost all environmental parameters. Almost all of these have been eliminated (the one exception is the command character, which is initialized to '.'. It would be kinda hard to bootstrap without that). Instead, there is a file of broff commands associated with every device. Prior to reading macros or source files, this file is read to initialize such values as point size, font positions, page length, page offset, line length, indent, escape character, and nonbreak control character. It might also set various conditions (see below). Conditions Currently, there are four named conditions in troff (even and odd pages, nroff and troff). For many systems, this is just too coarse. For example, we run two different versions of nroff (lpr and spinwriter) and two different versions of troff (versatec and - 2 - typesetter). It would be nice to have an easy way for macros to determine on what kind of device they are being used. I therefore propose that the e and o conditions be kept, but that all other letters be free to be set by the user (or in a device initialization file, above). To do this, there would be a new command ".dc c value". values would be unsigned integers (no units). It is not clear to me that the distinction between nroff and troff need be kept. It seems to me that there is more of a continuum of devices between a line printer and a typesetter. Perhaps nroff is just troff on a device with few capabilities. Any thoughts on this? Point sizes, spacing ,etc. Point sizes, vertical spacing, line spacing, etc would be continuous up the the resolution of whatever your basic unit is. It would be up to the postprocessor to make whatever restrictions might be necessary for a particular device (rounding the point size down to one of a few set values, or whatever). Misc The .pi command is eliminated. Has anybody ever found a use for this? A blank line now invokes the paragraphing macro. The paragraphing macro is specified by the command ".pg XX", and is associated with the current environment. pg with no arguments means blank lines stay blank lines. The command c2 has been changed to cn. Please Mail me whatever comments you might have. Tim Budd - {mcnc teklabs cornell purdue kpno} | arizona | budd - 3 -