\ifmmode 在 amsmath 中自相矛盾(仅在 LaTeX 中可以)

\ifmmode 在 amsmath 中自相矛盾(仅在 LaTeX 中可以)

文件:

\documentclass[11pt]{article}   
\usepackage{amsmath} 
\newcommand{\argghhh}{\relax\ifmmode\bar\else\expandafter\=\fi}

\begin{document} 

$ \argghhh a $ 

\end{document}

产生错误(但如果\usepackage{amsmath}被注释掉则不会):

LaTeX Warning: Command \= invalid in math mode on input line 7.

! Please use \mathaccent for accents in math mode.
\add@accent ...@spacefactor \spacefactor }\accent 
                                                  #1 #2\egroup \spacefactor ...
l.7 $ \argghhh a
                 $

显然这是数学模式。但它选择 (1) ,因此不是数学模式,然后 (2)在数学模式下\=发出抱怨!\=

答案1

添加后\tracingall你会看到被\bar选中但它的参数是\else

\bar ->\protect \mathaccentV {bar}016
{\relax}

\mathaccentV #1#2#3#4#5->\ifmmode \gdef \macc@tmp {\macc@depth \@ne }\setbox \z
@ \hbox {\let \mathaccentV \macc@test \let \use@mathgroup \@gobbletwo \let \sel
ect@group \@gobblethree \frozen@everymath {}$#5$}\macc@tmp \ifnum \macc@depth =
\@ne \global \let \macc@nucleus \@empty \mathaccent "\accentclass@ \else \@xp \
macc@nested \fi #2#3#4{#5}\macc@nucleus \else \@xp \nonmatherr@ \csname #1\endc
sname \fi 
#1<-bar
#2<-0
#3<-1
#4<-6
#5<-\else 

您需要在调用\else之前进行扩展。\bar

\newcommand{\argghhh}{\relax\ifmmode\expandafter\bar\else\expandafter\=\fi}

您没有收到错误的原因amsmath主要是偶然的,因为在这种情况下您获得的 TeX 原始参数扫描与宏参数的扫描方式不同。

相关内容