如何检测命令是否在后台进入数学模式?

如何检测命令是否在后台进入数学模式?

注释掉%\usepackage{hyperref}以下代码片段将会产生一些警告。

使用\usepackage{hyperref}\section{}检测命令是否进入数学模式可能不适用于分支逻辑,例如\ifthenelse{}{}

\documentclass{article}
%\usepackage{hyperref}
\newcommand{\blackbox}{Do you know there is H$_2$O in this black box?}
\begin{document}
\section{\blackbox}
\end{document}

是否有一个命令,\ContainsMathMode{args}即输出一个布尔值,表示参数是否args内部进入数学模式?

答案1

数学模式在幕后很多地方都有使用,例如在tabular。我会说类似

\newcommand{\ContainsMathMode}[1]{\begingroup\MMusedfalse
  \everymath=\expandafter{\the\everymath\MMusedtrue}%
  \sbox0{#1}\endgroup}
\let\ifMMused\iffalse
\def\MMusedtrue{\global\let\ifMMused\iftrue}
\def\MMusedfalse{\global\let\ifMMused\iffalse}

当然,这是不可扩展的,所以必须先说\ContainsMathMode{arg},然后使用\ifMMused分支,或者如果那么, 考试\boolean{MMused}

使用输入

\ContainsMathMode{H$_2$O}
\ifMMused Yes\else No\fi

\ContainsMathMode{abc}
\ifMMused Yes\else No\fi

\ContainsMathMode{\begin{tabular}{c}a\end{tabular}}
\ifMMused Yes\else No\fi

我们得到



每次 TeX 进入内联数学模式时,都会插入标记列表的内容\everymath。我们(本地)向其中添加将布尔值设置为 true 的命令。此布尔值必须全局设置,因此我们还需要在每次调用时将其设置为 false \ContainsMathMode

一种更接近 LaTeX 的方式是添加上述内容

\makeatletter
\newcommand{\IfContainsMathMode}[1]{%
  \ContainsMathMode{#1}%
  \ifMMused
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatother

\IfContainsMathMode{H$_2$O}{Yes}{No}

\IfContainsMathMode{abc}{Yes}{No}

\IfContainsMathMode{\begin{tabular}{c}a\end{tabular}}{Yes}{No}

这将产生与之前相同的输出。

答案2

\everymath工具非常适合此用途:它是一个标记列表,在每个数学组的开头都会读取(当然)。您可以执行以下操作:

\documentclass{article}
\begin{document}
 \newif\ifmathinside
 \def\IfContainsMathMode#1{%
  \mathinsidefalse
  \begingroup
   \everymath={\global\mathinsidetrue}%
   \setbox0=\hbox{#1}%
  \endgroup
  \ifmathinside
 }
 \def\blackbox{There is H$_2$O in here}
 \IfContainsMathMode{\blackbox}  There was math inside
 \else                           There was no math
 \fi
\end{document}

\if我希望这不会对内部不匹配产生一些可怕的副作用\IfContainsMathMode。我猜一个更 LaTeXy 的方法是

\documentclass{article}
\begin{document}
 \newif\ifmathinside
 \def\IfContainsMathMode#1#2#3{%
  \mathinsidefalse
  \begingroup
   \everymath={\global\mathinsidetrue}%
   \setbox0=\hbox{#1}%
  \endgroup
  \ifmathinside#1\else#2\fi
 }
 \def\blackbox{There is H$_2$O in here}
 \IfContainsMathMode{\blackbox}{There was math inside}{There was no math}
\end{document}

不存在那个潜在问题。

相关内容