Patch de comandos locais definidos em outras macros

Patch de comandos locais definidos em outras macros

Esta é a pergunta de acompanhamento, respectivamente a causa principal que levou à pergunta (ainda) sem resposta aqui:\xpatchcmd define macros quando aplicado a comandos indefinidos

Tentei corrigir algum comando, digamos, \someothercommand, que é definido localmente dentro de outra macro, digamos, \somecommand, fora da macro posterior, por exemplo, em um preâmbulo.

No entanto, isso falha. O patch salta para ofalsofilial. Eu suspeito que isso esteja de alguma forma conectado ao agrupamento local.

Uma situação em que isso pode ocorrer é quando se deseja corrigir definições de macro que se escondem dentro de outras macros, digamos, em uma classe ou arquivo de pacote.

Considere o caso em que algunsruimo código deve ser alterado sem copiar toda a macro externa ou editar o arquivo .clsou.sty

É possível corrigir essas macros definidas localmente?

Simplifiquei o 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}

insira a descrição da imagem aqui

Responder1

Eu procuraria um local adequado \somecommandpara colocar um 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}

Responder2

Você só pode corrigir comandos que foram definidos, então \somecommandaqui:

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

informação relacionada