![输出程序插入惩罚](https://linux22.com/image/273673/%E8%BE%93%E5%87%BA%E7%A8%8B%E5%BA%8F%E6%8F%92%E5%85%A5%E6%83%A9%E7%BD%9A.png)
我使用的是纯 TeX(实际上是纯 e-TeX),由较新版本的 MiKTeX(pdfTeX)处理。请考虑以下可以使用纯 TeX 处理的代码片段:
\noindent
A\par
\output={\unvbox255}
\break
\vskip 1pt
\noindent
B
\output={\showbox255 \plainoutput}
\end
据我所知,我原本以为,当\break
出现时,输出例程会将的内容重新注入\box255
主垂直列表中,\vskip 1pt
清除并将\skip\topskip
插入字母 B 之前。但事实并非如此:在出现 break 时首次调用输出例程后,将\penalty10000
(莫名其妙地)插入主垂直列表中,并且未清除而是留在原处(这由上面第二个定义中\vskip 1pt
的显示)。这是 TeX 的正常行为还是错误?\showbox
\output
答案1
如果当前页面中没有方框,TeX 只会丢弃跳过的内容。10000 的惩罚是由于 TeXBook 中所述的以下情况而产生的:
当最终选定最佳分页符时,TeX 将从页面底部删除所选分页符之后的所有内容。 当前页面, 并将其全部放回到最近的贡献。所选断点本身被放置在最近贡献的最顶部。如果它是一个惩罚项,则记录惩罚的值,
\outputpenalty
并将贡献列表中的惩罚更改为 10000;否则\outputpenalty
设置为 10000。