我是一名 LaTeX 爱好者,正在慢慢探索 TeX 的奇迹。
\def
谁能告诉我、、\edef
和\gdef
之间的区别\xdef
?
我应该在哪里使用哪个,有什么优缺点?或者如果我在 LaTeX 中混合使用 TeX 命令,是否会被怀疑是代码不干净?
请给出一个如何使用该命令的简短示例。
答案1
没有优缺点:\def
并\edef
执行不同的任务。
\def<cs><parameter text>{<replacement text>}
你定义<cs>
寻找它的参数(如果有的话)并替换为<replacement text>
,在定义时不会以任何方式解释。使用
\edef<cs><parameter text>{<replacement text>}
替换文本在定义时完全展开。
例如,如果我们有
\def\aaa{aaa}
\def\bbb{x\aaa}
\edef\ccc{y\aaa}
\def\aaa{AAA}
像这样的调用
\bbb \ccc
会产生
嗚汪
因为 的替换文本\ccc
是完全扩展后剩下的内容,所以\edef\ccc{y\aaa}
与 相同\def\ccc{yaaa}
。
注意扩展\edef
已完成在定义时#1
,因此诸如等参数标记将保持不变。
一个不那么愚蠢的例子:如果你想要扩展到计数器\thissection
的值section
在定义命令时, 你不得不说
\edef\thissection{\thesection}
因为这会在定义时通过扩展来“冻结”值。相反,使用\def\thissection{\thesection}
宏\thissection
会打印当前节号。
LaTeX 具有避免“健壮宏”的一些怪癖的变体\protected@edef
,因此类似的方法可以\protected@edef\cs{\textbf{a}}
起作用而\edef\cs{\textbf{a}}
不起作用(网站上有很多示例)。
关于和\gdef
,\xdef
没有太多要说的:前者完全等同于\global\def
,后者等同于(当然,\global\edef
假设的原始含义)。LaTeX 有。\global
\protected@xdef