\xpatchcmd define macros quando aplicado a comandos indefinidos

\xpatchcmd define macros quando aplicado a comandos indefinidos

Me deparei com esse recurso (é parte de uma questão maior, mas dividi-o em duas questões):

Digamos que queremos usar \xpatchcmd(from xpatch) ou \patchcmd(from etoolbox) e aplicar esses comandos (acidentalmente, por exemplo) em uma sequência de comandos indefinida, esse patch deve falhar, é claro.

No entanto, o código a seguir é executado e produz \someundefinedmacroas \relax, onde for \patchcmdfunciona \someotherundefinedmacro, mas não o retorna como \relax(ainda está indefinido)

Devo admitir que devemos verificar isso antes de tentar corrigir. Ou usando alguns \GenericErrorno branch fail das macros de patch.

Aqui um 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}

Responder1

Sim, como parte do processamento, as macros verificadas permaneceram definidas como \relax; então se

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

é tentado, \foo, \foo•(o marcador é para um espaço) \\fooe \\foo•permanecem definidos como relax se não fossem para começar.

Isso está errado e será corrigido na próxima versão do xpatch.

A \foomacro, no entanto, permanecerá definida como \relaxse fosse tentada uma correção para uma macro indefinida: muito do pacote precisaria ser alterado para evitar isso. Um aviso será adicionado na documentação.

No entanto, a correção de uma macro geralmente deve ser precedida por uma verificação de que a macro existe e pode ser corrigida.

informação relacionada