에 값을 할당하는 데 문제가 있습니다 \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
와 그 뒤에 오는 digit 로 구성됩니다1
.1
문자로 바꾸 거나 를 통해 사용법이 좀 더 복잡해집니다\csname
.\x
내부 매크로가 아닌\y
x 및 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
더 효율적이고 우아합니다.