å
我知道 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 命令的默认行为的一部分。
在没有选项的命令后吞噬空格只是由于划分问题:没有空格,\aab
LaTeX 就无法知道命令名称在第二个命令后结束,a
因此需要一些标记来表示命令的结束。这可以是空格,但您也可以使用{}
:(\aa{}b
使用两者,\aa{} b
会在输出中产生空格,因为{}
已经向 LaTeX 发出命令结束的信号)。但是如果您有任何类型的参数,无论是可选的还是强制的,命令名称的结尾都是明确的,因此不需要吞噬空格。
(编辑:实际上\aa{}b
并不完全等同于,\aa b
因为前者在 之后添加了一个零宽度标记\aa
。大多数情况下结果是相同的,但标记有时会产生影响,例如对于连字(fi
看起来与 不同f{}i
)、字距调整,或对于某些对以下标记起作用的命令,例如\'
或\^
。感谢 David Carlisle 的见解!)
另外需要说明的是,据我所知,使用定理的推荐方法是使用环境:
\begin{defn}[Gauss]
Y
\end{defn}
但我猜你只是\defn
为了演示目的?