带星号的命令是否会像无星号的命令一样占用后面的空格?也就是说,这\somecommand* nextword
相当于\somecommand*nextword
?
并且:这是否取决于带星号的命令的特定定义方式?
编辑:请注意,我问题的原始版本没有考虑仅零参数命令。我假设了这一点,从问题陈述中可以看出这一点(尽管是隐含的)。用户 @tohecz 写了一个有价值的答案(针对编辑前的版本),解决了这个细节。
请注意,我询问的是名称末尾带有星号的命令(\somecommand*
),不是关于该命令是否是使用带星号的定义命令(例如\newcommand*
)定义的。
答案1
不,他们没有:
\documentclass{article}
\usepackage{suffix,xparse}% http://ctan.org/pkg/{suffix,xparse}
\makeatletter
\newcommand{\mycmdA}{\@ifstar
\mycmdA@star% \mycmd*
\mycmdA@nostar% \mycmd
}
\newcommand{\mycmdA@star}{A1}
\newcommand{\mycmdA@nostar}{A2}
\NewDocumentCommand{\mycmdB}{s}{%
B\IfBooleanTF{#1}{1}{2}}
\newcommand{\mycmdC}{C1}
\WithSuffix\newcommand\mycmdC*{C2}
\makeatother
\begin{document}
Here is \mycmdA and \mycmdA* in one line. \par
Here is \mycmdB and \mycmdB* in one line. \par
Here is \mycmdC and \mycmdC* in one line.
\end{document}
答案2
正如其他答案所示,它们不是。但是,如果宏在之后接受其他参数,则空格会被“吃掉” *
:
\documentclass{article}
\pagestyle{empty}
\begin{document}
\section {Hello}
\section* {World!}
\end{document}
一般来说,TeX 在寻找参数时会忽略所有空格(除非不是,即参数被分隔时(如可选参数):
\newcommand{\foo}[1][A]{(#1)}
\foo [abc] % prints: (abc)
\foo[abc] % prints: (abc)
\foo [ abc] % prints: ( abc)
\foo[ abc] % prints: ( abc)
\def\baz|#1|{(#1)}
\baz |abc| % prints: (abc)
\baz|abc| % prints: (abc)
\baz | abc| % prints: ( abc)
\baz| abc| % prints: ( abc)
答案3
正如其他答案所表明的那样,从技术上讲,空格删除是命令名称扫描的一部分,而在原始 TeX 级别,它*
不是名称的一部分。
然而在 LaTeX 语法中,星号形式始终被视为一个不同的命令\section
,并被\section*
记录为两个相关的命令,而不是一个提前查看是否存在的命令*
。
因此,使星号形式具有与非星号形式类似的行为是一种很好的做法。
据我所知,在基本 LaTeX 格式的所有情况下,*-命令总是与参数一起使用(如\section*
),因此任何空格都会在不同阶段被跳过,或者出现在空格字符会形成空格标记但不会在输出中产生空格的地方\\*
, \ProcessOptions*
。
因此,我认为任何标准 LaTeX * 形式的命令都不会在 之后的空格字符中产生空格*
。
答案4
只有控制字会占用其后的空格!控制字是以转义符开头\
并后跟一个或多个字母的宏。