Leerzeichen zwischen Makros in \edef

Leerzeichen zwischen Makros in \edef

Ich frage mich, wie man in einer Anweisung ein Leerzeichen zwischen zwei Makros bekommt edef. Mein Ziel ist es, einen Dateinamen des Formulars FirstName LastNamein einem Makro zu speichern und dieses Makro später in einem includegraphicsBefehl 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 \PictureNameoder 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 \edeflassen 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 \edefausdehnt \FirstName(ohne auch nur zu betrachten\space ), und dann wird es zu einem Leerzeichen-Token erweitert \spaceund dann erweitert \LastName.

Die \@firstofoneMethode 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 \LastNamewird 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}%

verwandte Informationen