如何用 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和数字组成1。可以1用字母替换,或者使用更复杂的方法\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
}

或者使用\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更加高效,也更加优雅。

相关内容