Ich habe Probleme, Werte mit zuzuweisen \foreach
. Kann mir jemand helfen? Der folgende Code ist falsch. Der Zweck besteht darin, die Werte zuzuweisen: \lx1=1
, \ly1=2
, \lz1=3
, zum Beispiel.
\foreach \x/\y in {\lx1/1,\ly1/2,\lz1/3}
{%
\def\x{\y}
\x{\y}
{
Antwort1
Dass dies nicht funktioniert, hat mehrere Gründe:
\lx1
ist kein Befehlsname, sondern besteht aus dem Befehl\lx
, gefolgt von einer Ziffer1
. Entweder durch einen Buchstaben ersetzen1
oder die Verwendung ist über etwas komplexer\csname
.\x
und\y
enthalten die x- und y-Werte, die Definition von\x
defines\x
, nicht das Makro darin und\y
ändern sich mit jeder Schleife.\expandafter
erweitert ein Makro um eine Ebene:\expandafter\def\x{...}
Das Gleiche mit zu tun,
\y
erfordert viel mehr\expandafter
, deshalb\let
ist die Verwendung hier einfacher.\foreach
platziert den Schleifenkörper in Gruppen, wodurch lokale Definitionen verloren gehen. Dies kann durch globale Definitionen gelöst werden.
Beispiel:
\usepackage{pgffor}
\foreach \x/\y in {\lxA/1,\lyA/2,\lzA/3}
{%
\global\expandafter\let\x\y
}
Oder mit \lx1
als Makro:
\foreach \x/\y in {\lx1/1,\ly1/2,\lz1/3}
{%
\begingroup
\escapechar=-1 % suppresses backslash with \string
\global\expandafter\let
\csname \expandafter\string\x\endcsname\y
\endgroup
}
\typeout{\expandafter\string\csname lx1\endcsname:
\expandafter\meaning\csname lx1\endcsname}
Ergänzung für die Fans von \expandafter
:
\gdef
kann anstelle von verwendet werden, \global\let
indem zusätzlich verwendet wird \expandafter
:
\foreach \x/\y in {\lxA/1,\lyA/2,\lzA/3}
{%
\expandafter\expandafter\expandafter
\gdef\expandafter\x\expandafter{\y}%
}
\typeout{\string\lxA: \meaning\lxA}
\foreach \x/\y in {\lx1/1,\ly1/2,\lz1/3}
{%
\begingroup
\escapechar=-1 % suppresses backslash with \string
\expandafter\gdef
\csname \expandafter\string\x\expandafter\endcsname
\expandafter{\y}%
\endgroup
}
\typeout{\expandafter\string\csname lx1\endcsname:
\expandafter\meaning\csname lx1\endcsname}
Wie man sieht, \let
ist die Version mit effizienter und eleganter.