%  C A S E S . S T Y             ver 3.2    Mar 2020
%
%  Copyright (C) 1993,1994,1995,2000,2002,2020 by Donald Arseneau
%                                       asnd@triumf.ca
%  These macros may be freely transmitted, reproduced, or modified 
%  provided that this notice is left intact.  Sub-equation numbering
%  is based on subeqn.sty by Stephen Gildea; most of the rest is based
%  on LaTeX's \eqnarray by Leslie Lamport and the LaTeX3 team,
%  and parts of amsmath.sty by the American Mathematical Society.
%
%  This provides a LaTeX environment {numcases} to produce multi-case 
%  equations with a separate equation number for each case.  There is
%  also {subnumcases} which numbers each case with the overall equation
%  number plus a letter [8a, 8b, etc.].   The syntax is
%
%  \begin{numcases}{left_side}
%   case_1 & explanation_1 \\
%   case_2 & explanation_2 \\
%   ...
%   case_n & explanation_n
%  \end{numcases}
% 
%  Each case is a math formula, and each explanation is a piece of lr mode
%  text (which may contain math mode in \(...\) or $...$).  The explanations
%  are optional.  Equation numbers are inserted automatically, just as for
%  the eqnarray environment.  In particular, the \nonumber command suppresses
%  an equation number and the \label command allows reference to a particular 
%  case.  In a subnumcases environment, a \label in the left_side of the 
%  equation gives the overall equation number, without any letter. 
%
%  For detailed description and package options, see cases.pdf (cases.tex).
 
\ProvidesPackage{cases}[2020/03/29 ver 3.2]

\newdimen\numc@numwid

% copy \@@eqncr but change error message and handle \tag for amsmath:
\def\@@numc@cr{\let\reserved@a\relax
    \ifcase\@eqcnt \def\reserved@a{& & &}\or \def\reserved@a{& &}%
     \or \def\reserved@a{&}\else
       \let\reserved@a\@empty
       \@latex@error{Too many columns in numcases environment}\@ehc\fi
     \reserved@a \if@eqnsw\@eqnnum\stepcounter{equation}\else \iftag@ \df@tag\fi\fi
     \global\@eqnswtrue\global\@eqcnt\z@\cr}
\let\iftag@=\iffalse

\newenvironment{numcases}[1]%
{$$\numc@opts
 \refstepcounter{equation}% Needed for LHS \label
 \setbox\z@\hbox {% typeset LHS
   \def\@currentlabel{\p@equation\theequation}% local def
   $\displaystyle {#1{}}\m@th$}%
 \numc@setsub % maybe \subequations (handling \refstepcounter)
 \def\@currentlabel{\p@equation\theequation}%
 \global\@eqnswtrue\m@th
 \let\tag\numc@tag
 \settowidth{\numc@numwid}{\ \advance\c@equation\tw@\numc@eqnnum}%
 \@tempskipb\@centering
 \ifx\numc@left\mathindent % fleqn:
    \@tempskipa=\@ne\mathindent\@minus\@ne\mathindent
    \ifx\numc@forcenumwid\z@ % leqno
       \ifdim \numc@numwid>\mathindent % enlarge left space for equation number 
         \@tempskipa=\numc@numwid\@minus\numc@numwid
    \fi\fi
 \else % not fleqn:
    \@tempskipa=\@centering
    \advance\@tempskipa \numc@numwid\@minus\numc@numwid
    \advance\@tempskipa \numc@numwid\@minus\numc@forcenumwid
    \advance\@tempskipb \tw@\numc@numwid\@minus\tw@\numc@numwid
    \advance\@tempskipb -\numc@forcenumwid\@minus-\numc@forcenumwid
 \fi
 \setbox\tw@\vbox\bgroup
  \everycr{}\let\\\@eqncr \let\@@eqncr\@@numc@cr
  \tabskip\@tempskipa
  \halign to \ifx\numc@left\mathindent \linewidth \else \displaywidth \fi \bgroup
    \kern\wd\z@ \kern10\p@ % white space for LHS; assume (and force) width of brace
    \global\let\iftag@=\iffalse % for amsmath (make sure this is not in \if block)
    \global\@eqcnt\@ne $\numc@dispstyle ##\relax$\hfil % RHS
    \tabskip\z@skip &% explanation
    \global\@eqcnt\tw@
    \numc@expstyle\quad ##\unskip\numc@expstyle\hfil % \unskip removes quad if no explanation
    \tabskip\@tempskipb &% equation number
    \global\@eqcnt\thr@@\hbox to\numc@forcenumwid\bgroup\hss##\egroup
    \tabskip\z@skip\cr
}{%
    \@@numc@cr \egroup % end \halign, which does not contain first column or brace
  \global\advance\c@equation\m@ne 
  % Measure the natural width of the alignment
  \unskip\unpenalty\unskip\unpenalty \setbox\z@\lastbox % grab last line
  \nointerlineskip \copy\z@ % then put it back
  \global\dimen@i\wd\z@ 
  \setbox\z@\hbox{\unhbox\z@}% Measure its natural width in \dimen@i
  \global\dimen@i\wd\z@
 \egroup% end \vbox (\tw@) box\z@ is restored to LHS; \dimen@i is retained
 \advance\dimen@i-\@tempskipa \advance\dimen@i-\wd\z@ \advance\dimen@i-10\p@ 
 \advance\dimen@i-\@tempskipb 
 % now \@dimen@i is natural width of RHS + explanation + eqno columns
 \hbox to\wd\tw@{\m@th % assemble the whole equation stretched to display width
  \hskip\@tempskipa
  \box\z@ % LHS - parameter #1
  \hbox to10\p@{\hss$\displaystyle
    \dimen@\ht\tw@ \advance\dimen@\dp\tw@ % get size of brace
    \ifdim\dimen@<1.5em\dimen@=1.5em\fi % don't allow really small brace
    \left\lbrace\vcenter to\dimen@{\vfil}\,\right.\n@space % make brace
    $\hss}% end 10pt brace box
  \kern\dimen@i
  \hskip\@tempskipb
 }% finished first part (filled whole line) end the \hbox to\wd\tw@
 \kern-\wd\tw@ % backspace the full width
 \vcenter{\box\tw@}% overlay the alignment
\numc@resetsub
$$\global\@ignoretrue}

% a wrapper around \subequations so it works in cases with hyperref and amsmath
\def\numc@subequations{% skip the \refstepcounter inside \subequations
  \let\numc@opts\refstepcounter
  \def\refstepcounter##1{\let\refstepcounter\numc@opts}%
  \subequations
  \refstepcounter{equation}}

\let\numc@setsub\relax
\let\numc@resetsub\relax

\def\subnumcases{%
  \let\numc@setsub\numc@subequations 
  \let\numc@resetsub\endsubequations
  \numcases}
\let\endsubnumcases\endnumcases 

% declare subequations -- either defining them following the style of
% Gildea's subeqn.sty, or using the version from AMS-LaTeX if that is loaded.

\@ifundefined{c@parentequation}{% No AMS
\def\numc@eqnnum{\@eqnnum}
% for \tag (but not \tag*) without amsmath, using \@@numc@cr above.
\def\numc@tag#1{\def\@currentlabel{#1}%
  \gdef\df@tag{\def\theequation{#1}\@eqnnum}%
  \global\let\iftag@=\iftrue
  \nonumber}
%
% These versions of subequations follow the style of Gildea's subeqn.sty,
% but are thoroughly rewritten.  
%
% You can change the labelling by redefining \thesubequation, but the names
% of the counters may be confusing: The sub-number is given by counter
% {equation}, while the overall equation number is given by {mainequation}.
% There are two ways to reference the overall equation number:
% through the value of \c@mainequation, as in \Roman{mainequation}, or
% through \themainequation, which gives the text of the normal \theequation.
% Refer to the local sub-number with \c@equation, as in \alph{equation}.
% The default numbering is like 13c, given by:
%
\def\thesubequation{\themainequation\alph{equation}}
%
% Some alternatives:
%   \def\thesubequation{\themainequation.\Alph{equation}}  %  13.C
%   \def\thesubequation{\themainequation-\roman{equation}}  %  13-iii
%   \def\thesubequation{(\arabic{mainequation}\alph{equation})} % (13c)
% The third alternative should be used if a document style has
% declared  \renewcommand{\@eqnnum}{\theequation} and
% \renewcommand{\theequation}{(\arabic{equation})}, which makes
% \ref put parentheses around regular equation numbers automatically.
%
\def\subequations{\refstepcounter{equation}%
  \mathchardef\c@mainequation\c@equation
  \let\@tempa\protect % * added protection
  \def\protect{\noexpand\protect\noexpand}% *
  \edef\themainequation{\theequation}\let\theequation\thesubequation
  \let\protect\@tempa % *
  \global\c@equation\z@}
%
\def\endsubequations{%
  \global\c@equation\c@mainequation
  \global\@ignoretrue}
%
% \begin{subeqnarray}  works like  \begin{subequations}\begin{eqnarray},
% with the added feature that a \label command given given at the very
% beginning of the first entry defines a label for the overall equation 
% number.
%
\def\subeqnarray{\subequations\eqnarray\@ifnextchar\label{\@lab@subeqnarray}{}}
\def\endsubeqnarray{\endeqnarray\endsubequations}
\def\@lab@subeqnarray#1#2{\begingroup 
  \let\@currentlabel\themainequation #1{#2}\endgroup}
%
}{% AMS

%  \subequations already defined;
% use tag format
\def\numc@eqnnum{\tagform@{\theequation}}    
\def\numc@tag{\tag@in@align}

% add little space after brace to amsmath's cases
\def\@tempa{%
  \let\@ifnextchar\new@ifnextchar
  \left\lbrace
  \def\arraystretch{1.2}%
  \array{@{}l@{\quad}l@{}}%
}
\ifx \env@cases\@tempa % add a bit of space after brace in amsmath cases env
\def\env@cases{%
  \let\@ifnextchar\new@ifnextchar
  \left\lbrace\hskip 2\p@
  \def\arraystretch{1.2}%
  \array{@{}l@{\quad}l@{}}%
}
\fi
}% end amsmath branch

\def\numc@left{\@centering}
\def\numc@opts{}
\def\numc@forcenumwid{\numc@numwid}

\DeclareOption{subnum}{%
  \let\numc@setsub\numc@subequations 
  \let\numc@resetsub\endsubequations
}

\DeclareOption{fleqn}{
  \let\numc@left\mathindent
  \def\numc@opts{\displaywidth\linewidth}
}

\DeclareOption{leqno}{
  \let\numc@forcenumwid\z@
}

\let\numc@expstyle\@empty
\let\numc@dispstyle\displaystyle
\DeclareOption{amsstyle}{
  \def\numc@expstyle{$}% used in pairs for math-mode ($) explanation
  \let\numc@dispstyle\textstyle
}

\DeclareOption{casesstyle}{
 \newcommand\@unnc@casecr[1][\z@skip]{%
  \cr \noalign{\vskip #1}%
 }
 \renewenvironment{cases}{%
  \let\@ifnextchar\new@ifnextchar
  \left\lbrace\hskip 2\p@
  \vcenter to1.3em{}%
  \vcenter\bgroup
    \let\\\@unnc@casecr
    \openup\jot
    \tabskip\z@skip 
    \halign \bgroup 
      $\numc@dispstyle ##\m@th$\hfil 
      &\numc@expstyle\quad ##\unskip\numc@expstyle\hfil % \unskip removes space if no explanations
      \cr
 }{%
      \crcr
    \egroup
  \egroup
  \right.\n@space  
 }
}

\DeclareOption{cases}{\ExecuteOptions{casesstyle}}

\ProcessOptions

\endinput

% Send problem reports to asnd@triumf.ca

Test file integrity:  ASCII 32-57, 58-126:  !"#$%&'()*+,-./0123456789
:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~