背景
我见过根据浮点数和引用之间的距离增加 badness已关闭,因为与我们的通用产品重复如何影响 LaTeX 中图形和表格等浮动环境的位置?但是我仍然很好奇是否以及/或者如何使用惩罚来协助浮动放置算法。
在我看来,可以在延迟浮动“保持队列”中的每个浮动字符的每个分页符处插入一个惩罚,以便在与插入点的距离增加时为算法放置浮动字符提供更大的激励。
使用当前的“贪婪”算法,这可能不会产生太大影响,因为延迟浮动基本上在它们适合指定的浮动位置时被放置,但我认为这可能会对双列文档中的全宽浮动产生影响,并且它还可以与任何\clubpenalty
、\widowpenalty
和其他涉及分页位置的惩罚相互作用。
问题
当前的浮点放置算法中是否采用了这种方法?egreg 的回答到什么是惩罚以及惩罚的具体定义是什么?提到\@floatpenalty
:
\@floatpenalty
用于浮动机制(以相当复杂的方式)
但没有更多细节,而且大卫·卡莱尔的接受的答案对点球问题,以及弗兰克·米特尔巴赫的接受的答案到如何影响 LaTeX 中图形和表格等浮动环境的位置?
后续问题
答案1
简短回答:不是。
\widowpenalty
当前浮动放置考虑添加浮动的时机和构造浮动的时机完全不同。
我想我应该提到过\@floatpenalty
,但它实际上并没有被用作 -10000 到 10000 范围内的条件提示,它只是一个计数寄存器,它从来没有被用来设置 TeX 原始惩罚,widowpenalty
或者\interlinepenalty
它总是被用来强制分页,并且只是具有常规值,例如 -10001、-10002、-10003,它们强制(内部)分页来触发输出例程。
因此,
\penalty-10003
例如在原始 TeX 级别强制分页,然后乳胶输出例程会看到该分页符是由 -10003 触发的,这告诉它它来自\marginpar
或浮动,因此它根本不会输出页面,它使用输出例程中的材料来测量您在页面上的位置,如果需要,添加 marginpar,然后重建列表以返回主垂直列表以收集更多材料。
当然,可以在浮动放置算法中记录每个浮动被推迟了多少次,并基本上在下一个分页符处强制浮动页面,以避免浮动移动超过给定的页数。实际上,这可能是一个相对简单的补充。不过,它不太可能涉及 TeX 原始惩罚节点意义上的惩罚。