LaTeX 宏 \space 的使用(与 \␣ 相比)

LaTeX 宏 \space 的使用(与 \␣ 相比)

有时我发现内部包代码包含宏\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␣ba\␣\␣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可预测的空间量。

相关内容