为什么 \hss 会失败?

为什么 \hss 会失败?

请问为什么以下操作会失败?

% \hss -> \hskip 0pt plus 1fil minus 1fil
\setbox0=\hbox{a}%
\setbox0\hbox to 10mm{\hss\unhbox0\hss}
\unhbox0

是什么让 LaTeX

\def\bm@c{\hss\unhbox\@tempboxa\hss}

不同的?

编辑

以下方案有效

\newbox\boxa
\newbox\boxb
\setbox\boxa=\hbox{a}%
% Case 1
\setbox\boxb\hbox to 10mm{\hss\unhbox\boxa\hss}
x \box\boxb y

% Case 2
\setbox\boxb\hbox to 10mm{\hss\box\boxa\hss}
x \unhbox\boxb y

我只是想知道为什么\unhbox\boxb在第一种情况下会出现错误。具体什么时候进行\hss评估?在框内还是框外?

TeX by Topic(第 18.3.1 节)规定

\leftskip=0cm plus 0.5fil \rightskip=0cm minus 0.5fil

给出错误“无限收缩......”但这似乎与所讨论的问题没有直接联系。

答案1

示例代码中发生的事情是,首先,创建一个宽度为 10 毫米的盒子,两端都有胶水,中间有一个字母。胶水凝固后,在盒子里,这样整个空间就被填满了。然后你把它拆开。内容被清空到主水平列表中,胶水是重置在这种情况下。您收到的错误是

! Infinite glue shrinkage found in a paragraph.

当 TeX 开始尝试重置无限收缩时就会发生这种情况\hss(尽管它只需要扩大,并且您可以在输出中看到字母 a 确实位于其行的中心)。

你的新示例的情况完全相同。如果你放置一个整箱成一个段落,那么无论里面有什么胶水,都不会无限收缩,因为胶水是已经设定在盒子里。如果你拆开包装,胶水就会失去它的尺寸,必须重新设置,而且它的无限收缩组件会出现错误。

也许最好这样来思考这种情况。设.表示粘连,设-表示设置粘连;即实际空间。我将写一个带有条形的实际盒子|。然后您将得到以下对应关系:

\hbox to 10cm {\hss a\hss} ---> \hbox to 10cm {.a.} ---> |---a---|

首先,\hbox检查内部的水平列表,其中包括胶水,并设置该胶水的长度,使其填充框,从而得到最后一张图片。假设这是存储在中的框\box0。那么您的示例是:

\unhbox0 ---> \unhbox |---a---| ---> .a. ---> -----------a------------

你看,当酒吧被移除时,就会-恢复到.'s,必须重新解释,从而导致一些不同的长度,如右图所示。问题是,即使这些长度拉伸,胶水本身具有无限的收缩分量,这在 之外的计算中是不允许的\hbox

相关内容