% PS-LATEX VERSION 2.09 - RELEASE OF 19th September 1988
%		derived directly from
% LATEX	VERSION	2.09 - RELEASE OF 18 December 1985
% Copyright (C)	1985 by	Leslie Lamport

\everyjob{\typeout{PS-LaTeX Version 2.09 -	Released 19 September 1988}}
\immediate\write10{PS-LaTeX Version 2.09 -	Released 19 September 1988}

%		  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 \scriptscriptsize 
%		\big \Big \BIG
%	  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	   
% \footheight	     \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	   
% \footheight	     \headsep		 \topmargin	   
% 
% 
% TABBING COMMANDS:
% 
% These	commannds are defined only within a tabbing environment.
% 
% \kill	     \>	   \- 
% \pushtab   \<	   \=
% \poptab    \+	



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

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

\def\{{\relax\ifmmode\lbrace\else$\lbrace$\fi}
\def\}{\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]}}

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

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

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

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

\long\def\@reargdef#1[#2]#3{\@tempcnta#2\relax\let#1\relax
\edef\@tempa{\long\def#1}\@tempcntb \@ne
\let\@tempb\relax\@whilenum\@tempcnta>0
\do{\edef\@tempa{\@tempa\@tempb\the\@tempcntb}\advance\@tempcntb \@ne \advance
\@tempcnta \m@ne}\let\@tempb##\@tempa{#3}}


\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  


\def\@latexerr#1#2{\begingroup
\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}\endgroup}

\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.
%	  * \@endparenv	 [used inside \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
%	  * \@endparenv	[used inside \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}

\def\newline{\ifvmode \@nolnerr	\else \unskip\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 = F. 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}

\def\@endparenv{\addpenalty\@endparpenalty
   \addvspace\@topsepadd
   \endgroup\def\par{\@restorepar\everypar{}\par}\everypar
       {\hskip -\parindent \everypar{}}\begingroup}



% 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@}  %% extra	\hskip 0pt added 12/17/85 to guard
			       %% against a following \unskip

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

\def\include#1{\clearpage
\if@filesw \immediate\write\@mainaux{\string\@input{#1.aux}}\fi
\@tempswatrue\if@partsw	\@tempswafalse\def\@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.
%     \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{\ifnum #1>0 \number #1\fi}
\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\label#1{\@bsphack\if@filesw {\let\thepage\relax
   \xdef\@gtempa{\write\@auxout{\string
      \newlabel{#1}{{\@currentlabel}{\thepage}}}}}\@gtempa
   \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}

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

\def\refstepcounter#1{\stepcounter
   {#1}\edef\@currentlabel{\csname p@#1\endcsname\csname the#1\endcsname}}

\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  
%		       \let\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{NAME} ==
%  BEGIN
%    IF	\NAME undefined	 THEN  \@tempa == BEGIN	report error END
%			 ELSE  \@tempa == \NAME
%			       \@currenvir :=L NAME
%    FI
%    \begingroup	    
%    \NAME
%  END

% \end{NAME} ==
%  BEGIN
%   \endNAME
%   \endgroup
%   \@checkend{NAME}
%   IF @ignore = T
%     THEN @ignore :=G F
%	   \ignorespaces
%   FI
%  END


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

\def\begin#1{\@ifundefined{#1}{\def\@tempa{\@latexerr{Environment #1 
  undefined}\@eha}}{\def\@currenvir{#1}\def\@tempa{\csname 
  #1\endcsname}}\begingroup\@tempa}

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

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


 \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}}
 
\def\@xobeysp{\leavevmode{} }

\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

\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 \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 \tt \let\do\@makeother \dospecials 
\@ifstar{\@sverb}{\@verb}}

\def\@sverb#1{\def\@tempa ##1#1{##1\endgroup}\@tempa}

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


 \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	\hskip -  \parindent \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
%	       \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	\addvspace from	putting	space
%	 at the	top of a minipage.
%
% \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
\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@
    \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\@minipagetrue 
    \everypar{\global\@minipagefalse\everypar{}}}


\let\@minipagerestore=\relax

\def\endminipage{\par\vskip-\lastskip
\ifvoid\@mpfootins\else
\vskip\skip\@mpfootins\footnoterule\unvbox\@mpfootins\fi
\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}}}

\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 := \hbox{ \box\@curline
%				 \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\setbox\@curline\hbox
    {}\@startfield\strut}

\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
      \setbox\@curline\hbox{\unhbox\@curline\hskip\@tempdima}
      \@startfield\ignorespaces}
\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\setbox\@curline\hbox{\box\@curline
     \hskip -\wd\@curfield \hskip -\tabbingsep \box\@curfield
      \hskip \tabbingsep}\@startfield\ignorespaces}
\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

\def\multicolumn#1#2#3{\multispan{#1}\begingroup
  \def\@addamp{}\@mkpream{#2}%
\def\@sharp{#3}\let\protect\relax
  \let\@startpbox\@@startpbox\let\@endpbox\@@endpbox
  \@arstrut \@preamble\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 == \par \vskip \dp\@arstrutbox \egroup\hfil
%

\def\@startpbox#1{\vtop\bgroup \hsize #1\@arrayparboxrestore}
\def\@endpbox{\par\vskip\dp\@arstrutbox\egroup\hfil}

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

\long\def\put(#1,#2)#3{\@killglue\raise#2\unitlength\hbox to \z@{\hskip
#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@{\hskip
\@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
\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
\@linelen=#3\unitlength
\ifnum\@xarg =0	\@vvector 
  \else	\ifnum\@yarg =0	\@hvector \else	\@svector\fi
\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
%     \@tempcnta       := \@tempcnta / integer coercion	of 4pt
%     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

\def\@getcirc#1{\@tempdima #1\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{.}
\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}


 \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.
%     
% \@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 \hskip -\parindent
%				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 \hskip	-\parindent\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 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 == \@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
%     \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 \endgroup}


\let\protect=\relax

\def\addcontentsline#1#2#3{\if@filesw \begingroup
\let\label\@gobble \let\index\@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
\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.
%     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
  {\hangindent #2\relax	\rightskip \@tocrmarg \parfillskip -\rightskip
    \parindent #2\relax\@afterindenttrue
   \interlinepenalty\@M
   \leavevmode 
   \@tempdima #3\relax
    #4\leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern \@dotsep mu$}\hfill 
   \hbox to\@pnumwidth{\hfil\rm	#5}\par}\fi}


% \numberline{NUMBER} :	For use	in a \contentsline command.
%   It puts NUMBER flushleft in	a box of width \@tempdima and adds 
%   \@tempdima to the hanging indentation.

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



 \message{index,}
%	****************************************
%	*	     INDEX COMMANDS	       *
%	****************************************
%
% \makeindex ==
%   BEGIN
%    if	\@filesw = T
%      then  open file \jobname.IDX as \@indexfile
%	      \index ==	 BEGIN \@bsphack 
%			       \begingroup
%				   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
%
\def\makeindex{\if@filesw \newwrite\@indexfile
  \immediate\openout\@indexfile=\jobname.idx
  \def\index{\@bsphack\begingroup\@sanitize\@wrindex\@indexfile}\typeout
  {Writing index file \jobname.idx }\fi}

\def\@wrindex#1#2{\let\thepage\relax
   \xdef\@gtempa{\write#1{\string
      \indexentry{#2}{\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\@wrindex\@glossaryfile}\typeout
  {Writing glossary file \jobname.glo }\fi}

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

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

\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi
  \def\@citea{}\@cite{\@for\@citeb:=#2\do
    {\@citea\def\@citea{,}\@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
%
%  \@caption{TYPE}[STEXT]{TEXT}	==
%   BEGIN
%     \addcontentsline{\ext@TYPE}{TYPE}{\numberline{\theTYPE}{STEXT}}
%     \par
%     \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{ 
%		      \boxmaxdepth :=L 0pt     %% to make a 0 depth box
%		      \hsize = \columnwidth
%		      \@parboxrestore
%   END
%
%  \end@float ==
%    BEGIN
%	 }
%      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
%	}
%	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{\addcontentsline{\csname
  ext@#1\endcsname}{#1}{\protect\numberline{\csname 
  the#1\endcsname}{\ignorespaces #2}}\par
  \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@
    \hsize\columnwidth \@parboxrestore}

\def\end@float{\egroup 
   \ifnum\@floatpenalty	<\z@
     \@cons\@currlist\@currbox
     \ifdim \ht\@currbox >\textheight 
	\ht\@currbox\textheight	\fi
     \ifnum\@floatpenalty < -\@Mii 
	\penalty -\@Miv	\vbox{}\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\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
%    { \end@float %%%% BRACE MATCHING}
%   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
     \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 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	two \bothmark'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}
\def\markboth#1#2{\gdef\@themark{{#1}{#2}}{\let\protect\noexpand
     \mark{\@themark}}}
\def\markright#1{{\let\protect\noexpand\expandafter\@markright\@themark
     {#1}\mark{\@themark}}}
\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
%   \footheight	    : height of	foot
%   \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
%		      simply \let's this to \vfil.
%
%   \@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, which	is 
% defined by the \floatstyle command.  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.	This macro
% is also defined by the \floatstyle command.
%    \@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 {\unvbox255
%				     \vskip \skip\footins
%				     \footnoterule
%				     \unvbox\@footinsert
%				    }
%    fi
%    \@freelist	:=G \@freelist * \@midlist
%    \@midlist	:=G empty
%    \@combinefloats
%    \@outputbox := \vbox to \@colht{\boxmaxdepth := \maxdepth
%				      \@texttop
%				      \unvbox\@outputbox
%				      \@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
%     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 \@oddhead	     ==L \@evenhead
%		     \@oddfoot	     ==L \@evenfoot
%		     \@themargin     ==L \evensidemargin  fi fi
%     \shipout\vbox
%	{\normalsize	      %	set fonts size for head	and foot
%	 \baselineskip :=L \lineskip :=L 0pt   
%	 \vskip	\topmargin
%	 \moveright\@themargin\vbox
%	       { \box\@tempboxa	:= \vbox to \headheight{\vfil 
%						    \hbox to \textwidth
%						    {\@thehead}}
%		 \dp\@tempboxa := 0pt	% Don't	skip space for descenders in
%		 \box\@tempboxa		% running head.
%		 \vskip	\headsep 
%		 \box\@outputbox
%		 \baselineskip\footskip
%		 \hbox to \textwidth{\@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 there are footnote insertions
%			then advance \@pageht and \@pagedp and
%			     reinsert footnotes		       fi
%		      if \@currlist nonempty
%			 then \@currbox	 :=L head of \@currlist	
%			      \@currlist :=G tail of \@currlist	
%			      if \count\@currbox > 0
%				then \@addtocurcol   %%	this is	a float
%				else \@addmarginpar  %%	this is	a marginal note
%			      fi
%			 else  THIS SHOULDN'T HAPPEN
%		      fi
%		      if \outputpenalty	< 0	%% TO PERMIT PAGE BREAK	
%			then \penalty 0	     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{\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
%    @twoside	  :=G true		    
%    @firstcolumn :=G true
%    \@dblfloatplacement
%  END
%
% \onecolumn ==	
%  BEGIN
%    \clearpage
%    \columnwidth :=G \textwidth 
%    \hsize	  :=G \columnwidth
%    @twoside	  :=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 0 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 
%					     + a \penalty 0 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\footheight
\newdimen\footskip
\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}

\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
	\ifvoid\footins\else\advance\@pageht\ht\footins
	  \advance\@pageht\skip\footins	\advance\@pagedp\dp\footins
	  \insert\footins{\unvbox\footins}\fi
	\@next\@currbox\@currlist{\ifnum\count\@currbox	>\z@
	    \@addtocurcol\else\@addmarginpar\fi}\@latexbug
    \ifnum \outputpenalty <\z@ \penalty	\z@ \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}

\def\@makecol{\ifvoid\footins \setbox\@outputbox\box\@cclv
   \else\setbox\@outputbox
     \vbox{\unvbox\@cclv\vskip\skip\footins\footnoterule\unvbox\footins}\fi
     \xdef\@freelist{\@freelist\@midlist}\gdef\@midlist{}\@combinefloats
     \setbox\@outputbox\vbox to\@colht{\boxmaxdepth\maxdepth
	\@texttop\unvbox\@outputbox \@textbottom}\global\maxdepth\@maxdepth}

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

\def\@outputpage{\begingroup\catcode`\ =10 \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@
	   \vskip \topmargin \moveright\@themargin
	   \vbox{\setbox\@tempboxa
		   \vbox to\headheight{\vfil \hbox to\textwidth{\@thehead}}
		 \dp\@tempboxa\z@
		 \box\@tempboxa
		 \vskip	\headsep
		 \box\@outputbox
		 \baselineskip\footskip
		 \hbox to\textwidth{\@thefoot}}}\global\@colht\textheight
	   \endgroup\stepcounter{page}\let\firstmark\botmark}


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

\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\z@ \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
 

