是否有理由使用带星号的定义命令来定义零参数宏?

是否有理由使用带星号的定义命令来定义零参数宏?

是否有理由使用带星号的命令(\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}

加星标的版本重要吗?:-)

相关内容