\xspace 与 ifmmode 结合使用

\xspace 与 ifmmode 结合使用

有时我想要为单词“true”使用一种特殊的字体,在数学模式中以及数学模式之外使用它,并且如果我不在数学模式中,后面会有正确的空格。使用

\newcommand{\tru}{\ifmmode {\text{\upshape \bfseries true}}%
        \else {{\upshape \bfseries true}\@\xspace}\fi}%

xspace 有时不会在应该添加空格的地方添加空格,例如在 中
$s=$ \tru iff。为什么?我该如何修复?

答案1

\xspace向前查看下一个标记以查看是否应添加空格,您的定义中有多余的括号组,这将破坏这一点。真假分支中的外括号组都没有做太多事情,{\text{\upshape \bfseries true}}或多或少与相同\text{\upshape \bfseries true}。尝试

\newcommand{\tru}{\relax\ifmmode \text{\upshape \bfseries true}%
    \else {\upshape \bfseries true}\@\expandafter\xspace\fi}

答案2

在这种特殊情况下,我不明白为什么要做所有这些工作:

\newcommand{\tru}{\textbf{\textup{true}}\xspace}

将会做同样的事情。

另一方面,\text在数学模式和文本模式下均可使用。在文本模式下,它将生成一个,\mbox这可能是您想要的(“true”不能用连字符连接,但较长的单词可以)。因此

\newcommand{\tru}{\text{\upshape \bfseries true}\xspace}

就足够了(如果您不想尝试对单词进行连字符连接,那么这样做可能更好)。 没有\@必要,因为 之后的\mbox空间因子始终为 1000。 更复杂的定义也不会这样做,因为 的 sfcode 为e1000。

相关内容