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)的参数。它没有改变并不奇怪。