47

I'd like a macro that is the opposite of \ensuremath: something like \ensurenotmath, which makes sure that its argument is not typeset in math mode. Is there such a macro, or a way to implement it?

For my purposes, it would be sufficient to just detect math mode, so I could do something like:

\if\inmathmode
    % give sensible error message
\else
    % do the usual thing
\fi

Any ideas?

(Alternatively: I tried \show\ensuremath to see how it works, but it's protected. How can I use \show on such a macro?)

Martin Scharrer
  • 262,582
Dan Drake
  • 1,364
  • 4
    morbusg answered your real question. For the second question, protected macros come are defined by expanding to \protect\foo where there is actually a space in the name \foo. You can use \expandafter\show\csname foo \endcsname--note the space after foo--to see the definition. – TH. Apr 07 '11 at 06:38
  • 6
    Also, you can use \mbox{...} and the ... will be typeset in restricted horizontal mode, no matter what mode you're in outside the \mbox. – TH. Apr 07 '11 at 06:39
  • @TH: thanks for the tip about \expandafter and \csname! – Dan Drake Apr 07 '11 at 07:01
  • 2
    You could also use the texdef script: texdef -t latex ensuremath (or latexdef ensuremath if the latedef symlink to texdef was created). It detects the protected status automatically and also show the macro with the space. You can also use it explicitly: texdef -t latex 'ensuremath ' – Martin Scharrer Apr 07 '11 at 07:39

2 Answers2

36

\ifmmode <do_something>\else <do_something_else>\fi

morbusg
  • 25,490
  • 4
  • 81
  • 162
20

Simply using \text{} should ensure that you are not in math mode?

Joseph makes a very good point about text{} not being unrestricted horizontal mode, so the above will work only for short text snippets that don't need to cross line boundaries. I think a better solution would be:

\parbox{\linewidth}{}

Peter Grill
  • 223,288