我在使用 賦值時遇到困難\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
}
或使用\lx1
as 巨集:
\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
更有效率和優雅。