所有带星号的命令都有什么共同点吗?

所有带星号的命令都有什么共同点吗?

\section*生成未编号的部分,align* 使环境变得无可计数,从某种程度上来说,是可以比较的。\newcommand* \par在其论证中不接受,这是不同的。

史蒂芬·柯特维茨写道

通常,星号*表示命令的某个版本与原始版本的行为不同。这通常意味着取消编号,但也可能指特殊功能。

这也许可以回答我的问题,但也许还有更多要说的(并且最好将其作为一个单独的问题)。

所有带星号的命令有什么共同点吗?为什么要定义一个带星号的命令而不是另一个名称不同的命令,以表明它们名称中的语义差异?它们的定义似乎通常完全彼此独立。

进一步阅读:

答案1

为什么我们要给命令命名?最好尽可能清楚地表明它们的作用。

如果有两个东西的功能非常相似,那么给它们起非常相似的名字是有意义的。另一方面,如果它们的功能截然不同,那么尽管这两个名字相似,你还是希望能够轻松区分这两个名字。由于星号是非字母字符,而且相当密集,因此它很显眼。因此,修改一个命令的名称以获得相似但容易区分的命令名称是一种合理的方法。

但事实并非如此,所有带星号的变体都没有任何共同之处。 命令\section*amsthm命令\newtheorem*amsmath环境align*是其无星号表亲的无编号变体。但是:

  • \newcommand*创建一个宏将不会接受其任何参数中的回车符。
  • \vspace*添加垂直空间将不会被抑制在页面的开始或结束处。
  • \\*创建新行将不会导致分页符。
  • \tag*(在 中amsmath)允许您为公式添加视觉标签、注释或其他数字替换,没有通常的括号。

这里有一点否定的主题,但不清楚这些否定是否有任何共同之处(除了“默认”行为之外)。

答案2

嗯,\section*比 更容易编写\sectionnotnumbered。请注意,实际上并没有定义两个宏,\section只是检查是否有星号跟随并相应地分支。(但是,星号环境的定义独立于普通版本。)它们的行为可以几乎相同或完全不同,具体取决于它们的编码方式。没有关于此的官方逻辑指南,并且该宏的文档必须解释不同之处。

我认为使用星号版本的好处是,您仍然拥有相同的宏名称,但可以创建通常略有不同的行为。例如,在我的adjustbox包中,我有\clipbox\clipbox*,它们都修剪,但第一个采用要剪辑的数量,另一个采用视口。\clipviewport当然我也可以这样做。

答案3

一般来说,答案是“否”。带星号的版本在某种程度上与无星号的版本不同,但由于涵盖的思想范围很广,因此没有更大的逻辑。例如,\newcommand是关于定义命令的,而是\section一个逻辑标记命令。因此,对于“改变”而言有意义的东西\newcommand对于“改变”而言却没有意义\section。当然,在某些包或区域内可能存在逻辑:例如,参见\renewcommand*\providecommand*与有关。\newcommand*

答案4

大多数提供星号版本的命令在*内部根据其语义含义定义为两个命令(尽管这不是必需的)。例如,\section考虑\section*article.cls- 事实上,这些宏的正式定义包含在latex.ltx。选择带星号或不带星号的版本取决于以下条件:

\@ifstar
  {\@ssect{#3}{#4}{#5}{#6}}%
  {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}

这样,要么执行\@ssect,要么\@sect执行。

从个人角度来看,这种调节可以通过以下方式以编程方式实现:xparse包裹 \...DocumentCommand{s ..}宏和使用\IfBooleanTF。此处的参数说明符s允许方便地判断宏是否带有/不带有*

也许,作为基于带星号/无星号版本的多个宏定义的一个复杂示例\sectionVincent Zoonekynd 的 LaTeX 页面关于部分内容就是这个的缩影。

相关内容