\xpatchcmd definiert Makros, wenn sie auf undefinierte Befehle angewendet werden

\xpatchcmd definiert Makros, wenn sie auf undefinierte Befehle angewendet werden

Ich bin über diese Funktion gestolpert (sie ist Teil einer größeren Frage, aber ich habe sie in zwei Fragen aufgeteilt):

\xpatchcmdAngenommen, wir möchten (von xpatch) oder \patchcmd(von ) verwenden etoolboxund wenden diese Befehle (beispielsweise versehentlich) auf eine undefinierte Befehlssequenz an. In diesem Fall muss dieses Patchen natürlich fehlschlagen.

Der folgende Code wird jedoch ausgeführt und ergibt \someundefinedmacroals \relax, während als \patchcmdfür \someotherundefinedmacrofunktioniert, es aber nicht als zurückgibt \relax(es ist immer noch undefiniert).

Ich muss zugeben, dass man dies überprüfen sollte, bevor man versucht, einen Patch auszuführen. Oder indem man einige \GenericErrorim Fail-Zweig der Patch-Makros verwendet.

Hier ein kurzes 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}

Antwort1

Ja, im Rahmen der Verarbeitung blieben die markierten Makros als definiert \relax; wenn also

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

versucht wird, \foo, \foo•(der Aufzählungspunkt steht für ein Leerzeichen) \\foound \\foo•bleiben als „Entspannen“ definiert, wenn dies nicht von Anfang an der Fall war.

Dies ist falsch und wird in der nächsten Version von behoben xpatch.

Das \fooMakro bleibt jedoch definiert, als \relaxob ein Patch für ein nicht definiertes Makro versucht wird: Um dies zu vermeiden, müsste zu viel am Paket geändert werden. In der Dokumentation wird eine Warnung hinzugefügt.

Allerdings sollte dem Patchen eines Makros grundsätzlich eine Prüfung vorausgehen, ob das Makro existiert und patchbar ist.

verwandte Informationen