答案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
。