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). Commented Oct 1, 2013 at 17:50
  • Fair point. I don't need it to work by expansion. I've edited the question.
    – twsh
    Commented 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
    Commented 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 .