使用 \hbox 填补水平盒子不足的问题但不能用 \halign

使用 \hbox 填补水平盒子不足的问题但不能用 \halign

使用\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

相关内容