\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 代码,框适用于排版文本。根据具体情况选择合适的宏。