Seite 1 von 1

Makro und Leerzeichen (lookahead?)

Verfasst: Mi 27. Okt 2010, 15:48
von RalfR
Hallo,

ich habe ein Problem mit der Definition
eines eigenen Befehls:

\newcommand{\recipient} {Herr Müller}

Und dann bei der Verwendung

(1) Lieber \recipient,

(2) \recipient ist der Empfänger dieses Briefes.

funktioniert (2) nicht, weil das erforderliche Leerzeichen
vor dem Wot "ist" ignoriert wird.

Jetzt gibt es ja zwei einfache Lösungen:

(A)
Aus (2) wird
(2') \recipient~ist der Empfänger dieses Briefes.

(B)

\newcommand{\recipient} {Herr Müller}
\newcommand{\recipientWithSpace} {Herr Müller }

(1) Lieber \recipient,

(2) \recipientWithSpace ist der Empfänger dieses Briefes.

Beide sind nicht sehr elegant. Viel schöner wäre es,
das Makro selbst würde entscheiden, ob nachfolgend
noch ein Leerzeichen erforderlich ist, oder nicht.

Geht das?
Kann also ein Makro auf das nach ihm kommende
Zeichen zugreifen?


Danke für Antworten,

Ralf

Verfasst: Mi 27. Okt 2010, 16:10
von Xenara
Meinst du zufällig sowas wie "xspace"?
\documentclass{scrbook}
\usepackage[ngerman]{babel} 
\usepackage[ansinew]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{xspace}

\newcommand{\recipient}{Herr Müller\xspace} 

\begin{document}
Lieber \recipient,

\recipient ist der Empfänger dieses Briefes. 

\end{document}

Verfasst: Mi 27. Okt 2010, 16:31
von RalfR
Genau!

Ich habe mir mal den Quellcode von xspace
angeguckt, da verstehe ich noch nichts,
aber irgendwo dort muss ja auch die Stelle sein,
wo das Makro abfragt, ob ein Leerzeichen folgt,
und davon abhängig eins einfügt oder nicht.

Damit komme ich weiter: Danke!

Verfasst: Do 28. Okt 2010, 21:11
von phi
Man kann nicht überprüfen, ob nach einem Befehl ein Leerzeichen folgt, denn die nachfolgenden Leerzeichen werden bereits beim Einlesen verschluckt. xspace überprüft vielmehr (mittels \futurelet), ob ein Buchstabe oder ein Zeichen aus der Ausnahmenliste folgt. Eine stark vereinfachte Version von xspace ohne Ausnahmenliste könnte so aussehen:
\documentclass{minimal}

\newcommand*{\xspace}{\futurelet\next\xspaceAux}
\newcommand*{\xspaceAux}{\ifcat\noexpand\next A \fi}
\newcommand*{\Hallo}{Hallo\xspace}

\begin{document}

\Hallo Welt!

\Hallo, Welt!

\end{document}

Verfasst: Do 28. Okt 2010, 23:10
von RalfR
Danke für die präzise Antwort!

Die Makrobefehle und das Token-Konzept muss
ich erstmal verstehen, ich habe mir aber
inzwischen das TeXbook von Donald Knuth
besorgt und werde mich mal genauer
damit beschäftigen.

danke und Grüße,

Ralf

Verfasst: Fr 29. Okt 2010, 08:12
von phi
Als kompakte und umfassende Einführung empfehle ich auch gerne TeX by Topic (kostenlos, bei den meisten Distributionen dabei).