で値を割り当てるのに問題があります\foreach
。誰か助けてくれませんか? 次のコードは間違っています。目的は、たとえば、、、など\lx1=1
の\ly1=2
値を割り当てることです。\lz1=3
\foreach \x/\y in {\lx1/1,\ly1/2,\lz1/3}
{%
\def\x{\y}
\x{\y}
{
答え1
これが機能しない理由はいくつかあります。
\lx1
はコマンド名ではなく、コマンド\lx
とそれに続く数字で構成されます1
。1
文字に置き換えるか、 を介して使用方法が少し複雑になります\csname
。\x
およびには\y
x 値と y 値が含まれ、 の定義\x
は を定義します\x
が、内部のマクロは定義しません\y
。 およびはループごとに変化します。\expandafter
はマクロを 1 レベル展開します。\expandafter\def\x{...}
で同じことを行うには
\y
さらに多くの が必要になる\expandafter
ため、\let
ここでは を使用する方が簡単です。\foreach
ループ本体をグループ内に配置するため、ローカル定義は失われます。これはグローバル定義によって解決できます。
例:
\usepackage{pgffor}
\foreach \x/\y in {\lxA/1,\lyA/2,\lzA/3}
{%
\global\expandafter\let\x\y
}
または\lx1
マクロとして:
\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}
ファン向けの追加情報\expandafter
:
\gdef
\global\let
を追加することで、 の代わりに を使用できます\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}
ご覧のとおり、 のバージョンの方が\let
効率的でエレガントです。