foreach を使用して値を割り当てるにはどうすればよいでしょうか?

foreach を使用して値を割り当てるにはどうすればよいでしょうか?

で値を割り当てるのに問題があります\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とそれに続く数字で構成されます11文字に置き換えるか、 を介して使用方法が少し複雑になります\csname

  • \xおよびには\yx 値と 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効率的でエレガントです。

関連情報