\newcommand:如何确定是否处于数学模式(然后包括$ $)?

\newcommand:如何确定是否处于数学模式(然后包括$ $)?

我想定义一个新命令,该命令应确定(在 tikz 图内)其参数是否处于数学模式。如果是,它应该用 $ $ 包装参数。我发现 \ifmode 可以做到这一点,但它不起作用。这是我的最小示例:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[american,ngerman]{babel}
\usepackage{tikz}

\newcommand*{\yellowemph}[1]{%
  \tikz[baseline=(text.base)]\node(text)[rectangle, fill=yellow, rounded
corners, inner sep=0.3mm]{\ifmmode $#1$\else #1\fi};%
}

\begin{document}
\yellowemph{word}% works
\yellowemph{$\frac{1}{2}$}% works
$\yellowemph{\frac{1}{2}}$% does not work
\end{document}

我知道\ensuremath总是切换到数学模式。如果不处于数学模式,我希望保持文本原样(\yellowemph{word}例如,参见)。

解决方案

如下所示,这是一个解决方案:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[american,ngerman]{babel}
\usepackage{tikz}

\newif\ifstartedinmathmode
\newcommand*{\yellowemph}[1]{%
  \relax\ifmmode\startedinmathmodetrue\else\startedinmathmodefalse\fi
  \tikz[baseline=(text.base)]\node(text)[rectangle, fill=yellow, rounded
corners, inner sep=0.3mm]
  {\ifstartedinmathmode$#1$\else#1\fi};%
}

\begin{document}
\yellowemph{word}
$\int_0^\infty f(\yellowemph{x})\,dx$
\yellowemph{$\displaystyle\frac{1}{2}$}
\end{document}

答案1

对一个\node总是以文本模式处理,无论是否tikzpicture已在文本或数学模式下启动。因此,最好的解决方法是将$符号放在参数中。

\newcommand*{\yellowemph}[1]{%
  \tikz[baseline=(text.base)]\node(text)[rectangle, fill=yellow, rounded
corners, inner sep=0.3mm]{#1};%
}

\begin{document}
\yellowemph{word}
\yellowemph{$\frac{1}{2}$}

您可以尝试一种更复杂的条件方法:

\newif\ifstartedinmathmode
\newcommand*{\yellowemph}[1]{%
  \relax\ifmmode\startedinmathmodetrue\else\startedinmathmodefalse\fi
  \tikz[baseline=(text.base)]\node(text)[rectangle, fill=yellow, rounded
corners, inner sep=0.3mm]
  {\ifstartedinmathmode$#1$\else#1\fi};%
}

答案2

您需要使用\ensuremath或修复条件中的错误:

\relax\ifmmode#1\else $#1$\fi

答案3

尝试这个:

\newcommand*{\textyellowemph}[1]{\tikz[baseline=(text.base)]\node(text)[rectangle, fill=yellow, rounded, inner sep=0.3mm]{#1};}
\newcommand*{\mathyellowemph}[1]{\tikz[baseline=(text.base)]\node(text)[rectangle, fill=yellow, rounded, inner sep=0.3mm]{\ensuremath{#1}};}
\newcommand*{\yellowemph}[1]{\ifmmode\mathyellowemph{#1}\else\textyellowemph{#1}\fi}

相关内容