喂食
\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
。