TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have a definition:

\newcommand{\arnold}{Arnold Schwarzenegger}

When I refer to it by:

\arnold is a

it is rendered as:

Arnold Schwarzeneggeris a

In order to have a space in front of "is" I would need to write

\arnold\ is a

Is there some other shorter way?

share|improve this question

migrated from stackoverflow.com Oct 10 '11 at 10:16

This question came from our site for professional and enthusiast programmers.

1  
    
\arnold is a... what? Arnie is a strong guy, so I wouldn't say anything bad about him... – McGafter Feb 1 at 9:30
up vote 198 down vote accepted

If you create a macro without arguments you should always invoke it with an empty statement after it: \arnold{}

The reason behind this is that LaTeX expects an argument directly after the macro (it's still in scanning mode for that macro). You need to break that using either a protected space (as you already wrote) or an empty statement {}. I'd recommend using an empty statement, as using a protected space can generate nasty effects -- for example, if that protected space is directly followed by a line break. In that case LaTeX might print two spaces instead which looks ugly and isn't wanted. Using an empty statement prevents this.

How you can add the space directly to the macro has already been answered, but do you really want this? You'd get into trouble as soon as the macro is to be followed by a punctuation mark (or if the macro is followed by a \footnote, etc.):

\arnold,
Arnold Schwarzenegger ,

I'd recommend going for the empty statement option -- one gets used to that quite fast.

share|improve this answer
14  
"xspace" is a tiny package which basically just contains a list of punctuation marks, making it not insert the space if there is a punctuation mark. – Kaarel Feb 4 '09 at 19:17
3  
Thanks for this. I have been creating two of each \newcommand, one with a space and one without, but I knew there had to be a way to make it smarter. Also, apparently you have to do this with some built in stuff, like \LaTeX{}, or you will get the same problem. – asmeurer Dec 9 '10 at 3:11
7  
{\command} works as \command{} and looks nicer IMHO. – Trylks Sep 10 '13 at 13:15
4  
That's a nice explanation, but why is it the accepted answer? Writing \arnold{} is one character longer than \arnold\ , so it doesn't quite satisfy the requirement for a "shorter way". (The \ approach is also Donald Knuth's recommendation, by the way.) – alexis Mar 3 '14 at 17:52
10  
There are many mistakes in this answer. "LaTeX expects an argument" -> TeX ignores the space after multiletter control sequence during its tokenization. What does mean "scanning mode for the macro"? The {} isn't empty statement but it processes \bgroup\egroup. And the \ at the end of line in the source file acts like \^^M and this creates only one space. – wipet Oct 16 '14 at 4:51

*This is a summary answer, highlighting the benefits and drawbacks for the different techniques available to preserve spaces following a control word. Conceptually, this is intended for LaTeX implementations where the control word does not accept arguments, expands to simple, possibly formatted, text, and is used primarily in prose.

Background:

The TeX input processor, after building a control sequence consisting of characters with category code = 11 (a control word), switches to state S, which skips characters with category code = 10 (space). Therefore, to preserve spaces following a control word, a character with category code < 10 or category code > 11 must be used between the control word and the following space. This the essence of the first four options below. The fifth option works after the input processor and adds a space depending on the following token.

Evaluation Criteria:

The question defines a single basis for comparision:

  1. Minimize the number of additional characters beyond the baseline control word (\arnold as an example).

Brevity should not be the only factor considered. Qualitative characteristics are also important. For example, does the approach:

  1. Allow for expected trailing spaces to be removed by mistake? In other words, are there valid variants of the control word which would remove an explicit space?
  2. Potentially add unexpected trailing spaces after the control word?
  3. Raise an error if the control word is already defined?
  4. Apply to existing control words (e.g., \LaTeX)?
  5. Enforce consistent use of the control word in the prose? As with (2), are there valid variants of the control word? The desire for consistent use stems from the otherwise reasonable interpretation of a control word as being a direct substitute for the underlying text.

As the weight of each point above is subjective and there is no perfect solution, the best approach is largely a matter of personal preference. Factor (1) is listed in the heading of the options while the remaining factors are assessed in Benefits and Drawbacks. Each of the options below have implementations (those "With Check") to satisfy (4) and it is therefore omitted.


Option 1: Add a control space (\␣ = backslash + space) after the control word when a space is desired. Impact: 0 or 1 additional characters.

The "explicit" solution given on page 8 of The TEXbook. This yields a control sequence token (different from the character token which is generated by a space alone) and is therefore retained.

Definition: \newcommand{\arnold}{Arnold Schwarzenegger}

Example uses:

  1. Space after: He yelled ``Get to the choppa!'' in his best \arnold\ impression.
  2. Punctuation after: According to \arnold, it is pronounced Kal-e-four-knee-yah.

Benefits:

  • (3) Does not add unexpected trailing spaces.
  • (5) Applicable to preexisting control words.

Drawbacks:

  • (2) If omitted, trailing spaces will be removed (i.e., best \arnold impression above yields best Arnold Schwarzeneggerimpression).
  • (6) Not consistent usage (i.e., \arnold\ , above yields Arnold Schwarzenegger ,).

Option 2: Add {} after the control word when a space is desired or after each use.

Implementation A: Impact: 0 or 2 additional characters.

As suggested in bluebrother's answer, the { character following the control word in this approach causes the input processor to switch to state M and retain the first following space.

Definition: \newcommand{\arnold}{Arnold Schwarzenegger}

Uses:

  1. Space after: He yelled ``Get to the choppa!'' in his best \arnold{} impression.
  2. Punctuation after:
    • According to \arnold, it is pronounced Kal-e-four-knee-yah.
    • According to \arnold{}, it is pronounced Kal-e-four-knee-yah.

Benefits:

  • (3) Does not add unexpected trailing spaces.
  • (5) Applicable to preexisting control words.

Drawbacks:

  • (2) If omitted, trailing spaces will be removed (i.e., best \arnold impression above yields best Arnold Schwarzeneggerimpression).
  • (6) Not consistent usage (inclusion or omission of {} are both acceptable if followed by punctuation).

Implementation B: Impact: 2 additional characters.

Alternative approaches which raise errors if {} does not follow the control word may be found at Drawbacks of csname method to avoid spaces after command.

Definition: Varies

Uses:

  • Space after: He yelled ``Get to the choppa!'' in his best \arnold{} impression.
  • Punctuation after: According to \arnold{}, it is pronounced Kal-e-four-knee-yah.

Benefits:

  • (2) Prevents expected trailing spaces from being removed (error raised if {} is omitted).
  • (3) Does not add unexpected trailing spaces.
  • (6) Use is mostly consistent (error raised if {} is omitted; however, {\relax} will compile).

Drawbacks:

  • (5) Not applicable to existing control words.

Option 3: Surround the control word in { } when a space is desired or for each use. Impact: 0 or 2 additional characters.

Suggested by Trylks in a comment to bluebrother's answer.

Definition: \newcommand{\arnold}{Arnold Schwarzenegger}

Uses:

  1. Space after: He yelled ``Get to the choppa!'' using his best {\arnold} impression.
  2. Punctuation after:
    • According to \arnold, it is pronounced Kal-e-four-knee-yah.
    • According to {\arnold}, it is pronounced Kal-e-four-knee-yah.

Benefits:

  • (3) Does not add unexpected trailing spaces.
  • (5) Applicable to preexisting control words.

Drawbacks:

  • (2) If omitted, trailing spaces will be removed (i.e., best \arnold impression above yields best Arnold Schwarzeneggerimpression).
  • (6) Not consistent usage (inclusion or omission of { } are both acceptable if followed by punctuation).

Option 4: Add a non-letter character to the end of the control word in its definition and after each use. Impact: 1 additional character.

A variant on Przemysław Scherwentke's answer (see also lockstep's answer and yo's answer), this is perhaps the "canonical" solution (Page 204 of The TEXbook):

You can use this idea to define macros that are intended to be used in sentences, so that users don't have to worry about the possible disappearance of spaces.

By defining the control word with \def and placing a non-letter character at the beginning of the parameter text, the character will be required. As above, the definition may be wrapped in \@ifdefinable to perform the same check as \newcommand and raise an error if the control word is already defined.

Definition:

Without check: \def\arnold/{Arnold Schwarzenegger}

With check (see the Appendix at the end of this answer for an alternative implementation):

\makeatletter
    \@ifdefinable{\arnold}{\def\arnold/{Arnold Schwarzenegger}}
\makeatother

Uses:

  1. Space after: He yelled ``Get to the choppa!'' using his best \arnold/ impression.
  2. Punctuation after: According to \arnold/, it is pronounced Kal-e-four-knee-yah.

Benefits:

  • (2) Prevents expected trailing spaces from being removed (error raised if / is omitted).
  • (3) Does not add unexpected trailing spaces.
  • (6) Use is consistent (error raised if / is omitted).

Drawbacks:

  • (5) Not applicable to existing control words. Added: The Appendix at the end of this answer provides a means of redefining individual existing control words to follow this convention.

Option 5: Add # at the end of the parameter text in the definition to require { to immediately follow the control word. Impact: 1, 2, or ? additional characters.

By defining the control word with \def and placing # at the end of the parameter text, the control word will have to be followed by an opening brace (page 204 of The TEXbook). If a matching closing brace follows, TeX will group the interceding tokens and they will be added after the control word. The definition may be wrapped in \@ifdefinable to perform the same check as \newcommand and raise an error if the control word is already defined.

Definition:

Without check: \def\arnold#{Arnold Schwarzenegger}

With check (see the Appendix at the end of this answer for an alternative implementation):

\makeatletter
    \@ifdefinable{\arnold}{\def\arnold#{Arnold Schwarzenegger}}
\makeatother

Uses:

  • Space after:

    • He yelled ``Get to the choppa!'' in his best \arnold{ impression.
    • He yelled ``Get to the choppa!'' in his best \arnold{} impression.
    • He yelled ``Get to the choppa!'' in his best \arnold{ }impression.
  • Punctuation after:

    • According to \arnold{, it is pronounced Kal-e-four-knee-yah.
    • According to \arnold{}, it is pronounced Kal-e-four-knee-yah.

Benefits:

  • (2) Prevents expected trailing spaces from being removed (error raised if {, {}, or {<anything>} is omitted).
  • (3) Does not add unexpected trailing spaces.

Drawbacks:

  • (5) Not applicable to existing control words. Added: The Appendix at the end of this answer provides a means of redefining individual existing control words to follow this convention.
  • (6) Use is not consistent. The control word may be followed by {, {}, or {<anything>}.

Option 6: Use the xspace package and add \xspace at the end of the definition. Impact: 0* additional characters

This is Uri's answer. The xspace package acts after the input processor and adds a space depending on the token following the control word.

Definition: \newcommand{\arnold}{Arnold Schwarzenegger\xspace}

Uses:

  1. Space after:
    • He yelled ``Get to the choppa!'' in his best \arnold impression.
    • He yelled ``Get to the choppa!'' in his best \arnold{} impression.
    • He yelled ``Get to the choppa!'' in his best \arnold\ impression.
  2. Punctuation after:
    • According to \arnold, it is pronounced Kal-e-four-knee-yah.
    • According to \arnold{}, it is pronounced Kal-e-four-knee-yah.

Benefits:

  • (2) Prevents expected trailing spaces from being removed.

Drawbacks:

  • (3) May add unexpected trailing spaces.
  • (6) Use may not* be consistent.
  • (5) Not applicable to existing control words.

*Ideally, this approach would not require any additional characters any time the control word is used. However, in situations where it fails, a {} is necessary.


Appendix

An interface for adding a required delimiter to an existing parameterless macro producing text only.

\documentclass{article}

\makeatletter
\newcommand\requiredelimiter[2][########]{%
  \ifdefined#2%
    \def\@temp{\def#2#1}%
    \expandafter\@temp\expandafter{#2}%
  \else
    \@latex@error{\noexpand#2undefined}\@ehc
  \fi
}
\@onlypreamble\requiredelimiter
\makeatother

\requiredelimiter{\LaTeX}

\newcommand\arnold{Arnold Schwarzenegger}
\requiredelimiter[/]{\arnold}

\requiredelimiter{\foo} % <---- ERROR

\begin{document}

\LaTeX{} is nice

\arnold/ is strong

\end{document}

Without an optional argument, the (redefined) macro will require a pair of braces after it, like \LaTeX in the example. With the optional argument the specified token(s) will be required instead, like for \arnold in the example.

share|improve this answer
1  
I added an appendix with an interface for (re)defining a macro needing a delimiter. Feel free to remove it if you don't think it fits in your answer. – egreg Feb 1 at 10:23
    
@egreg: Excellent addition, as always! I've edited the question to tie the options to the appendix. Out of curiosity, do you prefer one of the options above over the others? – Guho Feb 1 at 20:02
1  
@Guho had a discussion about this in chat a few weeks ago: chat.stackexchange.com/transcript/message/27000774#27000774 – StrongBad Feb 1 at 20:04
1  
Apparently {} is faster than \ . – StrongBad Feb 1 at 20:12
    
@StrongBad: Thanks for the link. I haven't ventured into chat yet, so I was unaware this was discussed so recently. Interesting to read the differing preferences among the experts. I hadn't even considered performance differences! – Guho Feb 1 at 20:16

I do not recommend this, but for the sake of completeness, a macro name with a single non-letter character do not gobble the spaces after the macro:

\documentclass{article}
\def\æ{Arnold Schwarzenegger}
\begin{document}
\æ is an actor.  
\end{document}
share|improve this answer
    
Note that \@ is a predefined command in LaTeX. There are others to choose from. – egreg Apr 28 '15 at 22:09
    
@egreg yes, is not the best example. may be better – Fran Apr 28 '15 at 22:17
1  
The edit is even worse. Better a seven bit character – egreg Apr 28 '15 at 22:27
    
@egreg Why worse? Because is too similar to \ae ? – Fran Apr 28 '15 at 22:33
    
@Fran, I think that vanilla TeX ignores non-7-bit characters. I forget which variants (if any) are OK with the full Unicode spectrum. (My wife, who is Italian, frequently runs into this trouble when TeXing her documents, which contain accented letters aplenty, on my computer.) – L Spice Apr 29 '15 at 2:19

This is also an answer to this How to define a macro which does not read the next token after itself? question, hence two variants of definition. * is here a character that will never be a true argument.

\documentclass{article}

\begin{document}

%\newcommand{\ACROeg}{e.\,g.}
\def\ACROe*{e.\,g.}
This is a sample sentence, \ACROe* it does not make much sense.

\def\arnold*{Arnold Schwarzenegger}
\arnold* is a
\end{document}

enter image description here

share|improve this answer
    
Why “prematurely closed”? Don't you think it was a duplicate? Spreading the information across multiple questions is what this site tries to avoid. – egreg Oct 15 '14 at 21:52
1  
@egreg There was no time to put there an answer, as we can assume, probably better for OP. Closing duplicates is OK for me but not near immediately. Hence “prematurely closed”. But probably I do not catch customaries of this site correctly. – Przemysław Scherwentke Oct 15 '14 at 22:01
2  
@PrzemysławScherwentke A duplicate should be closed as soon as possible exactly in order to avoid spreading the information across questions. You had an additional answer? Fine, but this question is the proper place. – egreg Oct 15 '14 at 22:16
1  
Interesting, but why is typing \arnold* any shorter than \arnold\ . This also has an issue with already defined macros (\TeX for example). – Peter Grill Oct 23 '14 at 20:54
1  
@PeterGrill It is rather, as mentioned, an answer to the closed question and there \ACROeg and \ACROe* have the same length. – Przemysław Scherwentke Oct 23 '14 at 21:54

Yes, look at the xspace package.

\usepackage{xspace}

And later on...

\newcommand{\arnold}{Arnold Schwarzenegger\xspace}
share|improve this answer
    
It's a tricky one. My advisor years ago told me about it or I would never have found it. – Uri Feb 4 '09 at 19:16
2  
Note this will not work when you enclose it in braces again: \newcommand{\arnold}{{Arnold Schwarzenegger\xspace}} This would be useful in situations where you must enclose your commands anyway, e.g. in combination with the soul package: \hl{foo \arnold bar} would not work unless you enclose it in additional braces. – math Mar 29 '12 at 12:15
22  
Importantly related: Drawbacks of xspace – doncherry Dec 15 '12 at 19:28

Apart from using an empty statement

\hello{} world

You can also use a tilde as an explicit space:

\hello~world

Make sure not to put another space after the tilde, as this will result in two spaces.

share|improve this answer
29  
However, this would make the phrase hello world inseparable end of a line when otherwise LaTeX would put them in separate lines. This may not be the desired behavior. – Mobius Pizza Oct 10 '12 at 10:45

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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