为什么没有参数 \emergencytolerance?

为什么没有参数 \emergencytolerance?

如果无法通过改写、更改布局等方式删除过满的框,则基本上有两种策略可以删除它们:

  1. 增加价值\tolerance
  2. 增加价值\emergencystretch

第二种策略经常被提及的优点是,增加\emergencystretch只会影响“坏”段落(即无法排版令人满意的段落\tolerance)而不会改变“好”段落(即可排版令人满意的段落\tolerance)。

另一方面,\emergencystretch改变换行过程的方式在我看来不太正确:\emergencystretch在计算不良率时,每行的可拉伸性都会增加。因此,增加\emergencystretch会降低第三遍中的不良率,但计算总缺点(\hyphenpenalty\adjdemerits\doublehyphendemerits、...)时包含的其他参数保持不变。这会降低不良率的影响,而以连字符等结尾的行的影响会增加。此外,额外的可拉伸性对于只有四个空格的行和有十个空格的行的影响不同。

(我知道这\emergencystretch可能很有用,例如对于自动排版,因为通过设置\emergencystretch足够高的依赖于\hsize,你可以确保永远不会出现过满的框[除非输入包含一些奇怪的内容,例如比行宽的不能连字符的单词]。\tolerance=10000也永远不会产生过满的框,但可能会导致可怕的换行决策。)

我想知道为什么没有参数\emergencytolerance(或任何合适的名称)允许您选择性地指定 TeX 的换行算法在第三遍中用作容差的值。第三遍的工作方式如下:

  • 有一个名为 的参数,\emergencytolerance其默认值为-1
  • 如果第二遍失败并且\emergencystretch结果为正\emergencytolerance或非负,则执行第三遍。
  • 第三遍的流程如下:如果\emergencystretch为正数,则在计算不良度时将该值添加到每条线的可拉伸性中。如果为非负数\emergencytolerance,则将该值用作不良度的极限,而不是\tolerance,否则将\tolerance像第二遍一样使用。

这样您就可以排版“坏”段落而不会出现框过满的情况,也不会更改“好”段落,也不会出现\emergencystretch上述增加的缺点。为什么这个(可能很容易实现)功能至少在较新的引擎(如 eTeX 或 pdfTeX)中不可用(Knuth 的 TeX 基本上已冻结)?

答案1

跟进我的评论(也许不是真正回答你的问题,但我认为人们可以从中受益)。

正如 David 在评论中写道,要回答为什么没有添加某些内容并不容易。我听说 LuaTeX 已被冻结,因此可能不会添加到那里,但我希望您能从这些信息中感受到,现在在 LuaMetaTeX 中这是可能的。

正如评论中指出的那样,除了增加容忍度之外,还可以做更多的事情。但是,下面的最小示例仅增加了两个 parpass,并增加了容忍度。

\setuppapersize[A6]

\showmakeup[page]

\startsetups align:pass:test
    \pretolerance 100
    \tolerance    200
    \parpasses    2
        threshold            0.025pt
        tolerance            400
      next
        threshold            0.025pt
        tolerance            800
    \relax
\stopsetups

\starttext

\samplefile{hawking}

\page[yes]

\setupalignpass[test]
% \tracingonline2
% \tracingpasses2

\samplefile{hawking}

\stoptext

并排的两页:

输出,具有额外的公差

取消注释跟踪宏将在终端中显示更多信息。

顺便说一句,这几乎不会增加运行时间。在一本 300 页的书上,我认为 4 次额外的传递(包括扩展)增加了不到一秒的时间。(所以,这并不是 TeX 真正花时间的地方……)

相关内容