注释掉%\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}
不存在那个潜在问题。