
Ich bin über diese Funktion gestolpert (sie ist Teil einer größeren Frage, aber ich habe sie in zwei Fragen aufgeteilt):
\xpatchcmd
Angenommen, wir möchten (von xpatch
) oder \patchcmd
(von ) verwenden etoolbox
und 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 \someundefinedmacro
als \relax
, während als \patchcmd
für \someotherundefinedmacro
funktioniert, 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 \GenericError
im 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) \\foo
und \\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 \foo
Makro bleibt jedoch definiert, als \relax
ob 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.