\xpatchcmd define macros cuando se aplica a comandos no definidos

\xpatchcmd define macros cuando se aplica a comandos no definidos

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 \someundefinedmacrocomo \relax, mientras que \patchcmdfor \someotherundefinedmacrofunciona, 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 \GenericErroren 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) \\fooy \\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 \foomacro, sin embargo, permanecerá definida como \relaxsi 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.

información relacionada