Category : EmTeX is a TeX/LaTeX document editor
Archive   : LATEX.ZIP
Filename : LATEX.TEX

 
Output of file : LATEX.TEX contained in archive : LATEX.ZIP
% LATEX VERSION 2.09 <14 January 1992>
% Copyright (C) 1992 by Leslie Lamport

\everyjob{\typeout{LaTeX Version 2.09 <14 January 1992>}}
\immediate\write10{LaTeX Version 2.09 <14 January 1992>}

% TABLE OF CONTENTS
% COMMAND LIST ......................................... 2
% GENERAL CONVENTIONS .................................. 6
% COUNTERS, ETC. ....................................... 7
% USEFUL HACKS ......................................... 8
% ERROR HANDLING ....................................... 12
% \par AND \everypar ................................... 15
% SPACING / LINE AND PAGE BREAKING ..................... 17
% PROGRAM CONTROL STRUCTURE MACROS ..................... 21
% FILE HANDLING ........................................ 24
% ENVIRONMENT COUNTER MACROS ........................... 27
% PAGE NUMBERING ....................................... 30
% CROSS REFERENCING MACROS ............................ 31
% ENVIRONMENTS ......................................... 33
% MATH ENVIRONMENTS .................................... 36
% CENTER, FLUSHRIGHT, FLUSHLEFT, ETC. .................. 39
% VERBATIM ............................................. 40
% THE LIST ENVIRONMENT ................................. 41
% ITEMIZE AND ENUMERATE ................................ 49
% BOXES ................................................ 51
% THE TABBING ENVIRONMENT .............................. 57
% ARRAY AND TABULAR ENVIRONMENTS ....................... 63
% THE PICTURE ENVIRONMENT .............................. 72
% THEOREM ENVIRONMENTS ................................. 86
% LENGTHS .............................................. 88
% THE TITLE .............................................89
% SECTIONING ........................................... 90
% TABLE OF CONTENTS, ETC. .............................. 94
% INDEX COMMANDS ....................................... 97
% BIBLIOGRAPHY ......................................... 98
% FLOATS .............................................. 100
% FOOTNOTES ........................................... 106
% INITIAL DECLARATION COMMANDS ........................ 110
% OUTPUT .............................................. 113
% DEBUGGING AND TEST INITIALIZATIONS ................. 137


\catcode`\~=13 \def~{\penalty\@M \ }


% ****************************************
% * COMMAND LIST *
% ****************************************
%
% DECLARATIONS:
% PREAMBLE: \nofiles \documentstyle \includeonly
% \makeindex \makeglossary
% IN DOCUMENT :
% FONT SELECTION:
% SIZE: \normalsize \small \footnotesize \scriptsize \tiny
% \large \Large \LARGE \huge \Huge
% STYLE: \bf \it \rm \sl \ss \tt \mit[math mode only]
% STYLE:
% PAGE: [all global] \pagestyle \thispagestyle \pagenumbering \head
% MISC: \raggedright \thicklines \thinlines
% PARAMETER: \setlength \settowidth \addtolength \setcounter \addtocounter
% NEW: \newlength \newtheorem \newcommand
% MISC: \savebox \sbox \obeycr \restorecr
%
% ENVIRONMENTS:
% ? -> PAR: document
% PAR -> PAR: list enumerate itemize description
% center flushright flushleft
% verbatim picture float
% PAR -> BOX: tabular tabbing
% PAR -> MATH: math displaymath equation
% MATH -> MATH: array
% ANY -> PAR: minipage
% ANY -> BOX: stack
%
% TEXT-PRODUCING:
% WITH TEXT ARGUMENT:
% ANY -> BOX: \makebox \mbox \framebox \fbox \dashbox
% \shortstack \footnotemark \cite[] \raisebox
% ANY -> PAR: \parbox[inner]
% PAR -> PAR: \chapter \section ... \footnote \footnotetext
% \topnewpage \verb
% MATH: \sqrt \underline \overline
% PICTURE: \put \multiput
% LIST: \item
% WITHOUT TEXT ARGUMENT:
% ANY MODE:
% SYMBOLS: \$ \{ \} \_ \@ \& \#
% ACCENTS: See TeXbook
% OTHER: \rule \ref \pageref \today \usebox \typein \input \cite
% MATH: \over
% PAR MODE: \include \bibliography \tableofcontents \listoffigures ...
% LIST: \item \arabic \roman \Roman \alph \Alph
% PICTURE: \line \vector \circle \oval
% ARRAY & TABULAR: \hline \vline
%
% SPACING & BREAKING:
% ANY : \hfill \hspace
% PAR : \newpage \newpage \vspace \noindent
% PAR & INNER MATH
% : \newpage \clearpage \cleardoublepage
% : \pagebreak \nopagebreak \linebreak \nolinebreak \newline
% MATH : \over \; \, \!
% MULTILINE : \\
% TABBING : \pushtab \poptab \> \< \+ \- \kill ...
% ARRAY & TABULAR
% : \multicolumn \noalign
%
% NO DIRECT CHANGES TO DOCUMENT:
% \index \glossary \typeout \label \tableentry \stop \protect
%
% PARAMETERS:
%
% \columnsep \skip\footin \intextsep
% \columnseprule \oddsidemargin
% \columnwidth \textfloatsep
% \evensidemargin \footsep \textheight
% \floatsep \headheight \textwidth
% \headsep \topmargin


% ALPHABETIZED LIST:
%
% ORDINARY COMMANDS:
%
% \Alph \include \parbox
% \Roman \index \put
% \\ \item \raisebox
% \alph \label \ref
% \appendix \line \roman
% \arabic \linebreak \rule
% \bibliography \listoffigures \section
% \chapter \listoftables \shortstack
% \circle \makebox \stop
% \cite \mbox \subsection
% \cite \multicolumn \subsubsection
% \cleardoublepage \multiput \tableentry
% \clearpage \tableofcontents
% \dashbox \newline \today
% \fbox \newpage \typein
% \footnotemark \noindent \typeout
% \footnotetext \nolinebreak \usebox
% \framebox \nopagebreak \vector
% \glossary \oval \vline
% \hline \pagebreak \vspace
% \hspace \pageref \protect
%
%
% ENVIRONMENTS & DECLARATIONS:
%
% For each of these commands, the same command name prefixed by 'end'
% is also reserved--e.g., \enddocument.
%
% \BIG \footnotesize \pagestyle
% \Big \head \picture
% \addtocounter \includeonly \raggedright
% \addtolength \itemize \restorecr
% \array \list \savebox
% \big \makeglossary \sbox
% \center \makeindex \scriptscriptsize
% \description \math \scriptsize
% \displaymath \minipage \setcounter
% \document \newcommand \setlength
% \documentstyle \newlength \settowidth
% \enumerate \newtheorem \small
% \equation \nofiles \shortstack\tabbing
% \normalsize \tabular
% \float \obeycr \thicklines
% \flushleft \pagelayout \thinlines
% \flushright \pagenumbering \thispagestyle
% \verb, \verbatim
%
% PARAMETERS :
%
% \columnsep \footinsertskip \intextsep
% \columnseprule \oddsidemargin
% \columnwidth \textfloatsep
% \evensidemargin \footsep \textheight
% \floatsep \headheight \textwidth
% \headsep \topmargin
%
%
% TABBING COMMANDS:
%
% These commannds are defined only within a tabbing environment.
%
% \kill \> \-
% \pushtab \< \=
% \poptab \+


% COMPLETE LIST :
% Below is a complete list of every command starting with `\' that
% appears in LATEX.TEX.

% \
% \!
% \#
% \$
% \&
% \'
% \(
% \)
% \+
% \,
% \-
% \.
% \:
% \;
% \<
% \=
% \>
% \@
% \@@
% \@@end
% \@@endpbox
% \@@eqncr
% \@@hyph
% \@@input
% \@@par
% \@@sqrt
% \@@startpbox
% \@@underline
% \@@warning
% \@acci
% \@accii
% \@acciii
% \@acol
% \@acolampacol
% \@addamp
% \@addfield
% \@addmarginpar
% \@addtobot
% \@addtocurcol
% \@addtodblcol
% \@addtonextcol
% \@addtopreamble
% \@addtoreset
% \@addtotoporbot
% \@afterheading
% \@afterindentfalse
% \@afterindenttrue
% \@Alph
% \@alph
% \@ampacol
% \@arabic
% \@argarraycr
% \@argdef
% \@argrsbox
% \@argtabularcr
% \@array
% \@arrayacol
% \@arrayclassiv
% \@arrayclassv
% \@arrayclassz
% \@arraycr
% \@arrayparboxrestore
% \@arrayrule
% \@arstrut
% \@arstrutbox
% \@auxout
% \@badcrerr
% \@badend
% \@badlinearg
% \@badmath
% \@badpoptabs
% \@badtab
% \@beginparpenalty
% \@begintheorem
% \@bibitem
% \@biblabel
% \@bitor
% \@botlist
% \@botnum
% \@botroom
% \@bsphack
% \@caption
% \@captype

% \@car
% \@carcube
% \@cclv
% \@cdr
% \@centercr
% \@centering
% \@cfla
% \@cflb
% \@charlb
% \@charrb
% \@chclass
% \@checkend
% \@chnum
% \@circ
% \@circle
% \@circlefnt
% \@cite
% \@citea
% \@citeb
% \@citex
% \@cla % counter used in \cline
% \@classi
% \@classii
% \@classiii
% \@classiv
% \@classv
% \@classz
% \@clb % counter used in \cline
% \@cline
% \@clnht
% \@clnwd
% \@clubpenalty
% \@colht
% \@colnum
% \@colroom
% \@combinedblfloats
% \@combinefloats
% \@comdblflelt
% \@comflelt
% \@cons
% \@contfield
% \@ctrerr
% \@curfield
% \@curline
% \@currbox
% \@currentlabel
% \@currentreference
% \@currenvir
% \@currlist
% \@currtype
% \@curtab
% \@curtabmar
% \@dascnt
% \@dashbox
% \@dashcnt
% \@dashdim
% \@dblarg
% \@dbldeferlist
% \@dblfloat
% \@dblfloatplacement
% \@dblfloatsep
% \@dblfpbot
% \@dblfpsep
% \@dblfptop
% \@dblmaxsep
% \@dbltextfloatsep
% \@dbltoplist
% \@dbltopnum
% \@dbltoproom
% \@deferlist
% \@definecounter
% \@defpar
% \@depth
% \@dischyph
% \@doclearpage
% \@documentstyle
% \@doendpe
% \@donoparitem
% \@dot
% \@dotsep
% \@dottedtocline
% \@downline
% \@downvector
% \@eha
% \@ehb
% \@ehc
% \@ehd
% \@elt
% \@empty
% \@endparenv
% \@endparpenalty
% \@endpbox
% \@endpefalse
% \@endpetrue
% \@endtabbing
% \@endtheorem
% \@enumctr
% \@enumdepth
% \@enumspacing
% \@eqncr
% \@eqnnum
% \@eqnsel
% \@eqnswtrue
% \@esphack
% \@evenfoot
% \@evenhead
% \@expast
% \@failedlist
% \@fcolmadefalse
% \@filesw
% \@fileswfalse
% \@fileswtrue
% \@firstampfalse
% \@firstamptrue
% \@firstcolumntrue
% \@firsttab
% \@flfail
% \@float
% \@floatpenalty
% \@floatplacement
% \@floatsep
% \@flsucceed
% \@fltovf
% \@flushglue
% \@fnsymbol
% \@footnotemark
% \@footnotetext
% \@for
% \@forloop
% \@fornoop
% \@fpbot
% \@fpmin
% \@fpsep
% \@fptop
% \@framebox
% \@framepicbox
% \@freelist
% \@getcirc
% \@getlarrow
% \@getlinechar
% \@getpen
% \@getrarrow
% \@glossaryfile
% \@gobble
% \@gobblecr
% \@gobbletwo
% \@gtempa
% \@halfwidth
% \@halignto
% \@hangfrom
% \@height
% \@highpenalty
% \@hightab
% \@hline
% \@holdpg
% \@hspace
% \@hspacer
% \@hvector
% \@icentercr
% \@iden
% \@ifatmargin
% \@ifdefinable
% \@ifnch
% \@ifnextchar
% \@iforloop
% \@iframebox
% \@iframepicbox
% \@ifstar
% \@ifundefined
% \@iinput % used in \input
% \@iirsbox
% \@imakebox
% \@imakepicbox
% \@iminipage
% \@index
% \@indexfile
% \@inlabelfalse
% \@input
% \@insertfalse
% \@inserttrue
% \@iparbox
% \@irsbox
% \@isavebox
% \@isavepicbox
% \@ishortstack
% \@istackcr
% \@itabcr
% \@item
% \@itemdepth
% \@itemfudge
% \@itemitem
% \@itemlabel
% \@itempenalty
% \@itemspacing
% \@iwhiledim
% \@iwhilenum
% \@iwhilesw
% \@ixstackcr
% \@killglue
% \@labels
% \@lastchclass
% \@latexbug
% \@latexerr
% \@lbibitem
% \@leftcolumn
% \@leftmarginskip
% \@leftmark
% \@lhead
% \@linechar
% \@linefnt
% \@linelen
% \@list
% \@listctr
% \@listdepth
% \@listi
% \@listii
% \@listvi
% \@lnbk
% \@lowpenalty
% \@lquote
% \@ltab
% \@M
% \@m
% \@mainaux
% \@mainout
% \@makebox
% \@makecaption
% \@makecol
% \@makefcolumn
% \@makefnmark
% \@makefntext
% \@makeonecolumn
% \@makeother
% \@makepicbox
% \@maketwocolumn
% \@marbox
% \@markright
% \@maxdepth
% \@maxsep
% \@maxtab
% \@medpenalty
% \@Mi
% \@midlist
% \@Mii
% \@Miii
% \@minipagefalse
% \@minipagerestore
% \@Miv
% \@mkboth
% \@mklab
% \@mkpream
% \@MM
% \@mparbottom
% \@mparswitchfalse
% \@mpfn
% \@mpfnnumber
% \@mpfootins
% \@mpfootnotetext
% \@mplistdepth
% \@multicnt
% \@namedef
% \@nameuse
% \@nbitem
% \@ne
% \@negargfalse
% \@negargtrue
% \@newctr
% \@newenv
% \@newline
% \@newlist
% \@newlistfalse
% \@next
% \@nextchar
% \@nextwhile
% \@nil
% \@nmbrlistfalse
% \@nmbrlisttrue
% \@nnil
% \@nobreakfalse
% \@nocnterr
% \@nodocument
% \@nofonterror
% \@noitemargfalse
% \@noitemargtrue
% \@noitemerr
% \@noligs
% \@nolnbk
% \@nolnerr
% \@noparitemfalse
% \@noparitemtrue
% \@noparlistfalse
% \@noparlisttrue
% \@nopgbk
% \@normalcr
% \@normalsize
% \@noskipsecfalse
% \@notdefinable
% \@notprerr
% \@nthm
% \@nxttabmar
% \@oddfoot
% \@oddhead
% \@opargbegintheorem
% \@opcol
% \@optionfiles
% \@optionlist
% \@options
% \@othm
% \@outerparskip
% \@outputbox
% \@outputdblcol
% \@outputpage
% \@oval
% \@ovbtrue
% \@ovdx
% \@ovdy
% \@ovhorz
% \@ovltrue
% \@ovri
% \@ovro
% \@ovrtrue
% \@ovttrue
% \@ovvert
% \@ovxx
% \@ovyy
% \@pagedp
% \@pageht
% \@par
% \@parboxrestore
% \@parmoderr
% \@partaux
% \@partlist
% \@partout
% \@partsw
% \@partswfalse
% \@partswtrue
% \@pboxswfalse
% \@pboxswtrue
% \@pgbk
% \@picbox
% \@picht
% \@picture
% \@pnumwidth
% \@preamble
% \@preamblecmds
% \@preamerr
% \@put
% \@qend
% \@qrelax
% \@reargdef
% \@renewenv
% \@restorepar
% \@reversemarginfalse
% \@reversemargintrue
% \@rhead
% \@rightmark
% \@rightskip
% \@Roman
% \@roman
% \@rsbox
% \@rtab
% \@rule
% \@sanitize
% \@savebox
% \@savemarbox
% \@savepicbox
% \@savsf
% \@savsk
% \@scolelt
% \@sdblcolelt
% \@secpenalty
% \@sect
% \@setpar
% \@settab
% \@sharp
% \@shortstack
% \@sline
% \@spaces
% \@specialoutput
% \@specialpagefalse
% \@specialstyle
% \@sptoken
% \@sqrt
% \@ssect
% \@startcolumn
% \@startdblcolumn
% \@startfield
% \@startline
% \@startpbox
% \@startsection
% \@starttoc
% \@stopfield
% \@stopline
% \@stpelt
% \@svector
% \@sverb
% \@svsec
% \@svsechd
% \@tabacol
% \@tabarray
% \@tabclassiv
% \@tabclassz
% \@tabcr
% \@tablab
% \@tabminus
% \@tabplus
% \@tabpush
% \@tabrj
% \@tabular
% \@tabularcr
% \@temp
% \@tempa
% \@tempb
% \@tempbox
% \@tempboxa
% \@tempc
% \@tempcnta
% \@tempcntb
% \@tempd
% \@tempdima
% \@tempdimb
% \@tempe
% \@tempskipa
% \@tempskipb
% \@tempswa
% \@tempswafalse
% \@tempswatrue
% \@temptokena
% \@testdef
% \@testfp
% \@testpach
% \@textbottom
% \@textfloatsep
% \@textmin
% \@texttop
% \@tfor
% \@tforloop
% \@thanks
% \@thefnmark
% \@thefoot
% \@thehead
% \@themargin
% \@themark
% \@thm
% \@thmcounter
% \@thmcountersep
% \@tocrmarg
% \@toodeep
% \@toplist
% \@topnewpage
% \@topnum
% \@toproom
% \@topsep
% \@topsepadd
% \@totalleftmargin
% \@trivlist
% \@tryfcolumn
% \@trylist
% \@twocolumnfalse
% \@twoside
% \@twosidefalse
% \@typein
% \@upline
% \@upordown
% \@upvector
% \@verb
% \@verbatim
% \@vline
% \@vobeyspaces
% \@vspace
% \@vspacer
% \@vtryfc
% \@vvector
% \@warning
% \@wckptelt
% \@whiledim
% \@whilenoop
% \@whilenum
% \@whilesw
% \@whileswnoop
% \@wholewidth
% \@width
% \@wrindex
% \@writeckpt
% \@writefile
% \@wtryfc
% \@x@sf
% \@xarg
% \@xargarraycr
% \@xarraycr
% \@xbitor
% \@xcentercr
% \@xdblarg
% \@xdblfloat
% \@xdim
% \@xeqncr
% \@xexnoop
% \@xexpast
% \@xfloat
% \@xfootnote
% \@xfootnotemark
% \@xfootnotenext
% \@xhead
% \@xifnch
% \@xmpar
% \@xnewline
% \@xnthm
% \@xobeysp
% \@xsect
% \@xstartcol
% \@xtabcr
% \@xtabularcr
% \@xthm
% \@xtryfc
% \@xtypein
% \@xverbatim
% \@xxxii
% \@xympar
% \@yarg
% \@yargarraycr
% \@ydim
% \@yeqncr
% \@yhead
% \@ympar
% \@ynthm
% \@ythm
% \@ytryfc
% \@yyarg
% \@ztryfc
% \a
% \active
% \addcontentsline
% \addpenalty
% \addtocontents
% \addtocounter
% \addtolength
% \addvspace
% \advance
% \alloc@
% \allocationnumber
% \Alph
% \alph
% \and
% \appendix
% \arabic
% \array
% \arraycolsep
% \arrayrulewidth
% \arraystretch
% \author
% \bar
% \baselineskip
% \begin
% \begingroup
% \bf
% \bgroup
% \bibcite
% \bibdata
% \bibitem
% \bibliography
% \bibliographystyle
% \bibstyle
% \BIG
% \Big
% \big
% \bigskip
% \botfigrule
% \botmark
% \botnum
% \bottomfraction
% \box
% \boxmaxdepth
% \buildrel
% \bullet
% \c@bottomnumber
% \c@chapter
% \c@dbltopnumber
% \c@equation
% \c@eval
% \c@footnote
% \c@mpfootnote
% \c@page
% \c@secnumdepth
% \c@section
% \c@tocdepth
% \c@topnumber
% \c@totalnumber
% \caption
% \catcode
% \catcoded
% \center
% \centering
% \chapter
% \chaptermark
% \char
% \chardef
% \circle
% \cite
% \cl@@ckpt
% \cleardoublepage
% \clearpage
% \cline
% \closeout
% \clubpenalty
% \columnsep
% \columnseprule
% \columnwidth
% \contentsline
% \copy
% \count
% \countdef
% \cr
% \crcr
% \csname
% \dag
% \dagger
% \dashbox
% \date
% \dblfigrule
% \dblfloatpagefraction
% \dblfloatsep
% \dbltexfloatsep
% \dbltextfloatsep
% \dbltopfraction
% \ddagger
% \deadcycles
% \def
% \description
% \dimen
% \dimen@
% \discretionary
% \displaymath
% \displaystyle
% \displaywidth
% \divide
% \do
% \document
% \documentstyle
% \dospecials
% \doublerulesep
% \dp
% \edef
% \egroup
% \else
% \end
% \end@dblfloat
% \end@float
% \endarray
% \endcsname
% \enddocument
% \endenumerate
% \endequation
% \endfigure
% \endgroup
% \enditemize
% \endlist
% \endpicture
% \endsloppypar
% \endtabbing
% \endtabular
% \endthebibliography
% \endtrivlist
% \enumerate
% \eqnarray
% \eqno
% \equation
% \errmessage
% \errorstopmode
% \eval
% \evensidemargin
% \everyjob
% \everypar
% \expandafter
% \extracolsep
% \fbox
% \fboxrule
% \fboxsep
% \fi
% \figure
% \fill
% \firstmark
% \float
% \floatingpenalty
% \floatpagefraction
% \floatsep
% \flushbottom
% \flushleft
% \flushright
% \fnsymbol
% \footins
% \footinsertskip
% \footnote
% \footnotemark
% \footnoterule
% \footnotesep
% \footnotesize
% \footnotetext
% \footsep
% \footskip
% \frac
% \frame
% \framebox
% \frenchspacing
% \fussy
% \futurelet
% \gdef
% \global
% \glossary
% \halfwidth
% \halign
% \hangindent
% \hbox
% \head
% \headheight
% \headsep
% \hfil
% \hfill
% \hfuzz
% \hline
% \hrule
% \hsize
% \hskip
% \hspace
% \hss
% \ht
% \Huge
% \huge
% \hyphenchar
% \if
% \if@afterindent
% \if@eqnsw
% \if@endpe
% \if@fcolmade
% \if@filesw
% \if@firstamp
% \if@firstcolumn
% \if@ignore
% \if@inlabel
% \if@insert
% \if@minipage
% \if@mparswitch
% \if@negarg
% \if@newlist
% \if@nmbrlist
% \if@nobreak
% \if@noitemarg
% \if@noparitem
% \if@noparlist
% \if@noskipsec
% \if@ovb
% \if@ovl
% \if@ovr
% \if@ovt
% \if@pboxsw
% \if@reversemargin
% \if@rjfield
% \if@specialpage
% \if@tempswa
% \if@test
% \if@twocolumn
% \if@twoside
% \ifcase
% \ifdim
% \ifeof
% \ifhmode
% \ifinner
% \ifmmode
% \ifnum
% \ifodd
% \ifvmode
% \ifvoid
% \ifx
% \ignorespaces
% \immediate
% \include
% \includeonly
% \indent
% \index
% \indexentry
% \input
% \insc@unt
% \insert
% \interdisplaylinepenalty
% \interfootnotelinepenalty
% \interlinepenalty
% \intextsep
% \it
% \item
% \itemindent
% \itemize
% \itemsep
% \jobname
% \kern
% \kill
% \label
% \labelenumi
% \labelenumiv
% \labelitemi
% \labelitemii
% \labelitemiii
% \labelitemiv
% \labelsep
% \labelwidth
% \LARGE
% \Large
% \large
% \lastbox
% \lastskip
% \LaTeX
% \lbrace
% \leaders
% \leavevmode
% \lefteqn
% \leftmargin
% \leftmargini
% \leftmarginvi
% \leftmark
% \leftskip
% \let
% \limits
% \line
% \linebreak
% \lineskip
% \linethickness
% \linewidth
% \list
% \listoffigures
% \listoftables
% \listparindent
% \llap
% \long
% \lower
% \m@ne
% \m@th
% \makeatletter
% \makeatother
% \makebox
% \makeglossary
% \makeindex
% \makelabel
% \maketitle
% \marginpar
% \marginparpush
% \marginparsep
% \marginparwidth
% \mark
% \markboth
% \markright
% \math
% \mathchar
% \mathchardef
% \mathop
% \mathrel
% \maxdeadcycles
% \maxdepth
% \maxdimen
% \mb@b
% \mb@eval
% \mb@l
% \mb@r
% \mb@t
% \mbox
% \medskip
% \message
% \minipage
% \mit
% \mkern
% \moveright
% \mskip
% \multicolumn
% \multiply
% \multiput
% \multispan
% \newbox
% \newcommand
% \newcount
% \newcounter
% \newdimen
% \newenvironment
% \newif
% \newinsert
% \newlabel
% \newlength
% \newline
% \newlinechar
% \newpage
% \newsavebox
% \newskip
% \newswitch
% \newtheorem
% \newtoks
% \newwrite
% \noalign
% \nobreak
% \nocite
% \noexpand
% \nofiles
% \noindent
% \nointerlineskip
% \nolinebreak
% \nonumber
% \nopagebreak
% \normalbaselineskip
% \normallineskip
% \normalmarginpar
% \normalsize
% \nullfont
% \number
% \numberline
% \obeycr
% \obeylines
% \obeyspaces
% \oddsidemargin
% \of
% \on@line
% \onecolumn
% \openin
% \or
% \outer
% \output
% \outputpenalty
% \oval
% \over
% \overfullrule
% \overline
% \p@
% \pagebreak
% \pagelayout
% \pagenumbering
% \pageref
% \pagestyle
% \par
% \paragraph
% \parbox
% \parfillskip
% \parindent
% \parsep
% \parshape
% \parskip
% \partopsep
% \partsw
% \penalty
% \picture
% \poptab
% \poptabs
% \postdisplaypenalty
% \prevdepth
% \protect
% \ps@empty
% \ps@plain
% \pushtab
% \pushtabs
% \put
% \quotation
% \raggedbottom
% \raggedleft
% \raggedright
% \raise
% \raisebox
% \rbrace
% \read
% \ref
% \refstepcounter
% \relax
% \renewcommand
% \renewenvironment
% \reset@font
% \restorecr
% \reversemarginpar
% \right
% \rightmargin
% \rightmark
% \rightskip
% \rlap
% \rm
% \Roman
% \roman
% \romannumeral
% \root
% \rule
% \samepage
% \savebox
% \sbox
% \sc
% \scriptscriptsize
% \scriptsize
% \secdef
% \section
% \sectionmark
% \setbox
% \setcounter
% \setlength
% \settowidth
% \shipout
% \shortstack
% \showboxbreadth
% \showboxdepth
% \sixt@@n
% \skip
% \sl
% \SLiTeX
% \sloppy
% \sloppypar
% \small
% \smallskip
% \space
% \spacefactor
% \splitmaxdepth
% \splittopskip
% \sqrt
% \ss
% \stackrel
% \stepcounter
% \stop
% \stretch
% \string
% \strut
% \subsection
% \subsubsection
% \tabalign
% \tabbing
% \tabbingsep
% \tabcolsep
% \tableentry
% \tableofcontents
% \tabskip
% \tabular
% \tencirc
% \tencircw
% \tenln
% \tenlnw
% \textfloatsep
% \textfraction
% \textheight
% \textwidth
% \thanks
% \the
% \thebibliography
% \theenumi
% \theenumii
% \theequation
% \thefigure
% \thefootnote
% \thempfn
% \thempfootnote
% \thepage
% \thesection
% \thicklines
% \thinlines
% \thinspace
% \thispagestyle
% \tiny
% \title
% \today
% \tolerance
% \topfigrule
% \topfraction
% \topmargin
% \topnewpage
% \topnum
% \topsep
% \topskip
% \tracingonline
% \tracingoutput
% \tracingstats
% \trivlist
% \tt
% \tw@
% \twocolumn
% \typein
% \typeout
% \unbox
% \underline
% \unhbox
% \unitlength
% \unskip
% \unvbox
% \usebox
% \usecounter
% \vadjust
% \value
% \vbox
% \vcenter
% \vector
% \verb
% \verbatim
% \vfil
% \vfuzz
% \vline
% \vrule
% \vsize
% \vskip
% \vspace
% \vsplit
% \vss
% \vtop
% \wd
% \write
% \writes
% \xdef
% \z@
% \[
% \\
% \]
% \^
% \_
% \`
% \{
% \|
% \}
% \~




% ****************************************
% * GENERAL CONVENTIONS *
% ****************************************
%
% THE \LaTeX AND \SLiTeX LOGOS ARE DEFINED HERE.
%
%% RmS 91/09/29: \reset@font added to \LaTeX logo.
\def\p@LaTeX{{\reset@font\rm L\kern-.36em\raise.3ex\hbox{\sc a}\kern-.15em%
T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}

%% RmS 91/09/29: \SLiTeX logo added.
\def\p@SLiTeX{{\reset@font\rm S\kern-.06em{\sc l\kern-.035emi}\kern-.06emT\kern
-.1667em\lower.7ex\hbox{E}\kern-.125emX}}

%% RmS 91/10/17: \protect'ed the logos
\def\LaTeX{\protect\p@LaTeX}
\def\SLiTeX{\protect\p@SLiTeX}


% SAVED VERSIONS OF TeX PRIMITIVES:
%
% The TeX primitive \foo is saved as \@@foo . The following primitives
% are handled in this way:

\let\@@par=\par
%\let\@@relax=\relax % This was needed at one time, but seems to be obsolete.
\let\@@input=\input
\let\@@end=\end

% The following was added 19 April 1986:
% The \- command is redefined to allow it to work in the \tt type style,
% where automatic hyphenation is suppressed by setting \hyphenchar to -1.
% The original definition is saved as \@@hyph just in case anyone needs it.

\let\@@hyph=\- % Original defin
\def\-{\discretionary{-}{}{}}

% SAVED VERSIONS OF TeX PARAMETERS
%
% \normalbaselineskip and \normallineskip hold the
% normal values of \baselineskip and \lineskip

% Any font-changing commands that change the normal value of \lineskip
% and \baselineskip should change their saved values.

% The following definitions save token space. E.g., using \@height
% instead of height saves 5 tokens at the cost in time of one macro
% expansion.

\def\@height{height}
\def\@depth{depth}
\def\@width{width}

% The following implements the LaTeX \{ and \} commands.
% Changed 21 Apr 87 to make them robust.

\def\{{\protect\@lb}
\def\@lb{\relax\ifmmode\lbrace\else$\m@th\lbrace$\fi}
\def\}{\protect\@rb}
\def\@rb{\relax\ifmmode\rbrace\else$\m@th\rbrace$\fi}

\message{counters,}
% ****************************************
% * COUNTERS, ETC. *
% ****************************************
%
% THE FOLLOWING ARE FROM PLAIN:
% \z@ : A zero dimen or number. It's more efficient to write
% \parindent\z@ than \parindent 0pt.
% \@ne : The number 1.
% \m@ne : The number -1.
% \tw@ : The number 2.
% \sixt@@n : The number 16.
% \@m : The number 1000.
% \@xxxii : The number 32
% \@M : The number 10000.
% \@Mi : The number 10001.
% \@Mii : The number 10002.
% \@Miii : The number 10003.
% \@Miv : The number 10004.
% \@MM : The number 20000.
%
% \@flushglue : Glue used for \right- & \leftskip to = 0pt plus 1fil

\chardef\@xxxii=32
\mathchardef\@Mi=10001
\mathchardef\@Mii=10002
\mathchardef\@Miii=10003
\mathchardef\@Miv=10004

% Redefine PLAIN.TEX macros not to be \outer

\def\newcount{\alloc@0\count\countdef\insc@unt}
\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
\def\newskip{\alloc@2\skip\skipdef\insc@unt}
\def\newbox{\alloc@4\box\chardef\insc@unt}
\def\newwrite{\alloc@7\write\chardef\sixt@@n}

\newwrite\@unused
\newcount\@tempcnta
\newcount\@tempcntb
\newif\if@tempswa\@tempswatrue

\newdimen\@tempdima
\newdimen\@tempdimb

\newbox\@tempboxa

\newskip\@flushglue \@flushglue = 0pt plus 1fil
\newskip\@tempskipa
\newskip\@tempskipb
\newtoks\@temptokena

\message{hacks,}
% ****************************************
% * USEFUL HACKS *
% ****************************************
%
% \@namedef{NAME} : Expands to \def\NAME , except name can contain any
% characters.
% \@nameuse{NAME} : Expands to \NAME .
%
% \@ifnextchar X{YES}{NO}
% : Expands to YES if next character is an 'X',
% and to NO otherwise. (Uses temps a-c.)
% NOTE: GOBBLES ANY SPACE FOLLOWING IT.
%
% \@ifstar{YES}{NO} : Gobbles following spaces and then tests if next the
% character is a '*'. If it is, then it gobbles the
% '*' and expands to YES, otherwise it expands to NO.
%
% \@dblarg{CMD}{ARG} : \@dblarg{CMD}{ARG} expands to CMD[ARG]{ARG}. Use
% \@dblarg\CS when \CS takes arguments [ARG1]{ARG2},
% where default is ARG1 = ARG2.
%
% \@ifundefined{NAME}{YES}{NO}
% : If \NAME is undefined then it executes YES,
% otherwise it executes NO. More precisely,
% true if \NAME either undefined or = \relax.
% \@ifdefinable \NAME {YES}
% : Executes YES if the user is allowed to define \NAME,
% otherwise it gives an error. The user can define \NAME
% if \@ifundefined{NAME} is true, 'NAME' /= 'relax'
% and the first three letters of 'NAME' are not
% 'end'.
% \newcommand{\FOO}[i]{TEXT}
% : User command to define \FOO to be a macro with
% i arguments (i = 0 if missing) having the definition
% TEXT. Produces an error if \FOO already defined.
%
% \renewcommand{\FOO}[i]{TEXT} : Same as \newcommand, except it
% checks if \FOO already defined.
%
% \newenvironment{FOO}[i]{DEF1}{DEF2}
% equivalent to
% \newcommand{\FOO}[i]{DEF1} \def{\endFOO}{DEF2}
%
% \renewenvironment : obvious companion to \newenvironment
%
% \@cons : See description of \output routine.
%
% \@car T1 T2 ... Tn\@nil == T1 (unexpanded)
%
% \@cdr T1 T2 ... Tn\@nil == T2 ... Tn (unexpanded)
%
% \typeout{message} : produces a warning message on the terminal
%
% \@warning{message}: prints 'LaTeX Warning: message.'
% With TeX 3.x, it also prints line number.
% (Changed 24 Jun 91 RmS)
% \@@warning{message}: like \@warning, except that it never prints
% the line number (added 24 Jun 91 RmS).
%
% \typein{message} : Types message, asks the user to type in a command, then
% executes it
%
% \typein[\CS]{MSG} : Same as above, except defines \CS to be the input
% instead of executing it.

\def\typein{\let\@typein\relax\@ifnextchar[{\@xtypein}{\@xtypein[\@typein]}}
\def\@xtypein[#1]#2{\typeout{#2}\read\z@ to#1\ifx #1\@defpar \def#1{}\else
\@iden{\expandafter\@strip\expandafter
#1#1\@gobble\@gobble} \@gobble\fi\@typein}
\def\@strip#1#2 \@gobble{\def #1{#2}}
\def\@defpar{\par}
\def\@iden#1{#1}

\ifx\inputlineno\undefined
\let\on@line\empty
\else
\ifnum\inputlineno=\m@ne
\let\on@line\empty
\else
\def\on@line{ on input line \the\inputlineno}
\fi
\fi

\def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}}
\def\@@warning#1{\typeout{LaTeX Warning: #1.}}
\def\@warning#1{\@@warning{#1\on@line}}
\def\@namedef#1{\expandafter\def\csname #1\endcsname}
\def\@nameuse#1{\csname #1\endcsname}

\def\@cons#1#2{\begingroup\let\@elt\relax\xdef#1{#1\@elt #2}\endgroup}

\def\@car#1#2\@nil{#1}
\def\@cdr#1#2\@nil{#2}

% \@carcube T1 ... Tn\@nil = T1 T2 T3 , n > 3
\def\@carcube#1#2#3#4\@nil{#1#2#3}

\def\newcommand#1{\@ifnextchar [{\@argdef#1}{\@argdef#1[0]}}


\def\renewcommand#1{\edef\@tempa{\expandafter\@cdr\string
#1\@nil}\@ifundefined{\@tempa}{\@latexerr{\string#1\space undefined}\@ehc
}{}\@ifnextchar [{\@reargdef#1}{\@reargdef#1[0]}}

\def\newenvironment#1{\@ifnextchar
[{\@newenv{#1}}{\@newenv{#1}[0]}}

\long\def\@newenv#1[#2]#3#4{\expandafter\newcommand
\csname #1\endcsname[#2]{#3}\long
\expandafter\def\csname end#1\endcsname{#4}}

\def\renewenvironment#1{\@ifnextchar
[{\@renewenv{#1}}{\@renewenv{#1}[0]}}

\long\def\@renewenv#1[#2]#3#4{\expandafter\renewcommand
\csname #1\endcsname[#2]{#3}\long
\expandafter\def\csname end#1\endcsname{#4}}

\long\def\@argdef#1[#2]#3{\@ifdefinable #1{\@reargdef#1[#2]{#3}}}

% Absolutely untypable control sequence \@?@? substituted for \@tempb in
% definition of \@reargdef because it (and therefore \newcommand and
% \renewcommand) leaves the control sequence dangerously \let to #.
% (Change made 23 November 87.)
%
\catcode`\?=11\relax
\long\def\@reargdef#1[#2]#3{\@tempcnta#2\relax\let#1\relax
\edef\@tempa{\long\def#1}\@tempcntb \@ne
\let\@?@?\relax\@whilenum\@tempcnta>\z@
\do{\edef\@tempa{\@tempa\@?@?\the\@tempcntb}\advance\@tempcntb \@ne \advance
\@tempcnta \m@ne}\let\@?@?##\@tempa{#3}}
\catcode`\?=12\relax


% 9 Jan 90 : Missing % added to following definition.
\long\def\@ifdefinable #1#2{\edef\@tempa{\expandafter\@cdr\string #1\@nil}%
\@ifundefined{\@tempa}{\edef\@tempb{\expandafter\@carcube \@tempa xxxx\@nil}%
\ifx \@tempb\@qend \@notdefinable\else
\ifx \@tempa\@qrelax \@notdefinable\else #2\fi\fi}{\@notdefinable}}

\long\def\@ifundefined#1#2#3{\expandafter\ifx\csname
#1\endcsname\relax#2\else#3\fi}


% The following define \@qend and \@qrelax to be the strings 'end' and
% 'relax' with the characters \catcoded 12.

\edef\@qend{\expandafter\@cdr\string\end\@nil}
\edef\@qrelax{\expandafter\@cdr\string\relax\@nil}

% \@ifnextchar X{YES}{NO}
% BEGIN
% \@tempe := X % uses \let
% \@tempa := YES
% \@tempb := NO
% \futurelet\@tempc
% \@ifnch
% END
%
% \@ifnch ==
% BEGIN
% if \@tempc = blank space
% then \@tempd := def(\@xifnch)
% else if \@tempc = \@tempe
% then \@tempd := def(\@tempa)
% else \@tempd := def(\@tempb)
% fi
% fi
% \@tempd
% END
%
% \@xifnch ==
% BEGIN
% gobble blanks
% \futurelet\@tempc
% \@ifnch
% END
%
\def\@ifnextchar#1#2#3{\let\@tempe #1\def\@tempa{#2}\def\@tempb{#3}\futurelet
\@tempc\@ifnch}
\def\@ifnch{\ifx \@tempc \@sptoken \let\@tempd\@xifnch
\else \ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi
\fi \@tempd}

% NOTE: the following hacking must precede the definition of \:
% as math medium space.

\def\:{\let\@sptoken= } \: % this makes \@sptoken a space token

\def\:{\@xifnch} \expandafter\def\: {\futurelet\@tempc\@ifnch}

\def\@ifstar#1#2{\@ifnextchar *{\def\@tempa*{#1}\@tempa}{#2}}

\long\def\@dblarg#1{\@ifnextchar[{#1}{\@xdblarg{#1}}}
\long\def\@xdblarg#1#2{#1[{#2}]{#2}}

% The command \@sanitize changes the catcode of all special characters
% except for braces to 'other'. It can be used for commands like
% \index that want to write their arguments verbatim. Needless to
% say, this command should only be executed within a group, or chaos
% will ensue.

\def\@sanitize{\@makeother\ \@makeother\\\@makeother\$\@makeother\&%
\@makeother\#\@makeother\^\@makeother\_\@makeother\%\@makeother\~}


\message{errors,}
% ****************************************
% * ERROR HANDLING *
% ****************************************
%
% \@latexerr{MSG}{HLP}: Types a LaTeX error message MSG and gives an error
% halt with error help message HLP.
%
\newlinechar`\^^J

% 19 Jun 86, took out the grouping. re: John Hobby
\def\@latexerr#1#2{%
\edef\@tempc{#2}\errhelp\expandafter{\@tempc}%
\typeout{LaTeX error. \space See LaTeX manual for explanation.^^J
\space\@spaces\@spaces\@spaces Type \space H \space for
immediate help.}\errmessage{#1}}

\def\@spaces{\space\space\space\space}

%% error help message pieces.
\def\@eha{Your command was ignored.
^^JType \space I \space to replace it
with another command,^^Jor \space \space to continue without it.}
\def\@ehb{You've lost some text. \space \@ehc}
\def\@ehc{Try typing \space
\space to proceed.^^JIf that doesn't work, type \space X \space to
quit.}
\def\@ehd{You're in trouble here. \space\@ehc}

% Here are all the error message-generating commands of LaTeX.
%
% \@notdefinable : Error message generated in \@ifdefinable from calls
% by \newcommand, \newlength, \newtheorem specifying an
% already-defined command name.
%
% \@nolnerr : Generated by \newline and \\ when called in vertical mode.
%
% '\... undefined' : Generated in \renewcommand.
%
% \@nocnterr : Generated by \setcounter, \addtocounter or \newcounter
% for undefined counter.
%
% \@ctrerr : Called when trying to print the value of a counter
% numbered by letters that's greater than 26.
%
% 'Environment --- undefined' : Issued by \begin for undefined environment.
%
% \@badend : Called by \end that doesn't match its \begin.
%
% \@badmath : Called by \[, \], \( or \) when used in wrong mode.
%
% \@toodeep : Called by a list environment nested more than six levels
% deep, or an enumerate or itemize nested more than four
% levels.
%
% \@badpoptabs : Called by \endtabbing when not enough \poptabs have
% occurred, or by \poptabs when too many have occurred.
%
% \@badtab : Called by \>, \+ , \- or \< when stepping to an undefined tab.
%
% 'tab overflow' : Occurs in \= when maximum number of tabs exceeded.
%
% '\< in mid line' : Occurs in \< when it appears in middle of line.
%
% \@preamerr : Occurs in array or tabular environment, or in \multicolumn
% command, when error in argument detected.
%
% \@badlinearg : Occurs in \line and \vector command when a bad slope
% argument is encountered.
%
% \@parmoderr : Occurs in a float environment or a \marginpar when
% encountered in inner vertical mode.
%
% \@fltovf : Occurs in float environment or \marginpar when there
% are no more free boxes for storing floats.
%
% \@latexbug : Occurs in output routine. This is bad news.
%
% 'Float(s) lost' : In output routine, caused by a float environment or
% \marginpar occurring in inner vertical mode.
%
% \@nofonterror : Typeface not available. %%% OBSOLETE; DELETED.
%
% \@badcrerr : A \\ used where it shouldn't be in a centering or flushing
% environment.
%
% \@noitemerr : \addvspace or \addpenalty was called when not in vmode.
% Probably caused by a missing \item.
%
% \@notprerr : A command that can be used only in the preamble
% appears after the \begin{document} command.

\def\@notdefinable{\@latexerr{Command name '\@tempa' already used}\@eha}

\def\@nolnerr{\@latexerr{There's no line here to end}\@eha}

\def\@nocnterr{\@latexerr{No such counter}\@eha}

\def\@ctrerr{\@latexerr{Counter too large}\@ehb}

\def\@nodocument{\@latexerr{Missing \string\begin{document}}\@ehd}

\def\@badend#1{\@latexerr{\string\begin{\@currenvir} ended by
\string\end{#1}}\@eha}

\def\@badmath{\@latexerr{Bad math environment delimiter}\@eha}

\def\@toodeep{\@latexerr{Too deeply nested}\@ehd}

\def\@badpoptabs{\@latexerr{\string\pushtabs \space and \string\poptabs
\space don't match}\@ehd}

\def\@badtab{\@latexerr{Undefined tab position}\@ehd}

\def\@preamerr#1{\@latexerr{\ifcase #1 Illegal character\or
Missing @-exp\or Missing p-arg\fi\space
in array arg}\@ehd}

\def\@badlinearg{\@latexerr{Bad \string\line\space or \string\vector
\space argument}\@ehb}

\def\@parmoderr{\@latexerr{Not in outer par mode}\@ehb}

\def\@fltovf{\@latexerr{Too many unprocessed floats}\@ehb}

\def\@latexbug{\@latexerr{This may be a LaTeX bug}{Call for help}}

% \def\@nofonterror{\@latexerr{Typeface not available}\@eha}

\def\@badcrerr {\@latexerr{Bad use of \string\\}\@ehc}

\def\@noitemerr{\@latexerr{Something's wrong--perhaps a missing
\string\item}\@ehc}

\def\@notprerr {\@latexerr{Can be used only in preamble}\@eha}

\message{par,}
% ****************************************
% * \par AND \everypar *
% ****************************************
%
% There are two situations in which \par may be changed:
%
% - Long-term changes, in which the new value is to remain in effect
% until the current environment is left. The environments that
% change \par in this way are the following:
%
% * All list environments (itemize, quote, etc.)
% * Environments that turn \par into a noop:
% tabbing, array and tabular.
%
% - Temporary changes, in which \par is restored to its previous value the
% next time it is executed. The following are all such uses.
% * \end [when preceded by \@endparenv, which is called by
% \endtrivlist]
% * The mechanism for avoiding page breaks and getting the
% spacing right after section heads.
%
% To permit the proper interaction of these two situations, long-term
% changes are made by the following command:
% \@setpar{VAL} : To set \par. It \def's \par and \@par to VAL.
% Short-term changes are made by the usual \def\par commands.
% The original values are restored after a short-term change
% by the \@restorepar commands.
%
% NOTE: \@@par always is defined to be the original TeX \par.
%
% \everypar is changed only for the short term. Whenever \everypar
% is set non-null, it should restore itself to null when executed.
% The following commands change \everypar in this way:
% * \item
% * \end [when preceded by \@endparenv, which is called by
% \endtrivlist]
% * \minipage
%
% WARNING: Commands that make short-term changes to \par and \everypar
% must take account of the possibility that the new commands and the
% ones that do the restoration may be executed inside a group. In
% particular, \everypar is executed inside a group whenever a new paragraph
% begins with a left brace. The \everypar command that restores its
% definition should be local to the current group (in case the command
% is inside a minipage used inside someplace where \everypar has been
% redefined). Thus, if \everypar is redefined to do an \everypar{}
% it could take several executions of \everypar before
% the restoration 'holds'. This usually causes no problem. However, to
% prevent the extra executions from doing harm, use a global switch
% to keep anything harmful in the new \everypar from being done twice.
%
% WARNING: Commands that change \everypar should remember that \everypar
% might be supposed to set the following switches false:
% @nobreak
% @minipage
% they should do the setting if necessary.

\def\@par{\let\par\@@par\par}

\def\@setpar#1{\def\par{#1}\def\@par{#1}}
\def\@restorepar{\def\par{\@par}}

\message{spacing,}
% **********************************************
% * SPACING / LINE AND PAGE BREAKING *
% **********************************************
%
% USER COMMANDS:
% \nopagebreak[i] : i = 0,...,4. Default argument = 4. Puts a penalty
% into the vertical list output as follows:
% 0 : penalty = 0
% 1 : penalty = \@lowpenalty
% 2 : penalty = \@medpenalty
% 3 : penalty = \@highpenalty
% 4 : penalty = 10000
% \pagebreak[i] : same as \nopagebreak except negatives of its penalty
% \linebreak[i], \nolinebreak[i] : analogs of the above
% \samepage : inhibits page breaking most places by setting the following
% penalties to 10000
% \interlinepenalty
% \postdisplaypenalty
% \interdisplaylinepenalty
% \@beginparpenalty
% \@endparpenalty
% \@itempenalty
% \@secpenalty
% \interfootnotelinepenalty
%
% \obeycr : defines == \\.
% \restorecr : restores to its usual meaning.
%
% \\ : initially defined to be \newline
% \\[LENGTH] : initially defined to be \vspace{LENGTH}\newline
% Note: \\* adds a \vadjust{\penalty 10000}

\def\nopagebreak{\@ifnextchar[{\@nopgbk}{\@nopgbk[4]}}
\def\@nopgbk[#1]{\ifvmode \penalty \@getpen{#1}\else
\@bsphack\vadjust{\penalty \@getpen{#1}}\@esphack\fi}

\def\pagebreak{\@ifnextchar[{\@pgbk}{\@pgbk[4]}}
\def\@pgbk[#1]{\ifvmode \penalty -\@getpen{#1}\else
\@bsphack\vadjust{\penalty -\@getpen{#1}}\@esphack\fi}

\def\nolinebreak{\@ifnextchar[{\@nolnbk}{\@nolnbk[4]}}
\def\@nolnbk[#1]{\ifvmode \@nolnerr\else \@tempskipa\lastskip
\unskip \penalty \@getpen{#1}\ifdim \@tempskipa >\z@
\hskip\@tempskipa\ignorespaces\fi\fi}

\def\linebreak{\@ifnextchar[{\@lnbk}{\@lnbk[4]}}
\def\@lnbk[#1]{\ifvmode \@nolnerr\else
\unskip\penalty -\@getpen{#1}\fi}

\def\samepage{\interlinepenalty\@M
\postdisplaypenalty\@M
\interdisplaylinepenalty\@M
\@beginparpenalty\@M
\@endparpenalty\@M
\@itempenalty\@M
\@secpenalty\@M
\interfootnotelinepenalty\@M}

% \nobreak added to \newline to prevent null lines when \newline
% ends an overfull line. Change made 24 May 89 as suggested by
% Frank Mittelbach and Rainer Sch\"opf
%
\def\newline{\ifvmode \@nolnerr \else \unskip\nobreak\hfil
\penalty -\@M\fi}


\def\@normalcr{\@ifstar{\vadjust{\penalty\@M}\@xnewline}{\@xnewline}}

\def\@xnewline{\@ifnextchar[{\@newline}{\newline}}

\def\@newline[#1]{\ifhmode\unskip\fi\vspace{#1}\newline}

\let\\=\@normalcr

\def\@getpen#1{\ifcase #1 0 \or \@lowpenalty\or
\@medpenalty \or \@highpenalty
\else \@M \fi}

% @nobreak : Switch used to avoid page breaks caused by \label after a section
% heading, etc. It should be GLOBALLY set true after the \nobreak
% and GLOBALLY set false by the next invocation of \everypar.
% Commands that reset \everypar should globally set it false
% if appropriate.
%
\newif\if@nobreak \@nobreakfalse

% \@bsphack ... \@esphack
% used by macros such as \index and \begin{@float} ... \end{@float}
% that want to be invisible -- i.e.,
% not leave any extra space when used in the middle of text. Such
% a macro should begin with \@bsphack and end with \@esphack
% The macro in question should not create any text, nor change the
% mode.
%
% \@bsphack ==
% BEGIN
% if not mmode then %% Test for math mode added 18 Dec 89
% \dimen\@savsk := \lastskip
% if hmode then \@savsf := \spacefactor fi
% fi
% END
%
% \@esphack ==
% BEGIN
% if not mmode then %% Test for math mode added 18 Dec 89
% if hmode
% then \spacefactor := \@savsf
% if \dimen\@savsk > 0pt then \ignorespaces
% \global\@ignoretrue fi
% fi
% fi
% END
%

\newdimen\@savsk
\newcount\@savsf

\def\@bsphack{\relax\ifmmode\else\@savsk\lastskip
\ifhmode\@savsf\spacefactor\fi\fi}

\def\@esphack{\relax\ifmmode\else\ifhmode\spacefactor\@savsf
{}\ifdim \@savsk >\z@ \global\@ignoretrue \ignorespaces
\fi \fi\fi}

% VERTICAL SPACING:
%
% LaTeX supports the PLAIN TeX commands \smallskip, \medskip and \bigskip.
% However, it redefines them using \vspace instead of \vskip.
%
% Extra vertical space is added by the command command \addvspace{SKIP},
% which adds a vertical skip of SKIP to the document. The sequence
% \addvspace{S1} \addvspace{S2}
% is equivalent to
% \addvspace{maximum of S1, S2}.
% \addvspace should be used only in vertical mode, and gives an error if it's
% not. The \addvspace command does NOT add vertical space if
% @minipage = T. The minipage environment uses this to inhibit
% the addition of extra vertical space at the beginning.
%
% Penalties are put into the vertical list with the \addpenalty{PENALTY}
% command. It works properly when \addpenalty and \addvspace commands
% are mixed.
%
% The @nobreak switch is set true used when in vertical mode and no page
% break should occur. (Right now, it is used only by the section heading
% commands to inhibit page breaking after a heading.)
%
%
% \addvspace{SKIP} ==
% BEGIN
% if vmode
% then if @minipage
% else if \lastskip =0
% then \vskip SKIP
% else if \lastskip < SKIP
% then \vskip -\lastskip
% \vskip SKIP
% else if SKIP < 0 and \lastskip >= 0
% then \vskip -\lastskip
% \vskip \lastskip + SKIP
% fi fi fi fi
% else 'missing \item' error.
% fi
% END

\def\addvspace#1{\ifvmode
\if@minipage\else
\ifdim \lastskip =\z@ \vskip #1\relax
\else \@tempskipb#1\relax\@xaddvskip
\fi\fi
\else\@noitemerr\fi}

\def\@xaddvskip{\ifdim \lastskip <\@tempskipb\vskip-\lastskip\vskip
\@tempskipb
\else \ifdim \@tempskipb<\z@
\ifdim \lastskip <\z@
\else \advance\@tempskipb\lastskip
\vskip -\lastskip \vskip \@tempskipb
\fi\fi\fi}

\def\addpenalty#1{\ifvmode
\if@minipage\else\if@nobreak\else
\ifdim\lastskip=\z@ \penalty#1\relax
\else \@tempskipb\lastskip
\vskip -\lastskip \penalty#1\vskip\@tempskipb
\fi\fi\fi
\else\@noitemerr\fi}

\def\vspace{\@ifstar{\@vspacer}{\@vspace}}
\def\@vspace#1{\ifvmode
\dimen@\prevdepth \vskip #1\vskip\z@ \prevdepth\dimen@
\else
\@bsphack\vadjust{\dimen@\prevdepth
\vskip #1\vskip\z@ \prevdepth\dimen@}\@esphack\fi}
\def\@vspacer#1{\ifvmode \dimen@\prevdepth
\hrule \@height\z@ \nobreak \vskip #1\vskip\z@
\prevdepth\dimen@
\else
\@bsphack\vadjust{\dimen@\prevdepth \hrule \@height\z@ \nobreak
\vskip #1\vskip\z@ \prevdepth\dimen@}\@esphack\fi}

\def\smallskip{\vspace\smallskipamount}
\def\medskip{\vspace\medskipamount}
\def\bigskip{\vspace\bigskipamount}


% See list environment for explanation of the following macros.

\def\endtrivlist{\if@newlist\@noitemerr\fi
\if@inlabel\indent\fi
\ifhmode\unskip \par\fi
\if@noparlist \else
\ifdim\lastskip >\z@ \@tempskipa\lastskip \vskip -\lastskip
\advance\@tempskipa\parskip \advance\@tempskipa -\@outerparskip
\vskip\@tempskipa
\fi\@endparenv\fi}

% CHANGES TO \@endparenv:
% Changed \hskip -\parindent to \setbox0=\lastbox so a \noindent
% becomes a no-op when used before a line immediately following a
% list environment. (Changed 23 Oct 86)
%
% To suppress the paragraph indentation in text immediately following
% a paragraph-making environment, \everypar is changed to remove the
% space, and \par is redefined to restore \everypar. Instead of redefining
% \par and \everpar, \@endparenv was changed to set the @endpe switch,
% letting \end redefine \par and \everypar. This allows paragraph-
% making environments work right when called by other environments.
% (Changed 27 Oct 86)

\def\@endparenv{\addpenalty\@endparpenalty\addvspace\@topsepadd\@endpetrue}

\def\@doendpe{\@endpetrue
\def\par{\@restorepar\everypar{}\par\@endpefalse}\everypar
{\setbox\z@\lastbox\everypar{}\@endpefalse}}

\newif\if@endpe
\@endpefalse

% HORIZONTAL SPACE
%
% \, : used in paragraph mode produces a \thinspace. It has the ordinary
% definition in math mode. Useful for quotes inside quotes, as in
% ``\,`Foo', he said.''
%
% \@ : placed before a '.', makes it a sentence-ending period. Does the
% right thing for other punctuation marks as well. Does this by
% setting spacefactor to 1000.

\def\,{\protect\pcomma}
\def\pcomma{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}


\def\@{\spacefactor\@m}

\def\hspace{\protect\phspace}
\def\phspace{\@ifstar{\@hspacer}{\@hspace}}
\def\@hspace#1{\leavevmode\hskip #1\relax}

\def\@hspacer#1{\leavevmode\vrule \@width\z@\nobreak
\hskip #1\hskip \z@skip}
%% extra \hskip 0pt added 12/17/85 to guard
%% against a following \unskip
%% \relax added 13 Oct 88 for usual TeX lossage
%% replaced both changes by \hskip\z@skip 27 Nov 91

% define \fill to = 0pt plus 1fill
\newskip\fill \fill = 0pt plus 1fill

% \stretch{N} == 0pt plus N fill
\def\stretch#1{\z@ plus #1fill\relax}

{\catcode`\^^M=13 \gdef\obeycr{\catcode`\^^M=13 \def^^M{\\}\@gobblecr}%
\gdef\restorecr{\catcode`\^^M=5 }} %} BRACE MATCHING


\message{control,}
% **********************************************
% * PROGRAM CONTROL STRUCTURE MACROS *
% **********************************************
%
% \@whilenum TEST \do {BODY}
% \@whiledim TEST \do {BODY} : These implement the loop
% while TEST do BODY od
% where TEST is a TeX \ifnum or \ifdim test, respectively.
% They are optimized for the normal case of TEST initially false.
%
% \@whilesw SWITCH \fi {BODY} : Implements the loop
% while SWITCH do BODY od
% where SWITCH is a command defined by \newswitch.
% Optimized for normal case of SWITCH initially false.
%
% \@for NAME := LIST \do {BODY} : Assumes that LIST expands to A1,A2, ... ,An .
% Executes BODY n times, with NAME = Ai on the i-th iteration.
% Optimized for the normal case of n = 1. Works for n=0.
%
% \@tfor NAME := LIST \do {BODY}
% if, before expansion, LIST = T1 ... Tn where each Ti is a
% token or {...}, then executes BODY n times, with NAME = Ti
% on the i-th iteration. Works for n=0.
%
% NOTES: 1. These macros use no \@temp sequences.
% 2. These macros do not work if the body contains anything that looks
% syntactically to TeX like an improperly balanced \if \else \fi.
%
% \@whilenum TEST \do {BODY} ==
% BEGIN
% if TEST
% then BODY
% \@iwhilenum{TEST \relax BODY}
% END
%
% \@iwhilenum {TEST BODY} ==
% BEGIN
% if TEST
% then BODY
% \@nextwhile = def(\@iwhilenum)
% else \@nextwhile = def(\@whilenoop)
% fi
% \@nextwhile {TEST BODY}
% END
%
% \@whilesw SWITCH \fi {BODY} ==
% BEGIN
% if SWITCH
% then BODY
% \@iwhilesw {SWITCH BODY}\fi
% fi
% END
%
% \@iwhilesw {SWITCH BODY} \fi ==
% BEGIN
% if SWITCH
% then BODY
% \@nextwhile = def(\@iwhilesw)
% else \@nextwhile = def(\@whileswnoop)
% fi
% \@nextwhile {SWITCH BODY} \fi
% END

\def\@whilenoop#1{}
\def\@whilenum#1\do #2{\ifnum #1\relax #2\relax\@iwhilenum{#1\relax
#2\relax}\fi}
\def\@iwhilenum#1{\ifnum #1\let\@nextwhile\@iwhilenum
\else\let\@nextwhile\@whilenoop\fi\@nextwhile{#1}}

\def\@whiledim#1\do #2{\ifdim #1\relax#2\@iwhiledim{#1\relax#2}\fi}
\def\@iwhiledim#1{\ifdim #1\let\@nextwhile\@iwhiledim
\else\let\@nextwhile\@whilenoop\fi\@nextwhile{#1}}

\long\def\@whileswnoop#1\fi{}
\long\def\@whilesw#1\fi#2{#1#2\@iwhilesw{#1#2}\fi\fi}
\long\def\@iwhilesw#1\fi{#1\let\@nextwhile\@iwhilesw
\else\let\@nextwhile\@whileswnoop\fi\@nextwhile{#1}\fi}

% \@for NAME := LIST \do {BODY} ==
% BEGIN \@forloop expand(LIST),\@nil,\@nil \@@ NAME {BODY} END
%
% \@forloop CAR, CARCDR, CDRCDR \@@ NAME {BODY} ==
% BEGIN
% NAME = CAR
% if def(NAME) = def(\@nnil)
% else BODY;
% NAME = CARCDR
% if def(NAME) = def(\@nnil)
% else BODY
% \@iforloop CDRCDR \@@ NAME \do {BODY}
% fi
% fi
% END
%
% \@iforloop CAR, CDR \@@ NAME {BODY} =
% NAME = CAR
% if def(NAME) = def(\@nnil)
% then \@nextwhile = def(\@fornoop)
% else BODY ;
% \@nextwhile = def(\@iforloop)
% fi
% \@nextwhile name cdr {body}
%
% \@tfor NAME := LIST \do {BODY}
% = \@tforloop LIST \@nil \@@ NAME {BODY}
%
% \@tforloop car cdr \@@ name {body} =
% name = car
% if def(name) = def(\@nnil)
% then \@nextwhile == \@fornoop
% else body ;
% \@nextwhile == \@forloop
% fi
% \@nextwhile name cdr {body}
%

\def\@nnil{\@nil}
\def\@empty{}
\def\@fornoop#1\@@#2#3{}

\def\@for#1:=#2\do#3{\edef\@fortmp{#2}\ifx\@fortmp\@empty \else
\expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi}

\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
#5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi}

\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
\let\@nextwhile\@fornoop \else
#4\relax\let\@nextwhile\@iforloop\fi\@nextwhile#2\@@#3{#4}}

%%RmS 91/10/17: Correctedd bug in \@tfor: \xdef replaced by \def
%% (See FMi's array.doc)
\def\@tfor#1:=#2\do#3{\def\@fortmp{#2}\ifx\@fortmp\@empty \else
\@tforloop#2\@nil\@nil\@@#1{#3}\fi}
\def\@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
\let\@nextwhile\@fornoop \else
#4\relax\let\@nextwhile\@tforloop\fi\@nextwhile#2\@@#3{#4}}


\message{files,}
% ****************************************
% * FILE HANDLING *
% ****************************************
%
% THE FOLLOWING USER COMMANDS ARE DEFINED IN THIS PART:
% \document : Reads in the .AUX files and \catcode's @ to 12.
% \nofiles : Suppresses all file output by setting \@filesw false.
% \includeonly{NAME1, ... ,NAMEn}
% : Causes only parts NAME1, ... ,NAMEn to be read by
% their \include commands. Works by setting \@partsw true
% and setting \@partlist to NAME1, ... ,NAMEn.
% \include{NAME} : Does an \input NAME unless \partsw is true and
% NAME is not in \@partlist. If \@filesw is true, then
% it directs .AUX output to NAME.AUX, including a
% checkpoint at the end.
% \input{NAME} : The same as TeX's \input, except it allows optional
% braces around the file name.
%
% VARIABLES, SWITCHES AND INTERNAL COMMANDS:
% \@mainaux : Output file number for main .AUX file.
% \@partaux : Output file number for current part's .AUX file.
% \@auxout : Either \@mainout or \@partout, depending on which .AUX
% file output goes to.
% \@input{foo} : If file foo exists, then \input's it, otherwise types
% a warning message.
% @filesw : Switch -- set false if no .AUX, .TOC, .IDX etc files are
% to be
% @partsw : Set true by a \includeonly command.
% \@partlist : Set to the argument of the \includeonly command.
%
% \cp@FOO : The checkpoint for \include'd file FOO.TEX, written
% by \@writeckpt at the end of file FOO.AUX
%
% \document ==
% BEGIN
% \endgroup % cancels \begingroup generated by \begin command
% \@colht := \@colroom := \vsize := \textheight
% \columnwidth := \textwidth
% \@clubpenalty := \clubpenalty % \@clubpenalty saves value.
% IF @twocolumn = T
% THEN \columnwidth := (\columnwidth - \columnsep)/2
% @firstcolumn := T
% FI
% \hsize := \linewidth := \columnwidth
% \begingroup
% \@floatplacement \@dblfloatplacement
% \@input{\jobname.aux}
% \endgroup
% IF \@filesw = T
% THEN open file \@mainaux for writing
% write ``\relax''on file \@mainaux
% FI
% \do{COMMAND} == BEGIN \let COMMAND = \@notprerr END
% \@preamblecmds
% \do == \noexpand
% \@normalsize
% \everypar{}
% @noskipsec := F
% END
%
% \includeonly{FILELIST} ==
% BEGIN
% \@partsw := T
% \@partlist := FILELIST
% END
%
% \include{FILE} ==
% BEGIN
% \clearpage
% if \@filesw = T
% then \immediate\write\@mainaux{\string\@input{FILE.AUX}}
% fi
% if \@partsw = T
% then \@tempswa := F
% \@tempb == FILE
% for \@tempa := \@partlist
% do if eval(\@tempa) = eval(\@tempb)
% then \@tempswa := T fi
% od
% fi
%
% if \@tempswa = T
% then \@auxout := \@partaux
% if \@filesw = T
% then \immediate\openout\@partaux{FILE.AUX}
% \immediate\write\@partaux{\relax}
% fi
% \@input{FILE.TEX}
% \clearpage
% \@writeckpt{FILE}
% if @filesw then \closeout \@partaux fi
% \@auxout := \@mainaux
% else \cp@FILE
% fi
% END
%
% \@writeckpt{FILE} ==
% BEGIN
% if \@filesw = T
% \immediate\write on file \@partaux:
% \gdef\cp@FILE{ %% }
% for \@tempa := \cl@@ckpt
% do \immediate\write on file \@partaux:
% \global\string\setcounter
% {eval(\@tempa)}{eval(\c@eval(\@tempa))}
% od %% {
% \immediate\write on file \@partaux: }
% fi
% END
%
% INITIALIZATION
% \@tempswa := T

\newif\if@filesw \@fileswtrue
\newif\if@partsw \@partswfalse
\newwrite\@mainaux
\newwrite\@partaux

\newcount\@clubpenalty

%% FMi & RmS 91/08/26 set @noskipsec switch to true in the preamble
%% and to false by \begin{document} to catch lists in the preamble,
%% i.e., to produce a ``nodocument'' error when things like
%% \maketitle appear before \begin{document}.
%
% \@noskipsectrue %% set below where switch is defined

% 91/03/26 FMi: |\process@table| added to support NFSS.
% This will also work with old lfonts if no other style defines
% |\process@table|.
%
\def\document{\endgroup
\@colht\textheight \@colroom\textheight \vsize\textheight
\columnwidth\textwidth \@clubpenalty\clubpenalty
\if@twocolumn \advance\columnwidth -\columnsep
\divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue
\fi
\hsize\columnwidth \linewidth\hsize
\begingroup\@floatplacement\@dblfloatplacement
\makeatletter\let\@writefile\@gobbletwo
\@input{\jobname.aux}\endgroup
\if@filesw \immediate\openout\@mainaux=\jobname.aux
\immediate\write\@mainaux{\relax}\fi
\csname process@table\endcsname
\let\glb@currsize\@empty %% Force \baselineskip initialisation.
\def\do##1{\let ##1\@notprerr}%
\@preamblecmds
\let\do\noexpand
\@normalsize\everypar{}\@noskipsecfalse}

\def\@gobbletwo#1#2{}

\def\nofiles{\@fileswfalse \typeout
{No auxiliary output files.}\typeout{}}

\def\@input#1{\openin\@ne #1 \ifeof\@ne \typeout
{No file #1.}\else\closein\@ne \relax\@@input #1 \fi}
\let\@auxout=\@mainaux

\def\includeonly#1{\@partswtrue\edef\@partlist{#1}}

% In the definition of \include, \def\@tempb changed to \edef\@tempb to
% be consistent with the \edef in \includeonly. (Suggested by Rainer
% Sch\"opf & Frank Mittelbach. Change made 20 Jul 88.)
%
% Changed definition of \include to allow space at end of file name--
% otherwise, typing \include{foo } would cause LaTeX to overwrite
% foo.tex. Change made 24 May 89, suggested by Rainer Sch\"opf and
% Frank Mittelbach

\def\include#1{\@include#1 }
\def\@include#1 {\clearpage
\if@filesw \immediate\write\@mainaux{\string\@input{#1.aux}}\fi
\@tempswatrue\if@partsw \@tempswafalse\edef\@tempb{#1}\@for
\@tempa:=\@partlist\do{\ifx\@tempa\@tempb\@tempswatrue\fi}\fi
\if@tempswa \if@filesw \let\@auxout\@partaux
\immediate\openout\@partaux #1.aux
\immediate\write\@partaux{\relax}\fi\@input{#1.tex}\clearpage
\@writeckpt{#1}\if@filesw \immediate\closeout\@partaux \fi
\let\@auxout\@mainaux\else\@nameuse{cp@#1}\fi}

\def\@writeckpt#1{\if@filesw
\immediate\write\@partaux{\string\global\string\@namedef{cp@#1}\@charlb}%
{\let\@elt\@wckptelt \cl@@ckpt}\immediate\write\@partaux{\@charrb}\fi}

\def\@wckptelt#1{\immediate\write\@partaux
{\string\setcounter{#1}{\the\@nameuse{c@#1}}}}

\def\input{\@ifnextchar \bgroup{\@iinput}{\@@input }}
\def\@iinput#1{\@@input #1 }

% The following defines \@charlb and \@charrb to be { and }, respectively
% with \catcode 11.
{\catcode`[=1 \catcode`]=2
\catcode`{=11 \catcode`}=11
\gdef\@charlb[{]
\gdef\@charrb[}]
]% }brace matching


\message{env. counters,}
% ****************************************
% * ENVIRONMENT COUNTER MACROS *
% ****************************************
%
% An environment foo has an associated counter defined by the
% following control sequences:
% \c@foo : Contains the counter's numerical value. It is defined by
% \newcount\foocounter.
% \thefoo : Macro that expands to the printed value of \foocounter.
% For example, if sections are numbered within chapters,
% and section headings look like
% Section II-3. The Nature of Counters
% then \thesection might be defined by:
% \def\thesection{\@Roman{\c@chapter}-\@arabic{\c@section}}
%
% \p@foo : Macro that expands to a printed 'reference prefix' of
% counter foo. Any \ref to a value created by counter
% foo will produce the expansion of \p@foo\thefoo when the
% the \label command is executed.
%
% NOTE: \thefoo and \p@foo MUST BE DEFINED IN SUCH A WAY THAT
% \edef\bar{\thefoo} OR \edef\bar{\p@foo}
% DEFINES \bar SO THAT IT WILL EVALUATE TO THE COUNTER VALUE AT THE TIME
% OF THE \edef, EVEN AFTER \foocounter AND ANY OTHER COUNTERS HAVE BEEN
% CHANGED. THIS WILL HAPPEN IF YOU USE THE STANDARD COMMANDS \@arabic,
% \@Roman, ETC.
%
% \cl@foo : List of counters to be reset when foo stepped. Has format
% \@elt{countera}\@elt{counterb}\@elt{counterc}.
%
% The following commands are used to define and modify counters.
% \setcounter{FOO}{VAL} : Globally sets \foocounter equal to VAL.
% \addtocounter{FOO}{VAL}: Globally increments \foocounter by VAL.
% \newcounter{NEWCTR}[OLDCTR] : Defines NEWCTR to be a counter, which is
% reset when counter OLDCTR is stepped. If
% NEWCTR already defined produces 'c@NEWCTR
% already defined' error.
% \value{CTR} : produces the value of counter CTR, for use with
% a \setcounter or \addtocounter command.
% \stepcounter{FOO} : Globally increments counter \c@FOO
% and resets all subsidiary counters.
% \refstepcounter{FOO} : Same a \stepcounter, but it also defines
% \@currentreference so that a subsequent
% \label{bar} command causes \ref{bar} to
% generate the current value of counter foo.
% \@definecounter{FOO} : Initializes counter FOO (with empty reset list),
% defines \p@FOO and \theFOO to be null.
% Also adds FOO to \cl@@ckpt -- the reset
% list of a dummy counter @ckpt used for
% taking checkpoints.
% \@addtoreset{FOO}{BAR} : Adds counter FOO to the list of counters
% \cl@BAR to be reset when counter bar is stepped.
%
% NUMBERING MACROS:
% \arabic{COUNTER} : Representation of COUNTER as arabic numerals.
% Changed 29 Apr 86 to make it print the obvious thing
% it COUNTER not positive.
%
% \roman{COUNTER} : Representation of COUNTER as lower-case
% Roman numerals.
% \Roman{COUNTER} : Representation of COUNTER as upper-case
% Roman numerals.
% \alph{COUNTER} : Representation of COUNTER as a lower-case
% letter: 1 = a, 2 = b, etc.
% \Alph{COUNTER} : Representation of COUNTER as an upper-case
% letter: 1 = A, 2 = B, etc.
% \fnsymbol{COUNTER} : Representation of COUNTER as a footnote
% symbol: 1 = *, 2 = \dagger, etc. Can be
% used only in math mode.
%
% THE ABOVE ARE IMPLEMENTED IN TERMS OF THE FOLLOWING:
% \@arabic\FOOcounter : Representation of \FOOcounter as arabic numerals.
% \@roman\FOOcounter : Representation of \FOOcounter as lower-case
% Roman numerals.
% \@Roman\FOOcounter : Representation of \FOOcounter as upper-case
% Roman numerals.
% \@alph\FOOcounter : Representation of \FOOcounter as a lower-case
% letter: 1 = a, 2 = b, etc.
% \@Alph\FOOcounter : Representation of \FOOcounter as an upper-case
% letter: 1 = A, 2 = B, etc.
% \@fnsymbol\FOOcounter : Representation of \FOOcounter as a footnote
% symbol. Can be used only in math mode.

\def\setcounter#1#2{\@ifundefined{c@#1}{\@nocnterr}%
{\global\csname c@#1\endcsname#2\relax}}

\def\addtocounter#1#2{\@ifundefined{c@#1}{\@nocnterr}%
{\global\advance\csname c@#1\endcsname #2\relax}}

\def\newcounter#1{\expandafter\@ifdefinable \csname c@#1\endcsname
{\@definecounter{#1}}\@ifnextchar[{\@newctr{#1}}{}}

\def\value#1{\csname c@#1\endcsname}

\def\@newctr#1[#2]{\@ifundefined{c@#2}{\@nocnterr}{\@addtoreset{#1}{#2}}}

\def\stepcounter#1{\global\advance\csname c@#1\endcsname \@ne
{\let\@elt\@stpelt \csname cl@#1\endcsname}}

\def\@stpelt#1{\global\csname c@#1\endcsname \z@}

\def\cl@@ckpt{\@elt{page}}

\def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname
\setcounter{#1}0 \expandafter\gdef\csname cl@#1\endcsname{}\@addtoreset
{#1}{@ckpt}\expandafter\gdef\csname p@#1\endcsname{}\expandafter
\gdef\csname the#1\endcsname{\arabic{#1}}}

\def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}}

% Numbering commands for definitions of \theCOUNTER and \list arguments.
% \fnsymbol produces the standard footnoting symbols: asterisk, dagger, etc.
% They can be used only in math mode.

\def\arabic#1{\@arabic{\@nameuse{c@#1}}}
\def\roman#1{\@roman{\@nameuse{c@#1}}}
\def\Roman#1{\@Roman{\@nameuse{c@#1}}}
\def\alph#1{\@alph{\@nameuse{c@#1}}}
\def\Alph#1{\@Alph{\@nameuse{c@#1}}}
\def\fnsymbol#1{\@fnsymbol{\@nameuse{c@#1}}}

\def\@arabic#1{\number #1} %% changed 29 Apr 86
\def\@roman#1{\romannumeral #1}
\def\@Roman#1{\expandafter\uppercase\expandafter{\romannumeral #1}}
\def\@alph#1{\ifcase#1\or a\or b\or c\or d\else\@ialph{#1}\fi}
\def\@ialph#1{\ifcase#1\or \or \or \or \or e\or f\or g\or h\or i\or j\or
k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or
z\else\@ctrerr\fi}
\def\@Alph#1{\ifcase#1\or A\or B\or C\or D\else\@Ialph{#1}\fi}
\def\@Ialph#1{\ifcase#1\or \or \or \or \or E\or F\or G\or H\or I\or J\or
K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or
Z\else\@ctrerr\fi}
\def\@fnsymbol#1{\ifcase#1\or *\or \dagger\or \ddagger\or
\mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger
\or \ddagger\ddagger \else\@ctrerr\fi\relax}




\message{page nos.,}
% ****************************************
% * PAGE NUMBERING *
% ****************************************
%
% Page numbers are produced by a page counter, used just like any other
% counter. The only difference is that \c@page contains the number of
% the next page to be output (the one currently being produced), rather
% than one minus it. Thus, it is normally initialized to 1 rather than
% 0. \c@page is defined to be \count0, rather than a count assigned by
% \newcount.
%
% The user sets the pagenumber style with the \pagenumbering{FOO}
% command, which sets the page counter to 1 and defines \thepage to be
% \FOO. For example, \pagenumbering{roman} causes pages to be numbered
% i, ii, etc.


\countdef\c@page=0 \c@page=1
\def\cl@page{}
\def\pagenumbering#1{\global\c@page \@ne \gdef\thepage{\csname @#1\endcsname
\c@page}}


\message{x-ref,}
% ****************************************
% * CROSS REFERENCING MACROS *
% ****************************************
%
% The user writes \label{foo} to define the following cross-references:
% \ref{foo} : value of most recently incremented referencable counter.
% in the current environment. (Chapter, section, theorem
% and enumeration counters counters are referencable,
% footnote counters are not.)
% \pageref{foo} : page number at which \label{foo} command appeared.
% where foo can be any string of characters not containing '\', '{' or '}'.
%
% Note: The scope of the \label command is delimited by environments, so
% \begin{theorem} \label{foo} ... \end{theorem} \label{bar}
% defines \ref{foo} to be the theorem number and \ref{bar} to be
% the current section number.
%
% Note: \label does the right thing in terms of spacing -- i.e.,
% leaving a space on both sides of it is equivalent to leaving
% a space on either side.
%
% This is implemented as follows. A referencable counter CNT is
% incremented by the command \refstepcounter{CNT} , which sets
% \@currentlabel == {CNT}{eval(\p@cnt\theCNT)}. The command
% \label{FOO} then writes the following on file \@auxout :
% \newlabel{FOO}{{eval(\@currentlabel)}{eval(\thepage)}}
%
% \ref{FOO} ==
% BEGIN
% if \r@foo undefined
% then ??
% Warning: 'reference foo on page ... undefined'
% else \@car \eval(\r@FOO)\@nil
% fi
% END
%
% \pageref{foo} =
% BEGIN
% if \r@foo undefined
% then ??
% Warning: 'reference foo on page ... undefined'
% else \@cdr \eval(\r@FOO)\@nil
% fi
% END
%

%% RmS 91/10/25: added a few extra \reset@font,
%% as suggested by Bernd Raichle
\def\ref#1{\@ifundefined{r@#1}{{\reset@font\bf ??}\@warning
{Reference `#1' on page \thepage \space
undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter
\@car\@tempa \@nil\null}}

\def\pageref#1{\@ifundefined{r@#1}{{\reset@font\bf ??}\@warning
{Reference `#1' on page \thepage \space
undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter
\@cdr\@tempa\@nil\null}}

\def\newlabel#1#2{\@ifundefined{r@#1}{}{\@warning{Label `#1' multiply
defined}}\global\@namedef{r@#1}{#2}}

% \label and \refstepcounter changed to allow \protect'ed commands to
% work properly. For example,
% \def\thechapter{\protect\foo{\arabic{chapter}.\roman{section}}}
% will cause a \label{bar} command to define \ref{bar} to expand to
% something like \foo{4.d}. Change made 20 Jul 88.

\def\label#1{\@bsphack\if@filesw {\let\thepage\relax
\def\protect{\noexpand\noexpand\noexpand}%
\edef\@tempa{\write\@auxout{\string
\newlabel{#1}{{\@currentlabel}{\thepage}}}}%
\expandafter}\@tempa
\if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}

\def\refstepcounter#1{\stepcounter{#1}\let\@tempa\protect
\def\protect{\noexpand\protect\noexpand}%
\edef\@currentlabel{\csname p@#1\endcsname\csname the#1\endcsname}%
\let\protect\@tempa}

\def\@currentlabel{} % For \label commands that come before any environment

\message{environments,}
% ****************************************
% * ENVIRONMENTS *
% ****************************************
%
% \begin{foo} and \end{foo} are used to delimit environment foo.
% \begin{foo} starts a group and calls \foo if it is defined, otherwise
% it does nothing. \end{foo} checks to see that it matches the
% corresponding \begin and if so, it calls \endfoo and does an
% \endgroup. Otherwise, \end{foo} does nothing.
%
% If \end{foo} needs to ignore blanks after it, then \endfoo should
% globally set the @ignore switch true with \global\@ignoretrue.
%
% \@currenvir : the name of the current environment. Initialized to
% 'document' to make \end{document} work right.
%
% \@preamblecmds : a list of commands that can be used only in the
% preamble (before the \begin{document}), in the
% form \do \CMDA \do \CMDB ... . These commands
% are redefined to \@notprerr by \begin{document}
% to save space. They include the following:
% \document \documentstyle \@documentstyle
% \@options \@preamblecmds \@optionlist
% \@optionfiles \nofiles \includeonly \makeindex
% \makeglossary
% The document style can add any other commands to
% this list by
% \def\do{\noexpand\do\noexpand}
% \edef\@preamblecmds{\@preamblecmds \do ...}
%
% NOTE: \@@end is defined to be the \end command of TeX82.
%
% \enddocument is the user's command for ending the manuscript file.
%
% \stop is a panic button -- to end TeX in the middle.
%
% \enddocument ==
% BEGIN
% \@checkend{document} %% checks for unmatched \begin
% \clearpage
% \begingroup
% if @filesw = true
% then close file @mainaux
% \global \@namedef {ARG1}{ARG2} == null
% \newlabel{LABEL}{VAL} ==
% BEGIN
% \@tempa == VAL
% if def(\@tempa) = def(\r@LABEL)
% else @tempswa := true fi
% END
% \bibcite{LABEL}{VAL} == null
% BEGIN
% \@tempa == VAL
% if def(\@tempa) = def(\g@LABEL)
% else @tempswa := true fi
% END
% @tempswa := false
% make @ a letter
% \input \jobname.AUX
% if @tempswa = true
% then LaTeX Warning: 'Label may have changed.
% Rerun to get cross-references right.'
% fi fi
% \endgroup
% finish up
% END
%
% \@writefile{EXT}{ENTRY} ==
% if tf@EXT undefined
% else \write\tf@EXT{ENTRY}
% fi
%
\def\@currenvir{document}

\def\@preamblecmds{\do\document \do\documentstyle \do\@documentstyle
\do\@options \do\@preamblecmds \do\@optionlist \do\@optionfiles
\do\nofiles \do\includeonly \do\makeindex \do\makeglossary}

\newif\if@ignore

\def\enddocument{\@checkend{document}\clearpage\begingroup
\if@filesw \immediate\closeout\@mainaux
\def\global\@namedef##1##2{}\def\newlabel{\@testdef r}%
\def\bibcite{\@testdef b}\@tempswafalse \makeatletter\input \jobname.aux
\if@tempswa \@@warning{Label(s) may have changed. Rerun to get
cross-references right}\fi\fi\endgroup\deadcycles\z@\@@end}

\def\@testdef #1#2#3{\def\@tempa{#3}\expandafter \ifx \csname #1@#2\endcsname
\@tempa \else \@tempswatrue \fi}

\long\def\@writefile#1#2{\@ifundefined{tf@#1}{}{%
\immediate\write\csname tf@#1\endcsname{#2}}}
% \long added 8 Feb 90, as suggested by Chris Rowley

\def\stop{\clearpage\deadcycles\z@\let\par\@@par\@@end}

\everypar{\@nodocument} %% To get an error if text appears before the
\nullfont %% \begin{document}

% \begin, \end, and \@checkend changed so \end{document} will catch
% an unmatched \begin. Changed 24 May 89 as suggested by
% Frank Mittelbach and Rainer Sch\"opf.


% \begin{NAME} ==
% BEGIN
% IF \NAME undefined THEN \@tempa == BEGIN report error END
% ELSE \@tempa == (\@currenvir :=L NAME) \NAME
% FI
% @ignore :=G F %% Added 30 Nov 88
% \begingroup
% \@currenvir :=L NAME
% \NAME
% END

% \end{NAME} ==
% BEGIN
% \endNAME
% \@checkend{NAME}
% IF @endpe = T %% @endpe set True by \@endparenv
% THEN \@gtempa :=G \@doendpe %% \@doendpe redefines \par and \everypar
% ELSE \@gtempa :=G \relax %% to suppress paragraph indentation in
% FI %% immediately following text
% \endgroup
% \@gtempa
% IF @ignore = T
% THEN @ignore :=G F
% \ignorespaces
% FI
% END

% \@checkend{NAME} ==
% BEGIN
% IF \@currenvir = NAME
% ELSE \@badend{NAME}
% FI
% END

\def\begin#1{\@ifundefined{#1}{\def\@tempa{\@latexerr{Environment #1
undefined}\@eha}}{\def\@tempa{\def\@currenvir{#1}%
\csname #1\endcsname}}\global\@ignoretrue %% \global... added 2 May 90
\begingroup\@endpefalse\@tempa}

\def\end#1{\csname end#1\endcsname\@checkend{#1}%
\expandafter\endgroup \if@endpe \@doendpe \fi
\if@ignore \global\@ignorefalse \ignorespaces\fi}

\def\@checkend#1{\def\@tempa{#1}\ifx
\@tempa\@currenvir \else\@badend{#1}\fi}


\message{math,}
% **********************************************
% * MATH ENVIRONMENTS *
% **********************************************
%
% \( == BEGIN if math mode
% then error: '\( in math mode'
% else $
% fi
% END
%
% \) == BEGIN if math mode
% then if inner mode
% then $
% else error ``\[ closed with \)''
% else error 'unmatched \)'
% fi
% END
%
% \[ == BEGIN if math mode
% then error: '\[ in math mode'
% else $$
% fi
% END
%
% \] == BEGIN if math mode
% then if inner mode
% then error '\( closed with \]'
% else $$
% else error 'unmatched \]'
% fi
% END
%
% \equation == BEGIN \refstepcounter{equation} $$ END
%
% \endequation == BEGIN \eqno (\theequation) $$\ignorespaces END
%
% NOTE: The document style must define \theequation etc., and do
% the appropriate \@addtoreset. It should also redefine \@eqnnum
% if another format for the equation number is desired other than the
% standard (...), or to move the equation numbers to the flushleft.
% (See comment on the \def of \@eqnnum.)
%
% \stackrel{TOP}{BOT} == PLAIN TeX's \buildrel {TOP} \over {BOT}
%
% \frac{TOP}{BOT} == {TOP \over BOT}
%
% \sqrt[N]{EXP} produces an Nth root of EXP formula.
%
% \: == \> (medium space)

\def\({\relax\ifmmode\@badmath\else$%%$BRACE MATCH HACK
\fi}

\def\){\relax\ifmmode\ifinner$\else\@badmath%%$ BRACE MATCH HACK
\fi\else \@badmath\fi}

\def\[{\relax\ifmmode\@badmath\else
\ifvmode \nointerlineskip \makebox[.6\linewidth]\fi$$%%$$ BRACE MATCH HACK
\fi}

\def\]{\relax\ifmmode\ifinner\@badmath\else$$\fi%%$$ BRACE MATCH HACK
\else \@badmath \fi\ignorespaces}

\let\math=\(
\let\endmath=\)
\def\displaymath{\[}
\def\enddisplaymath{\]\global\@ignoretrue}

\@definecounter{equation}
\def\equation{$$ % $$ BRACE MATCHING HACK
\refstepcounter{equation}}

%% RmS 92/01/10: put \hbox around \@eqnnum to typeset the equation
%% number in text mode (as in the eqnarray env.).
\def\endequation{\eqno \hbox{\@eqnnum}% $$ BRACE MATCHING HACK
$$\global\@ignoretrue}

% \@eqnnum: Produces the equation number for equation and
% eqnarray environments. The following definition is for
% flushright numbers; for flushleft numbers, see leqno.doc.
% The {\rm ... } puts the equation number in roman type even if
% an eqnarray environment appears in an italic environment.
%
%% RmS 91/09/29: \reset@font added.
\def\@eqnnum{{\reset@font\rm (\theequation)}}


\def\stackrel#1#2{\mathrel{\mathop{#2}\limits^{#1}}}
\def\frac#1#2{{#1\over #2}}

\let\@@sqrt=\sqrt
\def\sqrt{\@ifnextchar[{\@sqrt}{\@@sqrt}}
\def\@sqrt[#1]{\root #1\of}

\let\:=\>

% Here's the eqnarray environment:
% Default is for left-hand side of equations to be flushleft.
% To make them flushright, \let\@eqnsel = \hfil

\newcount\@eqcnt
\newcount\@eqpen
\newif\if@eqnsw\@eqnswtrue

\@centering = 0pt plus 1000pt % Changed 11/4/85 to produce warning message
% if line extends into margin. Doesn't warn
% about formula overprinting equation number.

\def\eqnarray{\stepcounter{equation}\let\@currentlabel\theequation
\global\@eqnswtrue\m@th
\global\@eqcnt\z@\tabskip\@centering\let\\\@eqncr
$$\halign to\displaywidth\bgroup\@eqnsel\hskip\@centering
$\displaystyle\tabskip\z@{##}$&\global\@eqcnt\@ne
\hskip 2\arraycolsep \hfil${##}$\hfil
&\global\@eqcnt\tw@ \hskip 2\arraycolsep $\displaystyle\tabskip\z@{##}$\hfil
\tabskip\@centering&\llap{##}\tabskip\z@\cr}

\def\endeqnarray{\@@eqncr\egroup
\global\advance\c@equation\m@ne$$\global\@ignoretrue}

\let\@eqnsel=\relax

\def\nonumber{\global\@eqnswfalse}

\def\@eqncr{{\ifnum0=`}\fi\@ifstar{\global\@eqpen\@M
\@yeqncr}{\global\@eqpen\interdisplaylinepenalty \@yeqncr}}

\def\@yeqncr{\@ifnextchar [{\@xeqncr}{\@xeqncr[\z@]}}

\def\@xeqncr[#1]{\ifnum0=`{\fi}\@@eqncr
\noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}}

\def\@@eqncr{\let\@tempa\relax
\ifcase\@eqcnt \def\@tempa{& & &}\or \def\@tempa{& &}%
\else \def\@tempa{&}\fi
\@tempa \if@eqnsw\@eqnnum\stepcounter{equation}\fi
\global\@eqnswtrue\global\@eqcnt\z@\cr}

% Here's the eqnarray* environment:

\let\@seqncr=\@eqncr
\@namedef{eqnarray*}{\def\@eqncr{\nonumber\@seqncr}\eqnarray}
\@namedef{endeqnarray*}{\nonumber\endeqnarray}

% \lefteqn{FORMULA} typesets FORMULA in display math style
% flushleft in a box of width zero.
%

\def\lefteqn#1{\hbox to\z@{$\displaystyle #1$\hss}}


\message{center,}
% ************************************************
% * CENTER, FLUSHRIGHT, FLUSHLEFT, ETC. *
% ************************************************
%
%
% \center, \flushright and \flushleft set
% \rightskip = 0pt or \@flushglue (as appropriate)
% \leftskip = 0pt or \@flushglue (as appropriate)
% \parindent = 0pt
% \parfillskip = 0pt. (except \flushleft)
% \\ == \par \vskip -\parskip
% \\[LENGTH] == \\ \vskip LENGTH
% \\* == \par \penalty 10000 \vskip -\parskip
% \\*[LEN] == \\* \vskip LENGTH
%
% They invoke the trivlist environment to handle vertical spacing before
% and after them.
%
% \centering, \raggedright and \raggedleft are the declaration analogs
% of the above.
%
% \raggedright has a more universal effect, however. It sets
% \@rightskip := flushglue. Every environment, like the list environments,
% that set \rightskip to its 'normal' value set it to \@rightskip

\def\@centercr{\ifhmode \unskip\else \@badcrerr\fi
\par\@ifstar{\penalty \@M\@xcentercr}{\@xcentercr}}

\def\@xcentercr{\addvspace{-\parskip}\@ifnextchar
[{\@icentercr}{\ignorespaces}}

\def\@icentercr[#1]{\vskip #1\ignorespaces}

\def\center{\trivlist \centering\item[]}
\def\centering{\let\\=\@centercr\rightskip\@flushglue\leftskip\@flushglue
\parindent\z@\parfillskip\z@}
\let\endcenter=\endtrivlist

\newskip\@rightskip \@rightskip \z@

\def\flushleft{\trivlist \raggedright\item[]}
\def\raggedright{\let\\=\@centercr\@rightskip\@flushglue \rightskip\@rightskip
\leftskip\z@
\parindent\z@}
\let\endflushleft=\endtrivlist

\def\flushright{\trivlist \raggedleft\item[]}
\def\raggedleft{\let\\=\@centercr\rightskip\z@\leftskip\@flushglue
\parindent\z@\parfillskip\z@}
\let\endflushright=\endtrivlist

\message{verbatim,}
% ****************************************
% * VERBATIM *
% ****************************************
%
% The verbatim environment uses the fixed-width \tt font, turns blanks into
% spaces, starts a new line for each carrige return (or sequence of
% consecutive carriage returns), and interprets EVERY character literally.
% I.e., all special characters \, {, $, etc. are \catcode'd to 'other'.
%
% The command \verb produces in-line verbatim text, where the argument
% is delimited by any pair of characters. E.g., \verb #...# takes
% '...' as its argument, and sets it verbatim in \tt font.
%
% The *-variants of these commands is the same, except that spaces
% print as the TeXbook's space character instead of as blank spaces.

{\catcode`\^^M=13 \gdef\@gobblecr{\@ifnextchar
{\@gobble}{\ignorespaces}}}

{\catcode`\ =\active\gdef\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}

% Definition of \@xobeysp chaned on 19 Nov 86 from
% \def\@xobeysp{\leavevmode{} }
% to prevent line breaks at spaces. Change suggested by
% Nelson Beebe
%
\def\@xobeysp{\leavevmode\penalty10000\ }



\begingroup \catcode `|=0 \catcode `[= 1
\catcode`]=2 \catcode `\{=12 \catcode `\}=12
\catcode`\\=12 |gdef|@xverbatim#1\end{verbatim}[#1|end[verbatim]]
|gdef|@sxverbatim#1\end{verbatim*}[#1|end[verbatim*]]
|endgroup

% \@sverbatim obsolete -- removed 24 May 89, as suggested by
% Rainer Sch\"opf and Frank Mittelbach
% \def\@sverbatim{\obeyspaces\@verbatim}

\def\@gobble#1{}

% 91/07/24 RmS: added \penalty\interlinepenalty to definition
% of \par so that \samepage works.

\def\@verbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi
\leftskip\@totalleftmargin\rightskip\z@
\parindent\z@\parfillskip\@flushglue\parskip\z@
%%RmS 91/08/26 Added \@@par to clear possible \parshape definition
%%from a surrounding list (the verbatim guru says)
\@@par
\@tempswafalse \def\par{\if@tempswa\hbox{}\fi\@tempswatrue\@@par
\penalty\interlinepenalty}%
\obeylines \tt \catcode``=13 \@noligs \let\do\@makeother \dospecials}

\def\verbatim{\@verbatim \frenchspacing\@vobeyspaces \@xverbatim}
\let\endverbatim=\endtrivlist


\@namedef{verbatim*}{\@verbatim\@sxverbatim}
\expandafter\let\csname endverbatim*\endcsname =\endtrivlist


\def\@makeother#1{\catcode`#1=12\relax}

\def\verb{\begingroup \catcode``=13 \@noligs
\tt \let\do\@makeother \dospecials
\@ifstar{\@sverb}{\@verb}}

% Definitions of \@sverb and \@verb changed so \verb+ foo+ does not lose
% leading blanks when it comes at the beginning of a line.
% Change made 24 May 89. Suggested by Frank Mittelbach and Rainer Sch\"opf.
%
\def\@sverb#1{\def\@tempa ##1#1{\leavevmode\null##1\endgroup}\@tempa}

\def\@verb{\@vobeyspaces \frenchspacing \@sverb}


%% \@noligs prevents ?` and !` from being treated as ligatures
%% added 19 April 86

\begingroup
\catcode``=13
\gdef\@noligs{\let`\@lquote}
\endgroup

%% RmS 91/06/21: added \leavevmode to definition of \@lquote
%% to avoid the \kern being processed in vertical mode

\def\@lquote{\leavevmode{\kern\z@}`}
\message{list,}
% ****************************************
% * THE LIST ENVIRONMENT *
% ****************************************
%
% The generic commands for creating an indented environment -- enumerate,
% itemize, quote, etc -- are
% \list{LABEL}{COMMANDS} ... \endlist
% which can be invoked by the user as the list environment. The LABEL
% argument specifies item labeling. COMMANDS contains commands for
% changing the horizontal and vertical spacing parameters.
%
% Each item of the environment is begun by the command \item[ITEMLABEL]
% which produces an item labeled by ITEMLABEL. If the argument is
% missing, then the LABEL argument of the \list command is used as the
% item label.
%
% The label is formed by putting \makelabel{ITEMLABEL} in an hbox whose
% width is either its natural width or else \labelwidth, whichever is
% larger. The \list command defines \makelabel to have the default
% definition
% \makelabel{ARG} == BEGIN \hfil ARG END
% which, for a label of width less than \labelwidth, puts the label
% flushright, \labelsep to the left of the item's text. However,
% \makelabel can be \let to another command by the \list's COMMANDS
% argument.
%
% A \usecounter{foo} command in the second argument causes the counter
% foo to be initialized to zero, and stepped by every \item command
% without an argument. (\label commands within the list refer to this
% counter.)
%
% When you leave a list environment, returning either to an enclosing
% list or normal text mode, LaTeX begins a new paragraph if and only if
% you leave a blank line after the \end command. This is accomplished
% by the \@endparenv command.
%
% Blank lines are ignored every other reasonable place--i.e.:
% - Between the \begin{list} and the first \item,
% - Between the \item and the text of that item.
% - Between the end of the last item and the \end{list}.
%
% For an environment like quotation, in which items are not labeled,
% the entire environment is a single item. It is defined by
% letting \quotation == \list{}{...}\item[]. (Note the [], there in
% case the first character in the environment is a '['.) The spacing
% parameters provide a great deal of flexability in designing the
% format, including the ability to let the indentation of the first
% paragraph be different from that of the subsequent ones.
%
% The trivlist environment is equivalent to a list environment
% whose second argument sets the following parameter values:
% \leftmargin = 0 : causes no indentation of left margin
% \labelwidth = 0 : see below for precise effect this has.
% \itemindent = 0 : with a null label, makes first paragraph
% have no indentation. Succeeding paragraphs have \parindent
% indentation. To give first paragraph same indentation, set
% \itemindent = \parindent before the \item[].
% Every \item in a trivlist environment must have an argument---in many
% cases, this will be the null argument (\item[]). The trivlist
% environment is mainly used for paragraphing environments, like
% verbatim, in which there is no margin change. It provides the same
% vertical spacing as the list environment, and works reasonably well
% when it occurs immediately after an \item command in an enclosing list.
%
% The following variables are used inside a list environment:
% \@totalleftmargin : The distance that the prevailing left margin is
% indented from the outermost left margin,
% \linewidth : The width of the current line. Must be
% initialized to \hsize.
% \@listdepth : A count for holding current list nesting depth.
% \makelabel : A macro with a single argument, used to generate
% the label from the argument (given or implied) of the
% \item command. Initialized to \@mklab by the \list
% command. This command must produce some stretch--i.e.,
% an \hfil.
% @inlabel : A switch that is false except between the time an
% \item is encountered and the time that TeX actually
% enters horizontal mode. Should be tested by
% commands that can be messed up by the list
% environment's use of \everypar.
% \box\@labels : When @inlabel = true, it holds the labels
% to be put out by \everypar.
% @noparitem : A switch set by \list when @inlabel = true.
% Handles the case of a \list being the first thing
% in an item.
% @noparlist : A switch set true for a list that begins an
% item. No \topsep space is added before or after
% such a list.
% @newlist : Set true by \list, set false by the first \item's
% text (by \everypar).
% @noitemarg : Set true when executing an \item with no explicit
% argument. Used to save space. To save time,
% make two separate \@item commands.
% @nmbrlist : Set true by \usecounter command, causes list to
% be numbered.
% \@listctr : \def'ed by \usecounter to name of counter.
% @noskipsec : A switch set true by a sectioning command when it is
% creating an in-text heading with \everypar.
%
% Throughout a list environment, \hsize is the width of the current
% line, measured from the outermost left margin to the outermost right
% margin. Environments like tabbing should use \linewidth instead of
% \hsize.
%
% Here are the parameters of a list that can be set by commands in
% the \list's COMMANDS argument. These parameters are all TeX
% skips or dimensions (defined by \newskip or \newdimen), so the usual
% TeX or LaTeX commands can be used to set them. The commands will
% be executed in vmode if and only if the \list was preceded by a
% \par (or something like an \end{list}), so the spacing parameters
% can be set according to whether the list is inside a paragraph
% or is its own paragraph.
%
% VERTICAL SPACING (skips):
%
% \topsep : Space between first item and preceding paragraph.
% \partopsep : Extra space added to \topsep when environment starts
% a new paragraph (is called in vmode).
% \itemsep : Space between successive items.
% \parsep : Space between paragraphs within an item -- the \parskip
% for this environment.
%
% PENALTIES
% \@beginparpenalty : put at the beginning of a list
% \@endparpenalty : put at end of list
% \@itempenalty : put between items.
%
% HORIZONTAL SPACING (dimens)
% \leftmargin : space between left margin of enclosing environment
% (or of page if top level list) and left margin of
% this list. Must be nonnegative.
% \rightmargin : analogous.
% \listparindent : extra indentation at beginning of every paragraph
% of a list except the one started by the \item
% command. May be negative! Usually, labeled lists
% have \listparindent equal to zero.
% \itemindent : extra indentation added right BEFORE an item label.
% \labelwidth : nominal width of box that contains the label.
% If the natural width of the label < = \labelwidth,
% then the label is flushed right inside a box
% of width \labelwidth (with an \hfil). Otherwise,
% a box of the natural width is employed, which causes
% an indentation of the text on that line.
% \labelsep : space between end of label box and text of
% first item.
%
% DEFAULT VALUES:
% Defaults for the list environment are set as follows.
% First, \rightmargin, \listparindent and \itemindent are set
% to 0pt. Then, one of the commands \@listi, \@listii, ... , \@listvi
% is called, depending upon the current level of the list.
% The \@list... commands should be defined by the document
% style. A convention that the document style should follow is
% to set \leftmargin to \leftmargini, ... , \leftmarginvi for
% the appropriate level. Items that aren't changed may be left
% alone, but everything that could possibly be changed must be
% reset.
%
% \list{LABEL}{COMMANDS} ==
% BEGIN
% if \@listdepth > 5
% then LaTeX error: 'Too deeply nested'
% else \@listdepth :=G \@listdepth + 1
% fi
% \rightmargin := 0pt
% \listparindent := 0pt
% \itemindent := 0pt
% \eval(@list \romannumeral\the\@listdepth) %% Set default values:
% \@itemlabel :=L LABEL
% \makelabel == \@mklab
% @nmbrlist :=L false
% COMMANDS
%
% \@trivlist % commands common to \list and \trivlist
%
% \parskip :=L \parsep
% \parindent :=L \listparindent
% \linewidth :=L \linewidth - \rightmargin -\leftmargin
% \@totalleftmargin :=L \@totalleftmargin + \leftmargin
% \parshape 1 \@totalleftmargin \linewidth
% \ignorespaces % gobble space up to \item
% END
%
% \endlist == BEGIN \@listdepth :=G \@listdepth -1
% \endtrivlist
% END
%
% \@trivlist ==
% BEGIN
% if @newlist = T then \@noitemerr fi %% This command removed for some
% %% forgotten reason.
% \@topsepadd :=L \topsep
% if @noskipsec then leave vertical mode fi %% Added 11 Jun 85
% if vertical mode
% then \@topsepadd :=L \@topsepadd + \partopsep
% else \unskip \par % remove glue from end of last line
% fi
% if @inlabel = true
% then @noparitem :=L true
% @noparlist :=L true
% else @noparlist :=L false
% \@topsep :=L \@topsepadd
% fi
% \@topsep :=L \@topsep + \parskip %% Change 4 Sep 85
% \leftskip :=L 0pt % Restore paragraphing parameters
% \rightskip :=L \@rightskip
% \parfillskip :=L 0pt + 1fil
%
% NOTE: \@setpar called on every \list in case \par has been temporarily
% munged before the \list command.
% \@setpar{if @newlist = false then {\@@par} fi}
% \@newlist :=G T
% \@outerparskip :=L \parskip
% END
%
% \trivlist ==
% BEGIN
% \parsep := \parskip
% \@trivlist
% \labelwidth := 0
% \leftmargin := 0
% \itemindent := \parindent
% \makelabel{LABEL} == LABEL
% END
%
% \endtrivlist ==
% BEGIN
% if @inlabel = T then \indent fi
% if horizontal mode then \unskip \par fi
% if @noparlist = true
% else if \lastskip > 0
% then \@tempskipa := \lastskip
% \vskip - \lastskip
% \vskip \@tempskipa -\@outerparskip + \parskip
% fi
% \@endparenv
% fi
% END
%
% \@endparenv ==
% BEGIN
% \addpenalty{@endparpenalty}
% \addvspace{\@topsepadd}
% \endgroup %% ends the \begin command's \begingroup
% \par == BEGIN
% \@restorepar
% \everypar{}
% \par
% END
% \everypar == BEGIN remove \lastbox \everypar{} END
% \begingroup %% to match the \end commands \endgroup
% END
%
% \item == BEGIN if next char = [
% then \@item
% else @noitemarg := true
% \@item[@itemlabel]
% END
%
% \@item[LAB] ==
% BEGIN
% if @noparitem = true
% then @noparitem := false % NOTE: then clause
% % hardly every taken,
% \box\@labels :=G \hbox{\hskip -\leftmargin % so made a macro
% \box\@labels % \@donoparitem
% \hskip \leftmargin }
% if @minipage = false then
% \@tempskipa := \lastskip
% \vskip -\lastskip
% \vskip \@tempskipa + \@outerparskip - \parskip
% fi
% else if @inlabel = true
% then \indent \par % previous item empty.
% fi
% if hmode then 2 \unskip's % To remove any space at end of prev.
% \par % paragraph that could cause a blank
% fi % line.
% if @newlist = T
% then if @nobreak = T % Kludge if list follows \section
% then \addvspace{\@outerparskip - \parskip}
% else \addpenalty{\@beginparpenalty}
% \addvspace{\@topsep}
% \addvspace{-\parskip} %% added 4 Sep 85
% fi
% else \addpenalty{\@itempenalty}
% \addvspace{\itemsep}
% fi
% @inlabel :=G true
% fi
%
% \everypar{ @minipage :=G F
% @newlist :=G F
% if @inlabel = true
% then @inlabel :=G false
% \hskip -\parindent
% \box\@labels
% \penalty 0 %% 3 Oct 85 -- allow line break here
% \box\@labels :=G null
% fi
% \everypar{} }
% @nobreak :=G false
% if @noitemarg = true
% then @noitemarg := false
% if @nmbrlist
% then \refstepcounter{\@listctr}
% fi fi
% \@tempboxa :=L \hbox{\makelabel{LAB}}
% \box\@labels :=G \@labels \hskip \itemindent
% \hskip - (\labelwidth + \labelsep)
% if \wd \@tempboxa > \labelwidth
% then \box\@tempboxa
% else \hbox to \labelwidth {\makelabel{LAB}}
% fi
% \hskip\labelsep
% \ignorespaces %gobble space up to text
% END
%
% \usecounter{CTR} == BEGIN @nmbrlist :=L true
% \@listctr == CTR
% \setcounter{CTR}{0}
% END
%
% DEFINE \dimen's and \count
\newskip\topsep
\newskip\partopsep
\newskip\itemsep
\newskip\parsep
\newskip\@topsep
\newskip\@topsepadd
\newskip\@outerparskip

\newdimen\leftmargin
\newdimen\rightmargin
\newdimen\listparindent
\newdimen\itemindent
\newdimen\labelwidth
\newdimen\labelsep
\newdimen\linewidth
\newdimen\@totalleftmargin \@totalleftmargin=\z@
\newdimen\leftmargini
\newdimen\leftmarginii
\newdimen\leftmarginiii
\newdimen\leftmarginiv
\newdimen\leftmarginv
\newdimen\leftmarginvi

\newcount\@listdepth \@listdepth=0
\newcount\@itempenalty
\newcount\@beginparpenalty
\newcount\@endparpenalty

\newbox\@labels

\newif\if@inlabel \@inlabelfalse
\newif\if@newlist \@newlistfalse
\newif\if@noparitem \@noparitemfalse
\newif\if@noparlist \@noparlistfalse
\newif\if@noitemarg \@noitemargfalse
\newif\if@nmbrlist \@nmbrlistfalse

\def\list#1#2{\ifnum \@listdepth >5\relax \@toodeep
\else \global\advance\@listdepth\@ne \fi
\rightmargin \z@ \listparindent\z@ \itemindent\z@
\csname @list\romannumeral\the\@listdepth\endcsname
\def\@itemlabel{#1}\let\makelabel\@mklab \@nmbrlistfalse #2\relax
\@trivlist
\parskip\parsep \parindent\listparindent
\advance\linewidth -\rightmargin \advance\linewidth -\leftmargin
\advance\@totalleftmargin \leftmargin
\parshape \@ne \@totalleftmargin \linewidth
\ignorespaces}

\def\@trivlist{\@topsepadd\topsep
\if@noskipsec \leavevmode \fi
\ifvmode \advance\@topsepadd\partopsep \else \unskip\par\fi
\if@inlabel \@noparitemtrue \@noparlisttrue
\else \@noparlistfalse \@topsep\@topsepadd \fi
\advance\@topsep \parskip
\leftskip\z@\rightskip\@rightskip \parfillskip\@flushglue
\@setpar{\if@newlist\else{\@@par}\fi}%
\global\@newlisttrue \@outerparskip\parskip}

\def\trivlist{\parsep\parskip
\@trivlist \labelwidth\z@ \leftmargin\z@
\itemindent\z@ \def\makelabel##1{##1}}

\def\endlist{\global\advance\@listdepth\m@ne
\endtrivlist}

% Definition of \endtrivlist moved earlier in file so other commands
% can be \let = to it.

\def\@mklab#1{\hfil #1}

\def\item{\@ifnextchar [{\@item}{\@noitemargtrue \@item[\@itemlabel]}}

\def\@donoparitem{\@noparitemfalse
\global\setbox\@labels\hbox{\hskip -\leftmargin
\unhbox\@labels
\hskip \leftmargin}\if@minipage\else
\@tempskipa\lastskip
\vskip -\lastskip \advance\@tempskipa\@outerparskip
\advance\@tempskipa -\parskip \vskip\@tempskipa\fi}

\def\@item[#1]{\if@noparitem \@donoparitem
\else \if@inlabel \indent \par \fi
\ifhmode \unskip\unskip \par \fi
\if@newlist \if@nobreak \@nbitem \else
\addpenalty\@beginparpenalty
\addvspace\@topsep \addvspace{-\parskip}\fi
\else \addpenalty\@itempenalty \addvspace\itemsep
\fi
\global\@inlabeltrue
\fi
\everypar{\global\@minipagefalse\global\@newlistfalse
\if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels
\penalty\z@ \fi
\everypar{}}\global\@nobreakfalse
\if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi
\setbox\@tempboxa\hbox{\makelabel{#1}}%
\global\setbox\@labels
\hbox{\unhbox\@labels \hskip \itemindent
\hskip -\labelwidth \hskip -\labelsep
\ifdim \wd\@tempboxa >\labelwidth
\box\@tempboxa
%% RmS 91/11/22: Changed second call to \makelabel to \unhbox\@tempboxa.
%% Avoids problems with side effects in \makelabel and is
%% more efficient.
% \else \hbox to\labelwidth {\makelabel{#1}}\fi
\else \hbox to\labelwidth {\unhbox\@tempboxa}\fi
\hskip \labelsep}\ignorespaces}

%% RmS 91/11/04: added default definition for \makelabel,
%% to produce an error message.
\def\makelabel#1{\@latexerr{Lonely \string\item--perhaps a missing
list environment}\@ehc}

\def\@nbitem{\@tempskipa\@outerparskip \advance\@tempskipa -\parskip
\addvspace{\@tempskipa}}

\def\usecounter#1{\@nmbrlisttrue\def\@listctr{#1}\setcounter{#1}\z@}

\message{itemize,}
% ****************************************
% * ITEMIZE AND ENUMERATE *
% ****************************************
%
% Enumeration is done with four counters: enumi, enumii, enumiii
% and enumiv, where enumN controls the numbering of the Nth level
% enumeration. The label is generated by the commands
% \labelenumi ... \labelenumiv, which should be defined by the
% document style. Note that \p@enumN\theenumN defines the output
% of a \ref command. A typical definition might be:
% \def\theenumii{\alph{enumii}}
% \def\p@enumii{\theenumi\theenumii}
% \def\labelenumii{(\theenumii)}
% which will print the labels as '(a)', '(b)', ... and print a \ref as
% '3a'.
%
% The item numbers are moved to the right of the label box, so they are
% always a distance of \labelsep from the item.
%
% \@enumdepth holds the current enumeration nesting depth.
%
% Itemization is controlled by four commands: \labelitemi, \labelitemii,
% \labelitemiii, and \labelitemiv. To cause the second-level list to be
% bulleted, you just define \labelitemii to be $\bullet$. \@itemspacing
% and \@itemdepth are the analogs of \@enumspacing and \@enumdepth.
%
% \enumerate ==
% BEGIN
% if \@enumdepth > 3
% then errormessage: ``Too deeply nested''.
% else \@enumdepth :=L \@enumdepth + 1
% \@enumctr :=L eval(enum@\romannumeral\the\@enumdepth)
% \list{\label(\@enumctr)}
% {\usecounter{\@enumctr}
% \makelabel{LABEL} == \hss \llap{LABEL}}
% fi
% END
%
% \endenumerate == \endlist
%
\newcount\@enumdepth \@enumdepth = 0

\@definecounter{enumi}
\@definecounter{enumii}
\@definecounter{enumiii}
\@definecounter{enumiv}

\def\enumerate{\ifnum \@enumdepth >3 \@toodeep\else
\advance\@enumdepth \@ne
\edef\@enumctr{enum\romannumeral\the\@enumdepth}\list
{\csname label\@enumctr\endcsname}{\usecounter
{\@enumctr}\def\makelabel##1{\hss\llap{##1}}}\fi}

\let\endenumerate =\endlist


% \itemize ==
% BEGIN
% if \@itemdepth > 3
% then errormessage: 'Too deeply nested'.
% else \@itemdepth :=L \@itemdepth + 1
% \@itemitem == eval(labelitem\romannumeral\the\@itemdepth)
% \list{\@nameuse{\@itemitem}}
% {\makelabel{LABEL} == \hss \llap{LABEL}}
% fi
% END
%
% \enditemize == \endlist
%
\newcount\@itemdepth \@itemdepth = 0

\def\itemize{\ifnum \@itemdepth >3 \@toodeep\else \advance\@itemdepth \@ne
\edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
\list{\csname\@itemitem\endcsname}{\def\makelabel##1{\hss\llap{##1}}}\fi}

\let\enditemize =\endlist

\message{boxes,}
% *********************************************
% * BOXES *
% *********************************************
%
% USER COMMANDS:
%
% \makebox [WID][POS]{OBJ}
% : puts OBJ in an \hbox of width WID, positioned by POS.
% POS = l -> flushleft, POS = r -> flushright.
% Default is centered.
% If WID is missing, then POS is also missing and OBJ
% is put in an \hbox of its natural width.
%
% \mbox{OBJ} == \makebox{OBJ}, and is more efficient.
%
% \makebox (X,Y)[POS]{OBJ}
% : puts OBJ in an \hbox of width X * \unitlength
% and height Y * \unitlength. POS arguments are
% l or r for flushleft, flushright and t or b
% for top, bottom -- or combinations like tr or rb.
% Default for horizontal and vertical are centered.
%
% \newsavebox{\CMD} : If \CMD is undefined, then defines it
% to be a TeX box register.
%
% \savebox {\CMD} ... : \CMD is defined to be a TeX box register,
% and the '...' are any \makebox arguments. It is
% like \makebox, except it doesn't produce text but
% saves the value in \box \CMD.
% \sbox N{OBJ} is an efficient abbreviation for
% \savebox N{OBJ}.
%
% \framebox ... : like \makebox, except it puts a 'frame' around
% the box. The frame is made of lines of thickness
% \fboxrule, separated by space \fboxsep from the
% text -- except for \framebox(X,Y) ... , where the
% thickness of the lines is as for the picture environment,
% and there is no separation added.
% \fbox{OBJ} is an efficient abbreviation for \framebox{OBJ}
%
% \parbox[POS]{WIDTH}{TEXT} : Makes a box with \hsize TEXT, positioned
% by POS as follows:
% c : \vcenter (placed in $...$ if not in math mode)
% b : \vbox
% t : \vtop
% default value is c.
% Sets \hsize := WIDTH and calls \@parboxrestore, which does
% the following:
% Restores the original definitions of:
% \par
% \\
% \- \' \` \=
% Resets the following parameters:
% \parindent = 0pt
% \parskip = 0pt %% added 20 Jan 87
% \linewidth = \hsize
% \@totalleftmargin = 0pt
% \leftskip = 0pt
% \rightskip = 0pt
% \@rightskip = 0pt
% \parfillskip = 0pt plus 1fil
% \lineskip = \normallineskip
% \baselineskip = \normalbaselineskip
% Calls \sloppy
%
% Note: \@arrayparboxrestore same as \@parboxrestore
% but it doesn't restore \\.
%
% \minipage : Similar to parbox, except it also
% makes this look like a page by setting
% \textwidth == \columnwidth == box width
% changes footnotes by redefining:
% \@mpfn == mpfootnote
% \thempfn == \thempfootnote
% \@footnotetext == \@mpfootnotetext
% resets the following list environment parameters
% \@listdepth == \@mplistdepth
% where \@mplistdepth is initialized to zero,
% and executes \@minipagerestore to allow the document
% style to reset any other parameters it desires.
% It sets @minipage := T, and resets \everypar to set
% it false. This switch keeps \addvspace from putting space
% at the top of a minipage.
%
% Change added 24 May 89: \minipage sets @minipage globally;
% \endminipage resets it false.
%
%
% \rule [RAISED]{WIDTH}{HEIGHT} : Makes a WIDTH X HEIGHT rule, raised
% RAISED.
%
% \underline {TEXT} : Makes an underlined hbox with TEXT in it.
%
% \raisebox{DISTANCE}[HEIGHT][DEPTH]{BOX} : Raises BOX up by DISTANCE
% length (down if DISTANCE negative). Makes TeX think that
% the new box extends HEIGHT above the line and DEPTH below, for
% a total vertical length of HEIGHT+DEPTH. Default values of
% HEIGHT & DEPTH = actual height and depth of box in new position.
%
% \makebox ==
% BEGIN
% if next char = (
% then \@makepicbox
% else if next char = [
% then \@makebox
% else \mbox fi
% fi
% END
%
% \@makebox[LEN] ==
% BEGIN
% leave vertical mode
% if next char '[' then \@imakebox[LEN]
% else \@imakebox[LEN][x] fi
% END
%
% \@imakebox[LEN][POS]{OBJ} ==
% BEGIN
% \hbox to LEN
% { \mb@l :=L \mb@r :=L \hss
% \let\mb@POS = \relax
% \mb@l OBJ \mb@r }
% END
%
% \@makepicbox(X,Y) ==
% BEGIN
% leave vertical mode
% if next char = [ then \@imakepicbox(X,Y)
% else \@imakepicbox(X,Y)[] fi
% END
%
% \@imakepicbox(X,Y)[POS]{OBJ} ==
% BEGIN
% \vbox to Y * \unitlength
% { \mb@l :=L \mb@r :=L \hss
% \mb@t :=L \mb@b :=L \hss
% tfor \@tempa := POS % one iteration for each token in POS
% do \mb@eval(\@tempa) :=L null od
% \mb@t
% \hbox to X * \unitlength
% {\mb@l OBJ \mb@r }
% \mb@b}
% END
%

\def\makebox{\@ifnextchar ({\@makepicbox}{\@ifnextchar
[{\@makebox}{\mbox}}}

\def\mbox#1{\leavevmode\hbox{#1}}

\def\@makebox[#1]{\leavevmode\@ifnextchar [{\@imakebox[#1]}{\@imakebox[#1][x]}}

\long\def\@imakebox[#1][#2]#3{\hbox to#1{\let\mb@l\hss
\let\mb@r\hss \expandafter\let\csname mb@#2\endcsname\relax
\mb@l #3\mb@r}}

\def\@makepicbox(#1,#2){\leavevmode\@ifnextchar
[{\@imakepicbox(#1,#2)}{\@imakepicbox(#1,#2)[]}}

\long\def\@imakepicbox(#1,#2)[#3]#4{\vbox to#2\unitlength
{\let\mb@b\vss \let\mb@l\hss\let\mb@r\hss
\let\mb@t\vss
\@tfor\@tempa :=#3\do{\expandafter\let
\csname mb@\@tempa\endcsname\relax}%
\mb@t\hbox to #1\unitlength{\mb@l #4\mb@r}\mb@b}}

\def\newsavebox#1{\@ifdefinable#1{\newbox#1}}

\def\savebox#1{\@ifnextchar ({\@savepicbox#1}{\@ifnextchar
[{\@savebox#1}{\sbox#1}}}

\def\sbox#1#2{\setbox#1\hbox{#2}}

\def\@savebox#1[#2]{\@ifnextchar [{\@isavebox#1[#2]}{\@isavebox#1[#2][x]}}

\long\def\@isavebox#1[#2][#3]#4{\setbox#1 \hbox{\@imakebox[#2][#3]{#4}}}

\def\@savepicbox#1(#2,#3){\@ifnextchar
[{\@isavepicbox#1(#2,#3)}{\@isavepicbox#1(#2,#3)[]}}

\long\def\@isavepicbox#1(#2,#3)[#4]#5{\setbox#1 \hbox{\@imakepicbox
(#2,#3)[#4]{#5}}}

\def\usebox#1{\leavevmode\copy #1\relax}

%% The following definition of \frame was written by Pavel Curtis
%% (Extra space removed 14 Jan 88)
\long\def\frame#1{\leavevmode
\hbox{\hskip-\@wholewidth
\vbox{\vskip-\@wholewidth
\hrule \@height\@wholewidth
\hbox{\vrule \@width\@wholewidth #1\vrule \@width\@wholewidth}\hrule
\@height \@wholewidth\vskip -\@halfwidth}\hskip-\@wholewidth}}

\newdimen\fboxrule
\newdimen\fboxsep

%% (Extra space removed 21 Jun 1991)
\long\def\fbox#1{\leavevmode\setbox\@tempboxa\hbox{#1}\@tempdima\fboxrule
\advance\@tempdima \fboxsep \advance\@tempdima \dp\@tempboxa
\hbox{\lower \@tempdima\hbox
{\vbox{\hrule \@height \fboxrule
\hbox{\vrule \@width \fboxrule \hskip\fboxsep
\vbox{\vskip\fboxsep \box\@tempboxa\vskip\fboxsep}\hskip
\fboxsep\vrule \@width \fboxrule}%
\hrule \@height \fboxrule}}}}

\def\framebox{\@ifnextchar ({\@framepicbox}{\@ifnextchar
[{\@framebox}{\fbox}}}

\def\@framebox[#1]{\@ifnextchar [{\@iframebox[#1]}{\@iframebox[#1][x]}}

%% (Extra space removed 21 Jun 1991)
\long\def\@iframebox[#1][#2]#3{\leavevmode
\savebox\@tempboxa[#1][#2]{\kern\fboxsep #3\kern\fboxsep}\@tempdima\fboxrule
\advance\@tempdima \fboxsep \advance\@tempdima \dp\@tempboxa
\hbox{\lower \@tempdima\hbox
{\vbox{\hrule \@height \fboxrule
\hbox{\vrule \@width \fboxrule \hskip-\fboxrule
\vbox{\vskip\fboxsep \box\@tempboxa\vskip\fboxsep}\hskip
-\fboxrule\vrule \@width \fboxrule}%
\hrule \@height \fboxrule}}}}

\def\@framepicbox(#1,#2){\@ifnextchar
[{\@iframepicbox(#1,#2)}{\@iframepicbox(#1,#2)[]}}

\long\def\@iframepicbox(#1,#2)[#3]#4{\frame{\@imakepicbox(#1,#2)[#3]{#4}}}

\def\parbox{\@ifnextchar [{\@iparbox}{\@iparbox[c]}}

\long\def\@iparbox[#1]#2#3{\leavevmode \@pboxswfalse
\if #1b\vbox
\else \if #1t\vtop
\else \ifmmode \vcenter
\else \@pboxswtrue $\vcenter
\fi
\fi
%% RmS 91/11/04 added \m@th
\fi{\hsize #2\@parboxrestore #3}\if@pboxsw \m@th$\fi}

\let\@dischyph=\-
\let\@acci=\'
\let\@accii=\`
\let\@acciii=\=


\def\@arrayparboxrestore{\let\par\@@par
\let\-\@dischyph
\let\'\@acci \let\`\@accii \let\=\@acciii
\parindent\z@ \parskip\z@
\everypar{}\linewidth\hsize
\@totalleftmargin\z@ \leftskip\z@ \rightskip\z@ \@rightskip\z@
\parfillskip\@flushglue \lineskip\normallineskip
\baselineskip\normalbaselineskip\sloppy}

\def\@parboxrestore{\@arrayparboxrestore\let\\=\@normalcr}

\newif\if@minipage \@minipagefalse

\def\minipage{\@ifnextchar [{\@iminipage}{\@iminipage[c]}}

\def\@iminipage[#1]#2{\leavevmode \@pboxswfalse
\if #1b\vbox
\else \if #1t\vtop
\else \ifmmode \vcenter
\else \@pboxswtrue $\vcenter
\fi
\fi
\fi\bgroup
\hsize #2\textwidth\hsize \columnwidth\hsize
\@parboxrestore
\def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@
\let\@footnotetext\@mpfootnotetext
\let\@listdepth\@mplistdepth \@mplistdepth\z@
\@minipagerestore\global\@minipagetrue %% \global added 24 May 89
\everypar{\global\@minipagefalse\everypar{}}}


\let\@minipagerestore=\relax

\def\endminipage{\par\vskip-\lastskip
\ifvoid\@mpfootins\else
\vskip\skip\@mpfootins\footnoterule\unvbox\@mpfootins\fi
\global\@minipagefalse %% added 24 May 89
\egroup\if@pboxsw \m@th$\fi} %% RmS 91/11/04 added \m@th

\newcount\@mplistdepth
\newinsert\@mpfootins

%% RmS 91/09/29: added \reset@font
\long\def\@mpfootnotetext#1{\global\setbox\@mpfootins
\vbox{\unvbox\@mpfootins
\reset@font\footnotesize
\hsize\columnwidth \@parboxrestore
\edef\@currentlabel{\csname p@mpfootnote\endcsname\@thefnmark}\@makefntext
{\rule{\z@}{\footnotesep}\ignorespaces #1\strut}}}
% \strut added 27 Mar 89, on suggestion by Don Hosek

\newif\if@pboxsw

\def\rule{\@ifnextchar[{\@rule}{\@rule[\z@]}}

\def\@rule[#1]#2#3{\@tempdima#3\advance\@tempdima #1\leavevmode\hbox{\vrule
\@width#2 \@height\@tempdima \@depth-#1}}

\let\@@underline\underline
\def\underline#1{\relax\ifmmode
\@@underline{#1}\else $\@@underline{\hbox{#1}}\m@th$\relax\fi}

\def\raisebox#1{\@ifnextchar[{\@argrsbox{#1}}{\@rsbox{#1}}}

\def\@argrsbox#1[#2]{%
\@ifnextchar[{\@iirsbox{#1}[#2]}{\@irsbox{#1}[#2]}}

\long\def\@rsbox#1#2{\leavevmode\hbox{\raise #1\hbox{#2}}}

\long\def\@irsbox#1[#2]#3{\setbox\@tempboxa \hbox
{\raise #1\hbox{#3}}\ht\@tempboxa#2\leavevmode\box\@tempboxa}

\long\def\@iirsbox#1[#2][#3]#4{\setbox\@tempboxa \hbox
{\raise #1\hbox{#4}}\ht\@tempboxa#2\dp\@tempboxa#3\leavevmode\box\@tempboxa}


\message{tabbing,}
% ****************************************
% * THE TABBING ENVIRONMENT *
% ****************************************
%
% \dimen(\@firsttab + i) = distance of tab stop i from left margin
% 0 <= i <= 15 (?).
%
% \dimen\@firsttab is initialized to \@totalleftmargin, so it starts
% at the prevailing left margin.
%
% \@maxtab = number of highest defined tab register
% probably = \@firsttab + 12
% \@nxttabmar = tab stop number of next line's left margin
% \@curtabmar = tab stop number of current line's left margin
% \@curtab = number of the current tab. At start of line,
% it equals \@curtabmar
% \@hightab = largest tab number currently defined.
% \@tabpush = depth of \pushtab's
%
% \box\@curline = contents of current line, excluding left margin skip,
% and excluding contents of current field
% \box\@curfield = contents of current field
%
% @rjfield = switch: T iff the last field of the line should be
% right-justified at the right margin.
%
% \tabbingsep = distance left by the \' command between the current
% position and the field that is ``left-shifted''.
%
% UTILITY MACROS
% \@stopfield : closes the current field
% \@addfield : adds the current field to the current line.
% \@contfield : continues the current field
% \@startfield : begins the next field
% \@stopline : closes the current line and outputs it
% \@startline : starts the next line
% \@ifatmargin : an \if that is true iff the current line.
% has width zero
%
% \@startline ==
% BEGIN
% \@curtabmar :=G \@nxttabmar
% \@curtab :=G \@curtabmar
% \box\@curline :=G null
% \@startfield
% \strut
% END
%
% \@stopline ==
% BEGIN
% \unskip
% \@stopfield
% if @rjfield = T
% then @rjfield :=G F
% \@tempdima := \@totalleftmargin + \linewidth
% \hbox to \@tempdima{\@itemfudge
% \hskip \dimen\@curtabmar
% \box\@curline
% \hfil
% \box\@curfield}
% else \@addfield
% \hbox {\@itemfudge
% \hskip \dimen\@curtabmar
% \box\@curline}
% fi
% END
%
% \@startfield ==
% BEGIN
% \box\@curfield :=G \hbox {
% END
%
% \@stopfield ==
% BEGIN
% }
% END
%
% \@contfield ==
% BEGIN
% \box\@curfield :=G \hbox { \unhbox\@currfield %%} brace matching
% END
% \@addfield ==
% BEGIN
% \box\@curline :=G \unbox\@curline * \unbox\@curfield
% END
%
% \@ifatmargin ==
% BEGIN
% if dim of box\@curline = 0pt then
% END
%
%
% \tabbing ==
% BEGIN
% \lineskip :=L 0pt
% \> == \@rtab
% \< == \@ltab
% \= == \@settab
% \+ == \@tabplus
% \- == \@tabminus
% \` == \@tabrj
% \' == \@tablab
% \\ == BEGIN \@stopline \@startline END
% \\[DIST] == BEGIN \@stopline \vskip DIST \@startline\ignorespaces END
% \\* == BEGIN \@stopline \penalty 10000 \@startline END
% \\*[DIST] == BEGIN \@stopline \penalty 10000 \vskip DIST
% \@startline\ignorespaces END
% \@hightab :=G \@nxttabmar :=G \@firsttab
% \@tabpush :=G 0
% \dimen\@firsttab := \@totalleftmargin
% @rjfield :=G F
% \trivlist \item[]
% if @minipage = F then \vskip \parskip fi
% \box\@tabfbox = \rlap{\indent\the\everypar} % note: \the\everypar sets
% \@itemfudge == BEGIN \box\@tabfbox END % @inlabel :=G F
% \@startline
% \ignorespaces
% END
%
% \@endtabbing ==
% BEGIN
% \@stopline
% if \@tabpush > 0 then error message: ''unmatched \poptabs'' fi
% \endtrivlist
% END
%
% \@rtab ==
% BEGIN
% \@stopfield
% \@addfield
% if \@curtab < \@hightab
% then \@curtab :=G \@curtab + 1
% else error message ``Undefined Tab'' fi
% \@tempdima := \dimen\@curtab - \dimen\@curtabmar
% - width of box \@curline
% \box\@curline :=G \hbox{\unhbox\@curline + \hskip\@tempdima}
% \@startfield
% END
%
% \@settab ==
% BEGIN
% \@stopfield
% \@addfield
% if \@curtab < \@maxtab
% then \@curtab :=G \@curtab+1
% else error message: ``Too many tabs'' fi
% if \@curtab > \@hightab
% then \@hightab :=L \@curtab fi
% \dimen\@curtab :=L \dimen\@curtabmar + width of \box\@curline
% \@startfield
% END
%
% \@ltab ==
% BEGIN
% \@ifatmargin
% then if \@curtabmar > \@firsttab
% then \@curtab :=G \@curtab - 1
% \@curtabmar :=G \@curtabmar - 1
% else error message ``Too many untabs'' fi
% else error message ``Left tab in middle of line''
% fi
% END
%
% \@tabplus ==
% BEGIN
% if \@nxttabmar < \@hightab
% then \@nxttabmar :=G \@nxttabmar+1
% else error message ``Undefined tab''
% fi
% END
%
% \@tabminus ==
% BEGIN
% if \@nxttabmar > \@firsttab
% then \@nxttabmar :=G \@nxttabmar-1
% else error message ``Too many untabs''
% fi
% END
%
% \@tabrj ==
% BEGIN \@stopfield
% \@addfield
% @rjfield :=G T
% \@startfield
% END
%
% \@tablab ==
% BEGIN \@stopfield
% \box\@curline G:= \hbox{ \box\@curline %% `G' added 17 Jun 86
% \hskip - width of \box\@curfield
% \hskip -\tabbingsep
% \box\@curfield
% \hskip \tabbingsep }
% \@startfield

% END
%
% \pushtabs ==
% BEGIN
% \@stopfield
% \@tabpush :=G \@tabpush + 1
% \begingroup
% \@contfield
% END
%
% \poptabs ==
% BEGIN
% \@stopfield
% if \@tabpush > 0
% then \endgroup
% \@tabpush :=G \@tabpush - 1
% else error message: ``Too many \poptabs''
% fi
% \@contfield
% END
%
% The accents \` , \' , and \= that have been redefined inside a tabbing
% environment can be called by typing \a` , \a' , and \a=.
%

\expandafter \let \csname a`\endcsname = \`
\expandafter \let \csname a'\endcsname = \'
\expandafter \let \csname a=\endcsname = \=
\def\a#1{\csname a#1\endcsname}

\newif\if@rjfield
\newcount\@firsttab
\newcount\@maxtab
\newdimen\@gtempa \@firsttab=\allocationnumber
\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa
\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa
\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa
\newdimen\@gtempa \@maxtab=\allocationnumber
\dimen\@firsttab=0pt
\newcount\@nxttabmar
\newcount\@curtabmar
\newcount\@curtab
\newcount\@hightab
\newcount\@tabpush
\newbox\@curline
\newbox\@curfield
\newbox\@tabfbox

\def\@startline{\global\@curtabmar\@nxttabmar
\global\@curtab\@curtabmar\global\setbox\@curline\hbox % missing \global
{}\@startfield\strut} % added 17 Jun 86

\def\@stopline{\unskip\@stopfield\if@rjfield \global\@rjfieldfalse
\@tempdima\@totalleftmargin \advance\@tempdima\linewidth
\hbox to\@tempdima{\@itemfudge\hskip\dimen\@curtabmar
\box\@curline\hfil\box\@curfield}\else\@addfield
\hbox{\@itemfudge\hskip\dimen\@curtabmar\box\@curline}\fi}

\def\@startfield{\global\setbox\@curfield\hbox\bgroup}%{ BRACE MATCH HACK
\let\@stopfield=}
\def\@contfield{\global\setbox\@curfield\hbox\bgroup\unhbox\@curfield}
\def\@addfield{\global\setbox\@curline\hbox{\unhbox
\@curline\unhbox\@curfield}}
\def\@ifatmargin{\ifdim \wd\@curline =\z@}

\def\@tabcr{\@stopline \@ifstar{\penalty \@M \@xtabcr}{\@xtabcr}}

\def\@xtabcr{\@ifnextchar[{\@itabcr}{\@startline\ignorespaces}}

\def\@itabcr[#1]{\vskip #1\@startline\ignorespaces}

\def\kill{\@stopfield\@startline\ignorespaces}

% REMOVE \outer FROM PLAIN'S DEF OF \+

\def\+{\tabalign}


\def\tabbing{\lineskip \z@\let\>\@rtab\let\<\@ltab\let\=\@settab
\let\+\@tabplus\let\-\@tabminus\let\`\@tabrj\let\'\@tablab
\let\\=\@tabcr
\global\@hightab\@firsttab
\global\@nxttabmar\@firsttab
\dimen\@firsttab\@totalleftmargin
\global\@tabpush\z@ \global\@rjfieldfalse
\trivlist \item[]\if@minipage\else\vskip\parskip\fi
\setbox\@tabfbox\hbox{\rlap{\indent\hskip\@totalleftmargin
\the\everypar}}\def\@itemfudge{\box\@tabfbox}\@startline\ignorespaces}

\def\endtabbing{\@stopline\ifnum\@tabpush >\z@ \@badpoptabs \fi\endtrivlist}

\def\@rtab{\@stopfield\@addfield\ifnum \@curtab<\@hightab
\global\advance\@curtab \@ne \else\@badtab\fi
\@tempdima\dimen\@curtab
\advance\@tempdima -\dimen\@curtabmar
\advance\@tempdima -\wd\@curline
\global\setbox\@curline\hbox{\unhbox\@curline\hskip\@tempdima}%
\@startfield\ignorespaces}
% Omitted \global added to \@rtab 17 Jun 86

\def\@settab{\@stopfield\@addfield\ifnum \@curtab <\@maxtab
\global\advance\@curtab \@ne \else\@latexerr{Tab overflow}\@ehd\fi
\ifnum\@curtab >\@hightab
\@hightab\@curtab\fi
\dimen\@curtab\dimen\@curtabmar
\advance\dimen\@curtab \wd\@curline\@startfield\ignorespaces}
\def\@ltab{\@ifatmargin\ifnum\@curtabmar >\@firsttab
\global\advance\@curtab \m@ne \global\advance\@curtabmar \m@ne \else
\@badtab\fi\else
\@latexerr{\string\<\space in mid line}\@ehd\fi\ignorespaces}
\def\@tabplus {\ifnum \@nxttabmar <\@hightab
\global\advance\@nxttabmar \@ne \else
\@badtab\fi\ignorespaces}
\def\@tabminus{\ifnum\@nxttabmar >\@firsttab
\global\advance\@nxttabmar \m@ne \else
\@badtab\fi\ignorespaces}
\def\@tabrj{\@stopfield\@addfield\global\@rjfieldtrue\@startfield\ignorespaces}

\def\@tablab{\@stopfield\global\setbox\@curline\hbox{\box\@curline
\hskip -\wd\@curfield \hskip -\tabbingsep \box\@curfield
\hskip \tabbingsep}\@startfield\ignorespaces}
% \setbox\@curline made \global in \@tablab. 17 Jun 86

\def\pushtabs{\@stopfield\@addfield\global\advance\@tabpush \@ne \begingroup
\@contfield}
\def\poptabs{\@stopfield\@addfield\ifnum\@tabpush >\z@ \endgroup
\global\advance\@tabpush \m@ne \else
\@badpoptabs\fi\@contfield}

\newdimen\tabbingsep

\message{array,}
% ****************************************
% * ARRAY AND TABULAR ENVIRONMENTS *
% ****************************************
%
% ARRAY PARMETERS:
% \arraycolsep : half the width separating columns in an array environment
% \tabcolsep : half the width separating columns in a tabular environment
% \arrayrulewidth : width of rules
% \doublerulesep : space between adjacent rules in array or tabular
% \arraystretch : line spacing in array and tabular environments is done by
% placing a strut in every row of height and depth
% \arraystretch times the height and depth of the strut
% produced by an ordinary \strut commmand.
%
% PREAMBLE:
% The PREAMBLE argument of an array or tabular environment can contain
% the following:
% l,r,c : indicate where entry is to be placed.
% | : for vertical rule
% @{EXP} : inserts the text EXP in every column. \arraycolsep or \tabcolsep
% spacing is suppressed.
% *{N}{PRE} : equivalent to writing N copies of PRE in the preamble. PRE
% may contain *{N'}{EXP'} expressions.
% p{LEN} : makes entry in parbox of width LEN.
%
% SPECIAL ARRAY COMMANDS:
% \multicolumn{N}{FORMAT}{ITEM} : replaces the next N column items by
% ITEM, formatted according to FORMAT. FORMAT should contain at most
% one l,r or c. If it contains none, then ITEM is ignored.
%
% \vline : draws a vertical line the height of the current row. May
% appear in an array element entry.
% \hline : draws a horizontal line between rows. Must appear either
% before the first entry (to appear above the first row) or right
% after a \\ command. If followed by another \hline, then adds
% a \vskip of \doublerulesep.
%
% \cline[i-j] : draws horizontal lines between rows covering columns
% i through j, inclusive. Multiple commands may follow
% one another to provide lines covering several disjoint
% columns
% \extracolsep{WIDTH} : for use inside an @ in the preamble. Causes a WIDTH
% space to be added between columns for the rest of the
% columns. This is in addition to the ordinary intercolumn
% space.
%
% \array ==
% BEGIN
% \@acol == \@arrayacol
% \@classz == \@arrayclassz
% \@classiv == \@arrayclassiv
% \\ == \@arraycr
% \@halignto == NULL
% \@tabarray
% END
%
% \endarray{NAME} == BEGIN \crcr }} END
%
% \tabular ==
% BEGIN
% \@halignto == NULL
% \@tabular
% END
%
% \tabular*{WIDTH} ==
% BEGIN
% \@halignto == to WIDTH
% \@tabular
% END
%
% \@tabular ==
% BEGIN
% \leavevmode
% \hbox { $
% \@acol == \@tabacol
% \@classz == \@tabclassz
% \@classiv == \@tabclassiv
% \\ == \@tabularcr
% \@tabarray
% END
%
% \endtabular == BEGIN \crcr}} $} END
%
% \@tabarray == if next char = [ then \@array else \@array[c] fi
%
% \@array[POS]{PREAMBLE} ==
% BEGIN
% define \@arstrutbox to make \@arstrut produce strut of height
% and depth \arraystretch times the height and
% depth of a normal strut.
% \@mkpream{PREAMBLE}
% \@preamble == \halign \@halignto {\tabskip=0pt\@arstrut
% eval{\@preamble}\tabskip = 0pt\cr %% }
% \@startpbox == \@@startpbox
% \@endpbox == \@@endpbox
% if POS = t then \vtop
% else if POS = b then \vbox
% else \vcenter
% fi fi
% {
% \par ==L \relax
% \@sharp == #
% \protect == \relax
% \lineskip :=L 0pt
% \baselineskip :=L 0pt
% \@preamble
% END
%
%
% \@arraycr ==
% BEGIN
% $ %% Prevents extra space at end of row's last entry.
% if next char = [
% then \@argarraycr
% else $ \cr %% Needed to balance $
% END
%
% \@argarraycr[LENGTH] ==
% BEGIN
% $ %% Needed to balance $ of \@arraycr
% if LENGTH > 0
% then \@tempdima := depth of \@arstrutbox + LENGTH
% \vrule height 0pt width 0pt depth \@tempdima
% \cr
% else \cr \noalign{\vskip LENGTH}
% END
%
% \@tabularcr and \@argtabularcr same as \@arraycr and \@argarraycr
% except without the extra $'s.

\def\extracolsep#1{\tabskip #1\relax}

\def\array{\let\@acol\@arrayacol \let\@classz\@arrayclassz
\let\@classiv\@arrayclassiv \let\\\@arraycr\let\@halignto\@empty\@tabarray}

\def\endarray{\crcr\egroup\egroup}
\def\endtabular{\crcr\egroup\egroup $\egroup}
\expandafter \let \csname endtabular*\endcsname = \endtabular

\def\tabular{\let\@halignto\@empty\@tabular}

\expandafter \def\csname tabular*\endcsname #1{\def\@halignto{to#1}\@tabular}

\def\@tabular{\leavevmode \hbox \bgroup $\let\@acol\@tabacol
\let\@classz\@tabclassz
\let\@classiv\@tabclassiv \let\\\@tabularcr\@tabarray}

%% RmS 91/11/04 added \m@th
\def\@tabarray{\m@th\@ifnextchar[{\@array}{\@array[c]}}

\def\@array[#1]#2{\setbox\@arstrutbox\hbox{\vrule
\@height\arraystretch \ht\strutbox
\@depth\arraystretch \dp\strutbox
\@width\z@}\@mkpream{#2}\edef\@preamble{\halign \noexpand\@halignto
\bgroup \tabskip\z@ \@arstrut \@preamble \tabskip\z@ \cr}%
\let\@startpbox\@@startpbox \let\@endpbox\@@endpbox
\if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
\bgroup \let\par\relax
\let\@sharp##\let\protect\relax \lineskip\z@\baselineskip\z@\@preamble}

\def\@arraycr{${\ifnum0=`}\fi\@ifstar{\@xarraycr}{\@xarraycr}}
\def\@xarraycr{\@ifnextchar[{\@argarraycr}{\ifnum0=`{\fi}${}\cr}}

\def\@argarraycr[#1]{\ifnum0=`{\fi}${}\ifdim #1>\z@ \@xargarraycr{#1}\else
\@yargarraycr{#1}\fi}

\def\@tabularcr{{\ifnum0=`}\fi\@ifstar{\@xtabularcr}{\@xtabularcr}}
\def\@xtabularcr{\@ifnextchar[{\@argtabularcr}{\ifnum0=`{\fi}\cr}}

\def\@argtabularcr[#1]{\ifnum0=`{\fi}\ifdim #1>\z@
\unskip\@xargarraycr{#1}\else \@yargarraycr{#1}\fi}

\def\@xargarraycr#1{\@tempdima #1\advance\@tempdima \dp \@arstrutbox
\vrule \@height\z@ \@depth\@tempdima \@width\z@ \cr}

\def\@yargarraycr#1{\cr\noalign{\vskip #1}}


% \multicolumn{NUMBER}{FORMAT}{ITEM} ==
% BEGIN
% \multispan{NUMBER}
% \begingroup
% \@addamp == null
% \@mkpream{FORMAT}
% \@sharp == ITEM
% \protect == \relax
% \@startpbox == \@@startpbox
% \@endpbox == \@@endpbox
% \@arstrut
% \@preamble
% \endgroup
% END

% The command \def\@addamp{} was removed from \multicolumn on 6 Dec 86
% because it caused embedded array environments not to work. I think
% that it was included originally to prevent an error message if
% the 2nd argument to the \multicolumn command had two column specifiers.
%
% 8 Feb 89 - \hbox{} added after \@preamble to correct bug that
% occurred if \multicolumn preceded \\[D] with D > 0,
% caused by \\[] command doing an \unskip, which removed
% \tabcolsep glue inserted by \multicolumn

\def\multicolumn#1#2#3{\multispan{#1}\begingroup
\@mkpream{#2}%
\def\@sharp{#3}\let\protect\relax
\let\@startpbox\@@startpbox\let\@endpbox\@@endpbox
\@arstrut \@preamble\hbox{}\endgroup\ignorespaces}


% Codes for classes and character numbers of array, tabular and
% multicolumn arguments.
%
% Character Class Number
% --------- ----- ------
% c 0 0
% l 0 1
% r 0 2
%
% | 1 -
% @ 2 -
% p 3 -
% {@-exp} 4 -
% {p-arg} 5 -
%
% \@testpach \foo : expands \foo, which should be an array parameter token,
% and sets \@chclass and \@chnum to its class and number.
% Uses \@lastchclass to distinguish 4 and 5
%
% Preamble error codes
% 0: 'illegal character'
% 1: 'Missing @-exp'
% 2: 'Missing p-arg'
%
% \@addamp ==
% BEGIN if @firstamp = true then @firstamp := false
% else & fi
% END
%
% \@mkpream TOKENLIST ==
% BEGIN
% @firstamp := T
% \@lastchclass := 6
% \@preamble == null
% \@sharp == \relax
% \protect == BEGIN \noexpand\protect\noexpand END
% \@startpbox == \relax
% \@endpbox == \relax
% \@expast{TOKENLIST}
% for \@nextchar := expand(\@tempa)
% do \@testpach{\@nextchar}
% case of \@chclass
% 0 -> \@classz
% 1 -> \@classi
% ...
% 5 -> \@classv
% end case
% \@lastchclass := \@chclass
% od
% case of \@lastchclass
% 0 -> \hskip \arraycolsep % lrc
% 1 -> % |
% 2 -> \@preamerr1 % 'Missing @-exp' % @
% 3 -> \@preamerr2 % 'Missing p-arg' % p
% 4 -> % @-exp
% 5 -> \hskip \arraycolsep % p-exp
% end case
% END
%
% \@arrayclassz ==
% BEGIN
% \@preamble := \@preamble *
% case of \@lastchclass
% 0 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep
% 1 -> \@addamp \hskip \arraycolsep
% 2 -> % impossible
% 3 -> % impossible
% 4 -> \@addamp
% 5 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep
% 6 -> \@addamp \hskip \arraycolsep
% end case
% * case of \@chnum
% 0 -> \hfil$\relax\@sharp$\hfil
% 1 -> $\relax\@sharp$\hfil
% 2 -> \hfil$\relax\@sharp$
% end case
% END
%
% \@tabclassz == similar to \@arrayclassz
%
% \@classi ==
% BEGIN
% \@preamble := \@preamble *
% case of \@lastchclass
% 0 -> \hskip \arraycolsep \@arrayrule
% 1 -> \hskip \doublerulesep \@arrayrule
% 2 -> % impossible
% 3 -> % impossible
% 4 -> \@arrayrule
% 5 -> \hskip \arraycolsep \@arrayrule
% 6 -> \@arrayrule
% end case
% END
%
% \@classii ==
% BEGIN
% \@preamble := \@preamble *
% case of \@lastchclass
% 0 ->
% 1 -> \hskip .5\arrayrulewidth
% 2 -> % impossible
% else ->
% end case
% END
%
% \@classiii ==
% BEGIN
% \@preamble := \@preamble *
% case of \@lastchclass
% 0 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep
% 1 -> \@addamp \hskip \arraycolsep
% 2 -> % impossible
% 3 -> % impossible
% 4 -> \@addamp
% 5 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep
% 6 -> \@addamp \hskip \arraycolsep
% end case
% END
%
% \@arrayclassiv == BEGIN \@preamble := \@preamble * $ \@nextchar$ END
%
% \@tabclassiv == same as \@arrayclassv except without the $ ... $
%
% \@classv ==
% BEGIN
% \@preamble := \@preamble * \@startpbox{\@nextchar}\ignorespaces\@sharp
% \@endpbox
% END
%
% \@expast{S}: Sets \@tempa := S with all instances of *{N}{STRING}
% replaced by N copies of STRING, where N > 0. An *
% appearing inside braces is ignored, but *-expressions
% inside STRING are expanded, so nested *-expressions are
% handled properly.
%
% \@expast{S} == BEGIN \@xexpast S *0x\@@ END
%
% \@xexpast S1 *{N}{S2} S3 \@@ ==
% BEGIN
% \@tempa := S1
% \@tempcnta := N
% if \@tempcnta > 0
% then while \@tempcnta > 0 do \@tempa := \@tempa S2
% \@tempcnta := \@tempcnta - 1 od
% \@tempb == \@xexpast
% else \@tempb == \@xexnoop
% fi
% \expandafter \@tempb \@tempa S3 \@@
% END
%

\def\@xexnoop #1\@@{}

\def\@expast#1{\@xexpast #1*0x\@@}

\def\@xexpast#1*#2#3#4\@@{\edef\@tempa{#1}\@tempcnta#2\relax
\ifnum\@tempcnta >\z@ \@whilenum\@tempcnta >\z@\do
{\edef\@tempa{\@tempa#3}\advance\@tempcnta \m@ne}\let\@tempb\@xexpast
\else \let\@tempb\@xexnoop\fi
\expandafter\@tempb \@tempa #4\@@}


\newif\if@firstamp
\def\@addamp{\if@firstamp \@firstampfalse \else
\edef\@preamble{\@preamble &}\fi}
\def\@arrayacol{\edef\@preamble{\@preamble \hskip \arraycolsep}}
\def\@tabacol{\edef\@preamble{\@preamble \hskip \tabcolsep}}
\def\@ampacol{\@addamp \@acol}
\def\@acolampacol{\@acol\@addamp\@acol}

\def\@mkpream#1{\@firstamptrue\@lastchclass6
\let\@preamble\@empty\def\protect{\noexpand\protect\noexpand}\let\@sharp\relax
\let\@startpbox\relax\let\@endpbox\relax
\@expast{#1}\expandafter\@tfor \expandafter
\@nextchar \expandafter:\expandafter=\@tempa\do{\@testpach\@nextchar
\ifcase \@chclass \@classz \or \@classi \or \@classii \or \@classiii
\or \@classiv \or\@classv \fi\@lastchclass\@chclass}%
\ifcase \@lastchclass \@acol
\or \or \@preamerr \@ne\or \@preamerr \tw@\or \or \@acol \fi}

\def\@arrayclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or
\or \or \@addamp \or
\@acolampacol \or \@firstampfalse \@acol \fi
\edef\@preamble{\@preamble
\ifcase \@chnum
\hfil$\relax\@sharp$\hfil \or $\relax\@sharp$\hfil
\or \hfil$\relax\@sharp$\fi}}

%% RmS 91/08/14 inserted extra braces around entry for NFSS
\def\@tabclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or
\or \or \@addamp \or
\@acolampacol \or \@firstampfalse \@acol \fi
\edef\@preamble{\@preamble{%
\ifcase \@chnum
\hfil\ignorespaces\@sharp\unskip\hfil
\or \ignorespaces\@sharp\unskip\hfil
\or \hfil\hskip\z@ \ignorespaces\@sharp\unskip\fi}}}

\def\@classi{\ifcase \@lastchclass \@acol \@arrayrule \or
\@addtopreamble{\hskip \doublerulesep}\@arrayrule\or
\or \or \@arrayrule \or
\@acol \@arrayrule \or \@arrayrule \fi}


\def\@classii{\ifcase \@lastchclass \or
\@addtopreamble{\hskip .5\arrayrulewidth}\fi}

\def\@classiii{\ifcase \@lastchclass \@acolampacol \or
\@addamp\@acol \or
\or \or \@addamp \or
\@acolampacol \or \@ampacol \fi}

\def\@tabclassiv{\@addtopreamble\@nextchar}

\def\@arrayclassiv{\@addtopreamble{$\@nextchar$}}

\def\@classv{\@addtopreamble{\@startpbox{\@nextchar}\ignorespaces
\@sharp\@endpbox}}

\def\@addtopreamble#1{\edef\@preamble{\@preamble #1}}

\newcount\@chclass
\newcount\@lastchclass
\newcount\@chnum

\newdimen\arraycolsep
\newdimen\tabcolsep
\newdimen\arrayrulewidth
\newdimen\doublerulesep

\def\arraystretch{1} % Default value.

\newbox\@arstrutbox
\def\@arstrut{\relax\ifmmode\copy\@arstrutbox\else\unhcopy\@arstrutbox\fi}


\def\@arrayrule{\@addtopreamble{\hskip -.5\arrayrulewidth
\vrule \@width \arrayrulewidth\hskip -.5\arrayrulewidth}}

\def\@testpach#1{\@chclass \ifnum \@lastchclass=\tw@ 4 \else
\ifnum \@lastchclass=3 5 \else
\z@ \if #1c\@chnum \z@ \else
\if #1l\@chnum \@ne \else
\if #1r\@chnum \tw@ \else
\@chclass \if #1|\@ne \else
\if #1@\tw@ \else
\if #1p3 \else \z@ \@preamerr 0\fi
\fi \fi \fi \fi \fi \fi
\fi}

\def\hline{\noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet
\@tempa\@xhline}

\def\@xhline{\ifx\@tempa\hline\vskip \doublerulesep\fi
\ifnum0=`{\fi}}

\def\vline{\vrule \@width \arrayrulewidth}

\newcount\@cla
\newcount\@clb

\def\cline#1{\@cline[#1]}
\def\@cline[#1-#2]{\noalign{\global\@cla#1\relax
\global\advance\@cla\m@ne
\ifnum\@cla>\z@\global\let\@gtempa\@clinea\else
\global\let\@gtempa\@clineb\fi
\global\@clb#2\relax
\global\advance\@clb-\@cla}\@gtempa
\noalign{\vskip-\arrayrulewidth}}

\def\@clinea{\multispan\@cla&\multispan\@clb
\unskip\leaders\hrule \@height \arrayrulewidth \hfill
\cr}

\def\@clineb{\multispan\@clb
\unskip\leaders\hrule \@height \arrayrulewidth \hfill
\cr}

% \@startpbox{WIDTH} TEXT \egroup == \parbox{WIDTH}{TEXT}
% \@endpbox == \unskip \strut \par \egroup\hfil (Changed 14 Jan 89)
%

\def\@startpbox#1{\vtop\bgroup \hsize #1\@arrayparboxrestore}
\def\@endpbox{\unskip\strut\par\egroup\hfil}

% 14 Jan 89: Def of \@endpbox changed from
% \def\@endpbox{\par\vskip\dp\@arstrutbox\egroup\hfil}
% so vertical spacing works out right if the last line of a `p' entry
% has a descender.

\let\@@startpbox=\@startpbox
\let\@@endpbox=\@endpbox

\message{picture,}
% ****************************************
% * THE PICTURE ENVIRONMENT *
% ****************************************
%
% \unitlength = value of dimension argument
% \@wholewidth = current line width
% \@halfwidth = half of current line width
% \@linefnt = font for drawing lines
% \@circlefnt = font for drawing circles
%
% \linethickness{DIM} : Sets the width of horizontal and vertical lines
% in a picture to DIM. Does not change width of slanted lines
% or circles. Width of all lines reset by \thinlines and
% \thicklines
%
% \picture(XSIZE,YSIZE)(XORG,YORG)
% BEGIN
% \@picht :=L YSIZE * \unitlength
% box \@picbox :=
% \hbox to XSIZE * \unitlength
% {\hskip -XORG * \unitlength
% \lower YORG * \unitlength
% \hbox{
% \ignorespaces %% added 13 June 89
% END
%
% \endpicture ==
% BEGIN
% } \hss }
% heigth of \@picbox := \@picht
% depth of \@picbox := 0
% \mbox{\box\@picbox} %% change 26 Aug 91
% END
%
% \put(X, Y){OBJ} ==
% BEGIN
% \@killglue
% \raise Y * \unitlength \hbox to 0pt { \hskip X * \unitlength
% OBJ \hss }
% \ignorespaces
% END
%
% \multiput(X,Y)(DELX,DELY){N}{OBJ} ==
% BEGIN
% \@killglue
% \@multicnt := N
% \@xdim := X * \unitlength
% \@ydim := Y * \unitlength
% while \@multicnt > 0
% do \raise \@ydim \hbox to 0pt { \hskip \@xdim
% OBJ \hss }
% \@multicnt := \@multicnt - 1
% \@xdim := \@xdim + DELX * \unitlength
% \@ydim := \@ydim + DELY * \unitlength
% od
% \ignorespaces
% END
%
% \shortstack[POS]{TEXT} : Makes a \vbox containing TEXT stacked as
% a one-column array, positioned l, r or c as indicated by POS.

\newdimen\@wholewidth
\newdimen\@halfwidth
\newdimen\unitlength \unitlength =1pt
\newbox\@picbox
\newdimen\@picht

\def\picture(#1,#2){\@ifnextchar({\@picture(#1,#2)}{\@picture(#1,#2)(0,0)}}

\def\@picture(#1,#2)(#3,#4){\@picht #2\unitlength
\setbox\@picbox\hbox to#1\unitlength\bgroup
\hskip -#3\unitlength \lower #4\unitlength \hbox\bgroup\ignorespaces}

%% 91/08/26 RmS & FMi: extra boxing level around \@picbox
%% to guard against unboxing in math mode
%% (proposed by John Hobby)

\def\endpicture{\egroup\hss\egroup\ht\@picbox\@picht
\dp\@picbox\z@\mbox{\box\@picbox}}

% In the definitions of \put and \multiput, \hskip was replaced by \kern
% just in case arg #3 = ``plus''. (Bug detected by Don Knuth.
% changed 20 Jul 87).
%
\long\def\put(#1,#2)#3{\@killglue\raise#2\unitlength\hbox to\z@{\kern
#1\unitlength #3\hss}\ignorespaces}

\long\def\multiput(#1,#2)(#3,#4)#5#6{\@killglue\@multicnt #5\relax
\@xdim #1\unitlength
\@ydim #2\unitlength
\@whilenum \@multicnt >\z@\do
{\raise\@ydim\hbox to\z@{\kern
\@xdim #6\hss}\advance\@multicnt \m@ne\advance\@xdim
#3\unitlength\advance\@ydim #4\unitlength}\ignorespaces}

\def\@killglue{\unskip\@whiledim \lastskip >\z@\do{\unskip}}

\def\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc
\@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth}
\def\thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw
\@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth}

\def\linethickness#1{\@wholewidth #1\relax \@halfwidth .5\@wholewidth}

\def\shortstack{\@ifnextchar[{\@shortstack}{\@shortstack[c]}}

\def\@shortstack[#1]{\leavevmode
\vbox\bgroup\baselineskip-\p@\lineskip 3\p@\let\mb@l\hss
\let\mb@r\hss \expandafter\let\csname mb@#1\endcsname\relax
\let\\\@stackcr\@ishortstack}

%% RmS 91/08/14 inserted extra braces around entry for NFSS
\def\@ishortstack#1{\halign{\mb@l {##}\unskip\mb@r\cr #1\crcr}\egroup}


\def\@stackcr{\@ifstar{\@ixstackcr}{\@ixstackcr}}
\def\@ixstackcr{\@ifnextchar[{\@istackcr}{\cr\ignorespaces}}

\def\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces}


% \line(X,Y){LEN} ==
% BEGIN
% \@xarg := X
% \@yarg := Y
% \@linelen := LEN * \unitlength
% if \@xarg = 0
% then \@vline
% else if \@yarg = 0
% then \@hline
% else \@sline
% if
% if
% END
%
% \@sline ==
% BEGIN
% if \@xarg < 0
% then @negarg := T
% \@xarg := -\@xarg
% \@yyarg := -\@yarg
% else @negarg := F
% \@yyarg := \@yarg
% fi
% \@tempcnta := |\@yyarg|
% if \@tempcnta > 6
% then error: 'LATEX ERROR: Illegal \line or \vector argument.'
% \@tempcnta := 0
% fi
% \box\@linechar := \hbox{\@linefnt \@getlinechar(\@xarg,\@yyarg) }
% if \@yarg > 0 then \@upordown = \raise
% \@clnht := 0
% else \@upordown = \lower
% \@clnht := height of \box\@linechar
% fi
% \@clnwd := width of \box\@linechar
% if @negarg
% then \hskip - width of \box\@linechar
% \@tempa == \hskip - 2* width of box \@linechar
% else \@tempa == \relax
% fi
% %% Put out integral number of line segments
% while \@clnwd < \@linelen
% do \@upordown \@clnht \copy\@linechar
% \@tempa
% \@clnht := \@clnht + ht of \box\@linechar
% \@clnwd := \@clnwd + width of \box\@linechar
% od
%
% %% Put out last segment
% \@clnht := \@clnht - height of \box\@linechar
% \@clnwd := \@clnwd - width of \box\@linechar
% \@tempdima := \@linelen - \@clnwd
% \@tempdimb := \@tempdima - width of \box\@linechar
% if @negarg then \hskip -\@tempdimb
% else \hskip \@tempdimb
% fi
% \@tempdima := 1000 * \@tempdima
% \@tempcnta := \@tempdima / width of \box\@linechar
% \@tempdima := (\@tempcnta * ht of \box\@linechar)/1000
% \@clnht := \@clnht + \@tempdima
% if \@linelen < width of box\@linechar
% then \hskip width of box\@linechar
% else \hbox{\@upordown \@clnht \copy\@linechar}
% fi
% END
%
% \@hline ==
% BEGIN
% if \@xarg < 0 then \hskip -\@linelen \fi
% \vrule height \@halfwidth depth \@halfwidth width \@linelen
% if \@xarg < 0 then \hskip -\@linelen \fi
% END
%
% \@vline == if \@yarg < 0 \@downline else \@upline fi
%
%
% \@getlinechar(X,Y) ==
% BEGIN
% \@tempcnta := 8*X - 9
% if Y > 0
% then \@tempcnta := \@tempcnta + Y
% else \@tempcnta := \@tempcnta - Y + 64
% fi
% \char\@tempcnta
% END
%
% \vector(X,Y){LEN} ==
% BEGIN
% \@xarg := X
% \@yarg := Y
% \@linelen := LEN * \unitlength
% if \@xarg = 0
% then \@vvector
% else if \@yarg = 0
% then \@hvector
% else \@svector
% if
% if
% END
%
% \@hvector ==
% BEGIN
% \@hline
% {\@linefnt if \@xarg < 0 then \@getlarrow(1,0)
% else \@getrarrow(1,0)
% fi}
% END
%
% \@vvector == if \@yarg < 0 \@downvector else \@upvector fi
%
% \@svector ==
% BEGIN
% \@sline
% \@tempcnta := |\@yarg|
% if \@tempcnta < 5
% then \hskip - width of \box\@linechar
% \@upordown \@clnht \hbox
% {\@linefnt
% if @negarg then \@getlarrow(\@xarg,\@yyarg)
% else \@getrarrow(\@xarg,\@yyarg)
% fi }
% else error: 'LATEX ERROR: Illegal \line or \vector argument.'
% fi
% END
%
% \@getlarrow(X,Y) ==
% BEGIN
% if Y = 0
% then \@tempcnta := '33
% else \@tempcnta := 16 * X - 9
% \@tempcntb := 2 * Y
% if \@tempcntb > 0
% then \@tempcnta := \@tempcnta + \@tempcntb
% else \@tempcnta := \@tempcnta - \@tempcntb + 64
% fi
% fi
% \char\@tempcnta
% END
%
% \@getrarrow(X,Y) ==
% BEGIN
% \@tempcntb := |Y|
% case of \@tempcntb
% 0 : \@tempcnta := '55
% 1 : if X < 3
% then \@tempcnta := 24*X - 6
% else if X = 3
% then \@tempcnta := 49
% else \@tempcnta := 58 fi
% fi
% 2 : if X < 3
% then \@tempcnta := 24*X - 3
% else \@tempcnta := 51 % X must = 3
% fi
% 3 : \@tempcnta := 16*X - 2
% 4 : \@tempcnta := 16*X + 7
% endcase
% if Y < 0
% then \@tempcnta := \@tempcnta + 64
% fi
% \char\@tempcnta
% END

\newif\if@negarg

\def\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
\@linelen #3\unitlength
\ifnum\@xarg =\z@ \@vline
\else \ifnum\@yarg =\z@ \@hline \else \@sline\fi
\fi}

\def\@sline{\ifnum\@xarg<\z@ \@negargtrue \@xarg -\@xarg \@yyarg -\@yarg
\else \@negargfalse \@yyarg \@yarg \fi
\ifnum \@yyarg >\z@ \@tempcnta\@yyarg \else \@tempcnta -\@yyarg \fi
\ifnum\@tempcnta>6 \@badlinearg\@tempcnta\z@ \fi
\ifnum\@xarg>6 \@badlinearg\@xarg \@ne \fi
\setbox\@linechar\hbox{\@linefnt\@getlinechar(\@xarg,\@yyarg)}%
\ifnum \@yarg >\z@ \let\@upordown\raise \@clnht\z@
\else\let\@upordown\lower \@clnht \ht\@linechar\fi
\@clnwd \wd\@linechar
\if@negarg \hskip -\wd\@linechar \def\@tempa{\hskip -2\wd\@linechar}\else
\let\@tempa\relax \fi
\@whiledim \@clnwd <\@linelen \do
{\@upordown\@clnht\copy\@linechar
\@tempa
\advance\@clnht \ht\@linechar
\advance\@clnwd \wd\@linechar}%
\advance\@clnht -\ht\@linechar
\advance\@clnwd -\wd\@linechar
\@tempdima\@linelen\advance\@tempdima -\@clnwd
\@tempdimb\@tempdima\advance\@tempdimb -\wd\@linechar
\if@negarg \hskip -\@tempdimb \else \hskip \@tempdimb \fi
\multiply\@tempdima \@m
\@tempcnta \@tempdima \@tempdima \wd\@linechar \divide\@tempcnta \@tempdima
\@tempdima \ht\@linechar \multiply\@tempdima \@tempcnta
\divide\@tempdima \@m
\advance\@clnht \@tempdima
\ifdim \@linelen <\wd\@linechar
\hskip \wd\@linechar
\else\@upordown\@clnht\copy\@linechar\fi}

\def\@hline{\ifnum \@xarg <\z@ \hskip -\@linelen \fi
\vrule \@height \@halfwidth \@depth \@halfwidth \@width \@linelen
\ifnum \@xarg <\z@ \hskip -\@linelen \fi}

\def\@getlinechar(#1,#2){\@tempcnta#1\relax\multiply\@tempcnta 8%
\advance\@tempcnta -9\ifnum #2>\z@ \advance\@tempcnta #2\relax\else
\advance\@tempcnta -#2\relax\advance\@tempcnta 64 \fi
\char\@tempcnta}

\def\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
\@tempcnta \ifnum\@xarg<\z@ -\@xarg\else\@xarg\fi
\ifnum\@tempcnta<5\relax
\@linelen #3\unitlength
\ifnum\@xarg =\z@ \@vvector
\else \ifnum\@yarg =\z@ \@hvector \else \@svector\fi
\fi
\else\@badlinearg\fi}

\def\@hvector{\@hline\hbox to\z@{\@linefnt
\ifnum \@xarg <\z@ \@getlarrow(1,0)\hss\else
\hss\@getrarrow(1,0)\fi}}

\def\@vvector{\ifnum \@yarg <\z@ \@downvector \else \@upvector \fi}

\def\@svector{\@sline
\@tempcnta\@yarg \ifnum\@tempcnta <\z@ \@tempcnta -\@tempcnta\fi
\ifnum\@tempcnta <5%
\hskip -\wd\@linechar
\@upordown\@clnht \hbox{\@linefnt \if@negarg
\@getlarrow(\@xarg,\@yyarg)\else \@getrarrow(\@xarg,\@yyarg)\fi}%
\else\@badlinearg\fi}

\def\@getlarrow(#1,#2){\ifnum #2=\z@ \@tempcnta'33 \else
\@tempcnta #1\relax\multiply\@tempcnta \sixt@@n \advance\@tempcnta
-9 \@tempcntb #2\relax\multiply\@tempcntb \tw@
\ifnum \@tempcntb >\z@ \advance\@tempcnta \@tempcntb
\else\advance\@tempcnta -\@tempcntb\advance\@tempcnta 64
\fi\fi\char\@tempcnta}

\def\@getrarrow(#1,#2){\@tempcntb #2\relax
\ifnum\@tempcntb <\z@ \@tempcntb -\@tempcntb\relax\fi
\ifcase \@tempcntb\relax \@tempcnta'55 \or
\ifnum #1<\thr@@ \@tempcnta #1\relax\multiply\@tempcnta
24\advance\@tempcnta -6 \else \ifnum #1=\thr@@ \@tempcnta 49
\else\@tempcnta 58 \fi\fi\or
\ifnum #1<\thr@@ \@tempcnta=#1\relax\multiply\@tempcnta
24\advance\@tempcnta -\thr@@ \else \@tempcnta 51 \fi\or
\@tempcnta #1\relax\multiply\@tempcnta
\sixt@@n \advance\@tempcnta -\tw@ \else
\@tempcnta #1\relax\multiply\@tempcnta
\sixt@@n \advance\@tempcnta 7 \fi\ifnum #2<\z@ \advance\@tempcnta 64 \fi
\char\@tempcnta}



\def\@vline{\ifnum \@yarg <\z@ \@downline \else \@upline\fi}

\def\@upline{\hbox to \z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
\@height \@linelen \@depth \z@\hss}}

\def\@downline{\hbox to \z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
\@height \z@ \@depth \@linelen \hss}}

\def\@upvector{\@upline\setbox\@tempboxa\hbox{\@linefnt\char'66}\raise
\@linelen \hbox to\z@{\lower \ht\@tempboxa\box\@tempboxa\hss}}

\def\@downvector{\@downline\lower \@linelen
\hbox to \z@{\@linefnt\char'77\hss}}

% \dashbox{D}(X,Y) ==
% BEGIN
% leave vertical mode
% \hbox to 0pt {
% \baselineskip := 0pt
% \lineskip := 0pt
% %% HORIZONTAL DASHES
% \@dashdim := X * \unitlength
% \@dashcnt := \@dashdim + 200 % to prevent roundoff error
% \@dashdim := D * \unitlength
% \@dashcnt := \@dashcnt / \@dashdim
% if \@dashcnt is odd
% then \@dashdim := 0pt
% \@dashcnt := (\@dashcnt + 1) / 2
% else \@dashdim := \@dashdim / 2
% \@dashcnt := \@dashcnt / 2 - 1
% \box\@dashbox := \hbox{\vrule height \@halfwidth
% depth \@halfwidth width \@dashdim}
% \put(0,0){\copy\@dashbox}
% \put(0,Y){\copy\@dashbox}
% \put(X,0){\hskip -\@dashdim\copy\@dashbox}
% \put(X,Y){\hskip -\@dashdim\box\@dashbox}
% \@dashdim := 3 * \@dashdim
% fi
% \box\@dashbox := \hbox{\vrule height \@halfwidth
% depth \@halfwidth width D * \unitlength
% \hskip D * \unitlength}
% \@tempcnta := 0
% \put(0,0){\hskip \@dashdim
% while \@tempcnta < \@dascnt
% do \copy\@dashbox
% \@tempcnta := \@tempcnta + 1
% od
% }
% \@tempcnta := 0
% put(0,Y){\hskip \@dashdim
% while \@tempcnta < \@dascnt
% do \copy\@dashbox
% \@tempcnta := \@tempcnta + 1
% od
% }
%
% %% vertical dashes
% \@dashdim := Y * \unitlength
% \@dashcnt := \@dashdim + 200 % to prevent roundoff error
% \@dashdim := D * \unitlength
% \@dashcnt := \@dashcnt / \@dashdim
% if \@dashcnt is odd
% then \@dashdim := 0pt
% \@dashcnt := (\@dashcnt + 1) / 2
% else \@dashdim := \@dashdim / 2
% \@dashcnt := \@dashcnt / 2 - 1
% \box\@dashbox := \hbox{\hskip -\@halfwidth
% \vrule width \@wholewidth
% height \@dashdim }
% \put(0,0){\copy\@dashbox}
% \put(X,0){\copy\@dashbox}
% \put(0,Y){\lower\@dashdim\copy\@dashbox}
% \put(X,Y){\lower\@dashdim\copy\@dashbox}
% \@dashdim := 3 * \@dashdim
% fi
% \box\@dashbox := \hbox{\vrule width \@wholewidth
% height D * \unitlength }
% \@tempcnta := 0
% put(0,0){\hskip -\halfwidth
% \vbox{while \@tempcnta < \@dashcnt
% do \vskip D*\unitlength
% \copy\@dashbox
% \@tempcnta := \@tempcnta + 1
% od
% \vskip \@dashdim
% } }
% \@tempcnta := 0
% put(X,0){\hskip -\halfwidth
% \vbox{while \@tempcnta < \@dashcnt
% do \vskip D*\unitlength
% \copy\@dashbox
% \@tempcnta := \@tempcnta + 1
% od
% \vskip \@dashdim
% }
% }
% } % END DASHES
%
% \@imakepicbox(X,Y)
% END

\def\dashbox#1(#2,#3){\leavevmode\hbox to\z@{\baselineskip \z@
\lineskip \z@
\@dashdim #2\unitlength
\@dashcnt \@dashdim \advance\@dashcnt 200
\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
\ifodd\@dashcnt\@dashdim \z@
\advance\@dashcnt \@ne \divide\@dashcnt \tw@
\else \divide\@dashdim \tw@ \divide\@dashcnt \tw@
\advance\@dashcnt \m@ne
\setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth
\@width \@dashdim}\put(0,0){\copy\@dashbox}%
\put(0,#3){\copy\@dashbox}%
\put(#2,0){\hskip-\@dashdim\copy\@dashbox}%
\put(#2,#3){\hskip-\@dashdim\box\@dashbox}%
\multiply\@dashdim \thr@@
\fi
\setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth
\@width #1\unitlength\hskip #1\unitlength}\@tempcnta\z@
\put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
\do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta\z@
\put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
\do{\copy\@dashbox\advance\@tempcnta \@ne }}%
\@dashdim #3\unitlength
\@dashcnt \@dashdim \advance\@dashcnt 200
\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
\ifodd\@dashcnt \@dashdim \z@
\advance\@dashcnt \@ne \divide\@dashcnt \tw@
\else
\divide\@dashdim \tw@ \divide\@dashcnt \tw@
\advance\@dashcnt \m@ne
\setbox\@dashbox\hbox{\hskip -\@halfwidth
\vrule \@width \@wholewidth
\@height \@dashdim}\put(0,0){\copy\@dashbox}%
\put(#2,0){\copy\@dashbox}%
\put(0,#3){\lower\@dashdim\copy\@dashbox}%
\put(#2,#3){\lower\@dashdim\copy\@dashbox}%
\multiply\@dashdim \thr@@
\fi
\setbox\@dashbox\hbox{\vrule \@width \@wholewidth
\@height #1\unitlength}\@tempcnta\z@
\put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt
\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }%
\vskip\@dashdim}}\@tempcnta\z@
\put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta<\@dashcnt
\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }%
\vskip\@dashdim}}}\@makepicbox(#2,#3)}

% CIRCLES AND OVALS
%
% USER COMMANDS:
%
% \circle{D} : Produces the circle with the diameter as close as
% possible to D * \unitlength. \put(X,Y){\circle{D}}
% puts the circle with its center at (X,Y).
%
% \oval(X,Y) : Makes an oval as round as possible that fits in the
% rectangle of width X * \unitlength and height
% Y * \unitlength. The reference point is the center.
%
% \oval(X,Y)[POS] : Save as \oval(X,Y) except it draws only the
% half or quadrant of the oval indicated by POS.
% E.G., \oval(X,Y)[t] draws just the top half
% and \oval(X,Y)[br] draws just the bottom right
% quadrant. In all cases, the reference point is
% the same as the unqualified \oval(X,Y) command.
%
% \@ovvert {DELTA1} {DELTA2} : Makes a vbox containing either the left side
% or the right side of the oval being constructed. The baseline
% will coincide with the outside bottom edge of the oval; the left
% side of the box will coincide with the left edge of the vertical
% rule. The width of the box will be \@tempdima.
% DELTA1 and DELTA2 are added to the character number in \@tempcnta
% to get the characters for the top and bottom quarter circle pieces.
%
% \@ovhorz : Makes an hbox containing the straight rule for either the
% top or the bottom of the oval being constructed. The baseline
% will coincide with bottom edge of the rule; the left side of
% the box will coincide with the left side of the oval.
% The width of the box will be \@ovxx.
%
% \@getcirc {DIAM} : Sets \@tempcnta to the character number
% of the top-right quarter circle with the largest
% diameter less than or equal to DIAM.
% Sets \@tempboxa to an hbox containing that character.
% Sets \@tempdima to \wd \@tempboxa, which is the distance
% from the circle's left outside edge to its right
% inside edge.
% (These characters are like those described in the
% TeXbook, pp. 389-90.)
%
% \@getcirc {DIAM} ==
% BEGIN
% \@tempcnta := integer coercion of (DIAM + 2pt) %% + 2pt added
% \@tempcnta := \@tempcnta / integer coercion of 4pt %% 1 Nov 88
% if \@tempcnta > 10
% then \@tempcnta := 10 fi
% if \@tempcnta > 0
% then \@tempcnta := \@tempcnta-1
% else LaTeX Warning: Oval too small.
% fi
% \@tempcnta := 4 * \@tempcnta
% \@tempboxa := \hbox{\@circlefnt \char \@tempcnta}
% \@tempdima := \wd \@tempboxa
% END
%
% \@put{X}{Y}{OBJ} ==
% BEGIN
% \raise Y \hbox to 0pt{\hskip X OBJ \hss}
% END
%
% \@oval(X,Y)[POS] ==
% BEGIN
% \begingroup
% \boxmaxdepth := \maxdimen
% @ovt := @ovb := @ovl := @ovr := true
% for all E in POS
% do @ovE := false od
% \@ovxx := X * \unitlength
% \@ovyy := Y * \unitlength
% \@tempdimb := min(\@ovxx,\@ovyy)
% \@getcirc{\@tempdimb-2pt} %% "-2pt" added 7 Dec 89
% \@ovro := \ht \@tempboxa
% \@ovri := \dp \@tempboxa
% \@ovdx := \@ovxx - \@tempdima
% \@ovdx := \@ovdx/2
% \@ovdy := \@ovyy - \@tempdima
% \@ovdy := \@ovyy/2
% \@circlefnt
% \@tempboxa :=
% \hbox{
% if @ovr
% then \@ovvert{3}{2} \kern -\@tempdima
% fi
% if @ovl
% then \kern \@ovxx \@ovvert{0}{1} \kern -\@tempdima
% \kern -\@ovxx
% fi
% if @ovt
% then \@ovhorz \kern -\@ovxx
% fi
% if @ovb
% then \raise \@ovyy \@ovhorz
% fi
% }
% \@ovdx := \@ovdx + \@ovro
% \@ovdy := \@ovdy + \@ovro
% \ht\@tempboxa := \dp\@tempboxa := 0
% \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}
% \endgroup
% END
%
% \@ovvert {DELTA1} {DELTA2} ==
% BEGIN
% \vbox to \@ovyy {
% if @ovb
% then \@tempcntb := \@tempcnta + DELTA1
% \kern -\@ovro
% \hbox { \char \@tempcntb }
% \nointerlineskip
% else \kern \@ovri \kern \@ovdy
% fi
% \leaders \vrule width \@wholewidth \vfil
% \nointerlineskip
% if @ovt
% then \@tempcntb := \@tempcnta + DELTA2
% \hbox { \char \@tempcntb }
% else \kern \@ovdy \kern \@ovro
% fi
% }
% END
%
% \@ovhorz ==
% BEGIN
% \hbox to \@ovxx{
% \kern \@ovro
% if @ovr
% then
% else \kern \@ovdx
% fi
% \leaders \hrule height \@wholewidth \hfil
% if @ovl
% then
% else \kern \@ovdx
% fi
% \kern \@ovri
% }
% END
%
% \circle{DIAM} ==
% BEGIN
% \begingroup
% \boxmaxdepth := maxdimen
% \@tempdimb := DIAM *\unitlength
% if \@tempdimb > 15.5pt
% then \@getcirc{\@tempdimb}
% \@ovro := \ht \@tempboxa
% \@tempboxa := \hbox{
% \@circlefnt
% \@tempcnta := \@tempcnta + 2
% \char \@tempcnta
% \@tempcnta := \@tempcnta - 1
% \char \@tempcnta
% \kern -2\@tempdima
% \@tempcnta := \@tempcnta + 2
% \raise \@tempdima \hbox { \char \@tempcnta }
% \raise \@tempdima \box\@tempboxa
% }
% \ht\@tempboxa := \dp\@tempboxa := 0
% \@put{-\@ovro}{-\@ovro}{\@tempboxa}
% else
% \@circ{\@tempdimb}{96}
% fi
% \endgroup
% END
%
% \circle*{DIAM} == \@dot{DIAM} == \@circ{DIAM*\unitlength}{112}
%
% \@circ{DIAM}{CHAR} ==
% BEGIN
% \@tempcnta := integer coercion of (DIAM + .5pt)/1pt.
% if \@tempcnta > 15 then \@tempcnta := 15 fi
% if \@tempcnta > 1 then \@tempcnta := \@tempcnta - 1 fi
% \@tempcnta := \@tempcnta + CHAR
% \@circlefnt
% \char \@tempcnta
% END
%

\newif\if@ovt
\newif\if@ovb
\newif\if@ovl
\newif\if@ovr
\newdimen\@ovxx
\newdimen\@ovyy
\newdimen\@ovdx
\newdimen\@ovdy
\newdimen\@ovro
\newdimen\@ovri

%% \advance\@tempdima 2pt\relax added 1 Nov 88 to fix bug in which
%% size of drawn circle not monotonic function of argument of \circle,
%% caused by different rounding for dimensions of large and small circles.
%
\def\@getcirc#1{\@tempdima #1\relax \advance\@tempdima 2\p@
\@tempcnta\@tempdima
\@tempdima 4\p@ \divide\@tempcnta\@tempdima
\ifnum \@tempcnta >10\relax \@tempcnta 10\relax\fi
\ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne
\else \@warning{Oval too small}\fi
\multiply\@tempcnta 4\relax
\setbox \@tempboxa \hbox{\@circlefnt
\char \@tempcnta}\@tempdima \wd \@tempboxa}

\def\@put#1#2#3{\raise #2\hbox to\z@{\hskip #1#3\hss}}

\def\oval(#1,#2){\@ifnextchar[{\@oval(#1,#2)}{\@oval(#1,#2)[]}}

\def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
\@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
\@tfor\@tempa :=#3\do{\csname @ov\@tempa false\endcsname}\@ovxx
#1\unitlength \@ovyy #2\unitlength
\@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi
\advance \@tempdimb -2\p@
\@getcirc \@tempdimb
\@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
\@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
\@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
\@circlefnt \setbox\@tempboxa
\hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
\if@ovl \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx \fi
\if@ovt \@ovhorz \kern -\@ovxx \fi
\if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
\advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
\@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
\endgroup}

\def\@ovvert#1#2{\vbox to\@ovyy{%
\if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax
\kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip
\else \kern \@ovri \kern \@ovdy \fi
\leaders\vrule \@width \@wholewidth\vfil \nointerlineskip
\if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax
\hbox{\char \@tempcntb}%
\else \kern \@ovdy \kern \@ovro \fi}}

\def\@ovhorz{\hbox to \@ovxx{\kern \@ovro
\if@ovr \else \kern \@ovdx \fi
\leaders \hrule \@height \@wholewidth \hfil
\if@ovl \else \kern \@ovdx \fi
\kern \@ovri}}

\def\circle{\@ifstar{\@dot}{\@circle}}
\def\@circle#1{\begingroup \boxmaxdepth \maxdimen \@tempdimb #1\unitlength
\ifdim \@tempdimb >15.5\p@ \@getcirc\@tempdimb
\@ovro\ht\@tempboxa
\setbox\@tempboxa\hbox{\@circlefnt
\advance\@tempcnta\tw@ \char \@tempcnta
\advance\@tempcnta\m@ne \char \@tempcnta \kern -2\@tempdima
\advance\@tempcnta\tw@
\raise \@tempdima \hbox{\char\@tempcnta}\raise \@tempdima
\box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@
\@put{-\@ovro}{-\@ovro}{\box\@tempboxa}%
\else \@circ\@tempdimb{96}\fi\endgroup}

\def\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}}

\def\@circ#1#2{\@tempdima #1\relax \advance\@tempdima .5\p@
\@tempcnta\@tempdima \@tempdima \p@
\divide\@tempcnta\@tempdima
\ifnum\@tempcnta >15\relax \@tempcnta 15\relax \fi
\ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne\fi
\advance\@tempcnta #2\relax
\@circlefnt \char\@tempcnta}


%INITIALIZATION
\thinlines

\newcount\@xarg
\newcount\@yarg
\newcount\@yyarg
\newcount\@multicnt
\newdimen\@xdim
\newdimen\@ydim
\newbox\@linechar
\newdimen\@linelen
\newdimen\@clnwd
\newdimen\@clnht
\newdimen\@dashdim
\newbox\@dashbox
\newcount\@dashcnt



\message{theorem,}
% ****************************************
% * THEOREM ENVIRONMENTS *
% ****************************************
%
% The user creates his own theorem-like environments with the command
% \newtheorem{NAME}{TEXT}[COUNTER] or
% \newtheorem{NAME}[OLDNAME]{TEXT}
% This defines the environment NAME to be just as one would expect a
% theorem environment to be, except that it prints ``TEXT'' instead of
% ``Theorem''.
%
% If OLDNAME is given, then environments NAME and OLDNAME use the same
% counter, so using a NAME environment advances the number of the next
% NAME environment, and vice-versa.
%
% If COUNTER is given, then environment NAME is numbered within COUNTER.
% E.g., if COUNTER = subsection, then the first NAME in subsection 7.2
% is numbered TEXT 7.2.1.
%
% The way NAME environments are numbered can be changed by redefining
% \theNAME.
%
% DOCUMENT STYLE PARAMETERS
%
% \@thmcounter{COUNTER} : A command such that
% \edef\theCOUNTER{\@thmcounter{COUNTER}}
% defines \theCOUNTER to produce a number for a theorem environment.
% The default is:
% BEGIN \noexpand\arabic{COUNTER} END
%
% \@thmcountersep : A separator placed between a theorem number and
% the number of the counter within which it is numbered.
% E.g., to make the third theorem of section 7.2 be numbered
% 7.2-3, \@thmcountersep should be \def'ed to '-'. Its
% default is '.'.
%
% \@begintheorem{NAME}{NUMBER} : A command that begins a theorem
% environment for a 'theorem' named 'NAME NUMBER' --
% e.g., \@begintheorem{Lemma}{3.7} starts Lemma 3.7.
%
% \@opargbegintheorem{NAME}{NUMBER}{OPARG} : A command that begins a theorem
% environment for a 'theorem' named 'NAME NUMBER' with optional
% argument OPARG -- e.g., \@begintheorem{Lemma}{3.7}{Jones}
% starts `Lemma 3.7 (Jones):'.
%
% \@endtheorem : A command that ends a theorem environment.
%
% \newtheorem{NAME}{TEXT}[COUNTER] ==
% BEGIN
% if \NAME is definable
% then \@definecounter{NAME}
% if COUNTER present
% then \@addtoreset{NAME}{COUNTER} fi
% \theNAME == BEGIN \theCOUNTER \@thmcountersep
% eval\@thmcounter{NAME} END
% else \theNAME == BEGIN eval\@thmcounter{NAME} END
% \NAME == \@thm{NAME}{TEXT}
% \endNAME == \@endtheorem
% else error
% fi
% END
%
% \newtheorem{NAME}[OLDNAME]{TEXT}==
% BEGIN
% if \NAME is definable
% then \theNAME == \theOLDNAME
% \NAME == \@thm{OLDNAME}{TEXT}
% \endNAME == \@endtheorem
% else error
% fi
% END
%
% \@thm{NAME}{TEXT} ==
% BEGIN
% \refstepcounter{NAME}
% if next char = [
% then \@ythm{NAME}{TEXT}
% else \@xthm{NAME}{TEXT}
% fi
% END
%
% \@xthm{NAME}{TEXT} ==
% BEGIN
% \@begintheorem{TEXT}{\theNAME}
% \ignorespaces
% END
%
% \@ythm{NAME}{TEXT}[OPARG] ==
% BEGIN
% \@opargbegintheorem{TEXT}{\theNAME}{OPARG}
% \ignorespaces
% END
%
\def\newtheorem#1{\@ifnextchar[{\@othm{#1}}{\@nthm{#1}}}

\def\@nthm#1#2{%
\@ifnextchar[{\@xnthm{#1}{#2}}{\@ynthm{#1}{#2}}}

\def\@xnthm#1#2[#3]{\expandafter\@ifdefinable\csname #1\endcsname
{\@definecounter{#1}\@addtoreset{#1}{#3}%
\expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand
\csname the#3\endcsname \@thmcountersep \@thmcounter{#1}}%
\global\@namedef{#1}{\@thm{#1}{#2}}\global\@namedef{end#1}{\@endtheorem}}}

\def\@ynthm#1#2{\expandafter\@ifdefinable\csname #1\endcsname
{\@definecounter{#1}%
\expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}%
\global\@namedef{#1}{\@thm{#1}{#2}}\global\@namedef{end#1}{\@endtheorem}}}

%% RmS 92/01/10: check for existence of theorem environment #2
\def\@othm#1[#2]#3{%
\@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}%
{\expandafter\@ifdefinable\csname #1\endcsname
{\global\@namedef{the#1}{\@nameuse{the#2}}%
\global\@namedef{#1}{\@thm{#2}{#3}}%
\global\@namedef{end#1}{\@endtheorem}}}}

\def\@thm#1#2{\refstepcounter
{#1}\@ifnextchar[{\@ythm{#1}{#2}}{\@xthm{#1}{#2}}}

\def\@xthm#1#2{\@begintheorem{#2}{\csname the#1\endcsname}\ignorespaces}
\def\@ythm#1#2[#3]{\@opargbegintheorem{#2}{\csname
the#1\endcsname}{#3}\ignorespaces}

%DEFAULT VALUES
\def\@thmcounter#1{\noexpand\arabic{#1}}
\def\@thmcountersep{.}
%deleted September 2, 1986 MDK
%\def\@makethmnumber#1#2{\bf #1 #2:}

%% RmS 91/08/14 Moved \it after \item to make it work with NFSS
\def\@begintheorem#1#2{\trivlist \item[\hskip \labelsep{\bf #1\ #2}]\it}
\def\@opargbegintheorem#1#2#3{\trivlist
\item[\hskip \labelsep{\bf #1\ #2\ (#3)}]\it}
\def\@endtheorem{\endtrivlist}


\message{lengths,}
% ****************************************
% * LENGTHS *
% ****************************************
%
% USER COMMANDS:
%
% \newlength{\NAME} == \newskip\NAME
% \setlength{\NAME}{VALUE} == \NAME :=L VALUE
% \addtolength{\NAME}{VALUE} == \NAME :=L \NAME + VALUE
% \settowidth{\NAME}{TEXT} == \NAME :=L width of \hbox{TEXT}
%
\def\newlength#1{\@ifdefinable#1{\newskip#1}}
\def\setlength#1#2{#1#2\relax}
\def\addtolength#1#2{\advance#1 #2\relax}
\def\settowidth#1#2{\setbox\@tempboxa\hbox{#2}#1\wd\@tempboxa\relax}
%% \relax added 24 Mar 86

\message{title,}
% *****************************************
% * THE TITLE *
% *****************************************
%
% The user defines the title, author, date by the declarations \title{NAME},
% \author{NAME} and \date{DATE}. Inside these, he can use the \thanks
% command to make footnoted acknowledgements, notice of address, etc.
% The \maketitle command produces the actual title. Note: multiple authors
% are separated with the \and command.

\def\title#1{\gdef\@title{#1}}

\def\author#1{\gdef\@author{#1}}

\def\date#1{\gdef\@date{#1}}
\gdef\@date{\today} %Default is today's date

\def\thanks#1{\footnotemark\begingroup
\def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks
\protect\footnotetext[\the\c@footnote]{#1}}\endgroup}

\def\@thanks{}

\def\and{%% % \begin{tabular}
\end{tabular}\hskip 1em plus.17fil\begin{tabular}[t]{c}%% \end{tabular}
}



\message{sectioning,}
% *****************************************
% * SECTIONING *
% *****************************************
%
%
% \@startsection {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}
% optional * [ALTHEADING]{HEADING}
% Generic command to start a section.
% NAME : e.g., 'subsection'
% LEVEL : a number, denoting depth of section -- e.g., chapter=1,
% section = 2, etc.
% INDENT : Indentation of heading from left margin
% BEFORESKIP : Absolute value = skip to leave above the heading.
% If negative, then paragraph indent of text following
% heading is suppressed.
% AFTERSKIP : if positive, then skip to leave below heading, else
% negative of skip to leave to right of run-in heading.
% STYLE : commands to set style
% If '*' missing, then increments the counter. If it is present, then
% there should be no [ALTHEADING] argument.
% Uses the counter 'secnumdepth' whose value is the highest section
% level that is to be numbered.
%
% WARNING: The \@startsection command should be at the same or higher
% grouping level as the text that follows it. For example, you
% should NOT do something like
% \def\foo{ \begingroup ...
% \paragraph{...}
% \endgroup}
%
% \@startsection {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE} ==
% BEGIN
% IF @noskipsec = T THEN \leavevmode FI % true if previous section
% % had no body.
% \par
% \@tempskipa := BEFORESKIP
% @afterindent := T
% IF \@tempskipa < 0 THEN \@tempskipa := -\@tempskipa
% @afterindent := F
% FI
% IF @nobreak = true
% THEN \everypar == null
% ELSE \addpenalty{\@secpenalty}
% \addvspace{\@tempskipa}
% FI
% IF * next
% THEN \@ssect{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}
% ELSE \@dblarg{\@sect
% {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}}
% FI
% END
%
% \@sect{NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}[ARG1]{ARG2} ==
% BEGIN
% IF LEVEL > \c@secnumdepth
% THEN \@svsec :=L null
% ELSE \refstepcounter{NAME}
% \@svsec :=L BEGIN \theNAME END
% FI
% IF AFTERSKIP > 0
% THEN \begingroup
% STYLE
% \@hangfrom{\hskip INDENT\@svsec}
% {\interlinepenalty 10000 ARG2\par}
% \endgroup
% \NAMEmark{ARG1}
% \addcontentsline{toc}{NAME}
% { IF LEVEL > \c@secnumdepth
% ELSE \protect\numberline{\theNAME} FI
% ARG1 }
% ELSE \@svsechd == BEGIN STYLE
% \hskip INDENT\@svsec
% ARG2
% \NAMEmark{ARG1}
% \addcontentsline{toc}{NAME}
% { IF LEVEL > \c@secnumdepth
% ELSE \protect\numberline{\theNAME} FI
% ARG1 }
% END
% FI
% \@xsect{AFTERSKIP}
% END
%
% \@xsect{AFTERSKIP} ==
% BEGIN
% IF AFTERSKIP > 0
% THEN \par \nobreak
% \vskip AFTERSKIP
% \@afterheading
% ELSE @nobreak :=G F
% @noskipsec :=G T
% \everypar{ IF @noskipsec = T
% THEN @noskipsec :=G F
% \clubpenalty :=G 10000
% \hskip -\parindent
% \begingroup
% \@svsechd
% \endgroup
% \unskip
% \hskip -AFTERSKIP \relax %% relax added 14 Jan 91
% ELSE \clubpenalty :=G \@clubpenalty
% \everypar := NULL
% FI
% }
% FI
%
% END
%
% \@ssect{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}{ARG} ==
% BEGIN
% IF AFTERSKIP > 0
% THEN \begingroup
% STYLE
% \@hangfrom{\hskip INDENT}{\interlinepenalty 10000 ARG\par}
% \endgroup
% ELSE \@svsechd == BEGIN STYLE
% \hskip INDENT
% ARG
% END
% FI
% \@xsect{AFTERSKIP}
% END
%
% \@afterheading ==
% BEGIN
% @nobreak :=G true
% \everypar := BEGIN IF @nobreak = T
% THEN @nobreak :=G false
% \clubpenalty :=G 10000
% IF @afterindent = F
% THEN remove \lastbox
% FI
% ELSE \clubpenalty :=G \@clubpenalty
% \everypar := NULL
% FI
% END
% END
%
% \@secpenalty : The penalty (usually negative) put before a section
% heading unless it immediately follows another one.
%
\newcount\@secpenalty
\@secpenalty = -300


\newif\if@noskipsec \@noskipsectrue


\def\@startsection#1#2#3#4#5#6{\if@noskipsec \leavevmode \fi
\par \@tempskipa #4\relax
\@afterindenttrue
\ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse\fi
\if@nobreak \everypar{}\else
\addpenalty{\@secpenalty}\addvspace{\@tempskipa}\fi \@ifstar
{\@ssect{#3}{#4}{#5}{#6}}{\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}

\def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth
\let\@svsec\@empty\else
\refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname\hskip 1em}\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
\begingroup #6\relax
\@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par}%
\endgroup
\csname #1mark\endcsname{#7}\addcontentsline
{toc}{#1}{\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}\fi
#7}\else
\def\@svsechd{#6\hskip #3\relax %% \relax added 2 May 90
\@svsec #8\csname #1mark\endcsname
{#7}\addcontentsline
{toc}{#1}{\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}\fi
#7}}\fi
\@xsect{#5}}

\def\@xsect#1{\@tempskipa #1\relax
\ifdim \@tempskipa>\z@
\par \nobreak
\vskip \@tempskipa
\@afterheading
\else \global\@nobreakfalse \global\@noskipsectrue
\everypar{\if@noskipsec \global\@noskipsecfalse
\clubpenalty\@M \hskip -\parindent
\begingroup \@svsechd \endgroup \unskip
\hskip -#1\relax % relax added 14 Jan 91
\else \clubpenalty \@clubpenalty
\everypar{}\fi}\fi\ignorespaces}

\def\@ssect#1#2#3#4#5{\@tempskipa #3\relax
\ifdim \@tempskipa>\z@
\begingroup #4\@hangfrom{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup
\else \def\@svsechd{#4\hskip #1\relax #5}\fi
\@xsect{#3}}

\newif\if@afterindent \@afterindenttrue

\def\@afterheading{\global\@nobreaktrue
\everypar{\if@nobreak
\global\@nobreakfalse
\clubpenalty \@M
\if@afterindent \else {\setbox\z@\lastbox}\fi
\else \clubpenalty \@clubpenalty
\everypar{}\fi}}


% \@hangfrom{TEXT} : Puts TEXT in a box, and makes a hanging indentation
% of the following material up to the first \par. Should be used
% in vertical mode.
%
\def\@hangfrom#1{\setbox\@tempboxa\hbox{#1}%
\hangindent \wd\@tempboxa\noindent\box\@tempboxa}

\newcount\c@secnumdepth
\newcount\c@tocdepth

% \secdef{UNSTARCMDS}{STARCMDS} :
% When defining a \chapter or \section command without using
% \@startsection, you can use \secdef as follows:
% \def\chapter { ... \secdef \CMDA \CMDB }
% \def\CMDA [#1]#2{ ... } % Command to define \chapter[...]{...}
% \def\CMDB #1{ ... } % Command to define \chapter*{...}

\def\secdef#1#2{\@ifstar{#2}{\@dblarg{#1}}}

% Initializations
%
\def\sectionmark#1{}
\def\subsectionmark#1{}
\def\subsubsectionmark#1{}
\def\paragraphmark#1{}
\def\subparagraphmark#1{}

\message{contents,}
% *****************************************
% * TABLE OF CONTENTS, ETC. *
% *****************************************
%
% CONVENTIONS:
% \tf@foo = file number for output for table foo. The file is
% opened only if @filesw = true.
%
% \contentsline{TYPE}{ENTRY}{PAGE}
% Macro to produce a TYPE entry in a table of contents, etc.
% It will appear in the .TOC or other file. For example,
% The entry for subsection 1.4.3 in the table of contents might
% be produced by:
% \contentsline{subsection}{\makebox{30pt}[r]{1.4.3} Gnats and Gnus}{22}
% The \protect command causes command sequences to be written
% without expanding them.
%
% \l@TYPE{ENTRY}{PAGE}
% Macro defined by document style for making an entry of
% type TYPE in a table of contents, etc. E.g., the document
% style should define \l@chapter, \l@section, etc.
%
% \addcontentsline{TABLE}{TYPE}{ENTRY}
% User command for adding his own entry to a table of contents, etc.
% It adds the entry
% \contentsline{TYPE}{ENTRY}{page}
% to the .TABLE file.
%
% \addtocontents{TABLE}{TEXT} : Adds TEXT to the .TABLE file, with no
% page number.
%
% Note: When used in the ENTRY or TEXT of one of the above commands,
% \protect causes the following control sequence to be written
% on the file without being expanded. The sequence will be expanded
% when the table of contents entry is processed.
%
% SURPRISE: \index, \glossary, and \label are no-ops inside an
% \addcontentsline or \addtocontents command argument. This could cause a
% problem if the user puts an \index or \label into one of the commands he
% writes, or into the optional 'short version' argument of a \section or
% \caption command.
%
% \addcontentsline{TABLE}{TYPE}{ENTRY} ==
% BEGIN
% if @filesw = true
% then \begingroup
% \index == \label == \glossary == \@gobble
% \protect{ARG} == \string\string\string ARG \string\space\space
% \@temptokena := \thepage
% \@tempa == write \string\contentsline
% {TYPE}{ENTRY}{\the\@temptokena}
% \@tempa
% IF vmode and @nobreak = true THEN \nobreak FI
% \endgroup
% fi
% END
%
% \@starttoc{EXT} : Used to define \tableofcontents, \listoffigures, etc.--
% e.g., \@starttoc{lof} is used in \listoffigures. This command reads
% the .EXT file and sets up to write the new .EXT file.
%
% \@starttoc{EXT} ==
% BEGIN
% \begingroup
% \makeatletter
% read file \jobname.EXT
% IF @filesw = true
% THEN open \jobname.EXT as file \tf@EXT
% FI
% @nobreak :=G FALSE %% added 24 May 89
% \endgroup
% END

%% RmS 92/01/14: added \immediate to \openout as all \write commands
%% are also executed \immediate
\def\@starttoc#1{\begingroup
\makeatletter
\@input{\jobname.#1}\if@filesw \expandafter\newwrite\csname tf@#1\endcsname
\immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
\fi \global\@nobreakfalse \endgroup}


\let\protect=\relax

\def\addcontentsline#1#2#3{\if@filesw \begingroup
\let\label\@gobble \let\index\@gobble \let\glossary\@gobble
\def\protect##1{\string\string\string##1\string\space
\space}\@temptokena{\thepage}%
\edef\@tempa{\write \@auxout{\string\@writefile{#1}{\protect
\contentsline{#2}{#3}{\the\@temptokena}}}}\@tempa
\if@nobreak \ifvmode\nobreak\fi\fi\endgroup\fi}

\long\def\addtocontents#1#2{\if@filesw \begingroup
\let\label\@gobble \let\index\@gobble \let\glossary\@gobble
\def\protect##1{\string\string\string##1\string\space\space}%
\edef\@tempa{\write \@auxout {\string\@writefile{#1}{#2}}}\@tempa
\if@nobreak \ifvmode\nobreak\fi\fi\endgroup\fi}

\def\contentsline#1{\csname l@#1\endcsname}

% \@dottedtocline{LEVEL}{INDENT}{NUMWIDTH}{TITLE}{PAGE} :
% Macro to produce a table of contents line with the following
% parameters:
% LEVEL : If LEVEL > \c@tocdepth, then no line produced.
% INDENT : Total indentation from the left margin.
% NUMWIDTH : Width of box for number if the TITLE has a
% \numberline command.
% As of 25 Jan 88, this is also the amount of extra indentation
% added to second and later lines of a multiple line entry.
% TITLE : Contents of entry.
% PAGE : Page number.
%
% Uses the following parameters, which must be set by the document style.
% They should be defined with \def's.
% \@pnumwidth : Width of box in which page number is set.
% \@tocrmarg : Right margin indentation for all but last line of
% multiple-line entries.
% \@dotsep : Separation between dots, in mu units. Should be \def'd to
% a number like 2 or 1.7
%

%% RmS 91/09/29: added \reset@font for page number
\def\@dottedtocline#1#2#3#4#5{\ifnum #1>\c@tocdepth \else
\vskip \z@ plus.2\p@
{\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
\parindent #2\relax\@afterindenttrue
\interlinepenalty\@M
\leavevmode
\@tempdima #3\relax \advance\leftskip \@tempdima \hbox{}\hskip -\leftskip
#4\nobreak\leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern \@dotsep
mu$}\hfill \nobreak
\hbox to\@pnumwidth{\hfil\reset@font\rm #5}\par}\fi}


%%% Note: \nobreak's added 7 Jan 86 to prevent bad line break that
%%% left the page number dangling by itself at left edge of a new line.
%%%
%%% Changed 25 Jan 88 to use \leftskip instead of \hangindent so
%%% leaders of multiple-line contents entries would line up properly.

% \numberline{NUMBER} : For use in a \contentsline command.
% It puts NUMBER flushleft in a box of width \@tempdima
% (Before 25 Jan 88 change, it also added \@tempdima to the hanging
% indentation.)

\def\numberline#1{\hbox to\@tempdima{#1\hfil}}


\message{index,}
% ****************************************************
% * INDEX COMMANDS AND GLOSSARY *
% ****************************************************
%
% \makeindex ==
% BEGIN
% if \@filesw = T
% then open file \jobname.IDX as \@indexfile
% \index == BEGIN \@bsphack
% \begingroup
% \protect{X} == \string X\space
% %% added 3 Feb 87 for \index commands
% %% in \footnotes
% re-\catcode special characters to 'other'
% \@wrindex
% fi
% END
%
% \@wrindex{ITEM} ==
% BEGIN
% write of {\indexentry{ITEM}{page number}}
% \endgroup
% \@esphack
% END

% INITIALIZATION:
%
% \index == BEGIN \@bsphack
% \begingroup
% re-\catcode special characters (in case '%' there)
% \@index
% END
%
% \@index{ITEM} == BEGIN \endgroup \@esphack END
%
% Changes made 14 Apr 89 to write \glossaryentry's instead of
% \indexentry's on the .glo file.

\def\makeindex{\if@filesw \newwrite\@indexfile
\immediate\openout\@indexfile=\jobname.idx
\def\index{\@bsphack\begingroup
\def\protect####1{\string####1\space}\@sanitize
\@wrindex}\typeout
{Writing index file \jobname.idx }\fi}

\def\@wrindex#1{\let\thepage\relax
\edef\@tempa{\write\@indexfile{\string
\indexentry{#1}{\thepage}}}\expandafter\endgroup\@tempa
\if@nobreak \ifvmode\nobreak\fi\fi\@esphack}

\def\index{\@bsphack\begingroup \@sanitize\@index}

\def\@index#1{\endgroup\@esphack}

\def\makeglossary{\if@filesw \newwrite\@glossaryfile
\immediate\openout\@glossaryfile=\jobname.glo
\def\glossary{\@bsphack\begingroup\@sanitize\@wrglossary}\typeout
{Writing glossary file \jobname.glo }\fi}

\def\@wrglossary#1{\let\thepage\relax
\edef\@tempa{\write\@glossaryfile{\string
\glossaryentry{#1}{\thepage}}}\expandafter\endgroup\@tempa
\if@nobreak \ifvmode\nobreak\fi\fi\@esphack}

\def\glossary{\@bsphack\begingroup\@sanitize\@index}

\message{bibliography,}
% ****************************************
% * BIBLIOGRAPHY *
% ****************************************
%
% A bibliography is created by the bibliography environment, which
% generates a title such as ``References'', and a list of entries.
% The BIBTeX program will create a file containing such an environment,
% which will be read in by the \bibliography command. With
% BIBTeX, the following commands will be used.
%
% \bibliography{FILE1,FILE2, ... ,FILEn} : specifies
% the bibdata files. Writes a \bibdata entry on the .aux file
% and tries to read in mainfile.BBL.
%
% \bibliographystyle{STYLE} : Writes a \bibstyle entry on the .aux file.
%
% The thebibliography environment is a list environment. To save the
% use of an extra counter, it should use enumiv as the item counter.
% Instead of using \item, items in the bibliography are produced by the
% following commands:
% \bibitem{NAME} : Produces a numbered entry cited as NAME.
% \bibitem[LABEL]{NAME} : Produces an entry labeled by LABEL and
% cited by NAME.
% The former is used for bibliographies with citations like [1], [2], etc.;
% the latter is used for citations like [Knuth82].
%
% The document style must define the thebibliography environment. This
% environment has a single argument, which is the widest bibliography
% label-- e.g., if the [Knuth67] is the widest entry, then thist argument
% will be Knuth67. The \thebibliography command must begin a list
% environment, which the \endthebibliography command ends.
%
% Entries are cited by the command \cite{NAME}.
%
% PARAMETERS
%
% \@cite : A macro such that \@cite{LABEL1,LABEL2}{NOTE}
% produces the output for a \cite[NOTE]{FOO1,FOO2} command,
% where entry FOOi is defined by \bibitem[LABELi]{FOOi}.
% The switch @tempswa is true if the optional NOTE argument
% is present.
% The default definition is :
% \@cite{LABELS}{NOTE} ==
% BEGIN [LABELS
% IF @tempswa = T THEN , NOTE FI
% ]
% END
%
% \@biblabel : A macro to produce the label in the bibliography
% entry. For \bibitem[LABEL]{NAME}, the label is
% generated by \@biblabel{LABEL}. It has the default
% definition \@biblabel{LABEL} -> [LABEL].
% CONVENTION
%
% \b@FOO : The name or number of the reference created by \cite{FOO}
% E.g., if \cite{FOO} -> [17] , then \b@FOO -> 17.
%
%

\def\bibitem{\@ifnextchar[{\@lbibitem}{\@bibitem}}

\def\@lbibitem[#1]#2{\item[\@biblabel{#1}]\if@filesw
{\def\protect##1{\string ##1\space}\immediate
\write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
%% Placement of `}' in def of \@lbibitem corrected 29 Apr 87
%% (Error found by Arthur Ogawa.)

%% RmS 91/11/13: Changed counter enumi to enumiv,
%% as it says in the comment above
%% RmS 92/01/10: Changed \c@enumiv to \value{\@listctr}.
\def\@bibitem#1{\item\if@filesw \immediate\write\@auxout
{\string\bibcite{#1}{\the\value{\@listctr}}}\fi\ignorespaces}

\def\bibcite#1#2{\global\@namedef{b@#1}{#2}}

\let\citation\@gobble

\def\cite{\@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}

% \penalty\@m added to definition of \@citex to allow a line
% break after the `,' in citations like [Jones80,Smith77]
% (Added 23 Oct 86)
%
% space added after the `,' (21 Nov 87)
%
%% RmS 91/10/25: added \reset@font, suggested by Bernd Raichle.
%% RmS 91/11/06: added code to remove a leading blank
\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi
\let\@citea\@empty
\@cite{\@for\@citeb:=#2\do
{\@citea\def\@citea{,\penalty\@m\ }%
\def\@tempa##1##2\@nil{\edef\@citeb{\if##1\space##2\else##1##2\fi}}%
\expandafter\@tempa\@citeb\@nil
\@ifundefined{b@\@citeb}{{\reset@font\bf ?}\@warning
{Citation `\@citeb' on page \thepage \space undefined}}%
\hbox{\csname b@\@citeb\endcsname}}}{#1}}

\let\bibdata=\@gobble
\let\bibstyle=\@gobble

\def\bibliography#1{\if@filesw\immediate\write\@auxout{\string\bibdata{#1}}\fi
\@input{\jobname.bbl}}

\def\bibliographystyle#1{\if@filesw\immediate\write\@auxout
{\string\bibstyle{#1}}\fi}

% \nocite{CITATIONS} : puts information on .AUX file to cause
% BibTeX to include the CITATIONS list in the bibliography,
% but puts nothing in the text. (Added 14 Jun 85)

\def\nocite#1{\@bsphack
\if@filesw\immediate\write\@auxout{\string\citation{#1}}\fi
\@esphack}



%DEFAULT DEFINITIONS

\def\@cite#1#2{[{#1\if@tempswa , #2\fi}]}
%% RmS 92/01/14: removed \hfill in definition of \@biblabel
\def\@biblabel#1{[#1]}

\message{floats,}
% ****************************************
% * FLOATS *
% ****************************************
%
% The different types of floats are identified by a TYPE name, which is
% the name of the counter for that kind of float. For example, figures
% are of type 'figure' and tables are of type 'table'. Each TYPE has
% associated a positive TYPE NUMBER, which is a power of two. E.g.,
% figures might be have type number 1, tables type number 2, programs
% type number 4, etc.
%
% The locations where a float can go are specified by a PLACEMENT
% SPECIFIER, which is a list of the possible locations, each denoted
% by a letter as follows:
% h : here - at the current location in the text.
% t : top - at the top of a text page.
% b : bottom - at the bottom of a text page.
% p : page - on a separate float page.
% For example, 'pht' specifies that the float can appear in any of three
% locations: page, here or top.
%
% Where floats may appear on a page, and how many may appear there
% are specified by the following float placement parameters. The
% numbers are named like counters so the user can set them with
% the ordinary counter-setting commands.
%
% \c@topnumber : Number of floats allowed at the top of a column.
% \topfraction : Fraction of column that can be devoted to floats.
% \c@dbltopnumber, \dbltopfraction : Same as above, but for double-column
% floats.
% \c@bottomnumber, \bottomfraction : Same as above for bottom of page.
% \c@totalnumber : Number of floats allowed in a single column,
% including in-text floats.
% \textfraction : Minimum fraction of column that must contain text.
% \floatpagefraction : Minimum fraction of page that must be taken
% up by float page.
% \dblfloatpagefraction : Same as above, for double-column floats.
%
% The document style must define the following.
%
% \fps@TYPE : The default placement specifier for floats of type TYPE.
%
% \ftype@TYPE : The type number for floats of type TYPE.
%
% \ext@TYPE : The file extension indicating the file on which the
% contents list for float type TYPE is stored. For example,
% \ext@figure = 'lof'.
%
% \fnum@TYPE : A macro to generate the figure number for a caption.
% For example, \fnum@TYPE == Figure \thefigure.
%
% \@makecaption{NUM}{TEXT} : A macro to make a caption, with NUM the value
% produced by \fnum@... and TEXT the text of the caption.
% It can assume it's in a \parbox of the appropriate width.
%
% \@float{TYPE}[PLACEMENT] : This macro begins a float environment for a
% single-column float of type TYPE with PLACEMENT as the placement
% specifier. The default value of PLACEMENT is defined by \fps@TYPE.
% The environment is ended by \end@float.
% E.g., \figure == \@float{figure}, \endfigure == \end@float.
%
% \caption ==
% BEGIN
% \refstepcounter{\@captype}
% \@dblarg{\@caption{\@captype}}
% END
%
%% In following definition, \par moved from after \addcontentsline to
%% before \addcontentsline because the \write could cause
%% an extra blank line to be added to the paragraph above the
%% caption. (Change made 12 Jun 87)
%
% \@caption{TYPE}[STEXT]{TEXT} ==
% BEGIN
% \par
% \addcontentsline{\ext@TYPE}{TYPE}{\numberline{\theTYPE}{STEXT}}
% \begingroup
% \@parboxrestore
% \normalsize
% \@makecaption{\fnum@TYPE}{TEXT}
% \par
% \endgroup
% END
%
% \@float{TYPE}[PLACEMENT] ==
% BEGIN
% if hmode then \@bsphack
% \@floatpenalty := -10002
% else \@floatpenalty := -10003
% fi
% \@captype ==L TYPE
% if inner
% then LaTeX Error: 'Not in outer paragraph mode.'
% \@floatpenalty := 0
% else if \@freelist nonempty
% then \@currbox :=L head of \@freelist
% \@freelist :=G tail of \@freelist
% \count\@currbox :=G 32*\ftype@TYPE + 16 +
% bits determined by PLACEMENT
% else \@floatpenalty := 0
% LaTeX Error: 'Too many unprocessed floats'
% fi
% fi
% \@currbox :=G \vbox{ %% 15 Dec 87 -- removed \boxmaxdepth :=L 0pt
% %% that made box zero depth because it screwed
% %% things up. Instead, added \vskip 0pt at end
% \hsize = \columnwidth
% \@parboxrestore
% END
%
% \end@float ==
% BEGIN
% \vskip 0pt %% makes 0 depth box -- added 15 Dec 87
% }
% if \@floatpenalty < 0
% then add \@currbox to \@currlist
% if \ht\@currbox > \textheight
% then \ht\@currbox :=G \textheight fi
% if \@floatpenalty < -10002
% then \penalty -10004
% \vbox{}
% \penalty \@floatpenalty
% else \vadjust{\penalty -10004
% \vbox{}
% \penalty \@floatpenalty}
% \@esphack
% fi fi
% END
%
% \@dblfloat{TYPE}[PLACEMENT] : Macro to begin a float environment for a
% double-column float of type TYPE with PLACEMENT as the placement
% specifier. The default value of PLACEMENT is 'tp'
% The environment is ended by \end@dblfloat.
% E.g., \figure* == \@dblfloat{figure}, \endfigure* == \end@dblfloat.
%
% \@dblfloat{TYPE}[PLACEMENT] ==
% Identical to \@float{TYPE}[PLACEMENT] except \hsize and \linewidth
% are set to \textwidth.
%
% \end@dblfloat ==
% BEGIN %%% { BRACE MATCHING
% \vskip 0pt %% makes 0 depth box -- added 15 Dec 87
% }
% if \@floatpenalty < 0
% then \@dbldeferlist :=G \@dbldeferlist * \@currbox
% fi
% if \@floatpenalty = -10002 then \@esphack fi
% END
%
\newcount\@floatpenalty

\def\caption{\refstepcounter\@captype \@dblarg{\@caption\@captype}}


\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname
ext@#1\endcsname}{#1}{\protect\numberline{\csname
the#1\endcsname}{\ignorespaces #2}}\begingroup
\@parboxrestore
\normalsize
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\endgroup}

\def\@float#1{\@ifnextchar[{\@xfloat{#1}}{\edef\@tempa{\noexpand\@xfloat
{#1}[\csname fps@#1\endcsname]}\@tempa}}

\def\@xfloat#1[#2]{\ifhmode \@bsphack\@floatpenalty -\@Mii\else
\@floatpenalty-\@Miii\fi\def\@captype{#1}\ifinner
\@parmoderr\@floatpenalty\z@
\else\@next\@currbox\@freelist{\@tempcnta\csname ftype@#1\endcsname
\multiply\@tempcnta\@xxxii\advance\@tempcnta\sixt@@n
\@tfor \@tempa :=#2\do
{\if\@tempa h\advance\@tempcnta \@ne\fi
\if\@tempa t\advance\@tempcnta \tw@\fi
\if\@tempa b\advance\@tempcnta 4\relax\fi
\if\@tempa p\advance\@tempcnta 8\relax\fi
}\global\count\@currbox\@tempcnta}\@fltovf\fi
\global\setbox\@currbox\vbox\bgroup
% \boxmaxdepth\z@ % commented out 15 Dec 87
\hsize\columnwidth \@parboxrestore}

\def\end@float{\par\vskip\z@\egroup %% \par\vskip\z@ added 15 Dec 87
\ifnum\@floatpenalty <\z@
\@cons\@currlist\@currbox
\ifdim \ht\@currbox >\textheight
%% RmS 91/11/06 added warning message
% perhaps we should use an error message
\@warning{Float larger than \string\textheight}%
\ht\@currbox\textheight \fi
\ifnum\@floatpenalty <-\@Mii
\penalty -\@Miv
\@tempdima\prevdepth %% saving and restoring \prevdepth added
\vbox{}% %% 26 May 87 to prevent extra vertical
\prevdepth \@tempdima %% space when used in vertical mode
\penalty\@floatpenalty
\else \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@esphack
\fi\fi}


\def\@dblfloat{\if@twocolumn\let\@tempa\@dbflt\else\let\@tempa\@float\fi
\@tempa}

\def\@dbflt#1{\@ifnextchar[{\@xdblfloat{#1}}{\@xdblfloat{#1}[tp]}}

\def\@xdblfloat#1[#2]{\@xfloat{#1}[#2]\hsize\textwidth\linewidth\textwidth}

\def\end@dblfloat{\if@twocolumn
\par\vskip\z@\egroup %% \par\vskip\z@ added 15 Dec 87\egroup
\ifnum\@floatpenalty <\z@
% make sure that we never exceed \textheight, otherwise float
% will never get typeset =91/03/15 FMi=
\ifdim\ht\@currbox >\textheight
% perhaps we should use an error message
\@warning{Float larger than \string\textheight}%
\ht\@currbox\textheight \fi
\@cons\@dbldeferlist\@currbox\fi
\ifnum \@floatpenalty =-\@Mii \@esphack\fi\else\end@float\fi}

\newcount\c@topnumber
\newcount\c@dbltopnumber
\newcount\c@bottomnumber
\newcount\c@totalnumber

\def\@floatplacement{\global\@topnum\c@topnumber
\global\@toproom \topfraction\@colht
\global\@botnum \c@bottomnumber
\global\@botroom \bottomfraction\@colht
\global\@colnum \c@totalnumber
\@fpmin \floatpagefraction\@colht}

\def\@dblfloatplacement{\global\@dbltopnum\c@dbltopnumber
\global\@dbltoproom \dbltopfraction\@colht
\@fpmin \dblfloatpagefraction\textheight
\@fptop \@dblfptop
\@fpsep \@dblfpsep
\@fpbot \@dblfpbot}

% MARGINAL NOTES:
%
% Marginal notes use the same mechanism as floats to communicate
% with the \output routine. Marginal notes are distinguished from
% floats by having a negative placement specification. The command
% \marginpar [LTEXT]{RTEXT} generates a marginal note in a parbox,
% using LTEXT if it's on the left and RTEXT if it's on the right.
% (Default is RTEXT = LTEXT.) It uses the following parameters.
%
% \marginparwidth : Width of marginal notes.
% \marginparsep : Distance between marginal note and text.
% the page layout to determine how to move the marginal
% note into the margin. E.g., \@leftmarginskip ==
% \hskip -\marginparwidth \hskip -\marginparsep .
% \marginparpush : Minimum vertical separation between \marginpar's
%
% Marginal notes are normally put on the outside of the page
% if @mparswitch = true, and on the right if @mparswitch = false.
% The command \reversemarginpar reverses the side where they
% are put. \normalmarginpar undoes \reversemarginpar.
% These commands have no effect for two-column output.
%
% SURPRISE: if two marginal notes appear on the same line of
% text, then the second one could appear on the next page, in
% a funny position.
%
%
% \marginpar [LTEXT]{RTEXT} ==
% BEGIN
% if hmode then \@bsphack
% \@floatpenalty := -10002
% else \@floatpenalty := -10003
% fi
% if inner
% then LaTeX Error: 'Not in outer paragraph mode.'
% \@floatpenalty := 0
% else if \@freelist has two elements:
% then get \@marbox, \@currbox from \@freelist
% \count\@marbox :=G -1
% else \@floatpenalty := 0
% LaTeX Error: 'Too many unprocessed floats'
% \@currbox, \@marbox := \@tempboxa %%use \def
% fi
% fi
% if optional argument
% then %% \@xmpar ==
% \@savemarbox\@marbox{LTEXT}
% \@savemarbox\@currbox{RTEXT}
% else %% \@ympar ==
% \@savemarbox\@marbox{RTEXT}
% \box\@currbox :=G \box\@marbox
% fi
% %% \@xympar ==
% if \@floatpenalty < 0 then add \@marbox to \@currlist fi
% \setbox\@tempboxa =L %% added 3 Jan 88 to correct bug introduced
% { \end@float %%%% BRACE MATCHING} %% by 15 Dec 87 change
% END
%
% \@savemarbox\BOX{TEXT} ==
% BEGIN
% \BOX :=G \vtop{ \hsize = \marginparwidth
% \@parboxrestore
% TEXT
% }
% END
%
% \reversemarginpar == BEGIN \@mparbottom :=G 0
% @reversemargin :=G true
% END
%
% \normalmarginpar == BEGIN \@mparbottom :=G 0
% @reversemargin :=G false
% END
%

\def\marginpar{\ifhmode \@bsphack\@floatpenalty -\@Mii\else
\@floatpenalty-\@Miii\fi\ifinner
\@parmoderr\@floatpenalty\z@
\else\@next\@currbox\@freelist{}{}\@next\@marbox\@freelist{\global
\count\@marbox\m@ne}{\@floatpenalty\z@ \@fltovf\def\@currbox{\@tempboxa
}\def\@marbox{\@tempboxa}}\fi
\@ifnextchar [{\@xmpar}{\@ympar}}

\long\def\@xmpar[#1]#2{\@savemarbox\@marbox{#1}\@savemarbox\@currbox
{#2}\@xympar}

\long\def\@ympar#1{\@savemarbox\@marbox{#1}\global\setbox\@currbox
\copy\@marbox\@xympar}

\long\def\@savemarbox#1#2{\global\setbox#1\vtop{\hsize\marginparwidth
\@parboxrestore #2}}

\def\@xympar{\ifnum\@floatpenalty <\z@\@cons\@currlist\@marbox\fi
\setbox\@tempboxa\vbox %% added 3 Jan 88
\bgroup\end@float\@esphack}

\def\reversemarginpar{\global\@mparbottom\z@ \@reversemargintrue}
\def\normalmarginpar{\global\@mparbottom\z@ \@reversemarginfalse}


\message{footnotes,}
% ****************************************
% * FOOTNOTES *
% ****************************************
%
% \footnote{NOTE} : User command to insert a footnote.
%
% \footnote[NUM]{NOTE} : User command to insert a footnote numbered
% NUM, where NUM is a number -- 1, 2,
% etc. For example, if footnotes are numbered
% *, **, etc. within pages, then \footnote[2]{...}
% produces footnote '**'. This command does not
% step the footnote counter.
%
% \footnotemark[NUM] : Command to produce just the footnote mark in
% the text, but no footnote. With no argument,
% it steps the footnote counter before generating
% the mark.
%
% \footnotetext[NUM]{TEXT} : Command to produce the footnote but no
% mark. \footnote is equivalent to
% \footnotemark \footnotetext .
%
% As in PLAIN, footnotes use \insert\footins, and the following parameters:
%
% \footnotesize : Size-changing command for footnotes.
%
% \footnotesep : The height of a strut placed at the beginning of
% every footnote.
% \skip\footins : Space between main text and footnotes. The rule
% separating footnotes from text occurs in this space.
% This space lies above the strut of height \footnotesep
% which is at the beginning of the first footnote.
% \footnoterule : Macro to draw the rule separating footnotes from text.
% It is executed right after a \vspace of \skip\footins.
% It should take zero vertical space--i.e., it should to
% a negative skip to compensate for any positive space
% it occupies. (See PLAIN.TEX.)
%
% \interfootnotelinepenalty : Interline penalty for footnotes.
%
% \thefootnote : In usual LaTeX style, produces the footnote number.
% If footnotes are to be numbered within pages, then the
% document style file must include an \@addtoreset command
% to cause the footnote counter to be reset when the page
% counter is stepped. This is not a good idea, though,
% because the counter will not always be reset in time
% to ensure that the first footnote on a page is footnote
% number one.
%
% \@thefnmark : Holds the current footnote's mark--e.g., \dag or '1' or 'a'.
%
% \@mpfnnumber : A macro that generates the numbers for \footnote
% and \footnotemark commands. It == \thefootnote
% outside a minipage environment, but can be changed
% inside to generate numbers for \footnote's.
%
% \@makefnmark : A macro to generate the footnote marker from \@thefnmark
% The default definition is \hbox{$^\@thefnmark$}.
%
% \@makefntext{NOTE} :
% Must produce the actual footnote, using \@thefnmark as the mark
% of the footnote and NOTE as the text. It is called when effectively
% inside a \parbox, with \hsize = \columnwidth. For example, it might
% be as simple as
% $^{\@thefnmark}$ NOTE
%
% In a minipage environment, \footnote and \footnotetext are redefined
% so that
% (a) they use the counter mpfootnote
% (b) the footnotes they produce go at the bottom of the minipage.
% The switch is accomplished by letting \@mpfn == footnote or mpfootnote
% and \thempfn == \thefootnote or \thempfootnote, and by redefining
% \@footnotetext to be \@mpfootnotetext in the minipage.
%
% \footnote{NOTE} ==
% BEGIN
% \stepcounter{\@mpfn}
% \@thefnmark :=G eval (\thempfn)
% \@footnotemark
% \@footnotetext{NOTE}
% END
%
% \footnote[NUM]{NOTE} ==
% BEGIN
% begingroup
% counter \@mpfn :=L NUM
% \@thefnmark :=G eval (\thempfn)
% endgroup
% \@footnotemark
% \@footnotetext{NOTE}
% END
%
% \@footnotetext{NOTE} ==
% BEGIN
% \insert into \footins
% {\footnotesize
% \interlinepenalty :=L \interfootnotelinepenalty
% \splittopskip :=L \footnotesep
% \splitmaxdepth :=L \dp\strutbox
% \floatingpenalty :=L 20000
% \hsize :=L \columnwidth
% \@parboxrestore
% set \@currentlabel to make \label command work right
% \@makefntext{\rule{0pt}{\footnotesep} NOTE}
% }
% END
%
% \footnotemark ==
% BEGIN \stepcounter{footnote}
% \@thefnmark :=G eval(\thefootnote)
% \@footnotemark
% END
%
% \footnotemark[NUM] ==
% BEGIN
% begingroup
% footnote counter :=L NUM
% \@thefnmark :=G eval(\thefootnote)
% endgroup
% \@footnotemark
% END
%
% \@footnotemark ==
% BEGIN
% \leavevmode
% IF hmode THEN \@x@sf := \the\spacefactor FI
% \@makefnmark % put number in main text
% IF hmode THEN \spacefactor := \@x@sf FI
% END
%
% \footnotetext ==
% BEGIN \@thefnmark :=G eval (\thempfn)
% \@footnotetext
% END
%
% \footnotetext[NUM] ==
% BEGIN begingroup counter \@mpfn :=L NUM
% \@thefnmark :=G eval (\thempfn)
% endgroup
% \@footnotetext
% END
%

\@definecounter{footnote}
\def\thefootnote{\arabic{footnote}}

\@definecounter{mpfootnote}
\def\thempfootnote{\alph{mpfootnote}}

% Default definition
\def\@makefnmark{\hbox{$^{\@thefnmark}\m@th$}}

\newdimen\footnotesep

%% RmS 91/11/01: Added \let\protect\noexpand in \footnote, \footnotemark,
%% and \footnotetext, since \xdef is used.
%% RmS 91/11/22: Added \let\protect\noexpand in \@xfootnote, \@xfootnotemark,
%% and \@xfootnotetext.

\def\footnote{\@ifnextchar[{\@xfootnote}{\stepcounter{\@mpfn}%
\begingroup\let\protect\noexpand
\xdef\@thefnmark{\thempfn}\endgroup
\@footnotemark\@footnotetext}}

\def\@xfootnote[#1]{\begingroup \csname c@\@mpfn\endcsname #1\relax
\let\protect\noexpand
\xdef\@thefnmark{\thempfn}\endgroup
\@footnotemark\@footnotetext}

%% RmS 91/09/29: added \reset@font
\long\def\@footnotetext#1{\insert\footins{\reset@font\footnotesize
\interlinepenalty\interfootnotelinepenalty
\splittopskip\footnotesep
\splitmaxdepth \dp\strutbox \floatingpenalty \@MM
\hsize\columnwidth \@parboxrestore
\edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
{\rule{\z@}{\footnotesep}\ignorespaces
#1\strut}}}

\def\footnotemark{\@ifnextchar[{\@xfootnotemark}{\stepcounter{footnote}%
\begingroup\let\protect\noexpand
\xdef\@thefnmark{\thefootnote}\endgroup
\@footnotemark}}

\def\@xfootnotemark[#1]{\begingroup \c@footnote #1\relax
\let\protect\noexpand
\xdef\@thefnmark{\thefootnote}\endgroup \@footnotemark}

\def\@footnotemark{\leavevmode\ifhmode
\edef\@x@sf{\the\spacefactor}\fi \@makefnmark
\ifhmode\spacefactor\@x@sf\fi\relax}

\def\footnotetext{\@ifnextchar [{\@xfootnotenext}%
{\begingroup\let\protect\noexpand
\xdef\@thefnmark{\thempfn}\endgroup
\@footnotetext}}

\def\@xfootnotenext[#1]{\begingroup \csname c@\@mpfn\endcsname #1\relax
\let\protect\noexpand
\xdef\@thefnmark{\thempfn}\endgroup \@footnotetext}

\def\@mpfn{footnote}
\def\thempfn{\thefootnote}

\message{initial,}
% ****************************************
% * INITIAL DECLARATION COMMANDS *
% ****************************************
%
% DOCUMENT STYLE
% --------------
%
% The user starts his file with the command
% \documentstyle [OPTION1, ... ,OPTIONk]{STYLE}
% which saves the OPTION's and \input's the file STYLE.STY. When the
% STYLE.STY file issues the command \@options, the following happens
% for each i :
% IF \ds@OPTIONi is defined
% THEN execute \ds@OPTIONi
% ELSE save OPTIONi on a list of unprocessed options.
% FI
% After STYLE.STY has been executed, the file OPTIONi.STY is read for
% each OPTIONi on the list of unprocessed options.
%
% \documentstyle ==
% BEGIN
% IF next char = [
% THEN \@documentstyle
% ELSE \@documentstyle[]
% FI
% END
%
% \@documentstyle[OPTIONS]{STYLE} ==
% BEGIN
% \makeatletter
% \@optionlist := OPTIONS
% \@optionfiles :=G null
% \input STYLE.STY
% \@elt == \input
% \@optionfiles
% \@elt == \relax
% \makeatother
% END
%
% \@options ==
% BEGIN
% \@elt := \relax
% FOR \@tempa := \@optionlist
% DO IF \ds@[eval(\@tempa)] defined
% THEN \ds@[eval(\@tempa)]
% ELSE \@optionfiles :=G \@optionfiles *
% \@elt eval(\@tempa) \relax
% OD FI
% END
%
% PAGE STYLE COMMANDS
% -------------------
% \pagestyle{STYLE} : sets the page style of the current and succeeding
% pages to STYLE
%
% \thispagestyle{STYLE} : sets the page style of the current page only
% to STYLE
%
% To define a page style STYLE, you must define \ps@STYLE to set the page
% style parameters.
%
% HOW A PAGE STYLE MAKES RUNNING HEADS AND FEET:
%
% The \ps@... command defines the macros \@oddhead, \@oddfoot,
% \@evenhead, and \@evenfoot to define the running heads and feet.
% (See output routine.) To make headings determined by the sectioning
% commands, the page style defines the commands \chaptermark,
% \sectionmark, etc., where \chaptermark{TEXT} is called by \chapter to
% set a mark. The \...mark commands and the \...head macros are defined
% with the help of the following macros. (All the \...mark commands
% should be initialized to no-ops.)
%
% MARKING CONVENTIONS:
% LaTeX extends TeX's \mark facility by producing two kinds of marks
% a 'left' and a 'right' mark, using the following commands:
% \markboth{LEFT}{RIGHT} : Adds both marks.
% \markright{RIGHT} : Adds a 'right' mark.
% \leftmark : Used in the output routine, gets the current 'left' mark.
% Works like TeX's \botmark.
% \rightmark : Used in the output routine, gets the current 'right' mark.
% Works like TeX's \firstmark.
% The marking commands work reasonably well for right marks 'numbered
% within' left marks--e.g., the left mark is changed by a \chapter command and
% the right mark is changed by a \section command. However, it does
% produce somewhat anomalous results if 2 \markboth's occur on the same page.
%
% Commands like \tableofcontents that should set the marks in some page styles
% use a \@mkboth command, which is \let by the pagestyle command (\ps@...)
% to \markboth for setting the heading or to \@gobbletwo to do nothing.

\def\documentstyle{\@ifnextchar[{\@documentstyle}{\@documentstyle[]}}

\def\@documentstyle[#1]#2{\makeatletter
\def\@optionlist{#1}\gdef\@optionfiles{}\input #2.sty\relax
\let\@elt\input \@optionfiles \let\@elt\relax \makeatother}

\def\@options{\let\@elt\relax
\@for\@tempa:=\@optionlist\do
{\@ifundefined{ds@\@tempa}{\xdef\@optionfiles{\@optionfiles
\@elt \@tempa.sty\relax}}{\csname ds@\@tempa\endcsname}}}

\def\pagestyle#1{\@nameuse{ps@#1}}
\def\thispagestyle#1{\global\@specialpagetrue\gdef\@specialstyle{#1}}

% \head : An obsolete command that was used in the `myheadings'
% page style. (Removed 14 Jun 85)
% \def\head{\@ifnextchar[{\@xhead}{\@yhead}}
% \def\@xhead[#1]#2{\if #1l \def\@lhead{#2}\else \def\@rhead{#2}\fi}
% \def\@yhead#1{\def\@lhead{#1}\def\@rhead{#1}}

% Initialization
%
%\def\@lhead{} %% RmS 91/09/29: removed since no longer used
%\def\@rhead{} %% ditto


% Default Initializations
%
\def\ps@empty{\let\@mkboth\@gobbletwo\let\@oddhead\@empty\let\@oddfoot\@empty
\let\@evenhead\@empty\let\@evenfoot\@empty}

\def\ps@plain{\let\@mkboth\@gobbletwo
\let\@oddhead\@empty\def\@oddfoot{\reset@font\rm\hfil\thepage
\hfil}\let\@evenhead\@empty\let\@evenfoot\@oddfoot}

\def\@leftmark#1#2{#1}
\def\@rightmark#1#2{#2}

%% test for @nobreak added 15 Apr 86 in \markboth and \markright
%% letting \label and \index to \relax added 22 Feb 86 so these
%% commands can appear in sectioning command arguments
%% RmS 91/06/21 Same for \glossary
%%

\def\markboth#1#2{\gdef\@themark{{#1}{#2}}{\let\protect\noexpand
\let\label\relax \let\index\relax \let\glossary\relax
\mark{\@themark}}\if@nobreak\ifvmode\nobreak\fi\fi}
\def\markright#1{{\let\protect\noexpand
\let\label\relax \let\index\relax \let\glossary\relax
\expandafter\@markright\@themark
{#1}\mark{\@themark}}\if@nobreak\ifvmode\nobreak\fi\fi}

\def\@markright#1#2#3{\gdef\@themark{{#1}{#3}}}
\def\leftmark{\expandafter\@leftmark\botmark}
\def\rightmark{\expandafter\@rightmark\firstmark}

% Initialization
%
\def\@themark{{}{}}


% OTHER
% -----
%
% \raggedbottom : Typesets pages with no vertical stretch, so they have
% their natural height instead of all being exactly the
% same height. (Uses a space of .0001fil to avoid
% interfering with the 1fil space of \newpage.)
%
% \flushbottom : Inverse of \raggedbottom - makes all pages the same
% height.
%
% \sloppy : Resets TeX's parameters so it accepts worse line and page
% breaks, and slightly more overfull boxes.
%
% \fussy : Resets TeX's parameters to their normal finnicky values.
%

\def\raggedbottom{\def\@textbottom{\vskip \z@ plus.0001fil}\let\@texttop\relax}
\def\flushbottom{\let\@textbottom\relax \let\@texttop\relax}

% Default definitions
% \sloppy will never (well, hardly ever) produce overfull boxes, but may
% produce underfull ones. (14 June 85)
% A sloppypar environment is equivalent to {\par \sloppy ... \par}.
\def\sloppy{\tolerance \@M \hfuzz .5\p@ \vfuzz .5\p@}
\def\sloppypar{\par\sloppy}
\def\endsloppypar{\par}
\def\fussy{\tolerance 200 \hfuzz .1\p@ \vfuzz .1\p@}



% LaTeX default is no overfull box rule. Changed by document
% style option

\overfullrule 0pt

\message{output,}
% ****************************************
% * OUTPUT *
% ****************************************
%
%
% PAGE LAYOUT PARAMETERS
%
% \topmargin : Extra space added to top of page.
% @twoside : boolean. T if two-sided printing
% \oddsidemargin : IF @twoside = T
% THEN extra space added to left of odd-numbered
% pages.
% ELSE extra space added to left of all pages.
% \evensidemargin : IF @twoside = T
% THEN extra space added to left of even-numbered
% pages.
% \headheight : height of head
% \headsep : separation between head and text
% \footskip : distance separation between baseline of last
% line of text and baseline of foot.
% Note difference between \footSKIP and \headSEP.
% \textheight : height of text on page, excluding head and foot
% \textwidth : width of printing on page
% \columnsep : IF @twocolumn = T
% THEN width of space between columns
% \columnseprule : IF @twocolumn = T
% THEN width of rule between columns (0 if none).
% \columnwidth : IF @twocolumn = T
% THEN (\textwidth - \columnsep)/2
% ELSE \textwidth
% It is set by the \@maketwocolumn and \@makeonecolumn
% commands.
% \@textbottom : Command executed at bottom of vbox holding text of page
% (including figures). The \raggedbottom command
% almost \let's this to \vfil (actually sets it to
% \vskip \z@ plus.0001fil). %expanded 18 Jun 86
%
% \@texttop : Command executed at top of vbox holding text of page
% (including figures). Used by letter style; can also
% be used to produce centered pages. Is \let to \relax
% by \raggedbottom and \flushbottom.
%
% Page layout must also initialize \@colht and \@colroom to \textheight.
%
% PAGE STYLE PARAMETERS:
%
% \floatsep : Space left between floats.
% \textfloatsep : Space between last top float or first bottom float
% and the text.
% \topfigrule : Command to place rule (or whatever) between floats
% at top of page and text. Executed in inner vertical
% mode right before the \textfloatsep skip separating
% the floats from the text. Must occupy zero vertical
% space. (See \footnoterule.)
% \botfigrule : Same as \topfigrule, but put after the \textfloatsep
% skip separating text from the floats at bottom of page.
% \intextsep : Space left on top and bottom of an in-text float.
% \@maxsep : The maximum of \floatsep, \textfloatsep and \intextsep
% \dblfloatsep : Space between double-column floats.
% \dbltextfloatsep : Space between top or bottom double-column floats
% and text.
% \dblfigrule : Similar to \topfigrule, but for double-column floats.
% \@dblmaxsep : The maximum of \dblfloatsep and \dbltexfloatsep
% \@fptop : Glue to go at top of float column -- must be 0pt +
% stretch
% \@fpsep : Glue to go between floats in a float column.
% \@fpbot : Glue to go at bottom of float column -- must be 0pt +
% stretch
% \@dblfptop, \@dblfpsep, \@dblfpbot
% : Analogous for double-column float page in two-column
% format.
%
% FOOTNOTES: As in PLAIN, footnotes use \insert\footins.
%
% PAGE LAYOUT SWITCHES AND MACROS
%
% @twocolumn : Boolean. T if two columns per page.
%
% PAGE STYLE MACROS AND SWITCHES
%
% \@oddhead : IF @twoside = T
% THEN macro to generate head of odd-numbered pages.
% ELSE macro to generate head of all pages.
% \@evenhead : IF @twoside = T
% THEN macro to generate head of even-numbered pages.
% \@oddfoot : IF @twoside = T
% THEN macro to generate foot of odd-numbered pages.
% ELSE macro to generate foot of all pages.
% \@evenfoot : IF @twoside = T
% THEN macro to generate foot of even-numbered pages.
% @specialpage : boolean. T if current page is to have a special format.
% \@specialstyle : If its value is foo then
% IF @specialpage = T
% THEN the command \ps@foo is executed to temporarily
% reset the page style parameters before composing
% the current page. This command should execute
% only \def's and \edef's, making only local
% definitions.
%
%
% FLOAT PLACEMENT PARAMETERS
%
% The following parameters are set by the macro \@floatplacement.
% When \@floatplacement is called,
% \@colht is the height of the page or column being built. I.e.:
% * For single-column page it equals \textheight.
% * For double-column page it equals \textheight - height
% of double-column floats on page.
% Note that some are set globally and some locally:
% \@topnum :=G Maximum number of floats allowed on the top of a column.
% \@toproom :=G Maximum amount of top of column devoted to floats--
% excluding \textfloatsep separation below the floats and
% \floatsep separation between them. For two-column
% output, should be computed as a function of \@colht.
% \@botnum, \@botroom
% : Analogous to above.
% \@colnum :=G Maximum number of floats allowed in a column, including
% in-text floats.
% \@textmin :=L Minimum amount of text (excluding footnotes) that must
% appear on a text page. %% 27 Sep 85 : made local to
% %% \@addtocurcol and \@addtonextcol
% \@fpmin :=L Minimum height of floats in a float column.
%
% The macro \@dblfloatplacement sets the following parameters.
% \@dbltopnum :=G Maximum number of double-column floats allowed at the
% top of a two-column page.
% \@dbltoproom :=G Maximum height of double-column floats allowed at
% top of two-column page.
% \@fpmin :=L Minimum height of floats in a float column.
% It should also perform the following local assignments where necessary
% -- i.e., where the new value differs from the old one:
% \@fptop :=L \@dblfptop
% \@fpsep :=L \@dblfpsep
% \@fpbot :=L \@dblfpbot
%
% OUTPUT ROUTINE VARIABLES
%
% \@colht : The total height of the current column. In single column
% style, it equals \textheight. In two-column style, it is
% \textheight minus the height of the double-column floats
% on the current page. MUST BE INITIALIZED TO \textheight.
%
% \@colroom : The height available in the current column for text and
% footnotes. It equals \@colht minus the height of all
% floats committed to the top and bottom of the current
% column.
%
% \footins : Footnote insertion number.
%
% \@maxdepth : Saved value of TeX's \maxdepth. Must be set
% when any routine sets \maxdepth.
%
% CALLING THE OUTPUT ROUTINE
% --------------------------
%
% The output routine is called either by TeX's normal page-breaking
% mechanism, or by a macro putting a penalty < or = -10000 in the output
% list. In the latter case, the penalty indicates why the output
% routine was called, using the following code.
%
% penalty reason
% ------- ------
% -10000 \pagebreak
% \newpage
% -10001 \clearpage (called with \penalty -10000 \vbox{} \penalty -10001
% -10002 float insertion, called from horizontal mode
% -10003 float insertion, called from vertical mode.
% -10004 float insertion.
%
% Note: A float or marginpar puts the following sequence in the output
% list: (i) a penalty of -10004,
% (ii) a null \vbox
% (iii) a penalty of -10002 or -10003.
% This solves two special problems:
% 1. If the float comes right after a \newpage or \clearpage,
% then the first penalty is ignored, but the second one
% invokes the output routine.
% 2. If there is a split footnote on the page, the second 'page'
% puts out the rest of the footnote.
%
% THE OUTPUT ROUTINE
% ------------------
%
% FUNCTIONS USED IN THE OUTPUT ROUTINE:
%
% \@outputpage : Produces an output page with the contents of box
% \@outputbox as the text part. Also sets
% \@colht :=G \textheight. The page style is determined
% as follows.
% IF @thispagestyle = true
% THEN use \thispagestyle style
% ELSE use ordinary page style.
%
% \@tryfcolumn\FLIST : Tries to form a float column composed of floats from
% \FLIST with with the following parameters:
% \@colht : height of box
% \@fpmin : minimum height of floats in the box
% \@fpsep : interfloat space
% \@fptop : glue at top of box
% \@fpbot : glue at bottom of box.
% If it succeeds, then it does the following:
% * \@outputbox :=L the composed float box.
% * @fcolmade :=L true
% * \FLIST :=G \FLIST - floats put in box
% * \@freelist :=G \@freelist + floats put in box
% If it fails, then:
% * @fcolmade :=L false
% NOTE: BIT MUST BE A SINGLE TOKEN!
%
% \@makefcolumn \FLIST : Same as \@tryfcolumn except that it
% fails to make a float column only if \FLIST is empty.
% Otherwise, it makes a float column containing at least
% the first box in \FLIST, disregarding \@fpmin.
%
% \@startcolumn :
% Calls \@tryfcolumn\@deferlist{8}. If \@tryfcolumn returns with
% @fcolmade = false, then:
% * Globally sets \@toplist and \@botlist to floats
% from \@deferlist to go at top and bottom of column,
% deleting them from \@deferlist. It does
% this using \@colht as the total height, the page
% style parameters \@floatsep and \@textfloatsep, and
% the float placement parameters \@topnum, \@toproom,
% \@botnum, \@botroom, \@colnum and \textfraction.
% * Globally sets \@colroom to \@colht minus the height
% of the added floats.
%
% \@startdblcolumn :
% Calls \@tryfcolumn\@dbldeferlist{8}. If \@tryfcolumn returns
% with @fcolmade = false, then:
% * Globally sets \@dbltoplist to floats from \@dbldeferlist
% to go at top and bottom of column, deleting them from
% \@dbldeferlist. It does this using \textheight as the
% total height, and the parameters \@dblfloatsep, etc.
% * Globally sets \@colht to \textheight minus the height
% of the added floats.
%
% \@combinefloats : Combines the text from box
% \@outputbox with the floats from \@toplist and \@botlist,
% putting the new box in \@outputbox. It uses \floatsep and
% \textfloatsep for the appropriate separations. It puts the
% elements of \TOPLIST and \BOTLIST onto \@freelist, and makes
% those lists null.
%
% \@makecol : Makes the contents of \box255 plus the accumulated
% footnotes, plus the floats in \@toplist and \@botlist,
% into a single column of height \@colht, which it puts
% into box \@outputbox. It puts boxes in \@midlist back
% onto \@freelist and restores \maxdepth.
%
% \@opcol : Outputs a column whose text is in box \@outputbox
% If @twocolumn = false, then it calls \@outputpage,
% sets \@colht :=G \textheight, and calls \@floatplacement.
%
% If @twocolumn = true, then:
% If @firstcolumn = true, then it puts box \@outputbox
% into \@leftcolumn and sets @firstcolumn :=G false.
%
% If @firstcolumn = false, then it puts out the current
% two-column page, any possible two-column float pages,
% and determines \@dbltoplist for the next page.
%
% \@opcol ==
% BEGIN
% \@mparbottom :=G 0pt
% if @twocolumn = true
% then %% \@outputdblcol ==
% if @firstcolumn = true
% then @firstcolumn :=G false
% \@leftcolumn :=G \@outputbox
% else @firstcolumn :=G true
% \@outputbox := \vbox{
% \hbox to \textwidth{
% \hbox to\columnwidth{\box\@leftcolumn
% \hss}
% \hfil \vrule width \columnseprule \hfil
% \hbox to\columnwidth{\box\@outputbox}
% \hss} }
% \@combinedblfloats
% \@outputpage
% \begingroup
% \@dblfloatplacement
% \@startdblcolumn
% while @fcolmade = true
% do \@outputpage
% \@startdblcolumn od
% \endgroup
% fi
% else
% \@outputpage
% \@colht :=G \textheight
% fi
% END
%
% \@makecol ==
% BEGIN
% ifvoid \insert\footins
% then \@outputbox := \box255
% else \@outputbox := \vbox {\boxmaxdepth :=L \maxdepth
% %added 21 Jan 87
% \unvbox255
% \vskip \skip\footins
% \footnoterule
% \unvbox\footins
% }
% fi
% \@freelist :=G \@freelist * \@midlist
% \@midlist :=G empty
% \@combinefloats
% \@outputbox := \vbox to \@colht{\boxmaxdepth := \maxdepth
% \@texttop
% temp :=L \dp\@outputbox
% \unvbox\@outputbox
% \vskip -temp
% \@textbottom}
% \maxdepth :=G \@maxdepth
% END
%
% \@outputpage ==
% BEGIN
% \begingroup %%% added 11 Jun 85 to keep special page
% %%% declarations local to this output page
% \catcode`\ := 10 %%make sure space is really a space
% \- := \@dischyph %%% Added 4 Aug 88 in event output routine
% \' := \@acci %%% called inside a tabbing environment.
% \` := \@accii
% \= := \@acciii
% if @specialpage = T
% then @specialpage :=G F
% execute \ps@[eval(\@specialstyle)] fi
% if \@twoside = T
% then if \count0 odd
% \@thehead ==L \@oddhead
% \@thefoot ==L \@oddfoot
% \@themargin ==L \oddsidemargin
% else \@thehead ==L \@evenhead
% \@thefoot ==L \@evenfoot
% \@themargin ==L \evensidemargin fi fi
% \shipout\vbox
% {\normalsize % set fonts size for head and foot
% \baselineskip :=L \lineskip :=L 0pt
% \par :=L \@@par %% added 15 Sep 87 for robustness
% \vskip \topmargin
% \moveright\@themargin\vbox
% { \box\@tempboxa := \vbox to \headheight{\vfil
% \hbox to \textwidth
% {\index == \label ==
% \glossary == \@gobble
% %% Added 22 Feb 87 as bug fix
% %% RmS 91/06/21 \glossary added
% \@thehead}}
% \dp\@tempboxa := 0pt % Don't skip space for descenders in
% \box\@tempboxa % running head.
% \vskip \headsep
% \box\@outputbox
% \baselineskip\footskip
% \hbox to \textwidth{\index == \label == \glossary == \@gobble
% %%% added 22 Feb 87 as bug fix
% %%% RmS 91/06/21 \glossary added
% \@thefoot}
% }
% }
% \@colht :=G \textheight
% \endgroup %% added 11 Jun 85
% \stepcounter{page}
% \firstmark ==L \botmark %% So marks work properly on float
% %% pages. (14 Jun 85)
% END
%
% \@startcolumn ==
% BEGIN
% \@colroom :=G \@colht
% if \@deferlist is empty
% then @fcolmade := false
% else \@tryfcolumn\@deferlist %% else clause == \@xstartcol
% if @fcolmade = false
% then \begingroup
% \@tempb :=L \@deferlist
% \@deferlist :=G empty
% \@elt \BOX == BEGIN \@currbox == \BOX % use \gdef
% \@addtonextcol
% END == \@scolelt
% \@tempb
% \endgroup
% fi fi
% END
%
% \@startdblcolumn ==
% BEGIN
% \@colht :=G \textheight
% \@tryfcolumn\@dbldeferlist %% else clause == \@xstartcol
% if @fcolmade = false
% then \begingroup
% \@tempb :=L \@dbldeferlist
% \@dbldeferlist :=G empty
% \@elt \BOX == BEGIN \@currbox == \BOX % use \gdef
% \@addtodblcol
% END == \@sdblcolelt
% \@tempb
% \endgroup
% fi fi
% END
%
% \output ==
% BEGIN
% case of \outputpenalty
% > -10001 -> \@makecol
% \@opcol
% \@floatplacement
% \@startcolumn
% while @fcolmade = true
% do \@opcol
% \@startcolumn
% od
%
% %%% \@specialoutput ==
%
% -10001 -> %% \@doclearpage ==
% if there are no footnote insertions
% then unbox the \writes at the head of \box255
% and throw away the rest
% \@deferlist :=G \@toplist * \@botlist
% * \@deferlist
% \@toplist :=G \@botlist :=G empty
% \@colroom :=G \@colht
% if \@currlist not empty
% then LaTeX error: float(s) lost
% \@currlist :=G empty
% fi
% \@makefcolumn\@deferlist
% while @fcolmade = true
% do \@opcol
% \@makefcolumn\@deferlist
% od
% if @twocolumn
% then
% if @firstcolumn = true
% then \@dbldeferlist :=G \@dbltoplist *
% \@dbldeferlist
% \@dbltoplist :=G empty
% \@colht :=G \textheight
% \begingroup
% \@dblfloatplacement
% \@makefcolumn\@dbldeferlist
% while @fcolmade = true
% do \@outputpage
% \@makefcolumn\@dbldeferlist
% od
% \endgroup
% else \vbox{} \clearpage
% fi fi
% else \box255 := \vbox{\box255\vfil}
% \@makecol
% \@opcol
% \clearpage
% fi
% < -10001 ->
% if \outputpenalty < -10003
% then if \outputpenalty <-20000 %% true only at end
% then \deadcycles := 0
% fi
% box \@holdpg :=G box255
% else throw away box 255
% \@pagedp :=L natural depth of box \@holdpg
% \@pageht :=L natural ht of box \@holdpg
% \unvbox box \@holdpg %% put text back
% if \@currlist nonempty
% then \@currbox :=L head of \@currlist
% \@currlist :=G tail of \@currlist
% if \count\@currbox > 0
% %% Changed 28 Feb 88 so \@pageht and \@pagedp
% %% aren't changed for a marginal note
% then %% this is a float
% if there are footnote insertions
% then advance \@pageht and \@pagedp and
% reinsert footnotes
% fi
% \@addtocurcol
% else %% this is a marginal note
% if there are footnote insertions
% reinsert footnotes
% fi
% \@addmarginpar
% fi
% else THIS SHOULDN'T HAPPEN
% fi
% if \outputpenalty < 0 %% TO PERMIT PAGE BREAK
% then \penalty\interlinepenalty fi %% IF \@addtocurcol
% %% DIDN'T INSERT A PENALTY
% fi
% end case
% \vsize :=G if \outputpenalty > -10004 then \@colroom %%normal case
% else \maxdimen %%processing float
% fi
% END
%
% \@combinefloats ==
% BEGIN
% if \@toplist nonempty
% then %%\@cfla ==
% \@elt\BOX == BEGIN \@tempbox := \vbox{\unvbox\@tempbox
% \box\BOX
% \vskip \floatsep}
% END == \@comflelt
% \@tempbox := null
% \@toplist
% \@outputbox := \vbox{\boxmaxdepth :=L \maxdepth
% %added 21 Jan 87
% \unvbox\@tempbox
% \vskip - \floatsep
% \topfigrule
% \vskip \textfloatsep
% \unvbox\@outputbox }
% \@elt == \relax
% \@freelist :=G \@freelist * \@toplist
% \@toplist :=G null
% fi
% if \@botlist nonempty
% then %%\@cflb ==
% \@elt == \@comflelt
% \@tempbox := null
% \@botlist
% \@outputbox := \vbox{ \unvbox\@outputbox
% \vskip \textfloatsep
% \botfigrule
% \unvbox\@tempbox
% \vskip - \floatsep }
% \@elt == \relax
% \@freelist :=G \@freelist * \@botlist
% \@botlist :=G null
% fi
% END
%
% \@combinedblfloats ==
% BEGIN
% if \@dbltoplist nonempty
% then \@elt == \@comdblflelt
% \@tempbox := null
% \@dbltoplist
% \@outputbox := \vbox to \textheight
% {\boxmaxdepth :=L \maxdepth
% \unvbox\@tempbox
% \vskip - \dblfloatsep
% \dblfigrule
% \vskip \dbltextfloatsep
% \box\@outputbox }
% \@elt == \relax
% \@freelist :=G \@freelist * \@dbltoplist
% \@dbltoplist :=G null
% fi
% END
%
%
% USER COMMANDS THAT CALL OR AFFECT THE OUTPUT ROUTINE
% ----------------------------------------------------
%
% \newpage == BEGIN \par\vfil\penalty -10000 END
%
% \clearpage == BEGIN \newpage
% \write -1{} % Part of hack to make sure no
% \vbox{} % \write's get lost.
% \penalty -10001
% END
%
% \cleardoublepage == BEGIN \clearpage
% if @twoside = true and c@page is even
% then \hbox{} \newpage fi
% END
%
% \twocolumn ==
% BEGIN
% \clearpage
% \columnwidth :=G .5(\textwidth - \columnsep)
% \hsize :=G \columnwidth
% @twocolumn :=G true
% @firstcolumn :=G true
% \@dblfloatplacement
% END
%
% \onecolumn ==
% BEGIN
% \clearpage
% \columnwidth :=G \textwidth
% \hsize :=G \columnwidth
% @twocolumn :=G false
% \@floatplacement
% END
%
%
% \topnewpage{BOX} : starts a new page and puts BOX in a parbox of width
% \textwidth across the top. Useful for full-width titles for
% double-column pages.
% SURPRISE: The stretch from \@dbltextfloatsep will be inserted
% between the BOX and the top of the two columns.
%
% \topnewpage{BOX} ==
% BEGIN
% \clearpage
% Take \@currbox from \@freelist
% \box\@currbox :=G \parbox{BOX \par
% \vskip - \@dbltextfloatsep}
% \count\@currbox :=G 2
% \@dbltopnum :=G 1
% \@dbltoproom :=G maxdimension
% \@addtodblcol
% \vsize :=G \@colht
% \@colroom :=G \@colht
% END


% FLOAT-HANDLING MECHANISMS
% -------------------------
%
% The float environment obtains an insertion number B from the
% \@freelist (see below for a description of list manipulation), puts
% the float into box B and sets \count B to a FLOAT SPECIFIER. For
% a normal (not double-column) float, it then causes a page break
% in one of the following two ways:
% - In outer hmode: \vadjust{\penalty -10002}
% - In vmode : \penalty -10003.
% For a double-column float, it puts B onto the \@dbldeferlist.
% The float specifier has two components:
% * A PLACEMENT SPECIFICATION, describing where the float may
% be placed.
% * A TYPE, which is a power of two--e.g., figures might be
% type 1 floats, tables type 2 floats, programs type 4 floats, etc.
% The float specifier is encoded as follows, where bit 0 is the least
% significant bit.
%
% Bit Meaning
% --- -------
% 0 1 iff the float may go where it appears in the text.
% 1 1 iff the float may go on the top of a page.
% 2 1 iff the float may go on the bottom of a page.
% 3 1 iff the float may go on a float page.
% 4 always 1
% 5 1 iff a type 1 float
% 6 1 iff a type 2 float
% etc.
%
% A negative float specifier is used to indicate a marginal note.
%
% MACROS AND DATA STRUCTURES FOR PROCESSING FLOATS
% ------------------------------------------------
%
% A FLOAT LIST consisting of the floats in boxes \boxa ... \boxN has the form:
% \@elt \boxa ... \@elt \boxN
% where \boxI is defined by
% \newinsert\boxI
% Normally, \@elt is \let to \relax. A test can be performed on the entire
% float list by locally \def'ing \@elt appropriately and executing
% the list. This is a lot more efficient than looping through the list.
%
% The following macros are used for manipulating float lists.
%
% \@next \CS \LIST {NONEMPTY}{EMPTY} == %% NOTE: ASSUME \@elt = \relax
% BEGIN assume that \LIST == \@elt \B1 ... \@elt \Bn
% if n = 0
% then EMPTY
% else \CS :=L \B1
% \LIST :=G \@elt \B2 ... \@elt \Bn
% NONEMPTY
% fi
% END
%
%
% \@bitor\NUM\LIST : Globally sets switch @test to the disjunction for all I
% of bit log2 \NUM of the float specifiers of all the floats in
% \LIST. I.e., @test is set to true iff there is at least one
% float in \LIST having bit log2 \NUM of its float specifier
% equal to 1.
%
% Note: log2 [(\count I)/32] is the bit number corresponding to the
% type of float I. To see if there is any float in \LIST having
% the same type as float I, you run \@bitor with \NUM = [(\count I)/32] * 32.
%
% \@bitor\NUM\LIST ==
% BEGIN
% @test :=G false
% { \@elt \CTR == if \count\CTR / \NUM is odd
% then @test := true fi
% \LIST
% }
% END
%
%
% \@cons\LIST\NUM : Globally sets \LIST := \LIST * \@elt \NUM
%
% \@cons\LIST\NUM ==
% BEGIN { \@elt == \relax
% \LIST :=G \LIST \@elt \NUM
% }
%
% BOX LISTS FOR FLOAT-PLACEMENT ALGORITHMS
%
% \@freelist : List of empty boxes for placing new floats.
% \@toplist : List of floats to go at top of current column.
% \@midlist : List of floats in middle of current column.
% \@botlist : List of floats to go at bottom of current column.
% \@deferlist : List of floats to go after current column.
% \@dbltoplist : List of double-col. floats to go at top of current page.
% \@dbldeferlist : List of double-column floats to go on subsequent pages.
%
% FLOAT-PLACEMENT ALGORITHMS
%
% \@tryfcolumn \FLIST ==
% BEGIN
% @fcolmade :=G false
% \@trylist :=G \FLIST
% \@failedlist :=G empty
% \begingroup
% \@elt == \@xtryfc
% \@trylist
% \endgroup
% if @fcolmade = true
% then \@vtryfc \FLIST
% fi
% END
%
% \@vtryfc ==
% BEGIN
% \@outputbox :=G \vbox{}
% \@elt\BOX == BEGIN
% \@outputbox :=L \vbox{ \unvbox \@outputbox
% \vskip \@fpsep
% \box\BOX }
% END == \@wtryfc
% \@flsucceed
% \@outputbox :=G \vbox to \@colht{ \vskip \@fptop
% \vskip -\@fpsep
% \unvbox \@outputbox
% \vskip \@fpbot }
% \@elt == \relax
% \@freelist :=G \@freelist * \@flsucceed
% \FLIST :=G \@failedlist * \@flfail
% END
%
% \@xtryfc \BOX ==
% BEGIN
% remove first element from \@trylist
% \@currtype := (\count\BOX / 32) * 32
% \@bitor \@currtype \@failedlist % @test := true if type on list
% \@testfp \BOX % @test := true if no p-option
% if ht of \BOX > \@colht
% then @test :=G true
% fi
% if @test = true
% then add \BOX to \@failedlist
% else \@ytryfc \BOX
% fi
% END
%
% \@ytryfc ==
% BEGIN
% \begingroup
% \@flsucceed :=G \@elt\BOX
% \@flfail :=G empty
% \@tempdima := \ht\BOX
% \@elt == \@ztryfc
% \@trylist
% if \@tempdima > \@fpmin
% then @fcolmade :=G true
% else add \BOX to \@failedlist
% fi
% \endgroup
% if @fcolmade = true then \@elt == \@gobble fi
% END
%
% \@ztryfc \BOX ==
% BEGIN
% \@tempcnta := (\count\BOX / 32) * 32
% \@bitor \@tempcnta {\@failedlist \@flfail} % @test := true if on a list
% \@testfp \BOX % @test := true if not p-option
% \@tempdimb := \@tempdima + ht of \BOX + \@fpsep
% if \@tempdimb > \@colht
% then @test :=G true
% fi
% if @test = true
% then add \BOX to \@flfail
% else add \BOX to \@flsucceed
% \@tempdima := \@tempdimb
% fi
% END
%
% \@testfp \BOX == BEGIN if bit 3 of \count\BOX = 0
% then @test :=G true fi
% END
%
% \@makefcolumn \FLIST ==
% BEGIN
% \begingroup
% \@fpmin =:L 0
% \@testfp == \@gobble
% \@tryfcolumn \FLIST
% \endgroup
% END
%
% \@addtobot : Tries to put insert \@currbox on \@botlist. Called only when:
% * \ht BOX + \@maxsep < \@colroom
% * type of \@currbox not on \@deferlist
% * \@colnum > 0
% * @insert = false
% If it succeeds, then:
% * sets @insert true
% * decrements \@botroom by \ht BOX
% * decrements \@botnum and \@colnum by 1
% * decrements \@colroom by \ht BOX + either \floatsep
% or \textfloatsep, as appropriate.
% * sets \maxdepth to 0pt
%
% \@addtotoporbot : Tries to put insert \@currbox on \@toplist or \@botlist.
% Called only under same conditions as \@addtobot.
% If it succeeds, then:
% * sets @insert true
% * decrements either \@toproom or \@botroom by \ht BOX
% * decrements \@colnum and either \@topnum or
% \@botnum by 1
% * decrements \@colroom by \ht BOX + either \floatsep
% or \textfloatsep, as appropriate.
%
% \@addtocurcol : Tries to add \@currbox to current column, setting @insert
% true if it succeeds, false otherwise. It will add
% \@currbox to top only if bit 0 of \count \@currbox is 0, and
% to the bottom only if bit 0 = 0 or an earlier float of
% the same type is put on the bottom.
% If the float is put in the text, then
% \penalty\interlinepenalty is put
% right after the float, before the following \vskip, and
% \outputpenalty :=L 0.
%
% \@addtonextcol : Tries to add \@currbox to the next column, setting @insert
% true if it succeeds, false otherwise.
%
% \@addtodblcol : Tries to add \@currbox to the next double-column page,
% adding it to \@dbltoplist if it succeeds and \@dbldeferlist
% if it fails.
%
% \@addtobot ==
% BEGIN
% if bit 2 of \count \@currbox = 1
% then if \@botnum > 0
% then if \@botroom > \ht \@currbox
% then \@botnum :=G \botnum - 1
% \@colnum :=G \@colnum - 1
% \@tempdima :=L - \ht\@currbox -
% if \@botlist empty
% then \textfloatsep
% else \floatsep
% fi
% \@botroom :=G \@botroom + \@tempdima
% \@colroom :=G \@colroom + \@tempdima
% add \@currbox to \@botlist
% \maxdepth :=G 0pt
% @insert :=L true
% fi fi fi
% END
%
% \@addtotoporbot ==
% BEGIN
% if bit 1 of \count \@currbox = 1
% then if \@topnum > 0
% then if \@toproom > \ht \@currbox
% then if \@currtype not on \@midlist or \@botlist
% then \@topnum :=G \topnum - 1
% \@colnum :=G \@colnum - 1
% \@tempdima :=L - \ht\@currbox -
% if \@toplist empty
% then \textfloatsep
% else \floatsep
% fi
% \@toproom :=G \@toproom + \@tempdima
% \@colroom :=G \@colroom + \@tempdima
% add \@currbox to \@toplist
% @insert :=L true
% fi fi fi fi
% if @insert = false then \@addtobot fi
% END
%
% \@addtocurcol ==
% BEGIN
% @insert :=L false
% \@textmin := \textfraction\@colht %% added 27 Sep 85
% if \@colroom > \ht \@currbox + max(\@pageht+\@pagedp, \@textmin)
% + \@maxsep
% then if \@colnum > 0
% then \@currtype := type of \@currbox
% if \@currtype not on \@deferlist
% then if \@currtype on \@botlist
% then \@addtobot
% else if bit0 of \count \@currbox = 1
% then decrement \@colnum
% put \@currbox on \@midlist
% add \@currbox + space +
% \penalty \interlinepenalty to text
% \outputpenalty :=L 0
% @insert := true
% else \@addtotoporbot
% fi fi fi fi fi
% if @insert = false
% then add \@currbox to \@deferlist
% fi
% END
%
% \@addtonextcol ==
% BEGIN
% @insert :=L false
% \@textmin := \textfraction\@colht %% added 27 Sep 85
% if \@colroom > \ht \@currbox + \@textmin + \@maxsep
% then if \@colnum > 0
% \@currtype := type of \@currbox
% then if \@currtype not on \@deferlist
% then \@addtotoporbot
% fi fi fi
% if @insert = false
% then add \@currbox to \@deferlist
% fi
% END
%
% \@addtodblcol ==
% BEGIN
% @insert :=L false
% if bit 1 of \count \@currbox = 1
% then if \@dbltopnum > 0
% then if \@dbltoproom > \ht \@currbox
% then if type of \@currbox not on \@dbldeferlist
% then \@dbltopnum :=G \@dbltopnum - 1
% \@tempdima := -\ht\@currbox -
% if \@dbltoplist empty
% then \dbltextfloatsep
% else \dblfloatsep
% fi
% \@dbltoproom :=G \@dbltoproom+\@tempdima
% \@colht :=G \@colht+\@tempdima
% add \@currbox to \@dbltoplist
% @insert :=L true
% fi fi fi fi
% if @insert = false then add \@currbox to \@dbldeferlist
% END
%
% \@addmarginpar ==
% BEGIN
% if \@currlist nonempty
% then remove \@marbox from \@currlist %% NOTE: \@currbox = left box
% add \@marbox and \@currbox to \@freelist
% else LaTeX error: ? %% shouldn't happen
% fi
% \@tempcnta := 1 %% 1 = right, -1 = left
% if @twocolumn = true
% then if @firstcolumn = true
% then \@tempcnta := -1
% fi
% else if @mparswitch = true
% then if count0 odd
% else \@tempcnta := -1
% fi
% fi
% if @reversemargin = true
% then \@tempcnta := -\@tempcnta
% fi
% fi
% if \@tempcnta < 0 then \box\@marbox :=G \box\@currbox fi
% \@tempdima :=L maximum(\@mparbottom - \@pageht + ht of \@marbox, 0)
% if \@tempdima > 0 then LaTeX warning: 'marginpar moved' fi
% \@mparbottom :=G \@pageht + \@tempdima + depth of \@marbox
% + \marginparpush
% \@tempdima :=L \@tempdima - ht of \@marbox
% height of \@marbox :=G depth of \@marbox :=G 0
% \vskip -\@pagedp
% \vskip \@tempdima
% \nointerlineskip
% \hbox{ if @tempcnta > 0 then \hskip \columnwidth
% \hskip \marginparsep
% else \hskip -\marginparsep
% \hskip -\marginparwidth
% fi
% \box\@marbox
% \hss
% }
% \vskip -\@tempdima
% \nointerlineskip
% \hbox{\vrule height 0 width 0 depth \@pagedp}
% END


\maxdeadcycles = 100 % floats and \marginpar's add a lot of dead cycles

\let\@elt\relax

\def\@next#1#2#3#4{\ifx#2\@empty #4\else
\expandafter\@xnext #2\@@#1#2#3\fi}

\def\@xnext \@elt #1#2\@@#3#4{\def#3{#1}\gdef#4{#2}}

\newif\if@test

\def\@bitor#1#2{\global\@testfalse {\let\@elt\@xbitor
\@tempcnta #1\relax #2}}

%% RmS 91/11/22: Added test for \count#1 being 0.
%% Suggested by Chris Rowley.
\def\@xbitor #1{\@tempcntb \count#1
\ifnum \@tempcnta =\z@
\else
\divide\@tempcntb\@tempcnta
\ifodd\@tempcntb \global\@testtrue\fi
\fi}

% DEFINITION OF FLOAT BOXES:
\newinsert\bx@A
\newinsert\bx@B
\newinsert\bx@C
\newinsert\bx@D
\newinsert\bx@E
\newinsert\bx@F
\newinsert\bx@G
\newinsert\bx@H
\newinsert\bx@I
\newinsert\bx@J
\newinsert\bx@K
\newinsert\bx@L
\newinsert\bx@M
\newinsert\bx@N
\newinsert\bx@O
\newinsert\bx@P
\newinsert\bx@Q
\newinsert\bx@R



\gdef\@freelist{\@elt\bx@A\@elt\bx@B\@elt\bx@C\@elt\bx@D\@elt\bx@E
\@elt\bx@F\@elt\bx@G\@elt\bx@H\@elt\bx@I\@elt\bx@J
\@elt\bx@K\@elt\bx@L\@elt\bx@M\@elt\bx@N
\@elt\bx@O\@elt\bx@P\@elt\bx@Q\@elt\bx@R}

\gdef\@toplist{}
\gdef\@botlist{}
\gdef\@midlist{}
\gdef\@currlist{}
\gdef\@deferlist{}
\gdef\@dbltoplist{}
\gdef\@dbldeferlist{}

% PAGE LAYOUT PARAMETERS
\newdimen\topmargin
\newdimen\oddsidemargin
\newdimen\evensidemargin
\let\@themargin=\oddsidemargin
\newdimen\headheight
\newdimen\headsep
\newdimen\footskip
\newdimen\footheight % even though it never gets used.
\newdimen\textheight
\newdimen\textwidth
\newdimen\columnwidth
\newdimen\columnsep
\newdimen\columnseprule
\newdimen\@maxdepth \@maxdepth = \maxdepth
\newdimen\marginparwidth
\newdimen\marginparsep
\newdimen\marginparpush

% PAGE STYLE PARAMETERS
\newskip\floatsep
\newskip\textfloatsep
\newskip\intextsep
\newdimen\@maxsep
\newskip\dblfloatsep
\newskip\dbltextfloatsep
\newdimen\@dblmaxsep
\newskip\@fptop
\newskip\@fpsep
\newskip\@fpbot
\newskip\@dblfptop
\newskip\@dblfpsep
\newskip\@dblfpbot
\let\topfigrule=\relax
\let\botfigrule=\relax
\let\dblfigrule=\relax

% INTERNAL REGISTERS

\newcount\@topnum
\newdimen\@toproom
\newcount\@dbltopnum
\newdimen\@dbltoproom
\newcount\@botnum
\newdimen\@botroom
\newcount\@colnum
\newdimen\@textmin
\newdimen\@fpmin
\newdimen\@colht
\newdimen\@colroom
\newdimen\@pageht
\newdimen\@pagedp
\newdimen\@mparbottom \@mparbottom\z@
\newcount\@currtype
\newbox\@outputbox
\newbox\@leftcolumn
\newbox\@holdpg

\newif\if@insert
\newif\if@fcolmade
\newif\if@specialpage \@specialpagefalse
\newif\if@twoside \@twosidefalse
\newif\if@firstcolumn \@firstcolumntrue
\newif\if@twocolumn \@twocolumnfalse
\newif\if@reversemargin \@reversemarginfalse
\newif\if@mparswitch \@mparswitchfalse

\def\@thehead{\@oddhead} % initialization
\def\@thefoot{\@oddfoot}

\def\newpage{\par\vfil\penalty -\@M}

\def\clearpage{\newpage \write\m@ne{}\vbox{}\penalty -\@Mi}

\def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
\hbox{}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}

\def\twocolumn{\clearpage \global\columnwidth\textwidth
\global\advance\columnwidth -\columnsep \global\divide\columnwidth\tw@
\global\hsize\columnwidth \global\linewidth\columnwidth
\global\@twocolumntrue \global\@firstcolumntrue
\@dblfloatplacement\@ifnextchar[{\@topnewpage}{}}

\def\onecolumn{\clearpage\global\columnwidth\textwidth
\global\hsize\columnwidth \global\linewidth\columnwidth
\global\@twocolumnfalse \@floatplacement}

\long\def\@topnewpage[#1]{\@next\@currbox\@freelist{}{}%
\global\setbox\@currbox\vbox{\hsize\textwidth \@parboxrestore
#1\par\vskip -\dbltextfloatsep}\global\count\@currbox\tw@
\global\@dbltopnum\@ne \global\@dbltoproom\maxdimen\@addtodblcol
\global\vsize\@colht \global\@colroom\@colht}

%% RmS 91/09/29: added reset of \par to the output routine.
%% This avoids problems when the output routine is
%% called within a list where \par may be a no-op.

\output{\let\par\@@par
\ifnum\outputpenalty <-\@M\@specialoutput\else
\@makecol\@opcol\@floatplacement\@startcolumn
\@whilesw\if@fcolmade \fi{\@opcol\@startcolumn}\fi
\global\vsize\ifnum\outputpenalty >-\@Miv \@colroom
\else \maxdimen\fi}

% CHANGES TO \@specialoutput:
% * \penalty\z@ changed to \penalty\interlinepenalty so \samepage
% works properly with figure and table environments.
% (Changed 23 Oct 86)
%
% * Definition of \@specialoutput changed 26 Feb 88 so \@pageht and \@pagedp
% aren't changed for a marginal note. (Change suggested by
% Chris Rowley.)
%
\def\@specialoutput{\ifnum\outputpenalty >-\@Mii
\@doclearpage
\else
\ifnum \outputpenalty <-\@Miii
\ifnum\outputpenalty<-\@MM \deadcycles\z@\fi
\global\setbox\@holdpg\vbox{\unvbox\@cclv}%
\else \setbox\@tempboxa\box\@cclv
\@pagedp\dp\@holdpg \@pageht\ht\@holdpg
\unvbox\@holdpg
\@next\@currbox\@currlist{\ifnum\count\@currbox >\z@
\ifvoid\footins\else\advance\@pageht\ht\footins
\advance\@pageht\skip\footins \advance\@pagedp\dp\footins
\insert\footins{\unvbox\footins}\fi
\@addtocurcol\else
\ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
\@addmarginpar\fi}\@latexbug
\ifnum \outputpenalty <\z@ \penalty\interlinepenalty\fi
\fi\fi}


\def\@doclearpage{\ifvoid\footins
\setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa
\setbox\@tempboxa\box\@cclv
\xdef\@deferlist{\@toplist\@botlist
\@deferlist}\gdef\@toplist{}\gdef\@botlist{}\global\@colroom\@colht
\ifx\@currlist
\@empty\else\@latexerr{Float(s)
lost}\@ehb\gdef\@currlist{}\fi
\@makefcolumn\@deferlist
\@whilesw\if@fcolmade \fi{\@opcol
\@makefcolumn\@deferlist}\if@twocolumn
\if@firstcolumn
\xdef\@dbldeferlist{\@dbltoplist
\@dbldeferlist}\gdef\@dbltoplist{}\global\@colht\textheight
\begingroup \@dblfloatplacement \@makefcolumn\@dbldeferlist
\@whilesw\if@fcolmade \fi{\@outputpage
\@makefcolumn\@dbldeferlist}\endgroup
\else \vbox{}\clearpage
\fi\fi
\else\setbox\@cclv\vbox{\box\@cclv\vfil}\@makecol\@opcol
\clearpage
\fi}

\def\@opcol{\global\@mparbottom\z@\if@twocolumn\@outputdblcol\else
\@outputpage \global\@colht\textheight \fi}

\def\@outputdblcol{\if@firstcolumn \global\@firstcolumnfalse
\global\setbox\@leftcolumn\box\@outputbox
\else \global\@firstcolumntrue
\setbox\@outputbox\vbox{\hbox to\textwidth{\hbox to\columnwidth
{\box\@leftcolumn \hss}\hfil \vrule width\columnseprule\hfil
\hbox to\columnwidth{\box\@outputbox \hss}}}\@combinedblfloats
\@outputpage \begingroup \@dblfloatplacement \@startdblcolumn
\@whilesw\if@fcolmade \fi{\@outputpage\@startdblcolumn}\endgroup
\fi}

% Extra \@texttop somehow found its way into \@makecol. Deleted
% 1 Dec 86. (Found by Mike Harrison)
%% RmS 91/10/22: Replaced \dimen128 by \dimen@.
\def\@makecol{\ifvoid\footins \setbox\@outputbox\box\@cclv
\else\setbox\@outputbox
\vbox{\boxmaxdepth \maxdepth
\unvbox\@cclv\vskip\skip\footins\footnoterule\unvbox\footins}\fi
\xdef\@freelist{\@freelist\@midlist}\gdef\@midlist{}\@combinefloats
\setbox\@outputbox\vbox to\@colht{\boxmaxdepth\maxdepth
\@texttop\dimen@\dp\@outputbox\unvbox\@outputbox
\vskip-\dimen@\@textbottom}%
\global\maxdepth\@maxdepth}

\let\@texttop=\relax
\let\@textbottom=\relax

\def\@outputpage{\begingroup\catcode`\ =10
\let\-\@dischyph \let\'\@acci \let\`\@accii \let\=\@acciii
\if@specialpage
\global\@specialpagefalse\@nameuse{ps@\@specialstyle}\fi
\if@twoside
\ifodd\count\z@ \let\@thehead\@oddhead \let\@thefoot\@oddfoot
\let\@themargin\oddsidemargin
\else \let\@thehead\@evenhead
\let\@thefoot\@evenfoot \let\@themargin\evensidemargin
\fi\fi
\shipout
\vbox{\reset@font %% RmS 91/08/15
\normalsize \baselineskip\z@ \lineskip\z@
\let\par\@@par %% 15 Sep 87
\vskip \topmargin \moveright\@themargin
\vbox{\setbox\@tempboxa
\vbox to\headheight{\vfil \hbox to\textwidth
{\let\label\@gobble \let\index\@gobble
\let\glossary\@gobble %% 21 Jun 91
\@thehead}}% %% 22 Feb 87
\dp\@tempboxa\z@
\box\@tempboxa
\vskip \headsep
\box\@outputbox
\baselineskip\footskip
\hbox to\textwidth{\let\label\@gobble
\let\index\@gobble %% 22 Feb 87
\let\glossary\@gobble %% 21 Jun 91
\@thefoot}}}\global\@colht\textheight
\endgroup\stepcounter{page}\let\firstmark\botmark}


\def\@combinefloats{\boxmaxdepth\maxdepth \ifx\@toplist\@empty\else\@cfla\fi
\ifx\@botlist\@empty\else\@cflb\fi}

\def\@cfla{\let\@elt\@comflelt \setbox\@tempboxa\vbox{}\@toplist
\setbox\@outputbox\vbox{\unvbox\@tempboxa\vskip-\floatsep
\topfigrule\vskip\textfloatsep \unvbox\@outputbox}\let\@elt\relax
\xdef\@freelist{\@freelist\@toplist}\gdef\@toplist{}}

\def\@cflb{\let\@elt\@comflelt \setbox\@tempboxa\vbox{}\@botlist
\setbox\@outputbox\vbox{\unvbox\@outputbox \vskip\textfloatsep
\botfigrule\unvbox\@tempboxa \vskip-\floatsep}\let\@elt\relax
\xdef\@freelist{\@freelist\@botlist}\gdef\@botlist{}}

\def\@comflelt#1{\setbox\@tempboxa
\vbox{\unvbox\@tempboxa\box #1\vskip\floatsep}}

\def\@combinedblfloats{\ifx\@dbltoplist\@empty\else
\let\@elt\@comdblflelt \setbox\@tempboxa\vbox{}\@dbltoplist
\setbox\@outputbox\vbox to\textheight
{\boxmaxdepth\maxdepth
\unvbox\@tempboxa\vskip-\dblfloatsep
\dblfigrule\vskip\dbltextfloatsep \box\@outputbox}\let\@elt\relax
\xdef\@freelist{\@freelist\@dbltoplist}\gdef\@dbltoplist{}\fi}


\def\@comdblflelt#1{\setbox\@tempboxa
\vbox{\unvbox\@tempboxa\box #1\vskip\dblfloatsep}}


\def\@startcolumn{\global\@colroom\@colht
\ifx\@deferlist\@empty\global\@fcolmadefalse\else\@xstartcol\fi}

\def\@xstartcol{\@tryfcolumn\@deferlist \if@fcolmade\else
\begingroup\edef\@tempb{\@deferlist}\gdef\@deferlist{}\let\@elt\@scolelt
\@tempb\endgroup\fi}

\def\@scolelt#1{\def\@currbox{#1}\@addtonextcol}

\def\@startdblcolumn{\global\@colht\textheight
\@tryfcolumn\@dbldeferlist \if@fcolmade\else
\begingroup
\edef\@tempb{\@dbldeferlist}\gdef\@dbldeferlist{}\let\@elt\@sdblcolelt
\@tempb\endgroup\fi}

\def\@sdblcolelt#1{\def\@currbox{#1}\@addtodblcol}

\def\@tryfcolumn #1{\global\@fcolmadefalse \xdef\@trylist{#1}\xdef\@failedlist
{}\begingroup \let\@elt\@xtryfc \@trylist \endgroup
\if@fcolmade \@vtryfc #1\fi}

\def\@vtryfc #1{\global\setbox\@outputbox\vbox{}\let\@elt\@wtryfc
\@flsucceed \global\setbox\@outputbox\vbox to\@colht{\vskip \@fptop
\vskip -\@fpsep \unvbox \@outputbox \vskip \@fpbot}\let\@elt\relax
\xdef #1{\@failedlist\@flfail}\xdef\@freelist{\@freelist\@flsucceed}}

\def\@wtryfc #1{\global\setbox\@outputbox\vbox{\unvbox\@outputbox
\vskip\@fpsep\box #1}}


\def\@xtryfc #1{\@next\@tempa\@trylist{}{}\@currtype
\count #1\divide\@currtype\@xxxii \multiply\@currtype\@xxxii
\@bitor \@currtype \@failedlist \@testfp #1\ifdim
\ht #1>\@colht \global\@testtrue\fi
\if@test \@cons\@failedlist #1\else \@ytryfc #1\fi}

\def\@ytryfc #1{\begingroup \gdef\@flsucceed{\@elt #1}\gdef\@flfail
{}\@tempdima\ht #1\let\@elt\@ztryfc \@trylist \ifdim \@tempdima >\@fpmin
\global\@fcolmadetrue \else \@cons\@failedlist #1\fi
\endgroup \if@fcolmade \let\@elt\@gobble \fi}

\def\@ztryfc #1{\@tempcnta\count #1\divide\@tempcnta\@xxxii
\multiply\@tempcnta\@xxxii \@bitor \@tempcnta {\@failedlist
\@flfail}\@testfp #1\@tempdimb\@tempdima \advance\@tempdimb\ht #1\advance
\@tempdimb\@fpsep \ifdim \@tempdimb >\@colht \global\@testtrue\fi
\if@test \@cons\@flfail #1\else \@cons\@flsucceed #1\@tempdima\@tempdimb
\fi}

\def\@testfp #1{\@tempcnta\count #1\divide\@tempcnta 8\relax
\ifodd\@tempcnta \else \global\@testtrue\fi}

\def\@makefcolumn #1{\begingroup \@fpmin\z@ \let\@testfp\@gobble
\@tryfcolumn #1\endgroup}

\def\@addtobot{\@tempcnta\count\@currbox\divide\@tempcnta4 \ifodd\@tempcnta
\ifnum \@botnum >\z@ \ifdim \@botroom >\ht\@currbox
\global\advance\@botnum\m@ne
\global\advance\@colnum\m@ne
\@tempdima -\ht\@currbox
\advance\@tempdima -\ifx\@botlist\@empty \textfloatsep
\else\floatsep\fi
\global\advance\@botroom \@tempdima
\global\advance\@colroom \@tempdima
\@cons\@botlist\@currbox \global\maxdepth\z@
\@inserttrue\fi\fi\fi}

\def\@addtotoporbot{\@tempcnta\count\@currbox \divide\@tempcnta\tw@
\ifodd\@tempcnta \ifnum \@topnum >\z@ \ifdim\@toproom >\ht\@currbox
\@bitor\@currtype{\@midlist\@botlist}\if@test\else
\global\advance\@topnum\m@ne
\global\advance\@colnum\m@ne
\@tempdima-\ht\@currbox
\advance\@tempdima
-\ifx\@toplist\@empty \textfloatsep \else\floatsep\fi
\global\advance\@toproom \@tempdima
\global\advance\@colroom \@tempdima
\@cons\@toplist\@currbox
\@inserttrue
\fi\fi\fi\fi
\if@insert\else\@addtobot \fi}

\def\@addtonextcol{\@insertfalse \@textmin \textfraction\@colht
\@tempdima\ht\@currbox
\advance\@tempdima\@textmin\advance\@tempdima\@maxsep
\ifdim\@colroom >\@tempdima
\ifnum\@colnum >\z@
\@currtype\count\@currbox \divide\@currtype\@xxxii
\multiply\@currtype\@xxxii
\@bitor\@currtype\@deferlist
\if@test\else
\@addtotoporbot
\fi\fi\fi
\if@insert\else \@cons\@deferlist\@currbox\fi}

\def\@addtodblcol{\@insertfalse
\@tempcnta\count\@currbox \divide\@tempcnta\tw@
\ifodd\@tempcnta
\ifnum\@dbltopnum >\z@
\ifdim\@dbltoproom >\ht\@currbox
\@currtype\count\@currbox \divide\@currtype\@xxxii
\multiply\@currtype\@xxxii
\@bitor\@currtype\@dbldeferlist
\if@test\else
\global\advance\@dbltopnum\m@ne
\@tempdima -\ht\@currbox
\advance\@tempdima -\ifx\@dbltoplist\@empty
\dbltextfloatsep\else\dblfloatsep\fi
\global\advance\@dbltoproom \@tempdima
\global\advance\@colht \@tempdima
\@cons\@dbltoplist\@currbox
\@inserttrue
\fi\fi\fi\fi
\if@insert\else \@cons\@dbldeferlist\@currbox \fi}

% CHANGE TO \@addtocurcol:
% \penalty\z@ changed to \penalty\interlinepenalty so \samepage
% works properly with figure and table environments.
% (Changed 23 Oct 86)
%
\def\@addtocurcol{\@insertfalse \@textmin \textfraction\@colht
\@tempdima\@pageht \advance\@tempdima\@pagedp
\ifdim \@textmin >\@tempdima \@tempdima\@textmin \fi
\advance\@tempdima\ht\@currbox \advance\@tempdima\@maxsep
\ifdim\@colroom >\@tempdima
\ifnum\@colnum >\z@
\@currtype\count\@currbox \divide\@currtype\@xxxii
\multiply\@currtype\@xxxii
\@bitor\@currtype\@deferlist
\if@test\else
\@bitor\@currtype\@botlist
\if@test \@addtobot \else
\ifodd\count\@currbox
\global\advance\@colnum\m@ne
\@cons\@midlist\@currbox
\vskip\intextsep \box\@currbox
\penalty\interlinepenalty \vskip\intextsep
\ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
\outputpenalty\z@
\@inserttrue
\else \@addtotoporbot
\fi\fi\fi\fi\fi
\if@insert\else\@cons\@deferlist\@currbox\fi}

\def\@addmarginpar{\@next\@marbox\@currlist{\@cons\@freelist\@marbox
\@cons\@freelist\@currbox}\@latexbug\@tempcnta\@ne
\if@twocolumn
\if@firstcolumn \@tempcnta\m@ne \fi
\else
\if@mparswitch
\ifodd\c@page \else\@tempcnta\m@ne \fi
\fi
\if@reversemargin \@tempcnta -\@tempcnta \fi
\fi
\ifnum\@tempcnta <\z@ \global\setbox\@marbox\box\@currbox \fi
\@tempdima\@mparbottom \advance\@tempdima -\@pageht
\advance\@tempdima\ht\@marbox \ifdim\@tempdima >\z@
\@@warning{Marginpar on page \thepage\space moved}\else\@tempdima\z@ \fi
\global\@mparbottom\@pageht \global\advance\@mparbottom\@tempdima
\global\advance\@mparbottom\dp\@marbox
\global\advance\@mparbottom\marginparpush
\advance\@tempdima -\ht\@marbox
\global\ht\@marbox\z@ \global\dp\@marbox\z@
\vskip -\@pagedp \vskip\@tempdima\nointerlineskip
\hbox to\columnwidth
{\ifnum \@tempcnta >\z@
\hskip\columnwidth \hskip\marginparsep
\else \hskip -\marginparsep \hskip -\marginparwidth \fi
\box\@marbox \hss}\nobreak %% RmS 91/06/21 \nobreak added
\vskip -\@tempdima
\nointerlineskip
\hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}}

\message{debugging}
% ****************************************
% * DEBUGGING AND TEST INITIALIZATIONS *
% ****************************************
%
% DEBUGGING
\def\showoverfull{\tracingonline=1}
\tracingstats1 % SHOWS HOW MUCH STUFF TeX HAS USED
\def\showoutput{\tracingonline1\tracingoutput1
\showboxbreadth99999\showboxdepth99999\errorstopmode}
\def\makeatletter{\catcode`\@=11\relax}
\def\makeatother{\catcode`\@=12\relax}

\newcount\@lowpenalty
\newcount\@medpenalty
\newcount\@highpenalty

% LIST

% ENUMERATION

% ITEMIZE

% ARRAY AND TABULAR

% THE PICTURE ENVIRONMENT

\unitlength = 1pt
\fboxsep = 3pt
\fboxrule = .4pt

%% FOOTNOTES

%\def\footnoterule{} % INITIALIZED BY PLAIN
%\skip\footins{} % INITIALIZED BY PLAIN
%\interfootnotelinepenalty % INITIALIZED BY PLAIN

\@maxdepth = \maxdepth

% \vsize initialized because a \clearpage with \vsize < \topskip
% causes trouble.
% \@colroom and \@colht also initialized because \vsize may be
% set to them if a \clearpage is done before the \begin{document}

\vsize = 1000pt
\@colroom = \vsize
\@colht = \vsize

\endinput


  3 Responses to “Category : EmTeX is a TeX/LaTeX document editor
Archive   : LATEX.ZIP
Filename : LATEX.TEX

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/