Ensuremath 后没有空格

Ensuremath 后没有空格

当我在句子中插入一个简短的数学部分时,它会按预期在两边留出空格并正常呈现:

...returned $\mathcal{P}$ from...

如果我定义一个命令来执行相同的操作,它也会在每侧呈现一个空格:

\newcommand{\pc}{\mathcal{P}}
...
...returned $\pc$ from...

但是,如果我用 定义一个函数ensuremath,表达式后面的空格就会消失:

\newcommand{\pc}{\ensuremath{\mathcal{P}}}
...
...returned \pc from...

为什么要这样做ensuremath?有没有办法让它更类似于手动进入数学模式?

谢谢!

答案1

这与 无关\ensuremath。无论宏是否包含数学,宏后的空格都会被忽略。

当然,你不能简单地在定义中添加一个空格,因为这会错误地在你不想要的地方添加空格,例如标点符号。所以有两种方法可以解决这个问题。一种是简单地在使用时插入一个明显的空格\

returned \pc\ from...

另一个解决方案是使用xspace包,它会自动插入空格并处理不是在标点符号前插入空格。

\usepackage{xspace}
\newcommand*{\pc}{\ensuremath{\mathcal{P}}\xspace}

那么您就不需要自己输入明确的空格了。

\ensuremath请注意,同时使用和有各种缺点xspace。请参阅:

答案2

我会推荐你不使用 \ensuremathLet \pc = 3 be given...对于这样的事情,否则你会忍不住写成Let $\pc=3$ be given...(第一个变体总是会导致不正确的间距。)

你可以简单地说:

\newcommand\pc{\mathcal{P}}

并按照我之前建议的方式使用它:

Here, $\pc$ is ...

这样,它最一致,您可以控制一切,而且两美元也不需要输入太多。此外,您可以不用 ,但这xspace又会让您失去对 TeX 代码的一些控制。

答案3

一个简单的解决方法是简单地{}在宏后添加,或者确保宏有一个参数。我遇到了同样的问题

\newcommand{\veca}{\ensuremath{\mathbf{a}}}

但使用

\newcommand{\ve}[1]{\ensuremath{\mathbf{#1}}}

而是把事情理顺了。

我本来想使用

\newcommand{\vec}[1]{\ensuremath{\mathbf{#1}}}

\vec已经被占用了,我不想重新定义它。

答案4

另一个改进方法是重新定义\ensuremath命令本身,例如

\newcommand{\enmath}[1]{\ensuremath{#1}\xspace}

这样你就可以定义自己的命令

\newcommand{\pc}{\enmath{\mathcal{P}}}

(我知道这很简单,但我认为这对初学者来说可能是一个有用的建议,就像现在对我来说一样)

相关内容