考虑以下示例,同样的\xpatchcmd
操作在外部有效ExplSyntax
,但在内部无效。为什么会这样?
\documentclass{article}
\usepackage{regexpatch}
\begin{document}
\def\foo{foo}
\def\bar{with a macro \foo}
\bar
\ExplSyntaxOn
\xpatchcmd{\bar}{\foo}{bar}{}{\FAIL}
\ExplSyntaxOff
% \xpatchcmd{\bar}{\foo}{bar}{}{\FAIL}
\bar
\end{document}
答案1
TeX 仅提供两种访问宏的替换文本的方法:通过扩展它或通过使用\meaning
。
在某些情况下,可以使用第一种方法进行修补,但这并不是一种普遍的可能性。
etoolbox
/xpatch
和使用的方法regexpatch
利用了\meaning
。 的问题在于\meaning
替换文本以“字符串”形式提供:类别代码 12 的所有字符(包括反斜杠),除了保留类别代码 10 的空格。
成功的修补需要几个步骤:
- 传递所获得的字符串
\scantokens
以查看是否可以重建; - 将重建的标记列表与原始标记列表进行比较;
- 在重构的标记列表中查找“find”标记列表;
- 如果找到,就进行替换。
第二步失败将导致补丁无法应用。您必须记住\scantokens
(或其expl3
包装器)使用应用时当前的类别代码制度;在的范围内\ExplSyntaxOn
,空格的类别代码为 9,并且您不想重建忽略原始宏中的空格的宏。
\bar
这就是为什么你的无法在 范围内修补的原因\ExplSyntaxOn
。
一个可能的改进regexpatch
是使用类别代码表,但这是主要工作。但主要思想是大范围的修补是不好的。