可选宏参数后的空格

可选宏参数后的空格

å我知道 LaTeX 会吞噬宏名称后的空格,因此宏名称和b之间没有空格

\documentclass{article}
\begin{document}

\aa b

\end{document}

在此处输入图片描述

我对带有可选参数的宏有类似的问题,例如,

\documentclass{article}
\newtheorem{defn}{Definition}
\begin{document}

{\defn[Gauss]      Y}

{\defn[Gauss]Y}

\end{document}

这里,后面的空格]被删除并被输出中的某个常量空格替换。

(我知道你不应该\defn那样使用,但我无法想出更好的例子。)

内部逻辑是吸收可选参数后的所有空格还是这里有其他作用?

在此处输入图片描述

答案1

如果你习惯

\newtheorem{abc}{Abc}

(或类似的指令)在序言中,然后

{\abc text}

{\abc[opt] text}

然后. 使用适当的

\begin{abc}
text
\end{abc}

\begin{abc}[opt]
text
\end{abc}

原因有几个,最主要的是您没有执行\endabc

\begin{abc}或“吞噬\begin{abc}[opt]”所有空格并用固定量的水平空间替换它们,这是特定命令的一个特性。

内部\abc命令(不在文档中使用)发出\par并存储可能的可选参数,然后在段落开始时将其与标题一起传递。因此空格会被忽略,因为 TeX 处于垂直模式时会扫描空格。

答案2

LaTeX 不会吞噬可选(或强制)参数后的空格 - 至少不会比平时更多(即多个连续的简单空格/制表符会折叠为一个空格):

\documentclass{article}

\newcommand{\foo}[1][]{foo#1}

\begin{document}

% output: fooab
\foo[a]b

% output: fooa b
\foo[a] b

% output: fooa b
\foo[a]                b

% output: fooa  b
\foo[a]\ \ b

\end{document}

大概\newtheorem内部定义了结果命令,使得它后面总是有一个恒定数量的空格,但这不是 TeX 命令的默认行为的一部分。

在没有选项的命令后吞噬空格只是由于划分问题:没有空格,\aabLaTeX 就无法知道命令名称在第二个命令后结束,a因此需要一些标记来表示命令的结束。这可以是空格,但您也可以使用{}:(\aa{}b使用两者,\aa{} b会在输出中产生空格,因为{}已经向 LaTeX 发出命令结束的信号)。但是如果您有任何类型的参数,无论是可选的还是强制的,命令名称的结尾都是明确的,因此不需要吞噬空格。

(编辑:实际上\aa{}b并不完全等同于,\aa b因为前者在 之后添加了一个零宽度标记\aa。大多数情况下结果是相同的,但标记有时会产生影响,例如对于连字(fi看起来与 不同f{}i)、字距调整,或对于某些对以下标记起作用的命令,例如\'\^。感谢 David Carlisle 的见解!)

另外需要说明的是,据我所知,使用定理的推荐方法是使用环境:

\begin{defn}[Gauss]
Y
\end{defn}

但我猜你只是\defn为了演示目的?

相关内容