\DeclareFontEncoding{LS1}{}{}
\DeclareFontSubstitution{LS1}{stix}{m}{n}
\DeclareMathAlphabet{\mathscr}{LS1}{stixscr}{m}{n}

\newcommand{\cA}{\mathcal{A}}
\newcommand{\cB}{\mathcal{B}}
\newcommand{\cC}{\mathcal{C}}
\newcommand{\cD}{\mathcal{D}}
\newcommand{\cE}{\mathcal{E}}
\newcommand{\cF}{\mathcal{F}}
\newcommand{\cG}{\mathcal{G}}
\newcommand{\cH}{\mathcal{H}}
\newcommand{\cI}{\mathcal{I}}
\newcommand{\cJ}{\mathcal{J}}
\newcommand{\cK}{\mathcal{K}}
\newcommand{\cL}{\mathcal{L}}
\newcommand{\cM}{\mathcal{M}}
\newcommand{\cN}{\mathcal{N}}
\newcommand{\cO}{\mathcal{O}}
\newcommand{\cP}{\mathcal{P}}
\newcommand{\cQ}{\mathcal{Q}}
\newcommand{\cR}{\mathcal{R}}
\newcommand{\cS}{\mathcal{S}}
\newcommand{\cT}{\mathcal{T}}
\newcommand{\cU}{\mathcal{U}}
\newcommand{\cV}{\mathcal{V}}
\newcommand{\cW}{\mathcal{W}}
\newcommand{\cX}{\mathcal{X}}
\newcommand{\cY}{\mathcal{Y}}
\newcommand{\cZ}{\mathcal{Z}}

\newcommand{\fA}{\mathfrak{A}}
\newcommand{\fB}{\mathfrak{B}}
\newcommand{\fC}{\mathfrak{C}}
\newcommand{\fD}{\mathfrak{D}}
\newcommand{\fE}{\mathfrak{E}}
\newcommand{\fF}{\mathfrak{F}}
\newcommand{\fG}{\mathfrak{G}}
\newcommand{\fH}{\mathfrak{H}}
\newcommand{\fI}{\mathfrak{I}}
\newcommand{\fJ}{{\bf\mathfrak{J}}}
\newcommand{\fK}{\mathfrak{K}}
\newcommand{\fL}{\mathfrak{L}}
\newcommand{\fM}{\mathfrak{M} \cfadd{multi}}
\newcommand{\fN}{\mathfrak{N}}
\newcommand{\fO}{\mathfrak{O}}
\newcommand{\fP}{\mathfrak{P}}
\newcommand{\fQ}{\mathfrak{Q}}
\newcommand{\fR}{\mathfrak{R}}
\newcommand{\fS}{\mathfrak{S}}
\newcommand{\fT}{\mathfrak{T}}
\newcommand{\fU}{\mathfrak{U}}
\newcommand{\fV}{\mathfrak{V}}
\newcommand{\fW}{\mathfrak{W}}
\newcommand{\fX}{\mathfrak{X}}
\newcommand{\fY}{\mathfrak{Y}}
\newcommand{\fZ}{\mathfrak{Z}}

\newcommand{\fa}{\mathfrak{a}}
\newcommand{\fb}{\mathfrak{b}}
\newcommand{\fc}{\mathfrak{c}}
\newcommand{\fd}{\mathfrak{d}}
\newcommand{\fe}{\mathfrak{e}}
\newcommand{\ff}{\mathfrak{f}}
\newcommand{\fg}{\mathfrak{g}}
\newcommand{\fh}{\mathfrak{h}}
%\newcommand{\fi}{\mathfrak{i}}
%\newcommand{\fj}{\mathfrak{j}}
\newcommand{\fk}{\mathfrak{k}}
\newcommand{\fl}{\mathfrak{l}}
\newcommand{\fm}{\mathfrak{m}}
\newcommand{\fn}{\mathfrak{n}}
\newcommand{\fo}{\mathfrak{o}}
\newcommand{\fp}{\mathfrak{p}}
\newcommand{\fq}{\mathfrak{q}}
\newcommand{\fr}{\mathfrak{r} \cfadd{rectifier}}
\newcommand{\fs}{\mathfrak{s}}
\newcommand{\ft}{\mathfrak{t}}
\newcommand{\fu}{\mathfrak{u}}
\newcommand{\fv}{\mathfrak{v}}
\newcommand{\fw}{\mathfrak{w}}
\newcommand{\fx}{\mathfrak{x}}
\newcommand{\fy}{\mathfrak{y}}
\newcommand{\fz}{\mathfrak{z}}

\newcommand{\bfa}{\mathbf{a}}
\newcommand{\bfb}{\mathbf{b}}
\newcommand{\bfc}{\mathbf{c}}
\newcommand{\bfd}{\mathbf{d}}
\newcommand{\bfe}{\mathbf{e}}
\newcommand{\bff}{\mathbf{f}}
\newcommand{\bfg}{\mathbf{g}}
\newcommand{\bfh}{\mathbf{h}}
\newcommand{\bfi}{\mathbf{i}}
\newcommand{\bfj}{\mathbf{j}}
\newcommand{\bfk}{\mathbf{k}}
\newcommand{\bfl}{\mathbf{l}}
\newcommand{\bfm}{\mathbf{m}}
\newcommand{\bfn}{\mathbf{n}}
\newcommand{\bfo}{\mathbf{o}}
\newcommand{\bfp}{\mathbf{p}}
\newcommand{\bfq}{\mathbf{q}}
\newcommand{\bfr}{\mathbf{r}}
\newcommand{\bfs}{\mathbf{s}}
\newcommand{\bft}{\mathbf{t}}
\newcommand{\bfu}{\mathbf{u}}
\newcommand{\bfv}{\mathbf{v}}
\newcommand{\bfw}{\mathbf{w}}
\newcommand{\bfx}{\mathbf{x}}
\newcommand{\bfy}{\mathbf{y}}
\newcommand{\bfz}{\mathbf{z}}

\newcommand{\bfA}{\mathbf{A}}
\newcommand{\bfB}{\mathbf{B}}
\newcommand{\bfC}{\mathbf{C}}
\newcommand{\bfD}{\mathbf{D}}
\newcommand{\bfE}{\mathbf{E}}
\newcommand{\bfF}{\mathbf{F}}
\newcommand{\bfG}{\mathbf{G}}
\newcommand{\bfH}{\mathbf{H}}
\newcommand{\bfI}{\mathbf{I}}
\newcommand{\bfJ}{\mathbf{J}}
\newcommand{\bfK}{\mathbf{K}}
\newcommand{\bfL}{\mathbf{L}}
\newcommand{\bfM}{\mathbf{M}}
\newcommand{\bfN}{\mathbf{N}}
\newcommand{\bfO}{\mathbf{O}}
\newcommand{\bfP}{\mathbf{P}}
\newcommand{\bfQ}{\mathbf{Q}}
\newcommand{\bfR}{\mathbf{R}}
\newcommand{\bfS}{\mathbf{S}}
\newcommand{\bfT}{\mathbf{T}}
\newcommand{\bfU}{\mathbf{U}}
\newcommand{\bfV}{\mathbf{V}}
\newcommand{\bfW}{\mathbf{W}}
\newcommand{\bfX}{\mathbf{X}}
\newcommand{\bfY}{\mathbf{Y}}
\newcommand{\bfZ}{\mathbf{Z}}

\newcommand{\scrA}{\mathscr{A}}
\newcommand{\scrB}{\mathscr{B}}
\newcommand{\scrC}{\mathscr{C}}
\newcommand{\scrD}{\mathscr{D}}
\newcommand{\scrE}{\mathscr{E}}
\newcommand{\scrF}{\mathscr{F}}
\newcommand{\scrG}{\mathscr{G}}
\newcommand{\scrH}{\mathscr{H}}
\newcommand{\scrI}{\mathscr{I}}
\newcommand{\scrJ}{\mathscr{J}}
\newcommand{\scrK}{\mathscr{K}}
\newcommand{\scrL}{\mathscr{L} \cfadd{def:lin_interp}}
\newcommand{\scrM}{\mathscr{M}}
\newcommand{\scrN}{\mathscr{N}}
\newcommand{\scrO}{\mathscr{O}}
\newcommand{\scrP}{\mathscr{P}}
\newcommand{\scrQ}{\mathscr{Q}}
\newcommand{\scrR}{\mathscr{R}}
\newcommand{\scrS}{\mathscr{S}}
\newcommand{\scrT}{\mathscr{T}}
\newcommand{\scrU}{\mathscr{U}}
\newcommand{\scrV}{\mathscr{V}}
\newcommand{\scrW}{\mathscr{W}}
\newcommand{\scrX}{\mathscr{X}}
\newcommand{\scrY}{\mathscr{Y}}
\newcommand{\scrZ}{\mathscr{Z}}

\newcommand{\LL}{\mathbb{L}}

\newcommand{\induct}{\dashrightarrow}
\newcommand{\with}{\curvearrowleft}
\newcommand{\lrSpace}{\ensuremath{\mkern-1.5mu}}

\newcommand{\eps}{\varepsilon}
\newcommand{\eg}{\unskip, e.g.,\ }
\newcommand{\Eg}{\unskip e.g.,\ }

\newcommand{\dpp}{\text{.}}
\newcommand{\dc}{\text{,}}
\newcommand{\dx}{\, {\rm d}}
\newcommand{\dxx}{{\rm d}}

\newcommand{\normmm}[1]{{\left\vert\kern-0.25ex\left\vert\kern-0.25ex\left\vert #1 
    \right\vert\kern-0.25ex\right\vert\kern-0.25ex\right\vert}
    \cfadd{DNN_norm}}

\DeclarePairedDelimiter{\pr}{(}{)}
\DeclarePairedDelimiter{\br}{[}{]}
\DeclarePairedDelimiter{\cu}{\{}{\}}
\DeclarePairedDelimiter{\abs}{\lvert}{\rvert}
\DeclarePairedDelimiter{\norm}{\lVert}{\rVert\cfadd{DNN_norm}}
\DeclarePairedDelimiter{\floor}{\lfloor}{\rfloor}
\DeclarePairedDelimiter{\ceil}{\lceil}{\rceil}

\newcommand{\N}{\ensuremath{\mathbb N}}
\newcommand{\Z}{\ensuremath{\mathbb Z}}
\newcommand{\Q}{\ensuremath{\mathbb Q}}
\newcommand{\R}{\ensuremath{\mathbb R}}
\newcommand{\C}{\ensuremath{\mathbb C}}
\newcommand{\E}{\ensuremath{\mathbb E}}
\renewcommand{\P}{\ensuremath{\mathbb P}}
\newcommand{\parallelization}{\operatorname{P} \cfadd{def:generalParallelization}}
\newcommand{\parallelizationSpecial}{\mathbf{P} \cfadd{def:simpleParallelization}}
\newcommand{\pa}[1]{\left({#1}\right)}
\newcommand{\Rr}{\mathcal{R}_\mathfrak{r} \cfadd{def:ANNrealization} \cfadd{rectifier}}
\newcommand{\Ra}{\mathcal{R}_a \cfadd{def:ANNrealization}}
\newcommand{\1}{\mathbbm{1}}
\newcommand{\ii}{\mathfrak{i} \cfadd{padding}}
\newcommand{\pu}{\mathfrak{u}}
\newcommand{\fj}{\mathfrak{x}}
\newcommand{\network}{neural network \cfadd{def:ANN2}}
\newcommand{\interpolatingDNN}{\mathbf{F}}
\newcommand{\AffineANN}{\cfadd{linear}\mathbf{A}}
\newcommand{\bbigANNsum}{\cfadd{def:ANNsum:same}\mathop{\oplus}\limits}
\newcommand{\scalarMultANN}[2]{\cfadd{def:ANNscalar}#1\circledast#2}
\newcommand{\interpol}[2]{\cfadd{def:lin_interp}\mathscr{L}_{#1}^{#2}}
\newcommand{\infnorm}[1]{\cfadd{def:p-norm}\norm{#1}_{\infty}}
\newcommand{\MappingStructuralToVectorized}{\cfadd{def:TranslateStructuredIntoVectorizedDescription}\mathcal{T}}
\newcommand{\pmat}[1]{\begin{pmatrix}#1\end{pmatrix}}

\newcommand{\fwpr}{W}
\newcommand{\smallU}{u}
\newcommand{\smallF}{f}
\newcommand{\funcF}{F}
\newcommand{\funcG}{g}
\newcommand{\boundFG}{\mathfrak{L}}
\newcommand{\LipConstF}{L}
\newcommand{\mlp}{U}
\newcommand{\diffBd}{B}

\newcommand{\firstConstant}[1]{\mathfrak{K}_{#1}}
\renewcommand{\fR}{\mathscr{n}}
\newcommand{\secondConstant}[1]{\firstConstant{#1}\sqrt{#1 -1}}
\newcommand{\littleM}{m}
\newcommand{\littleMM}{m}
\newcommand{\maxfn}{\varphi}

\renewcommand{\AA}{\mathbb{A}}
\newcommand{\PP}{\mathbf{P}}
\newcommand{\BB}{\mathbb{B}}
\newcommand{\CC}{\mathbb{C}}
\newcommand{\A}{\mathbf{A} \cfadd{linear}}
\newcommand{\U}{\mathbf{U}}
\newcommand{\V}{\mathbf{V}}
\newcommand{\F}{\mathbf{F}}
\newcommand{\G}{\mathbf{G}}
\newcommand{\I}{\mathbf{I} \cfadd{def:id_net}}
\renewcommand{\H}{\mathbf{H}}
\newcommand{\NN}{\mathbf{N}}
\newcommand{\lbd}{u}
\newcommand{\ubd}{v}
\newcommand{\len}{n}
\newcommand{\weight}{W \cfadd{linear}}
\newcommand{\bias}{B \cfadd{linear}}

\newcommand{\ind}[1]{\mathbbm{1}_{\smash{#1}}} 
\newcommand{\iind}[1]{\mathlarger{\mathbbm{1}}_{#1}}
\newcommand\numberthis{\addtocounter{equation}{1}\tag{\theequation}}
\newcommand{\indicator}[1]{\mathbbm{1}_{\smash{#1}}}

% and in equations
\newcommand{\qandqShort}{\quad\text{and}\quad}
\newcommand{\andShort}{\text{ and }}
\newcommand{\forallDist}{\forall\,}
\newcommand{\identity}[1]{\mathrm{Id}_{#1}}
\newcommand{\smallsum}{\textstyle\sum}
\newcommand{\SmallSum}[2]{ {\textstyle\sum\limits_{#1}^{#2}}}
\newcommand{\idRelu}{\mathfrak I}
\newcommand{\Exists}{\exists\,}
\newcommand{\Forall}{\forall\,}
\newcommand{\mc}[1]{\mathcal{#1}}
\newcommand{\mf}[1]{\mathfrak{#1}}
\newcommand{\affineMap}{\mathbb{A}}
\newcommand{\idMatrix}{\operatorname{I} \cfadd{def:identityMatrix}}
\newcommand{\ANNs}{\mathbf{N} \cfadd{def:ANN}}
\newcommand{\MatrixANN}[1]{\mf N_{#1}}
\newcommand{\activation}{a}
\newcommand{\activationDim}[1]{\mathfrak{M}_{\activation,#1} \cfadd{multi}}
\newcommand{\functionANN}[1]{\mathcal{R}_{#1} \cfadd{def:ANNrealization}}
\newcommand{\paramANN}{\mathcal{P} \cfadd{def:ANN}}
\newcommand{\paramNotZeroANN}{\mathscr{P}}
\newcommand{\lengthANN}{\mathcal{L} \cfadd{def:ANN}}
\newcommand{\inDimANN}{\mathcal{I} \cfadd{def:ANN}}
\newcommand{\compANN}[2]{{#1 \bullet \allowbreak #2} \cfadd{def:ANNcomposition}}
\newcommand{\concANN}[2]{{#1 \odot #2}}
\newcommand{\concPsiANN}[2]{{#1 \odot_{\Psi} #2}}
\newcommand{\paraANN}[1]{\mathbf{P}_{#1}}
\newcommand{\paraLANN}[2]{\mathbf{P}_{#1,#2}}
\newcommand{\outDimANN}{\mathcal{O} \cfadd{def:ANN}}
\newcommand{\longerANN}[1]{\mathcal{E}_{#1} \cfadd{def:ANNenlargement}}
\newcommand{\idANN}[2]{\mathbb{I}_{#1,#2}}
\newcommand{\idANNshort}[1]{\mathbb{I}_{#1}}
\newcommand{\dims}{\mathcal{D} \cfadd{def:ANN}}
\newcommand{\hiddenLength}{\mathcal{H} \cfadd{def:ANN}}
\newcommand{\hiddenDimId}{\mathfrak{i}}
\newcommand{\qandq}{\qquad\text{and}\qquad}
\newcommand{\andq}{\text{and}\qquad}
\newcommand{\rect}{\mathfrak r \cfadd{rectifier}}
\newcommand{\Rect}{\mathfrak R}
\newcommand{\multdim}{\mathfrak M}
\DeclareMathOperator{\id}{id}
\newcommand{\matrixANN}[1]{\mathfrak{W}_{#1}}
\newcommand{\vectorANN}{\mathfrak{B}}
\newcommand{\sumANN}{\mathfrak{S} \cfadd{def:ANN:sum}}
\newcommand{\extensionANN}{\mathfrak{T} \cfadd{def:ANN:extension}}
\newcommand{\dimANNlevel}{\mathbb{D} \cfadd{def:ANN}}
\newcommand{\power}[2]{#1^{\bullet #2} \cfadd{def:iteratedANNcomposition}}
\newcommand{\scalar}[2]{ #1 \circledast #2 \cfadd{def:ANNscalar}}
\newcommand{\transpose}{* \cfadd{def:Transpose}}
\newcommand{\oSum}{\oplus \cfadd{def:ANNsum:same}}
\newcommand{\OSum}[2]{{\mathop\oplus\limits_{#1}^{#2} } \cfadd{def:ANNsum:same} }
\newcommand{\bSum}{{\mathop\boxplus} \cfadd{def:ANN:sum_diff}}
\newcommand{\BSum}[3]{{\mathop\boxplus\limits_{#1,#2}^{#3}} \cfadd{def:ANN:sum_diff}}
\newcommand{\modCont}{w \cfadd{mod_cont_def}}

\allowdisplaybreaks

\usepackage{scalerel,stackengine}
\newcommand\pig[1]{\scalerel*[5pt]{\big#1}{%
  \ensurestackMath{\addstackgap[1.5pt]{\big#1}}}}
\newcommand\pigl[1]{\mathopen{\pig{#1}}}
\newcommand\pigr[1]{\mathclose{\pig{#1}}}

%%%%%%%%%%%%%%%%%%%%%%%%
%%% Enum
%%%%%%%%%%%%%%%%%%%%%%%%

\ExplSyntaxOn

\NewDocumentCommand{\enum}{ O{;} m o }
 {
  \my_enum:nnn { #1 } { #2 } { #3 }
 }

\seq_new:N \l__my_enum_seq
\tl_new:N \l__my_enum_item_tl
\prop_new:N \l__verbs
\prop_put:Nnn \l__verbs {show} {shows}
\prop_put:Nnn \l__verbs {imply} {implies}
\prop_put:Nnn \l__verbs {demonstrate} {demonstrates}
\prop_put:Nnn \l__verbs {prove} {proves}
\prop_put:Nnn \l__verbs {establish} {establishes}
\prop_put:Nnn \l__verbs {ensure} {ensures}
\prop_put:Nnn \l__verbs {assure} {assures}
\prop_put:Nnn \l__verbs {yield} {yields}

\int_new:N \l__number_of_args

\cs_new_protected:Nn \my_enum:nnn
 {
  %\seq_clear:N \l__my_enum_seq
  %\clist_map_variable:nNn { #1 } \l__my_enum_item_tl
  % {
  %  \__my_enum_add:V \l__my_enum_item_tl
  % }
  \seq_set_split:Nnn \l__my_enum_seq { #1 } { #2 }
  \seq_remove_all:Nn \l__my_enum_seq {}
  \int_set_eq:NN \l__number_of_args { \seq_count:N \l__my_enum_seq }
  %triangle
  %\int_compare:nF { \seq_count:N \l__my_enum_seq < 2 } { s }
  %\nobreakspace
  \seq_use:Nnnn \l__my_enum_seq { ~and~ } { ,~ } { ,~and~ }
  \IfNoValueTF{#3}{}{
    \space
    \int_compare:nNnTF{ \l__number_of_args } < {2}{ \prop_item:Nn \l__verbs {#3} }{ #3 }
  }
 }

\ExplSyntaxOff

%%%%%%%%%%%%%%%%%%%%%%%%
%%% Automatic cf-lists

%%%%%%%%%%%%%%%%%%%%%%%%

\ExplSyntaxOn

\seq_new:N \g_cflist_loaded

\seq_new:N \g_cflist_pending

\NewDocumentCommand{\cfadd}{ m }

{

  \seq_if_in:NnF \g_cflist_loaded { #1 } {

    \seq_if_in:NnF \g_cflist_pending { #1 } {

      \seq_gput_right:Nn \g_cflist_pending { #1 }

    }

  }

}

\NewDocumentCommand{\cfload}{ o }

{

  \seq_if_empty:NTF \g_cflist_pending {\unskip} {

    (cf.\ \cref{\seq_use:Nn \g_cflist_pending {,}})\IfValueTF{#1}{#1~}{\unskip}

    \seq_gconcat:NNN \g_cflist_loaded \g_cflist_loaded \g_cflist_pending

    \seq_gclear:N \g_cflist_pending

  }

}

\NewDocumentCommand{\cfclear} {} {

  \seq_gclear:N \g_cflist_loaded

  \seq_gclear:N \g_cflist_pending

}

\NewDocumentCommand{\cfout}{ o }

{

  \seq_if_empty:NTF \g_cflist_pending {\unskip} {

    (cf.\ \cref{\seq_use:Nn \g_cflist_pending {,}})\IfValueTF{#1}{#1~}{\unskip}

    \seq_gclear:N \g_cflist_pending

  }

}

\NewDocumentCommand{\ifnocf} { m } {

  \seq_if_empty:NT \g_cflist_pending { #1 }

}

\NewDocumentCommand{\cfconsiderloaded}{ m }{

  \seq_gput_right:Nn \g_cflist_loaded {#1}

}

\ExplSyntaxOff
 
%%%%%%%%%%%%%%%%%%%%%%%%
%%% Automatic proof headers and endings, local labels
%%%%%%%%%%%%%%%%%%%%%%%%

\NewDocumentEnvironment {athm} {m m} {%
%\newenvironment{athm}[2]{%
\begin{#1}\label{#2}\global\def\loc{#2}%
}{%
\end{#1}%
}

\NewDocumentEnvironment{aproof} {} {%
\begin{proof}[Proof~of~\cref{\loc}]%
}{%
\finishproofthus
\end{proof}%
}

\ExplSyntaxOff

\newcommand{\eqqref}[1]{\cref{eq:\loc.#1}}
\newcommand{\eqlabel}[1]{\label{eq:\loc.#1}}

\newcommand{\finishproofthus}{The proof of \cref{\loc} is thus complete.}
\newcommand{\finishproofthis}{This completes the proof of \cref{\loc}.}

%%%%%%%%%%%%%%%%%%%%%%%%
%%% Flexible math displays
%%%%%%%%%%%%%%%%%%%%%%%%

\ExplSyntaxOn

\NewDocumentEnvironment{flexmath}{ m o }{
  \str_if_eq:noTF {a} {#1} {
    \begin{equation}
    \IfValueT{#2}{\label{eq:\loc.#2}}
    \begin{aligned}
  } {
    \catcode`&=9
    \renewcommand{\\}{}
    \str_if_eq:noTF {d} {#1} {
      \begin{equation}
      \IfValueT{#2}{\label{eq:\loc.#2}}
    } {
      \begin{math}
    }
  }
}{
  \str_if_eq:noTF {i} {#1} {
    \end{math}
    \catcode`&=4
  } {
    \str_if_eq:noTF {d} {#1} {
      \end{equation}
    } {
      \end{aligned}
      \end{equation}
    }
  }
}

\ExplSyntaxOff

\ExplSyntaxOn

\bool_new:N \g_noteobserve

\NewDocumentCommand{\setnote}{}{
  \bool_gset_true:N \g_noteobserve
}

\NewDocumentCommand{\setobserve}{}{
  \bool_gset_false:N \g_noteobserve
}

\NewDocumentCommand{\nobs}{ o }{
  \IfValueT{#1}{
    \str_if_eq:noTF {note} {#1} {
      \bool_gset_true:N \g_noteobserve
    } {
      \str_if_eq:noTF {Note} {#1} {
        \bool_gset_true:N \g_noteobserve
      } {
        \bool_gset_false:N \g_noteobserve
      }
    }
  }
  \bool_if:nTF { \g_noteobserve } {
    \bool_gset_false:N \g_noteobserve
    note
  } {
    \bool_gset_true:N \g_noteobserve
    observe
  }
  \IfValueF{#1}{~}
}

\NewDocumentCommand{\Nobs}{ o }{
  \IfValueT{#1}{
    \str_if_eq:noTF {note} {#1} {
      \bool_gset_true:N \g_noteobserve
    } {
      \str_if_eq:noTF {Note} {#1} {
        \bool_gset_true:N \g_noteobserve
      } {
        \bool_gset_false:N \g_noteobserve
      }
    }
  }
  \bool_if:nTF { \g_noteobserve } {
    \bool_gset_false:N \g_noteobserve
    Note
  } {
    \bool_gset_true:N \g_noteobserve
    Observe
  }
  \IfValueF{#1}{~}
}


\bool_new:N \g_hencetherefore

\NewDocumentCommand{\hence}{ o }{
  \IfValueT{#1}{
    \str_if_eq:noTF {hence} {#1} {
      \bool_gset_true:N \g_hencetherefore
    } {
      \str_if_eq:noTF {Hence} {#1} {
        \bool_gset_true:N \g_hencetherefore
      } {
        \bool_gset_false:N \g_hencetherefore
      }
    }
  }
  \bool_if:nTF { \g_hencetherefore } {
    \bool_gset_false:N \g_hencetherefore
    hence
  } {
    \bool_gset_true:N \g_hencetherefore
    therefore
  }
  \IfValueF{#1}{~}
}

\NewDocumentCommand{\Hence}{ o }{
  \IfValueT{#1}{
    \str_if_eq:noTF {hence} {#1} {
      \bool_gset_true:N \g_hencetherefore
    } {
      \str_if_eq:noTF {Hence} {#1} {
        \bool_gset_true:N \g_hencetherefore
      } {
        \bool_gset_false:N \g_hencetherefore
      }
    }
  }
  \bool_if:nTF { \g_hencetherefore } {
    \bool_gset_false:N \g_hencetherefore
    Hence
  } {
    \bool_gset_true:N \g_hencetherefore
    Therefore
  }
  \IfValueF{#1}{~}
}

\int_new:N \g_furthermore

\NewDocumentCommand{\Moreover}{ o o }{
  \IfValueT{#1}{
    \str_case:nn {#1} {
	  {Next} {\int_gset:Nn {\g_furthermore} {0}}      
      {Furthermore} {\int_gset:Nn {\g_furthermore} {1}}
      {Moreover} {\int_gset:Nn {\g_furthermore} {2}}
      {In~addition} {\int_gset:Nn {\g_furthermore} {3}}
      {note} {\bool_gset_true:N \g_noteobserve}
      {observe} {\bool_gset_false:N \g_noteobserve}
    }
    \IfValueT{#2}{
      \str_case:nn {#2} {
	    {Next} {\int_gset:Nn {\g_furthermore} {0}}        
        {Furthermore} {\int_gset:Nn {\g_furthermore} {1}}
        {Moreover} {\int_gset:Nn {\g_furthermore} {2}}
        {In~addition} {\int_gset:Nn {\g_furthermore} {3}}
        {note} {\bool_gset_true:N \g_noteobserve}
        {observe} {\bool_gset_false:N \g_noteobserve}
      }
    }
  }
  \int_case:nn { \int_mod:nn {\g_furthermore} {4} } {
	{ 0 } { Next,~\nobs that}    
    { 1 } { Furthermore,~\nobs that}
    { 2 } { Moreover,~\nobs that}
    { 3 } { In~addition,~\nobs that}
  }
  \int_gincr:N \g_furthermore
  \IfValueF{#1}{~}
}

\ExplSyntaxOff



\ExplSyntaxOn

\int_new:N \g_enumit

\NewDocumentCommand{\Enum}{ m o }{
  \IfValueT{#2}{
    \str_case:nn {#2} {
      {ensure} {\int_gset:Nn {\g_enumit} {0}}
      {ensures} {\int_gset:Nn {\g_enumit} {0}}       
      {assure} {\int_gset:Nn {\g_enumit} {1}}
      {assures} {\int_gset:Nn {\g_enumit} {1}}
      {prove} {\int_gset:Nn {\g_enumit} {2}}
      {proves} {\int_gset:Nn {\g_enumit} {2}}
      {show} {\int_gset:Nn {\g_enumit} {3}}
      {shows} {\int_gset:Nn {\g_enumit} {3}}
      {demonstrate} {\int_gset:Nn {\g_enumit} {4}}
      {demonstrates} {\int_gset:Nn {\g_enumit} {4}}
      {yield} {\int_gset:Nn {\g_enumit} {5}}
      {yields} {\int_gset:Nn {\g_enumit} {5}}
      {establish} {\int_gset:Nn {\g_enumit} {6}}
      {establishes} {\int_gset:Nn {\g_enumit} {6}}
      {imply} {\int_gset:Nn {\g_enumit} {7}}
      {implies} {\int_gset:Nn {\g_enumit} {7}}
    }
  }
  \int_case:nn { \int_mod:nn {\g_enumit} {8} } {
    { 0 } { \enum{ #1 }[ensure]{ } }
    { 1 } { \enum{ #1 }[assure] }  
    { 2 } { \enum{ #1 }[prove] }  
    { 3 } { \enum{ #1 }[show] }
    { 4 } { \enum{ #1 }[demonstrate] }
    { 5 } { \enum{ #1 }[yield] }
    { 6 } { \enum{ #1 }[establish] }
    { 7 } { \enum{ #1 }[imply] }
  }
  \int_gincr:N \g_enumit
} 

\ExplSyntaxOff