为什么是 \usebox (它是残留的吗)?

为什么是 \usebox (它是残留的吗)?

尽管我的标题很煽动,但我明白这\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看起来像命令(宏),但不能使用来设置\newcommandETC。还有一些地方 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它本身只是一个指向盒子寄存器的数字,因此它可以在需要数字的地方使用,而不是在需要盒子的地方使用。

相关内容