%% This is file `1231num.sty',
%% Copyright (C) 2021 by Tin Lok Wong
%%
%% This work may be distributed and/or modified under the conditions
%% of the LaTeX Project Public License, either version 1.3 of this
%% license or (at your option) any later version. The latest version
%% of this license is in
%%
%%   http://www.latex-project.org/lppl.txt
%%
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
%%
%% The Current Maintainer of this work is Tin Lok Wong.
%%
%% File last modified: 2021/10/06

% If hyperref is needed, then load it first.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{1231num}[2021/02/26 v0.0 CS1231 line numbers]

\RequirePackage{amsmath}% to align in math
\RequirePackage{tabto}%   for starting a pfarray mid-line

\newlength{\numpf@templen}

\let\pfln\item
\let\lnref\ref

% Parameters that controls the margins for proofs
\newlength{\pfmargin}    \setlength{\pfmargin}{1em}
\newlength{\pflabelwdI}  \setlength{\pflabelwdI}{1.2em}
\newlength{\pflabelwdII} \setlength{\pflabelwdII}{2.0em}
\newlength{\pflabelwdIII}\setlength{\pflabelwdIII}{2.8em}
\newlength{\pflabelwdIV} \setlength{\pflabelwdIV}{3.6em}
\newlength{\pflabelwdV}  \setlength{\pflabelwdV}{4.4em}
\newlength{\pflabelwdi}
\newlength{\pflabelwdii}
\newlength{\pflabelwdiii}
\newlength{\pflabelwdiv}
\newlength{\pflabelwdv}
% Define the usual spacing around and within proofs.
\def\numpf@seti{%
 \def\@listi{\leftmargin\pflabelwdi
             \advance\leftmargin\labelsep
             \labelwidth\pflabelwdi
             \topsep   \z@
             \parsep   \z@
             \itemsep  \z@
             \partopsep\z@}%
}
\def\numpf@setii{%
 \def\@listii{\leftmargin\pflabelwdii
              \advance\leftmargin\labelsep
              \labelwidth\pflabelwdii
              \topsep   \z@
              \parsep   \z@
              \itemsep  \z@
              \partopsep\z@}%
}
\def\numpf@setiii{%
 \def\@listiii{\leftmargin\pflabelwdiii
               \advance\leftmargin\labelsep
               \labelwidth\pflabelwdiii
               \topsep   \z@
               \parsep   \z@
               \itemsep  \z@
               \partopsep\z@}%
}
\def\numpf@setiv{%
 \def\@listiv {\leftmargin\pflabelwdiv
               \advance\leftmargin\labelsep
               \labelwidth\pflabelwdiv
               \topsep   \z@
               \parsep   \z@
               \itemsep  \z@
               \partopsep\z@}%
}
\def\numpf@setv{%
 \def\@listv {\leftmargin\pflabelwdv
              \advance\leftmargin\labelsep
              \labelwidth\pflabelwdv
              \topsep   \z@
              \parsep   \z@
              \itemsep  \z@
              \partopsep\z@}%
}
% Alternative set of spacing that saves more space.
\def\numpf@seti@star{%
 \def\@listi{\leftmargin\z@
             \labelwidth\pflabelwdi
             \topsep   \z@
             \parsep   \z@
             \itemsep  \z@
             \partopsep \z@}%
}
\def\numpf@setii@star{%
 \def\@listii{\leftmargin\pfmargin
              \labelwidth\pflabelwdii
              \topsep   \z@
              \parsep   \z@
              \itemsep  \z@
              \partopsep\z@}%
}
\def\numpf@setiii@star{%
 \def\@listiii{\leftmargin\pfmargin
               \labelwidth\pflabelwdiii
               \topsep   \z@
               \parsep   \z@
               \itemsep  \z@
               \partopsep\z@}%
}
\def\numpf@setiv@star{%
 \def\@listiv {\leftmargin\pfmargin
               \labelwidth\pflabelwdiv
               \topsep   \z@
               \parsep   \z@
               \itemsep  \z@
               \partopsep\z@}%
}
\def\numpf@setv@star{%
 \def\@listv {\leftmargin\pfmargin
              \labelwidth\pflabelwdv
              \topsep   \z@
              \parsep   \z@
              \itemsep  \z@
              \partopsep\z@}%
}

% There are several places in which
%  things with beamer are different from standand LaTeX:
% - the max depth of enumerate allowed;
% - the way enumerate displays the numbering;
% - the macros used to display the numbers;
% - the need to specify colours and fonts with beamer;
% - overlay options are available with beamer;
% - beamer sets additional parameters when entering a new enumerate.
\@ifclassloaded{beamer}{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definitions for standard BEAMER %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Here I increase the max depth of the enumerate environment.
% Modified from beamerbaselocalstructure.sty
 \@definecounter{enumiv}
 \@definecounter{enumv}
 \setlength\leftmarginiv{2em}
 \setlength\leftmarginv {2em}
 \def\@listiv {\leftmargin\leftmarginiv
               \labelwidth\leftmarginiv
               \advance\labelwidth-\labelsep}
 \def\@listv {\leftmargin\leftmarginv
              \labelwidth\leftmarginv
              \advance\labelwidth-\labelsep}
 \def\numpf@enumerate{%
  \ifnum\@enumdepth>4\relax\@toodeep
  \else%
    \advance\@enumdepth\@ne%
    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
    \advance\@itemdepth\@ne%
  \fi%
  \beamer@computepref\@enumdepth% sets \beameritemnestingprefix
  \edef\beamer@enumtempl{enumerate \beameritemnestingprefix item}%
  \@ifnextchar[{\beamer@@enum@}{\beamer@enum@}}
 \let\endnumpf@enumerate\endenumerate
 \def\beamer@computepref#1{%
  \let\beameritemnestingprefix\@empty%
  \ifcase#1\or\or\def\beameritemnestingprefix{sub}\or
   \def\beameritemnestingprefix{subsub}\or
   \def\beameritemnestingprefix{subsubsub}\or
   \def\beameritemnestingprefix{subsubsubsub}\or
   \@toodeep\fi}
 \def\insertsubsubsubenumlabel{\theenumiv}
 \def\insertsubsubsubsubenumlabel{\theenumv}
% Modified from beamercolorthemedefault.sty
 \setbeamercolor{subsubsubitem}{parent=subsubitem}
 \setbeamercolor{subsubsubsubitem}{parent=subsubsubitem}
 \setbeamercolor{enumerate subsubsubitem}{parent=subsubsubitem}
 \setbeamercolor{enumerate subsubsubsubitem}{parent=subsubsubsubitem}
% Modified from beamerfontthemedefault.sty
 \setbeamerfont{enumerate subsubsubitem}{parent=subsubsubitem}
 \setbeamerfont{enumerate subsubsubsubitem}{parent=subsubsubsubitem}
 \setbeamerfont{itemize/enumerate body}{}
 \setbeamerfont{itemize/enumerate subbody}{size=\normalfont}
 \setbeamerfont{itemize/enumerate subsubbody}{size=\normalfont}
 \setbeamerfont{itemize/enumerate subsubsubbody}{size=\normalfont}
 \setbeamerfont{itemize/enumerate subsubsubsubbody}{size=\normalfont}
 \setbeamercolor{enumerate subsubsubbody}{}
 \setbeamercolor{enumerate subsubsubsubbody}{}
% Modified from beamerinnerthemedefault.sty
 \defbeamertemplate*{enumerate subsubsubitem}{default}
  {\usebeamertemplate*{enumerate subsubitem}\insertsubsubsubenumlabel.}
 \defbeamertemplate*{enumerate subsubsubsubitem}{default}
  {\usebeamertemplate*{enumerate subsubsubitem}\insertsubsubsubsubenumlabel.}
 \defbeamertemplate*{enumerate subsubsubbody begin}{default}{}
 \defbeamertemplate*{enumerate subsubsubbody end}{default}{}
 \defbeamertemplate*{enumerate subsubsubsubbody begin}{default}{}
 \defbeamertemplate*{enumerate subsubsubsubbody end}{default}{}
% The proof environments in text mode
 \newenvironment{numpf}
  {\numpf@
   \begin{subpf}}
  {\end{subpf}\ignorespacesafterend}
 \newenvironment{numpf*}
  {\numpf@
   \begin{subpf*}}
  {\end{subpf*}\ignorespacesafterend}
 \newcommand{\numpf@}{%
% Modified from beamerbaselocalstructure.sty to make left-aligned numbers
  \def\beamer@enum@{%
   \beamer@computepref\@itemdepth% sets \beameritemnestingprefix
   \usebeamerfont{itemize/enumerate \beameritemnestingprefix body}%
   \usebeamercolor[fg]{itemize/enumerate \beameritemnestingprefix body}%
   \usebeamertemplate{itemize/enumerate \beameritemnestingprefix body begin}%
   \expandafter
     \list
       {\usebeamertemplate{\beamer@enumtempl}}
       {\usecounter\@enumctr%
         \def\makelabel####1{{\hss\rlap{{%
                 \usebeamerfont*{enumerate \beameritemnestingprefix item}%
                 \usebeamercolor[fg]{enumerate \beameritemnestingprefix item}####1}}}\hfill}}%
   \beamer@cramped%
   \raggedright%
   \beamer@firstlineitemizeunskip}%
% Modified from beamerinnerthemedefault.sty
  \setbeamertemplate{enumerate item}{\insertenumlabel.}%
  \setbeamertemplate{enumerate subitem}
   {\usebeamertemplate*{enumerate item}\insertsubenumlabel.}%
  \setbeamertemplate{enumerate subsubitem}
   {\usebeamertemplate*{enumerate subitem}\insertsubsubenumlabel.}%
  \setbeamertemplate{enumerate subsubsubitem}
   {\usebeamertemplate*{enumerate subsubitem}\insertsubsubsubenumlabel.}%
  \setbeamertemplate{enumerate subsubsubsubitem}
   {\usebeamertemplate*{enumerate subsubsubitem}\insertsubsubsubsubenumlabel.}%
  \renewcommand{\theenumi}{\arabic{enumi}}%
  \renewcommand{\theenumii}{\arabic{enumii}}%
  \renewcommand{\theenumiii}{\arabic{enumiii}}%
  \renewcommand{\theenumiv}{\arabic{enumiv}}%
  \renewcommand{\theenumv}{\arabic{enumv}}%
  \renewcommand{\p@enumi}{}%
  \renewcommand{\p@enumii}{\theenumi.}%
  \renewcommand{\p@enumiii}{\p@enumii\theenumii.}%
  \renewcommand{\p@enumiv}{\p@enumiii\theenumiii.}%
  \renewcommand{\p@enumv}{\p@enumiv\theenumiv.}%
  \ifcase\@enumdepth
   \setlength\pflabelwdi{\pflabelwdI}%
   \setlength\pflabelwdii{\pflabelwdII}%
   \setlength\pflabelwdiii{\pflabelwdIII}%
   \setlength\pflabelwdiv{\pflabelwdIV}%
   \setlength\pflabelwdv{\pflabelwdV}%
  \or
   \setlength\pflabelwdii{\pflabelwdI}%
   \setlength\pflabelwdiii{\pflabelwdII}%
   \setlength\pflabelwdiv{\pflabelwdIII}%
   \setlength\pflabelwdv{\pflabelwdIV}%
   \setbeamertemplate{enumerate subitem}{\insertsubenumlabel.}%
   \renewcommand{\p@enumii}{}%
  \or
   \setlength\pflabelwdiii{\pflabelwdI}%
   \setlength\pflabelwdiv{\pflabelwdII}%
   \setlength\pflabelwdv{\pflabelwdIII}%
   \setbeamertemplate{enumerate subsubitem}{\insertsubsubenumlabel.}%
   \renewcommand{\p@enumiii}{}%
  \or
   \setlength\pflabelwdiv{\pflabelwdI}%
   \setlength\pflabelwdv{\pflabelwdII}%
   \setbeamertemplate{enumerate subsubsubitem}{\insertsubsubsubenumlabel.}%
   \renewcommand{\p@enumiv}{}%
  \or
   \setlength\pflabelwdv{\pflabelwdI}%
   \setbeamertemplate{enumerate subsubsubsubitem}{\insertsubsubsubsubenumlabel.}%
   \renewcommand{\p@enumv}{}%
  \fi}
 \newenvironment{subpf}
  {\advance\@enumdepth1
   \csname numpf@set\romannumeral\the\@enumdepth\endcsname
   \advance\@enumdepth-1
   \begin{numpf@enumerate}}
  {\end{numpf@enumerate}\ignorespacesafterend}
 \newenvironment{subpf*}
  {\advance\@enumdepth1
   \csname numpf@set\romannumeral\the\@enumdepth @star\endcsname
   \advance\@enumdepth-1
   \begin{numpf@enumerate}}
  {\end{numpf@enumerate}\ignorespacesafterend}
 \newcommand{\linenum}
  {\usebeamertemplate*{\beamer@enumtempl}}
% The \relax seems to help avoid an error
%  if the immediately preceding \item has an overlay specification.
 \newenvironment<>{pfarray}[1]
  {\begin{uncoverenv}#2\pfln\relax\numpf@rray{#1}}
  {\endarray\end{math}\end{uncoverenv}\ignorespacesafterend}
 \newcommand{\subpfalign@@set}{%
  \advance\@enumdepth\@ne
  \setcounter{enum\romannumeral\the\@enumdepth}{1}%
  \beamer@computepref\@enumdepth% sets \beameritemnestingprefix
  \edef\beamer@enumtempl{enumerate \beameritemnestingprefix item}%
  \let\numpf@amsmathLet@\Let@
  \def\Let@{\let\\\numpf@spf@lignlb}}
}{%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definitions for standard LaTeX %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Here I define one more layer for the numpf environment.
 \@definecounter{enumv}
% Modified from report.cls
 \renewcommand\theenumv{\@Roman\c@enumv}
 \newcommand\labelenumv{\theenumv.}
 \renewcommand\p@enumv{\p@enumiv\theenumiv}
% The proof environments in text mode
 \newenvironment{numpf}
  {\numpf@
   \begin{subpf}}
  {\end{subpf}\ignorespacesafterend}
 \newenvironment{numpf*}
  {\numpf@
   \begin{subpf*}}
  {\end{subpf*}\ignorespacesafterend}
 \newcommand{\numpf@}{%
  \renewcommand\labelenumi{\theenumi.}%
  \renewcommand\theenumi{\arabic{enumi}}%
  \renewcommand\p@enumi{}%
  \renewcommand\labelenumii{\labelenumi\theenumii.}%
  \renewcommand\theenumii{\arabic{enumii}}%
  \renewcommand\p@enumii{\p@enumi\theenumi.}%
  \renewcommand\labelenumiii{\labelenumii\theenumiii.}%
  \renewcommand\theenumiii{\arabic{enumiii}}%
  \renewcommand\p@enumiii{\p@enumii\theenumii.}%
  \renewcommand\labelenumiv{\labelenumiii\theenumiv.}%
  \renewcommand\theenumiv{\arabic{enumiv}}%
  \renewcommand\p@enumiv{\p@enumiii\theenumiii.}%
  \renewcommand\labelenumv{\labelenumiv\theenumv.}%
  \renewcommand\theenumv{\arabic{enumv}}%
  \renewcommand\p@enumv{\p@enumiv\theenumiv.}%
  \ifcase\@enumdepth
   \setlength\pflabelwdi{\pflabelwdI}%
   \setlength\pflabelwdii{\pflabelwdII}%
   \setlength\pflabelwdiii{\pflabelwdIII}%
   \setlength\pflabelwdiv{\pflabelwdIV}%
   \setlength\pflabelwdv{\pflabelwdV}%
  \or
   \setlength\pflabelwdii{\pflabelwdI}%
   \setlength\pflabelwdiii{\pflabelwdII}%
   \setlength\pflabelwdiv{\pflabelwdIII}%
   \setlength\pflabelwdv{\pflabelwdIV}%
   \renewcommand\labelenumii{\theenumii.}%
   \renewcommand{\p@enumii}{}%
  \or
   \setlength\pflabelwdiii{\pflabelwdI}%
   \setlength\pflabelwdiv{\pflabelwdII}%
   \setlength\pflabelwdv{\pflabelwdIII}%
   \renewcommand\labelenumiii{\theenumiii.}%
   \renewcommand{\p@enumiii}{}%
  \or
   \setlength\pflabelwdiv{\pflabelwdI}%
   \setlength\pflabelwdv{\pflabelwdII}%
   \renewcommand\labelenumiv{\theenumiv.}%
   \renewcommand{\p@enumiv}{}%
  \or
   \setlength\pflabelwdv{\pflabelwdI}%
   \renewcommand\labelenumv{\theenumv.}%
   \renewcommand{\p@enumv}{}%
  \fi}
% Modified from latex.ltx to make left-aligned numbers
 \newenvironment{subpf}{%
  \ifnum \@enumdepth >4\@toodeep\else
    \advance\@enumdepth\@ne
    \csname numpf@set\romannumeral\the\@enumdepth\endcsname
    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
      \expandafter
      \list
        \csname label\@enumctr\endcsname
        {\usecounter\@enumctr\def\makelabel##1{\hss\rlap{##1}\hfill}}%
  \fi}{\endlist}
 \newenvironment{subpf*}{%
  \ifnum \@enumdepth >4\@toodeep\else
    \advance\@enumdepth\@ne
    \csname numpf@set\romannumeral\the\@enumdepth @star\endcsname
    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
      \expandafter
      \list
        \csname label\@enumctr\endcsname
        {\usecounter\@enumctr\def\makelabel##1{\hss\rlap{##1}\hfill}}%
  \fi}{\endlist}
 \newcommand{\linenum}
  {\csname labelenum\romannumeral\the\@enumdepth\endcsname}
 \newenvironment{pfarray}
  {\pfln\numpf@rray}
  {\endarray\end{math}\ignorespacesafterend}
 \newcommand{\subpfalign@@set}{%
  \advance\@enumdepth\@ne
  \setcounter{enum\romannumeral\the\@enumdepth}{1}%
  \let\numpf@amsmathLet@\Let@
  \def\Let@{\let\\\numpf@spf@lignlb}}
}

% Here are the proof environments in math mode.
% The stem is ``pfalign''.
% Prefixing by ``sub'' indicates a new layer in the line numbering.
% Suffixing by ``ed'' specifies that the materials are not displayed.
% An asterisk used with ``sub'' specifies that
%  the space-saving margins are to be used.
% One can play with the usual parameters to modify the spacing, e.g.,
%  \jot=0pt
%  \abovedisplayskip=0pt
%  \afterdisplayskip=0pt
% These have to be issued before the environment starts.
% Default overlay specifications in beamer do not apply to these commands.

\def\numpf@mknum@norm#1{\makebox[\labelwidth][l]{#1}\hspace{\labelsep}}
\def\numpf@mknum@star#1%
 {\hspace{\pfmargin}\hspace{-\labelsep}\hspace{-\labelwidth}%
  \makebox[\labelwidth][l]{#1}\hspace{\labelsep}}

\def\numpf@lign@mklbl{%
 \edef\@currentlabel
  {\csname p@enum\romannumeral\the\@enumdepth\endcsname
   \csname theenum\romannumeral\the\@enumdepth\endcsname}%
% Adapted from \make@display@tag in amsmath.sty
 \ifmeasuring@\else
  \ifx\df@label\@empty\else
   \@xp\ltx@label\@xp{\df@label}%
   \global\let\df@label\@empty
  \fi
 \fi
}

\newenvironment{subpfalign}
 {\let\numpf@mknum\numpf@mknum@norm\collect@body\subpfalign@}{}
\newenvironment{subpfalign*}
 {\let\numpf@mknum\numpf@mknum@star\collect@body\subpfalign@}{}
\newcommand{\subpfalign@}[1]{\bgroup
 \ifnum \@enumdepth >4\@toodeep\else\subpfalign@@{#1}\fi
\egroup\ignorespaces}
\newcommand{\subpfalign@@}[1]{\subpfalign@@set
 \def\numpf@spf@lignlb{\relax\iffalse{\fi\ifnum0=`}\fi
  \@ifstar{\numpf@spf@lignlb@star}{\numpf@spf@lignlb@}}%
 \begin{flalign*}
% Hopefully no one uses \Let@ except amsmath.
  \global\let\Let@\numpf@amsmathLet@
  &\numpf@mknum{\linenum}%
  &#1\numpf@lign@mklbl
 \end{flalign*}}
% The starred version has one fewer ampersand before the line break.
% Modified from amsmath.sty, especially \math@cr
\def\numpf@spf@lignlb@{%
 \new@ifnextchar[\numpf@spf@lignlb@@{\numpf@spf@lignlb@@[\z@]}}
\def\numpf@spf@lignlb@@[#1]{\ifnum0=`{\fi \iffalse}\fi
 &\numpf@lign@mklbl\math@cr@@@
 \noalign{\vskip#1\relax}%
 \refstepcounter{enum\romannumeral\the\@enumdepth}%
 &\numpf@mknum{\linenum}&}
\def\numpf@spf@lignlb@star{%
 \new@ifnextchar[\numpf@spf@lignlb@@star{\numpf@spf@lignlb@@star[\z@]}}
\def\numpf@spf@lignlb@@star[#1]{\ifnum0=`{\fi \iffalse}\fi
 \numpf@lign@mklbl\math@cr@@@
 \noalign{\vskip#1\relax}%
 \refstepcounter{enum\romannumeral\the\@enumdepth}%
 &\numpf@mknum{\linenum}&}


% This should store the current way to show the line number,
%  wherever the command is.
% It should also step the counter.
% Currently, it only works for pfaligned.
\newcommand{\numpf@shownum}{}
\newcommand{\numpf@shownum@backup}{}
\newcommand{\skippfnum}{%
 \global\let\numpf@shownum@backup\numpf@shownum
 \global\def\numpf@shownum
  {\global\let\numpf@shownum\numpf@shownum@backup}}

% If needed, one can adjust \minalignsep before pfaligned, as in
%  \renewcommand\minalignsep{4cm}
% \jot in pfaligned is by default can set to 0pt.
% To change it back (locally), use
%  \pfalignedjot=\jot
% \label's must be put at the beginning of the lines.
\newlength{\pfalignedjot}
\setlength{\pfalignedjot}{0pt}
% The only difference between the beamer and the non-beamer versions
%  is the overlay option.
\@ifclassloaded{beamer}{%
 \newenvironment<>{pfaligned}[1]
  {\def\numpf@pf@ligned@txt{#1}%
   \def\numpf@pf@ligned@overlay{#2}%
   \collect@body\pfaligned@@}
   {\ignorespacesafterend}
 \newcommand{\pfaligned@@}[1]{%
  \let\numpf@amsmathLet@\Let@
  \def\Let@{\let\\\numpf@pf@lignedlb}%
  \expandafter\onslide\numpf@pf@ligned@overlay{\pfln
  \renewcommand{\numpf@shownum}{%
   \refstepcounter{enum\romannumeral\the\@enumdepth}%
   \hspace{-\labelwidth}\hspace{-\labelsep}%
   \numpf@mknum@norm{\linenum}}%
  \makebox[\linewidth][l]{\begin{math}\jot\pfalignedjot\begin{aligned}[t]
 % Hopefully no one uses \Let@ except amsmath.
   \global\let\Let@\numpf@amsmathLet@
   &\text{\numpf@pf@ligned@txt}%
   &#1
  \end{aligned}\end{math}}}\vspace{\pfalignedjot}}
}{%
 \newenvironment{pfaligned}[1]
  {\def\numpf@pf@ligned@txt{#1}%
   \collect@body\pfaligned@@}{\ignorespacesafterend}
 \newcommand{\pfaligned@@}[1]{%
  \let\numpf@amsmathLet@\Let@
  \def\Let@{\let\\\numpf@pf@lignedlb}%
  \pfln
  \renewcommand{\numpf@shownum}{%
   \refstepcounter{enum\romannumeral\the\@enumdepth}%
   \hspace{-\labelwidth}\hspace{-\labelsep}%
   \numpf@mknum@norm{\linenum}}%
  \makebox[\linewidth][l]{\begin{math}\jot\pfalignedjot\begin{aligned}[t]
 % Hopefully no one uses \Let@ except amsmath.
   \global\let\Let@\numpf@amsmathLet@
   &\text{\numpf@pf@ligned@txt}%
   &#1
  \end{aligned}\end{math}}\vspace{\pfalignedjot}}
}
% The starred version has one fewer ampersand after the line break.
% Modified from amsmath.sty, especially \math@cr
\def\numpf@pf@lignedlb{\relax\iffalse{\fi\ifnum0=`}\fi
 \@ifstar{\numpf@pf@lignedlb@star}{\numpf@pf@lignedlb@}}
\def\numpf@pf@lignedlb@{%
 \new@ifnextchar[\numpf@pf@lignedlb@@{\numpf@pf@lignedlb@@[\z@]}}
\def\numpf@pf@lignedlb@@[#1]{\ifnum0=`{\fi \iffalse}\fi
 \math@cr@@@
 \noalign{\vskip#1\relax}%
 &\numpf@shownum&%
  \edef\@currentlabel
   {\csname p@enum\romannumeral\the\@enumdepth\endcsname
    \csname theenum\romannumeral\the\@enumdepth\endcsname}}
\def\numpf@pf@lignedlb@star{%
 \new@ifnextchar[\numpf@pf@lignedlb@@star{\numpf@pf@lignedlb@@star[\z@]}}
\def\numpf@pf@lignedlb@@star[#1]{\ifnum0=`{\fi \iffalse}\fi
 \math@cr@@@
 \noalign{\vskip#1\relax}%
 &\numpf@shownum%
  \edef\@currentlabel
   {\csname p@enum\romannumeral\the\@enumdepth\endcsname
    \csname theenum\romannumeral\the\@enumdepth\endcsname}}

% !!! dangerous bend !!!
% Partly from https://tex.stackexchange.com/a/541683
% One left-aligned column is always added at the beginning and
%  one right-aligned column is always added at the end.
% Best used with \extracolsep plus \stretch{<factor>} or \fill.
% To temporarily get rid of the added stretchable space,
%  issue \extracolsep{0pt}.
\newcommand{\numpf@rray}[1]{%
 \tabto{\CurrentLineWidth}%
 \begin{math}\everymath={\displaystyle}%
  \let\ltx@label\label
  \let\label\numpf@rray@label
  \setlength{\numpf@templen}{\linewidth}%
  \addtolength{\numpf@templen}{-\TabPrevPos}%
% Modified from array and tabular* in latex.ltx
  \setlength\dimen@{\numpf@templen}%
  \let\@acol\@arrayacol
  \let\@classz\@arrayclassz
  \let\@classiv\@arrayclassiv
  \let\\\numpf@rraylb
  \edef\@halignto{to\the\dimen@}\@tabarray[t]
   {@{}l@{\extracolsep{\fill}}#1@{\extracolsep{\fill}}r@{}}}
% The starred form removes the ampersand before the line break.
\def\numpf@rraylb{\relax\iffalse{\fi\ifnum0=`}\fi
 \@ifstar{\numpf@rraylb@star}{\numpf@rraylb@}}%
\def\numpf@rraylb@{%
 \new@ifnextchar[\numpf@rraylb@@{\numpf@rraylb@@[\z@]}%
}
\def\numpf@rraylb@@[#1]{\ifnum0=`{\fi \iffalse}\fi
 &\@arraycr[#1]%
 \refstepcounter{enum\romannumeral\the\@enumdepth}%
 \hspace{-\labelwidth}\hspace{-\labelsep}%
 \numpf@mknum@norm{\linenum}}
\def\numpf@rraylb@star{%
 \new@ifnextchar[\numpf@rraylb@@star{\numpf@rraylb@@star[\z@]}%
}
\def\numpf@rraylb@@star[#1]{\ifnum0=`{\fi \iffalse}\fi
 \@arraycr[#1]%
 \refstepcounter{enum\romannumeral\the\@enumdepth}%
 \hspace{-\labelwidth}\hspace{-\labelsep}%
 \numpf@mknum@norm{\linenum}}
\def\numpf@rray@label#1{%
 \edef\@currentlabel
  {\csname p@enum\romannumeral\the\@enumdepth\endcsname
   \csname theenum\romannumeral\the\@enumdepth\endcsname}%
 \ltx@label{#1}}

% You may find \popqed and \qedhere helpful.

% To do
% - keyval list of options to control, say, spacing.
% - option to omit numbering for one line via \skippfnum
%   for other environments
% - take care of itemize in addition to enumerate.
\endinput
