
Dies ist die Folgefrage bzw. der Hauptgrund, der zu der (noch) unbeantworteten Frage hier geführt hat:\xpatchcmd definiert Makros, wenn sie auf undefinierte Befehle angewendet werden
Ich habe versucht, einen Befehl zu patchen, sagen wir \someothercommand
, der lokal innerhalb eines anderen Makros definiert ist, sagen wir \somecommand
, außerhalb des späteren Makros, z. B. in einer Präambel.
Dies schlägt jedoch fehl. Das Patchen springt zumFALSCHZweig. Ich vermute, das hängt irgendwie mit der lokalen Gruppierung zusammen.
Dies kann beispielsweise dann auftreten, wenn Makrodefinitionen gepatcht werden sollen, die in anderen Makros enthalten sind, beispielsweise in einer Klassen- oder Paketdatei.
Betrachten wir den Fall, wo einigeschlechtCode sollte geändert werden, ohne das gesamte äußere Makro zu kopieren oder die Datei .cls
zu bearbeiten.sty
Ist das Patchen solcher lokal definierter Makros überhaupt möglich?
Ich habe das MWE vereinfacht
\documentclass{article}
\usepackage{xcolor}
\usepackage{xpatch}
\newcommand{\somecommand}[1]{%
\newcommand{\someothercommand}[1]{\textcolor{blue}{##1}}%
% This works
% \xpatchcmd{\someothercommand}{blue}{red}{\typeout{Success!}}{\typeout{Nobody expects the Spanish Inquisition!!!!}}
Inside usage: \someothercommand{#1}%
}
% Patching fails
\xpatchcmd{\someothercommand}{blue}{red}{\typeout{Success!}}{\typeout{Nobody expects the Spanish Inquisition!!!!}}
\begin{document}
\somecommand{Outer command}
Outside usage: \someothercommand{Inside} but should be \textcolor{red}{Inside}
\end{document}
Antwort1
Ich würde nach einer geeigneten Stelle suchen, \somecommand
um einen Haken zu platzieren:
\documentclass{article}
\usepackage{xcolor}
\usepackage{xpatch}
\newcommand{\somecommand}[1]{%
\def\someothercommand##1{\textcolor{blue}{##1}}%
Inside usage: \someothercommand{#1}%
}
\xpatchcmd{\somecommand}{Inside usage:}{Inside usage: \myspecialsetup}{\typeout{Success!}}{\typeout{Nobody expects the Spanish Inquisition!!!!}}
\newcommand\myspecialsetup{\renewcommand\someothercommand[1]{\textcolor{red}{##1}}}
\begin{document}
\somecommand{Outer command}
\end{document}
Antwort2
Sie können nur Befehle patchen, die definiert wurden, also \somecommand
hier:
\documentclass{article}
\usepackage{xcolor}
\usepackage{xpatch}
\newcommand{\somecommand}[1]{%
\newcommand{\someothercommand}[1]{\textcolor{blue}{##1}}%
% This works
% \xpatchcmd{\someothercommand}{blue}{red}{\typeout{Success!}}{\typeout{Nobody expects the Spanish Inquisition!!!!}}
Inside usage: \someothercommand{#1}%
}
% Patching works
\xpatchcmd{\somecommand}{blue}{red}{\typeout{Success!}}{\typeout{Nobody expects the Spanish Inquisition!!!!}}
\begin{document}
\somecommand{Outer command}
Outside usage: \someothercommand{Inside} but should be \textcolor{red}{Inside}
\end{document}