是否有理由使用带星号的命令(\newcommand*
而不是\newcommand
或\DeclareRobustCommand*
而不是\DeclareRobustCommand
)来定义 0 参数(读作:零参数)宏?毕竟,如果没有参数,就没有什么可验证的。
使用星号版本的一个原因可能是希望自己的 LaTeX 代码看起来一致。反对使用星号版本的一个原因可能是速度较慢,但我不知道是否如此。
\somemacro
(这与选择谁来定义星号无关\somemacro*
(顺便说一句,后者如何定义并不明显,尽管绝对是可能的)。这是关于是否\somemacro
应该执行的定义使用带星号或不带星号定义命令。
答案1
保持一致,仅此而已。在许多情况下,无参数宏被用作“容器”;假设您有这样一个容器,它存储了您想要与输入进行比较的某个特定字符串:
\newcommand{\fixed}{foobar}
然后你有一个复杂的宏,它接受一个你想与之比较的参数\fixed
:
\newcommand{\complicated}[1]{%
...
\def\test{#1}%
\ifx\test\fixed
%% the user called \complicated{foobar}
<do something>
\else
<do something else>
\fi
...
}
\ifx
即使调用 ,比较也会返回“false” 。\complicated{foobar}
为什么?因为\fixed
是\long
,而\test
不是 (这实际上是使用 LaTeX 内核中的宏对字体属性进行某些测试时出现的问题)。如何解决这个问题?使用\long\def\test
或说
\newcommand{\test}{} % initialization (this line is necessary)
就在 的定义之后\newcommand{\fixed}{foobar}
并使用。\renewcommand{\test}{#1}
\complicated
\newcommand{\foo}{bar}
如果您不以这种方式使用无参数宏,则和之间没有实际区别\newcommand*{\foo}{bar}
:前者只会占用一点点内存,因为 TeX 必须存储标志\long
。
答案2
我们可以像下面这样欺骗编译器,
\documentclass{article}
\usepackage{lipsum}
\newcommand*\accept[1]{#1}
\begin{document}
\accept{\lipsum[1-3]}
\end{document}
加星标的版本重要吗?:-)