
Ich frage mich, wie man in einer Anweisung ein Leerzeichen zwischen zwei Makros bekommt edef
. Mein Ziel ist es, einen Dateinamen des Formulars FirstName LastName
in einem Makro zu speichern und dieses Makro später in einem includegraphics
Befehl zu verwenden.
Das Problem ist, dass alles, was ich versucht habe, ein unerwünschtes Ergebnis liefert.
\edef\PictureName{\FirstName \LastName} ➞ "FirstNameLastName"
\edef\PictureName{\FirstName{} \LastName} ➞ "FirstName{} LastName"
\edef\PictureName{{\FirstName} \LastName} ➞ "{FirstName} LastName"
\edef\PictureName{\FirstName\ \LastName} ➞ "FirstName\ LastName"
Es wird also entweder kein Leerzeichen \PictureName
oder eine zusätzliche Klammer bzw. ein Backslash gespeichert. Wie kann ich das richtig machen?
Antwort1
Das Problem, das Sie sehen, ist das übliche„TeX ignoriert Leerzeichen nach Steuersequenzen“, hier kann es jedoch nicht so behoben werden, wie Sie es bei der Erstellung einer gesetzten Ausgabe tun würden. In diesem Fall funktioniert jede Methode, die das Leerzeichen von der Steuersequenz in der Eingabe trennt (und natürlich ein Leerzeichen erzeugt):
\FirstName{} \LastName
\FirstName{ }\LastName
{\FirstName} \LastName
\FirstName\ \LastName
\FirstName\space\LastName
\@firstofone{\FirstName} \LastName % assuming the usual definition of \@firstofone
hier sind Sie jedoch in einem reinen Erweiterungskontext, und in diesem Fall benötigen Sie etwas, ein Leerzeichen oder etwas, daserweitertin ein Leerzeichen, während es von der Kontrollsequenz getrennt wird. Die Methoden mit Klammern und mit Kontrollleerzeichen funktionieren hier nicht, da Klammern nicht erweitert werden, also bleiben sie unberührt von\edef
der Erweiterung unberührt bleiben. Sie funktionieren beim Satz, da sie in diesem Kontext (eine Gruppe bilden und) verschwinden. Das Steuerleerzeichen \
wird ebenfalls nicht erweitert, also \edef
lassen wir es in Ruhe.
Sowohl Plain als auch LaTeX definieren\def\space{ }
, daher haben Sie folgende Möglichkeiten:
\edef\PictureName{\FirstName\space\LastName}
welches sich im reinen Expansionskontext von \edef
ausdehnt \FirstName
(ohne auch nur zu betrachten\space
), und dann wird es zu einem Leerzeichen-Token erweitert \space
und dann erweitert \LastName
.
Die \@firstofone
Methode funktioniert auch, weil\@firstofone
sie auch mit (einer) Erweiterung funktioniert:
\edef\PictureName{\@firstofone{\FirstName} \LastName}
dadurch wird erweitert \@firstofone{\FirstName}
, was zu wird \FirstName
, was sich dann ebenfalls erweitert. Dann wird das Leerzeichen angezeigt und dann \LastName
wird erweitert. Siehe diese verwandte Frage:Umwandlung von Leerzeichen in Leerzeichen-Token
Antwort2
Damit es Spaß macht,
geben wir zwei Aufgaben, nicht nur eine.
Sie können das Spiel
durch „Recycling“ spielen \PictureName
:
Z.B:
\def\PictureName{ \LastName}%
\edef\PictureName{\FirstName\PictureName}%
Oder:
\def\PictureName{ }%
\edef\PictureName{\FirstName\PictureName\LastName}%
Oder:
\def\PictureName#1{%
\edef\PictureName{\FirstName#1\LastName}%
}%
\PictureName{ }%
Oder:
\def\PictureName#1{#1}%
\edef\PictureName{\PictureName{\FirstName} \LastName}%
Oder:
\def\PictureName#1{#1}%
\edef\PictureName{\FirstName\PictureName{ \LastName}}%
Oder:
\def\PictureName#1{#1}%
\edef\PictureName{\FirstName\PictureName{} \LastName}%
Oder:
\def\PictureName#1{#1}%
\edef\PictureName{\FirstName\PictureName{ }\LastName}%
Oder:
\def\PictureName!{}%
\edef\PictureName{\FirstName\PictureName! \LastName}%