后缀包,无法重新定义带后缀的宏

后缀包,无法重新定义带后缀的宏

我有两个本地包AB。包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}

相关内容