\ifmmode 在 Todo 列表中不起作用

\ifmmode 在 Todo 列表中不起作用

喂食

\documentclass{article}
\pagestyle{empty}
\usepackage{todonotes}
\begin{document}%
\listoftodos
\todo{\(\ifmmode MATH \else TEXT\fi\)}%%% $…$ instead of \(…\) fails as well.
\end{document}

产量pdflatex

输出

然而,预期的结果是

答案1

问题是,当 TeX 执行操作时\write(例如,将条目添加到待办事项列表时),它处于无模式并且不会排版,但会扩展宏和条件。

你可以定义自己的强命令:

\NewDocumentCommand{\MathModeTF}{mm}{\ifmmode #1\else #2\fi}

或者

\DeclareRobustCommand{\MathModeTF}[2]{\ifmmode #1\else #2\fi}

(我更喜欢前者)因此条件的评估被延迟到排版完成为止。可以这样称呼它

\MathModeTF{MATH}{TEXT}

另一方面,LaTeX 内核已经具备了\TextOrMath{TEXT}{MATH}仅切换参数的功能。

\documentclass{article}
\pagestyle{empty}
\usepackage{todonotes}
\begin{document}%
\listoftodos
\todo{\(\TextOrMath{TEXT}{MATH}\)}%%% $…$ instead of \(…\) fails as well.
\end{document}

在此处输入图片描述

答案2

为了获得“通用”解决方案,此答案演示了如何“解决”\protect等问题。

\documentclass{article}
\pagestyle{empty}
\usepackage{todonotes}
\usepackage{etoolbox}
\begin{document}%
\listoftodos
\todo{\(\protect\ifmmode MATH \protect\else TEXT\protect\fi\)}
\todo{\protecting{\(\ifmmode MATH \else TEXT\fi\)}}  % need etoolbox

\end{document}

两种方法均可。


一般问题:脆弱命令和坚固命令之间有什么区别?什么时候以及为什么我们需要 \protect?

关于移动参数的其他问题\todo1 2

相关内容