I have defined a macro that I would like to be used exclusively in math mode. In order to enforce this, I would like the macro to throw an error message whenever it is used outside of math mode. What is the easiest way of making a macro math-mode-only?
You can use \ifmmode
to check if you are in math mode, and trigger an error if not. An attempt to use it outside of math mode yields:
Attempt to use \MyMathModeMacro outside of math mode.
See my preamble documentation for explanation.
Type H for immediate help.
l.16 \MyMathModeMacro % <--- This will produce an error ?
Notes:
As David Carlisle pointed out, need to use
\DeclareRobustCommand
instead of\newcommand
to avoid premature expansion. See \ifmmode doesn't seem to work correctly inside an array environment.If you want to allow the macro to be used in or outside of math mode, you can use
\ensuremath
to typeset the content in math mode. But you should refer to When not to use \ensuremath for math macro? before doing this.
Code:
\documentclass{article}
\makeatletter
\DeclareRobustCommand{\MyMathModeMacro}{%
\ifmmode
E = m c^2
\else
\GenericError{\space\space\space\space}
{Attempt to use \@backslashchar MyMathModeMacro outside of math mode}
{See my preamble documentation for explanation.}
{Need to use either use inline or display math.}%
\fi
}
\makeatother
\begin{document}
$\MyMathModeMacro$
\MyMathModeMacro% <--- This will produce an error
\end{document}
-
@Qrrbrbirlbel: I think you are right (have corrected), but surprisingly
PackageError
does not issue aPackageError
if it does not get 3 parameters?? – Peter Grill Nov 7 '12 at 1:51 -
@PeterGrill That was fast! I am wondering, is there a way of throwing an error in a way that doesn't make it look package-specific? (I might simply have defined this macro in my preamble.) – Lover of Structure Nov 7 '12 at 1:55
-
1I normally just use
\typeout{message}\QUITHERE
, where\QUITHERE
is not defined, but thought I would use the official way of reporting errors. Alternatively, you could usemy preamble
, or some other relevant text as the first parameter to\PackageError
. – Peter Grill Nov 7 '12 at 1:58 -
2
-
2You'll need to use
\DeclareRobustCommand
not\newcommand
or you will get the wrong answer at the start of array cells. – David Carlisle Nov 7 '12 at 2:05
\ifmmode
, or useensuremath
so that it'll be in math mode. – Peter Grill Nov 7 '12 at 1:44