当我在环境内部的环境中使用时,我正在努力使其\ifmmode
正常工作。array
displaymath
这是一个简单的例子:
\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}
此示例生成以下输出:
为什么不是所有的调用都\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 在这里不会扩展受保护的宏。