当我在句子中插入一个简短的数学部分时,它会按预期在两边留出空格并正常呈现:
...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
我会推荐你不使用 \ensuremath
Let \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}}}
(我知道这很简单,但我认为这对初学者来说可能是一个有用的建议,就像现在对我来说一样)