V7M/doc/trofftut/tt09

.NH
Titles, Pages and Numbering
.PP
This is an area where things get tougher,
because nothing is done for you automatically.
Of necessity, some of this section is a cookbook,
to be copied literally until you get some experience.
.PP
Suppose you want a title at the top of each page,
saying just
.sp 3p
.lt 2.8i
.tl '~~~~left top'center top'right top~~~~'
.lt
.sp 3p
In
.UL roff ,
one can say
.P1 2
^he 'left top'center top'right top'
^fo 'left bottom'center bottom'right bottom'
.P2
to get headers and footers automatically on every page.
Alas, this doesn't work in
.UL troff ,
a serious hardship for the novice.
Instead you have to do a lot of specification.
.PP
You have to say what the actual title is (easy);
when to print it (easy enough);
and what to do at and around the title line (harder).
Taking these in reverse order,
first we define a macro
.BD .NP
(for `new page') to process
titles and the like at the end of one page
and the beginning of the next:
.P1
^de NP
\(fmbp
\(fmsp 0.5i
\&.tl 'left top'center top'right top'
\(fmsp 0.3i
^^
.P2
To make sure we're at the top of a page,
we issue a `begin page' command
.BD \(fmbp ,
which causes a skip to top-of-page
(we'll explain the
.BD \(fm
shortly).
Then we space down half an inch,
print the title
(the use of
.BD .tl
should be self explanatory; later we will discuss parameterizing the titles),
space another 0.3 inches,
and we're done.
.PP
To ask for
.BD .NP
at the bottom of each page,
we have to say something like
`when the text is within an inch
of the bottom of the page,
start the processing
for a new page.'
This is done with a `when' command
.BD .wh :
.P1
^wh  \-1i  NP
.P2
(No `.' is used before NP;
this is simply the name of a macro, not a macro call.)
The minus sign means
`measure up from the bottom of the page',
so
`\-1i' means `one inch from the bottom'.
.PP
The
.BD .wh
command appears in the input outside the definition of
.BD .NP ;
typically the input would be
.P1
^de NP
^^^
^^
^wh \-1i NP
.P2
.PP
Now what happens?
As text is actually being output,
.UL troff 
keeps track of its vertical position on the page,
and after a line is printed within one inch from the bottom,
the
.BD .NP
macro is activated.
(In the jargon, the
.BD .wh
command sets a
.ul
trap
at the specified place,
which is `sprung' when that point is passed.)
.BD .NP
causes a skip to the top of the next page
(that's what the
.BD \(fmbp
was for),
then prints the title with the appropriate margins.
.PP
Why
.BD \(fmbp
and
.BD \(fmsp 
instead of
.BD .bp
and
.BD .sp ?
The answer is that
.BD .sp
and
.BD .bp ,
like several other commands,
cause a
.ul
break
to take place.
That is, all the input text collected but not yet printed
is flushed out as soon as possible,
and the next input line is guaranteed to start
a new line of output.
If we had used
.BD .sp
or
.BD .bp
in the
.BD .NP
macro,
this would cause a break in the middle
of the current output line when a new page is started.
The effect would be to print the left-over part of that line
at the top of the page, followed by the next input line on a new output line.
This is
.ul
not
what we want.
Using
.BD \(fm
instead of
.BD . 
for a command
tells
.UL troff 
that
no break is to take place _
the output line
currently being filled
should
.ul
not
be forced out before the space or new page.
.PP
The list of commands that cause a break 
is short and natural:
.P1
^bp   ^br   ^ce   ^fi   ^nf   ^sp   ^in   ^ti
.P2
All others cause
.ul
no
break,
regardless of whether you use a
.BD .
or a 
.BD \(fm .
If you really need a break, add a
.BD .br 
command at the appropriate place.
.PP
One other thing to beware of _
if you're changing fonts or point sizes a lot,
you may find that
if you cross a page boundary
in an unexpected font or size,
your titles come out in that size and font
instead of what you intended.
Furthermore, the length of a title is independent of the current line length,
so titles will come out at the default length of 6.5 inches
unless you change it,
which is done with the
.BD .lt
command.
.PP
There are several ways to fix the problems of point sizes
and fonts in titles.
For the simplest applications, we can change
.BD .NP 
to set the proper size and font for the title,
then restore the previous values, like this:
.P1 2
.ta .8i
^de NP
\(fmbp
\(fmsp 0.5i
^ft R	\e" set title font to roman
^ps 10	\e" and size to 10 point
^lt 6i	\e" and length to 6 inches
^tl 'left'center'right'
^ps	\e" revert to previous size
^ft P	\e" and to previous font
\(fmsp 0.3i
^^
.P2
.PP
This version of
.BD .NP
does
.ul
not
work if the fields in the
.BD .tl
command contain size or font changes.
To cope with that
requires
.UL troff 's
`environment' mechanism,
which we will discuss in Section 13.
.PP
To get a footer at the bottom of a page,
you can modify
.BD .NP
so it does
some processing before
the
.BD \(fmbp
command,
or split the job into a footer macro invoked
at the bottom margin and a header macro invoked
at the top of the page.
These variations are left as exercises.
.WS
.PP
Output page numbers are computed automatically
as each page is produced (starting at 1),
but no numbers are printed unless you ask for them explicitly.
To get page numbers printed,
include the character
.BD %
in the
.BD .tl
line at
the position where you want the number to appear.
For example
.P1
^tl ''- % -''
.P2
centers the page number inside hyphens, as on this page.
You can set the page number at any time
with either
.BD .bp\ n ,
which immediately starts a new page numbered
.BD n ,
or with
.BD .pn\ n ,
which sets the page number for the next page
but doesn't cause a skip to the new page.
Again,
.BD .bp\ +n
sets the page number to
.BD n
more than its current value;
.BD .bp
means
.BD .bp\ +1 .