From 52ea84dcce84fa00ac4343ffae0295ff27578a2c Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 13 Jan 2006 00:00:23 +0000 Subject: nath git-svn-id: svn://tug.org/texlive/trunk@1129 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/nath/nath.sty | 3190 +++++++++++++++++++++++++++++ 1 file changed, 3190 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/nath/nath.sty (limited to 'Master/texmf-dist') 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 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 + + -- cgit v1.2.3