summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/nath
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-13 00:00:23 +0000
committerKarl Berry <karl@freefriends.org>2006-01-13 00:00:23 +0000
commit52ea84dcce84fa00ac4343ffae0295ff27578a2c (patch)
tree936f3018cc58f71e887887829bc6d1f27f2aaf67 /Master/texmf-dist/tex/latex/nath
parent15bac7ccf63ef065ec9c38e2240c46e69cbf0c75 (diff)
nath
git-svn-id: svn://tug.org/texlive/trunk@1129 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/nath')
-rw-r--r--Master/texmf-dist/tex/latex/nath/nath.sty3190
1 files changed, 3190 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/nath/nath.sty b/Master/texmf-dist/tex/latex/nath/nath.sty
new file mode 100644
index 00000000000..50ae4da23c6
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/nath/nath.sty
@@ -0,0 +1,3190 @@
+% NATH.STY --- a LaTeX document style implementing NAtural maTH notation
+%
+% Copyright (c) 1996-2003 by Michal Marvan
+%
+
+\ifx\nathstyle\undefined
+\else \typeout{NATH.STY will not be loaded twice.}
+ \expandafter\endinput
+\fi
+
+\newlinechar`\^^J
+
+\typeout{^^JNath as of 21 March 2003
+ ^^JImplementing NAtural maTH notation}
+%
+% U s a g e
+%
+% \documentstyle[nath]{article}
+%
+% or
+%
+% \documentclass{article}
+% \usepackage{nath}
+%
+
+%
+% L i c e n s e
+%
+
+% Nath is a free software distributed under the terms of the GNU General
+% Public License <http://www.gnu.org/copyleft/gpl.html> as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% In particular, Nath comes with ABSOLUTELY NO WARRANTY.
+
+%
+% O p t i o n s
+%
+
+% Options may be also set in the body by \nathstyle.
+
+\def\nathstyle#1{\@for\@tempa:={#1}\do{\expandafter\nathstyle@\@tempa==\relax}%
+ \ignorespaces}
+
+\def\on@@@{on}
+\def\off@@@{off}
+
+\def\nathstyle@#1=#2=#3{\def\@tempa{#1}%
+ \expandafter\ifx\csname if#1\endcsname\relax
+ \n@err{Unknown nath style}{I am ignoring the option `#1' in \nathstyle}
+ \else \def\@tempb{#2}% #3 is `\relax' or `='
+ \ifx\@tempb\empty \csname #1true\endcsname \else
+ \ifx\@tempb\on@@@ \csname #1true\endcsname \else
+ \ifx\@tempb\off@@@ \csname #1false\endcsname \else
+ \n@err{Invalid argument in \string\nathstyle}%
+ {Nath style argument must be either name or name=on or name=off}%
+ \fi\fi\fi
+ \fi}
+
+\newif\ifgeometry
+\newif\iftensors
+\newif\ifleqno
+\newif\ifdebug
+\newif\ifsilent
+
+%
+% E r r o r m e s s a g e s a n d w a r n i n g s
+%
+
+% Nath errors are marked by a black box, sometimes wrongly placed.
+
+\def\natherrormark{\hbox{\vrule \@height\prorated@ em \@width\prorated@ ex}}
+
+\def\n@err#1#2{\errhelp\expandafter{#2}\errmessage{#1}\natherrormark}
+
+\def\n@warning#1{\ifsilent\else\typeout{Nath Warning: #1\on@line.}\fi}
+
+\ifx\Nath\undefined\else
+ \n@warning{NATH.STY will not be loaded again}
+\expandafter\endinput\fi
+
+%
+% F o n t s
+%
+
+% This style does not introduce any new fonts. It is recommended (but not
+% required) to have a standard set of AMS fonts introduced independently.
+
+%
+% D i m e n s i o n s
+%
+
+% A new dimension called \mex (math ex) is equal to 1 ex prorated
+% according to the level of \mathcount@ (see currstyle)
+
+\newdimen\mex
+\mex=1ex
+
+% Approximately, 1 mex = 8 mu, but can be used where mu cannot, e.g,
+% with \ifdim, height, depth, width, etc.
+
+\def\prorated@{\ifcase\mathcount@ 1 \or.7 \else.5 \fi}
+
+%
+% P r o t e c t e d d e f s
+%
+
+% I want that all math commands are robust:
+
+\newtoks\protect@toks
+
+\def\pdef#1{\protect@toks=\expandafter{\the\protect@toks
+ \pdef@#1}%
+ \def#1}
+
+\def\pdef@#1{\def#1{\protect#1}}
+
+% ... even begin and end
+
+\let\o@begin\begin
+\pdef\begin{\o@begin}
+
+\let\o@end\end
+\pdef\end{\o@end}
+
+% Macro to make an existing command robust
+
+\def\makerobust#1{%
+ \expandafter\let\csname @o@\expandafter\@gobble\string #1\endcsname=#1
+ \edef#1{\noexpand\protect
+ \expandafter\noexpand\csname @o@\expandafter\@gobble\string #1\endcsname}}
+
+% Making composed math symbols robust:
+
+\makerobust\cong
+\makerobust\notin
+
+%
+% C o n t r o l m a c r o s
+%
+
+% Here is a global version of TeX's loop macro:
+
+\def\g@loop#1\repeat{\gdef\g@body{#1}\g@iterate}
+
+\def\g@iterate{\g@body\global\let\gnext=\g@iterate
+ \else \global\let\gnext=\relax \fi
+ \gnext}
+
+% Some tests put their result into \ifresult@
+
+\newif\ifresult@
+
+\def\old#1{\csname o@#1\endcsname}
+
+%
+% S t a c k s
+%
+
+\def\put@#1#2{\edef#2{#1\relax#2}}
+
+\def\get@#1#2{\expandafter\get@@#2\endget@@#1#2}
+
+\def\get@@#1\relax#2\endget@@#3#4{\edef#3{#1}\edef#4{#2}}
+
+%
+% M a t h c o d e s
+%
+
+% Many characters are live (\mathcode = "8000) in math mode.
+
+% After saving their original mathcodes:
+
+\edef\mc@lparenthesis{\mathchar\the\mathcode`(\relax}
+\edef\mc@rparenthesis{\mathchar\the\mathcode`)\relax}
+\edef\mc@lbrack{\mathchar\the\mathcode`[\relax}
+\edef\mc@rbrack{\mathchar\the\mathcode`]\relax}
+\edef\mc@comma{\mathchar\the\mathcode`,\relax}
+\edef\mc@semicolon{\mathchar\the\mathcode`;\relax}
+\edef\lt{\mathchar\the\mathcode`<\relax}
+\edef\gt{\mathchar\the\mathcode`>\relax}
+\edef\mc@factorial{\mathchar\the\mathcode`!\relax}
+\edef\mc@slash{\mathchar\the\mathcode`/\relax}
+\edef\vert{\mathchar\the\mathcode`|\relax}
+
+% we assign new ones:
+
+\mathcode`\(="8000 \mathcode`\[="8000 \mathcode`\<="8000
+\mathcode`\)="8000 \mathcode`\]="8000 \mathcode`\>="8000
+\mathcode`\,="8000 \mathcode`\;="8000 \mathcode`\^="8000
+\mathcode`\!="8000 \mathcode`\`="8000 \mathcode`\_="8000
+
+% Before defining live characters, one must call \livechars@ to
+% set catcodes to 13 (active).
+
+\def\livechars@{
+ \catcode`\(=13 \catcode`\[=13 \catcode`\<=13
+ \catcode`\)=13 \catcode`\]=13 \catcode`\>=13
+ \catcode`\,=13 \catcode`\;=13
+ \catcode`\!=13 \catcode`\`=13}
+
+\def\killchars@{
+ \catcode`\(=12 \catcode`\[=12 \catcode`\<=12
+ \catcode`\)=12 \catcode`\]=12 \catcode`\>=12
+ \catcode`\,=12 \catcode`\;=12
+ \catcode`\!=12 \catcode`\`=12}
+
+% Here are the definitions:
+
+\livechars@
+
+\def({\delim@l 1\ch@lparenthesis}
+\def){\delim@r 1\ch@rparenthesis}
+\def[{\delim@l 1\o@lbrack}
+\def]{\delim@r 1\o@rbrack}
+\def!{\factorial}
+\def,{\@comma}
+\def;{\@semicolon}
+\def`{\abbreviation}
+
+% Every math calls \mathoptions@on to set live definition of <, >
+% depending on the current value of ifgeometry; and to set
+% fontdimens according to the current value of iftensors
+
+% The following control sequences contain
+
+\def\mathoptions@on{%
+ \ifgeometry % if geometry=on
+ \def<{\delim@l 1\o@langle}%
+ \def>{\delim@r 1\o@rangle}%
+ \else % if geometry=off
+ \def<{\lt}%
+ \def>{\gt}%
+ \fi
+ \iftensors % if tensors=on
+ \edef\fdviii@textfontiii{\the\fontdimen8\textfont3}%
+ \edef\fdxiii@textfontii{\the\fontdimen13\textfont2}%
+ \edef\fdxiv@textfontii{\the\fontdimen14\textfont2}%
+ \edef\fdxv@textfontii{\the\fontdimen15\textfont2}%
+ \edef\fdxvi@textfontii{\the\fontdimen16\textfont2}%
+ \fontdimen 8\textfont3=.075ex% 1/4 of min superscript/subscript clearance
+ \fontdimen13\textfont2=1.3ex% min superscript shift in displaystyle
+ \fontdimen14\textfont2=1.3ex% min superscript shift otherwise
+ \fontdimen15\textfont2=1.3ex% min superscript shift in restricted style
+ \fontdimen16\textfont2=.65ex% min subscript shift if no superscript
+ \fontdimen17\textfont2=0ex% min subscript shift if no superscript
+ \relax
+ \fi
+}
+
+\def\mathoptions@off{%
+ \iftensors
+ \fontdimen 8\textfont3=\fdviii@textfontiii
+ \fontdimen13\textfont2=\fdxiii@textfontii
+ \fontdimen14\textfont2=\fdxiv@textfontii
+ \fontdimen15\textfont2=\fdxv@textfontii
+ \fontdimen16\textfont2=\fdxvi@textfontii
+ \relax
+ \fi}
+
+
+\killchars@
+
+%
+% D o l l a r s
+%
+
+% Math mode is inline or displayed.
+% Top level macros to start either mode are:
+
+% To start use
+% ---------------- ------------------------
+% inline math $ ... $
+% displayed math $$ ... $$ or \[ ... \]
+% or math environments such
+% as equation, eqns, eqns*
+
+% The $ is active (catcode = 13).
+%
+% The original $ (catcode = 3) is stored in \o@dollar.
+% \o@math is the original $ followed by \relax.
+% \o@display is the original double $$.
+
+\let\o@dollar=$
+\def\o@math{\o@dollar\relax} % calls \everymath
+\def\o@display{\o@dollar\o@dollar} % calls \everydisplay
+
+% \everymath and \everydisplay
+
+\everymath{} % keep empty
+\everydisplay{} % keep empty
+
+
+\catcode`\$=13
+
+\def$#1${\@@dollar{#1}}
+
+\pdef\@@dollar#1{%
+ \ifmmode\else\begingroup\fi % no begingroup if closing $
+ \def\next{#1}%
+ \ifx\next\empty % if $$
+ \ifmmode % if closing $$
+ \] \def\next{\endgroup\ignorespaces}%
+ \else \[ \def\next{\relax}%
+ \fi
+ \else % if $; #1 = the whole content between $'s
+ \imath@{#1}%
+ \let\next\endgroup
+ \fi
+ \next}
+
+\catcode`\$=3
+
+
+% $'s eventually call internal commands to start math mode, which are
+% \imath@{ ... }
+% ... \dmathoff@
+
+\def\dmathon@{\o@math
+ \setbox\sizebox\delimstrut@ % initialize sizebox
+ \begingroup
+ \mathoptions@on
+ \displayon@ % start displayed
+}
+
+% \dmathoff@ == end displayed style
+% end group
+
+\def\dmathoff@{\enddisplaydelims@
+ \mathoptions@off
+ \endgroup
+ \o@math}
+
+\def\imath@#1{\mathoptions@on\o@math\inline{#1}\o@math\mathoptions@off}
+
+\def\(#1\){\imath@{#1}}
+
+% The math environment is disabled
+
+\def\math{\n@err{Disabled environment. Use $ to begin math}
+ {I am inserting $ to start inline math mode.}\o@math}
+\def\endmath{\n@err{Obsolete command. Use $ to end math.}
+ {I am inserting $ to end inline math mode.}\o@math}
+
+%
+% G e n e r i c d i s p l a y m a t h m a c r o
+%
+
+% $$, \[, \], and all displayed math environments use low-level macros
+% make@eq/endmake@eq to format a displayed formula.
+% Usage:
+%
+% \o@display \make@eq
+% ...
+% \endmake@eq \o@display
+
+% There is a dimension register called \mathindent to control the
+% positioning. If \mathindent > 0, formulas are left-indented that
+% amount, otherwise they are centered.
+
+\newdimen\mathindent
+\mathindent=4pc
+
+\newdimen\disp@box@width
+\newdimen\disp@width
+
+\let\o@label=\label % store the original \label
+
+\newif\ifmultiline@
+
+\let\o@eqno=\eqno % store the TeX's \eqno
+\let\o@leqno=\leqno % store the TeX's \leqno
+
+\def\make@eq{%
+ \global\let\do@eqno=\curr@eqno
+ \def\the@eqlabel{}%
+ \def\label##1{\gdef\the@eqlabel{##1}}%
+ \display@true
+ \nodisplay@false
+ \protectinline@false
+ \ifdim\mathindent<0pc % if centered then nothing
+ \else % if flushleft
+ \disp@box@width=\linewidth \advance\disp@box@width -\mathindent
+ \disp@width=\disp@box@width \advance\disp@width -\mathindent
+ \hbox to \disp@width\bgroup
+ \vbox\bgroup % \ifdebug\hrule\fi
+ \hsize\disp@box@width
+ \parindent=0pt
+ \parfillskip=0pt
+ \leavevmode\o@math
+ \fi
+ \global\multiline@false
+ \setbox0 \vbox\bgroup} % starting (multiline) vbox
+
+\def\endmake@eq{\egroup % ending (multiline) vbox
+ \ifeqnumbering@
+ \ifmultiline@
+ \vcenter{\box0} % make the equation number vertically centered
+ \else \box0
+ \fi
+ \ifdim\mathindent<0pc % if centered
+ \ifleqno\else \o@eqno{\do@eqno}\fi
+ \else % if flushleft
+ \o@math
+ \hfil\null
+ \ifleqno\else \hfil\null\hfil \hbox{\do@eqno} \fi
+ \egroup
+ \hss\egroup
+ \fi
+ \ifleqno \o@leqno{\do@eqno} \fi
+ \else % if no numbering
+ \ifdim\mathindent<0pc % if centered
+ \box0
+ \else \box0\o@math \hfil \null\egroup \hss \egroup
+ \fi
+ \fi
+}
+
+% The purpose of the vbox with parfillskip = 0 and triple filling
+% is that the equation number will go on the line following the
+% formula if the formula is too long.
+
+% Catch the global option `leqno':
+
+\def\ds@leqno{\leqnotrue}
+
+%
+% D i s p l a y l i n e s a n d b l o c k s
+%
+
+% A single natural-width hbox with displayed material inside
+% is produced by \displayline@.
+
+% Here is the skip between adjacent displaylines
+
+\newskip\interdisplayskip
+\interdisplayskip=1.67 ex
+
+% An empty displayline must not produce any vertical space.
+% Empty is if of length < or = to zero
+
+\def\displayline@{\setbox0\hbox\bgroup
+ \o@math\dcurrstyle@}
+
+\def\enddisplayline{\o@math\egroup
+ \ifdim\wd0>0pt \box0
+ \else \box0
+ \vskip-\interdisplayskip
+ \fi}
+
+% The formula inside may actually be a wall-return block, i.e.,
+% may be multiline.
+
+% A multiline block is a top-aligned vbox, followed by new line.
+% The command to start a block is \wall, the command to end it
+% is \return. Adjacent returns must not generate an empty line.
+%
+% \wall
+% formula; lines separated with \\
+% \return
+%
+
+\newif\ifinnerwall@ % if inside another wall-return block
+\innerwall@false
+
+% We define generic \d@wall and \d@return here. Actual wall and return
+% are defined in displaydelims, after some escape machinery.
+
+\def\d@wall#1{\hbox\bgroup
+%\ifdebug\vrule\@width 1pt\fi
+ \vtop\bgroup\offinterlineskip
+ \if0#1 % if wall
+ \edef\pad@{\relax}
+ \else % if shifted
+ \edef\pad@{\pad@\@cdr#1\@nil}
+ \fi
+ \innerwall@true
+ \displayline@
+}
+
+\def\d@return{\enddisplayline
+ \egroup % end vtop
+%\ifdebug\vrule \@width 1pt\fi
+ \egroup % end hbox
+ \ifinnerwall@ \curr@cr \fi
+}
+
+%Inside any wall-return block, \\ should be \d@cr:
+
+\def\d@cr#1{\enddisplayline\vskip\interdisplayskip
+ \global\multiline@true
+ \displayline@
+ #1 % may be \pad@ or \relax
+ }
+
+%If \wall is misplaced
+
+\newif\ifwallallowed@
+\wallallowed@true
+
+%
+% D i s p l a y m a t h e n v i r o n m e n t s
+%
+
+% A single equation; unnumbered:
+%
+% $$ complete formula $$
+% or
+% \[ complete formula \]
+
+% numbered:
+%
+% \begin{equation} complete formula \end{equation}
+
+% A pile of equations; unnumbered:
+%
+% \begin{eqns*}
+% complete formulas separated with \\
+% \end{eqns*}
+
+% numbered:
+%
+% \begin{eqns}
+% complete formulas separated with \\
+% \end{eqns}
+
+% holding the same number; followed by a letter:
+%
+% \begin{eqnabc}
+% complete formulas separated with \\
+% \end{eqnabc}
+
+% The environments set ifeqnumbering@
+% and call make@eq.
+% $$, \[ and \begin{equation} start a wall-return block.
+% This means that
+
+\def\[{\begingroup
+ \global\eqnumbering@false
+ \curr@cr@is@wall@cr
+ \o@display\make@eq\hbox\bgroup\dmathon@\wall\mathopen{}}
+
+\def\]{\return\dmathoff@\egroup\endmake@eq\o@display
+ \endgroup\ignorespaces}
+
+\newif\ifeqnumbering@ % global
+
+\def\equation{\begingroup
+ \global\eqnumbering@true
+ \curr@cr@is@wall@cr
+ \o@display\make@eq\hbox\bgroup\dmathon@\wall\mathopen{}}
+
+\def\endequation{\return\dmathoff@\egroup\endmake@eq\o@display
+ \endgroup \global\@ignoretrue}
+
+% Unnumbered equation for backward compatibility
+
+\expandafter\def\csname equation*\endcsname{\[}
+\expandafter\def\csname endequation*\endcsname{\]\global\@ignoretrue}
+
+% Important! The \mathopen{} after \wall protects active characters from
+% being scanned prematurely.
+
+\def\eqns{\begingroup
+ \belowdisplayskip@=\belowdisplayskip
+ \belowdisplayskip=0pt
+ \belowdisplayshortskip=0pt
+ \global\eqnumbering@true
+ \def\curr@cr{\eqns@cr \global\eqnumbering@true}
+ \let\\\curr@cr
+ \postdisplaypenalty=9999
+ \belowdisplayshortskip=\belowdisplayskip
+ \o@display\make@eq\hbox\bgroup\dmathon@}
+
+\def\endeqns{\dmathoff@\egroup
+ \endmake@eq\o@display
+ \vskip\belowdisplayskip@
+ \endgroup
+ \global\@ignoretrue
+ \noindent}
+
+\expandafter
+\def\csname eqns*\endcsname{\begingroup
+ \belowdisplayskip@=\belowdisplayskip
+ \belowdisplayskip=0pt
+ \belowdisplayshortskip=0pt
+ \global\eqnumbering@false
+ \def\curr@cr{\eqns@cr \global\eqnumbering@false}
+ \let\\\curr@cr
+ \postdisplaypenalty=10000
+ \belowdisplayshortskip=\belowdisplayskip
+ \o@display\make@eq\hbox\bgroup\dmathon@}
+
+\expandafter
+\def\csname endeqns*\endcsname{\endeqns}
+
+\def\eqns@cr{\dmathoff@\egroup\endmake@eq\o@display
+ \hrule\@height 0pt
+ \abovedisplayshortskip=0pt plus 0pt minus 0pt
+ \vglue\intereqnsskip
+ \hrule\@height 0pt
+ \o@display \make@eq\hbox\bgroup\dmathon@}
+
+\def\nonumber{\global\eqnumbering@false}
+
+\def\numbered{\global\eqnumbering@true}
+
+\newskip\intereqnsskip
+\intereqnsskip=1ex
+
+\newskip\belowdisplayskip@
+
+%
+% E q u a t i o n n u m b e r i n g
+%
+
+% Displaymath (namely \endmake@eq) calls \do@eqno to create the
+% equation number. At the beginning of each display, \do@eqno is
+% set to \curr@eqno. Numbering macros should define \curr@eqno,
+% while \eqno changes \do@eqno directly.
+
+% \do@eqno calls \make@eqno, a generic command to make its
+% argument into both the equation number and the currentlabel.
+
+\def\make@eqno#1{\def\make@eqno@{#1} % \rm removed thanks to E.H. Lohse
+ \def\@currentlabel{\make@eqno@}
+ \ifx\the@eqlabel\empty \n@warning{No label in equation (#1)}
+ \else
+ \ifeqnumbering@ \o@label{\the@eqlabel}
+ \else \n@warning{Label occurs in an unnumbered formula}
+ \fi
+ \fi
+ \hbox{\rm(\make@eqno@)%
+ \ifnum\overfullrule>0 % if draft
+ \hbox to 0pt{\hglue 1pc``{\tt\the@eqlabel}''\hss}%
+ \fi}%
+}
+
+% The command \eqno defines \do@eqno to call \make@eqno on the
+% \eqno's argument.
+
+\def\eqno#1{\global\eqnumbering@true \gdef\do@eqno{\make@eqno{#1}}}
+
+% Default \curr@eqno creates the default numbering (N), where
+% N is the current value of \theequation, stepped each time
+% \curr@eqno is called.
+
+\def\curr@eqno{\refstepcounter{equation}
+ \make@eqno{\theequation}}
+
+% subabc is an environment to change numbering from (1), (2), (3)
+% to (1a), (1b), (1c), i.e., to (NL) where N is the value of
+% \theequation (stepped only when the environment starts) and L is
+% the letter corresponding to the current value of the counter
+% eqnabc (stepped each time \curr@eqno is called, starting
+% from 0 in the beginning of subabc).
+
+\newcount\c@eqnabc
+
+\def\subabc{\refstepcounter{equation}
+ \c@eqnabc=0
+ \def\curr@eqno{\refstepcounter{eqnabc}
+ \make@eqno{\theequation\alph{eqnabc}}}
+}
+
+\def\endsubabc{\global\@ignoretrue}
+
+%
+% A l i g n m e n t e n v i r o n m e n t s
+%
+
+\newskip\displaylineskip
+\newskip\displaybaselineskip
+\newdimen\displaylineskiplimit
+
+\displaylineskip=1.2ex plus 0.2ex
+\displaybaselineskip=3.8ex plus 0.2ex
+\displaylineskiplimit=.01ex
+
+\def\dmstrut@{\hbox{\vrule\@height 1.7ex\@depth .7ex\@width 0ex}}
+
+\newdimen\eqnnumlowering@
+
+\def\eqnarray{%
+ \global\let\do@eqno=\curr@eqno
+ \def\the@eqlabel{}%
+ \def\label##1{\gdef\the@eqlabel{##1}}%
+ \x@eqnarray}
+
+\expandafter\def\csname eqnarray*\endcsname{\def\@eqnarray@cr{\cr}
+ \x@eqnarray}
+
+\def\x@eqnarray{%
+ \ifdim\mathindent<\z@ \mathindent=-\mathindent
+ \n@warning{Negative \mathindent in eqnarray}
+ \fi
+ \o@display\make@eq
+ \def\curr@cr{\@eqnarray@cr
+ \global\multiline@false
+ \global\eqnumbering@true
+ \global\let\do@eqno=\curr@eqno}
+ \let\\\curr@cr
+ \global\eqnumbering@true
+ \vbox\bgroup %%%%
+ \ddelimalign@errhelp
+ \displaydefs@
+ \lineskip\displaylineskip \baselineskip\displaybaselineskip
+ \lineskiplimit\displaylineskiplimit
+ \ialign to\disp@box@width
+ \bgroup
+ \gdef\missing@tabs{&&&}%
+ \hfil\hbox{\wallallowed@false\dmathon@\dmstrut@##\dmathoff@}%
+ \tabskip 0pt
+ \gdef\missing@tabs{&&}%
+ &\hfil\hbox{\wallallowed@false\o@dollar\null##\null\o@dollar}\hfil
+ \tabskip 0pt
+ \gdef\missing@tabs{&}%
+ &\setbox0\vbox{\hbox{\o@dollar\dmathon@\dmstrut@\mathopen{}##\dmathoff@
+ \o@dollar}}%
+ \global\eqnnumlowering@=0pt
+ \global\advance\eqnnumlowering@\dp0
+ \box0\hfil
+ \tabskip 0pt plus 1000pt
+ \gdef\missing@tabs{}%
+ &\setbox0\llap{##}%
+ \ifmultiline@ \lower.5\eqnnumlowering@\box0
+ \else \box0
+ \fi \tabskip 0pt\crcr}
+
+\def\endeqnarray{
+ \@eqnarray@cr
+ \egroup\egroup
+ \global\eqnumbering@false
+ \endmake@eq\o@display
+ \global\@ignoretrue}
+
+\expandafter\def\csname endeqnarray*\endcsname{\endeqnarray}
+
+\def\@eqnarray@cr{\missing@tabs
+ \ifeqnumbering@\do@eqno\fi
+ \global\@eqnswtrue\crcr
+}
+
+\def\eqnsabc{\subabc\eqns}
+
+\def\endeqnsabc{\endeqns\endsubabc}
+
+\def\eqnarrayabc{\subabc\eqnarray}
+
+\def\endeqnarrayabc{\endeqnarray\endsubabc}
+
+\def\ddelimalign@errhelp{\def\ldelim@errhelp{%
+ Alignments interfere badly with display mode of delimiters.
+ ^^JEvery alignment cell must be balanced.
+ ^^JWhen cells are as follows:
+ ^^J alignment A & B1 \\ & B2 \\ & ... endalignment
+ ^^Jthen alignment may be replaced with
+ ^^J ... A \wall B1 \\ B2 \\ ... \return}
+ \let\rdelim@errhelp\ldelim@errhelp}
+
+% The purpose of LaTeX alignment math environments eqnarray
+% and eqnarray* is, basically, to align binary relation symbols
+% in two typographically relevant situations:
+%
+% (1) a long formula broken into n lines;
+% (2) a pile of n distinct formulas, one below another.
+
+% In case (1), a single wall-return block provides a simple solution
+% that saves the 2n alignment symbols `&' required by eqnarray:
+%
+% A \wall = B1 \\
+% = B2 \\
+% ...
+%
+% = Bn \return
+%
+% In case (2), the alignment of relation symbols is somewhat
+% controversial; this style provides limited support for it.
+
+%
+% P a r a g r a p h i t e m s
+%
+
+\expandafter\ifx\csname paritemwd\endcsname\relax
+ \newdimen\paritemwd\paritemwd=2pc
+\fi
+
+\def\paritem#1{%
+ \ifmmode
+ \ifdisplay@
+ \ifdim\mathindent<0pt % if centered formula
+ \ifleqno % equation numbers on the left
+ \paritem@leqno{#1}
+ \else
+ \n@err{Disallowed \string\paritem}
+ {Sorry, I am not programmed to handle this case.
+ ^^JSet \mathindent to a positive length to
+ circumvent the problem.}
+ \fi
+ \else % if left-aligned formula
+ \ifleqno % equation numbers on the left
+ \paritem@leqno{#1}
+ \else
+ \llap{\hbox to \mathindent{\paritem@{#1}\hfil}}
+ \fi
+ \fi
+ \else \n@err{Misplaced \string\paritem}
+ {It is disallowed to start \paritem in inline math mode}
+ \fi
+ \else
+ \par\noindent\paritem@{#1}\kern 1ex
+ \fi
+ \ignorespaces}
+
+\def\paritem@#1{\hbox to\paritemwd{\hss\rm#1}\ignorespaces}
+
+\def\paritem@leqno#1{
+ \ifeqnumbering@
+ \n@warning{Left numbering superseded by \string\paritem}
+ \else \global\eqnumbering@true
+ \fi
+ \global\def\do@eqno{\paritem@{#1}}
+}
+
+%
+% M a t h m o d e s
+%
+
+% The four math styles of plain TeX (displaystyle, textstyle, scriptstyle,
+% scriptscriptstyle) are abandoned.
+% We distinguish two math mode: inline and displayed.
+% They must always apply to a whole subformula and it is not possible to
+% switch between them arbitrarily.
+
+% While in math mode,
+
+% to start use
+% ---------------- ------------------------
+% inline style \inline{ ... }
+% displayed style \displayed{ ... }
+
+% displayed
+
+\newif\ifnodisplay@
+
+\def\displayon@{%
+ \ifnodisplay@ \n@err{Misplaced displayed}%
+ {Do not start display mode between inline delimiters.}%
+ \else \mspaces@
+ \displaydelims@ \dcurrstyle@
+ \fi}
+
+\def\displayoff@{\enddisplaydelims@}
+
+\pdef\displayed#1{\displayon@#1\displayoff@}
+
+\def\mspaces@{\relax}
+
+% Inline -- I want that user macros expand to reveal Nath behind them
+
+\newif\ifprotectinline@
+\protectinline@true
+
+\pdef\inline#1{%
+ \begingroup
+ \ifprotectinline@
+ \begingroup
+ \the\protect@toks
+ \def\protect{\noexpand}
+ \xdef\inline@{\noexpand\wrapfrac@{ #1}}
+ \endgroup
+ \protectinline@false
+ \else
+ \def\inline@{\wrapfrac@{#1}}%
+ \fi
+ \display@false
+ \inlinedelims@\icurrstyle@
+ \inline@
+ \ldelim@warningcheck{\idelimlevel@}%
+ \endgroup}
+
+% We need a script level count
+
+\newcount\mathcount@ % means the level of sub- and super-script (0,1,2,...)
+
+% and an \ifdisplay
+
+\newif\ifdisplay@ % if a displayed formula
+
+% We store the four math style switches for future use.
+
+\let\o@displaystyle=\displaystyle
+\let\o@textstyle=\textstyle
+\let\o@scriptstyle=\scriptstyle
+\let\o@scriptscriptstyle=\scriptscriptstyle
+
+% We redefine \displaystyle and \textstyle; their original effect is disabled.
+% \displaystyle is useful in the context of the principle of smallest fences.
+%
+% We also redefine \scriptstyle and \scriptscriptstyle to advance \mathcount@
+% by 1 and 2, respectively.
+% Observe that \scriptstyle\scriptstyle now has the same effect as
+% \scriptscriptstyle
+
+\def\displaystyle{\setbox0
+ \hbox{\vrule\@height 3.2\mex \@depth 2\mex \@width 1pt}%
+ \resizebox@0}
+
+\let\textstyle\relax
+
+\def\scriptstyle{\advance\mathcount@1 \currstyle@}
+
+\def\scriptscriptstyle{\advance\mathcount@2 \currstyle@}
+
+%
+% M a t h s i z e s
+%
+
+\newdimen\delimaxis@
+\newdimen\strutsize@
+
+\delimaxis@=.3ex
+\strutsize@=2.1ex
+
+\def\delimstrut@{\hbox{\@tempdima=\delimaxis@ \@tempdimb=\delimaxis@
+ \advance\@tempdima .5\strutsize@ \advance\@tempdimb -.5\strutsize@
+ \vrule height\prorated@\@tempdima depth\prorated@\@tempdimb width 0pt}}
+
+\def\dcurrstyle@{\display@true
+ \ifcase\mathcount@ \o@displaystyle \mex=1ex
+ \or\o@scriptstyle \mex=.7ex
+ \else\o@scriptscriptstyle \mex=.5ex
+ \fi}
+
+\def\icurrstyle@{\display@false
+ \ifcase\mathcount@ \o@textstyle \mex=1ex
+ \or\o@scriptstyle \mex=.7ex
+ \else\o@scriptscriptstyle \mex=.5ex
+ \fi}
+
+\def\currstyle@{%
+ \ifcase\mathcount@ \mex=1ex
+ \ifdisplay@\o@displaystyle
+ \else\o@textstyle
+ \fi
+ \or\o@scriptstyle \mex=.7ex
+ \else\o@scriptscriptstyle \mex=.5ex
+ \fi}
+
+% One step smaller than currstyle is \iscriptstyle@:
+
+\def\iscriptstyle@{\display@false\scriptstyle}
+
+\def\currstyle@hbox#1{%
+ \ifdisplay@
+ \hbox{\dmathon@\dcurrstyle@ #1%
+ \global\setbox\sizebox@\box\sizebox
+ \dmathoff@}%
+ \resizebox@{\sizebox@}%
+ \else
+ \hbox{\imath@{\icurrstyle@#1}}%
+ \fi}
+
+\def\scriptstylehbox@#1{\hbox{\imath@{\iscriptstyle@#1}}}
+
+% Frame around a subformula
+
+\let\o@fbox\fbox
+
+\pdef\framed#1{\o@fbox{\o@math\currstyle@hbox{#1}\o@math}}
+
+% A repeated sizebox:
+
+\def\samesize@{\mathopen{}\copy\sizebox}
+
+% We redefine \mathpalette and \mathchoice, although they are no
+% more needed
+
+\def\mathpalette#1#2{{#1\currstyle@{#2}}}
+
+\def\mathchoice#1#2#3#4{%
+ \ifcase\mathcount@
+ \ifdisplay@ #1 \else #2 \fi
+ \or #3
+ \else #4
+ \fi }
+
+%
+% R e s t r i c t e d m o d e
+%
+
+\newif\iftoprestricted@
+\toprestricted@true
+
+\newif\ifbotrestricted@
+\botrestricted@true
+
+%
+% T e x t
+%
+
+\newtoks\curr@rm % global needed?
+
+\pdef\text#1{\mathclose{}\text@
+ \hbox\expandafter{\protect\the\curr@rm #1}\mathopen{}
+ \penalty\punctpenalty\relax} % Fixed 5.9.2002 thanks to Hedevang Lohse
+
+\def\text@{%
+ \ifcase\mathcount@ \global\curr@rm\expandafter{\the\textfont0 }%
+ \or \global\curr@rm\expandafter{\the\scriptfont0 }%
+ \else \global\curr@rm\expandafter{\the\scriptscriptfont0 }%
+ \fi}
+
+%
+% S i z i n g c o m m a n d s
+%
+
+% The size of delimiters is determined by the ``heavy'' part of the
+% sub formula enclosed. ``Ignorable'' elements (sub- and superscripts,
+% diacritics) do not contribute.
+
+% We use a local box register called \sizebox. Although empty,
+% it has its height and depth, equal to the height and depth of the
+% ``main part'' of the current subformula in displayed style.
+
+\newbox\sizebox % local
+\newbox\sizebox@ % global
+
+\def\setsize@#1{%
+ \ifdisplay@
+ \setbox0\hbox{\o@math\dcurrstyle@#1\o@math}%
+ \resizebox@{0}%
+ \fi}
+
+% Called by \setsize@ and \currstyle@hbox, the command \resizebox@ compares
+% vertical dimensions of \sizebox to those of box#1 and sets them to
+% whichever is bigger.
+
+\def\resizebox@#1{%
+ \ifdim\ht\sizebox<\ht#1 \ht\sizebox=\ht#1 \fi
+ \ifdim\dp\sizebox<\dp#1 \dp\sizebox=\dp#1 \fi}
+
+% A debugging tool - visualize vertical dimensions of certain boxes
+
+\def\showverticaldimensionsofthebox#1{%
+ \hbox{\vrule \@height \ht#1 \@depth \dp#1 \@width .667pt}}
+
+% Sizing commands for every large operator from TeXbook p. 435
+
+\let\o@sum=\sum
+\let\o@prod=\prod
+\let\o@coprod=\coprod
+\let\o@int=\int
+\let\o@oint=\oint
+\let\o@bigcap=\bigcap
+\let\o@bigcup=\bigcup
+\let\o@bigsqcup=\bigsqcup
+\let\o@bigvee=\bigvee
+\let\o@bigwedge=\bigwedge
+\let\o@bigodot=\bigodot
+\let\o@bigotimes=\bigotimes
+\let\o@bigoplus=\bigoplus
+\let\o@biguplus=\biguplus
+
+\pdef\big@op#1{\setsize@{#1}\mathop{#1}}
+
+\def\sum{\big@op\o@sum}
+\def\prod{\big@op\o@prod}
+\def\coprod{\big@op\o@coprod}
+\def\oint{\big@op\o@oint\nolimits}
+\def\bigcap{\big@op\o@bigcap}
+\def\bigcup{\big@op\o@bigcup}
+\def\bigsqcup{\big@op\o@bigsqcup}
+\def\bigvee{\big@op\o@bigvee}
+\def\bigwedge{\big@op\o@bigwedge}
+\def\bigodot{\big@op\o@bigodot}
+\def\bigotimes{\big@op\o@bigotimes}
+\def\bigoplus{\big@op\o@bigoplus}
+\def\biguplus{\big@op\o@biguplus}
+
+% \int sticks to any following \int.
+
+\pdef\int{\setsize@\o@int \int@stick}
+
+\def\int@stick{\afterassignment\int@stick@\let\next=}
+
+\def\int@stick@{
+ \ifx\next\int
+ \def\next@comm{\intop\int@kern\int}
+ \else
+ \def\next@comm{\intop\nolimits\next}
+ \fi
+ \next@comm}
+
+\def\int@kern{\ifdisplay@ \kern-1.4\mex \else \kern -.9\mex \fi}
+
+%
+% L i v e d e l i m i t e r s
+%
+
+% Every delimiter stands for itself. No additional presentation markup
+% (such as \biggl,\biggr or \left,\right) is needed.
+% Warning: In math mode [,] no more denote optional arguments.
+
+\newcount\idelimlevel@
+
+% Store \TeX's delimiters for character tests
+
+\let\ch@lparenthesis=(
+\let\ch@rparenthesis=)
+
+\let\ch@lbrack=[
+\let\ch@rbrack=]
+
+\let\ch@langle=<
+\let\ch@rangle=>
+
+\let\o@lbrack=\lbrack
+\let\o@rbrack=\rbrack
+
+\let\o@lfloor=\lfloor \let\o@lceil=\lceil
+\let\o@rfloor=\rfloor \let\o@rceil=\rceil
+
+\def\o@lbrace{\delimiter"4266308 } \let\{=\o@lbrace
+\def\o@rbrace{\delimiter"5267309 } \let\}=\o@rbrace
+
+\let\o@langle=\langle
+\let\o@rangle=\rangle
+
+\let\o@uparrow=\uparrow
+\let\o@downarrow=\downarrow
+\let\o@updownarrow=\updownarrow
+\let\o@Uparrow=\Uparrow
+\let\o@Downarrow=\Downarrow
+\let\o@Updownarrow=\Updownarrow
+
+\let\o@backslash=\backslash
+\let\o@vert=|
+\let\o@Vert=\Vert
+
+\pdef\{{\delim@l 1\o@lbrace}
+\pdef\}{\delim@r 1\o@rbrace}
+
+\pdef\lvert{\delim@l 1|}
+\pdef\rvert{\delim@r 1|}
+\pdef\lVert{\delim@l 1\Vert}
+\pdef\rVert{\delim@r 1\Vert}
+\pdef\lbrack{\delim@l 1\o@lbrack}
+\pdef\rbrack{\delim@r 1\o@rbrack}
+\pdef\langle{\delim@l 1\o@langle}
+\pdef\rangle{\delim@r 1\o@rangle}
+\pdef\lbrace{\delim@l 1\o@lbrace}
+\pdef\rbrace{\delim@r 1\o@rbrace}
+\pdef\lfloor{\delim@l 1\o@lfloor}
+\pdef\rfloor{\delim@r 1\o@rfloor}
+\pdef\lceil{\delim@l 1\o@lceil}
+\pdef\rceil{\delim@r 1\o@rceil}
+
+\pdef\lBrack{\delim@l 2\o@lbrack}
+\pdef\rBrack{\delim@r 2\o@rbrack}
+\pdef\lAngle{\delim@l 2\o@langle}
+\pdef\rAngle{\delim@r 2\o@rangle}
+\pdef\lFloor{\delim@l 2\o@lfloor}
+\pdef\rFloor{\delim@r 2\o@rfloor}
+\pdef\lCeil{\delim@l 2\o@lceil}
+\pdef\rCeil{\delim@r 2\o@rceil}
+
+% Null delimiters
+
+\pdef\lnull{\delim@l 0.}
+\pdef\rnull{\delim@r 0.}
+
+% Obsolete commands:
+
+\let\Big\relax \let\Bigg\relax
+\let\Bigl\left \let\Biggl\left
+\let\Bigr\right \let\Biggr\right
+\let\Bigm\middle \let\Biggm\middle
+
+%
+% L e f t, r i g h t a n d m i d d l e
+%
+
+% Store \TeX's definitions
+
+\let\o@left=\left
+\let\o@right=\right
+\let\@stop=.
+
+% Here is the new definition for \left:
+
+\livechars@
+
+\pdef\left#1{\left@#1}
+
+\def\left@{\afterassignment\left@@\let\next=}
+
+\def\left@@{\ifx\next\@stop \lnull\else
+ \ifx\next|\delim@l 1\o@vert \else
+ \ifx\next\|\delim@l 1\o@Vert \else
+ \ifx\next\vert\delim@l 1\o@vert \else
+ \ifx\next\Vert\delim@l 1\o@Vert \else
+ \ifx\next\ch@rbrack\delim@l 1\o@rbrack \else
+ \next
+ \fi\fi\fi\fi\fi\fi}
+
+% Here is the new definition for \right:
+
+\pdef\right#1{\right@#1}
+
+\def\right@{\afterassignment\right@@\let\next=}
+
+\def\right@@{\ifx\next\@stop \rnull\else
+ \ifx\next|\delim@r 1\o@vert \else
+ \ifx\next\|\delim@r 1\o@Vert \else
+ \ifx\next\vert\delim@r 1\o@vert \else
+ \ifx\next\Vert\delim@r 1\o@Vert \else
+ \ifx\next\ch@lbrack\delim@r 1\o@lbrack \else
+ \next
+ \fi\fi\fi\fi\fi\fi}
+
+% Here is the new definition for \middle
+% (a bug fixed 21 Sept. 2002 thanks to E.H. Lohse)
+
+\pdef\middle#1{\mathrel{}\middle@#1\mathrel{}}
+
+\def\middle@#1{\def\next{#1}
+ \ifx\next\@stop \else
+ \ifx\next\o@vert\delim@m 1\o@vert \else
+ \delim@m 1#1%
+ \fi\fi}
+
+\killchars@
+
+% Some other middle delimiters:
+
+\def\mid{\middle|}
+
+%
+% D o u b l e
+%
+
+\pdef\double{\afterassignment\double@@\let\next=}
+
+\def\double@@{%
+ \ifx\next\ch@lbrack\delim@l 2\o@lbrack \else
+ \ifx\next\ch@langle\delim@l 2\o@langle \else
+ \ifx\next\ch@rbrack\delim@r 2\o@rbrack \else
+ \ifx\next\ch@rangle\delim@r 2\o@rangle \else
+ \ifx\next|\delim@m 2\o@vert \else
+ \ifx\next\vert\delim@m 2\o@vert \else
+ \ifx\next/\delim@m 2/ \else
+ \ifx\next\backslash\delim@m 2\backslash \else
+ \n@err{Missing delimiter}{\double must be followed by [,],<,> or |}
+ \fi\fi\fi\fi\fi\fi\fi\fi}
+
+\pdef\ldouble{\afterassignment\ldouble@@\let\next=}
+
+\def\ldouble@@{\ifx\next\@stop \lnull\else
+ \ifx\next|\delim@l 2\o@vert \else
+ \ifx\next\vert\delim@l 2\o@vert \else
+ \n@err{Missing delimiter}{\ldouble must be followed by |}\lnull
+ \fi\fi\fi}
+
+\pdef\rdouble{\afterassignment\rdouble@@\let\next=}
+
+\def\rdouble@@{\ifx\next\@stop \rnull\else
+ \ifx\next|\delim@r 2\o@vert \else
+ \ifx\next\vert\delim@r 2\o@vert \else
+ \n@err{Missing delimiter}{\rdouble must be followed by |}\rnull
+ \fi\fi\fi}
+
+
+\def\Mid{\double|}
+
+%
+% T r i p l e
+%
+
+\pdef\triple#1{\triple@ #1}
+
+\def\triple@{\afterassignment\triple@@\let\next=}
+
+\def\triple@@{%
+ \ifx\next\ch@lbrack\delim@l 3\o@lbrack \else
+ \ifx\next\ch@langle\delim@l 3\o@langle \else
+ \ifx\next\ch@rbrack\delim@r 3\o@rbrack \else
+ \ifx\next\ch@rangle\delim@r 3\o@rangle \else
+ \ifx\next|\delim@m 3\o@vert \else
+ \ifx\next\vert\delim@m 3\o@vert \else
+ \ifx\next\vert\delim@m 3\o@vert \else
+ \ifx\next/\delim@m 3/ \else
+ \ifx\next\backslash\delim@m 3\backslash \else
+ \n@err{Missing delimiter}{\triple must be followed by [,],<,> or |}
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\pdef\ltriple#1{\ltriple@ #1}
+
+\def\ltriple@{\afterassignment\ltriple@@\let\next=}
+
+\def\ltriple@@{\ifx\next\@stop \lnull\else
+ \ifx\next|\delim@l 3\o@vert \else
+ \ifx\next\vert\delim@l 3\o@vert \else
+ \n@err{Missing delimiter}{\ltriple must be followed by |}\lnull
+ \fi\fi\fi}
+
+\pdef\rtriple#1{\rtriple@ #1}
+
+\def\rtriple@{\afterassignment\rtriple@@\let\next=}
+
+\def\rtriple@@{\ifx\next\@stop \rnull\else
+ \ifx\next|\delim@r 3\o@vert \else
+ \ifx\next\vert\delim@r 3\o@vert \else
+ \n@err{Missing delimiter}{\rtriple must be followed by |}\rnull
+ \fi\fi\fi}
+
+%
+% N e s t e d d e l i m i t e r s
+%
+
+% Here is a count to count nesting of delimiters
+
+\newcount\ddelimlevel@
+
+% Missing delimiters checking
+
+\def\rdelim@error{\n@err{Unmatched right delimiter}%
+ \rdelim@errhelp
+ \ddelimlevel@=0}
+
+\def\rdelim@errhelp{Delimiters must be balanced within groups
+ and alignment cells.
+ ^^JI am ignoring whatever is superfluous.}
+
+\def\ldelim@error#1{\n@err{Unmatched \number#1 left delimiter(s)}%
+ \ldelim@errhelp
+ \\\ddcount@@=#1
+ \loop\ifnum\ddcount@@>0 \rnull \advance\ddcount@@-1 \repeat}
+
+\def\ldelim@errhelp{Delimiters must be balanced within groups
+ and alignment cells.
+ ^^JI am inserting `)' for every missing left delimiter.
+ ^^JLots of error messages may follow; better fix it before going on.}
+
+\def\ldelim@warningcheck#1{\ifnum#1>0
+ \n@warning{Unmatched \number#1 left delimiter(s)}%
+ \fi}
+
+\def\mdelim@error{\n@err{Misplaced \string\middle}%
+ {This command must occur between a left and a right delimiter.
+ ^^JDoesn't, so I am ignoring it.}%
+ \ddelimlevel@=0}
+
+% Default mode of delimiters
+
+\def\defaultdelims@{%
+ \def\delim@l##1##2{\if##10\else\o@left##2\o@right.\fi}%
+ \def\delim@r##1##2{\if##10\else\o@left##2\o@right.\fi}%
+ \def\delim@m##1##2{\if##10\else\o@left##2\o@right.\fi}%
+}
+
+\defaultdelims@
+
+%
+% D i s p l a y d e l i m i t e r s
+%
+
+% Displayed material is put into box registers numbered by \ddelim@count
+% starting from \firstddelim@no. All they are hboxes.
+
+% Token registers with the same numbers contain material whose typesetting
+% is postponed. They may be:
+% (i) extensible tokens (left and middle; e.g., delimiters).
+% Typesetting of extensibles is postponed until their size is
+% known (after the same level right delimiter is found);
+% (ii) escape tokens = interspersed macros (such as \wall, \return, etc.).
+% Typesetting postponed until all box registers are ejected.
+
+\newcount\ddelim@count
+
+% \firstddelim@no is set by \setfirstddelim@no to the first unused
+% box and toks register pair.
+% Every \displaydelims@ calls \setfirstddelim@no.
+
+\def\setfirstddelim@no{%
+ \edef\firstddelim@no{\the\count14 }% unused box register
+ \ifnum\firstddelim@no<\the\count15 %
+ \edef\firstddelim@no{\the\count15 }% unused toks register
+ \fi}
+
+% The commands to fill the hboxes are \startddelimbox@ and \finishddelimbox@.
+
+\def\startddelimbox@{\hbox\bgroup\o@math
+ \ifnum\ddelim@count<\insc@unt % if less than the insertion count
+ \else \n@err{Formula too large}%
+ {No free box to store the next chunk of displayed material.
+ ^^JThe rest of the formula will be ignored.
+ ^^JDivide big formulas into small parts.}%
+ \o@math\egroup
+ \fi
+ \dcurrstyle@
+ \mathopen{}
+}
+
+\def\finishddelimbox@{\mathclose{}
+ \o@math\egroup}
+
+% To distinguish between extensibles and escape tokens, they start with
+% control sequence \ext@tok and \esc@tok, respectively.
+% The nth token register may be tested by
+%
+% \if\ext@tok\first@tok{n} yes \else no \fi
+%
+% etc.
+
+\def\ext@tok{1}
+\def\esc@tok{2}
+
+\def\@car#1#2\@nil{#1} % LaTeX's definition
+\def\@cdr#1#2\@nil{#2} % LaTeX's definition
+\def\@cadr#1#2#3\@nil{#2}
+
+\def\first@tok#1{\expandafter\@car\the\toks#1\relax \noexpand\@nil}
+\def\second@tok#1{\expandafter\@cadr\the\toks#1\relax \noexpand\@nil}
+\def\tail@toks#1{\expandafter\@cdr\the\toks#1\relax \noexpand\@nil}
+
+\def\first@token#1{\expandafter\@car#1\relax \noexpand\@nil}
+\def\second@token#1{\expandafter\@cadr#1\relax \noexpand\@nil}
+\def\tail@tokens#1{\expandafter\@cdr#1\relax \noexpand\@nil}
+
+% \displaydelims@ is called by \displayon@ to start display mode of
+% delimiters, which includes defining \delim@l, \delim@r and
+% \delim@m within displayed formulas and starting the first delimbox.
+
+\def\displaydelims@{\global\setbox\sizebox@\delimstrut@
+ \displaydefs@
+ \setfirstddelim@no
+ \ddelim@count=\firstddelim@no % the first dbox has this number
+ \ddelimlevel@=0 %
+ \def\f@stack{\relax}% initiating \f@stack
+ \def\ht@stack{\relax}% initiating \ht@stack
+ \def\dp@stack{\relax}% initiating \dp@stack
+ \toks\number\ddelim@count={\ext@tok 0x}% void extensible token
+ \put@{\number\ddelim@count}\f@stack % store the number of the starting box
+ \setbox\number\ddelim@count\startddelimbox@ % now inside ddelimbox
+}
+
+\def\displaydefs@{%
+ \let\delim@l=\ddelim@l
+ \let\delim@m=\ddelim@m
+ \let\delim@r=\ddelim@r}
+
+
+\def\ddelim@l#1#2{\mathopen{}
+ \finishddelimbox@ % now outside ddelimbox
+ \put@{\the\ht\sizebox}\ht@stack % save height of sizebox
+ \put@{\the\dp\sizebox}\dp@stack % save depth of sizebox
+ \setbox\sizebox\delimstrut@% set minimal size of delimiters
+ \advance\ddelimlevel@ by 1
+ \advance\ddelim@count by 1
+ % left delimiter -> extensible token:
+ \toks\number\ddelim@count={\ext@tok#1#2}%
+ \put@{\number\ddelim@count}\f@stack % store the number of the starting box
+ \setbox\number\ddelim@count\startddelimbox@ % now inside ddelimbox
+}
+
+\def\ddelim@m#1#2{%
+ \ifnum\ddelimlevel@>-1
+ \finishddelimbox@ % now outside ddelimbox
+ \advance\ddelim@count by 1
+ % middle delimiter -> extensible token:
+ \toks\number\ddelim@count={\ext@tok#1#2}%
+ \setbox\number\ddelim@count\startddelimbox@ % now inside ddelimbox
+ \else
+ \mdelim@error#2%
+ \fi}
+
+\def\ddelim@r#1#2{\ifnum\ddelimlevel@<1 \rdelim@error \fi
+ \finishddelimbox@ % now outside ddelimbox
+ \advance\ddelimlevel@ by -1
+ \ifnum\ddelimlevel@>-1 % if not error
+ \unite@dboxes#1#2% unite box registers on this delimlevel;
+ % append #1 times #2
+ \fi
+ \setbox0\copy\sizebox % save the sizebox in box0, then let it grow:
+ \sizebox@grow
+ \advance\ddelim@count by 1
+ % empty delimiter -> extensible token:
+ \toks\number\ddelim@count={\ext@tok 0.}% emptying toks ddelim@count
+ \setbox\number\ddelim@count\startddelimbox@ % now inside ddelimbox
+ % eject the sizebox as stored in box0 -- for placement of sub- and
+ % superscripts:
+ \box0}
+
+
+
+\def\checkleftdelims@{\ifnum\ddelimlevel@>0 \ldelim@error{\ddelimlevel@}\fi}
+
+\def\enddisplaydelims@{\checkleftdelims@
+ \finishddelimbox@ % now outside ddelimbox
+ \unite@dboxes 0.% unite all box registers
+ \eject@dboxes
+}
+
+% Called by \delim@r, the command \unite@dboxes runs through box registers
+% between \f@ddelim and the current value of \ddelim@count. Collapsed
+% into a single hbox is every contiguous interval of hboxes, interspersed
+% with extensible elements that were stored in token registers and in #1,
+% adjusted to the size of the current \ddelimstrutbox.
+
+% Two global counts are needed:
+
+\newcount\ddcount@ % to count boxes to be collapsed; global
+\newcount\ddcount@@ % to count boxes to gather the former; local
+
+\def\unite@dboxes#1#2{% now outside ddelimbox; #1#2 = the right delimiter
+ \get@\f@ddelim\f@stack
+ \global\ddcount@=\f@ddelim % set ddcount@ to starting position
+ \ddcount@@=\f@ddelim % set ddcount@@ to starting position
+ \advance\ddelim@count 1
+ % starting box number ddcount@@
+ \setbox\number\ddcount@@\hbox\bgroup % now inside ddelimbox
+ \g@loop\ifnum\ddcount@<\ddelim@count
+ \if\ext@tok\first@tok{\number\ddcount@}\relax % if extensible element
+ \if0\second@tok{\number\ddcount@}\relax % if `0' then do nothing
+ \else % else eject the resized extensible
+ \expandafter\size@\the\toks\number\ddcount@\relax
+ \fi
+ \unhbox\number\ddcount@ % unbox the box
+ \else
+ \if\esc@tok\first@tok{\number\ddcount@}\relax % else if escape element
+ \egroup % finishing box number ddcount@@; now outside ddelimbox
+ \advance\ddcount@@ by 1
+ % moving toks ddcount@ to toks ddcount@@ -- if unequal
+ \ifnum\ddcount@=\ddcount@@ \else
+ \toks\number\ddcount@@=\expandafter{\the\toks\number\ddcount@}%
+ \toks\number\ddcount@={\ext@tok 0.}% emptying toks ddcount@
+ \fi
+ % starting box ddcount@@:
+ \setbox\number\ddcount@@\hbox\bgroup % now inside ddelimbox
+ \unhbox\number\ddcount@
+ \else
+ \n@err{Unexpected contents in toks \number\ddcount@}{Shocked? Me too.}%
+ \fi
+ \fi
+ \global\advance\ddcount@ by 1
+ \repeat
+ \size@ \ext@tok#1#2 \delimtype@right\relax % resized right delimiter
+ \egroup % now outside ddelimbox
+ \toks\f@ddelim={\ext@tok 0.}% emptying toks f@ddelim
+ \ddelim@count=\ddcount@@}
+
+%
+% D e l i m i t e r g r o w t h
+%
+
+\newdimen\delimincrement@
+\newcount\delimgrowth@
+
+\def\delimgrowth{\afterassignment\delimgrowth@@\delimgrowth@}
+
+\def\delimgrowth@@{\ifnum\delimgrowth@<1 \delimgrowth@=1
+ \n@warning{\string\delimgrowth\space must be a positive natural number}%
+ \fi
+ \delimincrement@=.66ex
+ \divide\delimincrement@ by \delimgrowth@}
+
+\def\sizebox@grow{\@tempdima=\ht\sizebox
+ \advance\@tempdima\delimincrement@ %\relax
+ \ht\sizebox=\@tempdima
+ \@tempdima=\dp\sizebox
+ \advance\@tempdima\delimincrement@ %\relax
+ \dp\sizebox=\@tempdima
+ \get@\@tempa\ht@stack
+ \ifdim\the\ht\sizebox<\@tempa \ht\sizebox=\@tempa\fi
+ \get@\@tempa\dp@stack
+ \ifdim\the\dp\sizebox<\@tempa \dp\sizebox=\@tempa\fi
+}
+
+% Called by the last \delim@r, the command \eject@dboxes ejects all the
+% box and token registers filled. Uses the global count \ddcount@
+
+\newcount\ddcount@ % global
+
+\def\eject@dboxes{\global\ddcount@=\firstddelim@no{}%
+ \box\number\ddcount@
+ \g@loop\ifnum\ddcount@<\ddelim@count
+ \global\advance\ddcount@ by 1
+ \if\ext@tok\first@tok{\number\ddcount@}\relax
+ \n@err{Forgotten extensible \number\ddcount@\space}%
+ {An internal error, induced by the previous errors.
+ ^^JSomething will be lost.}
+ \else
+ \if\esc@tok\first@tok{\number\ddcount@}\relax
+ \tail@toks{\number\ddcount@}\relax
+ \else\n@err{Unable to eject \number\ddcount@}%
+ {Sorry, the box or toks have never been filled.
+ ^^JIs an internal error and should never happen.}%
+ \fi
+ \fi
+ \box\number\ddcount@
+ \repeat}
+
+%
+% S i z i n g d e l i m i t e r s
+%
+
+% The following commands are called by \unite@dboxes.
+% Parameters:
+%
+% #1 = always \ext@tok, hence ignored
+% if #2 = ":" then sizable fraction
+% #3 = numerator and #4 = denominator
+% otherwise
+% #2 = number of repetitions (from 0 to 9),
+% #3 = a delimiter
+% #4 = a type (\delimtype@right or \relax)
+
+\def\size@#1#2#3#4{%
+ \if:#2\relax % if a numeric fraction
+ \o@math\size@frac{#3}{#4}\relax\o@math
+ \else % else a delimiter
+ \if0#2\relax % zero repetitions -- do nothing
+ \else
+ \ifx#4\delimtype@right % if right delimiter, set sizebox
+ \setbox0\hbox{\o@math \extend@delim#2#3\sizebox\o@math}%
+%%% \ht\sizebox=\ht0 \dp\sizebox=\dp0 %
+ \box0 %
+ \else
+ \o@math \extend@delim#2#3\sizebox \o@math
+ \fi
+ \fi
+ \fi}
+
+%
+% E x t e n d i n g d e l i m i t e r s
+%
+
+% Not all expressions have their height equal to depth. So we put
+% the expression in a vcenter, create delimiters that match the vcenter,
+% and then shift the delimiter vertically the appropriate amount.
+
+% A surprise was that [ sometimes acquired bigger size than (.
+% So I had to modify the procedure: first extend [, then (.
+
+% The three arguments to \extend@delim are:
+% #1 = the number of repetitions
+% #2 = a delimiter
+% #3 = a box register of zero width, or -1 to indicate base size
+
+% Setting values of \delimiterfactor and \delimitershortfall such that
+% \delimfactor works well:
+
+\delimiterfactor=920
+\delimitershortfall=3pt
+
+% Not all expressions have their height equal to depth. So we put
+% the expression in a vcenter, create delimiters that match the vcenter,
+% and then shift the delimiter vertically the appropriate amount.
+
+% A surprise was that [ sometimes acquired bigger size than (.
+% So I had to modify the procedure: first extend [, then (.
+
+% The three arguments to \extend@delim are:
+% #1 = the number of repetitions
+% #2 = a delimiter
+% #3 = a box register of zero width, or -1 to indicate base size
+
+\def\extend@delim#1#2#3{%
+ \ifnum#1<1
+ % do absolutely nothing
+ \else\begingroup % do box0 = extended delimiter
+ \nulldelimiterspace=0pt
+ \ifnum#3<0 % if #3 not a box register
+ \setbox0\hbox{\o@math\icurrstyle@\o@left#2\o@right.\o@math}%
+ \@tempdima=0pt
+ \else % if #3 = box register
+ \setbox\@tempboxa\hbox{\o@math\vcenter{\copy#3}\o@math}%
+ \@tempdima=\ht\@tempboxa %\hbox{\the\@tempdima/\the\dp\@tempboxa}%
+ \ifdim\@tempdima>3\mex \checkangle@{#2}%
+ \ifresult@\n@warning{angle brackets do not grow that size}\fi
+ \fi
+ \advance\@tempdima -\ht#3
+ \setbigstrutbox@
+ \setbox0\hbox{\o@math\icurrstyle@\o@left#2
+ \ifdim\ht\@tempboxa>.86\ht\bigstrut@box
+ \vrule height \ht\bigstrut@box width 0pt
+ \fi
+ \ifdim\dp\@tempboxa>.86\dp\bigstrut@box
+ \vrule depth \dp\bigstrut@box width 0pt
+ \fi
+ \box\@tempboxa\o@right.\o@math}%
+ \fi % now copy box0 #1 times
+ \count@=1
+ \loop\ifnum\count@<#1
+ \lower\@tempdima\copy0
+ \hskip -.75\wd0 \hskip .25\mex
+ \advance\count@ 1
+ \repeat
+ \lower\@tempdima\box0
+ \endgroup
+ \fi}
+
+% Check for an angle bracket
+
+\def\checkangle@#1{\def\@tempa{#1}
+ \def\@tempb{\o@langle}
+ \ifx\@tempa\@tempb\result@true
+ \else
+ \def\@tempb{\o@rangle}
+ \ifx\@tempa\@tempb\result@true
+ \else
+ \result@false
+ \fi\fi}
+
+%
+% E s c a p e c o m m a n d s
+%
+
+% Escape commands are ones that, if not stored, would interfere with the
+% display mode.
+
+\def\wall@cr{\checkpunct@
+ \ifpunct@ \global\punct@false
+ \ifnum\ddelimlevel@>0 % elements of a list
+ \store@ec{\d@cr{\pad@}}{}% padded
+ \mathopen{} % new expression
+ \else % separate equations
+ \store@ec{\d@cr{\relax}}{}% unpadded
+ \mathopen{} % new expression
+ \fi
+ \else % broken formula
+ \store@ec{\d@cr{\pad@}}{}% padded
+ \mkern-\thickmuskip \mathinner{} % continuing expression
+ \fi}
+
+\def\curr@cr@is@wall@cr{\def\curr@cr{\wall@cr}\let\\\curr@cr}
+
+\def\wall{\mathrel{}
+ \ifwallallowed@
+ \ifdisplay@
+ \store@ec{\d@wall{0}}{\let\\\wall@cr}%
+ \else
+ \n@warning{Non-display. I am ignoring the misplaced \string\wall}%
+ \fi
+ \else \n@err{Misplaced \string\wall}{\wall is disallowed here}%
+ \fi
+ \mathopen{}
+}
+
+
+\def\return{\checkpunct@
+ \ifdisplay@
+ \store@ec{\d@return}{\let\\\curr@cr}
+ \else
+ \n@warning{Non-display. I am ignoring the misplaced \string\return}%
+ \fi
+ \ifpunct@ \global\punct@false
+ \mathopen{}
+ \else
+ \mkern-\thickmuskip \mathinner{}
+ \fi
+}
+
+
+% \padded is another form of \wall.
+% \padded{A} prefixes each line except the first with A.
+% Typically A is a void box or a kern.
+% Nested \padded have cummulative effect.
+
+\def\padded#1{%
+ \ifwallallowed@
+ \ifdisplay@
+ \store@ec{\d@wall{1#1}}{\let\\\wall@cr}%
+ \else
+ \n@warning{Non-display. I am ignoring the misplaced \string\padded}%
+ \fi
+ \else \n@err{Misplaced \string\padded}{\padded is disallowed here}%
+ \fi
+ \mathopen{}
+}
+
+\def\pad@{}
+
+
+% \store@ec is the generic command to store an escape command #1 in token
+% registers. It also performs #2 while outside ddelimbox.
+
+\def\store@ec#1#2{\finishddelimbox@ % now outside ddelimbox
+ \advance\ddelim@count 1
+ \toks\number\ddelim@count={\esc@tok#1}% #1 -> escape token
+ #2% keep % here
+ \setbox\number\ddelim@count\startddelimbox@ % now inside ddelimbox
+}
+
+
+%
+% I n l i n e d e l i m i t e r s
+%
+
+\newcount\big@ \big@=0
+\newcount\big@@ \big@@=0
+\newbox\bigstrut@box
+
+\mathchardef\biglbracket@="0302 %% \biglbracket@ is of fixed size in LaTeX !!
+
+\def\setbigstrutbox@{\setbox\bigstrut@box
+ \hbox{\o@math\vcenter{\hbox{\o@math\icurrstyle@
+ \mathchar\biglbracket@\o@math}}\o@math}
+ \setbox\bigstrut@box\hbox{\vrule height\prorated@\ht\bigstrut@box
+ depth\prorated@\dp\bigstrut@box
+ width 0pt}
+}
+
+\pdef\big{\advance\big@ 1\relax}
+\pdef\bigg{\advance\big@ 2\relax}
+\pdef\biggg{\advance\big@ 3\relax}
+
+\def\bigl{\big\left}
+\def\biggl{\bigg\left}
+
+\let\bigm=\middle
+\let\biggm=\middle
+
+\let\bigr=\right
+\let\biggr=\right
+
+
+% inline mode
+
+\def\inlinedelims@{%
+ \idelimlevel@=0\relax
+ \big@=0\relax
+ \big@@=0\relax
+ \let\delim@l=\idelim@l
+ \let\delim@m=\idelim@m
+ \let\delim@r=\idelim@r
+}
+
+\def\idelim@l#1#2{\mathopen{}
+ \nodisplay@true
+ \advance\idelimlevel@ by 1
+ \ifnum\big@>0 \advance\big@@\big@
+ \ifnum\idelimlevel@>\big@@ \n@err{Misplaced \string\big}
+ {Too late for \big -- a big must not occur inside a non-big}
+ \fi
+ \ifnum\idelimlevel@<1 \n@err{Misplaced \string\big}
+ {\big must not occur on negative level of fencing.}
+ \fi
+ \fi
+ \big@=0
+ \ifnum\idelimlevel@>\big@@ \extend@delim#1#2{-1} % normal size
+ \else
+ \ifnum\idelimlevel@<1 \extend@delim#1#2{-1} % normal size
+ \else
+ \setbigstrutbox@ \extend@delim#1#2\bigstrut@box
+ \fi
+ \fi
+ \mathopen{}}
+
+\def\idelim@m#1#2{\mathclose{}
+ \nodisplay@true
+ \big@=0
+ \ifnum\idelimlevel@>\big@@ \extend@delim#1#2{-1} % normal size
+ \else
+ \ifnum\idelimlevel@<1 \extend@delim#1#2{-1} % normal size
+ \else
+ \setbigstrutbox@ \extend@delim#1#2\bigstrut@box
+ \fi
+ \fi
+ \mathopen{}}
+
+\def\idelim@r#1#2{\mathclose{}
+ \big@=0
+ \ifnum\idelimlevel@>\big@@ \extend@delim#1#2{-1} % normal size
+ \else
+ \ifnum\idelimlevel@<1 \extend@delim#1#2{-1} % normal size
+ \else
+ \setbigstrutbox@ \extend@delim#1#2\bigstrut@box
+ \advance\big@@ -1
+ \fi
+ \fi
+ \advance\idelimlevel@ by -1
+ \mathclose{}}
+
+%
+% A u x i l i a r y p r o c e d u r e s
+%
+\def\replacebindelims@#1#2{\begingroup
+ \idelimlevel@=0\relax
+ \def\delim@l##1##2{#2\advance\idelimlevel@ by 1
+ \setbox0\hbox\bgroup\o@math}%
+ \def\delim@r##1##2{\mathclose{}\advance\idelimlevel@ by -1
+ \o@math\egroup}%
+ \def\delim@m##1##2{}%
+ \def\inlineopen@{#2\advance\idelimlevel@ by 1
+ \setbox0\hbox\bgroup\o@math}%
+ \def\inlineclose@{\mathclose{}\advance\idelimlevel@ by -1
+ \o@math\egroup}%
+ #1
+ \endgroup}
+
+%
+% S u b s c r i p t s a n d s u p e r s c r i p t s
+%
+
+\let\o@sp^
+\let\o@sb_ % (MathTime macros destroy plain TeX's \sp,\sb)
+
+\catcode`\^=13
+\catcode`\_=13
+
+\pdef_#1{\o@sb{\display@false\advance\mathcount@ 1 \inline{#1}}}
+
+\pdef^#1{\o@sp{\display@false\advance\mathcount@ 1 \inline{#1}}}
+
+\catcode`\^=12
+\catcode`\_=12
+
+%
+% P a r s i n g o f s u b - a n d s u p e r s c r i p t s
+%
+
+% The comand \parse@ detects whether sub- or superscripts follow.
+% If yes, then \sb@true or \sp@true is set and the arguments
+% are stored in \sb@toks or \sp@toks, respectively.
+% Then \afterparse@ is executed.
+
+\newtoks\sp@toks
+\newtoks\sb@toks
+
+\newif\ifsb@
+\newif\ifsp@
+
+\def\parse@{\sb@false\sp@false
+ \def\next@comm{\afterassignment\parse@@\let\next=}
+ \next@comm}
+
+\def\parse@@{%
+ \ifx\next_
+ \ifsb@\n@err{Double subscript}{The notation x_y_z is ambiguous.}
+ \else\sb@true
+ \fi
+ \def\next@comm{\sb@@}
+ \else
+ \ifx\next^
+ \ifsp@\n@err{Double superscript}{The notation x^y^z is ambiguous.}
+ \else\sp@true
+ \fi
+ \def\next@comm{\sp@@}
+ \else
+ \def\next@comm{\afterparse@}
+ \fi
+ \fi
+ \next@comm}
+
+\def\sp@@#1{\sp@toks={#1} \afterassignment\parse@@\let\next=}
+
+\def\sb@@#1{\sb@toks={#1} \afterassignment\parse@@\let\next=}
+
+\def\parse@next{\parse@\next}
+
+%
+% O p e r a t o r s
+%
+
+% \mathop is redefined to stop misinterpretation of following Bins
+% as unary operators (cf. TeXbook, p. 170).
+
+\let\o@mathop\mathop
+
+% The following definition determines spacing between Op and Bin.
+% (According to [TeXBook, p. 170], ``such case never arises,
+% so plain TeX leaves it undefined, making the Bin into unary.'')
+
+\newif\iflimits@
+\limits@true
+
+\pdef\mathop#1{%
+ \ifnum\mathcount@>0 % in sub- and superscripts
+ \def\next@comm{\o@mathop{#1}} % just @mathop
+ \else \def\mathop@arg{#1}
+ \def\afterparse@{\mathop@@}
+ \sb@false\sp@false
+ \ifdisplay@\limits@true\else\limits@false\fi
+ \def\next@comm{\afterassignment\mathop@\let\next=}
+ \fi
+ \next@comm}
+
+\def\mathop@{\def\next@comm{\parse@next}
+ \ifx\next\limits
+ \ifdisplay@ \limits@true
+ \else \iflimits@ \else \n@warning{Ignoring inline \string\limits}\fi
+ \fi
+ \def\next@comm{\parse@}
+ \else
+ \ifx\next\nolimits \limits@false \def\next@comm{\parse@}\fi
+ \fi
+ \next@comm}
+
+\def\mathop@@{\mathoptest@ % sets \ifresult@ true if a left delimiter follows
+ \ifresult@
+ \iflimits@
+ \o@mathop{\mathop@arg}\mathop@@@l
+ \else
+ \o@mathop{\mathop@arg}\nolimits\mathop@@@
+ \fi
+ \else
+ \iflimits@
+ \mathinner{\o@mathop{\mathop@arg}\mathop@@@l}
+ \else
+ \mathinner{\mathop@arg}\mathop@@@
+ \fi
+ \fi
+ \next}
+
+
+\catcode`\^=13
+\catcode`\_=13
+
+\def\mathop@@@{%
+ \ifsp@
+ ^{\hbox{\edef\@tempa{\noexpand\imath@{\the\sp@toks}}%
+ \def\\{,\ }\@tempa}}
+ \fi
+ \ifsb@
+ _{\hbox{\edef\@tempa{\noexpand\imath@{\the\sb@toks}}%
+ \def\\{,\ }\@tempa}}
+ \fi}
+
+\def\mathop@@@l{\limits
+ \ifsp@ ^{\lmathop@@@l@{\the\sp@toks}} \fi
+ \ifsb@ _{\lmathop@@@l@{\the\sb@toks}} \fi}
+
+\def\lmathop@@@l@#1{\vbox{\let\\=\crcr
+ \baselineskip=0pt \lineskip=2pt
+ \edef\@tempa{\vbox{\noexpand\ialign{%
+ \hfil\noexpand\imath@{####}\hfil\crcr
+ #1 \crcr}}}
+ \@tempa}}
+
+\catcode`\^=12
+\catcode`\_=12
+
+
+\catcode`\(=13 \catcode`\[=13 \catcode`\<=13
+
+\newif\iftesting@
+\testing@false
+
+\def\mathoptest@{%
+ \iftesting@
+ \result@true
+ \else
+ \result@false
+ \ifx\next\ch@lparenthesis\result@true \else
+ \ifx\next\ch@lbrack\result@true \else
+ \ifx\next<\result@true \else
+ \ifx\next\{\result@true \else
+ \ifx\next\left\result@true \else
+ \ifx\next\langle\result@true \else
+ \ifx\next\lfloor\result@true \else
+ \ifx\next\lceil\result@true \else
+ \ifx\next\mathopen\result@true
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi}
+
+% \lvert and \lVert are intentionally omitted
+
+\catcode`\(=12 \catcode`\[=12 \catcode`\<=12
+
+%
+% A b b r e v i a t i o n s
+%
+\newcount\abbrevlength@
+
+\pdef\abbreviation{\def\abbrev@@{}\abbrevlength@=0
+ \def\abbrev@@@{\afterassignment\abbrev@\let\abbrev@next= }%
+ \result@false\abbrev@@@}
+
+\long\def\abbrev@{%
+ \ifx`\abbrev@next \result@false
+ \else
+ \edef\next{\meaning\abbrev@next}
+ \expandafter\letter@test\next\endletter@test
+ \fi
+ \ifresult@
+ \edef\abbrev@@{\abbrev@@\theletter@}
+ \advance\abbrevlength@ 1\relax
+ \else
+ \ifnum\abbrevlength@>1
+ \ifnum\mathcount@>0 \o@mathop\bgroup
+ \else \mathinner\bgroup
+ \fi
+ \else\bgroup
+ \fi
+ {\rm \abbrev@@\kern 0pt}
+ \def\abbrev@@@{\egroup\result@false
+ \mathclose{}\mathopen{}\mathop{}\nolimits\abbrev@next}
+ \fi
+ \abbrev@@@}
+
+\def\letter@test #1#2#3#4#5\endletter@test{
+ \if l#4\result@true\letter@test@#5
+ \else\result@false\fi}
+
+\def\letter@test@#1#2#3#4#5#6{\def\theletter@{#6}}
+
+%
+% S p e c i a l s y m b o l s
+%
+
+% Inequalities
+
+%\let\leq=\le \let\geq=\ge
+%\let\leqq=\le \let\geqq=\ge
+
+% factorial
+
+\def\factorial{\mc@factorial\mathopen{}\mathinner{}}
+
+% vingl
+
+\pdef\vin{\mathrel{\hbox{\hglue .1\mex
+ \vrule \@height .06\mex \@width 1\mex
+ \vrule \@height 1.33\mex \@width .06\mex
+ \hglue .4\mex}}}
+
+\pdef\niv{\mathrel{\hbox{\hglue .2\mex
+ \vrule \@height 1.33\mex \@width .06\mex
+ \vrule \@height .06\mex \@width 1\mex
+ \hglue .5\mex}}}
+
+\def\stackrel#1#2{\mathrel{\limits@true\mathop{#2}\limits^{\rm #1}}} %%%%%%%%%%
+
+\makerobust\stackrel
+
+%
+% E x p a n d a b l e b a r s a n d a r r o w s
+%
+
+% Save even if not needed
+
+\let\o@overline=\overline
+\let\o@underline=\underline
+
+\newdimen\er@wd
+
+\def\er@sep{.06ex}
+\def\er@gap{.33\mex}
+\def\er@short{.6\mex}
+\def\er@rulewd{.05ex}
+\def\er@minwd{.6\mex}
+\def\er@kerna{.15\mex}
+\def\er@kernb{.15\mex}
+
+\def\overline#1{\setmathtype@{#1}%
+ {\o@er@{#1}{\leaders\hrule \@height\er@rulewd \hfill}}
+}
+\def\underline#1{\setmathtype@{#1}%
+ {\u@er@{#1}{\leaders\hrule \@height\er@rulewd \hfill}}
+}
+\def\overrightarrow#1{\setmathtype@{#1}%
+ {\o@er@{#1}{\o@math\iscriptstyle@ \longrightarrowfill\o@math}}
+}
+\def\underrightarrow#1{\setmathtype@{#1}%
+ {\u@er@{#1}{\o@math\iscriptstyle@ \longrightarrowfill\o@math}}
+}
+\def\overleftarrow#1{\setmathtype@{#1}%
+ {\o@er@{#1}{\o@math\iscriptstyle@ \longleftarrowfill\o@math}}
+}
+\def\underleftarrow#1{\setmathtype@{#1}%
+ {\u@er@{#1}{\o@math\iscriptstyle@ \longleftarrowfill\o@math}}
+}
+\def\overleftrightarrow#1{\setmathtype@{#1}%
+ {\o@er@{#1}{\o@math\iscriptstyle@ \longleftrightarrowfill\o@math}}
+}
+\def\underleftrightarrow#1{\setmathtype@{#1}%
+ {\u@er@{#1}{\o@math\iscriptstyle@ \longleftrightarrowfill\o@math}}
+}
+
+% Inside
+
+\pdef\o@er@#1#2{\inlineopen@
+ \begingroup
+ \setbox0\currstyle@hbox{\toprestricted@true #1}
+ \er@wd=\wd0 \advance\er@wd-\er@short
+ \ifdim \er@wd<\er@minwd \er@wd=\er@minwd \fi
+ \kern\er@kerna
+ \hbox to\wd0{\hss
+ \vbox{\offinterlineskip
+ \vglue\er@sep
+ \hbox to\er@wd{#2}%
+ \vskip\er@gap
+ \hbox to\er@wd{\hss\box0\hss}}%
+ \hss}
+ \kern\er@kernb
+ \endgroup
+ \inlineclose@}
+
+\pdef\u@er@#1#2{\inlineopen@
+ \begingroup
+ \setbox0\currstyle@hbox{\botrestricted@true #1}
+ \er@wd=\wd0 \advance\er@wd -\er@short
+ \ifdim \er@wd<\er@minwd \er@wd=\er@minwd \fi
+ \kern\er@kerna
+ \hbox to\wd0{\hss
+ \vtop{\offinterlineskip
+ \hbox to\er@wd{\hss\box0\hss}
+ \vskip\er@gap
+ \hbox to\er@wd{#2}%
+ \vglue\er@sep}%
+ \hss}
+ \kern\er@kernb
+ \endgroup
+ \inlineclose@}
+
+\def\longrightarrowfill{\axis@@@\hfill\mskip-6mu\rightarrow}
+\def\longleftarrowfill{\leftarrow\mskip-6mu\axis@@@\hfill}
+\def\longleftrightarrowfill{\leftarrow\mskip-6mu
+ \axis@@@\hfill\mskip-6mu\rightarrow}
+
+% Setting math type
+
+\def\setmathtype@#1#2{
+ \setbox0\hbox{\o@math \setmathtype@@@000 x#1x\o@math}
+ \@tempdima=\wd0
+ \setbox0\hbox{\o@math \setmathtype@@@100 x#1x\o@math}
+ \ifdim\wd0>\@tempdima \o@mathop{#2}
+ \else \setbox0\hbox{\o@math \setmathtype@@@010 x#1x\o@math}
+ \ifdim\wd0>\@tempdima \mathrel{#2}
+ \else \setbox0\hbox{\o@math \setmathtype@@@001 x#1x\o@math}
+ \ifdim\wd0>\@tempdima \mathbin{#2}
+ \else \mathord{#2}
+ \fi
+ \fi
+ \fi}
+
+\def\setmathtype@@@#1#2#3{\thinmuskip=#1mu \thickmuskip=#2mu \medmuskip=#3mu
+ \relax}
+
+%
+% M u l t i p l e a n d e x t e n s i b l e a c c e n t s
+%
+
+% Extensible accents:
+
+\let\o@hat=\hat
+\let\o@widehat=\widehat
+
+\let\o@tilde=\tilde
+\let\o@widetilde=\widetilde
+
+\let\o@bar=\bar
+
+\def\widebar#1{\ifdim\wd0<\prorated@ em \mathaccent"07B {#1}
+ \else \mathaccent"07C {#1}
+ \fi}
+
+% Limits of extensibility:
+%
+% narrow accent
+% threshold = \widethr@
+% wide accent
+% threshold = \wrapthr@
+% attached accent
+
+\def\widethr@{1.6ex}
+\def\wrapthr@{5.8\mex}
+
+% Non-extensible accents
+
+\let\o@dot=\dot
+\let\o@ddot=\ddot
+\let\o@breve=\breve
+\let\o@check=\check
+
+\def\uo{\mathaccent"017 }
+
+% Multiple accents
+
+\newtoks\acc@toks % toks to store a sequence of accents in reverse order
+
+\newif\ifextacc@
+
+\pdef\hat{\acc@toks={\H@} \extacc@true \acc@@}
+\pdef\tilde{\acc@toks={\T@} \extacc@true \acc@@}
+\pdef\bar{\acc@toks={\B@} \extacc@true \acc@@}
+\pdef\dot{\acc@toks={\D@} \extacc@false \acc@@}
+\pdef\ddot{\acc@toks={\DD@} \extacc@false \acc@@}
+\pdef\breve{\acc@toks={\BR@} \extacc@false \acc@@}
+\pdef\check{\acc@toks={\CH@} \extacc@false \acc@@}
+
+% Defaults are printable (for debugging purposes)
+
+\def\H@{H} \def\T@{T} \def\B@{B}
+ \def\D@{D} \def\DD@{DD}
+ \def\BR@{BR} \def\CH@{CH}
+
+% See TeXbook p. 374 for the trick with \expandafter:
+
+\def\acc@@#1{\def\next@comm{\acc@@} \def\@tempa{#1} \def\@tempb{\hat}
+ \ifx \@tempa\@tempb
+ \acc@toks=\expandafter{\expandafter \H@\the\acc@toks}
+ \else \def\@tempb{\tilde}
+ \ifx \@tempa\@tempb
+ \acc@toks=\expandafter{\expandafter \T@\the\acc@toks}
+ \else \def\@tempb{\bar}
+ \ifx \@tempa\@tempb
+ \acc@toks=\expandafter{\expandafter \B@\the\acc@toks}
+ \else \def\@tempb{\dot}
+ \ifx \@tempa\@tempb
+ \acc@toks=\expandafter{\expandafter \D@\the\acc@toks}
+ \extacc@false
+ \else \def\@tempb{\ddot}
+ \ifx \@tempa\@tempb
+ \acc@toks=\expandafter{\expandafter \DD@\the\acc@toks}
+ \extacc@false
+ \else \def\@tempb{\breve}
+ \ifx \@tempa\@tempb
+ \acc@toks=\expandafter{\expandafter \BR@\the\acc@toks}
+ \extacc@false
+ \else \def\@tempb{\check}
+ \ifx \@tempa\@tempb
+ \acc@toks=\expandafter{\expandafter \CH@\the\acc@toks}
+ \extacc@false
+ \else \def\next@comm{\acc@@@{#1}}
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \next@comm}
+
+\def\acc@@@#1{
+ \inlineopen@
+ \setbox0\currstyle@hbox{#1}
+ \ifdim\wd0>\wrapthr@ % long
+ \wrap@@@acc{#1}
+ \else
+ \checkcompound@{#1}% #1=accented material
+ \ifcompound@ % not a single character
+ \ifextacc@
+ \ifdim\wd0>\widethr@ \wide@@@acc{#1}
+ \else \@@@acc{#1}
+ \fi \acc@kern
+ \else \wrap@@@acc{#1}
+ \fi
+ \else % single character
+ \ifdim\wd0>\widethr@ \wide@@@acc{#1}
+ \else \@@@acc{#1}
+ \fi \acc@kern
+ \fi
+ \fi
+ \inlineclose@}
+
+\def\acc@kern {\mkern1.2mu }
+
+% Checking if single character
+
+\newif\ifcompound@
+
+\def\checkcompound@#1{\compound@false
+ \edef\fdxxii@textfontii{\the\fontdimen22\textfont2}%
+ \fontdimen22\textfont2=300pc
+ \setbox\@tempboxa\hbox{\o@math\defaultdelims@
+ \def\frac{xx\@gobbletwo}
+ #1\o@math}
+ \@tempdima=\ht\@tempboxa
+ \setbox\@tempboxa\hbox{\o@math\defaultdelims@
+ \def\frac{xx\@gobbletwo}
+ \o@mathop{#1}\o@math}
+ \ifdim\ht\@tempboxa=\@tempdima
+ \compound@true
+ \fi
+ \fontdimen22\textfont2=\fdxxii@textfontii
+}
+
+
+% Attaching accents to #1, putting parentheses around if necessary.
+
+\def\wrap@@@acc#1{
+ \setbox\@tempboxa\currstyle@hbox{\nodisplay@false
+ \replacebindelims@{#1}{x}}
+ \ifdim\wd\@tempboxa>2\mex
+ \ifdisplay@ \currstyle@hbox{(#1)} \else (\inline{#1}) \fi
+ \samesize@^{\wrap@@@acc@}
+ \else
+ \ifdisplay@ \currstyle@hbox{#1} \else \inline{#1} \fi
+ \samesize@^{\wrap@@@acc@}
+ \fi
+}
+
+\def\wrap@@@acc@{\begingroup
+ \def\H@{\land} \def\T@{\sim} \def\B@{-}
+ \def\D@{\raise.5\mex\hbox{\bf.}} \def\DD@{\raise.5\mex\hbox{\bf..}}
+ \def\BR@{\smile} \def\CH@{\lor}
+ \the\acc@toks \endgroup}
+
+% Stacked accents
+
+\newdimen\xheight@
+
+\def\acc@def#1#2#3#4{\def#1{\fontdimen5 #4=\@tempdima
+ \ifcompound@ % if compound
+ \rlap{\o@math#2{\currstyle@hbox{#3}}\o@math}
+ \else % if single character
+ \rlap{\currstyle@hbox{#2{#3}}}
+ \fi
+ \advance\@tempdima\@tempdimb}}
+
+\def\xacc@def#1#2#3#4{\def#1{\begingroup
+ \advance\@tempdima 1.5\@tempdimb
+ \fontdimen5 #4=\@tempdima
+ \ifcompound@ % if compound
+ \rlap{\o@math#2{\currstyle@hbox{#3}}\o@math}
+ \else
+ \rlap{\currstyle@hbox{#2{#3}}}
+ \fi
+ \endgroup
+ \fontdimen5 #4=\xxheight@
+ \advance\@tempdima\@tempdimb}}
+
+\def\wide@@@acc#1{% uses fontdimens
+ \ifcase\mathcount@ \def\acc@font{\textfont3 } \def\xacc@font{\textfont0 }
+ \or \def\acc@font{\scriptfont3 } \def\xacc@font{\scriptfont0 }
+ \else \def\acc@font{\scriptscriptfont3 } \def\xacc@font{\scriptscriptfont0 }
+ \fi
+ \edef\xheight@{\the\fontdimen5\acc@font}%
+ \edef\xxheight@{\the\fontdimen5\xacc@font}%
+ \@tempdima=\xheight@ \@tempdimb=-.55\@tempdima
+ \acc@def{\H@}{\o@widehat}{#1}\acc@font
+ \acc@def{\T@}{\o@widetilde}{#1}\acc@font
+ \xacc@def{\B@}{\widebar}{#1}\xacc@font
+ \acc@def{\D@}{\o@dot}{#1}\xacc@font
+ \acc@def{\DD@}{\o@ddot}{#1}\xacc@font
+ \acc@def{\BR@}{\o@breve}{#1}\xacc@font
+ \acc@def{\CH@}{\o@check}{#1}\xacc@font
+ \the\acc@toks
+ \currstyle@hbox{#1}
+ \fontdimen5\acc@font=\xheight@
+ \fontdimen5\xacc@font=\xxheight@
+}
+
+\def\@@@acc#1{% uses fontdimens!
+ \ifcase\mathcount@ \def\acc@font{\textfont0 }
+ \or \def\acc@font{\scriptfont0 }
+ \else \def\acc@font{\scriptscriptfont0 }
+ \fi
+ \edef\xheight@{\the\fontdimen5\acc@font}%
+ \@tempdima=\xheight@ \@tempdimb=-.55\@tempdima
+ \acc@def{\H@}{\o@hat}{#1}\acc@font
+ \acc@def{\T@}{\o@tilde}{#1}\acc@font
+ \acc@def{\B@}{\o@bar}{#1}\acc@font
+ \acc@def{\D@}{\o@dot}{#1}\acc@font
+ \acc@def{\DD@}{\o@ddot}{#1}\acc@font
+ \acc@def{\BR@}{\o@breve}{#1}\acc@font
+ \acc@def{\CH@}{\o@check}{#1}\acc@font
+ \the\acc@toks
+ \currstyle@hbox{#1}
+ \fontdimen5\acc@font=\xheight@
+}
+
+\let\inlineopen@\relax
+\let\inlineclose@\relax
+
+%
+% E x p a n d a b l e h o r i z o n t a l a r r o w s
+%
+
+\def\longrightarrow@#1#2{\mathrel{\mathopen-\axis@@
+ \axis@{#1}{#2}
+ \axis@@\mathclose\rightarrow}}
+
+\def\longleftarrow@#1#2{\mathrel{\mathopen\leftarrow\axis@@
+ \axis@{#1}{#2}
+ \axis@@\mathclose-}}
+
+\def\longleftrightarrow@#1#2{\mathrel{\mathopen\leftarrow\axis@@
+ \axis@{#1}{#2}
+ \axis@@\mathclose\rightarrow}}
+
+\pdef\to{\def\afterparse@{
+ \longrightarrow@{\ifsp@\sp@toks@\fi}{\ifsb@\sb@toks@\fi}\next}
+ \sb@false\sp@false
+ \def\next@comm{\afterassignment\parse@next\let\next=}
+ \next@comm}
+
+\pdef\ot{\def\afterparse@{
+ \longleftarrow@{\ifsp@\sp@toks@\fi}{\ifsb@\sb@toks@\fi}\next}
+ \sb@false\sp@false
+ \def\next@comm{\afterassignment\parse@next\let\next=}
+ \next@comm}
+
+\pdef\otto{\def\afterparse@{
+ \longleftrightarrow@{\ifsp@\sp@toks@\fi}{\ifsb@\sb@toks@\fi}\next}
+ \sb@false\sp@false
+ \def\next@comm{\afterassignment\parse@next\let\next=}
+ \next@comm}
+
+\pdef\mapsto{\mathrel{\mapstochar}\nobreak\mathclose{}\mathopen{}\to}
+ % \nobreak inserted thanks to E.H. Lohse
+
+\def\sp@toks@{\edef\@tempa{\noexpand\noexpand\noexpand\inline{\the\sp@toks}}
+ \@tempa}
+
+\def\sb@toks@{\edef\@tempa{\noexpand\noexpand\noexpand\inline{\the\sb@toks}}
+ \@tempa}
+
+\def\axis@#1#2{\setbox0\scriptstylehbox@{\protectinline@true #1}
+ \er@wd=\wd0
+ \setbox\@tempboxa\scriptstylehbox@{\protectinline@true #2}
+ \ifdim\wd\@tempboxa>\er@wd \er@wd=\wd\@tempboxa\fi
+ \@tempdima=\ht\@tempboxa
+ \advance\@tempdima\dp\@tempboxa
+ \advance\@tempdima-.42\mex
+ \vtop{\offinterlineskip
+ \hbox{\vbox{\hbox to\er@wd{\hss\box0\hss}%
+ \vskip -.26\mex
+ \hbox to\er@wd{\axis@@@\hfill}}}
+ \vskip -.26\mex
+ \hbox to\er@wd{\hss\box\@tempboxa\hss}}
+ }
+
+\def\axis@@{\mkern-4.5mu %%% mkern setting adjusted 24 Sept. 2002
+ \axis@@@\mskip 3mu plus \arrow@expandability mu %%% thanks to E.H. Lohse
+ \mkern-4.5mu}
+
+\def\axis@@@{%
+ \cleaders\hbox{\o@math\mkern-3mu \icurrstyle@\mathord- \mkern-3mu\o@math}}
+
+\def\arrow@expandability{1.2}
+
+%
+% R o o t s
+%
+\def\o@sqrt{\radical"270370 }
+
+\pdef\sqrt#1{\inlineopen@\kern.4\mex\root@{}{#1}\inlineclose@}
+% \def changed to \pdef on 25 Sept. 2002 thanks to Michal Malek
+
+\pdef\root#1#2{\inlineopen@\kern.5\mex\root@{#1}{#2}\inlineclose@}
+% \def changed to \pdef on 25 Sept. 2002 thanks to Michal Malek
+
+\def\root@#1#2{%
+ \setbox0\currstyle@hbox{\toprestricted@true #2
+ \vrule \@height 1.6\mex \@depth0pt \@width 0pt} % mathstrut's top
+ \setbox\@tempboxa\hbox{\o@math\currstyle@
+ \ifdisplay@ \@tempdima=.6\dp\sizebox@ % bottom is half of that of sizebox
+ \else \@tempdima=.2\mex % bottom is a bit below the baseline
+ \fi
+ \setbox\@tempboxa\hbox to\wd0{%
+ \vrule \@height\ht0 \@depth\@tempdima \@width 0pt\hss}%
+ \global\setbox\sizebox@\copy\@tempboxa
+ \setbox\@tempboxa\hbox{\o@math\currstyle@\o@sqrt{\box\@tempboxa}\o@math}%
+ \@tempdima=\ht\@tempboxa \advance\@tempdima-\dp\@tempboxa
+ \advance\@tempdima 1.6\mex
+ \raise.4\@tempdima\hbox{\advance\mathcount@2\imath@{#1}}%
+ \kern-.3\mex
+ \box\@tempboxa
+ \o@math} % tempboxa := the radical sign with #1 and without #2
+ \resizebox@{\sizebox@} % sizebox matches top of #2 and bottom at @tempdima
+ \setbox0\hbox to\wd\@tempboxa{\hss\box0} % box0 = #1 shifted right
+ \setbox0\vbox{\offinterlineskip
+ \vskip-.1\mex
+ \@tempdima=\ht\@tempboxa
+ \dimen@=\dp\@tempboxa
+ \advance\@tempdima \dimen@
+ \advance\@tempdima -.55\mex
+ \box\@tempboxa
+ \vskip -\@tempdima
+ \box0} % box0 = the result
+ \box0\kern.3\mex\relax % space following the root
+}
+
+%
+% U n d e r b r a c e a n d o v e r b r a c e
+%
+
+% Underbrace and overbrace are designed as escape commands, because they
+% may extend accross unbalanced delimiters:
+
+\def\@underbrace#1{\o@mathop{\vtop{%
+ \ialign{##\crcr
+ \o@math\hfil\dcurrstyle@{#1}\hfil\o@math\crcr
+ \noalign{\kern 3pt\nointerlineskip} \upbracefill \crcr
+ \noalign{\kern 3pt}}}}\limits}
+
+\def\underbrace#1#2#3{\null\!
+ \def\@tempa{#2}\def\@tempb{_}%
+ \ifx\@tempa\@tempb
+ \b@ubrace@#1\e@ubrace@{#3}\!
+ \else\n@err{Missing _ after \string\underbrace}
+ {Wrong syntax. I expected something like \underbrace{...}_{...}}
+ #1
+ \fi}
+
+\def\b@ubrace@{%
+ \ifdisplay@ \store@ec{\b@ubrace@@}{}
+ \else \b@ubrace@@
+ \fi}
+
+\def\b@ubrace@@{\setbox0\hbox\bgroup}
+
+\def\e@ubrace@#1{%
+ \ifdisplay@ \store@ec{\e@ubrace@@{#1}}{}
+ \else \e@ubrace@@{#1}
+ \fi}
+
+\def\e@ubrace@@#1{\egroup\@underbrace{\box0}_{#1}}
+
+\def\@overbrace#1{\o@mathop{\vbox{%
+ \ialign{##\crcr
+ \noalign{\kern 3pt\nointerlineskip}
+ \downbracefill \crcr
+ \noalign{\kern 3pt}\crcr
+ \o@math\hfil\dcurrstyle@{#1}\hfil\o@math\crcr}}}\limits}
+
+\def\overbrace#1#2#3{\null\!
+ \def\@tempa{#2}\def\@tempb{^}%
+ \ifx\@tempa\@tempb
+ \b@obrace@#1\e@obrace@{#3}\!
+ \else\n@err{Missing ^ after \string\overbrace}
+ {Wrong syntax. I expected something like \overbrace{...}^{...}}
+ #1
+ \fi}
+
+\def\b@obrace@{%
+ \ifdisplay@ \store@ec{\b@obrace@@}{}
+ \else \b@obrace@@
+ \fi}
+
+\def\b@obrace@@{\setbox0\hbox\bgroup}
+
+\def\e@obrace@#1{%
+ \ifdisplay@ \store@ec{\e@obrace@@{#1}}{}
+ \else \e@obrace@@{#1}
+ \fi}
+
+\def\e@obrace@@#1{\egroup\@overbrace{\box0}^{#1}}
+
+%
+% F r a c t i o n s
+%
+
+% This is tricky.
+% See Natural TeX notation in mathematics,
+% in: Proc. Conf. EuroTeX 2001, Kerkrade, 23--27 September 2001;
+% online at www.ntg.nl/eurotex/proceedings.html
+
+\let\o@over=\over
+\let\o@atop=\atop
+\let\o@choose=\choose
+
+\def\over{\n@err{Disabled command \string\over }
+ {No more a valid command. Replace {A \over B} with \frac A B.}}
+\def\atop{\n@err{Disabled command \string\atop }
+ {No more a valid command. Use array instead.}}
+\def\choose{\n@err{Disabled command \string\choose }
+ {No more a valid command. Replace {A \choose B} with \binom A B.}}
+
+% \frac is defined here
+
+\pdef\frac#1#2{%
+ \checknumeric@{#1#2}
+ \ifdisplay@
+ \ifresult@ % numeric extensible
+ \ext@frac{#1}{#2}
+ \else \d@Frac{#1}{#2}
+ \fi
+ \else \inlinefrac@{#1}{#2}
+ \fi
+}
+
+% displayed fraction with setsize.
+
+\newdimen\htdecrement@ % global
+\newdimen\dpdecrement@ % global
+
+\def\d@Frac#1#2{\begingroup
+ \setbox\@tempboxa\hbox{\o@math\dcurrstyle@
+ {\setbox0\currstyle@hbox{\vrule\@depth .7\mex\@width 0pt
+ \botrestricted@false #1}%
+ \@tempdima=\ht0 \advance\@tempdima-\ht\sizebox@
+ \global\htdecrement@=\@tempdima
+% \@tempdima=\dp0 \advance\@tempdima .5ex \dp0=\@tempdima
+ \box0
+ \above\fracrulethickness@
+ \setbox0\currstyle@hbox{\vrule\@height 2\mex\@width 0pt
+ \toprestricted@false #2}%
+ \@tempdimb=\dp0 \advance\@tempdimb-\dp\sizebox@
+ \global\dpdecrement@=\@tempdimb
+% \@tempdimb=\ht0 \advance\@tempdimb .5ex \ht0=\@tempdimb
+ \box0
+ }%
+ \o@math}%
+ \setbox0\copy\@tempboxa
+ \iftoprestricted@ \else
+ \@tempdimb=\ht0 \advance\@tempdimb .4\mex \ht0=\@tempdimb
+ \fi
+ \ifbotrestricted@ \else
+ \@tempdimb=\dp0 \advance\@tempdimb .5\mex \dp0=\@tempdimb
+ \fi
+ \box0 % print
+ \@tempdima=\ht\@tempboxa \advance\@tempdima-\htdecrement@
+ \ht\@tempboxa=\@tempdima
+ \@tempdima=\dp\@tempboxa \advance\@tempdima-\dpdecrement@
+ \dp\@tempboxa=\@tempdima
+ \global\setbox\sizebox@\copy\@tempboxa
+ \endgroup
+ \resizebox@{\sizebox@}}
+
+\newdimen\fracrulethickness@
+\fracrulethickness@=.3pt
+
+\def\shillingsign@{/}
+
+\def\inlinefrac@#1#2{%
+ \checkcompact@{#1}{\medmuskip=0mu\thickmuskip=0mu\thinmuskip=0mu}%
+ \ifresult@ \wrapfrac@{#1} \else (\wrapfrac@{#1}) \fi
+ \shillingsign@
+ \checkcompact@{\mathord{}#2}{\medmuskip=0mu\thickmuskip=0mu}%
+ \ifresult@ \wrapfrac@{#2} \else (\wrapfrac@{#2}) \fi
+}
+
+% Extensible fractions are middle delimiters:
+
+\def\ext@frac#1#2{\mathinner{}\ddelim@m:{{#1}{#2}}\mathinner{}}
+
+% Here is the command to size a numeric fraction: small if sizebox fits
+% into some bounds. The bounds themselves are bigger than smallest size
+% parentheses.
+
+\def\size@frac#1#2{%
+ \ifdim\ht\sizebox>2.3\mex {\dcurrstyle@{#1\o@over#2}}
+ \else
+ \ifdim\dp\sizebox>1.4\mex {\dcurrstyle@{#1\o@over#2}}
+ \else {\icurrstyle@{#1\o@over#2}}
+ \fi
+ \fi
+}
+
+% Here is a macro to recognize a numeric argument. The criterion is that after
+% removal of all characters 0--9 the typeset box is of height no greater than
+% 1/2 ex.
+
+\def\checknumeric@#1{\setbox0\hbox{\defaultdelims@
+ \o@math\removenums@{#1}\o@math}
+ \ifdim\ht0>.5ex\relax
+ \global\result@false
+ \else\global\result@true
+ \fi}
+
+\def\removenums@#1{\begingroup \def\frac##1##2{X}
+ \uccode``=`|
+ \uccode`0=`.\uccode`1=`.\uccode`2=`.\uccode`3=`.\uccode`4=`.
+ \uccode`5=`.\uccode`6=`.\uccode`7=`.\uccode`8=`.\uccode`9=`.\uppercase{#1}
+\endgroup}
+
+\def\checkcompact@#1#2{\setbox\@tempboxa\hbox{\o@math
+ \def\frac##1##2{\mskip\medmuskip}
+ \lowercase{\remove@ss\replacebindelims@{#1}{\mathord{}}}\o@math}
+ \@tempdima=\wd\@tempboxa
+ \setbox\@tempboxa\hbox{\o@math\def\frac##1##2{\mskip\medmuskip} #2
+ \remove@compact{\remove@ss\replacebindelims@{#1}{\mathord{}}}\o@math}
+ \advance\@tempdima-\wd\@tempboxa
+ \ifdim\@tempdima>0pt \relax\result@false\else\result@true\fi}
+
+\catcode`\^=13
+\catcode`\_=13
+
+\def\remove@ss{\def^##1{}\def_##1{}}
+
+\catcode`\^=12
+\catcode`\_=12
+
+
+\def\remove@compact#1{\begingroup
+ \def\shillingsign@{} \def\backslash{}
+ \def\vert{} \def\Vert{}
+ \def\uparrow{} \def\Uparrow{}
+ \def\downarrow{} \def\Downarrow{}
+ \def\updownarrow{} \def\Updownarrow{}
+ \removeslashes@{#1}\endgroup}
+
+\def\removeslashes@#1{\lccode`/=` \lccode`|=` \lowercase{#1}}
+
+\newdimen\wrapfrac@dim
+\newbox\wrapfrac@box
+
+\def\wrapfrac@#1{%
+ \begingroup
+ \@wrapfrac\mathopen{}#1 \relax\mathclose{}\frac\relax\relax\frac
+ \endgroup
+}
+% \relax after #1 added 4.4.2001
+% space after #1 added 7.5.2001
+
+\def\@wrapfrac#1\frac#2#3#4\frac{%
+ \def\frac@test{#2}\def\@relax{\relax}
+ \ifx\frac@test\@relax #1
+ \def\next@frac{}
+ \else
+ \@@wrapfrac{#1}{#2}{#3}{#4}
+ \def\next@frac{\next@frac@#4\frac}
+ \fi
+ \next@frac}
+
+\newif\ifwrap@
+
+\def\@@wrapfrac#1#2#3#4{%
+ \checknumeric@{#2#3}
+ \ifresult@ #1{#2\o@over#3} \def\next@frac@{\@wrapfrac}
+ \else \def\next@frac@{\@wrapfrac\mathord{}}
+ \wrap@false % to be true iff #4 starts with Ord, Op, Open, Inner
+ \setbox\wrapfrac@box\hbox{\o@math\mathord{}#4\mathinner{}\o@math}
+ \wrapfrac@dim=\wd\wrapfrac@box
+ \setbox\wrapfrac@box\hbox{\o@math\mathrel{}#4\mathinner{}\o@math}
+ \advance\wrapfrac@dim-\wd\wrapfrac@box
+ \ifdim\wrapfrac@dim<0pt \wrap@true\fi
+ \ifwrap@ % relax
+ \else % now \wrap@false; to be true if #1 ends with Ord, Op, Close, Inner
+ \setbox\wrapfrac@box\hbox{\o@math\mathinner{}#1\mathopen{}\o@math}
+ \wrapfrac@dim=\wd\wrapfrac@box
+ \setbox\wrapfrac@box\hbox{\o@math\mathinner{}#1\mathrel{}\o@math}
+ \advance\wrapfrac@dim-\wd\wrapfrac@box
+ \ifdim\wrapfrac@dim<0pt \wrap@true\fi
+ \ifwrap@ % now #1 ends with Ord, Op, Close, Inner
+ % now \wrap@true; check whether #1 ends with +,-,\pm,\mp
+ \setbox\wrapfrac@box\hbox{\o@math\testing@true \def\pm{=}\def\mp{=}
+ \uccode`+=`=\uccode`-=`= \uppercase{#1}\mathclose{}\o@math}
+ \wrapfrac@dim=\wd\wrapfrac@box
+ \setbox\wrapfrac@box\hbox{\o@math\testing@true \def\pm{=}\def\mp{=}
+ \uccode`+=`=\uccode`-=`= \uppercase{#1}\mathopen{}\o@math}
+ \advance\wrapfrac@dim-\wd\wrapfrac@box
+ \ifdim\wrapfrac@dim<0pt \wrapexception@{#2}
+ \ifresult@\wrap@true \else\wrap@false \fi
+ \fi
+ \ifwrap@ % now Ord, Op, Close, Inner; test whether Inner
+ \setbox\wrapfrac@box\hbox{\o@math\testing@true\mathinner{}#1\mathclose{}
+ \o@math}
+ \wrapfrac@dim=\wd\wrapfrac@box
+ \setbox\wrapfrac@box\hbox{\o@math\testing@true\mathinner{}#1\mathpunct{}
+ \o@math}
+ \advance\wrapfrac@dim-\wd\wrapfrac@box
+ \ifdim\wrapfrac@dim<0pt \result@true % #1 ends with Inner
+ \else % now test whether #1 ends with a digit
+ \checkwrapexception@{#1}
+ \fi
+ \ifresult@ % if wrapexception
+ \wrapexception@{\uccode`.=`+ % make numbers into Bins
+ \uccode`0=`+ \uccode`1=`+ \uccode`2=`+ \uccode`3=`+ \uccode`4=`+
+ \uccode`5=`+ \uccode`6=`+ \uccode`7=`+ \uccode`8=`+ \uccode`9=`+
+ \uppercase{#2}}
+ \ifresult@\wrap@true \else\wrap@false \fi
+ \else \wrap@true
+ \fi
+ \fi
+ \else % now #1 ends with Bin, Rel, Open, Punct
+ \setbox\wrapfrac@box\hbox{\o@math\mathinner{}#1\mathclose{}\o@math}
+ \wrapfrac@dim=\wd\wrapfrac@box
+ \setbox\wrapfrac@box\hbox{\o@math\mathinner{}#1\mathrel{}\o@math}
+ \advance\wrapfrac@dim-\wd\wrapfrac@box
+ \ifdim\wrapfrac@dim<0pt % #1 ends with Bin*
+ \wrapexception@{#2}
+ \ifresult@\wrap@true \else\wrap@false \fi
+ \else \wrap@false
+ \fi
+ \fi
+ \fi
+ \ifwrap@
+ #1(\inlinefrac@{#2}{#3})
+ \else
+ #1\mathopen{}\inlinefrac@{#2}{#3}\mathclose{}
+ \fi
+ \fi}
+
+% Called when #1 ends with Ord, Op, Close, Inner; checks whether
+% it ends with a digit.
+
+\def\checkwrapexception@#1{% checks whether #1 ends with a digit
+ \result@false
+ \setbox\wrapfrac@box\hbox{\o@math\testing@true
+ \uccode`0=`= \uccode`1=`= \uccode`2=`= \uccode`3=`= \uccode`4=`=
+ \uccode`5=`= \uccode`6=`= \uccode`7=`= \uccode`8=`= \uccode`9=`=
+ \uppercase{#1}\mathclose{}\o@math}
+ \wrapfrac@dim=\wd\wrapfrac@box
+ \setbox\wrapfrac@box\hbox{\o@math\testing@true
+ \uccode`0=`= \uccode`1=`= \uccode`2=`= \uccode`3=`= \uccode`4=`=
+ \uccode`5=`= \uccode`6=`= \uccode`7=`= \uccode`8=`= \uccode`9=`=
+ \uppercase{#1}\mathopen{}\o@math}
+ \advance\wrapfrac@dim-\wd\wrapfrac@box
+ \ifdim\wrapfrac@dim<0pt \result@true \else \fi}
+
+\def\wrapexception@#1{% checks whether #1 starts with Bin
+ \result@false
+ \setbox\wrapfrac@box\hbox{\o@math\mathord{}#1\mathclose{}\o@math}
+ \wrapfrac@dim=\wd\wrapfrac@box
+ \setbox\wrapfrac@box\hbox{\o@math\mathinner{}#1\mathclose{}\o@math}
+ \advance\wrapfrac@dim-\wd\wrapfrac@box
+ \ifdim\wrapfrac@dim=0pt \result@true \fi}
+
+%
+% A r g u m e n t p l a c e h o l d e r
+%
+
+\pdef\adot{\checkpunct@\mathclose{}
+ \ifpunct@\else\mkern 1.8mu\fi
+ {\cdot}\, \mathopen{}}
+
+%
+% S p a c e s
+%
+
+% Firstly, disable spacefactor -- this makes typesetting easier.
+% (US TeXperts may wish to restore.)
+
+\frenchspacing
+
+% Secondly, we redefine `\ ' to produce breakable space in math mode.
+% To be used after a punctuation, which itself adds a thinmuskip.
+
+\def\space@{{} }
+\def\mspace@{\mskip 2.4mu plus 3.6mu minus 1.8mu}
+
+\def\ {\ifmmode\penalty0\mspace@\else\space@\fi}
+
+% Quads are 1pc long:
+
+\def\quad{\null\hskip1pc\relax}
+\def\qquad{\null\hskip2pc\relax}
+\def\qqquad{\null\hskip3pc\relax}
+
+% Nath also introduces a new environment to set math material tight.
+
+\def\tight{\def\mspaces@{\thinmuskip=2.4mu
+ \medmuskip=1.2mu
+ \thickmuskip=4.5mu
+ \def\mspace@{\mskip 1.5mu}%
+ \def\quad{\null\hskip .6pc\relax}%
+ \def\qquad{\null\hskip 1.2pc\relax}%
+ \def\qqquad{\null\hskip 1.8pc\relax}%
+}}
+
+\def\endtight{\global\@ignoretrue}
+
+%
+% P u n c t u a t i o n
+%
+
+\newif\ifpunct@ % global
+
+\def\punctpenalty{12756} % Earth's diameter in kilometers (> 10000)
+
+\def\@comma{\mc@comma\penalty\punctpenalty\relax}
+\def\@semicolon{\mc@semicolon\penalty\punctpenalty\relax}
+
+\def\checkpunct@{\ifnum\lastpenalty=\punctpenalty\relax
+ \global\punct@true \else \global\punct@false \fi}
+
+\let\o@dots\dots
+
+\pdef\dots{%
+ \ifmmode
+ \checkpunct@
+ \ifpunct@ \ldots
+ \global\punct@false
+ \else \cdots
+ \fi
+ \else \o@dots
+ \fi}
+
+%
+% A r r a y
+%
+
+\let\o@array=\array
+\let\o@endarray=\endarray
+
+\newif\iflasthline@
+\global\lasthline@false
+
+\pdef\array{\hskip-\arraycolsep
+ \def\@arstrut{}
+ \let\hline\arr@hline
+ \amp@count=0
+ \setbox0\hbox\bgroup
+ \ifdisplay@\else\advance\mathcount@ 1
+ \n@warning{Array in in-line mode}
+ \fi
+ \o@math\o@array}
+
+% \@arraycr is \\, but must insert a strut at the end of the line
+
+
+
+\def\arraystrut{\vrule height 1.9\mex depth .75\mex width 0pt}
+
+\def\@arraycr{\mathclose{} % no math space
+ \hbox{\arraystrut}%
+ \arraycr@@}
+
+\def\arraycr@@{\crcr % nothing if following another \cr or \halign
+ \def\@amp{\hbox{\vrule height\arrayrowsep width 0pt}}
+ \@tempcnta=\amp@count
+ \loop\ifnum\@tempcnta>1
+ \edef\@amp{\@amp&} % line sep
+ \advance\@tempcnta-1
+ \repeat
+ \@amp
+ \cr}
+
+\pdef\endarray{% may follow after \hline; corrected 18 March 2003
+ \iflasthline@ \else \hbox{\arraystrut} \fi
+ \o@endarray % LaTeX's \endarray
+ \o@math\egroup
+ \@tempdima=\ht0 \advance\@tempdima -.15ex \ht0=\@tempdima
+ \@tempdima=\dp0 \advance\@tempdima -.15ex \dp0=\@tempdima
+ \resizebox@{0}\box0
+ \hskip-\arraycolsep\relax}
+\newcount\hline@num
+
+\pdef\arr@hline{\noalign\bgroup % begin noalign
+ \hline@num=1 \result@false
+ \def\hline@@@{\afterassignment\hline@ \global\let\hline@@=}%
+ \hline@@@}
+
+\def\hline@{
+ \ifx\hline@@\hline \result@false
+ \advance\hline@num 1\relax
+ \else \result@true
+ \ifx\hline@@\end \global\lasthline@true
+ \else \global\lasthline@false
+ \fi
+ \fi
+ \ifresult@
+ \@tempcnta=\hline@num
+ \loop\ifnum \@tempcnta > 0
+ \hrule height \arrayrulewidth
+ \vskip \doublerulesep
+ \vskip -\arrayrulewidth
+ \advance \@tempcnta -1
+ \repeat
+ \vskip -\doublerulesep
+ \egroup % end noalign
+ \iflasthline@ % if the bottom line
+ \else \arraycr@@
+ \mathopen{\hbox{\arraystrut}}
+ \fi
+ \def\hline@@@{\hline@@}
+ \fi
+ \hline@@@}
+
+\doublerulesep=\arrayrulewidth
+
+% \@arrayclassz now uses display mode, and
+% calls \@addamp if \@lastchclass = 4
+
+\def\@arrayclassz{\ifcase\@lastchclass\@acolampacol
+ \or\@ampacol \or \or \or\@addamp \or\@acolampacol \or\@firstampfalse\@acol
+ \fi
+ \edef\@preamble{\@preamble
+ \ifcase \@chnum
+ \hfil\protect\dmathon@\@sharp\protect\dmathoff@\hfil
+ \or \protect\dmathon@\@sharp\protect\dmathoff@\hfil
+ \or \hfil\protect\dmathon@\@sharp\protect\dmathoff@
+ \fi}
+ }
+
+% New \arraycolsep.
+
+\let\arraycolsepdim=\arraycolsep
+
+\def\arraycolsep{\prorated@\arraycolsepdim}
+
+% New \arrayrowsepdim
+
+\newdimen\arrayrowsepdim
+
+\arrayrowsepdim=.4ex
+\def\arrayrowsep{\prorated@\arrayrowsepdim}
+
+% Counting &'s
+
+\newcount\amp@count
+
+\def\@addamp{%
+ \if@firstamp \amp@count=1
+ \@firstampfalse
+ \else \advance\amp@count by 1
+ \edef\@preamble{\@preamble &}%
+ \fi}
+
+
+
+% Cases is arrays
+
+\def\cases{\displayon@\{\hskip.5ex \array{ll}}
+\def\endcases{\endarray\right.\displayoff@}
+
+%
+% M a t r i c e s
+%
+
+\pdef\matrix{\setbox0\hbox\bgroup\o@math
+ \ifdisplay@\else \advance\mathcount@ 1
+ \n@warning{Matrix in in-line mode}
+ \fi
+ \vcenter\bgroup %\vskip-.00005ex
+ \let\\=\crcr \baselineskip=2.7\mex \lineskip=1.2\mex
+ \ialign\bgroup
+ &\hfil\hbox{\dmathon@##\dmathoff@}\hfil\hskip2\mex\crcr}
+
+\pdef\endmatrix{\crcr\egroup %\vskip-.00005ex
+ \egroup \o@math\hskip-2\mex\egroup \resizebox@{0}\box0}
+
+%\def\suppressminus@{\afterassignment\suppressminus@@\let\next=}
+%\def\@@@minus{-}
+%\def\suppressminus@@{\if\next\@@@minus \llap{$-$}\let\next\relax\fi \next}
+
+% Binom is a matrix:
+
+\pdef\binom#1#2{%
+ \ifdisplay@ (\matrix\inline{#1}\\\inline{#2}\endmatrix)
+ \else \advance\mathcount@ 1
+ \vcenter{\hbox{\o@math\biglp@\o@math}}
+ \displayed{\matrix\inline{#1}\\\inline{#2}\endmatrix}
+ \vcenter{\hbox{\o@math\bigrp@\o@math}}
+ \fi}
+
+\mathchardef\biglp@="0300
+\mathchardef\bigrp@="0301
+
+%
+% T a b l e o f c o n t e n t s
+%
+
+\let\o@addcontentsline\addcontentsline
+
+\def\addcontentsline#1#2#3{%
+ \begingroup
+ \def\acl@{#3}%
+ \the\protect@toks \def\protect{\noexpand}%
+ \edef\acl@{\acl@}%
+ \o@addcontentsline{#1}{#2}{\acl@}%
+ \endgroup
+}
+
+%
+% A M S - L a T e X
+%
+
+% Detecting AmSLaTeX
+
+\ifx\primfrac\undefined
+\else \typeout{} \typeout{AmSLaTeX detected.}
+ \typeout{Do not expect too much from this combination.}
+ \typeout{Consult Nath Guide if things go bad.}
+ \gdef\resetMathstrut@{}
+ \let\over=\@@over % restore \over
+ \let\above=\@@above % restore \above
+\fi
+
+%
+% I n i t i a l i z a t i o n
+%
+
+\catcode`\$=13
+
+\geometryfalse
+\silentfalse
+
+\frenchspacing
+
+%
+% T h e l o g o
+%
+
+\def\Nath{$`Nath$}
+
+%
+% E n d
+%
+
+\endinput
+
+