summaryrefslogtreecommitdiff
path: root/macros/lamstex/doc/wiz7.tex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/lamstex/doc/wiz7.tex
Initial commit
Diffstat (limited to 'macros/lamstex/doc/wiz7.tex')
-rw-r--r--macros/lamstex/doc/wiz7.tex2343
1 files changed, 2343 insertions, 0 deletions
diff --git a/macros/lamstex/doc/wiz7.tex b/macros/lamstex/doc/wiz7.tex
new file mode 100644
index 0000000000..d08fad7860
--- /dev/null
+++ b/macros/lamstex/doc/wiz7.tex
@@ -0,0 +1,2343 @@
+\part The Style Files\label{SFPART}\endpart
+
+\begingroup
+\newword\chapter{}
+\chapter""Introduction\endchapter
+*lamstex.tex* provides default treatments for all the main
+\lamstex\ constructions,
+while *lamstex.stf* and *lamstex.stb*
+provide default treatments for front matter and back matter constructions.
+
+In some styles, some of these constructions are a little more complicated,
+or have to be combined in different ways;
+and
+ certain features, like running heads, haven't yet been considered
+at all.
+So in this Part we discuss the standard \lamstex\
+style files, although in a somewhat more perfunctory manner than the
+treatment of previous Parts.
+
+As usual (compare section~\Sref{GENDEFS}), we will be using double horizontal
+lines for code from these files.
+
+
+\endgroup
+
+
+\chapter The {\tt paper} style\endchapter
+
+ The file *paper.st* begins
+\CC**
+\catcode`\@=11
+**
+to allow us to access and create private control sequences,
+followed by
+\CC**
+\ifx\paperst@\relax\catcode`\@=\active
+ \endinput\else\let\paperst@=\relax\fi
+**
+which prevents *paper.st* from being read in twice (compare
+section~\Sref{AC}), a necessity because of the *\NameHL* commands
+that occur later (we can't *\NameHL1\heading* twice, since that involves
+*\define\heading* twice).\linebreak
+Then we have
+\CC**
+\let\alloc@=\alloc@@
+**
+so that we can
+ create new
+counters, etc., without having them written to the *.log* file
+(compare page~\ref{NEWALLOC}).
+
+
+
+
+\section{Basic settings}Next we set basic parameters that differ from
+the default style:
+\CC**
+\hsize=30pc
+\vsize=42pc
+\parindent=1em
+\normallineskiplimit=1pt
+\advance\hoffset 48pt
+\advance\voffset 78pt
+**
+*\hoffset* and *\voffset* are changed to center these
+small pages within an 8\piecefrac12 $\times$ 11 inch piece of paper.
+
+\section{Fonts and point sizes}
+Since parts of the paper will be set in 8~point type, we first
+have to introduce numerous extra fonts:
+\CC**
+\font@\ninerm=cmr9
+\font@\eightrm=cmr8
+\font@\sixrm=cmr6
+\font@\eighti=cmmi8 \skewchar\eighti='177
+\font@\sixi=cmmi6 \skewchar\sixi='177
+\font@\ninesy=cmsy9 \skewchar\ninesy='60
+. . .
+**
+\amstex's *\font@* is basically like the \tex\ primitive *\font*, except
+that the font name is added to *\fontlist@* (see section~\Sref{LISTS}),
+for use by \amstex's *\syntax* command.
+The only slightly surprising things here are the *\ninerm* and *\ninesy*---%
+they are needed only
+because they are used fleetingly in the definition of *\big* for eight point
+type (see below).
+
+If the
+additional AMS fonts have been loaded, using any of
+**
+\loadmsam
+\loadmsbm
+\loadeufm
+**
+then flags *\ifmsamloaded@*, *\ifmsbmloaded@*, and *\ifeufmloaded@*,
+respectively, will have been set true. And if
+**
+\loadbold
+**
+was used to load *cmmib..* and *cmmbsy...* fonts, flags
+*\ifcmmibloaded@* and *\ifcmbsyloaded@* will have been set true.
+
+In each case, we should then load additional fonts for eight point:
+\CC**
+\ifmsamloaded@
+ \font@\eightmsa=msam8
+ \font@\sixmsa=msam6
+\fi
+"2
+ . . .
+"2
+\ifcmbsyloaded@
+ \font@\eightcmbsy=cmbsy8 \skewchar\eightcmbsy='60
+ \font@\sixcmbsy=cmbsy6 \skewchar\sixcmbsy='60
+\fi
+**
+(If even more crazy families are to be loaded, like *eufb*, *eusm*,
+*eusb*, *eurm*, *eurb*, further clauses will have to be added, but I couldn't
+bear including them.)
+
+Now we want to define *\tenpoint* and *\eightpoint*, following the basic
+scheme used in Appendix~E of {\it The \tex book}.
+For literal mode, we will want spaces to give different amounts of
+glue in the two different point sizes, so we first declare a new glue
+register,
+\CC**
+\newskip\ttglue@
+**
+
+A few macros need to know what point size is currently used,
+so this information is kept in a control
+sequence *\pointsize@*. Thus,
+the definition of *\tenpoint* will be of the form:
+\CC**
+\def\tenpoint{\def\pointsize@{10}%
+ . . .
+}
+**
+After *\pointsize@* is defined,
+ *\normalbaselineskip* is set to~*12pt* (at the end of the definition,
+*\normalbaselines* will be stated, which actually sets *\baselineskip* to this
+value); on the other hand,
+*\normallineskip* and *\normallineskiplimit* will each have the
+value~*1pt* for both 10~point and 8~point type.
+
+Then values of *\abovedisplayskip*, \dots, for the spacing above and below
+displayed formulas are set.
+
+Next we use
+**
+\textonlyfont@\rm\tenrm
+. . .
+\textonlyfont@\bf\tenbf
+**
+so that *\rm* means *\tenrm* in 10~point type, etc. \amstex's
+*\textonlyfont@* construction means that *\rm*, \dots, will give error
+messages if used in math mode. (However, if the file *pcompat.tex*
+ has
+been *\input*, and *\plainfonts* has been specified,
+ then *\textonlyfont@* will be redefined so that *\rm*, \dots, will
+function exactly as in *plain* \tex@.)
+
+Next we have to set up the families for math fonts,
+and then\linebreak *\let\big=\tenbig@*, which is defined separately,
+since *\big* is different for 10~point type and
+8~point type (following Appendix~E, however, *\bigg*, \dots, are kept
+the same).
+
+If the user has typed *\syntax*, so that *\ifsyntax@* is true,
+then we might as well skip all these font assignments, and we can give
+*\big* a simpler definition, in which the actual size used is irrelevant,
+**
+\ifsyntax@
+ \def\big##1{{\hbox{$\left##1\right.$}}}
+\else
+ \let\big=\tenbig@
+ \textfont0=\tenrm . . .
+"2
+ . . .
+"2
+ \textfont3=\tenex . . .
+ \textfont\itfam=\tenit
+"2
+ . . .
+"2
+ \textfont\bffam=\tenbf . . .
+ \ifmsamloaded@
+ . . .
+ \fi
+ . . .
+\fi
+**
+
+We also *\let\tt=\tentt*, although we don't bother producing a *\tt* math
+family, and we then use
+**
+\tt\ttglue@=.5em minus.15em
+**
+Thus, we switch to this *\tt* font (so that *em* refers to that font), and
+then assign the value of *\ttglue@*).
+This switch to *\tt* is temporary, since we will
+switch to *\rm* at the end.
+
+Before ending, however, we have to set *\box\strutbox*, which determines
+struts,
+**
+\setbox\strutbox=\hbox{\vrule\height8.5pt\depth3.5pt\width0pt}
+**
+as well as *\strutbox@*, which \amstex\ uses for its special math struts,
+**
+\setbox\strutbox@=\hbox{\vrule\height8pt\depth3pt\width0pt}
+**
+We also set the \amstex\ dimen
+**
+\ex@=.2326ex
+**
+(as explained in *amstex.doc*, I don't remember why this value is chosen!).
+And then the definition of *\tenpoint* ends with
+**
+\normalbaselines
+**
+so that we have set *\baselineskip*, etc., to their ``normal'' values,
+and then
+**
+\ifmmode\else\rm\fi
+**
+to switch to *\rm*; the *\ifmmode* test is required in case a construction
+like
+**
+$$ \tenpoint ... $$
+**
+is used, since *\rm* will give an error message in math mode!
+
+
+After the definition of *\tenpoint*, we still have to give the
+definition
+\CC**
+\def\tenbig@#1{{\hbox{$\left#1\vbox to8.5pt{}
+ \right.\n@space$}}}
+**
+and then we can switch to *\tenpoint*:
+\CC**
+\tenpoint
+**
+{\bf NOTICE }that we must not say *\tenpoint* until *\tenbig@* has been
+defined, or *\big* will initially be undefined.
+
+The definition of *\eightpoint* is exactly analogous, and followed by
+the definition
+\CC**
+\def\eightbig@#1{{\hbox{$\textfont0=\ninerm\textfont2=\ninesy
+ \left#1\vbox to6.5pt{}\right.\n@space$}}}
+**
+which is where *\ninerm* and *\ninesy* get used; then, for example,
+*\big(* in *\tenpoint* selects the *\ninerm*~(.
+
+Then we use
+\CC**
+{\catcode` =\active
+\gdef\litcodes@@{\def {\allowbreak\hskip\ttglue@}}}
+**
+so that if literal mode is used within *\tenpoint* or *\eightpoint*,
+the active space will have the desired width.
+
+With the fonts now declared, we can properly print the \lamstex\
+logo; for best effects somewhat different choices are required at different
+point sizes:
+\CC**
+\def\LamSTeX{L\kern-.4em\raise.3ex\hbox{$\ssize\Cal A$}%
+ \def\next@{10}\ifx\next@\pointsize@
+ \kern-.25em\else\kern-.3em\fi
+"2
+ \lower.4ex\hbox{\def\next@{10}\ifx\next@\pointsize@
+ \eightsy\else\sixsy\fi M}%
+ \kern-.1em{$\Cal S$}-\TeX}
+**
+
+Although *\claimformat* is supposed to be the same as in the default
+style, most people don't have an 8~point ``caps and small caps'' font, so
+*\tenpoint* and *\eightpoint* don't define
+*\smc*, which simply has the default *lamstex.tex* meaning
+of *\tensmc* (choosing the font *cmcsc10*).
+ So we substitute *\rm\uppercase* instead:
+\CC**
+\def\claimformat@#1#2#3{\medbreak\noindent@@
+ \def\next@{8}\ifx\pointsize@\next@
+ \rm\uppercase{#1 {\claim@@@F#2} #3}%
+ \punct@{\null.}\addspace@\enspace
+"2
+ \else
+ \smc#1 {\claim@@@F#2} #3\punct@{\null.}%
+ \addspace@\enspace
+ \fi
+ \sl}
+**
+
+Finally, since we have the smaller *\eightpoint* fonts, we might as well use
+them in the *\windex@* routine for printing index entries at the right
+margin, for proofing; we change the strut so that it gives only~
+*10pt* between lines.
+
+\CC**
+\def\windex@{\ifindexing@
+ \expandafter\unmacro@\meaning\stari@\unmacro@
+ \edef\macdef@{\string""\macdef@\string""}%
+ \edef\next@{\write\ndx@{\macdef@}}\next@
+ \write\ndx@{{\number\pageno}{\page@N}{\page@P}{\page@Q}}%
+ \fi
+ \ifindexproofing@
+ \ifx\stariii@\empty\else
+ \expandafter\unmacro@\meaning\stariii@\unmacro@\fi
+ \insert\margin@{\hbox{\eightpoint
+ \vrule\height7\p@\depth3\p@\width\z@\starii@
+ \ifx\stariii@\empty\else\tt\macdef@\fi}}\fi}
+**
+
+
+
+\section{The {\tt.toc} levels} Since *paper.st* has so many different heading
+levels,
+$$\vcenter{\halign{\tt#\hfil&\quad{\it alias\/}\quad\tt#\hfil\cr
+ \bs HL1&\bs chapter\cr
+ \bs hl1&\bs section\cr
+ \bs hl2&\bs subsection\cr
+ \bs hl3&\bs topic\cr
+ \bs hl4&\bs subtopic\cr}}$$
+we want to allow *\toclevel* to indicate how many levels should be written to
+the *.toc* file: *\toclevel1* should indicate that only *\chapter*'s are
+written, *\toclevel2* that *\chapter*'s and *\section*'s are written, etc.
+We might as well allow *\toclevel0* to mean nothing is written (although then
+it was fairly silly to specify *\tocfile* to begin with).
+
+We do this in terms of a counter *\toclevel@*, initially with the value~*3*
+(so that *\chapter*'s, *\section*'s and *\subsection*'s---the only numbered
+heading levels in this style---are written):
+\CC**
+\newcount\toclevel@
+\toclevel@=3
+\def\toclevel#1{\toclevel@=#1\relax}
+**
+
+To get this to work, we have to restate the definitions of *\HLtoc@* and
+*\hltoc@* from *lamstex.tex*. The only difference in the definition
+of *\HLtoc@* is that we don't do anything if *\toclevel@* is less than~*1*:
+\setbox0\hbox{\<old code for *\HLtoc*\>}
+\CC**
+\def\HLtoc@{%
+ \iftoc@
+ \ifnum\toclevel@ < 1
+"2
+ \else
+ "box0
+ \fi
+ \fi}
+**
+
+Similarly, *\hltoc@* only writes to the *.toc* file when *\hllevel* is
+less than *\toclevel@* (so if *\toclevel@* is~*1*, no *\hl* is written, if
+*\toclevel@* is~*2*, only *\hl1* is written, etc., as desired):
+\setbox0\hbox{\<old code for *\hltoc@*\>}
+\CC**
+\def\hltoc@{%
+ \iftoc@
+"2
+ \ifnum\hllevel@ < \toclevel@
+ "box0
+ \fi
+ \fi}
+**
+
+\section{Setting up heading levels} Next we have to set up the heading
+levels. As mentioned on page~\ref{USESFPART}, we want to make sure that
+the basic
+*\NameHL*'s in this style file don't write information to the *.toc* file
+even if *\tocfile* has been specified before the *\docstyle* line.
+So we define
+\CC**
+\def\notocwrite@#1#2#3{\iftoc@\test@true\else\test@false\fi
+ \toc@false#1{#2}#3\iftest@\toc@true\fi}
+**
+For example,
+\CC**
+\notocwrite@\NameHL1\heading
+**
+first stores the value of *\iftoc@* in *\iftest@*, declares *\tocfalse@*,
+calls *\NameHL1\heading*, and restores *\toc@true* if *\iftoc@* was
+initially true. The *\NameHL* and *\Namehl* constructions don't involve
+*\iftest@*, so this is safe. (The definition of *\notocwrite@* encloses
+argument~*#2* in braces in case we have something like *\NameHL{10}...*.)
+
+Next we state
+\CC**
+\newfontstyle\heading{\smc}
+**
+Thus, *\HL1*, {\it alias\/} *\heading*, has numbers set in
+*\smc* (which will also be used for the heading title, in the definitions
+to follow).
+
+One additional feature of the *paper* style is that a *\subsection* (*\hl2*)
+is only allowed within a *\section* (*\hl1*), not directly within a
+*\heading*. So we need a flag
+\CC**
+\newif\ifinsection@
+**
+which *\heading* will set false and *\section* will set true.
+ Aside from this, *\heading* is handled
+by defining
+`*\HL@1*'
+almost exactly as in the default style,
+\CC**
+\expandafter\def\csname HL@1\endcsname#1\endHL{%
+ \global\insection@false
+"2
+ \bigbreak"9\medskip"9
+"2
+ {\locallabel@
+ \global\setbox1=\vbox{\Let@\tabskip\hss@
+ \halign to\hsize{"9\smc"9\hfil\ignorespaces##\unskip\hfil\cr
+"2
+ \expandafter\ifx\csname HL@W1\endcsname\empty\else
+ \csname HL@W1\endcsname\space\fi
+"2
+ {\HL@@F\ifx\thelabel@@\empty\else\thelabel@@\space\fi}%
+ \ignorespaces#1\crcr}}}%
+ \unvbox1
+ \nobreak\medskip}
+**
+merely adding some extra space before the heading, and setting the heading
+ in
+*\smc*.
+
+
+One of the interesting features of the *paper* style is the definition
+\CC**
+\def\appendices{%
+ \NameHL1\appendix
+ \Reset\appendix1%
+ \newnumstyle\appendix\Alph
+ \newword\appendix{Appendix}%
+}
+**
+This means that after *\appendices* has appeared, *\appendix* may be
+used (and *\heading* may no longer be used---compare page~\ref{NHLUD});
+the new headings created by
+*\appendix* will be numbered `A', `B', \dots, and the headings
+will now say `Appendix A \dots', etc.
+
+Notice that when *\appendices* is used, *\NameHL1\appendix* {\it will\/} be
+written to the *.toc* file. As we will see in section~\ref{Pmaketoc}, this
+will enable *\maketoc* to properly process any *\appendix* lines that appear
+afterwards.
+
+Next we have
+\CC**
+\notocwrite@\Namehl1\section
+\newstyle\section#1{#1\null.}
+**
+so that *\section* can be used for *\hl1*; in addition, we now have a period
+ printed after the *\section* number (the default style omits the period).
+
+Although each *\heading* normally resets *\section* numbers to~1 (this will
+be handled by `*\HL@I1*', to be defined shortly), we will allow
+**
+\keepsection
+**
+analogous to *\keepitem*, to be typed before *\heading*, to prevent this.
+*\keepsection* will merely set a flag
+\CC**
+\newif\ifcontinuesection@
+\def\keepsection{\global\continuesection@true}
+**
+which each *\section* should set false (with this arrangement,
+if\linebreak
+ *\keepsection* is typed before a *\heading* with no *\section*'s, then
+it carries over to the next *\heading*).
+
+The definition of *\section*, via `*\hl@1'*, also
+ sets *\ifinsection@* to be true,
+and the formatting is somewhat different from the default style: instead of
+running the *\section* title into the text, we start a new paragraph, after a
+*\smallskip*:
+\CC**
+\expandafter\def\csname hl@1\endcsname#1{%
+ \global\insection@true
+ \global\continuesection@false
+ \medbreak\noindent@@
+ {\locallabel@
+ \bf{\hl@@F\ifx\thelabel@@\empty\else\thelabel@@\space\fi}%
+ \ignorespaces#1\unskip\punct@{\null.}}%
+ \par\nobreak\smallskip}
+**
+
+For *\hl2*, eventually to be named *\subsection*, we must first declare
+counters and default values:
+\CC**
+\expandafter\newcount\csname hl@C2\endcsname
+\csname hl@C2\endcsname=0
+"2
+\expandafter\def\csname hl@S2\endcsname#1{#1\null.}
+"2
+\expandafter\let\csname hl@N2\endcsname=\arabic
+"2
+\expandafter\let\csname hl@P2\endcsname=\empty
+\expandafter\let\csname hl@Q2\endcsname=\empty
+"2
+\expandafter\def\csname hl@F2\endcsname{\bf}
+\expandafter\let\csname hl@W2\endcsname=\empty
+**
+Then we can
+\CC**
+\notocwrite@\Namehl2\subsection
+**
+[recall (page~\ref{NameNOTE}) that *\Namehl2* must be used after
+`*\hl@C2*', \dots\ have been defined]. Then we
+ define *\subsection*, via `*\hl@2*', giving an error message
+if the flag *\ifinsection@* is false:
+\CC**
+\expandafter\def\csname hl@2\endcsname#1{%
+ \ifinsection@
+"2
+ \smallbreak
+ \noindent@@
+"2
+ {\locallabel@
+ {\hl@@F\ifx\thelabel@@\empty\else
+ \thelabel@@\space\fi}\bf
+"2
+ \ignorespaces#1\unskip\punct@{\null.}%
+ \addspace@\enspace}%
+"2
+ \else
+ \Err@{\noexpand\subsection not in a \string\section}%
+ \fi}
+**
+
+The declaration of counters and default values for *\hl3* and *\hl4* are
+analogous, except that we can even
+**
+\expandafter\let\csname hl@F3\endcsname=\empty
+\expandafter\let\csname hl@F4\endcsname=\empty
+**
+since the numbers for these heading levels aren't even going to be printed.
+
+We can then state
+\CC**
+\notocwrite@\Namehl3\topic
+**
+and
+\CC**
+\notocwrite@\Namehl4\subtopic
+**
+
+The definition of *\topic*, via `*\hl@3*', is
+\CC**
+\expandafter\def\csname hl@3\endcsname#1{%
+ \smallbreak
+"2
+ \noindent@@
+"2
+ {\locallabel@
+ \bf\ignorespaces#1\unskip\punct@{\null.}%
+ \addspace@\enspace}}
+**
+while *\subtocic*, defined via `*\hl@4*', starts as an ordinary paragraph:
+\CC**
+\expandafter\def\csname hl@4\endcsname#1{%
+"2
+ \smallbreak
+"2
+ {\locallabel@\bf\ignorespaces#1\unskip
+ \punct@{\null.}\addspace@\enspace}}
+**
+
+The initializations are fairly simple:
+\CC**
+\expandafter\def\csname HL@I1\endcsname{\ifcontinuesection@
+ \else\Reset\hl11\fi}
+"2
+\expandafter\def\csname hl@I1\endcsname{\Reset\hl21%
+ \ifx\pref\empty\newpre\hl2{}\else\new\hl2{\pref.}\fi}
+"2
+\expandafter\def\csname hl@I2\endcsname{\Reset\hl31}
+"2
+\expandafter\def\csname hl@I3\endcsname{\Reset\hl41}
+**
+Thus, *\section* numbers are reset to~1 after each *\heading*,
+unless\linebreak
+*\keepsection* preceded it; *\subsection* numbers are reset to~1 at each
+*\section*, and the {\it n}$^{\text{th}}$ subsection number is
+printed as {\it m}.{\it n}, where {\it m\/} is the *\section* number, unless
+empty (because of a *\section""""* command); and *\subsection* resets
+*\topic* numbers to~1, while *\topic* resets *\subtopic* numbers to~1, even
+though these numbers aren't printed (they can still be referred to by *\nref*,
+if the *\topic* or *\subtopic* is given a *\label*).
+
+\section{Footnotes}
+The definition of *\vfootnote@* is modified so that the footnotes will be
+printed in 8~point type:
+\C**
+\def\vfootnote@#1{\insert\footins
+ \bgroup
+"2
+ \floatingpenalty2000
+"2
+ \interlinepenalty=\interfootnotelinepenalty
+"2
+ \leftskip=0pt \rightskip=0pt \spaceskip=0pt \xspaceskip=0pt
+ "9\eightpoint"9
+ \splittopskip=\ht\strutbox \splitmaxdepth=\dp\strutbox
+"2
+ \locallabel@\noindent@@{\foottext@F#1}\modifyfootnote@
+ \footstrut\futurelet\next\fo@t}
+**
+Note that the *\strutbox* will now have the value set by *\eightpoint*.
+
+\section{Additional ``top matter'' and ``end matter''
+constructions}
+ In addition to *\title*, *\author*, *\affil*, and *\date*, which already
+appear in the default style, the *paper* style also has several other
+constructions that go at the beginning of the paper, and a few that go at the
+end.
+
+For *\abstract...\endabstract*, as
+ for *\title* and *\author*, we declare a box
+\CC**
+\newbox\abstractbox@
+**
+to hold the abstract. Because we are printing a word `Abstract' at the
+beginning, followed by punctuation and spacing, we then
+\CC**
+\rightadd@\abstract\to\nofrillslist@
+\def\abstract@W{Abstract}
+**
+
+The *\box\abstractbox@* is going to be set with
+**
+\leftskip=24pt \rightskip=\leftskip
+**
+rather than as a *\vbox* with smaller *\hsize*, so that we can simply
+*\unvbox* it at the proper time, instead of having to include it in
+*\centerline*, and worrying about spacing before and after it.
+We will increase the *\tolerance* to~*800* for these smaller lines.
+
+Unfortunately,
+these values of *\leftskip* and *\rightskip*
+{\it do not\/} influence
+ *\displaywidth* and *\displayindent*, which determine the positioning
+of displayed formulas within the *\abstract*; the latter are influenced
+only by *\parshape*---see {\it The \tex book}, page~188. Moreover,
+we
+can't simply assign them the desired values, because, as explained on that
+page, \tex\
+ assigns them values
+immediately after the *$$* that begins a display, based on the value of
+*\parshape*.
+Instead we will have to change *\everydisplay* (which, recall from
+section~\Sref{pretend1}, is already non-empty in \lamstex) to include
+the desired changes.
+\CC**
+\def\abstract{\begingroup
+ \global\setbox\abstractbox@=\vbox\bgroup
+"2
+ \eightpoint\leftskip=24pt \rightskip=\leftskip
+"2
+ \everydisplay{\advance\displaywidth by -48pt
+ \displayindent=24pt \csname displaymath \endcsname}%
+"2
+ \tolerance=800
+ \noindent@@
+"2
+ \ifx\abstract@W\empty\else\abstract@W\punct@{\null.}%
+ \addspace@\enspace\fi}
+"slip
+\def\endabstract{\egroup\endgroup}
+**
+
+*\thanks*, *\keywords*, and *\subjclass* are handled like *\date*:
+\CC**
+\let\thanks@=\relax
+\long\def\thanks#1{\gdef\thanks@{{\ignorespaces#1}}}
+"slip
+\let\keywords@=\relax
+\def\keywords#1{\gdef\keywords@{{\ignorespaces#1}}}
+"slip
+\let\subjclass@=\relax
+\def\subjclass#1{\gdef\subjclass@{{\ignorespaces#1}}}
+**
+The *\long* allows several paragraphs of thanks. Extra group is included
+in the definitions of *\keywords* and *\subjclass* in case a font change is
+included; but, as we will see, that is unnecessary for *\thanks*.
+None of these need *\unskip*
+at the end, because they will all eventually be ended by a *\par*.
+
+*\address* is somewhat different, because it can be used arbitrarily many
+times. A counter *\addresscount@* is used to keep track of the number, and
+each use of *\address* creates a new control sequence to store the argument:
+\CC**
+\newcount\addresscount@
+\addresscount@=0
+"2
+\long\def\address#1{\global\advance\addresscount@ by 1
+ \expandafter\gdef
+ \csname address\number\addresscount@\endcsname
+ {{\ignorespaces#1}}}
+**
+
+Since *\keywords*, *\subjclass*, and *\address*'s are printed at the end of
+the paper in the *paper* style, we redefine *\bye* to include this
+material before adding the *\vfill\supereject\end*:
+\CC**
+\def\bye{\par
+ \nobreak
+"2
+ \vskip12pt minus6pt
+"2
+ \eightpoint
+"2
+ \ifx\keywords@\relax\else
+ \noindent@@{\it Keywords.\enspace}\keywords@\par\fi
+"2
+ \ifx\subjclass@\relax\else
+ \noindent@@ 1980 {\it Mathematics subject
+ classifications\/}\colon@\space\subjclass@\par\fi
+"2
+ \ifnum\addresscount@ > 0
+ \nobreak
+ \vskip12pt minus6pt
+"2
+ \loop\ifnum\addresscount@>0
+ \csname address\number\addresscount@\endcsname\endgraf
+ \global\advance\addresscount@ by -1
+ \repeat
+"2
+ \fi
+ \vfill\supereject
+ \end}
+**
+Notice that instead of a *:* we used *\colon@* (page~\ref{COLONAT}).
+No *\keywords@W* or
+*\subjclass@W* has been provided, to change `Keywords' or `Mathematics
+subject classifications', since those are presumably somewhat standard terms;
+but they could easily be added if needed. In the *\loop* for the
+*\address*'s, we needed *\endgraf* instead of *\par*, since *\loop* isn't
+*\long*.
+
+And then we make *\enddocument* synonymous with this new *\bye*:
+\CC**
+\let\enddocuent=\bye
+**
+
+The remaining constructions, which occur at the top, are placed by\linebreak
+*\maketitle*, just as in the default style. We also declare initially empty
+elements
+\CC**
+\let\pretitle=\empty
+\let\preauthor=\empty
+"2
+\let\preaffil=\empty
+"2
+\let\predate=\empty
+"2
+\let\preabstract=\empty
+\let\prepaper=\empty
+**
+which can be redefined to add additional elements:
+\CC**
+\def\maketitle{\hrule\height 0pt \vskip-\topskip
+"2
+ \pretitle
+"2
+ \vskip24pt plus12pt minus12pt
+ \unvbox\titlebox@
+"2
+ \preauthor
+"2
+ \ifvoid\authorbox@\else
+ \vskip12pt plus6pt minus3pt \unvbox\authorbox@\fi
+"2
+ \preaffil
+"2
+ \ifvoid\affilbox@\else
+ \vskip10pt plus5pt minus2pt \unvbox\affilbox@\fi
+"2
+ \predate
+"2
+ \ifx\date@\relax\else
+ \vskip6pt plus2pt minus2pt\centerline{\rm\date@}%
+ \let\date@=\relax\fi
+"2
+ \preabstract
+"2
+ \ifx\thanks@\relax\else
+ \vfootnote@{}\thanks@
+ \let\thanks@=\relax\fi
+"2
+ \ifvoid\abstractbox@\else
+ \vskip15pt plus12pt minus12pt
+ \unvbox\abstractbox@
+ \fi
+"2
+ \prepaper
+ \vskip18pt plus12pt minus6pt}
+**
+Notice that the *\thanks* is treated like the text of a footnote, but with
+no number.
+
+\section{Bibliography}
+ The only modification
+required for *\makebib* in the *paper* style is to switch to 8~point type:
+\CC**
+\def\makebib{\begingroup\eightpoint
+ \bigbreak
+ \centerline{\smc\makebib@W}\nobreak\medskip
+"2
+ \sfcode`\.=1000 \everypar{}\parindent=0pt
+ \def\nopunct{\nopunct@true}\def\nospace{\nospace@true}%
+"2
+ \nopunct@false\nospace@false
+ \def\lkerns@{\null\kern-1sp\kern1sp}%
+ \def\nkerns@{\null\kern-2sp\kern2sp}%
+}
+**
+
+For the case where *\UseBibTeX* has been specified, so that the
+**
+\makebib
+ . . .
+\endmakebib
+**
+region is replaced by a
+**
+\bibliography{...}
+**
+line, we redefine *\beginthebibliography@* so that it will also print in
+8~point type:
+\CC**
+\def\beginthebibliography@#1{\eightpoint
+ \setbox0=\hbox{#1\ }\bibindent@=\wd0
+ \bigbreak\centerline{\smc\bibliography@W}\nobreak\medskip
+ \sfcode`\.=1000 \everypar{}\parindent=0pt}
+**
+
+\section{\CS{maketoc}\label{Pmaketoc}}
+ Finally, the *\maketoc* command is special,
+because it is used right in the *paper* style, rather than in a ``front
+matter file''. So most of the definitions of *lamstex.stf* are also required
+in *paper.st*:
+\CC**
+\def\dotleaders ...
+\def\Page@ ...
+\long\def\widerthanhsize@
+"2
+\long\def\setentry@##1##2##3##4{%
+ . . .
+ \else
+ \hbox to\hsize{"9\kern24pt"9 ...}
+ \fi}
+"2
+\def\endstrut@
+\newdimen\thehang@
+"2
+\long\def\longentry@##1##2##3##4{. . .
+ . . .
+ \hangafter1 \hangindent\thehang@ "9\leftskip=24pt"9
+ . . .}
+"2
+\newif\ifemptynumber@
+\def\Style@ ... . . . \def\Style@@@@ ...
+\newdimen\digits
+**
+with the difference that
+ all entries will be indented 24~points from the left margin (the
+same amount of indentation that occurs for the *\abstract*).
+
+We also need to have the definition
+\CC**
+\def\maketoc@W{Contents}
+**
+so that *\newword\maketoc* can be used before *\maketoc* itself.
+
+Then the definition of *\maketoc* starts
+**
+\def\maketoc{\par
+ \begingroup
+ \eightpoint \tolerance=800
+ \unlabel@\noset@
+ \let\nopunct=\relax \let\nospace=\relax
+ \let\overlong=\relax
+ \everypar={}\parindent=0pt
+ \lineskiplimit=0pt
+**
+The *\checkmainfile@* in the *lamstex.stf* definition is naturally deleted,
+and the *\par\vfill\break* is replaced by a *\par*. We use *\begingroup*,
+because we will be making redefinitions of *\HL*, etc., and the old
+definitions will have to be restored after the table of contents is finished;
+and the *\lineskiplimit=0pt*, which is so important for the entries of the
+table of contents (compare section~\Sref{SETENTRY}), will also be confined to
+this group.
+
+And then come the various redefinitions that also occur in *\maketoc*
+in *lamstex.stf*:
+**
+ \def\HL ...
+ \setbox0=\hbox{0.00}
+ \digits=\wd0
+ \def\hl ...
+ \def\NameHL ...
+ \def\Namehl ...
+**
+The definitions of *\HL* and *\hl* are somewhat different, reflecting both
+the larger number of heading levels, and somewhat different formatting in the
+table of contents. Then we have to add
+**
+ \NameHL1\heading \Namehl1\section \Namehl2\subsection
+ \Namehl3\topic \Namehl4\subtopic
+**
+so that *\heading*, \dots, *\subtopic* will be suitably redefined while
+making the table of contents. Naturally we can't
+add *\NameHL1\appendix* at the same time,
+ but *\appendices* will add this to the *.toc* file,
+so that *\appendix* will be suitably redefined at the necessary time when
+printing the Contents.
+
+Finally, we print the properly
+ centered heading, diminish *\hsize* by\linebreak
+ 24~points,
+(so that the right margin will match that of the *\abstract*), *\input* the
+file *\jobname.toc*, end the group, and add some vertical space:
+**
+\centerline{\smc\maketoc@W}
+\nobreak
+\vskip18pt plus12pt minus6pt
+"2
+\advance\hsize by -24pt
+"2
+\input \jobname.toc
+\endgroup
+\vskip 12pt plus8pt minus4pt
+**
+\medskip
+The definitions involving *\island*'s from *lamstex.stf* are not needed,
+since *paper.st* does not print a list of Figures, Tables, etc., even when a
+table of contents is made.
+
+And nothing from *lamstex.stb* is required, since *paper.st* does not
+provide for
+an index.
+
+
+
+\chapter The {\tt book} style\label{BOOKSTYLE}\endchapter
+
+
+\section{Basic settings}
+The *book* style has
+**
+\ifx\bookst@\relax\catcode`\@=\active
+ \endinput\else\let\bookst@=\relax\fi
+**
+analogous to the code in *paper.st*, and then
+some slightly different basic settings,
+**
+\hsize=30pc
+\vsize=42pc
+**
+Then, more significantly, it changes *\makeheadline*
+so that running heads will be separated from the main body of the text by a
+different amount of space; in addition, the running head is not made into
+a *\vbox to0pt*, as in *plain* \tex@---the running heads are a measurable part
+of the page
+(the final pages might even be printed
+with ``crop marks'' on them, which should naturally take into account the
+presence of the running heads). *\makefootline* is also changed, although
+that will only effect the page numbers at the bottoms of special pages, like
+the initial pages
+of each chapter:
+\CC**
+\def\makeheadline{\hbox{%
+ \botsmash{\line{\vbox to8.5pt{}\the\headline}}}%
+ \nointerlineskip\vskip20pt}
+\def\makefootline{\baselineskip=2.5pc
+ \line{\the\footline}}
+**
+
+Just for good measure, we make things like *\title*, \dots, undefined, since
+they should appear only in the ``front matter file'' for the book:
+\CC**
+\let\title=\undefined
+"2
+\let\author=\undefined
+"2
+\let\affil=\undefined
+"2
+\let\date=\undefined
+**
+and, in particular, we
+\CC**
+\let\makebib=\undefined
+**
+since *\makebib* should only occur in the ``back matter file''.
+
+\section{Fonts and point sizes}Exactly the same new fonts are declared as in
+the *paper* style, and *\tenpoint* and *\eightpoint* are defined in the same
+way.
+
+\section{The {\tt.toc} levels} *\toclevel* is defined just as in the *paper*
+style, and *\HLtoc@* and *\hltoc@* are redefined in exactly the same way.
+
+\section{Flushing out figures\label{FLUSHF}}
+Both *\part* and *\chapter* are going to flush out any
+figures from previous *\chapter*'s.
+As
+discussed in section~\Sref{FLUSHSEC}, this means that
+we will have to modify the *\plainoutput*
+routine so that empty pages produced at the ends of chapters won't
+increase the page numbers, and won't get printed.
+Since this additional process is memory intensive, however,
+we
+don't want it to be
+invoked unless a flag
+\CC**
+\newif\ifflush@
+**
+is true, where
+*\FlushedFigs* and *\NoFlushedFigs* are used to set the flag:
+\CC**
+\def\FlushedFigs{\global\flush@true}
+\def\NoFlushedFigs{\global\flush@false}
+**
+(The savvy user will
+ specify *\FlushedFigs* near the end of a *\chapter*
+with *\Aplace*'s and add *\NoFlushedFigs* at the beginning of the next
+*\chapter*.)
+
+It might seem that *\part* and *\chapter* will flush out figures from a
+previous *\chapter* if their definitions are of the form
+**
+\par\vfill\supereject
+ . . .
+{\locallabel@ . . . }
+ . . .
+**
+(using the *\par\vfill\supereject* that occurs in the definition of *\bye*).
+Unfortunately, that may not be sufficient
+when we have a situation like
+**
+. . .
+\Aplace{...}
+\chapter
+**
+because
+the *\Aplace*'d material may not get printed until after the remaining
+aspects of *\chapter* have already set things up for preparing pages for this
+next *\chapter*. For example,
+ flushed out figures from Chapter~9 might end up having
+heading levels saying `Chapter~10 \dots'!---which is even worse than having
+extra blank pages.
+
+Therefore *\part* and *\chapter* will, in all situations, use
+something like
+**
+\par\vfill\break\null\kern-\topskip\nobreak\vfill\supereject
+**
+(essentially the construction that appears in the *plain* definition
+of\linebreak
+*\dosupereject*), so that we can be sure that any
+held-over figures are flushed
+out before the remaining aspects of *\chapter* are brought into play. The
+problem with this approach is that a blank page will now be produced when
+there are no figures to be flushed out. However, we will take care of that
+problem later, during the *\output* routine. We will need a flag
+\CC**
+\newif\ifSflush@
+**
+to indicate such special pages, and then we define
+\CC**
+\def\flush@{\par\vfill\break\null\kern-\topskip\nobreak
+ \global\Sflush@true\vfill\supereject}
+**
+
+\section{\CS{part} and \CS{chapter}} The *book* style has a new heading level
+*\HL0*, {\it alias\/} *\part*. We will need a new font for setting it,
+\CC**
+\font\BF=cmbx10 scaled \magstep3
+**
+and then we set up things for *\HL0*:
+\CC**
+\expandafter\newcount\csname HL@C0\endcsname
+\csname HL@C0\endcsname=0
+"2
+\expandafter\def\csname HL@S0\endcsname#1{#1\/}
+\expandafter\let\csname HL@N0\endcsname=\Roman
+\expandafter\let\csname HL@P0\endcsname=\empty
+\expandafter\let\csname HL@Q0\endcsname=\empty
+\expandafter\def\csname HL@F0\endcsname{\BF}
+\expandafter\def\csname HL@W0\endcsname{Part}
+**
+So *\HL0*
+ levels
+will be numbered I, II, \dots. The word preceding the number
+will actually be `PART' rather than `Part', but we will use *\uppercase* for
+this, rather than defining `*\HL@W0*' as *PART*, so that *Part* will appear
+in the *.toc* file; this allows the style file for the front matter to print
+things differently, if desired.\pagelabel{UCPART}
+
+Once these definitions have been made, we can then
+*\NameHL0\part* (see page~\ref{NameNOTE}).
+ As with the *paper* style, however, we need to have
+\CC**
+\def\notocwrite@#1#2#3{\iftoc@\test@true\else\test@false\fi
+ \toc@false#1{#2}#3\iftest@\toc@true\fi}
+**
+so that we can
+\CC**
+\notocwrite@\NameHL0\part
+**
+We introduce a new flag
+\CC**
+\newif\ifpart@
+**
+since *\part* pages will be special (they will have no number at the bottom
+and also no running head). Then we define *\part*, via `*\HL@0*', which
+involves quite a few tricky maneuvers.
+
+Our definition of *\csname HL@0\endcsname* begins with
+**
+\flush@
+\global\part@true
+\ifodd\pageno\else\advancepageno\fi
+**
+where the *\flush@* (section~\Sref{FLUSHF}) flushes out any figures remaining
+from the previous *\chapter*, and
+ the third clause insures that *\part*'s always begin on odd-numbered
+pages.
+
+And then we want something like
+**
+{\locallabel@
+ \global\setbox1=\vbox{\Let@
+ \baselineskip=21pt
+ \halign{\BF\ignorespaces##\unskip\hfil\cr
+ \expandafter\ifx\csname HL@W0\endcsname\empty
+ \else\csname HL@W0\endcsname\space\space\fi
+ {\HL@@F\thelabel@@}\cr
+ \noalign{\vskip30pt}%
+ \uppercase{\ignorespaces#1\crcr}}}
+**
+printing
+ something like `PART\ \ II' on the first line, an extra 30~points of
+vertical
+space, and then the title *#1* in uppercase letters.
+
+ But we want to
+eliminate the first line and the extra 30~points if both the \<word\> and
+the number happen to be empty. Moreover,
+**
+\uppercase{\csname HL@W0\endcsname}
+**
+won't uppercase the letters in *\csname HL@W0\endcsname*, and even
+**
+\uppercase\expandafter{\csname HL@W0\endcsname}
+**
+won't do the trick, so we need to resort to a strategy used before
+(compare pages~\ref{LNIII} and ~\ref{USELNIII}),
+\CC**
+\expandafter\def\csname HL@0\endcsname#1\endHL{%
+ \flush@
+ \global\part@true
+ \ifodd\pageno\else\advancepageno\fi
+ {\locallabel@
+ \global\setbox1=\vbox{\Let@
+ \baselineskip=21pt
+"2
+ \halign{\BF\ignorespaces##\unskip\hfil\cr
+"2
+ \test@false
+ \expandafter\ifx\csname HL@W0\endcsname\empty
+ \ifx\thelabel@@\empty\global\let\Next@=T\fi\fi
+"2
+ \ifx\Next@ T%
+"2
+ \else
+ \expandafter\ifx\csname HL@W0\endcsname\empty
+ \else
+"2
+ \def\next@{\let\nextii@=}%
+ \expandafter\next@\csname HL@W0\endcsname
+ \uppercase\expandafter{\nextii@}\space\space\fi
+"2
+ {\HL@@F\thelabel@@}%
+ \fi
+ \cr
+"2
+ \noalign{\ifx\Next@ T\vskip-\baslineskip\else\vskip30pt\fi}%
+ \uppercase{\ignorespaces#1}\crcr}}}%
+ \def\aftertoc@{\vfill\break\advancepageno\global\part@false}%
+ \hrule\height0pt\mark{}\vskip1.25in\unvbox 1
+}
+**
+The *\hrule* keeps the *\vskip1.25in* from disappearing at the top of the
+page, and the *\mark{}* clears any marks from previous *\section*'s (see
+below).
+Notice that *\aftertoc@* causes the page number to jump to the next odd number
+ after the *\part* page,
+but the proper page for the *\part* will appear in the *.toc* file
+(compare page~\ref{AFTERTOC}); *\advancepageno* requires less work from
+\tex\ than *\Offset\Page2*, which could also have been used.
+
+We needed the globally defined *\Next@* here, since each line of the
+*\halign* is already within a group; although *\Next@* is used in various
+other \lamstex\ routines, none of them will be involved when
+we typeset (the *\uppercase*'d) *\HL@W* (for greater security, we could
+always use some new scratch token instead).
+
+
+Next we have
+\CC**
+\notocwrite@\NameHL1\chapter
+\newword\chapter{Chapter}
+\newif\iffirstchapterpage@
+**
+We need the new flag *\iffirstchapterpage@*, because initial pages of
+chapters will be treated specially, with no running heads, and page numbers
+at the bottom.
+As with the *paper* style, we also have the flag
+\CC**
+\newif\ifinsection@
+**
+
+Even-numbered pages will normally have the *\chapter* title at the top.
+However, we will allow
+**
+\runningchapter{...}
+**
+to be used before *\chapter* to specify a different running chapter
+(this change from version~*1*, where *\runningchapter* was supposed to
+occur after the *\chapter*, makes things much easier).
+We need a new flag to alert *\chapter* to the fact that *\runningchapter* has
+been used; the argument of *\runningchapter* will be stored in a token list,
+for reasons that will soon become apparent:
+\CC**
+\newif\ifrunningchapter@
+\newtoks\runningchaptertoks@
+\def\runningchapter#1{\global\runningchapter@true
+ \runningchaptertoks@={#1}}
+**
+
+The running heads at the top of odd-numbered pages will normally contain
+the most recent *\section* title, an arrangement that will require the use of
+*\mark*'s, except that we will use
+ the *\chapter* title if no *\section* has appeared. *\chapter* is going
+to start a new page, issue an empty *\mark{}*, to clear *\mark*'s from
+the previous *\section*'s,
+ and then define *\thechapter@* to be the desired running
+head on even-numbered pages.
+
+Just in case there are pages before a *\chapter*, we begin with
+\CC**
+\let\thechapter@=\relax
+**
+
+We then define *\chapter*, via `*\HL@1*', by
+\CC**
+\expandafter\def\csname HL@1\endcsname#1\endHL{%
+ \flush@
+ \global\insection@false
+"2
+ \ifrunningchapter@\else\runningchaptertoks@={#1}\fi
+ \global\runningchapter@false
+"2
+ {\noexpands@
+ \xdef\thechapter@{\ifx\Thepref@\empty\else
+ \Thepref@\null. \fi\the\runningchaptertoks@}}%
+ \global\firstchapterpage@true
+"2
+ {\locallabel@
+"2
+ \global\setbox1=\vbox{\Let@\tabskip\hss@
+ \halign to\hsize{\bf\hfil\ignorespaces##\unskip\hfil\cr
+ \expandafter\ifx\csname HL@W1\endcsname\empty\else
+ \csname HL@W1\endcsname\space\fi
+"2
+ {\HL@@F\ifx\thelabel@@\empty\else\thelabel@@\space\fi}%
+ \ignorespaces#1\crcr}}%
+ }%
+ \unvbox1 \mark{}%
+ \nobreak\vskip\baselineskip
+ %\firstparflush@
+}
+**
+Note that:
+\Pitem
+As with `*\HL@0*,' we need to flush out any figures from the
+previous *\chapter*.
+
+\pitem
+The tokens *#1* are stored in the token list *\runningchaptertoks@*,
+unless *\runningchapter* has already been used, and has thus already\linebreak
+stored something in *\runningchaptertoks@*. After this decision for\linebreak
+*\runningchaptergtoks@* has been made, we can reset the flag\linebreak
+*\ifrunningchaptertoks@*
+to be false.
+
+\pitem
+Then *\thechapter@* is created by an *\xdef*, inside a group
+containing\linebreak
+*\noexpands@*, so that appropriate control sequences in *\Thepref@* are left
+alone. Even though we have an *\xdef*,
+ our chapter title (or abbreviated title, specified by
+*\runningchapter*) appears as originally typed, since it is the value
+of *\the\runningchaptertoks@*---thus, we do not have to worry about expansion
+of control sequences in *\thechapter@*, and do not have to resort to the
+*\unmacro@\meaning* trick (this works because *\thechapter@* is not going to
+be written to a file, but merely typeset at the appropriate time).
+
+\pitem
+At the very end of the definition the line
+**
+\firstparflush@
+**
+is designed to start the next paragraph unindented; it has been commented
+out, since it is not used in the *book* style, but other book styles might
+want to use it.
+
+\small The definition of *\firstparflush@*, for those styles that want it,
+ is given immediately afterwards:
+\CC**
+\def\firstparflush@{\parindent=0pt
+ \everypar{\global\parindent=10pt \global\everypar{}}}
+**
+Thus, the first paragraph will be
+ set with *\parindent* equal to~*0pt*, but this paragraph will
+set *\everypar*, for all successive paragraphs, to
+**
+\global\parindent=10pt \global\everypar{}
+**
+This means that *\parindent* will be *10pt* for the second paragraph, and,
+moreover, *\everypar* will be back to the empty list for the third
+ paragraph. The *\global*'s are needed because a paragraph might start with
+something like
+**
+{\it Consequently}, we see that ...
+**
+\endsmall
+
+
+Having defined *\part* and *\chapter*, which set special flags *\ifpart@* and
+*\iffirstchapterpage@*, we also
+define *\footline*, which uses them, printing
+nothing at the bottom of *\part* pages, but a centered page number, in
+9~point type
+ at the
+bottom of the first page of each chapter.
+In essence we want
+**
+\ninepoint\folio
+**
+except that there is no *\ninepoint* command, merely *\ninerm* to switch to
+the 9~point roman font. So we have to use
+\CC**
+\footline={\ifpart@\hfil
+ \else
+ \iffirstchapterpage@\hfil
+ \ninerm\page@S{\page@P\page@N{\number\page@C}\page@Q}\hfil
+ \fi
+ \global\firstchapterpage@false
+ \fi}
+**
+---thus, *\newfontstyle\page* won't effect the page numbers at the bottom of
+initial chapter pages.
+
+At this point we also want to prevent any *\Aplace*'d material from occurring
+on the first page of each *\chapter*, by modifying *\advancedimtopins@*,
+as indicated on page~\ref{MODADT}:
+\CC**
+\def\advancedimtopins@{%
+ \iffirstchapterpage@
+ \else
+ \advance\dimen@ by \dimen\topins
+ \global\dimen\topins=\dimen@
+ \fi}
+**
+
+
+
+\section{\CS{plainoutput}}The
+*\part* and *\chapter* heading levels
+ are the only ones that flush out figures, so
+now is the time to consider the necessary modifications to *\plainoutput*,
+as already indicated in section~\Sref{FLUSHF}.
+
+
+We are going to need a new flag and a new box,
+\CC**
+\newif\ifblankpage@
+\newbox\topinsbox@
+**
+and also a counter in which we store the special penalty
+\setbox0\hbox{($={}$*-'10000000000*)}
+**
+-1073741824 "box0
+**
+that \tex\ inserts when it sees *\end* (page~\ref{WEIRDPEN}):
+\CC**
+\newcount\endpenalty@
+\endpenalty@=-'10000000000
+**
+
+Most of our extra manipulations will be done only
+when *\ifflush@* is true. However, we will also be doing extra manipulations
+when *\ifSflush@* is true and *\insertpenalties* is~*0* (which is when
+the additional
+**
+\null\kern-\topskip\nobreak\vfill
+**
+will create a blank page). So we first use
+**
+\test@false
+ \ifflush@\test@true
+ \else\ifSflush@\global\Sflush@false
+ \ifnum\insertpenalties=0 \test@true\fi
+ \fi\fi
+**
+to set *\iftest@* true in either of these cases, and reset *\ifSflush@* to
+false.
+
+Then, if this test is passed,
+ we first test if *\box\footins* is void and also
+*\box\topins* is void or has height~*0pt*; and if that test is true,
+we then
+use the code on page~\ref{BPGTEST} to test whether *box255* is essentially
+blank, reducing the page number by~1, and setting *\ifblankpage@* true,
+ if it is:
+**
+\def\plainoutput{%
+ \test@false
+ \ifflush@\test@true
+ \else\ifSflush@\global\Sflush@false
+ \ifnum\insertpenalties=0 \test@true\fi
+ \fi\fi
+ \iftest@
+"2
+ \test@false
+ \ifvoid\footins
+ \ifvoid\topins\test@true
+ \else\ifdim\ht\topins=0pt\test@true
+ \fi\fi
+"2
+ \fi
+ \iftest@
+"2
+ \setbox0=\vbox{\unvcopy255 \unskip\unpenalty\unkern
+ \global\setbox1=\lastbox\unskip}%
+"2
+ \ifdim\ht0=0pt \ifdim\ht1=0pt
+ \global\advance\pageno by -1
+ \global\blankpage@true
+ \fi\fi
+"2
+ \fi
+ \fi
+**
+
+Then we could
+continue with the commands from the standard\linebreak *\plainoutput* routine:
+**
+\specialsplit@false\ifvoid\topins\else\ifdim\ht\topins=0pt
+ \specialsplit@true\advance\minpagesize by -\skip\topins\fi\fi
+\fliptopins@
+\setbox\outbox@=\vbox{\makeheadline\pagebody\makefootline}%
+"2
+{\noexpands@ \let\style=\relax
+ \shipout@\box\outbox@
+}%
+"2
+\advancepageno
+\resetdimtopins@
+\ifvoid 255 \else \unvbox 255 \penalty\outputpenalty\fi
+\ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+**
+
+That would insure that the page numbers don't increase for the
+spurious blank pages. But we can do better than that. If we replace
+the
+**
+\shipout@\box\outbox@
+**
+with
+**
+\ifblankpage@ \global\blankpage@false
+ \else\shipout@\box\outbox@\fi
+**
+then the spurious blank pages shouldn't even be printed.
+
+This
+ seems to work fine at the end of all *\chapter*'s except when
+ there are figures to be flushed out at the end of the last *\chapter*,
+before the *\bye* or
+*\enddocument*. In that case,
+after each round of the *\output* routine, which now increases
+*\deadcycles* by~*1*, since nothing is shipped out,
+\tex\ keeps adding
+**
+\line{} \vfill \penalty -'10000000000
+**
+so that we eventually get an error message like
+**
+! Output loop---25 consecutive dead cycles.
+**
+ Page~264 of {\it The \tex book\/} says ``When \tex\ sees
+an *\end* command, it terminates the job only if the main vertical list has
+been entirely output and if *\deadcycles=0*. Otherwise it inserts the
+equivalent of
+**
+\line{} \vfill \penalty-'10000000000
+**
+into the main vertical list, and prepares to read the `*\end*' token again.''
+Apparently, the main vertical list has not been ``entirely output''
+ because *\box\topins* hasn't been shipped out.
+Emptying out *\box\topins* with something like
+**
+\setbox0=\box\topins
+**
+doesn't seem to help, so I resorted to
+**
+\ifblankpage@
+ \ifnum\outputpenalty=\endpenalty@
+ \shipout\vbox{\hrule\width1pt\height0pt\box\topins}%
+ \fi
+ \global\blankpage@false
+\else
+ \shipout@\box\outbox@
+\fi
+**
+which seems to work---the only adverse
+side-effect is the possibility of extra, totally blank, pages
+at the end.
+
+There is also one other modification that we need: instead of always
+using
+**
+\setbox\outbox@=\vbox{\makeheadline\pagebody\makefootline}
+**
+we use
+**
+\ifblankpage@ \setbox\outbox@=\pagebody\else
+\setbox\outbox@=\vbox{\makeheadline\pagebody\makefootline}\fi
+**
+The takes care of spurious blank pages that might be created
+by the first *\part* or *\chapter*, since *\makeheadline* or *\makefootline*
+might involve quantities that haven't even been determined yet.
+
+So the whole definition is:
+\CC**
+\def\plainoutput{%
+ \test@false
+ \ifflush@\test@true
+ \else\ifSflush@\global\Sflush@false
+ \ifnum\insertpenalties=0 \test@true\fi
+ \fi\fi
+ \iftest@
+"2
+ \test@false
+ \ifvoid\footins
+ \ifvoid\topins\test@true
+ \else\ifdim\ht\topins=0pt \test@true
+ \fi\fi
+"2
+ \fi
+ \iftest@
+ \setbox0=\vbox{\unvcopy255 \unskip\unpenalty\unkern
+ \global\setbox1=\lastbox\unskip}%
+ \ifdim\ht0=0pt \ifdim\ht1=0pt
+ \global\advance\pageno by -1
+ \global\blankpage@true
+ \fi\fi
+"2
+ \fi
+ \fi
+"2
+ \specialsplit@false
+ \ifvoid\topins\else
+ \ifdim\ht\topins=0pt
+ \specialsplit@true
+ \advance\minpagesize by -\skip\topins
+ \fi\fi
+"2
+ \fliptopins@
+"2
+ \ifblankpage@
+ \setbox\outbox@=\pagebody\else
+ \setbox\outbox@=\vbox{\makeheadline
+ \pagebody\makefootline}%
+ \fi
+"2
+ {\noexpands@ \let\style=\relax
+ \ifblankpage@
+ \ifnum\outputpenalty=\endpenalty@
+ \shipout\vbox{\hrule\width1pt\height0pt
+ \box\topins}%
+ \fi
+ \global\blankpage@false
+"2
+ \else
+ \shipout@\box\outbox@
+ \fi}%
+"2
+ \advancepageno
+"2
+ \resetdimtopins@
+ \ifvoid 255 \else \unvbox 255 \penalty\outputpenalty\fi
+ \ifnum\outputpenalty>-20000 \else \dosupereject \fi}
+**
+
+\small For the clause
+**
+\ifblankpage@
+ \setbox\outbox@=\pagebody\else
+ \setbox\outbox@=\vbox{\makeheadline
+ \pagebody\makefootline}
+\fi
+**
+I originally had simply
+**
+\ifblankpage@\else
+ \setbox\outbox@=\vbox{\makeheadline
+ \pagebody\makefootline}
+\fi
+**
+But this lead to the dead cycles error message, though I don't understand
+why.
+
+
+\andsmall!
+Since the extra test in *\plainoutput*
+always regards a ``blank'' page as a mistake,
+actual blank pages can't be produced with something like
+\setbox0\hbox{or}
+**
+\newpage\null\vfill\break "box0 \pagebreak\null\vfill\break
+**
+but we can use something like
+**
+\newpage\blankpage
+**
+where we have defined
+\CC**
+\def\blankpage{\null\null\vfill\break}
+**
+just in case that's needed. [Of course
+**
+\Aplace{\Figure\Hbyw{...}\endFigure}
+**
+possibly with a *\caption*, would be used if a blank page were
+required for a picture, the most usual reason for such a request. Also,
+**
+\NoFlushedFigs
+\newpage\null\vfill\break
+**
+would work.]
+\endsmall
+
+\section{Other heading levels}
+*\appendices* is treated exactly as in the *paper* style, so we won't repeat
+the definition here.
+
+Next we have
+\CC**
+\notocwrite@\Namehl1\section
+\newstyle\section#1{#1\null.}
+**
+as in the *paper* style.
+
+The running heads at the top of odd-numbered pages will normally contain the
+most recent *\section* title, except that we will use the *\chapter* title if
+no *\section* has yet appeared.
+We also want to allow *\runningsection* to be used
+before *\section* (again a change from version~*1*), which is treated just
+like *\runningchapter*:
+\CC**
+\newif\ifrunningsection@
+\newtoks\runningsectiontoks@
+\def\runningsection#1{\global\runningsection@true
+ \runningsectiontoks@{#1}}
+**
+
+In the definition of *\section*, via `*\hl@1*', instead of defining\linebreak
+*\thechapter@*, we need to make an appropriate *\mark*; since *\mark*'s are
+expanded, this requires a little more care, using now familiar tricks:
+**
+{\noexpands@
+ \edef\next@{\toks@={\ifx\Thepref@\empty\else
+ \Thepref@\null. \fi
+ \the\runningsectiontoks@}}%
+ \next@
+ \mark{\the\toks@}}
+**
+Here the *\edef\next@* makes *\next@* mean
+\setbox0\hbox{\<*\section* number\>}
+\setbox1\hbox{\<*\section* title\>}
+**
+\toks@="box0. "box1
+**
+so that *\next@* actually assigns *\toks@* that value, and then
+**
+\mark{\the\toks@}
+**
+produces the *\mark*, with no further expansions. The whole definition is
+\CC**
+\expandafter\def\csname hl@1\endcsname#1{%
+ \global\insection@true
+"2
+ \medbreak
+ \ifrunningsection@\else\runningsectiontoks@{#1}\fi
+ \global\runningsection@false
+"2
+ \noindent@@
+"2
+ {\noexpands@
+ \edef\next@{\toks@{\ifx\Thepref@\empty\else
+ \Thepref@\null. \fi
+ \the\runningsectiontoks@}}\next@
+ \mark{\the\toks@}}%
+"2
+ {\locallabel@
+ {\hl@@F\ifx\thelabel@@\empty\else\thelabel@@\space\fi}\bf
+ \ignorespaces#1\unskip\punct@{\null.}\addspace@\enspace}%
+ \par\nobreak\smallskip}
+**
+
+*\section* is the only heading level that will produce *\mark*'s, except
+for *\chapter*, which emits *\mark{}*; so we should now define *\headline*.
+On odd-numbered pages this will usually involve *\botmark*, unless *\botmark*
+is empty, in which case we will use *\thechapter@*. However, *\botmark*
+being ``empty'' cannot be checked using the test *\ifx\botmark\empty*, which
+is never true, since *\botmark* is a primitive that is not equivalent to
+*\empty*.
+So we first define a routine
+\CC**
+\def\BotOrChap@#1\BotOrChap@{%
+ \def\next@{#1}\ifx\next@\empty\thechapter@
+ \else\ignorespaces#1\unskip\fi}
+**
+which will be used after an *\expandafter*
+in the definition
+\CC**
+\headline={\unlabel@ \noset@
+ \def\\{\unskip\space\ignorespaces}%
+ \ifpart@\hfil
+"2
+ \else
+ \iffirstchapterpage@\hfil
+"2
+ \else
+ \ifodd\pageno
+ \hfil
+ \smc\expandafter\BotOrChap@\botmark\BotOrChap@
+ \hfil
+ \llap{\tenpoint\folio}%
+"2
+ \else
+ \rlap{\tenpoint\folio}%
+ \hfil\smc\thechapter@
+ \hfil
+ \fi
+ \fi\fi}
+**
+The *\unlabel* and *\noset* are used in case some
+*\Reset* or *\Offset* or
+some *\label* or *\pagelabel*
+appeared within a *\chapter* or *\section* title. The
+definition of *\\* is provided for an unedited *\\* in a *\chapter* title.
+
+*\subsection*, *\topic* and *\subtopic* are handled just as in the *paper*
+style, so we won't repeat the definitions here.
+
+The initializations for *\chapter* are a little more complicated than
+in the *paper* style:
+\CC**
+\expandafter\def\csname HL@I1\endcsname{\Reset\hl11%
+ \Reset\tag1\Reset\claim1\Reset\Figure1\Reset\Table1%
+ \ifx\pref\empty\newpre\section{}\def\tag@P{}%
+ \def\claim@P{}\def\island@P{}%
+"2
+ \else
+ \newpre\section{\pref.}\edef\tag@P{\pref.}%
+ \edef\claim@P{\pref.}\edef\island@P{\pref.}%
+ \fi
+}
+**
+As before, we reset the *\section* counter to~*1* (there is no
+*\keepsection* command for this style). Moreover, we also
+want the numbering for displayed formulas, *\claim*'s, *\Figure*'s and
+*\Table*'s to be reset to~*1*. If *\pref* is *\empty* (only because
+the user has typed something like *\chapter""""*), then the ``pre'' material
+for *\section*, *\tag*, *\claim* and all types of *\island* numbers should
+be empty; otherwise it should be the *\chapter* number followed by a period.
+Notice that we explicitly use *\edef\tag@P{\pref.}*, \dots, rather than
+*\newpre*, since that takes less \tex\ processing, but we definitely want
+*\newpre\section*, since that takes care of *\newpre\hl1* automatically.
+
+The initializations for other heading levels are the same as in the *paper*
+style.
+
+\section{Footnotes}*\vfootnote@* is redefined exactly as in the *paper*
+style, to get footnotes in 8~point type.
+
+\section{Bibliography} Although *\makebib* isn't allowed in the *book* style,
+ *\UseBibTeX*
+is allowed, causing
+an *.aux* file to be written, on which \bibtex\ can operate, thereby creating
+a *.bbl* file that can be used by the ``back matter file''.
+ The definition
+from *lamstex.tex* has to be changed so that *\bibliography{...}* only
+writes *\bibdata{...}* to the *.aux* file, without trying to read the *.bbl*
+file. Also, *\bibliography@W* shouldn't be defined, since
+**
+\newword\bibliography
+**
+shouldn't be allowed in the main file, only in the back matter file.
+\CC**
+\def\UseBibTeX{%
+ \immediate\openout\auxwrite@=\jobname.aux
+ \let\cite=\BTcite@
+ \def\nocite##1{\immediate\write\auxwrite@
+ {\string\citation{##1}}}%
+ \def\bibliographystyle##1{\immediate\write\auxwrite@
+ {\string\bibstyle{##1}}}%
+ \def\bibliography##1{%
+ \immediate\write\auxwrite@{\string\bibdata{##1}}}}
+**
+
+
+\section{{\tt book.stf}}
+The front matter style file *book.stf* does not require a mechanism to
+prevent it from being read in twice. Aside for this, it
+begins with the same basic settings as
+*book.st* itself,
+ including the redefinition of *\makeheadline*
+and *\makefootline*.
+It also specifies
+\CC**
+\newnumstyle\page\roman
+**
+and
+then loads the same fonts as *book.st*,
+ and defines *\tenpoint* and *\eightpoint* as
+in that file.
+
+Two new fonts
+\CC**
+\font\Bf=cmbx10 scaled \magstep1
+\font\BF=cmbx10 scaled \magstep3
+**
+are also loaded; *\BF* is used for the `CONTENTS' headings, etc., while
+*\Bf* is used for the Part entries in the table of contents (Chapter entries
+will be printed in ordinary *\bf* and other heading level entries in *\rm*).
+
+Pages with *\BF* headings are handled specially, with no running heads, and
+page numbers at the bottom, and we have the flag
+\CC**
+\newif\ifspecialpage@
+**
+to indicate such pages.
+
+The material for running heads will be stored in *\headline@*, initialized by
+\CC**
+\let\headline@=\relax
+**
+
+The *\makepiece* command is supplied for special pieces like
+a Preface:
+\CC**
+\def\makepiece#1{\par\vfill\break
+ \global\specialpage@true
+ \gdef\headline@{\ignorespaces#1\unskip}%
+ \centerline{\BF\uppercase{\ignorespaces#1\unskip}}%
+ \vskip30pt plus10pt minus 10pt}
+**
+The argument *#1* is stored in *\headline@*, which will be used in the
+running heads of this piece, except for the first page.
+Here we assume that the heading fits on a single line. A variant
+**
+\makepiece#1\endmakepiece
+**
+command, allowing *\\* to indicate line breaks, could be specified in an
+obvious way. If this were allowed, then there should probably be
+a
+**
+\runningpiece
+**
+command to specify a shortened form for the running heads. This would work
+like the *\runningchapter* command.
+
+As with *paper.st*, for *\maketoc*
+we now how to include many of the definitions from
+*lamstex.stf*:
+\CC**
+\def\dotleaders ...
+\def\Page@ ...
+\long\def\widerthanhsize@ ...
+"2
+\long\def\setentry@ ...
+"2
+\def\endstrut@ ...
+\newdimen\thehang@
+"2
+\long\def\longentry@ ...
+"2
+\newif\ifemptynumber@
+\def\Style@ ... . . . \def\Style@@@@ ...
+**
+*\digits* isn't used, because the *\hl* entries are set differently.
+
+Because the *\Style@ . . . \Style@@@@* complex involves *\style*, which
+will be set to *\HL@@S* or *\hl@@S*, we need to provide definitions
+for all cases that will occur:
+\CC**
+\expandafter\def\csname HL@S0\endcsname#1{#1\/}
+\expandafter\def\csname HL@S1\endcsname#1{#1\null.}
+\expandafter\def\csname hl@S1\endcsname#1{#1\null.}
+\expandafter\def\csname hl@S2\endcsname#1{#1\null.}
+\expandafter\def\csname hl@S3\endcsname#1{#1\/}
+\expandafter\def\csname hl@S4\endcsname#1{#1\/}
+**
+
+As in *paper.st*, we
+\CC**
+\def\maketoc@W{Contents}
+**
+We will also need a new flag
+\CC**
+\newif\ifbib@
+**
+for one part of the contents.
+
+The definition of *\maketoc* is something of a cross between the
+definitions in *lamstex.stf* (page~\ref{STFMAKETOC})
+and *paper.st* (section~\Sref{Pmaketoc}), adding extra information
+needed for running heads and *\footline*:
+\setbox0\hbox{\<extra material to set any}
+\setbox1\hbox{ *\makebib* and *\makeindex* entries\>}
+\CC**
+\def\maketoc{\checkmainfile@\par\vfill\break
+ \begingroup
+ \unlabel@ . . . \lineskiplimipt=0pt
+ \def\HL ... \def\hl ...
+ \def\NameHL ... \def\Namehl ...
+ \NameHL0\part . . . \Namehl4\subtopic
+ "box0
+ "box1
+ \global\specialpage@true
+ \gdef\headline@{\maketoc@W}%
+ \centerline{\BF\uppercase\expandafter\maketoc@W}}%
+ \vskip30pt plus10pt minus10pt
+ \input\mainfile@.toc
+ \endgroup}
+**
+
+The \<extra material\> starts with
+**
+\def\makebib##1\Page##2##3##4##5{\bigbreak\bigskip\bigskip
+ \setentry@{\Bf##1}{}{\dotleaders}%
+ {\Page@{##2}{##3}{##4}{##5}}%
+ \bib@true}%
+**
+This definition is added for the situation where a *\makebib*
+in the ``back matter file'' (see the next section) creates an entry in the
+*.toc* file for the back matter file, which is then transferred to the
+*.toc* file for the main file.
+
+Then we
+**
+\let\biliography=\makebib
+**
+in case
+ *\bibliography* appears instead of *\makebib*; this is for the situation
+where
+ *\UseBibTeX*
+appeared in the main file, so that a *.bbl* file was created, and the
+corresponding entry in the *.toc* file for the back matter file was
+transferred to the *.toc* file for the main file.
+
+Similarly, we add
+**
+\def\makeindex##1\Page##2##3##4##5{\ifbib@\bigskip\else
+ \bigbreak\bigskip\bigskip\fi
+ \setentry@{\Bf##1}{}{\dotleaders}%
+ {\Page@{##2}{##3}{##4}{##5}}}}%
+**
+ in case a *\makeindex*
+in the *.toc* file for the back matter file is transferred to the
+*.toc* file for the main file. Note that the spacing before this entry
+depends on whether or not a *\makebib* or *\bibliography* has already
+appeared.
+
+The definition of *\HL* in the above definition
+has an extra clause for *\part*'s:
+**
+\ifnum\HLlevel@=0
+ \bigbreak\bigskip
+"2
+ \begingroup
+ \def\\{\unskip\space\ignorespaces}%
+"2
+ \setentry@{\Bf\def\next@{##2}\ifx\next@\empty\else
+ \uppercase{##2} \fi
+ \let\style=\HL@@S\hbox to35pt{\Style@##3\Style@\hss}\ifemptynumber@
+ \nobreak\hskip-35pt\fi
+ \uppercase{\ignorespaces##4\unskip}}{}\hfil{}%
+"2
+ \endgroup
+ \nobreak\smallskip
+"2
+\else
+\ifnum\HLlevel@=1
+ . . .
+\else
+ \Err@ ...
+\fi}
+**
+So the first argument of *\setentry@* contains the
+\medskip\font\Bf=cmbx10 scaled \magstep1
+\leftline{\Bf PART \hbox to35pt{I\hfil} PART TITLE}
+\medskip
+\noindent
+with the Part title, in *\uppercase*,
+starting 35~points from the word `PART' (but if there is no part number,
+we *\hskip* back 35~points). We use\linebreak
+*\uppercase{#2}*, since, as mentioned on
+page~\ref{UCPART}, the *.toc* file has
+ `*\HL@W0*', which is `*Part*', rather than `*PART*', allowing other
+front matter style files to handle things differently.
+ The second argument (which normally would
+be the part title) is empty; the third argument, normally *\dotleaders*
+is *\hfil*, and the fourth argument, normally *\Page...* is also empty, so
+that `Part' entries are printed without dot leaders or page numbers.
+
+\medskip
+
+Similarly, the definition of *\makelist* in *book.stf*
+is almost the same as that in
+*lamstex.stf*, except that we add
+**
+\global\spsecialpage@true
+\gdef\headline@{\ignorespace#2\unskip}
+**
+and use
+**
+\BF\baselineskip=22pt
+**
+for setting the heading instead of *\bf*.
+
+Finally, *\footline* and *\headline* are reset as in *book.st*, except
+using the flag *\ifspecialpage@* rather than the flags *\ifpart@*
+and\linebreak
+*\iffirstchapterpage@*.
+
+\section{{\tt book.stb}}
+The back matter style file *book.stb* also begins with the same basic
+settings as *book.st*, except that redefinition of *\makeheadline* and
+*\makefootline* is deferred; and then it loads the same fonts as before.
+
+Then we have numerous definitions from *lamstex.stb*:
+\CC**
+\def\adjustpunct@ ...
+\def\ignorepars@ ...
+\def\ignorepars@@ ...
+"2
+\newcount\ctype@
+\newcount\Ctype@
+"2
+\newif\ifleftcolbreak@
+\def\cbreak@ ...
+"2
+\newif\ifletter@
+\newtoks\marktoks@i . . . \newtoks\marktoks@v
+"2
+\newif\ifentry@
+\newcount\dii@
+\def\Topage@ ...
+**
+as well as
+\CC**
+\newdimen\pageheight@
+\pageheight@=\vsize
+"2
+\newdimen\doublepageheight@
+\doublepageheight@=2\pageheight@
+\advance\doublepageheight@ by 1pc
+"2
+\newdimen\pagewidth@
+\pagewidth@=\hsize
+**
+and then we redefine *\makeheadline* and *\makefootline* in terms
+of *\pagewidth@*:
+\CC**
+\def\makeheadline{%
+ \hbox{\botsmash{\hbox to\pagewidth@
+ {\vbox to8.5pt{}\the\headline}}}%
+ \nointerlineskip\vskip26pt}
+\def\makefootline{\baselineskip=2.5pc\relax
+ \hbox to \pagewidth@{\the\footline}}
+**
+
+As in *lamstex.stb*,
+we will need a new flag for the first page of the index,
+\CC**
+\newif\iffirstindexpage@
+**
+
+Recall that in *lamstex.stb* it is the definition of *\combinecolumns@*
+that actually prints the heading at the top of the first page.
+The same is true in *book.stb*, so we first
+\CC**
+\def\makeindex@W{Index}
+**
+and declare the font
+\CC**
+\font\Bf=cmbx10 scaled \magstep1
+**
+Then the definition of *\combinecolumns@* from *lamstex.stb* is modified as
+follows:
+\CC**
+\def\combinecolumns@{%
+ \setbox\outbox@=\vbox{\makeheadline
+ \vbox to\pageheight@{\boxmaxdepth=\maxdepth
+ \iffirstindexpage@
+ \vbox to30pt{%
+ \hbox to\pagewidth@{\hfil\Bf
+ \uppercase\expandafter{\makeindex@W}\hfil}%
+ \vfil}%
+ \nointerlineskip
+ \fi
+ \wd0=\hsize \wd2=\hsize
+ \setbox0=\hbox to\pagewidth@{\box0 \kern1pc \box2}%
+ \dimen@=\dp0 \box0 \kern-\dimen@\vfill}%
+ \makefootline}%
+ {\noexpands@\let\style=\relax
+ \shipout@\box\outbox@
+ }%
+ \global\vsize=\doublepageheight@
+ \global\firstindexpage@false
+ \advancepageno}
+**
+
+Then we continue with other material from *lamstex.stb*:
+\CC**
+\newdimen\prevcoldepth@
+\def\doublecolumns@ ...
+\def\continue@ ...
+\newif\ifshortlastcolumn@
+\def\balancecolumns@ ...
+**
+
+With these definitions---used mainly for the index---out of the way, we
+first start on the bibliography.
+
+As with *book.stf*, we need
+\CC**
+\newif\ifspecialpage@
+\let\headline@=\relax
+**
+The definition of *\makebib* is similar to that in *paper.st*, except
+that we also write to the *.toc* file (compare page~\ref{XXZZXX}):
+\C**
+\def\makebib{\par\vfill\break
+ \global\specialpage@true
+ \gdef\headline@{\makebib@W}%
+"2
+ \begingroup
+"2
+ \eightpoint
+"2
+ \sfcode`\.=1000 \everypar{}\parindent=0pt
+"2
+ \def\nopunct{\nopunct@true} \def\nospace{\nospace@true}%
+ \nopunct@false\nospace@false
+"2
+ \def\lkerns@{\null\kern-1sp\kern1sp}%
+ \def\nkerns@{\null\kern-2sp\kern2sp}%
+"2
+ \hbox to\pagewidth@
+ {\hfil\Bf\uppercase\expandafter{\makebib@W}\hfil}%
+"2
+ \iftoc@
+ \expandafter\unmacro@\meaning\makebib@W\unmacro@
+ {\noexpands@
+ \edef\next@{\write\toc@{\noexpand\noexpand
+ \noexpand\makebib{\macdef@}}}\next@}%
+ \write\toc@{\noexpand\Page
+ {\number\pageno}{\page@N}{\page@P}{\page@Q}^^J}%
+ \fi
+ \nobreak\bigskip}
+**
+
+\medskip
+
+If *\UseBibTeX* was specified in the main file, and a *.bbl* file
+was created, then instead of a *\makebib"allowbreak..."allowbreak\endmakebib*
+region, the user can simply type
+**
+\bibliography
+**
+(but with no argument).
+
+We will need to define
+\CC**
+\def\bibliography@W{Bibliography}
+**
+so that
+**
+\newword\bibliography
+**
+can be used prior to this (in *lamstex.tex* this definition is
+made by\linebreak
+*\UseBibTeX*, which won't appear in the back matter file).
+
+The redefinition of *\bibliography*, with no argument, will begin
+with\linebreak
+*\checkmainfile@*, since *\mainfile@.bbl* is the file we will want to
+*\input*:
+\CC**
+\def\bibliography{\checkmainfile@
+ \immediate\openin\bbl@=\mainfile@.bbl
+ \ifeof\bbl@
+ \W@{No .bbl file}%
+ \else
+ \immediate\closein\bbl@
+ \begingroup
+ \input bibtex
+ \input\mainfile@.bbl
+ \endgroup
+ \fi}%
+**
+
+Recall that *bibtex.tex* defines *\begin{thebibliography}{...}* in\linebreak
+ terms
+of *\begingthebibliography@{...}*, which now has to be redefined to give
+the same sort of information and formatting as *\makebib* for this file:
+\CC**
+\def\beginthebibliography@#1{\par\vfill\break
+ \global\specialpage@true
+ \gdef\headline@{\makebib@W}%
+"2
+ \eightpoint
+ \setbox0=\hbox{#1\ }\bibindent@=\wd0
+ \sfcode`\.=1000 \everypar{}\parindent=0pt
+"2
+ \hbox to\pagewidth@
+ {\hfil\Bf\uppercase\expandafter{\bibliography@W}\hfil}%
+"2
+ \iftoc@
+ \expandafter\unmacro@\meaning\makebib@W\unmacro@
+ {\noexpands@
+ \edef\next@{\write\toc@{\noexpand\noexpand
+ \noexpand\bibliography{\macdef@}}}\next@}%
+ \write\toc@{\noexpand\Page
+ {\number\pageno}{\page@N}{\page@P}{\page@Q}^^J}%
+ \fi
+ \nobreak\bigskip}
+**
+
+The definition of *\makeindex* is virtually the same as in *lamstex.stb*,
+except that we again write to the *.toc* file, and set up information for
+the heading levels and foot line,
+\setbox0\hbox{\<material from *lamstex.stb* definition,}
+\setbox1\hbox{\qquad starting with *\let\asterisk="1*, and}
+\setbox2\hbox{\qquad ending with *\def\shortlastcolumn* ... \>}
+\CC**
+\def\makeindex{\checkmainfile@\par\vfill\break
+ \iftoc@
+"2
+ \expandafter\unmacro@\meaning\makeindex@W\unmacro@
+"2
+ {\noexpands@
+ \edef\next@{\write\toc@{\noexpand\noexpand
+ \noexpand\makeindex{\macdef@}}}\next@}%
+"2
+ \write\toc@{\noexpand\Page
+ {\number\pageno}{\page@N}{\page@P}{\page@Q}^^J}%
+ \fi
+"2
+ \global\specialpage@true
+"2
+ \global\firstindexpage@true
+"2
+ \gdef\headline@{\makeindex@W}%
+"2
+ \begingroup
+"box0
+"box1
+"box2
+"2
+ \hsize=14pc
+"2
+ \global\vsize=\doublepageheight@
+"2
+ \maxdepth=\maxdimen
+"2
+ \global\firstindexpage@true
+"2
+ \global\advance\vsize by -60pt
+"2
+ \everypar{}\parindent=0pt
+"2
+ \eightpoint
+ \rightskip=0pt plus3em
+ \spaceskip=.3333em \xspaceskip=.5em
+ \output={\doublecolumns@}%
+ \input\mainfile@.xdx
+ \mark{}%
+ \output={\balancecolumns@}\vfil\break\endgroup
+ \global\vsize=\pageheight@}
+**
+
+And then we reset *\headline* and *\footline*, as in *book.stf*.
+
+
+\chapter The {\tt letter} style\endchapter
+The \lamstex\ *letter.st* is based on the format for business letters
+discussed at the beginning of Appendix~E of {\it The \tex book}, with numerous
+added features, and some change of notation.
+
+
+The letter format in {\it The \tex book\/} has the unfortunate feature that
+*plain* \tex's *\item* command doesn't work well, since it indents by
+*\parindent*, which is~*0pt* in this format. Fortunately, that problem
+doesn't occur with \lamstex's *\list \item ...* command. We do change
+*\listbi@* to
+**
+\def\listbi@{\penalty50 \bigskip}
+**
+(the default value has a *\medskip* instead), since this seems to look better
+when *\parindent* is ~*0pt*.
+
+Although there are several
+interesting features in *letter.st*,
+ most of them have almost nothing to do with
+\lamstex\ in general, so we won't discuss them here.
+
+
+\chapter The {\tt amsppt} style\endchapter \ No newline at end of file