如何自动减少超满 \hbox 的间距?

如何自动减少超满 \hbox 的间距?

我能以某种方式告诉 LaTeX 收缩过满的水平盒子中的空间而不是拉伸它们吗?

我有一个段落,里面都是很长的单词,不能用连字符连接。可以预见的是,这会产生一个溢出 \hbox 警告:具体来说Overfull \hbox (6.85588pt too wide)。我可以用类似 的方法来解决这个问题\setlength{\emergencystretch}{10em},但在这种情况下,我最终得到了一行三个单词和两个可怕的巨大空格。有没有办法设置一个长度,让空格缩小而不是拉伸,或者当 hbox 有点溢出时挤压它的内容?也许是负拉伸?我基本上希望有一些东西能与 emergencystretch 参数相反。

编辑:我认为在这种情况下缩小空间可能没有什么帮助,因为最终得到的空间长度将小于其原始长度的一半,但我仍然想知道如何做到这一点。

答案1

处理过满的箱子时,有几个不同的升级级别。从对输出质量的最小影响开始:

  1. 添加\usepackage{microtype}

    这将对文档应用微印刷增强功能,可以防止框过满,并且通常可以减少连字符。

  2. 重写有问题的段落。

    通常,添加填充词或用不同长度的同义词替换单词或重新排列小句就足以让过满的框消失。

  3. 使用 TeX 的换行参数。

    断行会受到许多参数的影响。首先,您可以尝试设置\tolerance为更高的值(默认值200),例如\tolerance=1000。这将允许 badness 为 1000 的行。

    另一个参数是\emergencystretch(default 0pt)。如果空格必须比其常规可拉伸性拉伸得更远,则将在此参数上添加。例如,尝试\setlength{\emergencystretch}{1pt}

    有时,溢出的水平盒子非常小,因此肉眼无法真正看到。您可以通过调整参数\hfuzz(default 0.1pt) 来消除溢出水平盒子的警告。这实际上不会移除溢出的盒子,但您不会再为此烦恼。请谨慎使用!

    您希望将上述所有值的操作仅限制在有问题的段落上。因此,您应该将段落和设置包装在一个公共组中,如下所示

    {\tolerance=1000
    ...
    \par}
    

    段落分隔必须\par在组内进行,否则 TeX 将在组外执行段落分隔,并且会忘记您在组内设置的参数。

现在我们已经进入了“我不在乎它看起来如何,闭嘴就好”的境界。

  1. 将有问题的段落换入\begin{sloppypar}...\end{sloppypar}

    这会暂时将我在 (3.) 中提到的参数设置为极高的值,这样就不会出现过满的框(除非您处于一种奇怪的情况下,即您有比列宽的不可连字符的材料)。

  2. 添加\sloppy\begin{document}

    这与 相同,\begin{sloppypar}...\end{sloppypar}但适用于整个文档。如果您出于某种原因喜欢典型的文字处理器类型的对齐方式,则此设置适合您。但是,如果您使用 LaTeX 来获得其卓越的输出质量,您应该立即忘记它的存在。

相关内容