带有参数的 newcommand 的行为与不带参数的 newcommand 的行为不同

带有参数的 newcommand 的行为与不带参数的 newcommand 的行为不同

当我使用不带参数的 newcommand 时,我得到了预期的行为。当我向命令添加参数时,latex 会添加一个额外的空格。以下是示例:

\documentclass{minimal}
\parindent=0 pt
\parskip=12 pt
\newcommand{\mySpace}[1]{\par \vspace{#1pt} \noindent}
\begin{document}
Hullo world. 
\mySpace{1}
Hullo world. 

\renewcommand{\mySpace}{\par \vspace{1pt} \noindent}
Hullo world
\mySpace
Hullo world
\end{document}

此代码返回以下内容:

Hullo world
 Hullo world
Hullo world
Hullo world

即,第二行开头有一个意外的空格。这是预期的行为吗?如果是这样,我很好奇为什么?我如何使用参数恢复预期的行为?

谢谢您的任何建议!

答案1

带参数的定义可以\ignorespaces在定义文本的末尾使用,以防止在水平模式下以下空格起作用\noindent

\documentclass{minimal}
\setlength{\parindent}{0 pt}
\setlength{\parskip}{12 pt}
\newcommand*{\mySpace}[1]{\par \vspace{#1pt} \noindent\ignorespaces}
\begin{document}
Hullo world. 
\mySpace{1}
Hullo world. 

\renewcommand{\mySpace}{\par \vspace{1pt} \noindent}
Hullo world
\mySpace
Hullo world
\end{document}

结果

有论点的案件

原始定义:

\newcommand{\mySpace}[1]{\par \vspace{#1pt} \noindent}

\par结束段落,当前模式为垂直模式,其中空格被忽略。后面的空格\par已被忽略,因为它结束了命令标记。有两种命令标记,以反斜杠开头:

  • 长格式,其中名称由字母(一个或多个)组成(\par\a\vspace,...)。

  • 缩写形式,其中名称由一个非字母字符组成(\,\:,...)。

在第一种情况下,后面的空格会被忽略,而在后一种情况下则不会,因为 TeX 已经知道名称不能包含更多字符。

后面的空格\vspace{#1pt}变成了空格标记,但它会被忽略,因为 TeX 仍处于垂直模式。模式现在由 改变\noindent。因此后面的空格\mySpace{1pt}很重要,可以在输出中看到。

\noindent当后面跟着时,该空格将被忽略\ignorespaces

顺便说一句:#1应为数字,而不是整个段落,则参数可以设为非\long,这意味着如果 TeX 在扫描参数时发现空行或标记,它会发出警告。如果使用 的星号形式,则\par命令的参数将设为非。\long\newcommand

无辩论案件

后面的空格\mySpace将被忽略,作为命令名后面的空格,参见上文。

相关内容