宏的星号版本中的是什么*
意思?我知道\section
和\section*
控制*
编号,\newcommand
和\newcommand*
决定*
宏是否很长。我不明白的是,如果我创建一个有星号版本和无星号版本的宏,哪个版本应该是星号版本。
我正在创建一个可以有编号或无编号列表的环境,我想用 来控制数字的存在/不存在*
。我的一部分意见是,无编号应该是带星号的情况,以与 之类的情况保持一致\section
。问题是,无编号的情况可能更常用,因此也许应该是无星号的情况。再说一次,\newcommand 和 \newcommand* 之间有什么区别?建议带星号的版本应该适用于典型用例。
关于如何选择哪个版本的宏应作为加星号的条件,有什么指导原则吗?
答案1
据我所知,没有这样的指导方针。作为宏的作者(和用户),您可以决定如何使用带星号的版本。但为了保持一致性,如果宏对编号做了一些处理(如您的示例所示),我会使用星号作为未编号的标记。
否则,我宁愿使用无星号版本作为默认版本(经常使用)并使用星号版本作为特殊版本。
链接的答案关于\newcommand*
这意味着在定义宏时\newcommand*
最好不要这样做\newcommand
,因为参数可能不长。在我看来,它没有说明如何在自己的宏中使用星号。
要定义带星号的宏,可以使用 LaTeX 方式\@ifstar
或xparse package
,我更喜欢这个,因为您不需要辅助宏:
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand\foo{ s m }{% s = star, m = mandatory arg
\IfBooleanTF{#1}{%
Argument: #2 (starred)%
}{%
Argument: #2 (non-starred)%
}%
}
\begin{document}
\foo{Test}
\foo*{Test}
\end{document}
答案2
一般规则是\command
代表默认行动和\command*
立场选择动作。确定哪种行为是什么,并据此定义命令。如果您无法将任何一种行为归类为替代行为,那么最好将两个不同的命令放在一起。
这个\newcommand
案例有些特殊。确实,带星号的版本是更好的编程实践。我认为\newcommand
这样定义的理由如下:将带星号的版本设为默认版本可能会让不了解以下内容的新手用户感到沮丧\long
:
我定义了一个简单的命令,但它不适用于以下参数
{a b}
,我不明白为什么!
或者也可能是出于历史原因(一开始就做出的特定决定,之后无法更改)。