检查包的代码我看到了以下两行:
\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 的回答)。