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와 그 뒤에 오는 digit 로 구성됩니다 1. 1문자로 바꾸 거나 를 통해 사용법이 좀 더 복잡해집니다 \csname.

  • \x내부 매크로가 아닌 \yx 및 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더 효율적이고 우아합니다.

관련 정보