30

If I have a \newcommand*{\foo}{foo} it will 'eat' space after it. Is there a way to tell it to eat space before, so that the result of e.g. bar \foo bar would be 'barfoobar'?

1 Answer 1

39

You can define \foo to \unskip before foo and gobble spaces afterward using \ignorespaces:

\newcommand*{\foo}{\leavevmode\unskip foo\ignorespaces}

The latter is not needed if you're using in-line. Note that forced spaces after \foo are still adhered to:

enter image description here

\documentclass{article}
\newcommand*{\foo}{\leavevmode\unskip foo\ignorespaces}
\begin{document}
Here is~\foo some text \foo~with spaces\foo{}and nothing\ \foo\ else.
\end{document}

\leavevmode prevents oddities around the start of a paragraph.

3
  • 7
    +1 although you might want to put \leavevmode at the start or it will have an interesting effect at the start of a paragraph. Also no that neither \unskip nor \ignorespaces works by expansion so technically doesn't answer the question as asked (but may answer the OP's real problem). Oct 1, 2013 at 17:50
  • Fair point. I don't need it to work by expansion. I've edited the question.
    – twsh
    Oct 1, 2013 at 17:52
  • Is there any way to remove also forced whitespace before the command, so that bar\quad\foo bar would also produce 'barfoobar'?
    – Ansa211
    Aug 29, 2018 at 17:52

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .