我在用 分配值时遇到了麻烦。\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
更加高效,也更加优雅。