
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 \someundefinedmacro
as \relax
, onde for \patchcmd
funciona \someotherundefinedmacro
, mas não o retorna como \relax
(ainda está indefinido)
Devo admitir que devemos verificar isso antes de tentar corrigir. Ou usando alguns \GenericError
no 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) \\foo
e \\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 \foo
macro, no entanto, permanecerá definida como \relax
se 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.