我正在尝试理解以下包etoolbox
。我不确定以下语法的含义,因为我不确定在 Google 中或在 Knuth 的书中要搜索什么的正确问题是什么。
\edef\etb@catcodes{\etb@catcodes}
我不明白这句话的意思,尤其是那个@
字符。如果有人能解释一下,我将不胜感激。
答案1
etoolbox
一旦明白了这一点,这部分内容相当棘手,但实际上并不复杂。
当 LaTeX 执行时\usepackage
,命名的文件被加载并被@
视为一个字母,这使得可以在宏名中使用它。
该etoolbox
包需要在其中某些部分更改类别代码,因此它希望确保在最后恢复这些设置。
以下是代码:
\def\etb@catcodes{\do\&\do\|\do\:\do\-\do\=\do\<\do\>}
\def\do#1{\catcode\number`#1=\the\catcode`#1\relax}
\edef\etb@catcodes{\etb@catcodes}
\let\do\noexpand
\AtEndOfPackage{\etb@catcodes\undef\etb@catcodes}
第一条指令存储包中可能更改其类别代码的字符列表,以便在最后恢复。\do
宏是用于定义列表的传统宏,可以重新定义为执行列表。在本例中,它被重新定义,例如,\do\&
扩展为
\catcode\number`\&=\the\catcode`\&\relax
如果定义后的代码\do
只是\etb@catcodes
,则 TeX 会将上述代码转换为
\catcode 38=4
这将是无用的,因为这个是当前设置。相反,etoolbox
它希望将这些设置保存到最后,所以它确实
\edef\etb@catcodes{\etb@catcodes}
它对所有存储的字符进行类似的完全扩展。由于\edef
在将含义赋予之前进行完全扩展\etb@catcodes
,因此不存在无限循环的危险;最后,的定义\etb@catcodes
相当于
\def\etb@catcodes{%
\catcode 38=4\relax
\catcode 124=12\relax
\catcode 58=12\relax
\catcode 45=12\relax
\catcode 61=12\relax
\catcode 60=12\relax
\catcode 62=12\relax
}
但有一个根本的区别:如果某个包的类别代码被改成了|
13,那么
\catcode 124=13\relax
在 的定义中\etb@catcodes
。
在包的末尾,\etb@catcodes
被执行,因此将所有类别代码恢复到以前的状态,并且宏未定义。