rem              *********************************
rem              *     Runoff User's Manual      *
rem              *        April 30, 1982         *
rem              *       Raymond E. Penley       *
rem              *********************************
rem
rem --------------------------- SETUP ----------------------------------
he RUNOFF User's Guide
lm 1
rm 78
nhd
nf

sp 22
c 4
RUNOFF User's Guide
CP/M VERSION 1.0
RAYMOND E. PENLEY
APRIL 30, 1982
np
rem --------------------------------------------------------------------
j
p 5
This is a public domain program. You are encouraged to modify this program
to make it better, add new features (but try not to make the executable
code much over 20K), make changes, etc.  Please send your enhancements to
the Pascal/Z Users Group.  Thank you.
sp 12
CP/M (r) is a trademark of Digital Research.
hd
bp 1
np
rem --------------------------------------------------------------------
hl 1 INTRODUCTION:
j
p
This is a version of RUNOFF a text formatting program.
It is patterened somewhat after the RUNOFF for the DEC PDP-11.
The commands available are a subset of those available in the
original PDP-11 version.
The command formats and actions are the same as the PDP-11 version.
The underlying source code program for this version is written
in Pascal.
p
New commands include; .MES, prints message to the console; .WAIT,  a pause
that waits for operator intervention; .SF and .CF, single sheet and continuous
forms control; .REM, for remarks imbedded in the text; and .OUT <n>, to allow
additional control over the printed output.
rem
rem
hl 2 HOW TO USE THIS GUIDE:
p
There are a few notational conventions that are used throughout this
manual.
sp
nf
    <>  Symbol brackets. This space should be replaced by the
        item described.
    []  Optional brackets.  Symbols enclosed between brackets
        are optional.
   ...  Repetional ellipsis.  The preceding symbol may be
        repeated.
j
rem --------------------------------------------------------------------
hl 2 SOURCE FILE FORMAT:
p
Using your favorite text editor you create a file containing the text of the
document. Under the CP/M operating system the normal file consists of a
collection of characters stored under a file name on a diskette.  The file
or document is a standard ASCII text file with the RUNOFF commands
imbedded in the file. All lines starting with a period are taken to be
commands; only one command per line is permitted. All other lines are
considered as text to be formatted. There are no case control characters as in
other versions of RUNOFF. Letters are output in whatever case they appear in
the source file.
rem --------------------------------------------------------------------
hl 2 CAPABILITIES:
p
Text is normally justified. Justified text has additional spaces inserted
between the words to make the right end of each line in a paragraph come out
exactly at the right margin; Ragged Right text does not have these spaces.
Justification is on by default, but may be turned off to produce ragged right
text. Some users prefer ragged right, e.g. for correspondence which they wish
to appear hand-typed.
p
Functions are available that can turn on/off line filling and justification.
p
Text is automatically split up into consecutively numbered pages. Each
page has a five line header margin. The title and page number appear on the
second line of the header margin. Printing of either the title or page
number or both is optional.
p
Section headers of up to five numbers, i.e. i.j.k.l.m, plus section title
may be specified. Section numbers will be incremented automatically
whenever the section header command is encountered.
p
Numbered lists are available and may be nested to five levels. List
elements are indented from normal text and are filled and justified if
fill is enabled.
rem --------------------------------------------------------------------
hl 2 INVOKING RUNOFF UNDER THE CP/M OPERATING SYSTEM:
p
RUNOFF requires an input file and directs its output to one of the
following devices: list (LST:); console (CON:); disk (d:filename).
nf
ls 2
p
The command to execute RUNOFF takes one of the following forms:
TI 7
RUNOFF [d:]sourcefile [d:]outputfile
Directs the formatted output to the disk file "outputfile" name.
TI 7
RUNOFF [d:]sourcefile    or    RUNOFF [d:]sourcefile LST:
Directs the formatted output to the List device.
TI 7
RUNOFF [d:]sourcefile CON:
Directs the formatted output to the console device for previewing.
ls 1
j
p
The source file and the output file may be on the same or different disk
drives.  Simply by prefixing the file name with the drive identifier causes
the program to read/write the file from the specified drive.
sp
TI 7
RUNOFF sourcefile b:outputfile
sp
p
Will process the file "sourcefile" from the currently logged in disk drive
and send the output file to a file "outputfile" on drive B:.
rem --------------------------------------------------------------------
hl 1 TEXT FORMATTING COMMANDS:
p
The following commands will be recognized if they are at the beginning of a
line started with a period. Any line in the source file beginning with a period
is assumed to be one of these commands. If it is not, an error diagnostic will
be displayed on the console and the line will be ignored. Some commands take
one or more decimal
numbers following. These must be separated from the command by at least one
space. RUNOFF commands take on one of the following forms:
nf
sp
ti 20
.AA
ti 20
.AA n
ti 20
.AA text
ti 0
sp
where AA is a keyword and n is a value {which may be optional} depending on
the command. The keyword may be in upper or lower case. A space is required
before numeric or textual values.
rem
hl 2 INITIAL VALUES:
j
p
Initial numeric values are assigned to various RUNOFF commands as follows:
nf
sp
       .lm  =  0      left margin
       .rm  = 60      right margin
       .ls  =  1      line spacing
       .p   =  5      paragraph
       .cnp =  0      conditional new page
       .pl  = 60      page length
rem
np
rem --------------------------------------------------------------------
hl 1 RUNOFF COMMANDS:
p
The commands as listed here in alphabetical order.
sp 5
      .BP n         Begin Page
      .BR           Break
      .C n          Center
      .CF           Continuous Forms
      .CNP n        Conditional New Page
      .ELS          End Current List
      .FI           Filling On
      .HD           Header title on
      .HE text      Header text
      .HL n text    Heading Level and section header text
      .J            Justify On
      .LE           List element
      .LJ           Left Justify
      .LM n         Left Margin
      .LS n         Line Spacing
      .MES text     Text message to console
      .NBP          No Page Numbering
      .NF           No Fill
      .NJ           No Justify
      .NL n         Numbered list
      .NP           New Page
      .NPR          No Period
      .OUT n        output control values
      .P n m w      Paragraph Break
      .PL n w       Page Length
      .PR           Period flag
      .REM text     Remark
      .RM n         Right Margin
      .SF           Single Forms
      .SK n         Skip n * Line Spacing lines
      .SP n         Space n Lines
      .TI n         Temporary Indent n
      .WAIT         Pause
np
hl 2 MARGINS:
nf
sp
ti 10
LEFT MARGIN                    .LM <column>
j
p
The LM command sets the margin to <column>  and causes a break.
<column> must be less than the right margin but not less than 0.
The default setting is 0. If indenting, the amount
of any indent plus the left margin must not be less than 0.
nf
sp
ti 10
RIGHT MARGIN                   .RM <COLUMN>
j
p
The RM command sets the right margin to <column> and causes a break.
<column> must be greter than the left margin. The default setting is 60.
p
The number of characters on a line will be equal to or less than the right
margin minus the left margin minus any indenting which may be specified. Even
if filling has been disabled, lines will not be extended past the right margin.
rem
hl 2 FILLING:
nf
sp
ti 10
FILL                           .FI
j
p
The FI command causes a break and specifies filling of following output
lines. Justification is specified by the last setting of the .J or .NJ
commands (DEFAULT=NO).
nf
sp
ti 10
NO FILL                        .NF
j
p
The NF command causes a break and prevents filling of all following output
lines. Also, justification is disabled.
rem --------------------------------------------------------------------
hl 2 JUSTIFYING:
nf
sp
ti 10
JUSTIFY                        .J
j
p
The J command causes a break and forces justifiction of subsequent output
lines (DEFAULT=ON).
nf
sp
ti 10
LEFT JUSTIFY                   .LJ
j
p
The LJ command causes a break and produces what is commonly called
"ragged right" text.  Lines will be filled with words but justification is
turned off. If a word will not fit on the current line it will be placed in
the next line.
nf
sp
ti 10
NO JUSTIFY                     .NJ
j
p
The NJ causes a break and terminates justification of following lines of text.
rem
hl 2 CENTERING:
nf
sp
ti 10
CENTER                         .C <count>
j
p
The C command causes a break after which it centers the next <count>
lines in the source file. Center will always center at least one line. The
centering is between the left and right margins.
rem --------------------------------------------------------------------
hl 2 PARAGRAPHS:
nf
sp
ti 10
PARAGRAPH                      .P [<indent> <skip> <cnp>]
rem
hl 3 COMMAND FORM
sp
       (a)      .p <indent>
       (b)      .p <indent> <skip>
       (c)      .p <indent> <skip> <cnp>
j
p
The P command causes a break, inserts (SP+1)/2 blank lines and indents
the next line of text <indent> positions. The initial value for "indent"
is 5 spaces. If command form (a) is used then indenting will take on
the new value of <indent>. If command form (b) is used then the vertical
spacing between paragraphs is set to <skip>.  If command form (c) is used
then <cnp> sets an argument for a 'Conditional New Page' command just
before the paragraph is begun.
nf
sp
ti 10
TEMPORARY INDENT               .TI +-<count>
j
p
The TI command causes a break and sets the next line to begin <count>
spaces to the right of the left margin. <count> may be negative to cause the
line to begin to the left of the left margin, it effectively created an
"outdent" command. TI works with the LM command, for example:
nf
sp
 .j
 .lm 12
 .ti -10
 TEMPORARY INDENT
 The TI command causes a break and sets the next line to begin
 <count> spaces to the right of the left margin. <count> may
 be negative to cause the line to begin to the left of the left
 margin, it effectively created an "outdent" command.
 .sp
sp
would produce the following output:
j
sp
lm 12
ti -10
TEMPORARY INDENT:
The TI command causes a break and sets the next line to begin <count>
spaces to the right of the left margin. <count> may be negative to cause the
line to begin to the left of the left margin, it effectively created an
"outdent" command.
sp
lm 1
ti 0
rem --------------------------------------------------------------------
hl 2 TABS:
j
p
Unfortunately at the present time RUNOFF does not recognize the tab
character and there is no way to set/reset tab stops.  Do not use the
tab character in a RUNOFF file.
rem
hl 2 LINE SPACING:
nf
sp
ti 10
SKIP                           .SK <lines>
j
p
The SK command causes a break after which [ N * (line spacing) ] lines are
left blank. If the skip would leave room for less than two printed lines on
the page (i.e. if there are less than [ N + 2 * (line spacing) ] lines left),
the output is advanced to the top of the next page. If the output is
currently at the top of a new page no lines are skipped.
nf
sp
ti 10
SPACE                          .SP <lines>
j
p
The SP command inserts <lines> inton the output file. SPACE is to be used
where space is to be left independent of the line spacing;
SKIP is to be used where the space should be relative to the line spacing. If
the output is currently at the top of a new page no lines are skipped.
nf
sp
ti 10
BREAK                          .BR
j
p
The BR command causes a break, i.e. the current line will be output with
no justification, and the next word of the source text will be placed at the
beginning of the next line according to the current line spacing.
rem --------------------------------------------------------------------
hl 1 PAGINATION COMMANDS:
rem
hl 2 HEADINGS AND FOOTINGS:
nf
sp
ti 10
HEADER                         .HE <text>
j
p
The HE command takes the remaining text on the line as the title.  This
text will appear at the top of all subsequent pages, aligned with the left
margin on the second line of the page.  The title is initially blank.
p
The Header Margin is 3 by default and the Top Margin is 5 by default.  These
values are presently locked into the program, however, since the source
code is available it shouldn't be much trouble to make these margin settings
user selectable.
nf
sp
ti 10
HEAD Command                   .HD
j
p
The HD command enables the printing of title and page number at the top of
each new page.
nf
sp
ti 10
No Head Command                .NHD
j
p
The NHD command turns off the printing of title and page number at
the top of each new page.
rem --------------------------------------------------------------------
hl 2 PAGE NUMBERING:
nf
sp
ti 10
BEGIN PAGE                     .BP <number>
j
p
The BP command turns on page numbering at page <number>.
nf
sp
ti 10
NO PAGE NUMBERING              .NBP
j
p
The NBP or omit page numbering command turns off page numbering.
Pages will continue to be counted so that the normal page number will
reappear if page numbering is resumed.
rem --------------------------------------------------------------------
hl 2 PAGINATION:
nf
sp
ti 10
NEW PAGE                       .NP
j
p
The NP command causes a break and an advance to a new page. It does
nothing if the current page is empty.
nf
sp
ti 10
CONDITIONAL NEW PAGE           .CNP <lines>
j
p
The CNP PAGE command causes a break followed by a conditional
page advance. If there are <lines> or more lines remaining on the current page
then no advance is made, otherwise, the page is advanced as in the NP
command. This command should be used to ensure that the following <lines>
are all output on the same page.
nf
sp
ti 10
LINE SPACING                   .LS <linespacing>
j
p
The LS command causes a break after which the line spacing will be
set to <linespacing>.  <linespacing> must be within the range 1 to 5. Single
spacing is 1, double spacing is 2.  Default is single spacing.
nf
sp
ti 10
PAGE LENGTH                    .PL <length> [<width>]
rem
hl 3 COMMAND FORM
sp
         (a) .pl <length>
         (b) .pl <length> <width>
j
p
The PL command specifies the width of the page in columns and the
length of the page in lines.  If values other than the default values are
used, then this command should appear before any of the margin or heading
commands.  Whenever RUNOFF begins printing a new page, the line count is
initialized to a value of one.  As each line is printed the line count is
incremented.  When the page length is reached, a sheet of paper is ejected
from the printer and a new page is begun.  <length> is the number of lines on
an entire page, including the top margin of 5 lines. The paper length must
match the forms in use. The default is 60 lines or 11 inches. The <width> sets
the paper width in columns; it acts like the RIGHT MARGIN command.
rem
hl 2 PRINTER CONTROL:
nf
sp

       .OUT <value1> [<value2> ... <value8>]
j
p
The OUT command allows direct access to printer controls.  <value> is the
decimal value of the control code.  i.e. if the command to set your
printer to 12 cpi is say escape + "A" then you would enter the command
line as:
nf
sp
       .OUT 27 65
sp
j
p
Notice that the values are separated by spaces.  The maximum number of
arguments that may be output is eight.
nf
sp
       .WAIT
j
p
The WAIT command puts the program in a pause mode awaiting for any input
from the operator at the console.
rem
hl 2 REMARKS AND MESSAGE DISPLAY:
nf
sp
       .REM [text]
j
p
The REMARKS command may be used to separate paragraphs, put comments in
the text for later use.
nf
sp
       .MES <text>
j
p
The MES or MESSAGE command sends the text string to the console for viewing.
This command can be particularly useful in combination with the WAIT command.
rem
hl 2 MISCELLANEOUS:
nf
sp
ti 10
PERIOD                         .PR
j
p
The PERIOD command causes two spaces to be inserted after punctuation
marks for proper spacing between sentences. The punctuation marks
are: '.', '?', and '!'.
nf
sp
ti 10
SINGLE SHEET                   .SF
j
p
The SINGLE SHEET command causes the program to pause after each page allowing
the operator time to change the paper in the printer.
nf
sp
ti 10
CONTINUOUS FORMS               .CF
j
p
The CONTINUOUS FORMS command sets the program up to use continuous paper.
This is the default value.
nf
sp
ti 10
HEADING LEVEL                  .HL <level> <text>
j
p
The HEADING LEVEL command starts a section at the level specified by <level>
and takes the text string as the header.  <level> must be specified as 1, 2,
3, 4, or 5.  The sections are incremented by one automatically and the number
is output in the form of i.j.k.l.m.  This command acts as a:
nf
       .BREAK .TEST PAGE 9 .BLANK 3
followed by the section number, two spaces and the section name.
rem
hl 2 LIST ELEMENTS:
nf
sp
ti 10
NUMBERED LIST                  .NL <lines>
j
p
The NUMBERED LIST command causes a break and starts a numbered list.
<lines> is the number of blank lines left between list elements.  The first
list is indented 9 spaces from the left margin; subsequent nested lists are
indented 4 more spaces.  There may be up to 5 levels of nested numbered lists.
nf
sp
ti 10
LIST ELEMENT                   .LE
j
p
The LIST ELEMENT command causes a break and starts a new list element.
Elements are numbered sequentially and the numbers have a negative indent
from the body of the list element.
nf
sp
ti 10
END LIST                       .ELS
j
p
The END LIST command causes a break and terminates the current list by
re-adjusting the left margin.
rem
hl 1 EXAMPLES:
sp
Following are examples of the effects of different commands.  After the
examples is the section of RUNOFF source input that produced the
examples.
rem
hl 1 FIRST LEVEL HEADER
nf
p
This is unfilled and unjustified text.
It comes out just as you
put
it in.  It can have paragraph spacing and indenting with
the .P command if you like.  It doesn't line up with
the right margin but it will never be allowed to extend beyond the right
margin; the excess will be put on the next line. This command may be used
for columnar work, tables, and address lists.
For example:
 .nf
 South Fork Hospital
 12 South Bend Ave.
 Pine Blufs, IN 12345
 .sp 3
LJ
hl 2 SECOND LEVEL HEADER
p
This is left justified text. The line contains as many full words as will
fit without running over the right margin. When FILL is enabled the PERIOD
and NOPERIOD options come into effect. PERIOD inserts two spaces after the
end-of-sentence punctuation; NOPERIOD inserts one blank.
rem
hl 3 THIRD LEVEL HEADER
j
p
This is justified text. The line is filled with words and right justified by
inserting spaces throughout the line. The blanks are added alternately on the
left and right sides of the line; this is to avoid "rivers" of blank space
running down the page. Since this program does not hyphenate words there may
occasionally be lines with a large number of inserted blanks.
rem
hl 4 FOURTH LEVEL HEADER
p
It should be noted that SKIP and SPACE have no effect at the top of a new
page.  This is a bit inconvenient if, for example, you want to create a
title page with a title block spaced part way down the page.  You can get
around this problem by doing the following:
nf
sp
  .NHD        -TURN OFF PAGE HEADER
  .NF         -TURN OFF FILLING
              -INSERT ONE BLANK LINE TO GET OFF TOP OF PAGE
  .SP n       -SPACE DOWN n LINES
  .C          -CENTER TITLE LINE(s)
  this is my title line
  .HD         -RESET FOR REGULAR PROCESSING
  .BP 1       -BEGIN PAGE NUMBERING WITH PAGE 1
  .FI         -TURN FILL ON
  .NP         -NEW PAGE
rem
fi
hl 5 FIFTH LEVEL HEADER
p
This is as far as you can go for header.
hl 4 BACK TO FOURTH LEVEL HEADER
hl 3 BACK TO THIRD LEVEL HEADER
hl 1 BACK TO FIRST LEVEL HEADER
hl 2 LISTS - NUMBERED
nl 1
le
Here we have the first level of list.
nl 1
le
The next level.
le
A second element.
nl 1
le
Third level list.
le
And so on,
le
And so on for two more levels of indenting.
els
els
Back out to the outermost list.
els
np
rem --------------------------------------------------------------------
hl 1 LITERAL TEXT:
p
Following is the literal source text that produced the above. It has been
offset by one space so that the commands will be processed as normal text.
nf
rm 80
sp
.rem
.hl 1 FIRST LEVEL HEADER
.nf
.p
This is unfilled and unjustified text.
It comes out just as you
put
it in.  It can have paragraph spacing and indenting with
the .P command if you like.  It doesn't line up with
the right margin but it will never be allowed to extend beyond the right
margin; the excess will be put on the next line. This command may be used
for columnar work, tables, and address lists.
For example:
  .nf
  South Fork Hospital
  12 South Bend Ave.
  Pine Blufs, IN 12345
  .sp 3
.LJ
.hl 2 SECOND LEVEL HEADER
.p
This is left justified text. The line contains as many full words as will
fit without running over the right margin. When FILL is enabled the PERIOD
and NOPERIOD options come into effect. PERIOD inserts two spaces after the
end-of-sentence punctuation; NOPERIOD inserts one blank.
.rem
.hl 3 THIRD LEVEL HEADER
.j
.p
This is justified text. The line is filled with words and right justified by
inserting spaces throughout the line. The blanks are added alternately on the
left and right sides of the line; this is to avoid "rivers" of blank space
running down the page. Since this program does not hyphenate words there may
occasionally be lines with a large number of inserted blanks.
.rem
.hl 4 FOURTH LEVEL HEADER
.p
It should be noted that SKIP and SPACE have no effect at the top of a new
page.  This is a bit inconvenient if, for example, you want to create a
title page with a title block spaced part way down the page.  You can get
around this problem by doing the following:
.nf
.sp
   .NHD        -TURN OFF PAGE HEADER
   .NF         -TURN OFF FILLING
               -INSERT ONE BLANK LINE TO GET OFF TOP OF PAGE
   .SP n       -SPACE DOWN n LINES
   .C          -CENTER TITLE LINE(s)
   title line text here
   .HD         -RESET FOR REGULAR PROCESSING
   .BP 1       -BEGIN PAGE NUMBERING WITH PAGE 1
   .FI         -TURN FILL ON
   .NP         -NEW PAGE
.rem
.fi
.hl 5 FIFTH LEVEL HEADER
.p
This is as far as you can go for header.
.hl 4 BACK TO FOURTH LEVEL HEADER
.hl 3 BACK TO THIRD LEVEL HEADER
.hl 1 BACK TO FIRST LEVEL HEADER
.hl 2 LISTS - NUMBERED
.nl 1
.le
Here we have the first level of list.
.nl 1
.le
The next level.
.le
A second element.
.nl 1
.le
Third level list.
.le
And so on,
.le
And so on for two more levels of indenting.
.els
.els
Back out to the outermost list.
.els
np
rem --------------------------------------------------------------------
nf
rm 80
ls 2
c
APPENDIX A
c
SUMMARY OF RUNOFF COMMANDS
ls 1
Command
Format          Function
-------         --------------------------------------------------------
sp
 .bp <number>  Begin page numbering at page <number>.
 .br           Break - Stop filling and start a new line.
 .c <count>    Center next <count> lines. Default=1.
 .cf           Continuous Forms. Default=ON.
 .cnp <lines>  Conditional New Page.  Starts a new page if there
               are less then <lines> lines remaining.
 .els          Terminate the current list.
 .fi           Set Line Filling On.
 .hd           Sets flag to turn on printing of header title and page #.
 .he <text>    Set header title to text.
 .hl <level> <text>
               Set heading level and section header text.
 .j            Justify lines by blank filling. Default=ON.
 .le           Starts a new list element.
 .lj           Left Justify lines. Produces "ragged right" lines.
 .lm <c>       Set left margin to column <c>.
 .ls <n>       Set line spacing to <n>. Default=1; Double spacing=2.
 .nl <lines>   Starts a numbered list.
 .mes <text>   Sends <text> message to console.
 .nbp          Terminate page numbering.
 .nf           Terminate Filling Lines.
 .nj           No Justify - justify off.
 .np           New Page.
 .npr          Terminate spacing sentences.
 .out <value1> [<value2> ... <value8>]
               Directly output control values to the printer device.
 .p [<indent> <skip> <cnp>]
               Paragraph Break.
                 <indent> = sets paragraph indenting spaces.
                 <skip>   = sets vertical spacing between paragraphs.
                 <cnp>    = sets argument for conditional new page.
 .pl <lines> [<width>]
               Set Page Length to <lines>.
               Set right margin to <width>.
 .pr           Period flag, set sentences spaced by 2 chars.
 .rem [text]   Remark. Any comments may be placed on a remark line.
 .rm <c>       Set right margin to column <c>.
 .sf           Single Forms. Pause for operator intervention between pages.
 .sk <lines>   Skips <lines> * (line spacing) lines.
 .sp <lines>   Space <lines> lines exactly.
 .ti +-<count> Temporary Indent <count> spaces.
                 <count> may be negative for outdent (not less than 0)
 .wait         Force program to wait for operator intervention.
rem --------------------------------------------------------------
np