如何用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不是命令名稱,它由 command\lx和後跟 digital組成1。要嘛1用字母替換,要嘛用法稍微複雜一點 via \csname

  • \x並包含 x 和 y 值, define\y的定義,而不是內部的巨集,並且會隨著每個循環而改變。將巨集擴展一級:\x\x\y\expandafter

    \expandafter\def\x{...}
    

    做同樣的事情\y需要更多\expandafter,因此\let 在這裡使用更容易。

  • \foreach將循環體放入群組內,因此局部定義將會遺失。這可以透過全域定義來解決。

例子:

\usepackage{pgffor}

\foreach \x/\y in {\lxA/1,\lyA/2,\lzA/3}
{%
  \global\expandafter\let\x\y
}

或使用\lx1as 巨集:

\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更有效率和優雅。

相關內容