TeXLive2019의 \foreach \x[remember=\x as \MyLastx] 관련 변경 사항

TeXLive2019의 \foreach \x[remember=\x as \MyLastx] 관련 변경 사항

최근에 TeXLive2019로 업그레이드했는데 아래 코드가 메시지와 함께 TeXLive2019에서 컴파일되지 않습니다.

Undefined control sequence. 
<argument> \MyLastx 

그러나 TeXLive2018에서는 잘 컴파일됩니다.

그러나 주석을 제거하면

%\newcommand{\MyLastx}{1}

그러면 TeXLive2019에서도 작동합니다.

이것이 TeXLive2019의 문제입니까, 아니면 TeXLive2019에서 작동하지 않아야 하는 코드의 문제입니까?

참고자료

암호:

\documentclass{article}  
\usepackage{tikz}

\newlength{\MyWidth}

%\newcommand{\MyLastx}{1}% <--- NOT needed in TeXLive2018, but is needed in TexLive2019

\newcommand*{\ForeachOverRange}[1]{%
    \foreach \x[remember=\x as \MyLastx] in {#1} {%
        %% Do something here
        \typeout{\x}%
    }%
    \settowidth{\MyWidth}{\fbox{\MyLastx}}%
}%

\begin{document}
Some before text

\ForeachOverRange{1,...,3}

Some after text.

\end{document}

답변1

목을 내밀고 TeX live 2019(Ti)에서 관찰된 동작을 말씀드리겠습니다.케이Z 3.1.4b)는 의도적이지만 최소한 문서와 일치합니다. remember이전에 루프 외부에서 변수를 사용할 수 있도록 만든 경우 이는 문서화되지 않았으며 신뢰할 수 없는 동작입니다.

문서에는 remember다음과 같은 내용이 있습니다. (그리고 꽤 오랫동안 이 말을 했습니다. 3.0.1a로 확인했습니다.)

/pgf/foreach/remember=<variable> as <macro> (initially <value>)(기본값 없음)

이 키를 사용하면 에 저장된 항목 값을 <variable>다음 반복 중에 기억할 수 있습니다 <macro>. 변수가 평가되면 이 평가 결과가 기억됩니다. 기본적으로 첫 번째 반복의 값 <variable>은 0이지만 선택적 (초기 <value>) 문을 사용하면 을 <macro>처음에 로 정의할 수 있습니다 <value>.

여기서 핵심은다음 반복에서 기억될 것, 이는 다음 반복 단계에서만 변수를 사용할 수 있음을 보장하지만 루프 이후에는 사용할 수 없음을 보장합니다.

이전 버전의 PGF에서는 그렇지 않았으며 이로 인해 다음과 같이 예기치 않은 동작이 발생하고 실수로 매크로를 덮어쓰게 되었습니다.https://github.com/pgf-tikz/pgf/issues/702. 따라서 remember변수의 범위를 루프 본문으로 엄격하게 제한하기로 결정했습니다 .

루프 변수의 값을 루프 밖으로 가져오려면 다음 \xdef에서 제안한 대로 할당 을 사용할 수 있습니다.너의 답에게tikz foreach의 마지막 값 얻기. 이에 대한 기능이 일반적으로 유용한 기능이라고 생각되면 다음에서 기능 요청을 열 수 있습니다.https://github.com/pgf-tikz/pgf/issues.

관련 정보