最近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>
最初の反復処理の の値はゼロですが、オプションの (initially<value>
) ステートメントにより、 を<macro>
最初に として定義できます<value>
。
ここで重要なのは次の反復中に記憶されるは、変数が次の反復ステップでのみ使用可能であることを保証しますが、ループ後には使用できなくなります。
PGFの以前のバージョンでは、これは当てはまらず、予期しない動作や、次のような偶発的なマクロの上書きが発生しました。https://github.com/pgf-tikz/pgf/issues/702したがって、変数のスコープremember
をループ本体に厳密に制限することが決定されました。
ループ変数の値をループ外に持ち出したい場合は、次\xdef
のように代入を使用することができます。あなたの答えにtikz foreachで最後の値を取得するこの機能が非常に便利な機能だと思う場合は、次のURLで機能リクエストを投稿してください。https://github.com/pgf-tikz/pgf/issues。