align* 中缺少 } 插入且条件分支错误

align* 中缺少 } 插入且条件分支错误
\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

我相信你不能使用里面\ifmmodemath,这个命令是用来定义一些东西的,修改的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}

相关内容