在下面的 mwe 中,我重新定义equation*
环境以将其内容的宽度存储在标记列表中:
\documentclass{article}
\usepackage{showframe}
\usepackage[fleqn]{amsmath}
% from 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 }
\begin{oldequation*} #1 \end{oldequation*}
}{}
\ExplSyntaxOff
\begin{document}
\begin{equation*}
(b_{n + 1}, e_m) = (v_{n + 1}, e_m) - \sum_{j = 1}^{n} (v_{n + 1}, e_j) \,
(e_j, e_m) = (v_{n + 1}, e_m) - (v_{n + 1}, e_m)
\end{equation*}
\end{document}
然而,当我运行代码时我收到警告
Overfull \hbox (1.07913pt too wide) detected at line 37
尽管内容equation*
显然位于页边距之内:
我怀疑这个警告不是由equation*
它本身产生的,而是由宏align*
中使用的 产生的\settowidthofalign
。事实上,注释掉
% \settowidthofalign{ \l_eqn_width_dim } { #1 }
消除了警告。我该如何修复这个问题?
答案1
在排版时您看不到溢出的框equation*
,但在内部使用align*
左对齐实现会失去一些收缩性,如果删除重新定义并只设置两种形式,那么您会看到相同的溢出框也会输出
\documentclass{article}
\usepackage{showframe}
\usepackage[fleqn]{amsmath}
\begin{document}
\begin{equation*}
(b_{n + 1}, e_m) = (v_{n + 1}, e_m) - \sum_{j = 1}^{n} (v_{n + 1}, e_j) \,
(e_j, e_m) = (v_{n + 1}, e_m) - (v_{n + 1}, e_m)
\end{equation*}
align
\begin{align*}
(b_{n + 1}, e_m) = (v_{n + 1}, e_m) - \sum_{j = 1}^{n} (v_{n + 1}, e_j) \,
(e_j, e_m) = (v_{n + 1}, e_m) - (v_{n + 1}, e_m)
\end{align*}
\end{document}