
Me topé con esta característica (es parte de una pregunta más grande, pero la dividí en dos preguntas):
Digamos que queremos usar \xpatchcmd
(from xpatch
) o \patchcmd
(from etoolbox
) y aplicar esos comandos (accidentalmente, por ejemplo) en una secuencia de comandos indefinida, este parche debe fallar, por supuesto.
Sin embargo, el siguiente código se ejecuta y produce \someundefinedmacro
como \relax
, mientras que \patchcmd
for \someotherundefinedmacro
funciona, pero no lo devuelve como \relax
(aún no está definido)
Debo admitir que uno debería comprobar esto antes de intentar parchear. O usar algunos \GenericError
en la rama fallida de las macros de parcheo.
Aquí un breve 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}
Respuesta1
Sí, como parte del procesamiento, las macros marcadas quedaron definidas como \relax
; Así que si
\xpatchcmd{\foo}{<search>}{<replace>}{<true>}{<false>}
se intenta, \foo
( \foo•
la viñeta es para un espacio) \\foo
y \\foo•
permanecen definidos como relajados si no lo fueran desde el principio.
Esto es incorrecto y se solucionará en la próxima versión de xpatch
.
La \foo
macro, sin embargo, permanecerá definida como \relax
si se intentara aplicar un parche a una macro no definida: sería necesario cambiar demasiado del paquete para evitar esto. Se agregará una advertencia en la documentación.
Sin embargo, la aplicación de parches a una macro generalmente debe ir precedida de una comprobación de que la macro existe y se puede parchear.