我有两个本地包A
和B
。包B
偶尔用于覆盖包中定义的宏A
。
包A
定义了一个宏,并且使用该suffix
包还定义了该宏的星号版本。
软件包B
覆盖了 中的两个宏(未加星号的和加星号的)A
。未加星号的宏的重新定义有效,但加星号版本的重新定义将被忽略; 被*
视为文本。
以下是一个例子:
\documentclass{article}
\usepackage{suffix}
\newcommand{\mymacro}[1]{Plain Hello #1}
\WithSuffix\newcommand\mymacro*[1]{Starred Hello #1}
\begin{document}
\mymacro{world}
\mymacro*{world}
\rule{\textwidth}{1pt}
\renewcommand{\mymacro}[1]{Plain New Hello #1}
\WithSuffix\renewcommand\mymacro*[1]{Starred New Hello #1}
\mymacro{world}
\mymacro*{world}
\end{document}
代码结果如下。最后一次调用\mymacro*{world}
看到的*
是文本,而不是重新定义的宏。我该如何重新定义带星号的版本?
答案1
快速浏览表明,在第一个定义中,记录了已被修改为带有后缀\WithSuffix
的事实。因此,当您执行第二个时,它不会尝试更改。但是,由于您已重新定义,因此必要的内部代码已被删除,因此事情将无法正常工作。\mymacro
\WithSuffix
\mymacro
\mymacro
suffix
我认为唯一明智的方法是改变用于存储的宏\mymacro
:
\documentclass{article}
\usepackage{suffix}
\newcommand{\mymacro}[1]{Plain Hello #1}
\WithSuffix\newcommand\mymacro*[1]{Starred Hello #1}
\begin{document}
\mymacro{world}
\mymacro*{world}
\rule{\textwidth}{1pt}
\expandafter\renewcommand\expandafter
{\csname\NoSuffixName\mymacro\endcsname}[1]{Plain New Hello #1}
\WithSuffix\renewcommand\mymacro*[1]{Starred New Hello #1}
\mymacro{world}
\mymacro*{world}
\end{document}