在下面的 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}