% LATEX VERSION 2.09 <24 May 1989>
% Copyright (C) 1988 by Leslie Lamport

\everyjob{\typeout{LaTeX Version 2.09 <24 May 1989>}}
\immediate\write10{LaTeX Version 2.09 <24 May 1989>}

%                 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
% \@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
% \framerule
% \framesep
% \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
% \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
% \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
% \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 LOGO IS DEFINED HERE.
%
\def\LaTeX{{\rm L\kern-.36em\raise.3ex\hbox{\sc a}\kern-.15em
    T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}

% 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$\lbrace$\fi}
\def\}{\protect\@rb}
\def\@rb{\relax\ifmmode\rbrace\else$\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.'
%
%  \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}\read0 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}

\def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}}
\def\@warning#1{\typeout{LaTeX Warning: #1.}}
\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{\expandafter\newcommand 
     \csname #1\endcsname[#2]{#3}\expandafter\long
     \expandafter\def\csname end#1\endcsname}

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

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

\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>0
\do{\edef\@tempa{\@tempa\@?@?\the\@tempcntb}\advance\@tempcntb \@ne \advance
\@tempcnta \m@ne}\let\@?@?##\@tempa{#3}}
\catcode`\?=12\relax

\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\^^K\@makeother\_\@makeother\^^A%
\@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}\expandafter\errhelp\expandafter{\@tempc}%
\typeout{LaTeX error. \space See LaTeX manual for explanation.^^J
 \space\@spaces\@spaces\@spaces Type \space H <return> \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 <command> <return> \space to replace it
  with another command,^^Jor \space <return> \space to continue without it.}
\def\@ehb{You've lost some text. \space \@ehc}
\def\@ehc{Try typing \space <return> 
  \space to proceed.^^JIf that doesn't work, type \space X <return> \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 <CR> == \\.
% \restorecr : restores <CR> 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\relax\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
%    \dimen\@savsk := \lastskip
%    if  hmode  then  \@savsf := \spacefactor  fi
%  END
%
% \@esphack ==
%  BEGIN
%    if  hmode
%      then  \spacefactor := \@savsf
%            if \dimen\@savsk > 0pt  then  \ignorespaces  
%                                          \global\@ignoretrue   fi
%    fi
%  END
%

\newdimen\@savsk
\newcount\@savsf

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

\def\@esphack{\relax\ifhmode\spacefactor\@savsf
     {}\ifdim \@savsk >\z@ \global\@ignoretrue \ignorespaces 
  \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\relax
        \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 \expandafter\vskip #1\vskip \z@\prevdepth\dimen@
       \else 
        \@bsphack\vadjust{\dimen@\prevdepth 
            \expandafter\vskip #1\vskip \z@\prevdepth\dimen@}\@esphack\fi}
\def\@vspacer#1{\ifvmode \dimen@\prevdepth 
         \hrule height\z@ \nobreak \expandafter\vskip #1\vskip \z@
           \prevdepth\dimen@
        \else
         \@bsphack\vadjust{\dimen@\prevdepth \hrule height\z@ \nobreak 
            \expandafter\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
               {\setbox0=\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\expandafter\hskip #1\relax}

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

% 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}}

\def\@whileswnoop#1\fi{}
\def\@whilesw#1\fi#2{#1#2\@iwhilesw{#1#2}\fi\fi}
\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}}

\def\@tfor#1:=#2\do#3{\xdef\@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{}
%   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

\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
  \def\do##1{\let ##1\@notprerr}%
  \@preamblecmds
  \let\do\noexpand  
  \@normalsize\everypar{}}

\def\@gobbletwo#1#2{}

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

\def\@input#1{\openin1 #1 \ifeof1 \typeout
  {No file #1.}\else\closein1 \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\expandafter\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
%

\def\ref#1{\@ifundefined{r@#1}{{\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}{{\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}%
\xdef\@gtempa{\write\@auxout{\string
      \newlabel{#1}{{\@currentlabel}{\thepage}}}}}\@gtempa
   \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} 

\def\@writefile#1#2{\@ifundefined{tf@#1}{}{\expandafter
   \immediate\write\csname tf@#1\endcsname{#2}}}

\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}}\begingroup\@endpefalse\@tempa}

\def\end#1{\csname end#1\endcsname\@checkend{#1}%
     \if@endpe\global\let\@gtempa\@doendpe
     \else\global\let\@gtempa\relax\fi
    \endgroup
     \@gtempa
     \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}}

\def\endequation{\eqno \@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.
%
\def\@eqnnum{{\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
\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{}

\def\@verbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi
\leftskip\@totalleftmargin\rightskip\z@
\parindent\z@\parfillskip\@flushglue\parskip\z@
\@tempswafalse \def\par{\if@tempswa\hbox{}\fi\@tempswatrue\@@par}
\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`#112\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

\def\@lquote{{\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
          \else \hbox to\labelwidth {\makelabel{#1}}\fi
       \hskip \labelsep}\ignorespaces}

\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
%            \framerule, separated by space \framesep 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

\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]}}

\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
    \fi{\hsize #2\@parboxrestore #3}\if@pboxsw $\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 $\fi}

\newcount\@mplistdepth
\newinsert\@mpfootins

\long\def\@mpfootnotetext#1{\global\setbox\@mpfootins
    \vbox{\unvbox\@mpfootins
    \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}}$\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\@getempa \@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\relax
   \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\@tabpush0 \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 > 0 \@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\def\@halignto{}\@tabarray}

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

\def\tabular{\def\@halignto{}\@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}

\def\@tabarray{\@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 >0 \@whilenum\@tempcnta >0\do
       {\edef\@tempa{\@tempa#3}\advance\@tempcnta by \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
\def\@preamble{}\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}}

\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>0\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{
%   END
%
% \endpicture ==
%   BEGIN
%                   } \hss } 
%                   heigth of \@picbox := \@picht
%                   depth  of \@picbox := 0
%                   leavevmode 
%                   \box\@picbox
%   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}

\def\endpicture{\egroup\hss\egroup\ht\@picbox\@picht
\dp\@picbox\z@\leavevmode\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 > 0\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-1pt\lineskip 3pt\let\mb@l\hss
\let\mb@r\hss \expandafter\let\csname mb@#1\endcsname\relax
\let\\\@stackcr\@ishortstack}

\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 =0 \@vline 
  \else \ifnum\@yarg =0 \@hline \else \@sline\fi
\fi}

\def\@sline{\ifnum\@xarg< 0 \@negargtrue \@xarg -\@xarg \@yyarg -\@yarg
  \else \@negargfalse \@yyarg \@yarg \fi
\ifnum \@yyarg >0 \@tempcnta\@yyarg \else \@tempcnta -\@yyarg \fi
\ifnum\@tempcnta>6 \@badlinearg\@tempcnta0 \fi
\ifnum\@xarg>6 \@badlinearg\@xarg 1 \fi
\setbox\@linechar\hbox{\@linefnt\@getlinechar(\@xarg,\@yyarg)}%
\ifnum \@yarg >0 \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 <0 \hskip -\@linelen \fi
\vrule \@height \@halfwidth \@depth \@halfwidth \@width \@linelen
\ifnum \@xarg <0 \hskip -\@linelen \fi}

\def\@getlinechar(#1,#2){\@tempcnta#1\relax\multiply\@tempcnta 8
\advance\@tempcnta -9 \ifnum #2>0 \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<0 -\@xarg\else\@xarg\fi
\ifnum\@tempcnta<5\relax
\@linelen=#3\unitlength
\ifnum\@xarg =0 \@vvector 
  \else \ifnum\@yarg =0 \@hvector \else \@svector\fi
\fi
\else\@badlinearg\fi}

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

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

\def\@svector{\@sline
\@tempcnta\@yarg \ifnum\@tempcnta <0 \@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 >0 \advance\@tempcnta \@tempcntb\relax
\else\advance\@tempcnta -\@tempcntb\advance\@tempcnta 64
\fi\fi\char\@tempcnta}

\def\@getrarrow(#1,#2){\@tempcntb=#2\relax
\ifnum\@tempcntb < 0 \@tempcntb=-\@tempcntb\relax\fi
\ifcase \@tempcntb\relax \@tempcnta='55 \or 
\ifnum #1<3 \@tempcnta=#1\relax\multiply\@tempcnta
24 \advance\@tempcnta -6 \else \ifnum #1=3 \@tempcnta=49
\else\@tempcnta=58 \fi\fi\or 
\ifnum #1<3 \@tempcnta=#1\relax\multiply\@tempcnta
24 \advance\@tempcnta -3 \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<0 \advance\@tempcnta 64 \fi
\char\@tempcnta}



\def\@vline{\ifnum \@yarg <0 \@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 3 
\fi
\setbox\@dashbox=\hbox{\vrule \@height \@halfwidth \@depth \@halfwidth
\@width #1\unitlength\hskip #1\unitlength}\@tempcnta=0
\put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
\do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta=0
\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 3
\fi
\setbox\@dashbox\hbox{\vrule \@width \@wholewidth 
\@height #1\unitlength}\@tempcnta0
\put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta < \@dashcnt
\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }%
\vskip\@dashdim}}\@tempcnta0
\put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta< \@dashcnt
\relax\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}
%       \@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 2pt\relax
  \@tempcnta\@tempdima
  \@tempdima 4pt\relax \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
  \@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 by #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 by #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.5pt\relax \@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 .5pt\relax
   \@tempcnta\@tempdima \@tempdima 1pt\relax
   \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}}}

\def\@othm#1[#2]#3{\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:}
\def\@begintheorem#1#2{\it \trivlist \item[\hskip \labelsep{\bf #1\ #2}]}
\def\@opargbegintheorem#1#2#3{\it \trivlist
      \item[\hskip \labelsep{\bf #1\ #2\ (#3)}]}
\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
%                        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  \@noskipsecfalse

\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
     \def\@svsec{}\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\@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
                  \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 {\setbox0=\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 1\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

\def\@starttoc#1{\begingroup
  \makeatletter  
  \@input{\jobname.#1}\if@filesw \expandafter\newwrite\csname tf@#1\endcsname
             \expandafter\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
%     

\def\@dottedtocline#1#2#3#4#5{\ifnum #1>\c@tocdepth \else
  \vskip \z@ plus .2pt
  {\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\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
   \xdef\@gtempa{\write\@indexfile{\string
      \indexentry{#1}{\thepage}}}\endgroup\@gtempa
   \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
   \xdef\@gtempa{\write\@glossaryfile{\string
      \glossaryentry{#1}{\thepage}}}\endgroup\@gtempa
   \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.)

\def\@bibitem#1{\item\if@filesw \immediate\write\@auxout
       {\string\bibcite{#1}{\the\c@enumi}}\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)
%
\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi
  \def\@citea{}\@cite{\@for\@citeb:=#2\do
    {\@citea\def\@citea{,\penalty\@m\ }\@ifundefined
       {b@\@citeb}{{\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}]}
\def\@biblabel#1{[#1]\hfill}

 \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 
        \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@ \@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}$}}

\newdimen\footnotesep

\def\footnote{\@ifnextchar[{\@xfootnote}{\stepcounter
   {\@mpfn}\xdef\@thefnmark{\thempfn}\@footnotemark\@footnotetext}}

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

\long\def\@footnotetext#1{\insert\footins{\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}\xdef\@thefnmark{\thefootnote}\@footnotemark}}

\def\@xfootnotemark[#1]{\begingroup \c@footnote #1\relax
   \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}{\xdef\@thefnmark{\thempfn}\@footnotetext}}

\def\@xfootnotenext[#1]{\begingroup \csname c@\@mpfn\endcsname #1\relax
   \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{}  
\def\@rhead{}


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

\def\ps@plain{\let\@mkboth\@gobbletwo
     \def\@oddhead{}\def\@oddfoot{\rm\hfil\thepage
     \hfil}\def\@evenhead{}\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
%% 

\def\markboth#1#2{\gdef\@themark{{#1}{#2}}{\let\protect\noexpand
     \let\label\relax \let\index\relax 
     \mark{\@themark}}\if@nobreak\ifvmode\nobreak\fi\fi}
\def\markright#1{{\let\protect\noexpand
     \let\label\relax \let\index\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 10000 \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 == \@gobble 
%                                              %% Added 22 Feb 87 as bug fix
%                                          \@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 == \@gobble 
%                                        %%% added 22 Feb 87 as bug fix
%                                    \@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}}

\def\@xbitor #1{\@tempcntb \count#1\divide\@tempcntb\@tempcnta
   \ifodd\@tempcntb \global\@testtrue\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}

\output{\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)
\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\dimen128=\dp\@outputbox\unvbox\@outputbox
        \vskip-\dimen128\@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{\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
                                         \@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
                           \@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}%
    \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
