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
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:
\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.
-
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.– twshCommented 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'?– Ansa211Commented Aug 29, 2018 at 17:52