%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% mhequ.sty v1.72, Copyright 2022 by Martin Hairer
%   This package is public domain. You are strongly encouraged to use
%   it and to distribute it further. If you have some contribution to
%	it, please let me know!
%
%   You may download the latest version of this package from
%
%              http://www.hairer.org/software/mhequ.zip
%
% Notes:
%   mhequ supports the packages "showkeys" (thus the [draft] option is suppressed)
%   and "hyperref".
%
% Options:
%
%   [lefttag] : Puts equation numbers to the left side of the page
%   [righttag]: Puts equation numbers to the right side of the page (default)
%   [numberall]: Numbers all equations
%
% Syntax:
%
%   \begin{equ}[label]
%
%	label : if a label is given, the equation is numbered. (default : no label)
%
%   \begin{equs}[n][label]
%
%	Creates a multiline / multicolumn equation environment.
%
%	n : number of columns. (default : 5) You can also choose n=0.
%	label : if a label is given, the environment is numbered. (one tag for the whole block)
%	The order of [n] and [label] is irrelevant.
%
%	If no label is given, one can number each line of the block individually by
%	using the \label command.
%
%	In the equs environment, the number of '&' signs per line has to be equal to 
%	2*n-1 if n>0 and to 0 if n=0. If there are less '&' signs, they are automatically 
%	appended at the end of the line.
%
% Provided commands:
%
%   \tag{theTag}     Replaces the number of the current equation by "theTag"
%
%   \notag           Forces to have no tag (only useful if [numberall] is active)
%
%   \minilab{label}  If "label" has already been used, switches to the minilab "label".
%                    If not, creates a new minilab. Inside a minilab, equations are labelled
%                    (1a), (1b),... instead of (1), (2), etc... You can refer to the number
%                    of the minilab with \ref.
%
%   \setlabtype{style}  Sets the style of the numbering of the minilab. Default is
%                    \setlabtype{alph}.
%
%   \intertext{material} Inserts 'material' between two lines in normal text mode.
%
%   \multicol{n}{material} Spans n columns of the equation array with 'material'. It
%                    has to be placed between two & signs, or at the end or the start
%                    of the line.
%
%   \text{material} Creates a \hbox containing 'material'.
%
% Warnings:
%
%   If you use the \tag command, a quite large number of runs may be needed in
%   order to get the desired output.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mhequ}
\DeclareOption{righttag}{\global\@MHleftfalse}
\DeclareOption{lefttag}{\global\@MHlefttrue}
\DeclareOption{numberall}{\global\@MHnumberalltrue}
\DeclareOption{fleqn}{\global\@MHflushtrue}
\DeclareOption{leqno}{\global\@MHlefttrue}

\newif\if@MHhaslab
\newif\if@MHuseminilab
\newif\if@MHnumberall
\newcount\@MHnocols
\newcount\@MHnocolstot
\newif\if@MHtag
\newif\if@MHleft
\newif\if@MHflush
\newif\if@MHglobals
\@MHnumberallfalse
\@MHglobalstrue

\def\@MHsaveglobals{%
\if@MHglobals
\global\let\MHglobal@label=\label
\global\let\MHglobal@ref=\ref
\global\let\MHglobal@multicol=\multicol
\global\let\MHglobal@notag=\notag
\global\let\MHglobal@text\text
\global\let\MHsavecr=\\
\@MHglobalsfalse\fi
}

\ProcessOptions

\def\MH@changecodes{\catcode`\:=12\catcode`\,=12\catcode`\.=12%
	\catcode`\'=12\catcode`\*=12\catcode`\&=12}

\def\@MHputleft#1{\hb@xt@.01\p@{}\rlap{\hskip-\displaywidth#1\@MHputnumber}} 
\def\@MHputright#1{\hb@xt@.01\p@{}\llap{#1\@MHputnumber}}

\if@MHleft\let\@MHput@lbl\@MHputleft%
	\else\let\@MHput@lbl\@MHputright\fi
	
\def\@MHresetlab{\if@MHnumberall\global\@MHhaslabtrue\else\global\@MHhaslabfalse\fi}
\@MHresetlab

\def\@MHref#1{\@ifundefined{r@#1}{??}{\MHglobal@ref{#1}}}
%%%%% Computes the length of its argument
\newcount\@MHLength
\def\computelength#1{\@MHLength=0 \getlength#1\end}
\def\getlength#1{\ifx#1\end \let\next=\relax \else \advance\@MHLength by1 \let\next=\getlength \fi \next}
	
\def\@makelabel#1{\refstepcounter{equation}\global\def\@mylabel{#1}%
	\@ifundefined{c@lab@#1}{\newcounter{lab@#1}}{}\setcounter{lab@#1}{0}%
	\immediate\write\@auxout{\string\@ifundefined{c@lab@#1}{\string\newcounter{lab@#1}}%
		{}\string\setcounter{lab@#1}{0}}%
	\global\expandafter\let\expandafter\c@MHCurrentCount\csname c@lab@#1\endcsname%
	\global\@namedef{MHused@#1}{}%
	\def\@currentlabel{\theequation}\MHglobal@label{#1}%
	}
\def\@uselabel#1{\global\def\@mylabel{#1}
	\global\expandafter\let\expandafter\c@MHCurrentCount\csname c@lab@#1\endcsname
	}
\def\@MHreset{\global\def\@MHeqno{\theequation}\global\@MHuseminilabfalse\@MHresetlab}
\def\@MHbuildlab#1{\@ifundefined{r@#1}%
	{\global\def\@MHeqno{\theequation\sublabeltype{MHCurrentCount}}}%
	{\global\def\@MHeqno{\ref{\@mylabel}\sublabeltype{MHCurrentCount}}}%
	}
\def\@MHUseLab#1{\@MHbuildlab{#1}\global\@MHuseminilabtrue}


\newskip\MHcenter \MHcenter=0pt plus 1000pt minus 1000pt
\newskip\MHbig \MHbig=1000pt plus 0pt minus 1000pt
\newskip\@MHlineskip
\def\openup{\afterassignment\@penup\dimen@=}
\def\@penup{\advance\lineskip\dimen@
  \advance\baselineskip\dimen@
  \advance\lineskiplimit\dimen@}
\newif\ifdt@p
\def\displ@y{\global\dt@ptrue\openup\jot\m@th
  \everycr{\noalign{\ifdt@p \global\dt@pfalse \ifdim\prevdepth>-1000\p@
      \vskip-\lineskiplimit \vskip\normallineskiplimit \fi
      \else \vskip\@MHlineskip\penalty\interdisplaylinepenalty \fi}}}
\def\@lign{\tabskip\z@skip\everycr{}}%% restore inside \displ@y
\def\displaylines#1{\displ@y \tabskip\z@skip
  \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
    #1\crcr}}

\def\@MHcrl{{\ifnum0=`}\fi\@ifnextchar[{\@MHcrlwith}{\@MHcrlwith[\z@]}}
\def\@MHcrlwith[#1]{\ifnum0=`{\fi}\MH@dd@nds&\global\@MHlineskip=#1\cr}

\def\@MHcrb{{\ifnum0=`}\fi\@ifnextchar[{\@MHcrbwith}{\@MHcrbwith[\z@]}}
\def\@MHcrbwith[#1]{\ifnum0=`{\fi}\MH@dd@nds\global\@MHlineskip=#1\cr}

\def\@MHlabel#1{\global\@MHhaslabtrue\global\def\@MHcurrentlabel{#1}}

\def\@MHwritelabel{\def\@currentlabel{\@MHeqno}%
	\if@MHleft\kern\displaywidth\kern0.2truecm\else\kern0.2cm\fi%
	\MHglobal@label{\@MHcurrentlabel}%
	\if@MHleft\kern-\displaywidth\kern-0.2truecm\else\kern-0.2cm\fi}

\def\@MHstep{\if@MHtag\else\if@MHuseminilab\stepcounter{MHCurrentCount}%
	\else\refstepcounter{equation}\fi\fi}

\def\@MHputnumber{\if@MHhaslab\@MHstep\if@MHleft\@MHwritelabel\fi%
        \hbox{\textrm(\@MHeqno)}%
	\if@MHleft\else\@MHwritelabel\fi%
	\fi\@MHresetlab}

\def\@MHnotag{\@MHhaslabfalse}

\def\@saveMHComms{\@MHsaveglobals\@restoretag\let\\=\@MHcr\let\ref=\@MHref%
	\let\label=\@MHlabel\let\notag\@MHnotag%
	\let\multicol\@MHspan\let\text\hbox}
\def\@restoreMHComms{\let\\=\MHsavecr\let\label=\MHglobal@label\@MHreset\let\ref=\MHglobal@ref%
	\let\multicol\MHglobal@multicol\let\notag\MHglobal@notag\let\text\MHglobal@text}



\def\@minilab#1{%
	\@MHUseLab{#1}\@ifundefined{MHused@#1}%
	{\@makelabel{#1}}{\@uselabel{#1}}%
	\let\label=\MHglobal@label\egroup\global\@ignoretrue}
\def\minilab{\bgroup\MH@changecodes\@minilab}
\def\@MHequation{\@MHsaveequation}



%% Preamble commands
\def\MHpre@ne{\MHs@tr@m\hfil$\MH@lign\displaystyle{\MHsh@rp}$\tabskip\z@skip&%
	\MHdecrt@t$\MH@lign\displaystyle{{}\MHsh@rp}$}
\def\MHpretw@{\tabskip\z@skip&\hfil\MHdecrt@t$\MH@lign\displaystyle{\MHsh@rp}$%
	\tabskip\z@skip&\MHdecrt@t$\MH@lign\displaystyle{{}\MHsh@rp}$}
\def\MHprethr@@{\hfil\tabskip\MHcenter&\tabskip\z@skip\my@MHput{\MHsh@rp}\crcr}
\def\MHprethr@@notag{\hfil\tabskip\MHcenter\crcr}
\def\MHd@cr{\global\advance\MHrem@inc@ls by -1}

\def\@MHspan#1#2{\multispan{#1}\ifnum\MHrem@inc@ls<1\global\MHrem@inc@ls=\MHt@tc@ls
	\global\advance\MHrem@inc@ls by 1\fi%
	\global\advance\MHrem@inc@ls by -#1%
	{\hfill$\displaystyle{#2}$\hfill}}

%% Building the preamble
\newcount\MHC@ls
\newcount\MHt@tc@ls
\newcount\MHrem@inc@ls
\def\MH@ddonecol{\xdef\MHpre@mble{\MHpre@mble\MHpretw@}}
\def\MH@ddcols{\if\the\MHC@ls1\let\comm\relax\else%
	\global\advance\MHt@tc@ls by 2%
	\MH@ddonecol\advance\MHC@ls by -1%
	\let\comm\MH@ddcols\fi\comm}
\def\MHm@kepre@mble#1{
	\if#10
	\global\MHt@tc@ls=0
	\xdef\MHpre@mble{\MHs@tr@m\hfil$\MH@lign\displaystyle{\MHsh@rp}$\MHpre@nd}
	\else
	\MHC@ls=#1
	\global\MHt@tc@ls=1
	\xdef\MHpre@mble{\MHpre@mble\MHpre@ne}
	\MH@ddcols
	\xdef\MHpre@mble{\MHpre@mble\MHpre@nd}
	\fi
	}

%% Build enough & signs to fill up the box
\def\MHm@ke@nds{\if\the\MHrem@inc@ls0\let\comm\relax\else%
	\xdef\MH@nds{\MH@nds &}\global\advance\MHrem@inc@ls by -1%
	\let\comm\MHm@ke@nds%
	\fi\comm}
\def\MH@dd@nds{\def\MH@nds{}\MHm@ke@nds\MH@nds}
\def\MHr@mto@ne{\global\MHrem@inc@ls=\MHt@tc@ls}

\def\MH@initone{\gdef\MHpre@mble{}
	\let\MH@restoretag\relax\let\MHsh@rp\relax\let\MH@lign\relax
	\let\my@MHput\relax\let\MHdecrt@t\relax\let\MHs@tr@m\relax%\let\@MHfill\relax
	}
\def\MH@inittwo{\let\MH@restoretag\@restoretag\let\MHsh@rp##\let\MH@lign\@lign
	\let\my@MHput\@MHput@lbl\let\MHdecrt@t\MHd@cr\let\MHs@tr@m\MHr@mto@ne%\let\@MHfill\my@fill
	\MHpre@mble
	}

\def\@newalign#1{\displ@y\tabskip\MHcenter
	\MH@initone
	\let\MHpre@nd\MHprethr@@
	\MHm@kepre@mble{#1}
	\xdef\MHpre@mble{\halign to\displaywidth\bgroup\MH@restoretag\MHpre@mble}
	\MH@inittwo
	}  
\def\@newbalign#1{\vcenter\bgroup\displ@y\tabskip\MHcenter
	\MH@initone
	\let\MHpre@nd\MHprethr@@notag
	\MHm@kepre@mble{#1}
	\xdef\MHpre@mble{\halign to\displaywidth\bgroup\MHpre@mble}
	\MH@inittwo
	}  
	    

\def\@begalign[#1]{\global\let\@MHcr\@MHcrl$$\@saveMHComms\@newalign{#1}}

\def\@ealign{\@MHcr\egroup}

\def\@restoretag{\if@MHtag\global\@MHtagfalse\global\let\@MHeqno=\@MHsaveno\fi}
\def\@MHtag#1{%
	\global\@MHtagtrue\global\let\@MHsaveno=\@MHeqno%
	\global\def\@MHeqno{#1}\egroup}
\def\tag{\bgroup\MH@changecodes\@MHtag}

\def\@equnolabel{\@MHresetlab}
\def\@equlabel[#1]{\label{#1}\global\@MHhaslabtrue}

\def\@ealignb{\@MHcr\egroup\egroup}
  
\def\@equbopt[#1]{\computelength{#1}\ifnum\@MHLength=1\@MHnocols=#1\else
	\label{#1}\global\@MHhaslabtrue\fi
	\@ifnextchar[{\@equbopt}{\@equb}}
\def\@equb{\@newbalign{\the\@MHnocols}}

%\def\equa{\global\let\@MHcr\@MHcrb%
%	$$\@saveMHComms\global\@MHnocols=1%
%	\@ifnextchar[{\@equbopt}{\@equb}}
%\def\endequa{\@ealignb\if@MHhaslab\@MHput@lbl{}\fi%
%	\@restoreMHComms$$\global\@ignoretrue}

\if@MHflush
	\def\equ{\@saveMHComms
	          \@beginparpenalty\predisplaypenalty
                   \@endparpenalty\postdisplaypenalty
	\trivlist\item[]\leavevmode
       \hb@xt@\linewidth\bgroup $\m@th% $
         \displaystyle
         \hskip\mathindent\@ifnextchar[\@equlabel\@equnolabel}
\def\endequ{%
	$\hfil % $
         \displaywidth\linewidth\hbox{\@MHputnumber}%
       \egroup
     \endtrivlist\@restoreMHComms\global\@ignoretrue}
\else
	\def\equ{$$\@saveMHComms\@ifnextchar[\@equlabel\@equnolabel}
	\def\endequ{%
		\if@MHhaslab\if@MHleft\leqno\else\eqno\fi{\@MHputnumber}\fi%
		\@restoreMHComms$$\global\@ignoretrue}
\fi

%\def\equs{\@ifnextchar[{\@begalign}{\@begalign[1]}}
%\def\endequs{\@ealign\@restoreMHComms$$\global\@ignoretrue}


\newif\if@isequa
\def\@analyzearg[#1]{\computelength{#1}\ifnum\@MHLength=1\@MHnocols=#1\else
	\@MHlabel{#1}\global\@isequatrue\fi%
	\@ifnextchar[{\@analyzearg}{\if@isequa%
	\global\let\@MHcr\@MHcrb%
	$$\@saveMHComms\@equb%
	\else\@begalign[\the\@MHnocols]\fi}}
\def\@endequs{\@ealign\@restoreMHComms$$}
\def\@endequa{\@ealignb\if@MHhaslab\@MHput@lbl{}\fi%
	\@restoreMHComms$$}
\def\equs{\global\@isequafalse\@MHnocols=5\@ifnextchar[{\@analyzearg}{\@begalign[5]}}
\def\endequs{\if@isequa\@endequa\else\@endequs\fi\global\@ignoretrue}
\let\equa\equs
\let\endequa\endequs

\def\setlabtype#1{\global\expandafter\let\expandafter\sublabeltype\csname #1\endcsname}

\@MHreset
\let\sublabeltype=\alph
\def\intertext#1{\noalign{\noindent#1}}

\def\strutdepth{0pt}
\def\@MHmargin#1{\strut\vadjust{\kern-\strutdepth\@MHspecial{#1}}}
\def\@MHspecial#1{\vtop to \strutdepth{\baselineskip\strutdepth\vss\llap{#1}\null}}

\let\MHgobble\@gobblecr