已编辑 (09/12/09 UTC 2:45)

已编辑 (09/12/09 UTC 2:45)

\def\box有时用作盒子构造的缩写,那么它的输出有时与用寄存器代替的输出相同\def

问题来了。我什么时候应该使用寄存器\box而不是\def?在特定情况下,一个比另一个更好吗?


已编辑 (09/12/09 UTC 2:45)

已编辑问题

有没有什么情况\setbox和它的输出命令对(不仅有\box0,还有\copy0\unhbox0等等)可以替换最终扩展为框的宏定义?

如果存在这种情况,是否存在一种特定情况,即其中一个比另一个更好?

我认为的例子

情况1:

\def\excuse{I should have made my question more clearer before the post.}
\setbox0=\hbox{I should have made my question more clearer before the post.}

我认为只要我用 调用盒子寄存器,上述情况就是一样的\unhcopy0。但是,我想知道第一种是否比第二种更好,因为它可以节省内存。

案例2:

\def\excuse{\hbox{I should have made my question more clearer before the post.}}
\setbox0=\hbox{I should have made my question more clearer before the post.}

我认为只要我用 调用盒子寄存器,上述情况也是一样的\copy0

案例3:

\def\myhrulefill{\line{\leaders\hrule\hfill}}
\setbox0=\line{\leaders\hrule\hfill}

在这种情况下,\hbox包含命令,我怀疑我是否可以说它们是相同的。

不幸的是,我无法向您展示一个包含一些命令的足够复杂的示例。也许,如果上述示例包含条件语法(如)\if,重复语法(如)\loop...\repeat,那么一个就不能替代另一个。我特别想知道这种情况。

答案1

仅有的盒子和宏(用 定义)之间的共同点\def是它们都存储东西。就是这样。


宏可以存储任意的 TeX 代码,以便出于多种原因在文档中重复使用。使用宏,您可以做任何事情,从简化编写阿诺德·施瓦辛格的名字模拟 TeX 本身,假设您有足够的宏来做正确的事情。

另一方面,框存储排版后的文本。就是这样。

对于足够简单的用法,两者都可以似乎做同样的事情。例如:

\setbox0=\hbox{Arnold Schwarzenegger}
\def\arnold{Arnold Schwarzenegger}
Here's \box0{} and \arnold{} again.

将排版:

在此处输入图片描述

然而,在上面的例子中,\box0和之间的基本区别在于\arnold\box0已经在框中排版名称,命令\box0只是将其布置在页面上。\arnold另一方面,它被扩展为一个字符序列,然后被排版和發生以获得相同的输出。

为了看到差异,假设我在设置框之后但在写出之前更改字体:

\setbox0=\hbox{Arnold Schwarzenegger}
\def\arnold{Arnold Schwarzenegger}
\bf Here's \box0{} and \arnold{} again.

输出将是:

在此处输入图片描述

看看盒子里的东西没有用粗体字体。那是因为当时已经排版好了,盒子上只有用过的

另一个区别是,一旦文本在框中排版,您就可以测量它:

\setbox0=\hbox{Arnold Schwarzenegger}
Here's \copy0{} typeset in a \the\wd0{} box.

在此处输入图片描述

您可以尝试使用宏来执行此操作,但它不起作用。

但是,使用宏,您可以拥有“动态内容”,而使用框,如上面的字体更改示例所述,所有内容都在使用时固定\setbox。举一个(非常简单的)例子:

\def\arnold#1{Arnold #1}
Here's \arnold{Schwarzenegger} and another \arnold{Foo}.

这是用盒子无法做到的。


因此,在选择其中一种方式时,您必须考虑要存储的数据类型,然后再进行选择。只有对于像第一个例子这样的简单情况,选择才可能是模棱两可的,但是如果您对示例进行一点点更改(例如添加字体更改),那么一种方式或另一种方式都是错误的。

简而言之,宏适用于 TeX 代码,框适用于排版文本。根据具体情况选择合适的宏。

相关内容