%D \module
%D   [       file=supp-mat,
%D        version=1998.09.10,
%D          title=\CONTEXT\ Support Macros,
%D       subtitle=Math,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D For practical reasons, I decided to move some math things to
%D a support module. There is nothing spectacular here. It may move
%D back to math-ini.

\writestatus{loading}{ConTeXt Support Macros / Math}

\unprotect

%D \macros
%D   {mathematics, math, nomathematics, startmathmode}
%D
%D The \type{$} can be both an begin and end math character.
%D This can lead to confusing and errorprone situations when
%D macros insert \type{$}. When for instance we have defined:
%D
%D \starttyping
%D \def\MyPlus{$\,+\,$}
%D \stoptyping
%D
%D the sequence \type{$x^2 \MyPlus y^2 = r^2$} will expand to:
%D
%D \starttyping
%D $x^2 $\,+\,$ y^2 = r^2$
%D \stoptyping
%D
%D Here the \type{\,} are given outside math mode and \TEX\ will
%D definitely complain about this. A more save definition would
%D have been:
%D
%D \starttyping
%D \def\MyPlus{\mathematics{\,+\,}}
%D \stoptyping
%D
%D Which is implemented (in \type{syst-ini.mkiv}) as:

% \let\normalsuperscript\Usuperscript
% \let\normalsubscript  \Usubscript
% \let\normalstartimath \Ustartmath
% \let\normalstopimath  \Ustopmath
% \let\normalstartdmath \Ustartdisplaymath
% \let\normalstopdmath  \Ustopdisplaymath

% \protected\def\Ustartdisplaymath
%   {\ifinner
%      \ifhmode
%        \normalUstartmath
%        \let\Ustopdisplaymath\normalUstopmath
%      \else
%        \normalUstartdisplaymath
%        \let\Ustopdisplaymath\normalUstopdisplaymath
%      \fi
%    \else
%      \normalUstartdisplaymath
%      \let\Ustopdisplaymath\normalUstopdisplaymath
%    \fi}

\protected\def\Ucheckedstartdisplaymath
  {\ifinner
     \ifhmode
       \normalUstartmath
       \let\Ucheckedstopdisplaymath\normalUstopmath
     \else
       \normalUstartdisplaymath
       \let\Ucheckedstopdisplaymath\normalUstopdisplaymath
     \fi
   \else
     \normalUstartdisplaymath
     \let\Ucheckedstopdisplaymath\normalUstopdisplaymath
   \fi}

\let\Ucheckedstopdisplaymath\relax

\def\normalmathaligntab{&} % \let\normalmathaligntab\aligntab does to work well in a let to & (a def works ok)

\let\normalsuper       \Usuperscript       % obsolete
\let\normalsuber       \Usubscript         % obsolete

\let\startimath        \Ustartmath
\let\stopimath         \Ustopmath
\let\startdmath        \Ustartdisplaymath  % \Ucheckedstartdisplaymath
\let\stopdmath         \Ustopdisplaymath   % \Ucheckedstopdisplaymath

\protected\def\mathematics#1{\relax         \ifmmode#1\else\normalstartimath#1\normalstopimath\fi}
\protected\def\displaymath#1{\noindent      \ifmmode#1\else\normalstartdmath#1\normalstopdmath\fi}
\protected\def\inlinemath #1{\dontleavehmode\ifmmode#1\else\normalstartimath#1\normalstopimath\fi}
\protected\def\textmath   #1{\dontleavehmode\ifmmode#1\else\begingroup\everymath\emptytoks\normalstartimath#1\normalstopimath\endgroup\fi} % \mathsurround\zeropoint

\let\m\mathematics

\let\stopmathmode\relax

\protected\def\startmathmode % nested variant
  {\relax\ifmmode
     \begingroup
     \let\stopmathmode\endgroup
   \else
     \normalstartimath
     \let\stopmathmode\normalstopimath
   \fi}

\protected\def\nomathematics#1%
  {\relax\ifmmode\hbox{#1}\else#1\fi}

\let\math\mathematics

%D \macros
%D   {displaymathematics,inlinemathematics,automathematics}
%D
%D An example of usage of the following can be found in the MathML module:

\ifdefined\strc_formulas_start_formula \else
    \def\strc_formulas_start_formula{\normalstartdmath}
    \def\strc_formulas_stop_formula {\normalstopdmath }
\fi

\protected\def\displaymathematics#1{\relax\ifmmode#1\else\strc_formulas_start_formula{}#1\strc_formulas_stop_formula\fi}
\protected\def\inlinemathematics   {\dontleavehmode\mathematics}
\protected\def\automathematics     {\relax\ifhmode\expandafter\inlinemathematics\else\expandafter\displaymathematics\fi}

% better, esp when used in bTABLE ... eTABLE

\protected\def\automathematics
  {\relax
   \ifhmode
     \expandafter\inlinemathematics
   \else\ifintable
     \doubleexpandafter\inlinemathematics
   \else
     \doubleexpandafter\displaymathematics
   \fi\fi}

%D \macros
%D   {dimension, nodimension}
%D
%D The next few macros are used for typesetting dimensions in
%D such a way that spacing is acceptable. I won't spend much
%D words on these macros, because they will be overloaded in
%D the units module.
%D
%D REPLACED (keep commented):

\newsignal\dimensionsignal

\def\dimensiontypeface  {\tf}
\def\dimensionhalfspace {\,}

\protected\def\dimension#1%
  {\pushmacro\dodimensionsignal
   \gdef\dodimensionsignal{\kern\dimensionsignal}%
   \ifzeropt\lastskip
     \ifzeropt\lastkern
       \ifmmode
         \mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
       \else
         \mathematics{\dimensiontypeface#1}%
       \fi
     \else\ifdim\lastkern=\dimensionsignal
       \mathematics{\dimensionhalfspace\dimensiontypeface#1}%
     \else
       \unkern\mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
     \fi\fi
   \else
     \unskip\mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
   \fi
   \dodimensionsignal
   \popmacro\dodimensionsignal}

\protected\def\nodimension#1%
  {\unskip#1\glet\dodimensionsignal\relax}

%D \macros
%D   {cramped}
%D
%D Cramped math:
%D
%D \startbuffer
%D \ruledhbox{$\left\{{x^2\over y^2}\right\}$}
%D \ruledhbox{$\cramped{\left\{ {x^2\over y^2}\right\}}$}
%D \stopbuffer
%D
%D \typebuffer \getbuffer

\protected\def\cramped
  {\mathpalette\math_cramped}

%D We force a cramped style by issuing a non||existing radical (box).
%D After that we make sure the height is correct. (Comment taken from
%D Morten Høgholm's mathtools package.) Macro suggested by AM and
%D cleaned up a bit by HH.

% original
%
% \def\docramped#1#2%
%   {\setbox\scratchbox\hbox
%     {\nulldelimiterspace\zeropoint
%      $\mathsurround\zeropoint#1\radical\zerocount{#2}$}%
%    \ifx#1\displaystyle
%       \scratchdimen\fontdimen8\textfont3
%       \advance\scratchdimen .25\fontdimen5\textfont2
%    \else
%       \scratchdimen1.25\fontdimen8
%       \ifx#1\textstyle\textfont
%       \else
%         \ifx#1\scriptstyle\scriptfont\else\scriptscriptfont\fi
%       \fi
%       3
%     \fi
%     \advance\scratchdimen-\ht\scratchbox
%     \ht\scratchbox-\scratchdimen
%     \box\scratchbox}

% mkii:
%
% \def\math_cramped#1#2%
%   {\begingroup % added HH, made even more cramped
%    \setbox\scratchbox\hbox
%      {\nulldelimiterspace\zeropoint
%       \normalstartimath\mathsurround\zeropoint#1\radical\zerocount{#2}\normalstopimath}%
%    \ht\scratchbox-\dimexpr
%      \ifx#1\displaystyle
%        \fontdimen\pluseight\textfont\plusthree
%        +.25\fontdimen\plusfive\textfont\plustwo
%      \else
%         1.25\fontdimen\pluseight
%           \ifx#1\textstyle
%             \textfont
%           \else\ifx#1\scriptstyle
%             \scriptfont
%           \else
%             \scriptscriptfont
%           \fi \fi
%           \plusthree
%      \fi
%      -\ht\scratchbox
%    \relax
%    \box\scratchbox
%    \endgroup}

\def\math_cramped#1#2% we have all in one family
  {\begingroup % added HH, made even more cramped
   \setbox\scratchbox\hbox
     {\nulldelimiterspace\zeropoint
      \normalstartimath\mathsurround\zeropoint#1\radical\zerocount{#2}\normalstopimath}%
   \ht\scratchbox-\dimexpr
     \ifx#1\displaystyle
            \fontdimen\pluseight\textfont\plusone
       + .25\fontdimen\plusfive \textfont\plusone
     \else
        1.25\fontdimen\pluseight
         \ifx#1\textstyle  \textfont        \else
         \ifx#1\scriptstyle\scriptfont      \else
                           \scriptscriptfont\fi\fi \plusone
     \fi
     -\ht\scratchbox
   \relax
   \box\scratchbox
   \endgroup}

%D \macros
%D    {cramedllap, crampedrlap, crampedclap}
%D
%D In many cases, one wants to use the \tex {clap} macro in
%D math mode while using subscripts. Normally, subscripts are
%D in cramped mode, and these macros allow you to go to
%D cramped mode. For example:
%D
%D \startbuffer
%D \startformula
%D   \sum_{a^2 < b^2 < c^2} \quad
%D   \sum_{\clap{a^2 < b^2 < c^2}} \quad
%D   \sum_{\crampedclap{a^2 < b^2 < c^2}}
%D \stopformula
%D \stopbuffer
%D
%D \start
%D   \typebuffer
%D   \switchtobodyfont[24pt]
%D   \getbuffer
%D \stop
%D
%D Notice that \type {\clap{\cramped ... }} would also work,
%D but it requires \TEX\ to typeset it arguments 16 times.

\protected\def\crampedllap{\mathpalette\math_cramped_llap}
\protected\def\crampedrlap{\mathpalette\math_cramped_rlap}
\protected\def\crampedclap{\mathpalette\math_cramped_clap}

\def\math_cramped_llap#1#2{{}\dollap{\math_cramped #1{#2}}}
\def\math_cramped_rlap#1#2{{}\dorlap{\math_cramped #1{#2}}}
\def\math_cramped_clap#1#2{{}\doclap{\math_cramped #1{#2}}}

% experiment, not yet to be used

% \protected\def\displaybreak
%   {\ifhmode
%      \removeunwantedspaces
%      \ifcase\raggedstatus\hfill\fi
%      \strut\penalty-9999 % \break fails on case (3)
%    \fi}
%
% \def\startdisplay{\displaybreak\ignorespaces\startpacked}
% \def\stopdisplay {\stoppacked\displaybreak\ignorespaces}

\let\superscript  \Usuperscript
\let\subscript    \Usubscript
\let\nosuperscript\Unosuperscript
\let\nosubscript  \Unosubscript

% only in luametatex:

\let\superprescript  \Usuperprescript
\let\subprescript    \Usubprescript
\let\nosuperprescript\Unosuperprescript
\let\nosubsprecript  \Unosubprescript

\protect \endinput

