为什么这个 \xpathcmd 在 expl3 范围内不起作用?

为什么这个 \xpathcmd 在 expl3 范围内不起作用?

考虑以下示例,同样的\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 的空格。

成功的修补需要几个步骤:

  1. 传递所获得的字符串\scantokens以查看是否可以重建;
  2. 将重建的标记列表与原始标记列表进行比较;
  3. 在重构的标记列表中查找“find”标记列表;
  4. 如果找到,就进行替换。

第二步失败将导致补丁无法应用。您必须记住\scantokens(或其expl3包装器)使用应用时当前的类别代码制度;在的范围内\ExplSyntaxOn,空格的类别代码为 9,并且您不想重建忽略原始宏中的空格的宏。

\bar这就是为什么你的无法在 范围内修补的原因\ExplSyntaxOn

一个可能的改进regexpatch是使用类别代码表,但这是主要工作。但主要思想是大范围的修补是不好的。

相关内容