放错了 overfullrule 和 itemize 以及 align*

放错了 overfullrule 和 itemize 以及 align*

编译输入

\documentclass{article}
\usepackage{amsmath}
\overfullrule=1mm %%% For the draft version
\begin{document}
  \begin{itemize} 
  \item
    \begin{align*}
      & Something\ extremely\ long\ and\ boring.\ Something\ extremely\ long\ and\ boring.\\
      & Yet\ another\ boring\ line.\\
      & And\ a\ third\ boring\ line.
    \end{align*}  
  \end{itemize}
\end{document}

pdflatex输出结果如下:

编译输出

请注意,overfull 规则(通常用于调试目的)并未放置在最后一个“boring.”的右侧(可能正如预期的那样),而是放置在其他地方。查看日志时,您会看到

Overfull \hbox (32.36226pt too wide) detected at line 11

这也是错误的:溢出发生在输入的第 8 行,而不是第 11 行。

事实上,这种情况发生在一份长达 400 页的长文档中,其中包含多行方程式和数十个软件包。最初,我认为垂直矩形是我自己打字错误的结果,或者是我为了迫使数十个软件包和平共处而不得不进行的一些黑客攻击的结果(例如,它可能是被抑制的 qed 符号的残留)。我花了一些时间才明白,我的行太宽了,下面的栏试图让这个事实可见。

鉴于上述情况,谁是罪魁祸首以及如何规避该漏洞?

答案1

恐怕这个答案不会“解决这个错误”。根本没有错误:发生的事情是 TeX 工作方式的结果。

  1. align需要能够根据需要将其内容拆分到各个页面(使用\displaybreak\allowdisplaybreaks)。

  2. 为了达到这个目的,必须\halign在顶层使用。

  3. 如果你尝试以下纯 TeX 代码

    \tabskip=0pt
    \halign{#\hfil&#&\hfil#\cr
      \hbox to 0.5\hsize{\hrulefill}&\qquad&\hbox to 0.5\hsize{\hrulefill}\cr
    }
    
    \bye
    

    你会看见 Overfull \hbox即使对齐超出了\hsize2em(的宽度\qquad),仍会显示消息。

  4. 然而align“知道”对齐超出了右边距,因此,为了帮助用户,它使得最后的对齐的行被标记为过满。它只能做这么多。遗憾的是,无法得知过满是由第 8 行的内容引起的。

相关内容