请问为什么以下操作会失败?
% \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
。