\documentclass[a4paper]{article}
\usepackage{amsmath,amssymb,amsfonts}
\begin{document}
\begin{align*}
\eta_i\in{}&\ifmmode\mathcal C^\infty\else$\mathcal C^\infty$\fi
\end{align*}
\end{document}
在命令行中输入 pdflatex 并运行它,我希望它能正常工作。align*
是一个数学模式环境,因此\ifmmode
应该采用 YES 分支,并只生成\mathcal C^\infty
。然而,事实并非如此。上面的结果是Missing } inserted
,如果我\show\mathcal
在 之后添加\else
,\show
就会执行,这意味着它会进入 NO 分支,就好像它不在数学模式中一样。但是,如果我删除&
,一切都会正常工作,结果是:
同样如此xelatex
。
这是怎么回事?为什么后面没有数学模式&
?
答案1
环境align
是根据原始函数定义的\halign
。
当 TeX 正在处理\halign
并发现时&
,它会忽略后面的显式空格并扩展标记以查看是否后面有\omit
或\span
。只有找到其中一个或两个都没有后,它才会插入当前列的模板。
偶数列的模板align
基本上是
$\displaystyle#$\hfill
其中#
代表单元格内容,通过扫描到下一个&
或行末找到。
在你的情况下发生的情况是\ifmmode
扩展并且 TeX不是当时处于数学模式,所以剩下的就是$\mathcal C^\infty$
现在 TeX 应用模板,结果
$\displaystyle$\mathcal C^\infty$$
这\mathcal
超出了数学模式。因此出现错误。
定义简单的宏
\newcommand{\Cinfty}{\ifmmode\mathcal{C}^\infty\else$\mathcal{C}^\infty$\fi}
无法解决问题。LaTeX 内核提供了\ensuremath
以下功能:
\newcommand{\Cinfty}{\ensuremath{\mathcal{C}^\infty}}
\Cinfty
但是,在执行此操作之前,您应该三思而后行(或更多),因为与正确标记的相比,在文本模式下键入没有任何优势$\Cinfty$
。请注意$\Cinfty$
和\Cinfty{}
需要相同数量的键。
答案2
我相信你不能使用里面\ifmmode
的math
,这个命令是用来定义一些东西的,修改的MWE
是:
\documentclass[a4paper]{article}
\usepackage{mathtools}
\begin{document}
\newcommand{\calC}{\relax\ifmmode\mathcal{C}^{\infty}\else%
$\mathcal{C}^{\infty}$\fi}%
\begin{align*}
\eta_i\in{}&\calC
\end{align*}
\calC
\end{document}