具有环境相关输出的宏

具有环境相关输出的宏

我正在尝试开发一个宏,根据它是处于数学模式(即$ $\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 在他的答案的评论中指出的来自环境的粗体和斜体(我也希望新命令尊重粗体和斜体(这是我在询问后才明白的...)textamsmath因此,对我的问题最好的解决方案是使用类似的东西:

\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
}

虽然在定义测试数学模式的宏之前,你可能想知道各种潜在的并发症

相关内容