\ifmmode 和 \textormath 之间有什么区别?

\ifmmode 和 \textormath 之间有什么区别?

检查包的代码我看到了以下两行:

\def\th{\textormath{\text@th}{\math@th}}

\ifmmode{\nfss@text{\textnumero}}\else\textnumero\fi}

我猜是这样的,textormath并且\ifmmode基本上做了同样的事情:它们根据数学或文本模式是否处于活动状态来打印它们的第一个或第二个参数。但这两个命令有什么区别?哪一个更可取?

答案1

乳胶格式定义了\TextorMath一种非常薄的包装,\ifmmode 你没有说定义了什么\textormath,但大概是相似的。

\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname protected\endcsname\relax
\DeclareRobustCommand\TextOrMath{%
  \ifmmode  \expandafter\@secondoftwo
  \else     \expandafter\@firstoftwo  \fi}
\protected@edef\TextOrMath#1#2{\TextOrMath{#1}{#2}}
\else
\protected\expandafter\def\csname TextOrMath\space\endcsname{%
  \ifmmode  \expandafter\@secondoftwo
  \else     \expandafter\@firstoftwo  \fi}
\edef\TextOrMath#1#2{%
  \expandafter\noexpand\csname TextOrMath\space\endcsname
  {#1}{#2}}
\fi

一般来说,最好使用乳胶形式,除非您了解上下文,并且使用 TeX 原语是安全的,特别是在章节标题和表格单元格的开头\ifmmode以明确定义的方式运行,但不像您预期​​的那样,也没有用处,(例如,在数组单元格的开头它总是 false)

在此处输入图片描述

\documentclass{article}

\begin{document}



$
\begin{array}{c}
  \ifmmode math \else text\fi \\
  {}\ifmmode math \else text\fi \\
  \TextOrMath{text}{math} \\
  {}\TextOrMath{text}{math} \\
\end{array}
$

\end{document}

答案2

(小写) 宏\textormath在中定义babel.def并为该\ifmmode宏提供包装器:

\def\textormath{%
  \ifmmode
    \expandafter\@secondoftwo
  \else
    \expandafter\@firstoftwo
  \fi}

\ifmmode因此,它将具有与在单元格开头直接使用 eg 相同的问题(参见David 的回答)。

相关内容