如果无法通过改写、更改布局等方式删除过满的框,则基本上有两种策略可以删除它们:
- 增加价值
\tolerance
- 增加价值
\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 真正花时间的地方……)