Makro und Leerzeichen (lookahead?)

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


RalfR
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 13. Okt 2010, 19:00

Makro und Leerzeichen (lookahead?)

Beitrag 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

Xenara
Forum-Meister
Forum-Meister
Beiträge: 682
Registriert: Mi 25. Nov 2009, 09:41

Beitrag 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}

RalfR
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 13. Okt 2010, 19:00

Beitrag 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!

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag 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}

RalfR
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 13. Okt 2010, 19:00

Beitrag 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

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

Als kompakte und umfassende Einführung empfehle ich auch gerne TeX by Topic (kostenlos, bei den meisten Distributionen dabei).

Antworten