为什么 \ensuremath 的间距不同?

为什么 \ensuremath 的间距不同?

如果\newcommand{\ensuremath{something}}扩展为

\ifmmode
 something
\else
 $something$
\fi

为什么间距

\newcommand{\x}{x_\textsc{y}} 
\newcommand{\y}{\ensuremath{x_\textsc{y}}}

不同的?

Why is the spacing $\x$ different?\\
Why is the spacing \y different?

间距

答案1

如果\ensuremath定义为

\newcommand{\ensuremath}[1]{%
   \ifmmode
      #1
   \else
      $#1$   %<--- space here!
   \fi
}

就像你似乎相信的那样,那么你的期望是正确的:当定义

\newcommand{\foo}{\ensuremath{foo}}

\foo在文本模式下使用,通常的 TeX 规则会吞噬后面的空格,\foo但该空格会由(假定的)定义引入\ensuremath

事实上,\ensuremath并不是这样定义的:

\DeclareRobustCommand{\ensuremath}{%
  \ifmmode
    \expandafter\@firstofone
  \else
    \expandafter\@ensuredmath
  \fi}
\long\def\@ensuredmath#1{$\relax#1$}

并且扩展不会引入任何空间。

(问观众:为什么\long?)

答案2

前面的答案非常清楚地说明了为什么您的定义:
* \newcommand{\y}{\ensuremath{x_\textsc{y}}}
\y删除了以下空格。
作为一种解决方法,您可以考虑使用包xspace,并(重新)定义\y
* \newcommand{\y}{\ensuremath{x_\textsc{y}}\xspace}
如果您遵循这条路线,请查看该包中提供的自定义功能\xspaceaddexceptions

相关内容