amsmath 的 align* 或 gather* 后跟 \ifmmode =

amsmath 的 align* 或 gather* 后跟 \ifmmode =

喂食

\documentclass{article}
\usepackage{mathtools}%%% or amsmath
\begin{document}
\begin{gather*}
  \ifmmode Math\else Text\fi
\end{gather*}
\end{document}

到四个 LaTeX 处理器(latex、pdflatex、xelatex、lualatex)中的任何一个都会打印“文本”。如果\ifmmode在 之后立即启动一个宏调用的主体,则同样适用。如果用、甚至或 甚至替换,\begin{gather*}则同样适用,当然,每次都会正确终止。\begin{gather*}\begin{align*}\[\begin{aligned}\[\begin{aligned}[t]\[\begin{aligned}[t] stuff &

为什么?罪魁祸首是谁?该怎么办?

答案1

所有对齐显示环境amsmath都是根据具有\halign适合列单元的模板的图元来定义的。

按照设计,一旦 TeX 开始检查一个新单元,\halign它就处于“受限水平模式”,并递归扩展它找到的第一个标记,以查看是否\omit出现在开头,这将触发不使用指定的模板;通常,\omit后面跟着\span以便合并单元,但这不是强制性的。

在你的情况下,TeX 会扩展\ifmmode,并且这个条件会被证明是错误的,因为 TeX 是不是在数学模式中。只有在部分(应该放在单元格文本之前的内容)已插入。

\relax在前面添加\ifmmode。但当然,您的条件文本将通过宏插入:用于\DeclareRobustCommand定义它。

因此

\newcommand{\mymacro}{\relax\ifmmode Math\else Text\fi}

或者

\DeclareRobustCommand{\mymacro}{\ifmmode Math\else Text\fi}

如果也可以出现在移动参数中,则后者更可取\mymacro。它之所以有效,是因为由 定义的宏\DeclareRobustCommand会扩展为以 开头的内容\protect,并且在排版上下文中,\protect它与 相同\relax

另外,对于没有参数的宏,使用\newcommend\newcommand*无关紧要。区别只出现在有参数的宏中,其中*-form 不允许\par任何参数中有 (或空行)。这同样适用于\DeclareRobustCommand

相关内容