在包中,我想通过添加可选参数来自定义现有宏,以控制图像的大小。但是,我不知道如何修补命令以添加参数。理想情况下,我希望在末尾添加参数(否则我需要修补所有函数以将 更改为#1
)#2
,我特别喜欢这种NewDocumentCommand
工作方式...
那么,有可能修补\newcommand*\hello[1]{...}
吗\NewDocumentCommand{\hello}{mo}{...}
?
\documentclass{article}
\newcommand*\hello[1]{%
Hello #1.
}
% Goal: patch into:
% \NewDocumentCommand{\hello}{mo}{%
% Hello #1\IfNoValueTF{#2}{}{ and #2}.
% }
\begin{document}
\hello{Bob}
% I want this to work as well:
% \hello{Bob}[Alice]
\end{document}
编辑
我尝试将 egreg 的答案应用到这个更实际的例子上如何重新定义alertmessage包的命令?然而\NewCommandCopy\originalalertmessage@panel\alertmessage@panel
给出了一个错误Missing \begin{document}.
:
\documentclass{article}
\usepackage{regexpatch}
\usepackage{graphicx}
\usepackage{alertmessage}
% let's patch
\NewCommandCopy\originalalertmessage@panel\alertmessage@panel
\xpatchparametertext\originalalertmessage@panel{\#1\#2\#3}{\cP\#1\cP\#2\cP\#3\cP\#4}{}{}
\xpatchcmd{\originalalertmessage@panel}{\includegraphics[scale=0.5]}{\includegraphics[scale=0.5,#4]}{}{}
\RenewDocumentCommand{\alertmessage@panel}{mmmO{}}{%
\originalalertmessage@panel{#1}{#2}{#3}{#4}%
}
\renewcommand*\alertsuccess[1]{%
\alertmessage@panelcustom{green}{example-image-a}{#1}[width=6mm]%
}%
\begin{document}
\alertinfo{hello}
\alertwarning{hello}
\alertsuccess{hello}
\alerterror{hello}
\end{document}
答案1
您可以使用regexpatch
允许修改参数数量的方法来做到这一点\hello
。
但我不认为这是一个好方法。
\documentclass{article}
\usepackage{regexpatch}
\newcommand*\hello[1]{%
Hello #1.
}
% let's patch
\NewCommandCopy\originalhello\hello
\xpatchparametertext\originalhello{\#1}{\cP\#1\cP\#2}{}{}
\xpatchcmd{\originalhello}{.}{\IfValueT{#2}{ and #2}.}{}{}
\RenewDocumentCommand{\hello}{mo}{%
\originalhello{#1}{#2}%
}
\begin{document}
\hello{Bob}
\hello{Bob}[Alice]
\end{document}
注意。\cP
对于最新的 LaTeX 来说并不是必需的,但是为了更安全我把它留在那里。