对我来说,LaTeX 默认偏向 overfull 而不是 underfull。有什么参数可以将这种偏好转向 underfull?
对于我当前的草稿,令我惊讶的是,我需要去\linebreak[4]
避免出现一条过满的线,该线向右边距突出约 5% 的线宽,更让我惊讶的是,插入后产生的未满线\linebreak[4]
看起来一点也不糟糕:您甚至不会注意到,按照 LaTeX 的标准,它是不够完整的。
有问题的行开始了一个段落,除了\cref
末尾的和我不想断开的较长的“单词”之外,没有其他特殊内容(没有数学)。我使用标准article
类。
另一方面,如果你看一下 MS Word,你会发现它非常喜欢不完整的字体,并且会产生丑陋的线条,例如
Interword spaces are too much
blah blah blah blah . . . . . . . . . blah
这可能太多了,但仍然比边缘突出 5% 更容易接受。所以,我想让 LaTeX 朝这个方向稍微移动一下。
我仍然有很多过满的线条,突出的线条少了很多,但我没有任何欠满的线条。我仍然想要警告。我只是想将偏好稍微转向欠满。
编辑:感谢@David Carlisle 的回答,我找到了一个“部分解决方案”:我刚刚添加了这两行
\tolerance 1000%
\emergencystretch 3em%
回到我的序言。有问题的行不再是满的,而是(没有\linebreak
)对齐的行,间距比正常情况要宽一些。结果比原来的满行好多了,原来的满行间距太窄,有点影响可读性,右边距突出太多。我查看了整个文档,但没有发现任何明显的未满行。
因此,我的结论是,至少对于我用常规类编写的文档类型而言article
,LaTeX 默认情况下对未满的行有点太不宽容了。
剩下的问题是默认设置下,对于被判定为过满的线路,我不会收到未满警告。我只是想了解潜在的问题。这可能是一个不可能实现的要求?
lua-typo
@rallg 指出,该软件包并没有改变警告。
答案1
满箱绝不首选,它们总是无限糟糕,只有当所有其他选项也无限糟糕时才会被采用,所以到那个阶段没有参数可以提供帮助。例如,你可以做的\sloppy
是允许空白延伸更多,这样延伸的线条就不会无限糟糕,然后它们将被选中而不是过度填充。
答案2
人们应该从这样的假设开始:糟糕的段落就是糟糕的。
只有一种方法可以强制 TeX 生成包含未满行的段落,即插入明确的惩罚,使未满的框更具吸引力(根据 TeX 执行的糟糕程度计算)。
否则,TeX 将倾向于生成包含过满行的段落,因为它们更容易调试,因为打印输出将在该位置显示黑色斑点(在 LaTeX 中您需要draft
文档类选项)。
\documentclass[twocolumn]{article}
\usepackage{kantlipsum}
\begin{document}
\tracingparagraphs=1 \tracingonline=1
\kant[1]
{\hyphenpenalty=-5000 \kant[1]}
\end{document}
当然,\penalty-10000
段落中的命令也会使未满行“更可取”。通常不会输入该命令,但\break
在纯 TeX 或\linebreak
LaTeX 中可以输入。
TeXbook 第 107 页上第一个双重危险的段落特别有趣:
如果您想不惜一切代价避免框过满,又不尝试手动修复它们,您可能想设置
\tolerance=10000
;这允许在棘手的情况下接受任意糟糕的行。但无限的容忍度不是一个好主意,因为 Te\ 不会区分非常糟糕和极其糟糕的行。事实上,10000 的容忍度会鼓励 TeX 将所有糟糕之处集中在一个地方,制作一条真正难看的行,而不是两条中等糟糕的行,因为根据规则,单次“注销”产生的总缺点最少。有一种更好的方法可以获得所需的效果:TeX 有一个名为 的参数,\emergencystretch
在计算糟糕程度和缺点时,它会添加到每行的假定可拉伸性中,以防框过满无法避免。如果 为正数,当前几次遍历无法满足和 的\emergencystretch
方法时,TeX 会在选择换行符之前对段落进行第三次遍历。的效果是缩小不良程度,以便区分大无穷和小无穷。通过设置足够高(基于),您可以确保永远不会超过;因此永远不会出现过满框,除非断行任务确实不可能完成。\pretolerance
\tolerance
\emergencystretch
\emergencystretch
\hsize
\tolerance
这就是\sloppy
:
% latex.ltx, line 15143:
\DeclareRobustCommand\sloppy{%
\tolerance 9999%
\emergencystretch 3em%
\hfuzz .5\p@
\vfuzz\hfuzz}
9999%
并且3em%
不应在文档中模仿;它们在这里是由于历史原因;最好不要%
在这些情况下添加。
如果你有一个特别难的段落,你可以按照优先顺序选择几种方案:
- 改述;
- 添加算法遗漏的可行连字点
- 解掉领带;
- 尝试猜测一个可能
\linebreak
{\sloppy\par}
在段落末尾添加
对于最后一个选项,您可能会收到有关箱子未满的警告。
例子:
\documentclass[draft]{article}
\usepackage{kantlipsum}
\begin{document}
\vbox{\hsize=12em
\kant*[1]
}
\end{document}
\vbox{\hsize=12em ...}
而不是\parbox{12em}{...}
因为\parbox
适用\sloppy
这将显示六条溢出的行。使用
\vbox{\hsize=12em
\kant*[1]{\sloppy\par}
}
您会得到五条不完整的行,其中最大错误率为 1917。因此,当您决定这种解决方案是最好的(实际上是最不糟糕的)时,您可以进行设置,\hbadness=1917
以免不必要的信息污染您的日志文件。
\kant*[1]{\hbadness=1917 \sloppy\par}
当然这应该在最后修订。记得在打字稿中清楚地标记这些段落。定义一个宏,例如
\newcommand{\SOLVEPAR}[1]{\unskip{#1\relax\sloppy\par}}
可以提供帮助,因为它很容易找到,但也可以变成无操作。因此,有问题的段落可能是
\kant*[1]\SOLVEPAR{\hbadness=1917}