\everyhbox 如何工作?

\everyhbox 如何工作?

Knuth 在 TexBook 第 24 章中给出了命令的简短列表every。该\everyhbox命令在水平框前插入一个标记列表(顾名思义)。

以下是一个简短的例子:

\documentclass[11pt]{article} 
\begin{document}
 \begingroup
     \everyhbox{a} % change this to $a$ to see the issue!
     \def\oneLineBox#1#2%
     {%
          \hfuzz=0pt
          \overfullrule=0.25pt
          \setbox0=\hbox spread#2{#1}%
          \setbox1=\hbox{\the\badness}% 
          \setbox2=\hbox to 5cm{\box0\hfil\box1}%
          \box2
     }
     \oneLineBox{Badness of line }{-1em}
     \oneLineBox{Badness of line }{-0.50em}
     \oneLineBox{Badness of line }{-0.39em}
     \oneLineBox{Badness of line }{0em}
     \oneLineBox{Badness of line }{1em}
     \oneLineBox{Badness of line }{2em}
     \oneLineBox{Badness of line }{3em}
 \endgroup

\end{document}

上面的宏oneLineBox设置了一些框,\everybox我们使用 在每个水平框中添加字母a。但是当我们将字母改为数学字母$a$,比如 时,badness 显示为零,为什么?行的 badness 肯定没有消失吧?将 改为 可以获得类似的结果\badness\hbadness这次 TeX 为所有行显示 1000。 似乎overfullrule也有点不对劲!

答案1

这实际上与 没有任何关系\everyhbox。真正的问题是,构建数学列表涉及构建水平盒子,而 则\badness反映了这一点。

例如,

\setbox0\hbox spread -1em{X}
\the\badness

\setbox0\hbox spread -1em{X}
$a$\the\badness
\bye

第一个盒子非常糟糕,因为胶水收缩超出了极限。在第二个案例中,盒子再次非常糟糕,但我相信反映了 及其斜体修正的\badness糟糕程度。a

好的,我终于在 tex.web 中找到了这种情况发生的位置。mlist_to_hlist根据附录 G 中的规则将数学列表转换为水平列表。特别是,它调用hpack包含

last_badness := badness(...)

而这个全局变量正是 报告的不良之处\badness

我不确定这是否真的被提及过TeXbook—我浏览了 texbook.tex(这本书的副本在我的办公室里),没有看到任何关于它的提及。它似乎不在TeX 按主题分类任何一个。

\hbadness\vbadness是控制“TeX 报告水平/垂直框未满或过满之前的容差量”(TeX by Topic)的参数。它没有改变并不奇怪。

相关内容