跳转至

理解未满盒子和溢出盒子的警告信息

overleaf著,黄复雄译

原载:Understanding underfull and overfull box warnings - Overleaf, Online LaTeX Editor

目录#

引言#

在排版 LaTeX 文档后,Overleaf 经常会显示未满(underfull)或过满(overfull) \hbox(或 \vbox)的消息,以及所谓的未满盒子的坏度值或过满盒子的数量。首先请注意,这些消息不是错误,这一点很重要——更多细节见下文。它们是_警告_,或者更准确地说是“诊断消息”,它们来自用于排版 LaTeX 文档的 TeX 引擎内部。

在这篇帮助文章中,我们将介绍涉及这些消息的来源和原因的一些背景知识,并列出一些常见问题,提供一些解决方案。针对有兴趣了解更多细节的读者,我们在 Overleaf Gallery 中发表了一篇随附的文章:探索未满盒子、溢出盒子和坏度的计算在本文末尾还可以找到一个其他资源的列表。

我的项目是否有溢出或未满警告?#

要检查你的项目是否报告了这些警告,你需要单击下面屏幕截图中显示的Overleaf图标。即使你的文档编译时可能没有错误,但看到这些消息是很常见的,任何对 TeX/LaTeX 还陌生的人都可能想知道它们的含义以及是否应该在意。

显示 Overleaf 报告未满或过满盒子的截屏

排版文档时,LaTeX 会尝试使你的内容片段适配给定的“尺寸”,例如在排版段落,将行分成一定长度时——这很容易使用像 \parbox 之类的命令来演示。如果我们尝试使用 50pt 的行宽来排版以下段落:

\parbox{50pt}{Some text typeset using a \texttt{\string\parbox}}

Overleaf报告两条未满 Underfull \hbox... 警告:

截屏图像,显示 Overleaf 在报告有未满盒子

这些 Underfull \hbox... 警告出现,是因为 TeX 引擎无法在这个 \parbox 的限制内生成“良好的”换行。在 TeX 引擎内部,要排版段落的每一行都会变成了一个 \hbox,引擎随后会检查并报告,这可能会生成警告,指出所有被 TeX 引擎归类为“不可取”的行。

正如你在下图中看到的那样,行间距非常大,于是 TeX 的 Underfull \hbox... 警告会告诉你这一点——当然在这个例子中,问题是清晰可见的。

截屏图像,显示一个段落盒子

请注意,对于本示例,你可以使用 \raggedright 来避免这些警告:

\parbox{50pt}{\raggedright Some text typeset using a \texttt{\string\parbox}}

截屏图像,显示一个段落盒子

溢出的盒子和未满的盒子#

这个 \parbox 示例演示了一个更普遍的问题:在处理你的 LaTeX 代码时,用于排版你的文档的 TeX 引擎(pdfTeX、XeTeX 或 LuaTeX)可能会认为 LaTeX 的请求会导致排版内容与事先提供或要求的盒子边界不能“良好适配”。如果是这样,TeX 引擎会发出警告,你的材料会得到排版,但有时结果可能不符合审美期望,你可能需要加以修正。了解这些消息的含义,明白何时需要采取行动来解决问题,是值得的。

这些与盒子相关的警告的形式如下

Overfull \hbox (<value>pt too wide) ... at line(s) ... 
Overfull \vbox (<value>pt too high) ... at line(s) ... 
Underfull \hbox (badness <value> ) ... at line(s) ... 
Underfull \vbox (badness <value>) ... at line(s) ...

\hbox 指的是一个 水平盒子,在它里面,TeX 引擎将一系列条目并排放置在其中,而 \vbox 指的是一个 垂直盒子,在它里面,TeX 引擎将条目一个个地上下堆叠。

如果材料太少,TeX 引擎将报告 Underfull \hbox 警告或 Underfull \vbox 警告:

  • Underfull box 没有足够的材料来填充分配好的(盒子)尺寸,于是 TeX 引擎需要“拉伸”里面的内容,试图填充这个空间。对于未满的盒子, Overleaf 也会报告 TeX 所谓的“badness”(坏度 ),它是衡量 TeX 为了填充预设的空间而内容进行“拉伸”的量。坏度值通常在 0 到 10000 之间。如果材料过多,TeX 引擎将报出 Overfull \hbox 警告或 Overfull \vbox 警告:

  • Overfull box 有太多的内容,无法适配预先分配的(盒子)尺寸,TeX 无法把内容“挤”进所提供的空间中。TeX 引擎报告其总量 (),以点为单位,它表示你的内容超出可用空间多少——你的材料对于给定的 \hbox 来说太宽了,或者对于给定的 \vbox 来说太高了。

溢出的盒子或不满的盒子_不是_错误#

如前所说,溢出的/不满的 \hbox 或 \vbox 消息不是错误,而是用于排版你的 LaTeX 文档的 TeX 引擎(pdfTeX、XeTeX 或 LuaTeX)输出的“诊断警告消息”。尽管向你_报告_的是 Overleaf,但这些警告并不是由 Overleaf _生成_的:它们源自 TeX 引擎内部。在排版中间,这些消息被写入 .log 文件——一个由 TeX 引擎生成的文本文件,用于在处理 LaTeX 代码时记录各种信息。Overleaf 处理 .log 文件以提取 TeX 引擎的 overfull/underfull \hbox 或 \vbox 警告消息,并在 Overleaf 界面中显示出来。这有助于你定位和识别文档中可能需要编辑的部分,以生成最佳的排版结果。

我有必要担心这些警告吗?#

刚接触 TeX/LaTeX 的用户可能会对这些警告感到担忧,想知道这些是不是表示他们的文档有严重问题,但通常情况下,此类警告大多数可以地放心忽略。不过,这些警告有时确实会突出显示文档中需要检查的部分,这里可能需要编辑以改善排版的视觉效果。

要解释这些消息可能需要一些练习,因此,如果你是 TeX/LaTeX 新手,那么值得花些时间去体验一下,找出源代码中生成警告的点位。这样做,你很快就能学会定位那些警告,它们真的显示了需要处理的问题。

怎么找到警告源?#

  1. 在 Overleaf 界面中,单击警告消息,编辑器将滚动到 LaTeX 源代码的适当位置。
  2. 在源代码中这个位置的左侧,会有一个包含感叹号 (!) 的黄色的小三角形。
  3. 如果你把鼠标指针放在这个三角形上面,Overleaf 将显示警告消息。 这个短视频演示了上述步骤。

怎么找到与LaTeX代码对应的PDF位置?#

找到生成特定警告的 LaTeX 代码后,你可以使用分隔栏上的箭头跳转到 PDF 中的适当位置,分隔栏在编辑器和排版结果 PDF 两个面板中间。

截屏图像,显示一个段落盒子

如果你没有看到这些箭头,我们的帮助文章《如何从排版结果 PDF (SyncTeX) 跳转到源代码》 展示了怎么启用它们。

常见问题及其解决办法#

  • 您可以使用 microtype 包,它利用了 pdfTeX 引入的微型排版扩展,生成更高质量的排版,还可以减少坏盒子。
  • 如果你对 URL 和断行有疑问,可以将选项 breaklinks 添加到 hyperref 包:\usepackage[breaklinks]{hyperref}。
  • 像 \parbox 一样,当 TeX 引擎试图将段落分成几行时,minipage 环境可能会产生溢出或未满盒子的警告:

\begin{minipage}{width} text... \end{minipage}

如果有可能,请增加宽度的值以使 TeX 引擎有更好的机会去生成良好的断行,或使用 microtype 包

使用\\的注意事项#

\\ 是一个宏(控制符号),其精确定义取决于它的上下文 —— 可以在这个 tex.stackexchange 上的答案中找到很棒的讨论/解释。

  • \\ 不应该用于在段落之间添加垂直空间——这是非常糟糕的做法。
  • \\ 可以用作换行符(类似于 Microsoft Word 中的 Shift-Enter)。在 LaTeX 中生成新段落的正确方法是,在源代码中用空行分隔段落。
  • 不要使用 \\(或 \newline,或 \vspace)来模拟段落分隔符或增加段落间距,设置段落间距的推荐解决方案是加载 parskip 包:将 \usepackage{parskip} 放在文档的序言中。
  • 在文档段落中到处使用 \\ 可能会干扰 LaTeX 的算法——它要计算放置浮动体、断页符等的最佳位置,并可能导致大型文档中编译错误。
  • tex.stackexchange上的一些答案解释了 \\ 的合理用途。例如:
  • 何时使用 \par,何时使用 \\,或\newline,或空
  • \* 是做什么用的?

控制TeX向你报告哪些盒子#

TeX 引擎提供了许多低级的原始命令,您可以使用这些命令来引导 TeX 的探索式算法,还可以设置一个阈值,以确定一个盒子的坏度要超过多大时 TeX 才需要报告。以下是给对这些命令感兴趣的读者的一些链接:

进一步阅读#

关于 TeX 使用盒子和胶的进一步的背景阅读,感兴趣的读者可以参考以下资源:

评论