\def、\edef、\gdef 和 \xdef 之间有什么区别?

\def、\edef、\gdef 和 \xdef 之间有什么区别?

我是一名 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

相关内容