28

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'?

37

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
  • 6
    +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). – David Carlisle Oct 1 '13 at 17:50
  • Fair point. I don't need it to work by expansion. I've edited the question. – twsh Oct 1 '13 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 '18 at 17:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.