LaTeX 抱怨 \hbox 溢出,但实际上没有一个框溢出

LaTeX 抱怨 \hbox 溢出,但实际上没有一个框溢出

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

相关内容