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
Makro und Leerzeichen (lookahead?)
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}
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}