如果我有两个这样的盒子:
\hbox to 2cm{\vrule\hfil\hbox{\vrule keke\vrule}\hfil\vrule}
\bye
那么内部是否有可能\hbox
占据全部 2cm?(\hfil
s 和\vrule
s 仅用于说明尺寸)
答案1
这并不能回答您的问题,但也许您想要这样的东西?
\documentclass{article}
\makeatletter
\newcommand\labeleddownbracefill[1]{%
$\m@th
\setbox\z@\hbox{$\braceld$}%
\braceld
\leaders\vrule\@height\ht\z@\@depth\z@\hfill
\braceru
\raise1ex\hbox to\z@{\hss$\scriptstyle#1$\hss}%
\bracelu
\leaders\vrule\@height\ht\z@\@depth\z@\hfill
\bracerd
$%
}
\makeatother
\begin{document}
\begin{tabular}{cc}
foo&\labeleddownbracefill{\lambda}\\
bar&Here is some text to be braced\\
\end{tabular}
\end{document}
答案2
我的想法比我想象的要复杂得多,并且与解决方案相差太远,不能算作答案,但是因为我花了一些时间......基本思想,给出的代码如下(所有代码均为 Plain Tex):
\setbox0=\hbox to 3in
{\hfill a\hfill} % Box 0 is an hbox containing a skip, an hbox-like item, and a skip
\showbox0
是 (i)\showbox
将通过告诉您如何“设置”粘合来告诉您重新设计 hbox 所需的信息:
\hbox(4.30554+0.0)x216.81, glue set 105.905fill
.\glue 0.0 plus 1.0fill
.\tenrm a
.\glue 0.0 plus 1.0fill
即 1.0fill 是 Tex 内部测量值的 105.905;并且 (ii),您可以使用此粘合设置因子返回并替换最后一次跳过的 vrule:
\skip0=105.95 % the glue setting factor
\setbox1=\hbox to 3in
{\unhcopy0 % Make contents so far of this box be contents of box 0
\unskip %remove last skip
\hbox to \skip0{\vrule}} %put in hbox of same width as removed skip
两个盒子寄存器将包含三个相同宽度的项目,但盒子 0 中的最后一个跳过将被盒子 1 中的规则替换。您可以通过定义一个带有“孔”的宏来简化这一步,其中 skip/hbox 将进入该孔。
我们不想手动查找结果来计算宽度:我们希望自动获取粘合尺寸的“设置”宽度。这就是困难之处。我认为 Tex 或 Etex 中没有办法在内部提取跳过的拉伸/收缩因子,尽管可以使用输出信息\showbox
并在外部执行计算。Luatex 确实允许您查看拉伸/收缩因子的内部,但它似乎不允许您直接检查设置因子。
因此,我可以想到两种有问题的方法来获取这里想要的值:
- 通过解析外部的输出
\showbox
; - 在 Luatex 中,通过递归盒子的结构并根据收集到的信息计算胶水设置(即重建 Tex 算法已经执行的操作)。