\ifmmode 似乎在数组环境中无法正常工作

\ifmmode 似乎在数组环境中无法正常工作

当我在环境内部的环境中使用时,我正在努力使其\ifmmode正常工作。arraydisplaymath

这是一个简单的例子:

\documentclass{article}

\newcommand{\signal}[1]{%
  \ifmmode
    1#1
  \else
    2$#1$
  \fi
}

\begin{document}
\begin{displaymath}
  \begin{array}{cc}
    \signal{a} \signal{b} & \signal{c} \signal{d} \\
  \end{array}
\end{displaymath}
\end{document}

此示例生成以下输出:

2a 1 _b_ 2c 1 _d_

为什么不是所有的调用都\signal检测数学模式?

答案1

在对齐单元的开头,TeX 会寻找\omit\noalign,而不是处于数学模式。处理这个问题的方法是插入\relax

\documentclass{article}

\newcommand{\signal}[1]{%
  \relax
  \ifmmode
    1#1
  \else
    2$#1$
  \fi
}

\begin{document}
\begin{displaymath}
  \begin{array}{cc}
    \signal{a} \signal{b} & \signal{c} \signal{d} \\
  \end{array}
\end{displaymath}
\end{document}

现在,问题是,如果在其他地方使用,它会弄乱字距调整(\relax即使不需要,它也会插入一个)。在一些 LaTeX3 工作中,我们尝试了一种使用 e-TeX“拾取”对齐单元的方法。有一次,我们为此做了一些非常复杂的测试

\documentclass{article}

\newcommand{\signal}[1]{%
  \ifnum\currentgrouptype = 6 %
    \ifnum\lastnodetype = 0 %
    \else
      \ifnum\lastnodetype = 7 %
      \else
        \relax
      \fi
    \fi
  \fi
  \ifmmode
    1#1
  \else
    2$#1$
  \fi
}

\begin{document}
\begin{displaymath}
  \begin{array}{cc}
    \signal{a} \signal{b} & \signal{c} \signal{d} \\
  \end{array}
\end{displaymath}
\end{document}

这使用 e-TeX 的各种诊断来获取单元格的开始。然而,这真的不是一个好主意,因为它假装是可扩展的,但确实插入了\relax:不可扩展!一个更干净的方法是使用\protected

\documentclass{article}

\protected\def\signal#1{%
  \ifmmode
    1#1
  \else
    2$#1$
  \fi
}

\begin{document}
\begin{displaymath}
  \begin{array}{cc}
    \signal{a} \signal{b} & \signal{c} \signal{d} \\
  \end{array}
\end{displaymath}
\end{document}

因为 e-TeX 在这里不会扩展受保护的宏。

相关内容