
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 .cls
o.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}
Respuesta1
Yo buscaría un lugar adecuado \somecommand
para 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 \somecommand
aquí:
\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}