\xpatchcmd は未定義のコマンドに適用された場合にマクロを定義します

\xpatchcmd は未定義のコマンドに適用された場合にマクロを定義します

私はこの機能に偶然出会いました (これは大きな質問の一部ですが、2 つの質問に分割しました)。

\xpatchcmdたとえば、 (from xpatch) または\patchcmd(from )を使用してetoolbox、それらのコマンドを (たとえば誤って) 未定義のコマンド シーケンスに適用すると、このパッチ適用は当然失敗します。

しかし、次のコードを実行すると が返されます\someundefinedmacro\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。これを回避するには、パッケージの大部分を変更する必要があります。ドキュメントに警告が追加されます。

ただし、マクロにパッチを適用する前に、通常、マクロが存在し、パッチ適用可能であることを確認する必要があります。

関連情報