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