%% The package is licenced under Creative Commons Attribution-ShareAlike
%% 4.0 International (CC BY-SA 4.0)

\ProvidesPackage{eqexpl}[2022/06/17 v. 1.1.1]
\RequirePackage{etoolbox}
\RequirePackage{xparse}
\RequirePackage{calc}

%% Spaces between elements
\newlength{\eqexplSpaceWidth}
\newcommand{\eqexplSetSpace}[1]{%
  \setlength{\eqexplSpaceWidth}{\ifstrempty{#1}{2mm}{#1}}%
}
\eqexplSetSpace{}

%% Width of 'intro' (typ. 'where')
\newcommand{\eqexplSetIntro}[1]{%
  \def\eqexplIntro{#1}%
}
\eqexplSetIntro{}

%% Width of delimiter
\newcommand{\eqexplSetDelim}[1]{%
  \def\eqexplDelim{#1}%
}
\eqexplSetDelim{---}

%% Width of item
\newcommand{\eqexplSetItemWidth}[1]{%
  \def\eqexplItemWidth{#1}%
}
\eqexplSetItemWidth{5mm}

%% Align of item
\newcommand{\eqexplSetItemAlign}[1]{%
  \def\eqexplItemAlign{#1}%
}
\eqexplSetItemAlign{r}

\newlength{\itemWidth}
\newlength{\leftSideWidth}

\newenvironment{eqexpl}[1][\eqexplItemWidth]{%
  \let\olditem\item%
  \setlength{\itemWidth}{#1}%
  \setlength{\leftSideWidth}{\ifdefempty{\eqexplIntro}{}{\widthof{\eqexplIntro}+%
                             \eqexplSpaceWidth+}%
                             \itemWidth+%
                             \eqexplSpaceWidth+%
                             \widthof{\eqexplDelim}+%
                             \eqexplSpaceWidth}%
  \newtoggle{eqexplFirstItem}%
  \toggletrue{eqexplFirstItem}%
  \RenewDocumentCommand{\item}{ m O{\eqexplDelim}}{%
    \olditem \makebox[\leftSideWidth]{%
      \ifdefempty{\eqexplIntro}{}{
        \makebox[\widthof{\eqexplIntro}][l]{\iftoggle{eqexplFirstItem}{\eqexplIntro}{}}%
        \hspace{\eqexplSpaceWidth}%
      }
      \makebox[\itemWidth][\eqexplItemAlign]{##1}%
      \hspace{\eqexplSpaceWidth}%
      \makebox[\widthof{##2}][c]{##2}%
      \hspace{\eqexplSpaceWidth}%
    }%
    \togglefalse{eqexplFirstItem}%
    \ignorespaces% https://tex.stackexchange.com/a/44062
  }%
  \begin{list}{}{\setlength{\parsep}{0pt}%
  \setlength{\topsep}{0pt}%
  \setlength{\itemsep}{0pt}%
  \setlength{\labelsep}{0pt}%
  \setlength{\leftmargin}{\leftSideWidth}%
  \setlength{\itemindent}{-\leftSideWidth}}}{%
  \end{list}
}
\endinput