
Я наткнулся на эту функцию (это часть более крупного вопроса, но я разделил его на два вопроса):
Допустим, мы хотим использовать \xpatchcmd
(из xpatch
) или \patchcmd
(из etoolbox
) и применить эти команды (например, случайно) к неопределенной последовательности команд. Конечно, такое исправление должно завершиться ошибкой.
Однако следующий код выполняется и возвращает результат \someundefinedmacro
как \relax
, тогда как \patchcmd
for \someotherundefinedmacro
работает, но не возвращает результат как \relax
(он все еще не определен)
Должен признать, что это следует проверить, прежде чем пытаться патчить. Или использовать что-то \GenericError
в ветви fail макросов патчинга.
Вот краткий 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}
решение1
Да, в ходе обработки проверенные макросы остались определенными как \relax
; поэтому если
\xpatchcmd{\foo}{<search>}{<replace>}{<true>}{<false>}
предпринята попытка, \foo
( \foo•
точка — пробел), \\foo
и \\foo•
остаются определенными как расслабленные, если бы они не были изначально.
Это неправильно и будет исправлено в следующей версии xpatch
.
Однако макрос \foo
останется определенным, как \relax
если бы была предпринята попытка исправления неопределенного макроса: чтобы избежать этого, пришлось бы изменить слишком много пакета. Предупреждение будет добавлено в документацию.
Однако исправлению макроса обычно должна предшествовать проверка того, что макрос существует и подлежит исправлению.