Wenn ich einen Befehl definiere, dann verschluckt er Leerraum, wenn ich ihn verwende:

\documentclass{article}
\newcommand*\foo{foo}
\begin{document}
Das ist ein \foo Test.
\end{document}

Das Ergebnis:

Das ist ein fooTest.

Ist das normal? Wie geht man damit am besten um?

gefragt 10 Jun '13, 05:55

Clemens's gravatar image

Clemens
19.0k113060
Akzeptiert: 73%

bearbeitet 11 Jul '13, 03:28

1

Wann Leerzeichen (und Zeilenenden) eine Rolle spielen und wann nicht, ist übrigens unter http://www.komascript.de/signifikanteLeerzeichen zusammengefasst.

(26 Jun '13, 02:20) saputello

Ein bisschen Hintergrund: TeXs Befehlsequenzen können entweder aus einem oder mehreren Buchstaben bestehen. Buchstaben sind Zeichen mit Kategorie-Code 11 (=letter). Oder sie können aus nur einem Zeichen mit anderem Kategorie-Code bestehen. Wenn TeX jetzt auf das Escape-Zeichen \ stößt und direkt danach ein Buchstabe folgt, wird alles bis zum nächsten Nicht-Buchstaben als Befehlsname interpretiert:

Open in Online-Editor
\bla123 => Befehlsname = \bla

Folgt dem Escape-Zeichen ein Nicht-Buchstabe, wird nur dieses Zeichen als Befehlsname interpretiert:

Open in Online-Editor
\123 => Befehlsname = \1

Das bedeutet, dass nach einer Befehlsequenz aus Buchstaben durch Nicht-Buchstaben angezeigt werden muss, wo sie aufhört. Das kann auch ein Leerzeichen sein. Warum aber wird das Leerzeichen verschluckt. Man könnte doch auch mit einer leeren Gruppe {} anzeigen, dass sie aufhört? Nun, weil D. E. Knuth so entschieden hat. Das explizite Eingeben einer Gruppe hätte außer der zusätzlichen Tipparbeit weitere Nachteile: sie würde mögliches Kerning unterdrücken, würde Konstrukte wie \csname foo\endcsname erheblich erschweren etc.

Open in Online-Editor
\bla bla ist bequemer als \bla{}bla und erlaubt außerdem eventuelles Kerning zwischen dem letzten Buchstaben
der Expansion von \bla und dem folgenden `bla'

Fazit: das Verschlucken von Leerzeichen nach Befehlssequenzen aus Buchstaben muss man einfach akzeptieren.

Was kann man machen, wenn man eine Befehlssquenz hat und möchte folgende Leerzeichen nicht unterdrücken? Vier Möglichkeiten. Die traditionelle Lösung ist eine der folgenden:

Open in Online-Editor
\bla{} bla
\bla\ bla

Man kann -- wie topskip schon erwähnt hat -- auch auf das Paket xspace von David Carlisle zurückgreifen:

Open in Online-Editor
\usepackage{xspace}
\newcommand*\bla{bla\xspace}

jetzt geht auch \bla bla

Dazu folgendes Caveat von David Carlisle persönlich:

I originally implemented xspace a long time ago (for LaTeX 2.09) as, like most LaTeX beginners, I'd had a document where I had omitted a {} or \ and so had a missing space in the final document.

The original version used a very simple nested test for following punctuation, but it could get the test wrong in some (well rather a lot really) of cases. Morten made the tests a lot better so the current version makes the correct choice in more cases and is more easily customised) however making the tests more complicated highlights the problem with this kind of package.

The rule in TeX is really quite simple, after a command name that uses letters (as opposed to single character command names using non-letters such as \$) white space is ignored. It is easy to forget to use \ or {} but the result of forgetting is very predictable, you lose white space in the result. Conversely with xspace the macro will get the correct space most of the time, but it isn't easy to predict when it will get it wrong, and so it's much harder to learn to enter the markup in a way that is always correct rather than having to always visually check for missing space, which rather negates the purpose of the command.

So, if you find it useful, fine, it's there. But personally I wouldn't recommend it.

Ein Beispiel, warum man mit \xspace aufpassen muss:

Open in Online-Editor
\documentclass{article}
\usepackage{xspace}
\newcommand*\bla{bla\xspace}
\begin{document}

\bla -- hoppla! -- blubber

\end{document}

alt text

Als vierte Möglichkeit wird manchmal empfohlen, den Befehl mit einem sogenannten begrenzten Argument zu definieren. Der Vorteil ist, dass man eine Fehlermeldung bekommt, wenn man den Begrenzer vergisst:

Open in Online-Editor
\newcommand*\bla{} % nur, um nicht einen vorhandenen Befehl zu überschreiben
\def\bla/{bla}
\bla/ bla
\bla bla => gibt jetzt eine Fehlermeldung

Allerdings habe ich nicht nie gesehen, dass das jemand tatsächlich verwendet.

Permanenter link

beantwortet 10 Jun '13, 10:17

Clemens's gravatar image

Clemens
19.0k113060

bearbeitet 26 Aug '15, 11:29

Für dein Negativbeispiel gibt es natürlich ein \xspaceremoveexception{-}, falls man es nicht im anderen Fall benötigt.

(26 Aug '15, 12:20) Herbert

@Herbert Ich weiß :) Trotzdem danke! Das Beispiel dient auch nur als einfache Demonstration dafür, dass diejenigen, die xspace gerne verwenden wollen, eben trotzdem noch aufpassen sollten.

(26 Aug '15, 12:24) Clemens

Dazu gibt es einen Eintrag in der FAQ:

Eine Lösung besteht darin, das Ende des Befehls durch geschweifte Klammern zu markieren: „Das ist ein \foo{} Test“.

Die andere Möglichkeit ist, das Paket xspace zu benutzen:

\documentclass{article}
\usepackage{xspace}
\newcommand*\foo{foo\xspace}
\begin{document}
Das ist ein \foo Test.
\end{document}

Der Befehl \xspace schaut, was auf den Befehl folgt und fügt ggf. ein Leerzeichen ein.

Permanenter link

beantwortet 10 Jun '13, 07:48

topskip's gravatar image

topskip
25614

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×45
×21
×11
×7

Frage gestellt: 10 Jun '13, 05:55

Frage wurde angeschaut: 7,295 Mal

Zuletzt aktualisiert: 26 Aug '15, 12:24