\xpatchcmd 在应用于未定义的命令时定义宏

\xpatchcmd 在应用于未定义的命令时定义宏

我偶然发现了这个功能(它是一个更大的问题的一部分,但我把它分成两个问题):

假设我们想要使用\xpatchcmd(from xpatch)或\patchcmd(from etoolbox)并将这些命令(例如,意外地)应用于未定义的命令序列,那么这种修补当然会失败。

但是,以下代码运行并产生结果,而\someundefinedmacrofor可以工作,但不会将其返回为(它仍然未定义)\relax\patchcmd\someotherundefinedmacro\relax

我必须承认,在尝试修补之前应该检查这一点。或者使用\GenericError修补宏的失败分支中的一些宏。

以下是简短的 MWE

\documentclass{article}

\usepackage{xpatch}

% Patching an undefined macro... must fail as patching operation, of course (there's nothing to patch ;-))
\xpatchcmd{\someundefinedmacro}{Ministry of Silly Walks}{Mr. Gumby}{\typeout{Well, this is strange}}{\typeout{Nobody expects the Spanish Inquisition}}

%This does 'nothing'  
\patchcmd{\someotherundefinedmacro}{Ministry of Silly Walks}{Mr. Gumby}{\typeout{Well, this is strange}}{\typeout{Nobody expects the Spanish Inquisition}}


%\show\someundefinedmacro  -> relax
\begin{document}
\someundefinedmacro%  Does nothing, since it's \relax'ed

 % It will fail here (since `\someotherundefinedmacro` is really undefined
\someotherundefinedmacro%  
\end{document}

答案1

是的,作为处理的一部分,检查的宏仍然定义为\relax;所以如果

\xpatchcmd{\foo}{<search>}{<replace>}{<true>}{<false>}

尝试,,\foo\foo•项目符号表示空格),\\foo并且\\foo•如果它们不是从一开始就定义的,则保持放松状态。

这是错误的,将在下一版本中修复xpatch

\foo但是,宏将保持定义,就像尝试\relax修补未定义的宏一样:为了避免这种情况,需要更改太多软件包。将在文档中添加警告。

然而,修补宏之前通常应该检查宏是否存在并且可以修补。

相关内容