\xpatchcmd определяет макросы при применении к неопределенным командам

\xpatchcmd определяет макросы при применении к неопределенным командам

Я наткнулся на эту функцию (это часть более крупного вопроса, но я разделил его на два вопроса):

Допустим, мы хотим использовать \xpatchcmd(из xpatch) или \patchcmd(из etoolbox) и применить эти команды (например, случайно) к неопределенной последовательности команд. Конечно, такое исправление должно завершиться ошибкой.

Однако следующий код выполняется и возвращает результат \someundefinedmacroкак \relax, тогда как \patchcmdfor \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если бы была предпринята попытка исправления неопределенного макроса: чтобы избежать этого, пришлось бы изменить слишком много пакета. Предупреждение будет добавлено в документацию.

Однако исправлению макроса обычно должна предшествовать проверка того, что макрос существует и подлежит исправлению.

Связанный контент