최근에 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.