如果使用了命令的原始定义\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
,而您已将其从“短”更改为“长”,则测试将失败,而实际代码没有任何变化。仅仅因为这个原因,我倾向于保持我重新定义的任何宏的“长”状态。