
Чтобы гарантировать правильное использование новых команд, которые должны использоваться только в mathmode, я ввел mathcommand
, который проверяет mathmode по \ifmmode
.
Теперь я хочу использовать такойmathcommand в заголовке разделаи появляется предупреждение математической среды, хотя команда используется в mathmode:
\documentclass{scrbook}
% provide mathcommand environment
\newcommand{\assuremath}{%
\relax\ifmmode\else\message{LaTeX Warning: Mathmode command used outside of math mode on input line \the\inputlineno}\fi
}
\newcommand{\newmathcommand}[2]{\newcommand{#1}{#2\assuremath}}
\newcommand{\renewmathcommand}[2]{\renewcommand{#1}{#2\assuremath}}
% define some mathcommand
\newmathcommand{\someMathCommand}{e^x}
\begin{document}
% use mathcommand in a caption
\section{I love $\someMathCommand$}
\end{document}
Я не знаком с механизмами математического режима в заголовках разделов. Думаю, именно поэтому и возникает проблема...
решение1
Вот что происходит.
Заголовок раздела — это перемещаемый аргумент, то есть он сохраняется в памяти и записывается в .aux
файл при отправке следующей страницы.
При выполнении операции записи TeX расширяет макросыбезвыполнение команд; более того, этонетв математическом режиме в это время (он находится внетmode, на самом деле). Это означает, что условие ложно и \message{...}
записывается в .aux
файл.
Вы решаете проблему, говоря:
\DeclareRobustCommand{\assuremath}{%
\relax\ifmmode\else\message{LaTeX Warning: Mathmode command used outside of math mode on input line \the\inputlineno}\fi
}