There are no other files named nrunof.doc in the archive.
Notes for RUNOFF, version 1(103)
The new RUNOFF is a total rewrite of the macro-10 program with the same
name; it does not contain a single line of code from the old version.
It is source language compatible with other MACRO-10 versions.
o There are no operational changes since the last release, but if
you intend to use running page numbers you will need version
1(15) of TOC and this version of RUNOFF. Other combinations of
RUNOFF and TOC still work as before, except for the the running
page number support. (See below). Similarily, you need
version 1(17) of TCX to get running page numbers into the
o If you use overstriking in your indexing commands you can catch
it in the .BIX file that gets written when you say /INDEX.
2.0 NEW FEATURES
The following are features of the new RUNOFF.
This list of new features is in reverse
order. I.e., the features most recently
added are near the top of the list.
1. Overstriking now influences indexing, as follows:
Overstriking is handled just like other emphasis; overstriking
is defined to be more emphasis than underlining, but less than
upper case. NOTE THAT THE ACTUAL OVERSTRIKE SEQUENCE IS NOT
TAKEN INTO ACCOUNT. THIS MEANS THAT OVERSTRUCK ENTRIES HAVING
IDENTICAL SPELLING AND DIFFERING ONLY IN THE CHARACTERS USED IN
OVERSTRIKING WILL BE MERGED INTO A SINGLE ENTRY.
If you choose to generate your index via the TCX method,
overstriking will appear in the resultant index.
Currently, overstriking is not displayed in an index generated
by means of the .DO INDEX or .PRINT INDEX commands, althought
the sorting takes place as described previously.
2. New abbreviations. You can abbreviate the .END FOOTNOTE
command as .EFN. You can abbreviate .NUMBER RUNNING as .NMR.
You can now say .[NO]FLAGS ACCEPT instead of .[NO]FLAGS QUOTE;
ACCEPT is a better name for the flag than is QUOTE.
3. New page layout supported, .LAYOUT 3,n. The page arrangement
is the same as for .LAYOUT 0, except that now, centered at the
bottom of the page, a running page counter appears, enclosed in
a dash-space combination. The running page counter is just a
simple page counter that doesn't "know" about chapters, etc.
Also, there's no display characteristics supported other than
decimal. Note that when you run TOC you can specify which type
of page number you want. Note that when you run TCX you can
specify which type of page number you want. Currently, there
is no command that lets you get running page numbers into the
one-column index generated by .PRINT/DO INDEX commands.
4. New command .NUMBER RUNNING that's used to specify/modify the
running page counter. Parameters are just like for
.NUMBER PAGE. Side effects and restrictions are identical.
Currently, the only way of getting them to appear in the
document is to use .LAYOUT 3,n (see above). They are also
available via TOC and TCX. See the .DOC files for these
5. The flag pair ^< can be used to force all letters to upper
6. The /MESSAGES switch can be used to control where error
messages appear. See the description, below.
7. The /FORMSIZE switch can be used to tell RUNOFF about printer
forms longer/shorter than "normal". See the description,
Note that previously, RUNOFF would always output a formfeed in
response to a .PAGE command, even if you had already filled a
page; this would sometimes result in extra blank pages being
output. But it had the advantage of generating a file in which
every page was also an SOS type of page. Now, you won't get a
formfeed if you're already at the position specified on the
/FORMSIZE switch; so, to get back the "old" file organization
specify some large value for /FORMSIZE.
8. You can now control how dark bolded output appears. See
description of /BOLD switch, below.
9. New switch /DEBUG. See description below.
10. Tabs have been made easier to use. In the list of tabs
settings given on the .TAB STOPS command, each setting can now
be a signed number to indicate an adjustment to the current
setting. Existing files do not have to be changed. HOWEVER,
there is one incompatibility that is EXTREMELY unlike to show
up, as follows: before this change was made you could use a
"+" before a tab setting, except that no adjustment would
occur. For example, the following two commands USED to be
Also, there are no longer any validity checks made on the
resultant tab settings. This means that you can have negative
tabs, etc; but such tab settings simply don't ever get used
when tabs are expanded.
11. The commands .ENABLE TOC and .DISABLE TOC are now available to
control what is written into the .BTC file. (Abbreviation for
.ENABLE TOC is .ETC, abbreviation for .DISABLE TOC is .DTC.) If
you say /CONTENTS the default is .ENABLE TOC, which means that
all header levels and chapter/appendix titles will be written
into the .BTC file. If you say .DISABLE TOC, nothing will be
written to the .BTC file, even information given on a .SEND TOC
NOTE: If you don't say /CONTENTS you cannot get out of
.DISABLE TOC mode, even by specifying .ENABLE TOC.
12. You can now send information directly to the .BTC file. This
is done via the .SEND TOC command (abbreviation .STC). The
format of the .SEND TOC command is
.SEND TOC n,text
The parameter n, if present, must be a number. This number
serves as an identifier associated with the information that is
written to the .BTC file. ***NOTE*** The use made of "n"
depends on the version of TOC used to process the .BTC file;
if you use the version of TOC supplied with RUNOFF, either
specify 0 (zero) for n, or leave it out entirely. The text
parameter will be parsed by RUNOFF so that you can use RUNOFF's
flags to specify underlining, etc. The INDEX flag is not
recognized on a .SEND TOC command line.
For example, suppose you wanted the following runoff command
to appear in the .RNT file generated by TOC. Then you would
insert in your .RNO file the following .SEND TOC command:
.SEND TOC .CENTER;APPENDICES
Note that RUNOFF and TOC "normalize" underlining, bolding, and
overstriking flags so that if they are used in the text
argument of the .SEND TOC command they will be rearranged (and
translated to the "standard" flags if others are in use).
Note that there is no case translation done on letters, unless
you specify it's to be done via flags.
13. As of version 1(54) of RUNOFF, there is support for generating
a table of contents. See the description of the /CONTENTS
switch, below, for further information.
14. There are additional formatting possibilities available for
list elements. They are selected by means of the .DISPLAY
ELEMENTS command (abbreviation .DLE). The format of this
.DISPLAY ELEMENTS lch,DD,rch
All parameters are optional, in which case the option currently
used is not modified. The parameter DD is the same as for the
.DISPLAY LEVELS command (see below). It determines how the
list element will be displayed. The paramaters rch and lch are
of the form "x" or 'x' or "" or '' (including the quotes) and
specify single characters to be output to the right and left
(rch and lch) of the list element. For example, a command
can be used to generate list elements looking like (I), (II),
(III), etc. The usual setting for list elements is
.DLE "",A,".". The proper location for the .DLE command is
AFTER the opening .LS command, and before the first .LE command
for that list. If you have specified a "bulleted list" a .DLE
command overrides it.
15. You can now get header level numbers displayed the same ways as
the components of a page number. The command is
.DISPLAY LEVELS (abbreviation .DHL). The format is as follows:
.DISPLAY LEVELS DD1,DD2,....DD6
DD1 through DD6 are the same as the DD parameter of the
.DISPLAY CHAPTER, .DISPLAY APPENDIX, .etc commands (see below).
DDn determines how the nth header-level number is displayed.
If a DDn is not specified the current display characteristics
are left unchanged.
16. Besides $$TIME and $$DATE, the items $$YEAR, $$MONTH, $$DAY,
$$HOURS, $$MINUTES, and $$SECONDS are supported. The latter
three will be generated with a leading zero, if necessary, to
make sure that they are precisely two digits in length.
$$MONTH produces the month completely spelled out, with only
the first letter capitalized.
17. You can use either numbers or letters as arguments to .NUMBER
PAGE, .NUMBER SUBPAGE, .NUMBER CHAPTER, and .NUMBER APPENDIX.
Note that the type of argument does NOT determine how that item
is displayed later. That is determined by the appropriate
.DISPLAY command (see below).
18. You can now specify how the number, chapter, appendix, and
subpage constituents of a page number are to appear in your
document. This accomplished through commands given as
.DISPLAY XXXX DD
XXXX can be NUMBER, CHAPTER, APPENDIX, or SUBPAGE; it
indicates which part of the page number you are referring to.
DD is a display descriptor that specifies how the item is to
appear. Valid DDs are
LU Letters, all upper case
LL Letters, all lower case
LM Letters, first one capitalized
RU Roman numerals, upper case
RL Roman numerals, lower case
RM Roman numerals, mixed case
If you don't specify DD then the standard DD for the specified
XXXX is supplied as a default.
Abbreviations are as follows: .DAX for .DISPLAY APPENDIX, .DCH
for .DISPLAY CHAPTER, .DNM for .DISPLAY NUMBER, and .DSP for
The display characteristics will be carried over into any index
entries. And the indexing routines DO distinguish between page
numbers that are identical but have different display
The appropriate place to give one of these commands is at the
top of a page. In particular, be careful about giving one of
these commands in the middle of your document. For example, if
you are going to start a chapter/appendix, and you want to give
one of these commands, and you had some previous text
formatted, insert a .PAGE command before the .DISPLAY command,
even though the .CHAPTER/APPENDIX command will start a new page
19. Another page layout, set by specifying
The parameter n is as for .LAYOUT 1,n (see below) and has the
same meaning/restrictions. Otherwise, the layout is as
The title and subtitle appear at the top of the page, and
appear flush to the right/left depending on whether the page is
"odd" or "even". Odd pages have the title/subtitle flush to
the right. Even pages have the title/subtitle flush left. By
definition, the first page of a document is odd. Also, the
first page of a section started via .CHAPTER, .APPENDIX, or
.DO INDEX is odd.
20. You can now specify the date that is generated when requested.
This is done via the .SET DATE command (abbreviation SDT). The
format is as follows:
.SET DATE dd,mm,yy
.SET DATE (without parameters)
The parameters dd, mm, and yy specify the day, month, and year,
respectivally, or adjustments thereto. For example, the
.SET DATE 12,3,1943
causes RUNOFF to generate
12 MAR 43
If later you say
.SET DATE -5,,+10
then the next time RUNOFF generates the date it will appear as
07 MAR 53
If you don't specify any parameters then the current system
date is supplied.
NOTE: If you say .DATE to get the date generated, the date
supplied on each subtitle line will be that date specified via
the last .SET DATE command that appeared before the page was
started. However, if you construct a title/subtitle line using
$$DATE, the date is computed only once, namely when $$DATE is
21. You can now specify the time that is generated when requested.
This is done via the .SET TIME command. The format is as
.SET TIME hh,mm,ss
.SET TIME (without parameters)
The parameters hh, mm, and ss specify hours, minutes, and
seconds, respectivally, or adjustments thereto. For example,
the following command
.SET TIME 14,04,43
causes RUNOFF to generate
If later you say
.SET TIME +5,,-10
the next time RUNOFF generates the time the result will be
None of hh, mm, and ss can be less than zero. The maximum
value for hh is 23; that for mm and ss is 59.
If you just say .SET TIME with no parameters you get the
current system time. The short form for .SET TIME is .STM.
NOTE: If you say $$TIME in a title line, for example, the time
is only computed once, when the title line is set up; it is
not re-computed each time the title is output.
22. The .LAYOUT command is now supported. Two page layouts are
provided. The .LAYOUT command can be given as follows:
o .LAYOUT 0
This is the default. Pages are arranged as they currently
are. The '0' (zero) is not optional.
o .LAYOUT 1,n
This form is used to get titles/subtitles centered at the
top of the page and the page number centered at the bottom.
Note that 'n' is required and must be greater than zero.
The second parameter, 'n', reserves a footer area of 'n'
lines at the bottom of each page. The page number will be
centered at the bottom of the footer area. This means that
there will always be AT LEAST 'n-1' blank lines between the
last line of text and the centered page number.
The 'n' lines are taken from the page size as given on the
.PAGE SIZE command. All .TEST PAGE commands (explicit or
implicit) check to see that the specified number of lines
are available above the footer area. Footnotes are output
above the footer area.
The short form of .LAYOUT is .LO.
NOTE: You can't use .LAYOUT to modify the format of the top of
a page started by .CHAPTER, .APPENDIX, or .DO INDEX.
23. .AUTOSUBTITLE now takes an optional numeric parameter that
specifies the highest header level that is to be made a
subtitle. .NO AUTOSUBTITLE turns off .AUTOSUBTITLE, but the
next .AUTOSUBTITLE restores the previous status. Existing
files don't need to be changed. For example,
causes all header levels to be made into subtitles.
followed sometime later by
has the same effect as
The command sequence
resumes .AUTOSUBTITLE 5.
Note the following important interaction with "runon" header
levels: if you say
"whatever" will not be part of the subtitle because it comes
after the ';', which terminates the text part of the header
24. New command .STYLE HEADERS (abbreviation .STHL) that can be
used to control header level commands. The command takes up to
three numeric parameters, (n1, n2, n3). N1 specifies the first
header level which is to be a "run-on" header level. N2
specifies the largest header level for which all letters in the
header are to be translated to upper case. N3 specifies the
largest header level for which only the first letter of each
word in the header is to be capitalized.
If no .STYLE HEADERS command is ever specified, RUNOFF acts as
if .STYLE HEADERS 3,1,6 had been given. You can change just
one of the values by specifying only the one to be changed.
E.g., the command .STHL ,99 specifies n2 but leaves n1 and n3
The case rules are applied as follows:
1. If N2 and N3 don't specify any "valid" header levels (i.e.,
less than 1 or greater than 6) then the text on all
.HEADER LEVEL commands is left in the input case (unless,
of course, you put in some flags on the .HEADER LEVEL line)
2. The N2 parameter takes precedence over the N3 parameter, so
if you specify, for example both N2 and N3 the same, the N2
parameter determines the case rules. (The default case
rules are a good example of how this works.)
Finally, there is no adjustment implied by using signed numbers
(in contrast to many other RUNOFF commands).
25. New command .SET PARAGRAPH which has the same parameters as
.PARAGRAPH. The command does everything a .PARAGRAPH does
except start the paragraph.
26. New commands .ENABLE/.DISABLE HYPHENATION as synonyms for
.HYPHENATION/.NO HYPHENATION. The latter two commands have
been retained for compatibility with -11 versions of runoff.
27. You can now get the date and time generated into your output
file. To do it first say
The date/time gets substituted for occurrences of
$$DATE/$$TIME. To turn off recognition of the SUBSTITUTE flag
(i.e., restore the default state) say
.NO FLAG SUBSTITUTE
Finally, if you want to use some other character as the
SUBSTITUTE flag, say
.FLAG SUBSTITUTE ch
where "ch" is the character to be used instead of "$".
Generation of the date/time works wherever the standard flag
characters are valid, including titles, header levels, and
28. You can now give a negative value as the second operand to the
.paragraph command. It functions just like .SKIP with a
29. Support for a two-column index. See the description of the
30. The .DATE and .NO DATE commands, for having/not having the
current date generated on the subtitle line, now work.
NOTE: The date will appear only if .LAYOUT 0 is in effect (see
31. You can now get index hits echoed back, to help you debug the
index. See the description of the /DEBUG switch, below.
32. User controlled hyphenation is now available. Say
.FLAG HYPHENATE to activate it. Then insert a '=' between
those parts of a word that can be broken up. If the remainder
of the word will not fit on the current line, the new RUNOFF
will insert a '-' for you at that point; otherwise no '-' will
The HYPHENATE flag is manipulated like other flags. It's
disabled, initially. Default character is '='.
NOTE: The HYPHENATE flag causes other actions associated with
end of word processing to take place, such as terminating a
phrase flagged via the INDEX flag, or turning off the
CAPITALIZE flag at that point.
33. New flag called BREAK that can be used to force a word break,
but without the insertion of an inter-word space. The facility
is useful for indicating to the new RUNOFF where a word can be
broken if it does not fit on the current line.
The flag is initially disabled. Default character is '|'
(vertical bar). Say .FLAG BREAK and insert a '|' between the
parts of a word where it is ok to separate them. Note that
this is similar to hyphenation, except that no '-' is
Note: the BREAK flag causes other things to happen that are
associated with the end of a word. For example, it will
terminate a word being entered into the index via the INDEX
flag, and turn off the CAPITALIZE flag, if it's on.
34. You now have full control over telling the new RUNOFF what
constitutes the end of a sentence. This is achieved via the
PERIOD flag (initially disabled, default character '+'). The
PERIOD flag can be manipulated just like other flags.
You put the '+' AFTER the character that you want to indicate
is the end of a sentence, i.e., where two spaces are to be
The PERIOD flag is entirely independent of the .PERIOD and
.NO PERIOD commands. This means that you can say
.NO PERIOD.FLAG PERIOD and take over complete end-of-sentence
control yourself. Or you can use both .PERIOD and .FLAG PERIOD
to increase the number of cases where end-of-sentence spacing
is inserted. However, like the .PERIOD command, the double
inter-word spacing works only if .FILL is in effect.
35. The '!' that is used in the context '.!' to introduce a comment
is now a flag called COMMENT. You can use the various .FLAG
commands to manipulate it.
36. You can now control the number of blank lines between elements
of a list. The number of lines to be skipped between elements
of a list is specified as the first parameter on the opening
.LIST command. If no value is given, the paragraph skip in
effect at that time will be used.
(etc)***NOTE: no blank lines between entries!!
Note that this brings the new RUNOFF into line with various old
-11 versions of runoff.
37. You can now draw lines and generate repetitive patterns with
the new RUNOFF. The command is .REPEAT <count>,'XXXXXX'. For
Let the quoted string character positions, exclusive of the
quotes, be A.....Z. 'A' is processed like the first character
of a new record, except that there is an implied .NO SPACE
command before it. Also, 'A' cannot be a '.'; and
autoparagraph and autotable don't apply. 'Z' is like the last
character of a record. At the end of an iteration, after
processing 'Z', the appropriate end-of-record action is taken;
if you said .NO FILL, this means you get a new line.
Flags, spaces, and tabs in the character string have their
usual meanings. Therefore, you can generate a string of
underlined '*'s with the command .REPEAT 50,'&*'. Likewise
don't expect the command .REPEAT 50,'_' to work as you might be
tempted to expect; what you (probably) want is .REPEAT
.REPEAT can be abbreviated as '.RPT'.
38. 'Bullets' are now available as an alternative way of marking
list elements. To get a "bulleted" list specify a second
parameter on the .LIST command; it must be a single quoted
character (between 's or "s) which is to be the bullet. E.g.,
.LS,'*' causes following list elements (for that list depth,
and until the matching .END LIST command) to be marked with a
'*' instead of numbered.
39. You can get "run-on" HEADER LEVEL 3s without the '-' by not
putting any text on the line with the .hl command. For
".hl3;this text will be filled and justified."
(REMEMBER, ';' is like end-of-record for most commands.) But
note the interaction with table of contents generation; the
only information that gets written to the table of contents
(from a .HL command) is that text that appears BEFORE the
semi-colon or end-of-line marking the end of the command. So
if you use this capability, be aware that there will be no
corresponding entry in your table of contents.
40. The .REQUIRE command can be used to pull pieces of a document
together. (.REQUIRE "<file-spec>", e.g. .require
.REQUIRE can be abbreviated '.REQ'.
41. Bolding is available (.FLAG BOLD ch, where default ch is *,
flag initially disabled.). Bolding is used like underlining;
you can turn it on and off like underlining (^* and \*) as well
as specify it for a single character.
Characters that are bolded are printed darker than characters
that are not bolded.
42. Overstriking is available (.FLAG OVERSTRIKE ch, default ch is
%, flag initially disabled) e.g., =%/ produces a "not equal"
Overstriking is strictly on a "per-character" basis; it cannot
be turned on and off for an extended range, as can underlining
43. .AUTOSUBTITLE and .NOAUTOSUBTITLE commands allow/disallow
redefinition of subtitles by .HL1s.
44. Instead of having to live with the case rules set up for header
levels and indexing, you can now use ^^ to force text to be
taken "as is", or \\ to force it to lower case.
45. Error messages and warnings (but not the page count and summary
information) are written into the output file as well as
displayed on the tty:.
46. New indexing command .ENTRY (abbreviation "Y") with syntax like
.SUBINDEX. Result is same as .SUBINDEX, except that no page
number is attached. This means you can now put things like
in the index.
47. New commands .ENABLE UNDERLINING, .DISABLE UNDERLINING,
.ENABLE BOLDING, .DISABLE BOLDING, .ENABLE OVERSTRIKING,
.DISABLE OVERSTRIKING, .ENABLE INDEXING and .DISABLE INDEXING
for enabling/disabling effects of related flags/commands while
still allowing their recognition.
48. In a .VARIABLE command, the two characters (flags) following
the variable name are now optional. They default to space.
49. Nested .IFs work correctly.
50. If change bars get enabled in the middle of a document, the new
RUNOFF remembers that fact for subsequent lines, so that the
remainder of the document is shifted right uniformly.
51. The line count on a .FOOTNOTE command is now an optional
parameter. If present, it must match the number of lines
actually generated by the footnote; if present and the count
is wrong you get an error message. If absent, RUNOFF counts
52. It is possible to have footnotes and still say .NO PAGING. The
footnotes appear at the end of the document. (The old runoff
went into a loop).
53. Use of variants has been made much easier. Now, the only need
for the .VARIABLE command is to supply the /DRAFT flags (the
default /DRAFT flags are spaces). Variables mentioned on a
/VARIANT switch are TRUE. All others are FALSE.
54. It is possible to enter bolding AND underlining information
into the index. Within the index the order of entries is as
1. All special characters come before letters. Numbers are
considered special characters, as are spaces and control
2. All entries that start with the same "naked" character are
grouped together. This means for example, that all entries
starting with the letter 'a' are together, independent of
case, bolding and/or underlining.
3. Entries are ordered according to a lexical sort that is not
identical to simply sorting on the internal representation.
The more emphasis a character has the higher up in the set
of entries it appears. In terms of emphasis, upper case
for a letter gives it the most emphasis. Underlining
provides the next level of emphasis, and bolding supplies
the least emphasis. This means for example, that in the
index, all entries starting with 'E' appear before all
entries starting with 'e'; but they occur after all
entries starting with 'D' or 'd'. A bolded and underlined
'E' appears before just underlined 'E's. An underlined 'E'
appears before a bolded 'E'. A bolded 'E' appears before a
55. There are many more error messages in the new RUNOFF. Also,
error detection is improved. This means that some files that
previously went through old RUNOFF without errors may generate
56. When the new RUNOFF puts out a message, and the text contains a
control character, the character is shown in the message.
57. New RUNOFF is more consistant and forgiving as far as how lists
of parameters can be input. The basic rules are as follows:
o There need be no spaces or tabs before the first parameter
of a command, if the first character of that parameter is
not a letter. This rule is unchanged from old runoffs.
o Between parameters, no spaces or tabs or comma is needed if
it is clear from looking at the parameters, or from the
definition of the command, what the parameters are.
You can use this fact even to leave out parameters, where
it is clear what would normally be expected. E.g., the
command '.ls"o"' is ok because RUNOFF can see that there is
no number after '.le', and so it correctly takes "o" as the
o The separator can be either any number of spaces and/or
tabs, or a comma surrounded by any number of spaces and/or
In general, there should be no difference between output produced by old
and new RUNOFF. Many files have been put through both old and new
RUNOFF and compared to check for differences. Nevertheless, there is a
difference in processing that might lead to differences in results.
The following list describes those cases when old and new RUNOFF produce
different results. In many cases the differences are due to bugs in the
1. The new RUNOFF tends to accumulate information until it uses
it. Only then is that information checked for correctness.
This means that there is a bit more freedom regarding the
ordering of certain commands. The old runoff checked
information as it got it, not when it used it. After having
looked at many many RUNOFF files the experience is that the new
RUNOFF will usually make sense out of those things that the old
one did badly. However, there are some subtle differences.
2. A .PAGE command does not cancel pending indentation in the new
3. If you specified .SPACING 2 to the old runoff, it would
generally not put text on the last line of the page. The new
RUNOFF does write on the last line of the page.
4. The .SPACING command takes effect sooner than in the older
version. Basically, the old version always skips ".SPACING"
lines after a line of text before picking up the next line or
command. The new version skips ".SPACING" lines before
outputting a line of text, and then gets the next line or
The old version was wrong.
5. The new RUNOFF does not process/recognize .TYPESET/.SELECT
commands. These lead to error messages.
6. The syntax of the .VARIABLE command has been changed slightly.
The old one did not allow numbers in the variable name. The
new one does.
See also under "MISCELLANEOUS".
7. The new RUNOFF ignores fewer flags/characters than the old one.
This means that flags/characters that are left in input files
as artifacts of battles with old runoffs will now be looked at.
8. The new RUNOFF makes it more difficult to have the same
character representing more than one flag. In particular,
attempting to use the UNDERLINE, BOLD, OVERSTRIKING and QUOTE
flags to represent more than one flag will give an error
message. If you really want to have a single character
representing more than one flag say .NO FLAGS ALL before your
.FLAGS whatever ch command, and then .FLAGS ALL afterwards.
9. The new RUNOFF does not get mixed up when you say "<\\".
10. The old runoff does not turn off a '<' (capitalize flag) when
it encounters a '>' (subindex flag) while processing a
The new RUNOFF recognizes a subindex flag as terminating a
11. In the old runoff, if you said ^^ before a .header level
command, some header levels would not have all letters
translated to the "correct" case. The new RUNOFF uses the case
rules specified by the most recent .UPPER CASE or .LOWER CASE
The old runoff was wrong.
12. Because of the more uniform handling of lists of parameters you
can now say '.hl1,abc', which is the same as '.hl1abc'. This
means that if you have a header level having a text parameter
that starts with a comma, the comma will be looked at as just a
parameter separator and discarded. Quote the comma using the
QUOTE flag if you really need it.
13. In new RUNOFF, .HEADER LEVEL commands cancel pending
indentation and "autoed" paragraphs. This is a difference, and
does not represent a bug in either the old runoff or the new
14. The old runoff will adjust your paragraph indentation setting
whenever you issue a .LM command. This meant that you could
not temporarily have a left margin that was inconsistant with
the .PARAGRAPH command setting, even if you did not intend to
use a .PARAGRAPH command at that place, and reset your left
margin later; under certain circumstances that lead to
erroneous error messages. And in at least one instance the old
RUNOFF fails to detect an error situation that it is trying to
The new RUNOFF leaves your .PARAGRAPH settings alone.
15. Consider the following case: a line of text ends with a '.'
followed by a space; further, the number of characters on the
input record is exactly equal to the page width (the count
includes the space after the '.'); further, the text line is
followed by a command such as .SKIP or .BREAK. In other words,
the input line would fit exactly within the margins of the
The old runoff justifies the line; it shouldn't. The new
RUNOFF does not justify the line.
16. The old RUNOFF did not check tab settings thoroughly enough,
with the result that it was possible to force a word to extend
past the right margin. The new RUNOFF checks more thoroughly
and does not allow it.
17. When the old runoff discovers a tab that it cannot expand, but
there are some tab settings, it arbitrarily tabs right some
amount, apparently past the right margin. The new RUNOFF
handles the unexpandable tab as if it were a simple space.
18. After .TITLE or .SUBTITLE, the old runoff skipped precisely one
space, if it was present. The new RUNOFF skips all leading
spaces and tabs in front of the title.
19. Indentation, as specified by the .INDENT command, is not done
until some text is found that is to be indented. The old
version generates the required number of spaces as soon as
indentation is specified. This leads to a difference in how
tabs are expanded. In the old version, an .INDENT command in
front of a line starting with a tab results in "double"
indentation: once as specified by the .INDENT command, and
again, as specified by the tab setting.
The new RUNOFF's processing is simpler: the tab overrides the
indentation, so that the text is moved right only by the amount
specified by the tab setting. The .INDENT command is handled
just like a .BREAK in this case.
20. The old RUNOFF erroneously put the last digit of the page
number of an appendix out past the right margin. The new
RUNOFF does it correctly. But this means that if you FILCOM
results, all appendix title lines that have page numbers will
21. Text entered into the index via one of the indexing commands
is, by definition, associated with the last word of text that
occured before that command. In other words, indexing commands
belong immediately after the word of text to which they refer.
It is not clear exactly what the old runoff does. To date, no
indexing differences have been discovered that have anything to
do with the topic mentioned here.
22. If you used the index flag in a title/subtitle/chapter-heading,
the old RUNOFF didn't compute the width of the text correctly.
The result was lines centered even worse than usual, or a page
number pulled to the left a bit. The new RUNOFF does not have
23. If you say .DO INDEX in a document that does not contain
chapters old runoff uses ' to ' to join adjacent page
references in the index. New RUNOFF uses a '-'.
It is not clear if this is a bug or feature; I have decided it
is a bug in the old runoff.
24. If, for a particular entry in the index, the list of page
numbers is so long that they don't fit on a single line, then
occasionally there is a difference between how many entries are
put on a line.
This is probably no bug, but merely a minor difference; the
difference shows up exceedingly rarely.
25. The old RUNOFF allowed you to do things such as skip a page by
forcing a FORMFEED into the output. The new RUNOFF does not
support the idea of having control characters in the input to
force things to happen for which there is an equivalent
26. NULLs and DELs are ignored only in "normal" text. Control
characters (including NULL and DEL and FORMFEED) in the middle
of commands are significant characters.
27. The old RUNOFF tended to not center lines correctly. The new
RUNOFF does it right.
28. The old RUNOFF tended to forget to put page numbers on the tops
of pages in the index. The new RUNOFF does it correctly.
29. Footnotes are now expanded as soon as they are encountered
rather than being saved until they are needed. This means
that, except for case translation rules, they use the RUNOFF
environment in effect when the .FOOTNOTE command is
encountered, not some other arbitrary environment.
Case translation rules are determined by the most recent
.UPPER CASE or .LOWER CASE command. They are not "inherited"
from flags set in the main body of text.
30. The new RUNOFF saves footnotes in a file called '001RNO.TMP'
until the footnotes are needed. The file is NOT deleted when
RUNOFF terminates. However, RUNOFF will overwrite it on
31. The old RUNOFF sometimes generated extra spaces for subindexed
entries in the index; the result was improper indentation.
The new RUNOFF does it correctly.
32. When sorting the index, it makes a difference to the old RUNOFF
as to exactly how you got spaces between words; although two
entries had the same visual effect, they would sometimes not be
merged correctly. The new RUNOFF does not suffer from this
33. The page count output by the new RUNOFF after termination of a
document may be different than that given by the old RUNOFF.
Old runoff counted physical pages. If your document is not
page oriented (e.g., a .HLP file) the new RUNOFF still counts
spooled pages. Otherwise, it counts logical (i.e., RUNOFF)
34. When you said /DRAFT to the old runoff it assumed /SEQUENCE as
well. The new RUNOFF does not automatically assume /SEQUENCE.
35. /ORANGE has been renamed to /PAGES.
36. The /PAGES switch no longer accepts a line number. Now it just
accepts a starting page number. The page number is input
exactly as it would appear in the document. Output is
generated as soon as that page is started. To get an entire
appendix, just input the appendix letter; to output just the
index say /PAGES:"INDEX". E.g.
is identical in meaning to
This shortcut is not available for chapters.
37. When RUNOFF looks at the /PAGES information to see if it should
produce output, all parts of the current page number must match
all parts of the page number given on the /PAGES switch.
The old RUNOFF attempted to see if the current page was somehow
described by the /PAGES information, with the result that you
would sometimes get extra pages.
38. The new RUNOFF justifies text using the same algorithm as the
old version. However, one case has been found in which this is
not the case. Text immediately following an .END LITERAL
command is justified differently in the two RUNOFFs. Note that
this applies only if there are no .SKIP or .BREAK or equivalent
commands before the text after the .END LITERAL command.
Justification becomes identical again as soon as a .SKIP,
.BREAK, etc command is encountered. If you are trying to
FILCOM output generated by the two RUNOFFs and this becomes a
problem, just insert a .BREAK command after all your
.END LITERAL commands.
39. If you say .SUBPAGE at the top of the document, old runoff
generates subpage 1@. New RUNOFF generates 1A.
The old runoff was wrong.
40. If you specify one of the switches that results in additional
output being generated to the left of the document, there is no
guarantee that that information will be identical, if you
compare output generated by the various versions. In general
the information generated by the new RUNOFF is more carefully
gathered than the same information as output by the old runoff.
41. Old runoff allows you to use .NUMBER whatever to set the page
number whenever you want. New RUNOFF provides the same
commands, but does not allow the effects to take place in the
middle of a page. This means that, for example, if you say
.NUMBER PAGE 9999, your document won't show that page number
until you cross a page boundary. Further, to cross a page
boundary, you must do something other than just say .PAGE; in
addition, you must actually generate some text and force it
out. In practical terms this means you should set the page
number only when you are at the top of a page; i.e., before
you have input any text, or after some command that implies
42. If you issue a .DO INDEX command and you have already said
.NUMBER INDEX, the numbering starts over new.
The following restrictions and warnings apply to the new RUNOFF.
1. If you give no input-file type, the new RUNOFF only considers
.RNO as the intended file type. Specify the file type
explicitly for all other input files. Determination of the
output file type and formatting conventions are still
determined automatically as before.
If you really want to get RUNOFF to use a file with no
extension, input a single '.' after the file name.
E.g., "TTY:=A" will cause RUNOFF to look for A.RNO and
fail if not found; "TTY:=A." will get you the file "A"
with no extension.
2. The following commands/facilities are not available:
1. When using indexing commands (.INDEX, .SUBINDEX, .ENTRY)
overstriking information in the index entries is discarded
2. You cannot use the index flag to enter bolding or
overstriking information into the index.
5.0 COMMAND LINE SWITCHES
The new RUNOFF supports the following "RUNOFF-related" switches:
1. /BACKSPACE is used to indicate that RUNOFF can use the
backspace character to accomplish special effects.
If you use the OVERSTRIKE flag to overstrike a
character more than once only the final overstriking
character is used if you do not say /BACKSPACE. For
example, if you say
the result is the same as if you said just
2. /BOLD and /NOBOLD
If you say /BOLD:n bolded output will be overprinted "n" times
to achieve the desired degree of darkness. The default value
for "n" is 1. Zero is equivalent to /NOBOLD
3. /CHANGE and related
The /CONTENTS switch is used to help prepare a table of
contents. If you say /CONTENTS you get a special file with
file type .BTC (binary table of contents). The utility program
TOC is used to generate a RUNOFF input file with file type .RNT
that generates a table of contents. The format of the
/CONTENTS switch is
If you say /CONTENTS:xyz, for example, then the binary table of
contents is written to a file called XYZ.BTC. If you just say
/CONTENTS then the binary table of contents is written to
<input-file-spec>.BTC. So, for example, you can say
to generate just a binary table of contents called ABC.BTC, and
no document. The binary table of contents alone is generally
not useful; it must be processed by the program TOC. See the
file TOC.DOC for further information about this program.
Note however, that TOC creates a file with extension .RNT;
RUNOFF will accept such a file to create a file containing a
table of contents; the type of the file thus created is .MEC.
E.g., the command line
results in a file ABC.MEC containing a table of contents.
/DEBUG:ALL is the same as specifying
/DEBUG:INDEX means echo index hits in the .MEM file
The index hit appears BEFORE the line of text with which
it is associated; note that this is even though you are
supposed to put your indexing commands AFTER the reference
point in your file. An additional note: index hits which
are echoed at the bottom of the page, after the last line,
are associated with the first non-blank line after the
title and subtitle on the next page; i.e., they are
echoed on the previous page.
Finally, note that the manner of marking index entries is
as follows: Indexing information coming from .INDEX and
.SUBINDEX commands, as well as from the <INDEX flag>, is
preceeded by ".INDEX". Indexing information from .ENTRY
commands is preceeded by ".ENTRY"
/DEBUG:CONDITIONALS means ignore all .IF, .ENDIF, .IFNOT, and
.ELSE commands and output the draft flags (See description of
the .VARIABLE command) in the .MEM file.
/DEBUG:CONTENTS means echo all .SEND TOC commands in the .MEM
/DEBUG:FILES means echo all .REQUIRE commands in the .MEM file
See the NOTE for the /SIMULATE switch.
This switch has the same meaning as /DEBUG:ALL
This switch is used to indicate how many lines can be
accommodated on the form on which the document appears. If you
say /SIMULATE, "n" is interpreted as the number of physical
lines on a page of forms. If you don't say /SIMULATE (or do
say /NOSIMULATE) "n" is interpreted as the number of lines you
can fit on a page of forms (remember that whatever controls the
line printer reserves a few lines at the top and bottom of each
page of forms, and "n" specifies what's left over). If you
don't say anything, RUNOFF assumes 66 if you say /SIMULATE and
60 if you don't.
The /INDEX switch is used to help prepare a two-column index.
If you say /INDEX then, instead of getting the index with the
dots, you get a special file with file type .BIX (binary
index). The utility program TCX is used to generate a RUNOFF
input file with file type .RNX that generates a two-column
index. The format of the /INDEX switch is
If you say /INDEX:xyz, for example, then the binary index is
written to a file called XYZ.BIX. If you just say /INDEX then
the binary index is written to <input-file-spec>.BIX. So, for
example, you can say
to generate just a binary index called ABC.BIX, and no
document. The binary index alone is generally not useful; it
must be processed by the program TCX. See the file TCX.DOC for
further information about this program.
Note however, that TCX creates a file with extension .RNX;
RUNOFF will accept such a file to create a file containing a
two-column index; the name of the file thus created is .MEX.
E.g., the command line
results in a file ABC.MEX containing a two-column index.
Say either /MESSAGES:USER or /MESSAGES:OUTPUT to control where
output messages appear. The default is /MESSAGES:OUTPUT.
/MESSAGES:USER means that only the RUNOFF user sees the error
messages, i.e., on the terminal; they are not written into the
output file too. /MESSAGES:OUTPUT means that messages are
written only to the output file. The default is
*****NOTE***** This switch can only recognize page numbers that
are input using the default display characteristics for their
various parts (see the description of the .DISPLAY commands,
above). This means, for example, that even if your .RNO file
contains a .DISPLAY CHAPTER RU command so that chapter numbers
appear in uppercase Roman numerals, you are still required (on
this switch) to used chapter numbers given as decimal numbers.
The test for the requested page(s) is made without regard to
the display characteristics.
Extra lines generated as the result of specifying
/DEBUG with certain options disturb the line counting
done by /SIMULATE.
16. /UNDERLINE and related
Note the following difference: in old runoff you said
/UNDERLINE:CHARACTER if the character used to do the
underlining was non-spacing. In new RUNOFF you say
The new RUNOFF supports the following "general-purpose" switches:
The help file you get is the one for the old runoff,
not one for the new RUNOFF.
The new RUNOFF will take information from your SWITCH.INI FILE.
No input-file wild-carding is available. Nor do other file-selection
switches work. However, you can say
Note that even though the new RUNOFF has fewer command-line switches
than old runoff, most of the capabilities can still be invoked via the
use of the .REQUIRE command and specifying TTY: as the input. Enter
your command line as usual, but specify just TTY: as the input, instead
of the file name. Then, type commands directly to RUNOFF, in RUNOFF
style. After you have typed your commands then say .REQUIRE
"<file-spec>" to complete the processing. Finally use ^Z to indicate
6.0 KNOWN BUGS AND DEFICIENCIES
o 002 If you say RUN RUNOFF, and you then supply it with no file
to process, you need two ^Zs to get back to monitor level
rather than one.
o 001 The following sequence generates an internal logic error:
Note that any additional character other than (tab) between the
^& and \& causes the internal logic error to go away.
The following undocumented short forms of commands are no longer
supported. Note that these commands have been found in only a very few
The following undocumented command syntax is no longer supported:
1. The old version of RUNOFF did not allow numbers to be in
variable names specified on a .VARIABLE command. Therefore, in
old runoff, a .VARIABLE command such as
was equivalent to
.VARIABLE ABC 1,2
as far as old runoff was concerned. In the new RUNOFF, numbers
are allowed as characters in the name, so that the example is
taken, by the new RUNOFF, as defining a variable with the name
ABC12 having no /DRAFT flags.
The following undocumented command behavior is no longer supported:
1. In the old RUNOFF, you could end a .LIST or .NOTE with just
".END". Also, ".END LIST" could end a .NOTE, and conversely.
The new RUNOFF requires you to say explicitly which construct
you are ending.
2. In the old version, .BREAK and related commands did not cancel
a .INDENT command.
3. The first parameter of a .LIST command used to be processed as
if the user said .SPACING n after the .LIST command. While
processing an extensive number of files, none were found that
used that facility; therefore, the first parameter has been
given a new meaning, described above, under NEW FEATURES.
If you really need to have a list with different spacing than
that specified on the last .SPACING command, you can just
insert an appropriate .SPACING command after the .LIST command;
you don't need to reset the spacing after the end of the list,
since that gets done automatically for you.
Note that this change duplicates the behavior shown by various
old -11 versions of runoff.
4. In old -10 runoff, the only difference between the .INDEX and
.SUBINDEX commands is that the SUBINDEX flag is disabled in the
scan of the .INDEX command's text argument. Also, termination
of the scan of the text items was different in both cases (but
only slightly so).
In the new RUNOFF, .INDEX and .SUBINDEX have no differences.
The two command names and their abbreviations are retained for
source language compatibility. In other words, you can do
everything with the .INDEX command and don't need to use
.SUBINDEX at all.
There have been no problems found that can be traced back to
the simplification just described.
The only place where this may be a problem is when you have a
'.INDEX ;' command; old runoff would put the ';' into the
index. In the new version, you have to force the ';' via the
5. Old runoff merges page numbers in the index regardless of
whether or not it makes sense. New RUNOFF uses a bit more
discretion, as follows: If your document contains pages having
duplicate page numbers for one reason or another, and these
pages give rise to duplicate index entries, new RUNOFF will
keep them apart. Old runoff does not keep them apart.
NOTE: This difference is not to be construed as a feature; in
particular, it is an accident of the implementation and
probably doesn't always hold.
For example, suppose you had a file generating, say, a page 5
at the start of the document and another page 5 much later in
the document; further, suppose both pages had index references
to "xyz". Old runoff will either merge the two references, or
get confused. New RUNOFF will generate
xyz. . . . .5, 5
to indicate that there are two pages numbered 5.
6. The old version of runoff used the following "method" of
generating blank lines at the top of a page in response to a
.CHAPTER or .APPENDIX command. Normally, 12 lines were
skipped, unless the user specified a page size greater than
1000; in that case, old runoff divided the page length by 64
and multiplied the result by 12 to get the number of lines to
skip. If you had specified a page size of say 99999, say, this
leads to several pages full of blank lines being generated.
New RUNOFF always skips the same number of lines, regardless of
the length of the page.
8.0 COMPARING OUTPUT GENERATED BY DIFFERENT RUNOFFS
The following method should be used for comparing output produced by the
various versions of RUNOFF. If you do not use this method, FILCOM may
report lots of differences, even if the files have identical visual
content. Note also that the use of SOS destroys the usefulness of the
RUNOFF output, if that file contains bolding, underlining, and/or
1. Assume that you have a file called XXXX.RNO, and you want to be
sure it is handled properly by the new RUNOFF.
@RUNOFF (old runoff)
3. @RU RUNOFF (new RUNOFF)
5. @SOS XXXX.OLD
The report generated by FILCOM will show up the significant
differences. Note that some spurious differences may be
In many cases the differences will be due to bugs in either the
old runoff, or in the .RNO file. Experience has shown that the
/T switch of PIP does not work well; sometimes you can
drastically reduce the number of spurious differences reported
by FILCOM by making multiple passes through PIP, using the /T
switch. At other times it seems that the PIP processing is
more effective when done after the SOS processing. Sometimes a
combination of both is necessary.
If you do find a bug, and intend to submit an SPR please do the
following to make our work easier.
1. Be sure that the behavior you are reporting is not something
that the old runoff does too. Unless you have used some of the
new features, you can use the FILCOM procedure outlined above
to see if the old runoff does the same thing.
2. Specify the version number of the new RUNOFF that you used.
3. Try to construct a short test case that duplicates the bug; if
that is not possible send listings of the input and output, as
Feedback is welcomed.