Parchear comandos locales definidos dentro de otras macros

Parchear comandos locales definidos dentro de otras macros

Esta es la pregunta de seguimiento, respectivamente, la causa principal que llevó a la pregunta (aún) sin respuesta aquí:\xpatchcmd define macros cuando se aplica a comandos no definidos

Intenté parchear algún comando, digamos \someothercommand, que está definido localmente dentro de otra macro, digamos \somecommand, fuera de la macro posterior, por ejemplo, en un preámbulo.

Sin embargo, esto falla. El parche salta alFALSOrama. Sospecho que esto está de alguna manera relacionado con la agrupación local.

Una situación en la que esto podría ocurrir es cuando uno quiere parchear definiciones de macros que se esconden dentro de otras macros, por ejemplo, en un archivo de clase o paquete.

Consideremos el caso en el que algunosmaloEl código debe cambiarse sin copiar toda la macro externa o editar el archivo .clso.sty

¿Es posible parchear dichas macros definidas localmente?

Simplifiqué el MWE

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

ingrese la descripción de la imagen aquí

Respuesta1

Yo buscaría un lugar adecuado \somecommandpara colocar un gancho:

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

Respuesta2

Sólo puedes parchear comandos que hayan sido definidos, así que \somecommandaquí:

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

información relacionada