我对 TeX 内部机制只有基本的了解,所以我希望我在这里说的话不是完全胡说八道。如果我理解正确的话,在 TeX 中,水平定位/换行是使用基于段落级优化 (Knuth-Plass) 的相当先进的算法完成的;它允许使用诸如粘连和换行惩罚之类的概念,并且比 MS Word 等更简单的方法提供更好的结果。
另一方面,我似乎明白,没有类似的东西用于垂直的文本定位。行完成后立即发送出去,并使用明显的贪婪算法填充页面。使用特殊技巧处理孤行和孤儿行。
[编辑:这并不完全正确,请参阅Hendrik Vogt 的回答下面 --- 涉及优化算法,尽管它只是针对单个页面的局部优化,而不是 KP]
因此,我自然而然地想到了一个问题:
为什么不使用类似于 Knuth-Plass 的分页符和文本的垂直布局?这会带来很大的麻烦吗?
答案1
Knuth 在佛罗里达州圣彼得堡的问答环节中谈到了这个问题,并发表在 tugboat 上:-TUG'95:与 Donald E. Knuth 教授的问答,第 18 页(第 2 栏底部)-20 页;该会议重新发表于数字排版,相关问题从第594页开始。
分页问题也是 Michael Plass 论文的主题,自动排版系统的最佳分页技术,发布在拖船网站上。
答案2
Plass 证明,分页问题可以是 NP 完全的。当时的计算机比现在慢了大约 10^4 倍,所以这是一个问题。
答案3
你的假设不是相当正确,TeX 不会简单地使用贪婪算法来填充页面。每个分页符的选择方式是在此刻这是最优的。为了实现这一点,TeX 实际上会排版比页面所能容纳的内容更多的内容,然后选择具有最小不良度的断行。例如,如果有一些可以拉伸或收缩的垂直空间,那么在大多数情况下可以避免出现孤行和寡行。或者 TeX 使用可用的收缩来不仅将节标题而且将相应节的前两行放入当前页面。
TeX 的作用不是要做的就是优化整套分页符。因此,第一个分页符可能很好,但代价是第二个分页符很糟糕;TeX 不像下一个分页符。造成这种情况的主要原因似乎是 TeX 设计时的计算机内存限制。摘自 TeXbook 第 110 页:
TeX 通过计算不良评级和惩罚将行列表分成页面,这与将段落分成行的方式差不多。但页面一次只组成一个,并从 TeX 的内存中移除;无法提前查看一个分页符将如何影响下一个分页符。换句话说,TeX 使用一种特殊的方法来查找整个段落中行的最佳断点,但它不会尝试查找整个文档中页面的最佳断点。计算机没有足够的高速内存容量来记住多个页面的内容,因此 TeX 只是通过“局部”而不是“全局”优化过程尽可能地选择每个分页符。
看来排版系统鲁特对多页的分页符进行一些优化:
Lout 使用了 Knuth(TeX 的作者,LaTeX 就是基于 TeX 的)的最佳换行算法,并将其扩展到跨页的段落换行。
答案4
我写了一个排版系统在水平和垂直模式下都使用 Knuth-Plass。在垂直模式下使用它会使一些事情变得比以前更复杂。(例如,分页到奇数页、切换列数或定位脚注。)但我能够指定诸如“尝试将图像放在与图像参考相同的跨页上”之类的内容。此外,我能够完全避免打破脚注。这些事情实际上只能在章节的后面实现,因此用处有限。