有时我发现内部包代码包含宏\space
(由 LaTeX 定义为\def\space{ }
)。在段落文本中产生“显式”空格的最常用方法是使用\␣
,我认为我还没有看到任何源代码将其\space
作为用户级命令来教授。
关于 的使用,社区有哪些知识或实践\space
,尤其是与 相比\␣
?
这里有一些来自该类的例子memoir
,它在定义中使用了\space
以及。\␣
- 例如,它定义
\newcommand*{\booknamenum}{\space}
;这个宏“在打印书名和书号之间调用”。 - 用户更可能遇到的宏是
\printchapternum
;使用, 和两个连续的smemoir
来定义它。\renewcommand*{\printchapternum}{\centering\chapnumfont \thechapter\space\space}
\space
- 该类通过 定义
\wrappingoff
(用于verbatim
环境中)\newcommand*{\wrappingoff}{\def\@xobeysp{\leavevmode\penalty\@M\ }\def\wrapright{}}
。
有关的:
(关于代码中的视觉外观的一个有趣观察a\space\space␣b
:a\␣\␣b
在段落文本内给出看似相同的输出(但请注意,我还没有测试确切的换行行为)。我个人认为\space
在视觉上比更清晰\␣
:当我看到字母字符串“space”时,我立即知道它是什么。反斜杠和空格在 LaTeX 中无处不在,以至于这种组合\␣
在屏幕上更难辨认。也就是说,只有在功能上两者没有区别的情况下才应该考虑这些方面:只有这样才能将其视为编码风格的问题。)
答案1
\space
\space
扩展为普通空格标记,即代码为空格(32,0x20)且 catcode 为 10(空格)的字符。
与空格标记相反,TeX 不会折叠多个
\space
命令,也不会在读取输入时忽略命令名称后的空格标记。因此,它经常用于错误消息、警告和其他消息中。LaTeX 内核的示例(latex.ltx
):\gdef\@badlinearg{% \@latex@error{% Bad \protect\line\space or \protect\vector \space argument}\@ehb}
\␣
摘自 Donald E. Knuth 所著的《The TeXbook》,“第 25 章:水平模式总结”:
\␣
。控制空间命令将粘连附加到当前列表,使用的空间量与空间因子为 1000 时 ⟨space token⟩ 插入的空间量相同。
作为用例,它可以在命令名称后用于排版:
\TeX\ is a fascinating language.
它不能用于消息中,因为它不可扩展。如果在上面的错误消息中使用了 ,那么反斜杠也会
\␣
出现\space
。\␣
设置正常的单词间间距(空格因子1000
),而不是句子后的延长空格。因此它也可以在缩写后使用。例如:abc.\ is short for abcdef.\@ and abcdef.\@ is short for abcdefghi.
这里
\␣
输入 (2 个字符) 比\@␣
(3 个字符) 更短。 (\␣
-\relax
与许多其他原语一样 - 独立于空间因子:它既不使用也不改变它,而是忽略它并使用它1000
。请注意,\@␣
会重置空间因子。)\space
不能使用,因为它根据空间因子设置设置延长的空间。
答案2
\space
和 的主要区别在于\␣
前者遵循空间因子而后者不遵循。还有一个更微妙的区别:\space
扩展为空间标记,而\␣
不可扩展。
第二个方面与某些特殊情况有关:假设你写
\spacefactor=3000\space x
(可能在宏中)为了添加类似于句子结尾句号后面的空格;然后你会感到惊讶,因为不会出现空格:数字常量后面的空格标记会被忽略。只有第一个空格标记会被忽略,因此
\spacefactor=3000 \space x
是正确的代码。
这意味着\␣
和\space
永远不能互换。
转向你的例子。
\newcommand*{\booknamenum}{\space}
当然也可以写成\newcommand*{\booknamenum}{ }
,但前者更清楚。但请注意, 的\booknamenum
定义memoir
并不\ifx
等同于\space
。的情况下
\renewcommand*{\printchapternum}{% \centering\chapnumfont \thechapter\space\space}
有点不同,我非常不同意代码的编写方式。如果用户重新定义
\thechapter
为扩展为\arabic{chapter}.
,那么两个空间都会受到空间因子 3000 的影响,这可能不是真正想要的。定义应该是\renewcommand*{\printchapternum}{% \centering\chapnumfont \thechapter\ \ }
如果需要双倍空格。
重新定义
\@xobeysp
由 执行\wrappingoff
,即\def\@xobeysp{\leavevmode\penalty\@M\ }
\␣
出于同样的原因:我们不希望空间受到空间因素的影响。通常在环境中verbatim
发出\frenchspacing
命令这一事实不应被考虑:人们可能在其他地方也利用这一事实,并且此定义使用\@xobeysp
可预测的空间量。