为什么此代码给出 Overfull \hbox 错误?

为什么此代码给出 Overfull \hbox 错误?

我收到一个Overfull \hbox错误,我已设法将原始的大而复杂的文件修剪为显示问题的这个简单源:

\documentclass{article}
\begin{document}

\parindent=0pt
changed systematically, and the intensity that manages to survive passage through

\end{document}

当我使用它进行编译时,pdflatex myfile.tex我得到:

Overfull \hbox (6.77846pt too wide) in paragraph at lines 5--6
[]\OT1/cmr/m/n/10 changed sys-tem-at-i-cally, and the in-ten-sity that man-ages
 to sur-vive pas-sage through

我尝试过使用 MikTex 和 TexLive,但都出现了同样的错误。我不明白发生了什么。为什么 Latex 不会在单词“through”之前换行,而是溢出右边距并报告错误,我该如何修复这个问题?

我在 Windows 10 上进行了默认安装,MikTex 已选择区域设置并将纸张大小设置为 A4。我提到这一点是因为不同的纸张大小可能会改变行长并可能改变输出。如果相关,MikTex 设置如下所示:

设置

答案1

将解决超额行的问题留到文档制作的最后阶段,因为即使对文本进行最小的更改也可能解决问题。

您可以使用多种策略,主要策略是重新措辞没有人像莫扎特那样,据称能够在一个工作阶段写下一部完整的带管弦乐谱的乐曲:重读你的段落,你很可能会发现一些弱点,或者至少,用不同的措辞来表达同一件事,而段落的排版不会很糟糕。

删除或添加形容词;补上缺失的逗号,删除多余的逗号;添加连字符~以将一些单词连在一起。还有许多其他可能性。

如果其他方法都失败了,还有其他工具可用,而无需诉诸终极武器sloppypar。我发现本地设置很方便,而不需要像那样\emergencystretch触摸。下面是比较。\tolerancesloppypar

\documentclass{article}
\begin{document}

\parindent=0pt

1. overfull

\medskip

changed systematically, and the intensity that manages to survive passage through
changed systematically, and the intensity that manages to survive passage through
changed systematically, and the intensity that manages to survive passage through

\bigskip

2. not overfull

\medskip

changed systematically, and the intensity that manages to survive passage through
changed systematically, and the intensity that manages to survive passage through
changed systematically, and the intensity that manages to survive passage through
{\setlength{\emergencystretch}{0.5\textwidth}\par}

\bigskip

3. sloppy

\medskip

\begin{sloppypar}
changed systematically, and the intensity that manages to survive passage through
changed systematically, and the intensity that manages to survive passage through
changed systematically, and the intensity that manages to survive passage through
\end{sloppypar}

\end{document}

在此处输入图片描述

我使用的技巧是将设置为非零值的\par组中的发出。后面的括号确保此设置不会延续到文档的其余部分。\emergencystretch}\par

您可以看到,我的技巧可以更好地将不良分布到所有行上,而不是像本例中那样将其集中在第一行sloppypar

花时间解决每个过满的问题,您的文档就会看起来很完美。但我再次强调,在绝大多数情况下,重新措辞是最好的方法。

答案2

User202729 已在评论中回答了这个问题,但考虑到评论可能会短暂存在,我将把它作为答案发布。

当 LaTeX 对齐文本时,它不会让单词之间的空白扩大太多。当一行包含几个长单词时,对齐文本可能需要将单词之间的空格增加到看起来奇怪的程度。如果发生这种情况,LaTeX 将改为让行溢出右边距,从而生成水平盒溢出错误。

简单的解决方法是将有问题的段落括在以下括号中:

\begin{sloppypar}

\end{sloppypar}

因为这指定可以根据需要扩大单词之间的空格以调整文本。

相关内容