Patchen lokaler Befehle, die in anderen Makros definiert sind

Patchen lokaler Befehle, die in anderen Makros definiert sind

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 .clszu 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}

Bildbeschreibung hier eingeben

Antwort1

Ich würde nach einer geeigneten Stelle suchen, \somecommandum 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 \somecommandhier:

\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}

verwandte Informationen