当我使用不带参数的 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
将被忽略,作为命令名后面的空格,参见上文。