有什么理由反对在重新定义时改变命令的星号吗?

有什么理由反对在重新定义时改变命令的星号吗?

如果使用了命令的原始定义\newcommand,我是否有义务用\renewcommand而不是来重新定义它\renewcommand*

如果使用了命令的原始定义\newcommand*,我是否有义务用\renewcommand*而不是来重新定义它\renewcommand

请注意我不是询问用 替换命令\somecommand\somecommand*反之亦然(这很棘手,也相当于添加一个技术上名称不同的命令)。我反而想问的是,命令重新定义所\somecommand导致的语义细微变化是否是 LaTeX 的语法(或其他类型)问题。*

答案1

在问题概述的情况下,‘短’的宏被重新定义为‘长’:

\newcommand*{\foo}...

 ...

\renewcommand{\foo}... % Now 'long'

如果我们假设 的基本含义\foo没有改变,那么任何对原始版本有效的输入对新版本仍然有效。旧版本\foo不接受\par,因此在语义没有变化的情况下,新版本\foo不应该获得任何\par标记,而且它现在很长这一事实不会产生任何影响。当然,这确实意味着我们不能依赖 TeX 发现缺失}或其他问题。

反过来改变:

\newcommand{\foo}...

 ...

\renewcommand*{\foo}... % Not 'long' any more

\foo如果可以在逻辑上在参数中采用\par标记,当然可能会导致问题。

这里要注意的一点是,即使定义相同,长宏和短宏也不是“等价的”,即使没有参数。因此

\newcommand{\fooa}{Some stuff}
\newcommand*{\foob}{Some stuff}
\ifx\fooa\foob
  TRUE
\else
  FALSE
\fi

给出FALSE。因此,如果任何其他代码想要测试的定义\foo,而您已将其从“短”更改为“长”,则测试将失败,而实际代码没有任何变化。仅仅因为这个原因,我倾向于保持我重新定义的任何宏的“长”状态。

相关内容