使用\halign
原始元素时,同一列中的单元格都具有相同的宽度。因此,如果一个条目非常大(abcdefg
见下文),其他条目将被拉伸到相同的大小。如果条目不包含粘连,则不会拉伸。即,
\halign{#\cr abcdefg\cr a b\cr ab\cr}
给出
abcdefg
a b
ab
这可以通过应用\hbox to <wd>{...}
到每个条目来模拟。但是,当没有胶水时,\halign
不会产生Underfull hbox
警告,而\hbox to <wd>{...}
会产生警告。
我这样做是否正确,
\halign
相当于\hbox to <dim>{...}
调整条目大小?我想避免虚假
Underfull hbox
警告。如何测试其中是否存在胶水\hbox
?
答案1
您可以使用类似以下方法测试是否\hbox
未满,而无需收到消息
\begingroup
\setbox0=\hbox{...}
\hbadness=10000 % suppress `Underfull \hbox' messages
\setbox0=\hbox to <wd>{\unhbox0 }
\xdef\mybadness{\the\badness}
\endgroup
如果 未满,则将\mybadness
扩展至 10000。\hbox to <wd>
请参阅 TeXbook,第 229 页。通过赋予 不同的值,<wd>
您还可以测试粘连是否无限。
答案2
对我来说这似乎是一个tex.web
。对齐代码比简单的装箱操作更复杂,因为需要\span
正确处理。但是,总体流程相当清晰。TeX 遍历行,将所有内容排版为自然宽度,但在未设置的框中(IE.在此阶段未设置粘合)。在每个阶段,将当前框的宽度与前导中的宽度进行比较。如果当前框更宽,则将此值存储在前导中以供进一步使用。所有未设置的框本身都存储在每行一个框中。
一旦 TeX 到达对齐的末尾,它就会遍历每一行并设置粘合。关键的例程似乎是
@ @<Make the unset node |r| into an |hlist_node| of width |w|...@>=
begin height(r):=height(q); depth(r):=depth(q);
if t=width(r) then
begin glue_sign(r):=normal; glue_order(r):=normal;
set_glue_ratio_zero(glue_set(r));
end
else if t>width(r) then
begin glue_sign(r):=stretching;
if glue_stretch(r)=0 then set_glue_ratio_zero(glue_set(r))
else glue_set(r):=unfloat((t-width(r))/glue_stretch(r));
@^real division@>
end
else begin glue_order(r):=glue_sign(r); glue_sign(r):=shrinking;
if glue_shrink(r)=0 then set_glue_ratio_zero(glue_set(r))
else if (glue_order(r)=normal)and(width(r)-t>glue_shrink(r)) then
set_glue_ratio_one(glue_set(r))
else glue_set(r):=unfloat((width(r)-t)/glue_shrink(r));
end;
width(r):=w; type(r):=hlist_node;
end
当前问题的重点是,这只是为了比对而编码的,尽管概念与 几乎相同\hbox to <dim>
。因此,比对中使用的代码不包括对未满框的检查。
您可以看到代码的整体效果与使用并查看框的\halign
效果相同,例如\hbox to <dim>
\tracingall
\tracingall
\halign{#\cr abcdefg\cr a b\cr ab\cr}
\newbox\testbox
\setbox\testbox=\hbox{abcdefg}
\setbox\testbox=\hbox to \wd\testbox{a b}
\box\testbox
\bye
您会发现,两种a b
情况下的粘合情况是相同的:只是在案例中省略了警告\halign
。