
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 .cls
ou.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}
Responder1
Eu procuraria um local adequado \somecommand
para 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 \somecommand
aqui:
\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}