有时我想要为单词“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 为e
1000。