通过添加新的(可选)参数来修补命令(并将“newcommand”变成“NewDocumentCommand”)

通过添加新的(可选)参数来修补命令(并将“newcommand”变成“NewDocumentCommand”)

在包中,我想通过添加可选参数来自定义现有宏,以控制图像的大小。但是,我不知道如何修补命令以添加参数。理想情况下,我希望在末尾添加参数(否则我需要修补所有函数以将 更改为#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 来说并不是必需的,但是为了更安全我把它留在那里。

相关内容