通常更喜欢未满的,而不是过满的?

通常更喜欢未满的,而不是过满的?

对我来说,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 或\linebreakLaTeX 中可以输入。

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%不应在文档中模仿;它们在这里是由于历史原因;最好不要%在这些情况下添加。

如果你有一个特别难的段落,你可以按照优先顺序选择几种方案:

  1. 改述;
  2. 添加算法遗漏的可行连字点
  3. 解掉领带;
  4. 尝试猜测一个可能\linebreak
  5. {\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}

相关内容