尽管我的标题很煽动,但我明白这\usebox
用于显示预定义框。但这个问题涉及何时[使用框寄存器,而不是框内容]对 LaTeX 操作绝对必要(例如,作为 、 和 的参数\wd
)\ht
。\dp
[编辑上面和下面的括号,以反映正确的术语]
根据 Werner 的评论,澄清语法
\newsavebox{\xyz}
\sbox{\xyz}{...}
\def\xyzbox{\usebox{\xyz}}
是否有一些有用的事情我只能在 [登记册] 上执行,\xyz
而不能在 [盒子内容] 上执行\xyzbox
?
(如果不是,那么也许\usebox
是残留的)。
例如,考虑 LaTeX 语法
\newsavebox{\xyz}
\sbox{\xyz}{...}
\usebox{\xyz}
为什么不能构造 LaTeX,以便最后一行可以作为 发出\xyz
,而无需\usebox
(节省我输入的几个字符)?我对语法感到非常沮丧 [夸张] ,以至于我在包和包\usebox
中都解决了它。在前者中,我允许这种语法:verbatimbox
\stackengine
\begin{myverbbox}[]{\boxname}
...
\end{myverbbox}
\boxname% <--NOTE: THIS IS NOT \usebox{\boxname}
在内部,\boxname
实际上指向\usebox{boxnamecontent}
同样,在 中stackengine
,我允许:
\savestack{\mystack}{VARIOUS STACKING COMMANDS}
\mystack% <---NOTE: THIS IS NOT \usebox{\mystack}
在内部,\mystack
实际上指向\usebox{\mystackcontent}
所以我的问题的关键是?什么时候 [使用盒子寄存器] 对于 LaTeX 操作至关重要?
\wd
我意识到、\ht
和等函数\dp
对未渲染的盒子名称本身(不带 )起作用;但是,即使这些也可以被的、和\usebox
替换,它们对盒子的(渲染)版本起作用。calc
\widthof
\heightof
\depthof
\usebox
那么还有哪些其他 TeX/LaTeX 操作作用于 [盒子寄存器,而不是内容]?本质上(从修辞角度来说),\usebox
如果作用于盒子的一切都作用于\usebox
盒子的渲染形式,为什么我们仍然需要语法?
[到目前为止,答案表明我需要盒子寄存器来设置盒子并使用盒子。我可以但不需要使用寄存器来测量盒子。在模糊的地方我“需要一个数字,而不是......一个盒子”。
盒子寄存器还有其他用途吗?]
答案1
TeX 为我们提供了宏和寄存器。宏(简单地)被其定义替换,因此是“原始”使用的。LaTeX 将这个概念包装在 中\newcommand
,结果是
\newcommand{\foo}{....}
然后可以简单地用作\foo
。另一方面,寄存器必须被正确访问,至少在 TeX 不“期望”它们的地方。同样,LaTeX 提供了接口,例如
\newcounter{foo}
\value{foo}
它的作用与 TeX 构造相同
\newcount\c@foo
\the\c@foo
值得注意的是,这里使用寄存器需要一个访问器函数。
盒子是寄存器,虽然它们的工作方式与其他寄存器不太一样,但大致遵循相同的规则。特别是,它们不是宏,所以
\newsavebox{\foo}
\sbox{\foo}{...}
\foo
不一致:\foo
看起来像命令(宏),但不能使用来设置\newcommand
,ETC。还有一些地方 TeX“期望”引用一个框,而不是框的排版内容。正如您几乎指出的那样,这些不是 LaTeX 构造(\wd
不是 LaTeX 命令,而是未被 LaTeX2e“移开”的 TeX 原语)。但是,一般来说,LaTeX2e 内核确实让我们能够使用普通的 TeX 构造以及 LaTeX 构造,因为 LaTeX2e 的许多编程都是以这种方式完成的。因此打破了
\newsavebox{\foo}% or \newbox\foo in TeX syntax
\wd\foo
会有问题。(因此,\newsavebox
和的\newbox
工作方式也会有根本的不同。)
值得注意的是
\ifdim\wd\somebox=...
是可扩展的构造,而\widthof
和类似的构造不可扩展(它们将材料排版在临时框中以供测量)。因此,虽然语法\ifdim\wd
是 TeX,而不是 LaTeX,但使用它有优势(例如在 内工作\dimexpr
)。因此,使用寄存器编号而不是盒子的内容可以更容易/更清楚地完成一些事情。
答案2
所有 LaTeX 框命令都有效地以此开头,这\leavevmode
是 LaTeX 以一致且可理解的方式运行的一个重要方面。
之后\savebox\xyz{abc}
,则\usebox\xyz
作用类似于\mbox{xyz}
,而\copy\xyz
作用类似于\hbox{xyz}
并且不开始一个段落。
\xyz
它本身只是一个指向盒子寄存器的数字,因此它可以在需要数字的地方使用,而不是在需要盒子的地方使用。