重新定义方程式和对齐环境后缺少 }

重新定义方程式和对齐环境后缺少 }

在下面的 mwe 中,我重新定义了equation和环境,以通过从中复制的宏来align保存其内容的宽度\settowidthofalign邮政。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

% https://tex.stackexchange.com/a/59955/172923
\makeatletter
\newcommand{\settowidthofalign}[2]{%
  \setbox\z@=\vbox{
    \begin{align*}
    #2
    \ifmeasuring@\else\global\let\got@maxcolwd\maxcolumn@widths\fi
    \end{align*}
  }%
  \begingroup
  \def\or{+}\edef\x{\endgroup#1=\dimexpr\got@maxcolwd\relax}\x}
\makeatother

\ExplSyntaxOn

\dim_new:N \l_eqn_width_dim

\cs_set_eq:cc { oldequation }{ equation }
\cs_set_eq:cc { endoldequation }{ endequation }

\RenewDocumentEnvironment{ equation }{ +b }
  {
    \settowidthofalign{ \l_eqn_width_dim } { #1 }
    \use:c { oldequation }
      #1
    \use:c { endoldequation }
  }{}

\cs_set_eq:cc { oldalign }{ align }
\cs_set_eq:cc { endoldalign }{ endalign }

\RenewDocumentEnvironment{ align }{ +b }
  {
    \settowidthofalign{ \l_eqn_width_dim } { #1 }
    \use:c { oldalign }
      #1
    \use:c { endoldalign }
  }{}

\ExplSyntaxOff

\begin{document}
\begin{equation}
  1 + 1 = 2
\end{equation}
\begin{align}
  1 + 1 = 2
\end{align}
\end{document}

我收到错误

./realign.tex:49: Missing } inserted.
<inserted text>
                }
l.49 \end
         {equation}

这里有什么问题?

答案1

首先:align*用来测量的 定义为

\newenvironment{align*}{%
  \start@align\@ne\st@rredtrue\m@ne
}{%
  \endalign
}

但是您重新定义\endalign为在新环境中不执行任何操作,因此您只有一半的代码align*。您需要重新定义\endalign*以扩展为\endoldalign

\cs_set:cpn { endalign* }{ \endoldalign }

第二:你使用:

    \use:c { oldalign }
    #1
    \use:c { endoldalign }

但是oldalign(这里align)会逐字查找标记\end{oldalign}来确定环境的结束,但找不到隐藏在\use:c:中的内容,因此您需要在此处使用环境形式:

    \begin{oldalign}
      #1
    \end{oldalign}

改变这些,它似乎有效:

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

% https://tex.stackexchange.com/a/59955/172923
\makeatletter
\newcommand{\settowidthofalign}[2]{%
  \setbox\z@=\vbox{
    \begin{align*}
    #2
    \ifmeasuring@\else\global\let\got@maxcolwd\maxcolumn@widths\fi
    \end{align*}
  }%
  \begingroup
  \def\or{+}\edef\x{\endgroup#1=\dimexpr\got@maxcolwd\relax}\x}
\makeatother

\ExplSyntaxOn

\dim_new:N \l_eqn_width_dim

\cs_set_eq:cc { oldequation }{ equation }
\cs_set_eq:cc { endoldequation }{ endequation }

\RenewDocumentEnvironment{ equation }{ +b }
  {
    \settowidthofalign{ \l_eqn_width_dim } { #1 }
    \use:c { oldequation }
      #1
    \use:c { endoldequation }
  }{}

\cs_set_eq:cc { oldalign }{ align }
\cs_set_eq:cc { endoldalign }{ endalign }
\cs_set:cpn { endalign* }{ \endoldalign }

\RenewDocumentEnvironment{ align }{ +b }
  {
    \settowidthofalign{ \l_eqn_width_dim } { #1 }
    \begin{oldalign}
      #1
    \end{oldalign}
  }{}

\ExplSyntaxOff

\begin{document}
\begin{equation}
  1 + 1 = 2
\end{equation}
\begin{align}
  1 + 1 = 2
\end{align}
\end{document}

相关内容