% TUGBOT.STY
% Version 0.5; 1.0 expected Nov. 1 1989
 
% general items
 
\def\makeatletter{\catcode`\@=11 }
\makeatletter           % used, as in PLAIN, in protected control sequences
 
\ifx\tugstyloaded@\relax\makeatother\initializearticle
 \endinput\else\let\tugstyloaded@\relax\fi
 
 
\input tugbot.com
 
%      Stuff different from PLAIN, or reiterated for clarity
 
\newlinechar=`\^^J
 
%\def~{\penalty\@M \ } % tie -- this is PLAIN value; it is reset in AMS-TeX
\def~{\unskip\nobreak\ \ignorespaces} % AMS-TeX value
 
\normallineskiplimit=1pt
 
\def\,{\ifmmode\mskip\thinmuskip\else$\,$\nobreak\fi}
 
 
\def \NoParIndent{\parindent=0pt}
\newdimen\normalparindent        \normalparindent=20pt          % plain = 20pt
\def \NormalParIndent{\global\parindent=\normalparindent}
\NormalParIndent
 
\def\vellipsis{%
  \leavevmode\kern0.5em
  \raise1pt\vbox{\baselineskip6pt\vskip7pt\hbox{.}\hbox{.}\hbox{.}}
  }
 
%       some things with the same names as in, or reiterated from, AMS-TeX
 
\def \document{}                % override an AMS-TeX convention
 
\output{\output@}
 
%       for compatibility with LaTeX
 
\def\clearpage{\newpage}
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                       ***** fonts and friends *****                         %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
%       Struts give ascenders and descenders to assist in baseline alignment
%       (e.g. of adjoining vertical boxes); useful only with text fonts.
%
%       \strut is defined in PLAIN .  The structure of \strutt is equivalent.
 
\newbox\struttbox
\def\strutt{\relax\ifmmode\copy\struttbox\else\unhcopy\struttbox\fi}
 
%       Struts are given the following dimensions for use in TUGboat:
%
%               \strut = height/depth of parenthesis in current font
%                        (not the same as PLAIN)
%               \strutt height + depth = \normalbaselineskip,
%                        height = same as \strut
%                        (equivalent to PLAIN \strut )
 
 
%       The fonts below are sufficient for most ordinary TUGboat production.
%       Additional titling fonts are defined elsewhere, and occasionally an
%       extra font will be needed for a particular item (e.g. the device
%       charts) and defined in that file.
 
%       All PLAIN CM fonts.
 
\font\tenrm=cmr10
\font\ninerm=cmr9
\font\eightrm=cmr8
\font\sevenrm=cmr7
\font\sixrm=cmr6
\font\fiverm=cmr5
 
\font\teni=cmmi10 \skewchar\teni='177
\font\ninei=cmmi9 \skewchar\ninei='177
\font\eighti=cmmi8 \skewchar\eighti='177
\font\seveni=cmmi7 \skewchar\seveni='177
\font\sixi=cmmi6 \skewchar\sixi='177
\font\fivei=cmmi5 \skewchar\fivei='177
 
\font\tensy=cmsy10 \skewchar\tensy='60
\font\ninesy=cmsy9 \skewchar\ninesy='60
\font\eightsy=cmsy8 \skewchar\eightsy='60
\font\sevensy=cmsy7 \skewchar\sevensy='60
\font\sixsy=cmsy6 \skewchar\sixsy='60
\font\fivesy=cmsy5 \skewchar\fivesy='60
 
\font\tenex=cmex10
\font\tenbf=cmbx10
\font\ninebf=cmbx9
\font\eightbf=cmbx8
\font\sevenbf=cmbx7
\font\sixbf=cmbx6
\font\fivebf=cmbx5
 
\font\tentt=cmtt10
\font\ninett=cmtt9
\font\eighttt=cmtt8
 
\font\tensl=cmsl10
\font\ninesl=cmsl9
\font\eightsl=cmsl8
\font\sevensl=cmsl8 scaled 900
 
\font\tenit=cmti10
\font\nineit=cmti9
\font\eightit=cmti8
\font\sevenit=cmti7
 
\font\tenupit=cmu10
 
\font\tensmc=cmcsc10
 
\font\tentex=cmtex10
 
\def \mit{\fam\@ne}
\def \cal{\fam\tw@}
\def \sy{\cal}          % old name
 
%       fonts added for TUGboat
 
%       TUGboat section heads
\font \seventeenssb=cmssbx10 scaled \magstep3
\font \twelvessb=cmssbx10 scaled \magstep1
\font \tenssb=cmssbx10
 
%       For cmss fonts not needed all the time, permit as-needed access
\def\LoadSansFonts{%
        \global\font\twelvess=cmss10 scaled \magstep1
        \global\font\tenss=cmss10
        \global\font\niness=cmss9
        \global\font\eightss=cmss8
        \AddToTenPoint{\def\ssf{\tenss}}
        \AddToNinePoint{\def\ssf{\niness}}
        \AddToEightPoint{\def\ssf{\eightss}}
        \gdef\LoadSansFonts{}}
 
\newfam\titlefam
\newdimen\titlefontbaselineskip         \titlefontbaselineskip=18pt
\def \titlefont{\textfont\titlefam=\seventeenssb
        \scriptfont\titlefam=\twelvessb \scriptscriptfont\titlefam=\tenssb
        \fam\titlefam \seventeenssb \baselineskip=\titlefontbaselineskip }
 
%       Definitions of \tenpoint, \ninepoint, etc.
%
%       Planned additions and changes:
%
%       Dynamic loading of fonts, probably in groups according to size
%       Removal of \rm, \bf, etc., from \*point expansions, replacement
%               by generic \rm, \bf, etc. definitions
%       Mechanism for switching neatly between serif and sans-serif
 
%       Following will allow text to be a bit stretchier than the built-in
%       setting; TeXbook, page 433, 355
 
\newdimen\normaltenptstretch    \normaltenptstretch=1.6667pt
\newdimen\extratenptstretch     \extratenptstretch=4pt
\def\NormalTenPointSpacing{\fontdimen3\tenrm=\normaltenptstretch
                \fontdimen3\tenit=\normaltenptstretch}
\def\StretchyTenPointSpacing{\fontdimen3\tenrm=\extratenptstretch
                \fontdimen3\tenit=\extratenptstretch}
 
\newskip\ttglue
\def\setttglue{\tt \global\ttglue=.5em plus .25em minus .15em}
 
\def \tenpoint{\normalbaselineskip=12pt         % \def\pointsize@AmS{t}
        \abovedisplayskip=3pt plus 3pt minus 1pt
        \belowdisplayskip=3pt plus 3pt minus 1pt
        \abovedisplayshortskip=0pt plus 3pt
        \belowdisplayshortskip=1pt plus 3pt minus 1pt
        \def\rm{\fam\z@\tenrm}%
        \textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
        \def\oldstyle{\fam\@ne\teni}%
        \textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
        \textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
        \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
        \def\it{\fam\itfam\tenit}%
        \textfont\itfam=\tenit \scriptfont\itfam=\sevenit
        \def\sl{\fam\slfam\tensl}%
        \textfont\slfam=\tensl \scriptfont\slfam=\sevensl
        \def\bf{\fam\bffam\tenbf}%
        \textfont\bffam=\tenbf \scriptfont\bffam=\eightbf
                \scriptscriptfont\bffam=\sixbf
        \def\smc{\tensmc}%
        \def\tt{\tentt}%
        \setttglue
        \def\upright{\tenupit}%
        \setbox\strutbox=\hbox{\vrule height7.5pt depth2.5pt width\z@}%
        \setbox\struttbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}%
        \normalbaselines \the\@AdditionsToTenPoint \rm }
 
%       permit external additions to pointsize definition
\newtoks\@AdditionsToTenPoint
\def \AddToTenPoint#1{%
  \@AdditionsToTenPoint=\expandafter{\the\@AdditionsToTenPoint#1}}
 
\tenpoint                       % initialize -- default font
 
 
\newdimen\normalnineptstretch   \normalnineptstretch=1.5pt
\newdimen\extranineptstretch    \extranineptstretch=3.6pt
\def\NormalNinePointSpacing{\fontdimen3\ninerm=\normalnineptstretch}
\def\StretchyNinePointSpacing{\fontdimen3\ninerm=\extranineptstretch}
 
\def \ninepoint{\normalbaselineskip=11pt
        \abovedisplayskip=2.5pt plus 2.5pt minus 1pt
        \belowdisplayskip=2.5pt plus 2.5pt minus 1pt
        \abovedisplayshortskip=0pt plus 2.5pt
        \belowdisplayshortskip=1pt plus 2.5pt minus 1pt
        \def\rm{\fam\z@\ninerm}%
        \textfont0=\ninerm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
        \def\oldstyle{\fam\@ne\ninei}%
        \textfont1=\ninei \scriptfont1=\seveni \scriptscriptfont1=\fivei
        \textfont2=\ninesy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
        \def\it{\fam\itfam\nineit}%
        \textfont\itfam=\nineit
        \def\sl{\fam\slfam\ninesl}%
        \textfont\slfam=\ninesl
        \def\bf{\fam\bffam\ninebf}%
        \textfont\bffam=\ninebf \scriptfont\bffam=\sevenbf
                \scriptscriptfont\bffam=\sixbf
        \def\smc{\ninesmc}%
        \def\tt{\ninett}%
        \setttglue
        \setbox\strutbox=\hbox{\vrule height 6.75pt depth 2.25pt width\z@}%
        \setbox\struttbox=\hbox{\vrule height 7.75pt depth 3.25pt width\z@}%
        \normalbaselines \the\@AdditionsToNinePoint \rm }
 
%               this is equivalent to baselineskip = 10pt
%       \setbox\struttbox=\hbox{\vrule height 7.25pt depth 2.75pt width\z@}%
 
\newtoks\@AdditionsToNinePoint
\def \AddToNinePoint#1{%    permit external additions to font
  \@AdditionsToNinePoint=\expandafter{\the\@AdditionsToNinePoint#1}}
 
 
\newdimen\normaleightptstretch  \normaleightptstretch=1.333pt
\newdimen\extraeightptstretch   \extraeightptstretch=3pt
\def\NormalEightPointSpacing{\fontdimen3\eightrm=\normaleightptstretch}
\def\StretchyEightPointSpacing{\fontdimen3\eightrm=\extraeightptstretch}
 
\def \eightpoint{\normalbaselineskip=10pt
        \abovedisplayskip=2pt plus 2pt minus 1pt
        \belowdisplayskip=2pt plus 2pt minus 1pt
        \abovedisplayshortskip=0pt plus 2pt
        \belowdisplayshortskip=1pt plus 2pt minus 1pt
        \def\rm{\fam\z@\eightrm}%
        \textfont0=\eightrm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
        \def\oldstyle{\fam\@ne\eighti}%
        \textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei
        \textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
%       \textfont3=\eightex \scriptfont3=\eightex \scriptscriptfont3=\eightex
        \def\it{\fam\itfam\eightit}%
        \textfont\itfam=\eightit
        \def\sl{\fam\slfam\eightsl}%
        \textfont\slfam=\eightsl
        \def\bf{\fam\bffam\eightbf}%
        \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf
                \scriptscriptfont\bffam=\sixbf
        \def\smc{\eightsmc}%
        \def\tt{\eighttt}%
        \setttglue
        \setbox\strutbox=\hbox{\vrule height 6pt depth 2pt width\z@}%
        \setbox\struttbox=\hbox{\vrule height 7pt depth 3pt width\z@}%
        \normalbaselines \the\@AdditionsToEightPoint \rm }
 
%               this is equivalent to baselineskip = 9pt
%       \setbox\struttbox=\hbox{\vrule height 6.5pt depth 2.5pt width\z@}%
 
\newtoks\@AdditionsToEightPoint
\def \AddToEightPoint#1{%    permit external additions to font
  \@AdditionsToEightPoint=\expandafter{\the\@AdditionsToEightPoint#1}}
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                       *****  page dimensions  *****                         %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
\newdimen\trimlgt       \trimlgt=11in           % 10.5in (vols 7-9)
\newdimen\headmargin    \headmargin=3.5pc       % 2.5pc  (vols 7-9)
\newdimen\pagelgt
\newdimen\rheadlgt      \rheadlgt=2.5pc         % + headmargin = 6pc = 1in
\newdimen\toplgt        \toplgt=0pt
\newdimen\normalcollgt  \normalcollgt=54pc      % 52pc for 5#2
\newdimen\collgt        \collgt=\normalcollgt
\newdimen\Collgt
\maxdepth=2pt
\newdimen\botlgt        \botlgt=0pt
\newdimen\rfootlgt      \rfootlgt=2pc
 
\newif\ifThisIsFirstPage        \ThisIsFirstPagefalse
 
\def \resetpagelgt{\pagelgt=\collgt \Collgt=\collgt
        \advance\pagelgt by \rheadlgt
        \ifThisIsFirstPage \advance\Collgt by-\toplgt
                        \advance\Collgt by-\botlgt \fi
        \advance\pagelgt by \maxdepth
        \global\advance\pagelgt by \rfootlgt
        \global\vsize=\Collgt }
\def \resetfpagelgt{\global\ThisIsFirstPagetrue
        \resetpagelgt }                 % exclude special first page material
 
\resetpagelgt
\raggedbottom
 
\newdimen\colwd
\newdimen\pagewd        \pagewd=39pc
\newdimen\trimwd        \trimwd=\pagewd
 
\def \onecol{\colwd=\pagewd             \OneCol }
 
\newdimen\onenarrowcolwd        \onenarrowcolwd=30pc
\def \onenarrow{\colwd=\onenarrowcolwd  \OneCol }
 
%       before 5#2, `narrow' was 34pc
\newdimen\onemediumcolwd        \onemediumcolwd=34pc
\def \onemedium{\colwd=\onemediumcolwd  \OneCol }
 
\newdimen\twocolcolwd           \twocolcolwd=18.75pc
\def \twocol{\colwd=\twocolcolwd        \TwoCol }
 
\newdimen\threecolcolwd         \threecolcolwd=12pc
\def \threecol{\colwd=\threecolcolwd    \ThreeCol }
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                       *****      headers/footers      *****                 %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
\def \pagenoprefix{}
 
\def \rtitlex{\def\tubfont{\rm}\TUB, \volx }
\def \rtitle{\hbox to \pagewd{\tenrm
        \makestrut[10pt;\z@]%
        \ifodd\pageno \rtitlex\qquad\midrtitle\hfil\pagenoprefix\number\pageno
        \else \pagenoprefix\number\pageno\hfil\midrtitle\qquad\rtitlex \fi }}
 
\def \runhead{\vbox to \rheadlgt{\rtitle \vfil }}
\def \runfoot{%
  \vbox to \rfootlgt{
    \ifnum\xcol=2
      \hbox to \pagewd{\makestrut[1.5pc;\z@]\midrtitle\hfil\midrtitle}\fi
    \vfil }}
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                       *****       output      *****                         %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
%       In the absence of automatic column-balancing, provide a mechanism
%       for manually shortening a specified page.
 
\newif\ifSh@rtPage              \Sh@rtPagefalse
\newif\ifSh@rtPagePending       \Sh@rtPagePendingfalse
\newcount\Sh@rtPageNo
\newdimen\Sh@rtPageLgt
 
\def\@to{to}                    \def\@by{by}
%       #1 = to/by; #2 = \dimen; #3 = <dimen>; #4 = * of Shorten*Page
\def\@toby#1#2#3#4{\def\@tb{#1}%
        \ifx \@tb\@to \global #2=#3
        \else \ifx \@tb\@by \T@stDimen=#3         % accommodate negative #3
                        #2=\normalcollgt \global\advance #2 by -\T@stDimen
                \else \errmessage{#1 is invalid syntax; \string\Shorten#4Page
                                requires "to" or "by"}\fi
        \fi }
 
\def\@plusno#1#2;{\if +#1\T@stCount=\pageno \advance\T@stCount by #2
                        \else \T@stCount=#1#2 \fi }
 
\def \ShortenPage #1 #2 #3. {\global\Sh@rtPagePendingtrue
%               \global\Sh@rtPageNo=#1
                \@plusno#1;\global\Sh@rtPageNo=\T@stCount
                \@toby{#2}{\Sh@rtPageLgt}{#3}{}}
\def \ShortenThisPage #1 #2. {\global\Sh@rtPagetrue
                \@toby{#1}{\vsize}{#2}{This}}
 
%       Two cases: 0 = last page was nonstandard; reset \vsize
%                  1 = do not reset \vsize: okay or length already reset
\def \D@EndPage{\global\advancepageno
        \T@stCount=1
        \ifThisIsFirstPage \T@stCount=0 \global\ThisIsFirstPagefalse
                        \resetfirsthead \resetfirstfoot
                        \global\collgt=\normalcollgt \fi
        \ifSh@rtPage \T@stCount=0 \global\Sh@rtPagefalse \fi
        \ifSh@rtPagePending
                \ifnum\pageno = \Sh@rtPageNo \T@stCount=1
                        \global\vsize=\Sh@rtPageLgt
                        \global\Sh@rtPagePendingfalse
                        \global\Sh@rtPagetrue \fi
        \fi
        \ifcase \T@stCount \resetpagelgt \fi }
 
% Add more powerful means of adjusting pages by keeping a list of
% commands to be executed prior to making up the next page.  This
% technique will be expanded in the next version of the output
% routine.
 
% "\DelayedCommand <page number> <column number> <command>\endCommand"
% places the token list <command> at the end of a list of "things to do".
% At the end of every column, the output routine checks this list to
% see whether the head of the list should be "executed" prior to
% building the next column.  If so, the execution is performed.
% Right now, items must be placed in the execution list in order,
% and all items for a given column must be combined into a single
% token list.
 
% Natural applications are double column figures and column size
% adjustments.  E.g.
% \DelayedCommand +5 1 \global\advance\vsize by 2\baselineskip\endCommand
% will increase the \vsize of the first column of the page 5 pages from
% "now" by 2 baselines.  To pull the \vsize back to normal would require
% another use of \DelayedCommand.  Double column figures can be achieved
% with insertions called by \DelayedCommand.
 
% Right now the technique is messy, but it can be used by those who know
% how it's implemented and know its limitations.
 
\newtoks\@DelayedCommandList
 
\def\DelayedCommand #1 #2 #3\endCommand{%
  \@plusno#1;%
  \edef\@temp{\the\@DelayedCommandList<\number\T@stCount>}%
  \global\@DelayedCommandList=\expandafter{\@temp<#2>#3\endCommand}%
  }
 
\def\@FindNextDCPoint <#1><#2>#3\endList{%
  \def\DCpage{#1}\def\DCcolumn{#2}}
 
\def\FindNextDCPoint{%
  \edef\@temp{\the\@DelayedCommandList}%
  \ifx\@temp\empty \def\DCpage{10000}\def\DCcolumn{0}%
  \else
    \edef\@form{%
      \noexpand\@FindNextDCPoint\the\@DelayedCommandList\noexpand\endList}%
    \@form
  \fi}
 
\def\@ExecuteNextDC <#1><#2>#3\endCommand#4\endList{%
  \global\@DelayedCommandList={#4}%
  #3}
 
\def\ExecuteNextDC{%
  \FindNextDCPoint
  \ifnum \pageno=\DCpage \ifnum\xcol=\DCcolumn
    \edef\@form{%
      \noexpand\@ExecuteNextDC\the\@DelayedCommandList\noexpand\endList}%
    \@form
  \fi \fi}
 
 
 
 
%       Distinguish between laser printer output (for proofing and other
%       general use) and production, which uses a phototypesetter.
 
\newif\ifLaser                  \Lasertrue
 
 
%       Registration marks
 
\def \HorzR@gisterRule{\vrule height 0.2pt depth 0pt width 0.5in }
\def \DownShortR@gisterRule{\vrule height 0.2pt depth 1pc width 0.2pt }
\def \UpShortR@gisterRule{\vrule height 1pc depth 0pt width 0.2pt }
 
 
%               ``T'' marks centered on top and bottom edges of paper
 
\def \ttopregister{\dlap{%
        \hbox to \trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule
                        \HorzR@gisterRule \hfil \HorzR@gisterRule}%
        \hbox to \trimwd{\hfil \DownShortR@gisterRule \hfil}}}
\def \tbotregister{\ulap{%
        \hbox to \trimwd{\hfil \UpShortR@gisterRule \hfil}%
        \hbox to \trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule
                        \HorzR@gisterRule \hfil \HorzR@gisterRule}}}
 
\def \topregister{\ttopregister}
\def \botregister{\tbotregister}
 
 
%       All pages containing data are formatted by \midpage
 
\def \midpage#1{\vbox{\basezero
        \ifLaser \hrule height\z@ depth\z@ width\p@
                \vskip-\rheadlgt
        \else \vbox to \trimlgt \bgroup
                \topregister
                \vskip \headmargin
        \fi
        \vbox to \pagelgt{\basezero
                \ifnum\xcol=2 \runhead
                \else \vbox to \rheadlgt{}\fi
                \ifThisIsFirstPage \firsthead \fi
                \hbox to \pagewd{#1}%   % \vsize applied in \pagebody
                \ifThisIsFirstPage \firstfoot \fi
                \vfil           % if no depth, avoid underfull box
                \runfoot }%
        \ifLaser \else \vfill \botregister \egroup \fi}%
        \ifnum\xcol=2 \global\xcol=1 \D@EndPage
        \else \global\xcol=2 \fi
        \global\advance\spoolno by 1 }
 
%       The production version includes trim marks, which are required
%       on photographic paper, but are unsuitable for laser printer output.
%       The production version also generates 2 separate .dvi pages for each
%       logical page; these are overlaid photographically, and allow the
%       Alphatype to run more efficiently on 2-column pages.
%       For laser printer output, each page is output as a unit.
 
 
 
%               set up auxiliary `page numbers'
%               \pageno = \count0  as used in PLAIN
\countdef\xcol=1        \xcol=1
\countdef\spoolno=2     \spoolno=1
 
\def \newcol{\par\vfill\eject}
 
\newcount\numcols
 
\newif\ifOneColFormat
\newbox\SaveP@geBox
 
\def \OneCol{\hsize=\colwd \numcols=1
        \gdef\newpage{\par\vfill\eject}%
        \OneColFormattrue
        \gdef\output@{%
                \ifLaser \xcol=2 \shipout\midpage{\hfil\pagebody \hfil}%
                \else \shipout\midpage{\hfil\pagebody \hfil}%
                        \shipout\vbox to \trimlgt{\basezero
                                \topregister
                                \vskip\headmargin
                                \vbox to \pagelgt{\basezero
                                        \runhead
                                        \vfill }%
                                \vfill
                                \botregister }%
                        \D@EndPage
                        \global\xcol=1
                        \global\advance\spoolno by 1
                \fi
                \ExecuteNextDC }}
 
\def \TwoCol{\hsize=\colwd \numcols=2
        \gdef\newpage{\par\vfill\eject
                        \ifnum\xcol=2 \null\vfill\eject \fi }%
        \OneColFormatfalse
        \gdef\output@{% % use PLAIN's \pagebody instead of \box255
                \ifnum\xcol=1
                        \ifLaser \global\setbox\SaveP@geBox=\vbox{\pagebody}%
                                \global\xcol=2
                        \else \shipout\midpage{\pagebody \hfil}\fi
                \else \shipout\midpage{\ifLaser \box\SaveP@geBox \fi
                                \hfil\pagebody }\fi
                \ExecuteNextDC
                \ifnum\outputpenalty>-\@MM \else \dosupereject \fi }}
 
 
%       Three-column format is a hack.  Collect all column data and
%       ship it out in the third segment, but conform to the \midpage
%       convention that \xcol can never be greater than 2.
 
\newbox\SaveP@geTwoBox
 
\def \ThreeCol{\hsize=\colwd \numcols=3
        \gdef\newpage{\par\vfill\eject
                \loop \ifnum\xcol>1 \advance\xcol by 1
                        \hbox to \hsize{\hfill}\vfill\eject \repeat }%
        \OneColFormatfalse
        \gdef\output@{% % use PLAIN's \pagebody instead of \box255
                \ifnum\xcol=1
                        \global\setbox\SaveP@geBox=\vbox{\pagebody}%
                                \global\xcol=2
                \else \ifnum\xcol=2
                        \global\setbox\SaveP@geTwoBox=\vbox{\pagebody}%
                                \global\xcol=3
                        \else \ifLaser
                                \else \xcol=1 \shipout\midpage
                                        {\vbox to \vsize{\null\vfill}}\fi
                                \xcol=2
                                \shipout\midpage{\box\SaveP@geBox
                                        \hfil \box\SaveP@geTwoBox
                                        \hfil \pagebody }\fi
                \fi
                \ExecuteNextDC
                \ifnum\outputpenalty>-\@MM \else \dosupereject \fi }}
 
 
 
%       Reorganize \pagecontents from PLAIN to put footnotes at very
%       bottom of page, even if \raggedbottom.
 
\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
  \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
  \ifr@ggedbottom \kern-\dimen@ \vfil \fi
  \ifvoid\footins\else % footnote info is present
    \vskip\skip\footins
    \footnoterule
    \unvbox\footins\fi
  \ifvoid\botins\else
    \vskip\skip\botins
    \unvbox\botins\fi }
 
\newif\if@floatable     \@floatabletrue
\def\nofloat{\@floatablefalse}
 
% redefine \@ins to avoid the \par of PLAIN
\def\@ins{\begingroup\setbox\z@\vbox\bgroup} % start a \vbox
 
\newinsert\botins
\newif\ifp@ge \newif\if@mid \newif\if@bot
\def\topinsert{\@midfalse\p@gefalse\@botfalse\@ins}
\def\botinsert{\@midfalse\p@gefalse\@bottrue\@ins}
\def\midinsert{\@midtrue\@botfalse\@ins}
\def\pageinsert{\@midfalse\@botfalse\p@getrue\@ins}
\skip\botins=\z@
\count\botins=1000
\dimen\botins=\maxdimen
\def\endinsert{\egroup % finish the \vbox
  \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@
    \advance\dimen@12\p@ \advance\dimen@\pagetotal
    \if@floatable
      \ifdim\dimen@>\pagegoal\@midfalse\@botfalse\p@gefalse\fi\fi
    \fi
  \if@mid
    \vskip\abovedisplayskip
    \box\z@
    \vskip\belowdisplayskip
    \@asifbelowdisplay
  \else\insert\if@bot\botins\else\topins\fi
   {\penalty100 % floating insertion
    \if@bot\medskip\nobreak\fi
    \splittopskip\z@skip
    \splitmaxdepth\maxdimen \floatingpenalty\z@
    \ifp@ge \dimen@\dp\z@
      \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
    \else \box\z@\fi
    \if@bot\else\medskip\fi
   }%
  \fi\endgroup}
 
 
% **********************************************************************
%       Section titles and separators
 
\newskip\Tabskss
\Tabskss=0pt plus 1000pt minus 1000pt
\newskip\AboveTitleSkip  \AboveTitleSkip=12pt   % 10pt plus 2pt minus 2pt
\newskip\BelowTitleSkip  \BelowTitleSkip=8pt    % plus 1pt minus 1pt
 
\setbox\T@stBox=\hbox{\titlefont O}
\newdimen\stfontheight          \stfontheight=\ht\T@stBox
\newdimen\strulethickness       \strulethickness=.6pt
\newcount\n@stnum               \n@stnum=0
\def \sthrule{\hrule height\strulethickness depth 0pt }
\def \stvrule{\vrule height 2\stfontheight depth\stfontheight
                        width\strulethickness }
\def \sectitlebox #1<{\vbox{\sthrule
        \hbox to \hsize{\stvrule\hfil #1\hfil\vrule width\strulethickness }%
        \sthrule }}
 
\def \secsep{\vskip 5\baselineskip}
 
\newif\ifSecTitle
\SecTitlefalse
 
\def \sectitle #1<{\par \SecTitletrue
        \penalty-1000\secsep
        \n@stnum=0
        {\def\\{ }\setbox\T@stBox=\hbox{\titlefont#1}%
        \ifdim\wd\T@stBox < \hsize \def\result{\unhbox\T@stBox}%
        \else \def\\{\cr\noalign{\global\advance\n@stnum by 1 }}%
                \setbox\T@stBox=\vbox{\titlefont
                        \halign{\hfil##\hfil\cr#1\crcr}}%
                \def\result{\vbox{\unvbox\T@stBox}}\fi
%        \ifnum\n@stnum=1 \def\stvrule{\vrule height 3.5\stfontheight
%                        depth\stfontheight width\strulethickness }\fi
        \ifnum\n@stnum>0 \def\stvrule{\T@stDimen=\n@stnum\titlefontbaselineskip
                        \advance\T@stDimen by-\titlefontbaselineskip
                        \advance\T@stDimen by 3.5\stfontheight
                        \vrule height \T@stDimen depth\stfontheight
                                width\strulethickness }\fi
        \centerline{\sectitlebox \titlefont\result<}}%
        \nobreak \vskip\baselineskip }
 
%\def \secsep{\vskip\baselineskip       %  * * *  as for TUGboat pre 5#2
%       \centerline{\hbox to 180pt{%
%               \leaders\hbox to 15pt{\hfil\char'052\hfil}\hfill}}%
%       \vskip2\baselineskip }
 
\def \littlesep{\vskip 3pt plus 1pt minus 1pt
        \centerline{\hbox to 90pt{\ignorespaces
                \leaders\hbox to 10pt{\hfil .\hfil}\hfill} }%
        \vskip 3pt plus 1pt minus 1pt}
 
 
 
 
% **********************************************************************
%
%    General mechanism for tags
 
 
% Short Form Tagging.
% We specify a character (*) to be used as a begin/end delimiter
% for the argument to most tags.  This code could be copied and
% altered a bit to use another character.
 
\newtoks\@activeShortFormDelimiter
\def\AstChar{*}
 
{\makeactive\*
\gdef\makeastSFD{%
  \@activeShortFormDelimiter={*}%
  \edef\@ShortFormDelimiter{\AstChar}%
  \expandafter\let\expandafter\@@ShortFormDelimiter\AstChar
  }
}
\makeastSFD
 
\let\@plainast=\ast
\def\ast{\ifmmode\@plainast\else \AstChar\fi}
 
 
% Checking ahead.
% Often we check ahead to see what course of action to take next.
% This is used to check for optional commands, to check for the
% short-form delimiter, and to ignore characters in certain
% situations.  This is just a check; applications must do whatever
% is appropriate with the ensuing token.
 
% The following checks the next token against argument #1.  If the
% two are the same, #2 is executed, otherwise #3.  The comparison is
% done with \ifx.  Since we check ahead with \futurelet, the first
% argument must be stored with \let as well.  To include the case
% where #1 may be a space, we have to go through a small contortion
% to \let\@basetoken= that space.
 
\long\def\@checknexttoken #1#2#3{%
  \def\?{\ifx\@basetoken}%
  \futurelet\@basetoken\?#1\fi
  \def\@todo{%
    \ifx \@nexttoken\@basetoken\def\@next{#2}\else\def\@next{#3}\fi\@next}%
  \futurelet\@nexttoken\@todo}
 
% Eliminating characters from input.
% The following check ahead to see whether the next token is a
% token to be parsed from the input stream.  \@ignoreall keeps
% checking to eliminate all such characters.  Argument #2 is
% executed afterwards.
 
% The token is removed by defining a control sequence whose
% contextual form includes the token.
 
        % execute #2 after ignoring (possibly) one occurrence of #1
\long\def\@ignoreone#1#2{%
  \def\@ignoreform#1{#2}%
  \@checknexttoken{#1}{\@ignoreform}{#2}%
  }
 
        % execute #2 after ignoring all occurrences of #1
\long\def\@ignoreall#1#2{%
  \def\@ignoreform#1{\@ignoretest}%
  \def\@ignoretest{\@checknexttoken{#1}{\@ignoreform}{#2}}%
  \@ignoretest
  }
 
% Particularly useful ignorances
 
        % execute #1 after ignoring spaces
\def\DeleteOptionalSpaces#1{%
  \@ignoreall{ }{#1}%
  }
        % execute #1 after ignoring spaces and \pars
\def\DeleteOptionalSpacesandPars#1{%
  \@ignoreall{ }{\@ignoreall{\par}{#1}}%
  }
 
        % execute #1 after ignoring active spaces
{\catcode`\ =\active
\gdef\DeleteOptionalActiveSpaces#1{\@ignoreall{ }{#1}}%
}
 
% Checking and reading options.
% To check for the next optional argument, the macros must usually look
% ahead to the next character, proceding accordingly depending on
% whether that character is a [.  This check may be suppressed if
% the user has executed the \lastoption option.  If \@lastoption is
% "true" or if the [ is NOT next, the macro goes on to reading any
% arguments and executing appropriately.
 
\def\@checkoptions{%
  \if@lastoption
    \def\@next{\@executetoend}%
  \else
    \def\@next{\@checknexttoken {[}{\@readoptions}{\@executetoend}}%
  \fi
  \@next
  }
 
% Default "options" on start-up: macros must examine input to
% determine when last option occurs and whether short-form is being used.
 
\newif\if@lastoption            \@lastoptionfalse
\def\lastoption{\@lastoptiontrue}
 
\newif\if@longform              \@longformfalse
\def\longform{\@longformtrue}
 
\newif\if@savingargument        \@savingargumentfalse
 
\newtoks\enddelim
 
 
\def\@defaultoptions{%
  \@lastoptionfalse
  \@longformfalse
  \@savingargumentfalse
  \enddelim=\expandafter{\csname end\CurrentTag\endcsname}%
  }
 
% To read an optional command, \catcodes of \ { } are restored to their plain
% values, and the [...] form is parsed out by \@@readoptions.  The argument
% to \@@readoptions is then executed, the 3 specials are restored and
% the we check again for [ after deleting spaces.
 
\def\@readoptions{%
  \savecat\\\makeescape\\%
  \savecat\{\makebgroup\{%
  \savecat\}\makeegroup\}%
  \@@readoptions}
 
\def\@@readoptions[#1]{%
  #1%
  \restorecat\\\restorecat\{\restorecat\}%
  \DeleteOptionalSpaces{\@checkoptions}%
  }
 
% Reading to the end-tag.
% Macros may just do their business after options have been
% read.  In this case, there is no end-tag to worry about.
% Otherwise, the macros either read to the "long-form" of end-tag
% (e.g. \endtitle or \endauthor) or pull out the argument delimited
% by the short-form delimiter.  Unless an option has specified
% that the long-form is to be used, the macros look ahead to
% see whether the short-form delimiter occurs next.  If so,
% it is assumed that the short-form is being used.
 
\newcount\@numarguments         \@numarguments=1
 
\def\@executetoend{%
  \ifnum\@numarguments>0
    \if@longform \def\@next{\@longparse}%
    \else
      \def\@next{\@checknexttoken
                  {\@@ShortFormDelimiter}{\@shortparse}{\@longparse}}%
    \fi
  \else
    \def\@next{\csname @begin\CurrentTag\endcsname}%
  \fi
  \@next
  }

% If the short-form is being used, we must define a "form" which
% TeX may follow to pull out the tag's argument.  This form is
% then called, the argument is stored away in the token register
% \@argument, and the appropriate end-operation is performed.
 
\newtoks\@argument
 
\def\@shortparse{%
  \if@savingargument
    \edef\@form{%
      \def\noexpand\@@shortparse\@ShortFormDelimiter####1\@ShortFormDelimiter}%
    \@form{\@argument{##1}\csname end\CurrentTag\endcsname}%
  \else
    \expandafter\makeactive\csname\@ShortFormDelimiter\endcsname
    \expandafter\def\the\@activeShortFormDelimiter
      {\csname end\CurrentTag\endcsname
       \expandafter\makeother\csname\@ShortFormDelimiter\endcsname}%
    \def\@@shortparse{%
      \expandafter\@ignoreone\expandafter{\@ShortFormDelimiter}%
        {\csname @begin\CurrentTag\endcsname}%
      }%
  \fi
  \@@shortparse}
 
% On the other hand, if the long form is used, TeX must parse to
% the long-form ending tag.  Ordinarily we know the ending-tag
% because it is just the \end... which corresponds to the tag
% which initiated the process.  We do allow for the possibility,
% however, that we may want to switch this for some reason. E.g.
% the different \verbatim styles allow for \verbatim...\endverbatim
% and ||...||.  The easiest way to implement the || style is
% to have the first || call \verbatim and have \verbatim know
% to look for || as the end-tag instead of \endverbatim.  This may
% be accomplished by allowing for the possibility of different
% end-tags as below.
 
\def\@longparse{%
  \if@savingargument
    \edef\@form{\def\noexpand\@@longparse####1\the\enddelim}%
    \@form{\global\@argument{##1}\csname end\CurrentTag\endcsname}%
  \else
    \def\@@longparse{%
      \csname @begin\CurrentTag\endcsname
      }%
  \fi
  \@@longparse
  }
 
 
% ********************************************************
% title, authors, addresses
 
% *****************
% title
 
\def\title{%
  \begingroup
  \def\CurrentTag{title}%
  \@defaultoptions
  \@savingargumenttrue
  \@checkoptions}
 
\def\endtitle{%
  \global\toks@=\expandafter{\the\@argument}%
  \endgroup
  \edef\thetitle{\ignorespaces\the\toks@\unskip}%
  }
 
% *****************
% authors
 
\newcount\authornumber
 
\def\author{%
  \begingroup
  \def\CurrentTag{author}%
  \global\advance\authornumber by 1
  \@defaultoptions
  \@savingargumenttrue
  \@checkoptions}
 
\def\endauthor{%
  \global\toks@=\expandafter{\the\@argument}%
  \endgroup
  \expandafter\edef\csname theauthor\number\authornumber\endcsname
      {\ignorespaces\the\toks@\unskip}%
  }
 
% *****************
% addresses
 
\def\address{%
  \begingroup
  \def\CurrentTag{address}%
  \@defaultoptions
  \@savingargumenttrue
  \let\@addressstyle=\@authorstyle
  \def\inline{\let\@addressstyle=\@inlinestyle}%
  \def\display{\let\@addressstyle=\@displaystyle}%
  \@checkoptions}
 
\def\endaddress{%
  \ifx\@addressstyle\@inlinestyle
    \def\\{, }\the\@argument
    \endgroup
    \def\@next{}%
  \else\ifx\@addressstyle\@displaystyle
    \par\raggedright
    \everypar={\hangindent 1.5\parindent}%
    \def\\{\endgraf}%
    \def\|{\unskip\hfil\break}%
    \vskip\abovedisplayskip
    \the\@argument\par
    \vskip\belowdisplayskip
    \@asifbelowdisplay
    \endgroup
    \def\@next{\ignorespaces}%
  \else
    \global\toks@=\expandafter{\the\@argument}%
    \endgroup
    \expandafter\edef\csname theaddress\number\authornumber\endcsname
      {\ignorespaces\the\toks@\unskip}%
    \def\@next{}%
  \fi \fi
  \@next
  }
 
% *****************
% network addresses
 
\def\netaddress{%
  \begingroup
  \def\CurrentTag{netaddress}%
  \@defaultoptions
  \@savingargumenttrue
  \let\@network\relax%
  \def\network##1{\def\@network{##1: }}%
  \@SpecialsGetOther
  \netaddrat
  \netaddrpercent
  \@checkoptions}
 
{\makeactive\@
 \gdef\netaddrat{\makeactive\@\def@{\char"40\discretionary{}{}{}}}
 \makeactive\%
 \gdef\netaddrpercent{\makeactive\%\def%{\char"25\discretionary{}{}{}}}
}
 
% We want the definition of \thenetaddress... to land at the right
% nesting level, so we have to first pull it to the top, then
% drop back to where we are.
 
\def\endnetaddress{%
  \global\toks@=\expandafter{\the\@argument}%
  \ifx\@network\relax
    \gdef\@@network{}%
  \else
    \xdef\@@network{\@network}%
  \fi
  \endgroup
  \expandafter\edef\csname thenetaddress\number\authornumber\endcsname
    {{\noexpand\rm\@@network}%
     {\noexpand\netaddrat\noexpand\netaddrpercent\noexpand\net
      \ignorespaces\the\toks@\unskip}}%
  }
 
\def\net{\tt}
 
% Overrides to default author and signature formats
 
\def\authorlist#1{\def\@authorlist{#1}}
\def\signature#1{\def\@signature{#1}}
 
\def\signaturemark{\leavevmode\llap{$\diamond$\enspace}}
 
\def\theauthor#1{\csname theauthor#1\endcsname}
\def\theaddress#1{\csname theaddress#1\endcsname}
\def\thenetaddress#1{\csname thenetaddress#1\endcsname}
 
\def\@defaultsignature{%
  \count@=0
  \loop
  \ifnum\count@<\authornumber
    \medskip
    \advance\count@ by \@ne
    \signaturemark
    \theauthor{\number\count@}\\
    \theaddress{\number\count@}\\
    \thenetaddress{\number\count@}\\
  \repeat
  }
 
\def\makesignature{%
  \par
  \rightline{%
    \vbox{\hsize=12pc \ninepoint \raggedright
      \parindent \z@ \everypar={\global\hangindent 1pc }
      \parskip \z@
      \netaddrat
      \netaddrpercent
      \def\|{\unskip\hfil\break}%
      \def\\{\endgraf}%
      \def\net{\tt}%
      \def\phone{\rm Phone: } \rm
      \bigskip
      \@signature}}
  }
 
 
\newcount\count@@
\def\article{%
  \@allowspanningfigsfalse
  \ifSecTitle \global\SecTitlefalse
  \else \vskip\AboveTitleSkip
    \kern\topskip
    \hrule height\z@ depth\z@ width 10pt
    \kern-\topskip
    \kern-\strulethickness
    \hrule height\strulethickness depth\z@
    \kern\medskipamount
  \fi
  \ifx\thetitle\relax
  \else
 
    \noindent{\def\\{\unskip\hfil\break}\raggedright\bf
              \ignorespaces\thetitle\unskip\par}%
  \fi
  \ifnum\authornumber>0
  \nobreak
  \vskip4pt
  {\def\\{\unskip\hfil\break}\hangindent\parindent\raggedright
   \@authorlist\par}
  \fi
  \nobreak
  \vskip \BelowTitleSkip
  \tenpoint
  \DeleteOptionalSpacesandPars{\noindent\ignorespaces}%
  }
 
\def\@defaultauthorlist{%
   \count@=\authornumber
   \advance\count@ by -2
   \count@@=0
   \loop
   \ifnum\count@>0
      \advance\count@@ by 1
      \ignorespaces\csname theauthor\number\count@@\endcsname\unskip,
      \advance\count@ by -1
   \repeat
   \count@=\authornumber
   \advance\count@ by -\count@@
   \ifnum\authornumber>0
     \ifnum\count@>1
       \count@=\authornumber
       \advance\count@ by -1
       \ignorespaces\csname theauthor\number\count@\endcsname\unskip\ and
       \fi
     \ignorespaces\csname theauthor\number\authornumber\endcsname\unskip
   \fi
  }
 
 
\def\endarticle{\vfil\end}                      % redefined in drivers
 
 
% ********************************************************
% Heads.
 
\newcount\headlevel     \headlevel=1
\newif\if@removeprewhite        \@removeprewhitefalse
\newif\if@removepostwhite       \@removepostwhitefalse
\def\removeprewhite{\@removeprewhitetrue}
\def\removepostwhite{\@removepostwhitetrue}
 
\def\head{%
  \begingroup
  \def\CurrentTag{head}%
  \@allowindentfalse
  \@defaultoptions
  \@savingargumenttrue
  \def\\{\break}%
  \@checkoptions}
 
\def\endhead{%
  \par
  \ifcase\headlevel\or
   \if@removeprewhite\else\vskip\baselineskip\fi
   \noindent{\raggedright\bf\ignorespaces\the\@argument\unskip\par}%
   \if@removepostwhite\else\kern0.5\baselineskip\fi
   \nobreak
   \gdef\@next{%
     \if@allowindent\def\@next{}%
     \else\def\@next{\DeleteOptionalSpacesandPars{\noindent\ignorespaces}}\fi
     \@next
   }%
  \or
   \if@removeprewhite\else\medskip\fi
   \noindent{\bf\ignorespaces\the\@argument\unskip.}\hskip0.5em
   \gdef\@next{\DeleteOptionalSpacesandPars{}}%
  \or
   {\bf\ignorespaces\the\@argument\unskip}\hskip0.5em
   \gdef\@next{\DeleteOptionalSpacesandPars{}}%
  \fi
  \endgroup
  \@next
  }
 
\def\subhead{\head[\headlevel=2]}
\def\subsubhead{\head[\headlevel=3]}
 
\newif\if@allowindent
\def\allowindent{\global\@allowindenttrue}
 
% *************************************************************************
% Text and subtext.
 
\newcount\textlevel     \textlevel=1
 
\def\text{%
  \begingroup
  \def\CurrentTag{text}%
  \@defaultoptions
  \@savingargumentfalse
  \@checkoptions}
 
\def\@begintext{%
  \par
  \ifcase\textlevel\or
  \or
    \vskip\abovedisplayskip
    \advance\leftskip by 0.5\parindent
    \advance\rightskip by 0.5\parindent
    \ninepoint\rm
  \fi
  }
 
\def\endtext{%
  \ifcase\textlevel\or
    \gdef\@next{}%
  \or
    \par
    \vskip\belowdisplayskip
    \@asifbelowdisplay
    \gdef\@next{\ignorespaces}%
  \fi
  \endgroup
  \@next
  }
 
\def\subtext{\text[\textlevel=2]}
 
\def\raggedcenter{%
  \dimen@=\leftskip
  \leftskip= 0pt plus 1000pt
  \advance\leftskip by \dimen@
  \dimen@=\rightskip
  \rightskip= 0pt plus 1000pt
  \advance\rightskip by \dimen@
  \parindent=0pt
  \parfillskip=0pt
  }
 
 
% *************************************************************************
% Lists.
 
\newcount\listlevel     \listlevel=1
\newif\if@itemized      \@itemizedtrue
\newif\if@numbered      \@numberedfalse
\newcount\itemnumber    \itemnumber=0
\newif\if@ruled         \@ruledfalse
\newtoks\@itemtag       \@itemtag={$\bullet$}
\newcount\@cols         \@cols=1
\newdimen\@listindent
\newdimen\@listhangindent
\newif\if@firstitem     \@firstitemtrue
\def\@itemseparator{, }
\def\tagform#1{\llap{#1\enspace}}
\newdimen\outerparindent
 
\def\list{%
  \begingroup
  \def\CurrentTag{list}%
  \let\@liststyle=\@displaystyle
  \def\inline{\let\@liststyle=\@inlinestyle}%
  \def\display{\let\@liststyle=\@displaystyle}%
  \def\displaystyle##1{\def\@altdisplaystyle{##1}}%
  \def\inlinestyle##1{\def\@altinlinestyle{##1}}%
  \def\item{%
    \begingroup
    \def\CurrentTag{item}%
    \@numarguments=0
    \@checkoptions}%
  \def\tag##1{\@itemtag{##1}}%
  \def\unitemized{\@itemizedfalse\@itemtag{}}%
  \def\numbered{\@itemtag={\number\itemnumber.}}%
  \def\romannumeraled{\@itemtag={\romannumeral\itemnumber.}}%
  \def\lettered{\itemnumber="60 \@itemtag={\char\itemnumber.}}%
  \def\Lettered{\itemnumber="40 \@itemtag={\char\itemnumber.}}%
  \def\ruled{\@ruledtrue}%
  \def\cols{\@cols}%
  \def\itemseparator##1{\def\@itemseparator{##1}}%
  \@defaultoptions
  \@savingargumentfalse
  \@checkoptions}
 
\def\@beginlist{%
  \ifnum\listlevel=1 \outerparindent=\parindent \fi
  \ifx\@liststyle\@displaystyle
    \par
    \ifnum\listlevel=1
      \if@ruled \medskip \hrule\kern5pt \nobreak
      \else \if@removeprewhite\else\vskip\abovedisplayskip \fi\fi
    \fi
    \advance\leftskip by \outerparindent
    \outerparindent=0.5\outerparindent
    \@listindent=\outerparindent
    \@listhangindent=\outerparindent
    \if@itemized
      \parindent\@listindent
    \else
      \parindent=\z@
      \parskip=\z@
      \raggedright
      \everypar={\advance\itemnumber\@ne
                 \tagform{\the\@itemtag}\strutt
                 \hangindent\@listhangindent}%
      \makeCtrlMendgraf
    \fi
    \def\colsep{%
      \global\count@\itemnumber
      \egroup
      \vtop\bgroup
      \itemnumber=\count@\ignoreendline}%
    \ifnum\@cols>1
      \divide\hsize by\@cols
      \hbox\bgroup\vtop\bgroup
    \fi
    \@altdisplaystyle
  \else
    \if@itemized
    \else
       \makeCtrlMseparator
       \advance\itemnumber by \@ne
       \the\@itemtag\ %
    \fi
  \def\colsep{}%
  \@altinlinestyle
  \fi
  }
 
 
\def\endlist{%
  \ifx\@liststyle\@displaystyle
    \if@itemized\par\fi
    \ifnum\@cols>1
      \egroup   % vtop
      \egroup   % hbox
    \fi
    \ifnum\listlevel=1
      \nointerlineskip\null
      \if@ruled \kern5pt\hrule\nobreak\vskip2\medskipamount
      \else \nobreak
        \if@removepostwhite\else\vskip\belowdisplayskip\fi
      \fi
      \@asifbelowdisplay
    \fi
  \else
  \fi
  \endgroup     % list
  }
 
\def\sublist{\list[\listlevel=2]}
 
 
\newtoks\everyitem      \everyitem{}
 
 
\def\@beginitem{%
  \ifx\@liststyle\@displaystyle
    \par
    \parindent\z@
    \if@firstitem\@firstitemfalse\else\vskip\smallskipamount\fi
    \advance\itemnumber by \@ne
    \noindent\leavevmode
    \the\everyitem
    \tagform{\the\@itemtag}\strutt
  \else
    \def\item{\if@firstitem\@firstitemfalse\else\unskip\@itemseparator\fi
              \advance\itemnumber by \@ne\the\@itemtag\enspace}%
  \fi
  \global\count@\itemnumber
  \endgroup
  \itemnumber\count@
  }
 
 
% ********************************************************
% Verbatim.
% Operation here is very similar to that for the other tags.
% The opening tag sets up the situation and looks for optional
% commands and the short-form delimiters.  Since initial setup
% involves changing the special characters to characters of
% type other, some juggling must be done when optional commands
% are read.  In addition, to allow for implementation of the
% |...| style using the more verbose \verbatim...\endverbatim,
% we parameterize the ending-delimiter.
 
        % sets default to display style
\def\verbatim{\@verbatim[\display]}
 
\def\@verbatim{%
  \begingroup
  \setupverbatim
  \@checkverboptions
  }
 
\def\setupverbatim{%
  \def\CurrentTag{verbatim}%
  \@defaultoptions
  \def\inline{\global\let\@verbstyle\@inlinestyle}%
  \def\display{\global\let\@verbstyle\@displaystyle}%
  \def\displaystyle##1{\def\@altdisplaystyle{##1}}%
  \def\inlinestyle##1{\def\@altinlinestyle{##1}}%
  \def\numbered{\@numberedtrue}%
  \def\ruled{\@ruledtrue}%
  \@SpecialsGetOther
  \obeyspaces \obeylines \hyphenpenalty=10000
  \the\everyverbatim
  }
 
\def\@authorstyle{\@@@a}
\def\@inlinestyle{\@@@i}
\def\@displaystyle{\@@@d}
\def\@altinlinestyle{}
\def\@altdisplaystyle{}
 
\def\@SpecialsGetOther{%
  \catcode`\\=\other
  \catcode`\{=\other \catcode`\}=\other \catcode`\$=\other
  \catcode`\&=\other \catcode`\#=\other \catcode`\%=\other
  \catcode`\~=\other \catcode`\_=\other \catcode`\^=\other
  \catcode`\"=\other \catcode`\@=\other
  \the\@AdditionsToSpecialsGetOther}
 
% The \@Additions... register above should be used whenever another
% character is declared to be special for some purpose.  E.g.,
% we will use the | for the short-form |...| verbatim notation.
% Since the | is generally active for this purpose, it's category
% won't get changed to \other for use in \verbatim...\endverbatim
% unless we add it via this mechanism.
 
\newtoks\@AdditionsToSpecialsGetOther
 
\def\AddToSpecialsGetOther#1{%
  \@AdditionsToSpecialsGetOther=
   \expandafter{\the\@AdditionsToSpecialsGetOther#1}}
 
% From David Eppstein's ``Trees'' paper (6#1), preserve initial spaces.
\def\verbatimspace{\ifvmode\indent\fi\space}
{\obeyspaces\gdef\makespaceverbspace{\def {\verbatimspace}}}
 
% Altering the verbatim setup.
% Users can alter the setup to their purpose by calling
% putting tokens in the register \everyverbatim.
 
\newtoks\everyverbatim
 
\def\@checkverboptions{%
  \if@lastoption
    \def\@next{\@executetoendverb}%
  \else
    \def\@next{\@checknexttoken {[}{\@readverboptions}{\@executetoendverb}}%
  \fi
  \@next
  }
 
\def\@readverboptions{%
  \savecat\\\makeescape\\%
  \savecat\{\makebgroup\{%
  \savecat\}\makeegroup\}%
  \savecat\ \makespace\ %
  \savecat\^^M\makeeol\^^M%
  \@@readverboptions}
 
\def\@@readverboptions[#1]{%
  #1%
  \restorecat\\\restorecat\{\restorecat\}%
  \restorecat\ \restorecat\^^M%
  \DeleteOptionalActiveSpaces{\@checkverboptions}%
  }
 
\def\@executetoendverb{%
  \if@longform
    \def\@next{\@longparseverbatim}%
  \else
    \def\@next{\@checknexttoken
      {\@@ShortFormDelimiter}{\@shortparseverbatim}{\@longparseverbatim}}%
  \fi
  \@next
  }
 
\def\@shortparseverbatim{%
  \edef\@form{%
 
 \def\noexpand\@@shortparseverbatim\@ShortFormDelimiter####1\@ShortFormDelimiter}%
  \@form{\global\@argument{##1}\csname end\CurrentTag\endcsname}%
  \@ignoreone{\@@ShortFormDelimiter}%
    {\@ignoreCtrlM{\expandafter\@@shortparseverbatim\@ShortFormDelimiter}%
    }%
  }
 
\def\@longparseverbatim{%
  \toks@=\expandafter{\endverbdelimiter}%
  \edef\@form{\def\noexpand\@@longparseverbatim####1\the\toks@}%
  \@form{\global\@argument{##1}\endverbatim}%
  \@ignoreCtrlM{\@@longparseverbatim}}
 
{\catcode`\|=0 \catcode`\\=\other
|gdef|endverbdelimiter{\endverbatim}}
 
\def\inputfromvar#1{\def\@verbinputvar{#1}}%
\def\inputfromfile#1{\def\@verbinputfile{#1 }}%
\let\@verbinputvar\relax
\let\@verbinputfile\relax
 
\newif\if@outputtotype  \@outputtotypetrue
 
\def\notype{\@outputtotypefalse}
\def\outputtovar#1{\def\@verboutputvar{#1}}
\def\outputtofile#1{\def\@verboutputfile{#1}}
\let\@verboutputvar\relax
\let\@verboutputfile\relax
 
\def\endverbatim{%
 \if@outputtotype
  \tt
  \ifx\@verbstyle\@inlinestyle
    \@beforeverbinline
    \@altinlinestyle
  \else
    \@beforeverbdisplay
    \@altdisplaystyle
  \fi
  \ifx\@verbinputvar\relax\else
    \csname\@verbinputvar\endcsname
  \fi
  \ifx\@verbinputfile\relax\else
    \input \@verbinputfile
    \@endverbatim
  \fi
  \expandafter\@ignoreendverbatim\the\@argument\@endverbatim
  \ifx\@verbstyle\@inlinestyle
    \@afterverbinline
  \else
    \@afterverbdisplay
  \fi
 \fi
 \ifx\@verboutputvar\relax\else
   \expandafter\xdef\csname\@verboutputvar\endcsname{\the\@argument}%
 \fi
 \ifx\@verboutputfile\relax\else
   \immediate\openout\verboutfile=\@verboutputfile
   \makeCtrlMnewlinechar
   \immediate\write\verboutfile{\the\@argument}%
   \immediate\closeout\verboutfile
 \fi
 \ifx\@verbstyle\@inlinestyle
   \gdef\@next{}\else\gdef\@next{\ignorespaces}\fi
 \endgroup
 \@next
 }
\newwrite\verboutfile
 
% Formatting the text.
 
% \ttrightskip is the permissible overhang beyond right margin;
% in MANMAC, this is 5pc, which is fine for the TeXbook, but too much here.
 
\newdimen\ttrightskip   \ttrightskip=1pc
 
% Allow for line numbers on a listing as well as rules above and below.
 
\newcount\linenumber
\newcount\globallinenumber      \globallinenumber = 0
\newif\if@continuingnumbers \@continuingnumbersfalse
\def\continuenumbers{\numbered\@continuingnumberstrue}
 
\def\@ignoreendverbatim{\@ignoreone{\@endverbatim}{}}
\def\verbendline{\leavevmode\null\endgraf}
\def\makeCtrlMactive{\catcode`\^^M=\active}
{\makeCtrlMactive
\gdef\makeCtrlMverbendline{\def^^M{\makeCtrlMactive%
  \@ignoreone{\@endverbatim}{\verbendline}}}%
\gdef\makeCtrlMverbspace{\makeCtrlMactive\def^^M{\verbatimspace}}%
\gdef\makeCtrlMnewlinechar{\newlinechar=`\^^M}%
\gdef\makeCtrlMendgraf{\makeCtrlMactive\def^^M{\strutt\endgraf}}%
\gdef\makeCtrlMseparator{\makeCtrlMactive%
  \def^^M{%
    \@checknexttoken {\endlist}{}{%
      \@itemseparator\advance\itemnumber by \@ne \the\@itemtag%
      \unskip\ \ignorespaces}}}%
}
        % to read a variable or file name properly, we must interpret
        % spaces and ^^M as nothing or as spaces
{\catcode`\^^M=\active\catcode`\ =\active%
\gdef\makeCtrlMempty{\def^^M{}}%
\gdef\makespaceempty{\def {}}%
}
{\catcode`\^^M=\active\catcode`\ =\active%
\gdef\makeCtrlMspace{\def^^M{\space}}%
\gdef\makespacespace{\def {\space}}%
}
 
{\catcode`\^^M=\active%
\gdef\@ignoreCtrlM#1{\@ignoreone{^^M}{#1}}%
\gdef\ignoreendline{\@ignoreCtrlM{}}%
}
 
\def\@beforeverbinline{%
    \makeCtrlMverbspace
    \let\@endverbatim=\empty
  }
 
\def\@beforeverbdisplay{%
  \def\@endverbatim{\verbendline}%
  \if@ruled \medskip \hrule\kern5pt \nobreak
  \else \vskip\abovedisplayskip
  \fi
  \makespaceverbspace
  \makeCtrlMverbendline\parskip=\z@
  \if@numbered \parindent=\z@
    \if@continuingnumbers
    \else \global\globallinenumber = \z@ \fi
    \linenumber=\z@ \fi
  \everypar={\global\advance\globallinenumber by\@ne
          \advance\linenumber by\@ne
          \ifnum\linenumber<3 \vadjust{\nobreak}\fi
          \if@numbered \leavevmode
              \hbox to\normalparindent{\hss\sevenrm\the\globallinenumber.\ }%
          \fi}%
  \frenchspacing\rightskip=-\ttrightskip
  }
 
\def\@afterverbinline{}
 
\def\@afterverbdisplay{%
  \if@ruled \kern5pt\hrule\nobreak\vskip2\medskipamount
  \else \nobreak\vskip\belowdisplayskip
  \fi
  \@asifbelowdisplay
 }
 
\def\@asifbelowdisplay{%
  \nobreak
  \vskip-\parskip
  \vskip-\abovedisplayshortskip
  \vskip-2\baselineskip
  \vskip-\belowdisplayshortskip
  {\everypar{}\everymath{}$$\null$$}%
  }
 
 
% Options and variants.
 
\def\verbinline{\verbatim[\inline]}
\def\verbdisplay{\verbatim[\display]}
\def\verbfile#1{\verbatim[\inputfromfile{#1}]}
 
 
% Verbatim with the other characters (e.g. |...|).
% Procedures are made abstract so that it is easy to allow
% different characters to perform this function.  Any character
% that's chosen could cause problems if it occurs unexpectedly
% in the middle of what is supposed to be verbatim text.  We call
% the current special character for this purpose the "verbchar"
% and store it in active form in the token register \@verbchar.
 
\newtoks\@verbchar
 
% On hitting a "verbchar" in the middle of text, TeX must look ahead
% to see whether the verbchar occurs again.  Since this
% look-ahead fixes the category of the token examined, we must change
% the categories of all characters appropriately before looking.
% We must also "gobble" the second verbchar if we hit one.
% Depending upon whether 1 or 2 verbchars are found, we call
% \verbatim with the appropriate style command.  We also use an
% optional command to change the delimiter which ends this \verbatim
% block.
 
\def\@firstverbchar{%
  \begingroup
  \@SpecialsGetOther
  \makeverbcharactive
  \expandafter\@checknexttoken\expandafter{\the\@verbchar}%
    {\expandafter\@ignoreone\expandafter{\the\@verbchar}%
      {\endgroup\verbatim[\longform\maketwoendverb]}}%
    {\endgroup\verbatim[\inline\longform\makeoneendverb]}%
  }
 
\def\setupverbchar{%
 \def\makeoneendverb{\catcode\expandafter`\csname\expandafter\string\the\@verbchar\endcsname=
    \active\edef\endverbdelimiter{\the\@verbchar}}%
 
 \def\maketwoendverb{\catcode\expandafter`\csname\expandafter\string\the\@verbchar\endcsname=
    \active\edef\endverbdelimiter{\the\@verbchar\the\@verbchar}}%
  \expandafter\let\the\@verbchar\@firstverbchar
  \makeverbcharactive
  \AddToSpecialsGetOther{%
  \catcode\expandafter`\csname\expandafter\string\the\@verbchar\endcsname=\other}
%
  }
 
\def\makeverbcharactive{%
 
 \catcode\expandafter`\csname\expandafter\string\the\@verbchar\endcsname=\active
}
 
{\makeother\| \gdef\VertChar{|}}
{\makeactive\|
\gdef\makevertverbchar{%
  \@verbchar={|}%
  \setupverbchar
  }
}
 
{\makeother\! \gdef\WowChar{!}}
{\makeactive\!
\gdef\makewowverbchar{%
  \@verbchar={!}%
  \setupverbchar
  }
}
 
 
\def\MTH{$}
\def\sb{_}
\def\sp{^}
\def\SP{{\tt\char"20 }}         % "visible" space
\chardef\bs=`\\
\def\vrt{{\tt\char`\|}}
\def\brokenvert{\hbox to 5.24998pt{\hfill
  \lower 1.5pt\vbox to 8.5pt{\hrule width .9pt height 3.25pt
  \vfill\hrule width .9pt height 3.25pt}\hfill}}
 
 
 
\def\@lt{$<$}
\def\@gt{$>$}
{\makeactive\<
\gdef\enablemetacode{\makeactive\<\def<##1>{%
  $\langle${\it\makeCtrlMspace\makespacespace##1\/}$\rangle$}}}
 
 
 
% ************************************************************************
%
% Figures.
 
\newif\if@@mid  \@@midfalse
\newif\if@@bot  \@@botfalse
\def\@caption{}
\newif\if@fixed \@fixedfalse
 
        % items for top and bottom ``banners'' on first page
\def \resetfirsthead{\global\toplgt=\z@ \gdef\firsthead{}}
\resetfirsthead
\newbox\firsth@@d       \newbox\firsth@ad
 
\def \resetfirstfoot{\global\botlgt=\z@ \gdef\firstfoot{}}
\resetfirstfoot
\newbox\firstf@@t       \newbox\firstf@ot
 
\newif\if@allowspanningfigs
 
\newcount\@figurepage
\newcount\@figurescol
\newcount\@figureecol
 
 
\def\figure{%
  \begingroup
  \def\CurrentTag{figure}%
  \@defaultoptions
  \@savingargumentfalse
  \def\top{}%
  \def\bot{\@@bottrue}%
  \def\mid{\@@midtrue}%
  \def\caption##1{\def\@caption{\ulap{\bigskip##1\smallskip}}}%
  \def\fixed{\@fixedtrue}%
  \def\scol{\@figurescol}%
  \def\ecol{\@figureecol}%
  \@figurepage=\pageno
  \@figurescol=1
  \@figureecol=\numcols
  \def\page{%
    \@ignoreall{\space}%
      {\@ignoreone{=}%
         {\@ignoreall{\space}%
            {\@checknexttoken{+}{\@ignoreone{+}{\advance\@figurepage by}}%
                 {\@figurepage=}%
            }%
         }%
      }%
    }%
  \@checkoptions}
 
\def\@beginfigure{%
  \if@fixed
    \global\ThisIsFirstPagetrue
    \setbox\T@stBox=\vbox\bgroup \hsize\pagewd
  \else
    \if@@mid\midinsert\else\if@@bot\botinsert\else\topinsert\fi\fi
  \fi
  }
 
\def\endfigure{%
  \@caption
  \if@fixed
    \egroup
    \if@allowspanningfigs
      \ifnum\@figurepage>\pageno
        \immediate\write\sixt@@n{^^J
           Setting multiple column figures currently not allowed on pages^^J
           other than the first of each article.  Check your source file.^^J}%
      \else
        \if@@bot
          \ifdim \botlgt=\z@ \global\botlgt=\ht\T@stBox \resetpagelgt \fi
          \global\setbox\firstf@ot=\vbox to \botlgt{\box\T@stBox \vfil}%
          \global\setbox\firstf@@t=\vbox to \botlgt{\vfil}%
          \gdef\firstfoot{\ifnum \xcol=2 \copy\firstf@ot
                                  \else \copy\firstf@@t \fi }%
        \else
          \ifdim \toplgt=\z@ \global\toplgt=\ht\T@stBox \resetpagelgt \fi
%                       assume that \firsth@ad ends with glue, hence no \dp
          \global\setbox\firsth@ad=\vbox to \toplgt{\box\T@stBox \vfil}%
          \global\setbox\firsth@@d=\vbox to \toplgt{\vfil}%
          \gdef\firsthead{\ifnum \xcol=2 \box\firsth@ad
                                  \else \copy\firsth@@d \fi }%
        \fi
      \fi
    \else
      \immediate\write\sixt@@n{^^J
         Setting multiple column figures currently not allowed after^^J
         article has begun.^^J}%
    \fi
  \else \endinsert
  \fi
  \endgroup
  }
 
\def\twocolfigure{%
  \figure[\fixed]}
 
 
 
%       Avoid Spanish punctuation ligatures ?` and !`.
{\catcode`\`=\active \gdef`{\relax\lq}}
 
 
%       Define a structure that will permit a list (using \obeylines)
%       to be made into 2 columns, split by \vsplit, indented the
%       normal \parindent
 
\def \NormalizeBlockHeight{\TestCount=1                         % \@ne
        \TestDimen=\dimen0 \advance\TestDimen by-\topskip
        \CutOneLine }
\def \CutOneLine{\advance\TestCount by 1 \advance\TestDimen by-\baselineskip
        \ifdim\TestDimen < \baselineskip                        % \@ne
                \def\result{\TestDimen=\baselineskip
                        \multiply\TestDimen by \TestCount
                        \advance\TestDimen by \topskip
                        \global\dimen0=\TestDimen }%
        \else \def\result{\CutOneLine }\fi \result }
 
\def \twosplit{{\topskip=\baselineskip \splittopskip=\topskip
        \setbox0=\copy\TestBox
        \dimen0=\ht\TestBox
        \NormalizeBlockHeight
        \divide\dimen0 by 2
        \setbox\LeftHalf=\vsplit\TestBox to \dimen0
        \ifdim\ht\TestBox > \ht\LeftHalf
                \advance\dimen0 by \baselineskip
                \setbox\TestBox=\copy0
                \setbox\LeftHalf=\vsplit\TestBox to \dimen0
        \fi
        \line{\kern\parindent\valign{##\vfil\cr
                \unvbox\LeftHalf\cr\noalign{\hfil}\unvbox\TestBox\cr}}}%
        \global\setbox0=\null}
 
\newbox\LeftHalf
\newdimen\HalfWd
\HalfWd=\twocolcolwd
\advance\HalfWd by-\normalparindent
\divide\HalfWd by 2
 
{\obeylines
\gdef\twouplist #1{\topskip=\baselineskip \splittopskip=\topskip %
        \begingroup \parindent=0pt \obeylines
%                       next line ends with intentional <cr>
        \def\endtwouplist{
                        \egroup %               % end of \vbox
                        \endgroup %             % end of \obeylines group
                        \twosplit }%
        \global\setbox\TestBox=\vbox\bgroup\hsize=\HalfWd %
                \indent\vrule height\topskip width 0pt #1}%
}
 
 
%       Tags for special formatting of editor's notes, meeting
%       attendees lists, etc.  (See also TUGBOT.COM)
 
\def \Editor{\noindent To the Editor:\par}
\def \EdNote #1{\if #1[\unskip\hskip1em [\thinspace\xEdNote\ignorespaces
        \else \ifFirstPar \else \medskip\noindent \fi
                \xEdNote #1\fi }
 
\def \Attendee #1 {\par \noindent\hangindent 2\normalparindent
        \hbox to .5\normalparindent{\hfil #1\thinspace}\ignorespaces}
 
 
 
%       Footnotes are mainly supported by PLAIN format, with these
%       exceptions.
 
\skip\footins=12pt              % full blank line       % 24pt
\def\footnoterule{\kern-8pt
        \hrule width 5pc \kern 7.6pt } % the \hrule is .4pt high
 
\newif\ifDelayFirstPar          \DelayFirstParfalse
\def\vfootnote#1{\ifFirstPar \DelayFirstPartrue \fi
  \insert\footins\bgroup
  \interlinepenalty\interfootnotelinepenalty
  \splittopskip\ht\strutbox % top baseline for broken footnotes
  \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
  \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
  \eightpoint\rm
  \parindent=\normalparindent % always indent footnotes; added for TUGboat
  \textindent{#1}\footstrut\futurelet\next\fo@t}
\def\@foot{\strut\egroup
        \ifDelayFirstPar \SetupFirstPar \global\DelayFirstParfalse \fi }
\newif\ifFirstPar       \FirstParfalse
\def\SetupFirstPar{\global\parindent=0pt \global\FirstPartrue }
 
 
 
%       Draw a box around a whole page, e.g. announcements page;
%       format must be \onenarrow or \onemedium, and start on a new page.
 
\def \bigbox{\hrule \hbox\bgroup \vrule\kern 1pc
        \vbox\bgroup \vskip 1pc }
\def \endbox{\endgraf \vskip 1pc \egroup \kern 1pc\vrule \egroup \hrule }
 
 
%       Macros to produce extra running heads for stripping onto pages
%       received as camera copy.  Format must be preset to \OneCol, and
%       start on a new page.
 
%       Generate 5 (4 + normal running head) per page.
 
\def \DrawT@pLines{\vskip\topskip
        \ulap{\line{\raise 1ex\rlap{\leaders\hrule\hskip\pagewd}%
                        \leaders\hrule\hfill}}\medskip}
 
\def \r@nhead{\vbox to .23\vsize{\basezero \hsize=\pagewd \vfil
        \topregister \vskip\headmargin \runhead \DrawT@pLines }\medskip
        \advancepageno }
 
\def \nextrunner{%
        \ifnum\T@stCount>0
                \ifnum\T@stCount>5 \TestCount=5 \else\TestCount=\T@stCount \fi
                \advance\T@stCount by-\TestCount
                \DrawT@pLines           % always one at top of page
                \loop\ifnum\TestCount>1 \r@nhead \advance\TestCount by\m@ne
                        \repeat \newpage
                \nextrunner
        \fi }
 
\def \ExtraRunheads #1, #2.{\T@stCount=#1
        \gdef\pageprefix{#2}%   % as in A-10 for appendices; not used just now
        \nextrunner }
 
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                       *****     utilities      *****                         %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
\def \linebreak{\unskip\break}          % conflicts with LaTeX definition
 
% *********************************************************************
%
%  Initialization.
 
\def\initializearticle{%
  \let\thetitle=\relax
  \authornumber=0
  \def\@signature{\@defaultsignature}%
  \def\@authorlist{\@defaultauthorlist}%
  \@allowspanningfigstrue
  }
 
 
\makeother\@
 
%               @ is prohibited in AMS-TeX, but should not be in TUGboat
 
 
\twocol
\Lasertrue
\PrelimDrafttrue
\initializearticle
\pageno=1001                    % number of title page
 
\StretchyTenPointSpacing
\StretchyNinePointSpacing
\StretchyEightPointSpacing
 
\makevertverbchar
 
\endinput

