我正在尝试开发一个宏,根据它是处于数学模式(即$ $
或\begin{equation} ... \end{equation}
)还是其他任何模式,它都会提供两个不同的输出。原因是我使用了很多物理变量和分子名称,例如,
$^{12}$CO(1-0)
并使用宏来使它们在整个文本中统一排版。我在普通文本和数学环境中都使用它们。现在我有两个宏,一个用于文本:
\newcommand{\twCO}{%
$^{12}$CO(1-0)\xspace%
}%
还有一个是没有数学符号的数学:
\newcommand{\twCO}{%
^{12}CO(1-0)%
}% .
我想提出一些更通用的东西:
\newcommand{\twCO}{%
\ifinmathmode%
^{12}CO(1-0)%
\else%
$^{12}$CO(1-0)\xspace%
}
在 TeX 和知名搜索提供商上搜索了很长时间,我找不到令人满意的答案,只能使用更复杂的结构来进行检查。但我想问一下,是否有人知道一种简单的检查方法可以查看自己处于哪个环境中?
编辑:
在尝试了以下答案和评论中给出的选项后,我发现对于我的情况来说,最简单、最好的设置是使用 @egreg 在他的答案的评论中指出的来自环境的粗体和斜体(我也希望新命令尊重粗体和斜体(这是我在询问后才明白的...)text
。amsmath
因此,对我的问题最好的解决方案是使用类似的东西:
\usepackage{amsmath}
\newcommand{\twCO}{\text{\textsuperscript{12}CO}}
mhchem
然而,评论中指出,设置同位素确实很有用。
但是对于想要测试数学模式的人来说,第二个答案效果很好。或者也可以使用\ensuremath
,评论中也提到了。但是,这并不尊重环境中的粗体或斜体。
答案1
如果您$^12$CO(1-0)
在文本模式和^12CO(1-0)
数学模式下使用,您肯定会得到*不同的结果。字母CO
会改变形状,连字符在数学模式下会变成减号。
如果你真的想在文本和数学模式下得到统一的结果,那么
\newcommand{\twCO}{\textnormal{\textsuperscript{12}CO(1-0)}}
这实际上意味着在数学中也使用文本模式。
如果您确实想要它,请添加\xspace
;我从不推荐它。
答案2
@egreg 向您展示了如何实现一致性。但您还询问了测试您是否处于数学模式:
然后你会想做类似的事情:
\newcommand{\test}{%
Hello:
\ifmmode%
this is math
\else
this is not math
\fi
}
然后可以将示例命令重写为
% requires `amsmath` for `\text{...}`
\newcommand{\twCO}{%
\relax
\ifmmode
^{12}\text{CO(1-0)}%
\else
$^{12}$CO(1-0)%
\fi
}
或者,正如 egreg 所建议的那样,
\DeclareRobustCommand{\twCO}{%
\ifmmode
^{12}\text{CO(1-0)}%
\else
$^{12}$CO(1-0)%
\fi
}
虽然在定义测试数学模式的宏之前,你可能想知道各种潜在的并发症