我偶然发现了这个功能(它是一个更大的问题的一部分,但我把它分成两个问题):
假设我们想要使用\xpatchcmd
(from xpatch
)或\patchcmd
(from etoolbox
)并将这些命令(例如,意外地)应用于未定义的命令序列,那么这种修补当然会失败。
但是,以下代码运行并产生结果,而\someundefinedmacro
for可以工作,但不会将其返回为(它仍然未定义)\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
修补未定义的宏一样:为了避免这种情况,需要更改太多软件包。将在文档中添加警告。
然而,修补宏之前通常应该检查宏是否存在并且可以修补。