Ich habe vor kurzem ein Upgrade auf TeXLive2019 durchgeführt und der folgende Code kann in TeXLive2019 nicht kompiliert werden. Die Meldung
Undefined control sequence. <argument> \MyLastx
Aber die Kompilierung in TeXLive2018 funktioniert einwandfrei.
Wenn ich jedoch die Kommentarzeichen aus dem
%\newcommand{\MyLastx}{1}
Zeile, dann funktioniert es auch in TeXLive2019.
Ist dies ein Problem mit TeXLive2019 oder ein Problem mit meinem Code, der in TeXLive2019 nicht hätte funktionieren sollen?
Verweise
Code:
\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}
Antwort1
Ich lehne mich mal aus dem Fenster und behaupte, dass das bei TeX live 2019 (TikZ 3.1.4b) ist zwar beabsichtigt, entspricht aber zumindest der Dokumentation. Wenn remember
die Variable zuvor außerhalb der Schleife verfügbar gemacht wurde, war dies kein dokumentiertes Verhalten und konnte nicht zuverlässig verwendet werden.
In der Dokumentation remember
heißt es (und das steht schon seit einiger Zeit – ich habe es mit 3.0.1a überprüft):
/pgf/foreach/remember=<variable> as <macro> (initially <value>)
(kein Standard)Dieser Schlüssel ermöglicht es, den in gespeicherten Elementwert
<variable>
während der nächsten Iteration zu speichern, die in gespeichert wird<macro>
. Wenn eine Variable ausgewertet wird, wird das Ergebnis dieser Auswertung gespeichert. Standardmäßig ist der Wert von für die erste Iteration Null, die optionale Anweisung (initially ) ermöglicht<variable>
jedoch, dass anfangs als definiert wird .<value>
<macro>
<value>
Der Schlüssel hierzu ist diezur Erinnerung bei der nächsten Iteration, wodurch lediglich gewährleistet wird, dass die Variable im nächsten Iterationsschritt verfügbar ist, nicht jedoch nach der Schleife.
In früheren Versionen von PGF war dies nicht der Fall, was zu unerwartetem Verhalten und versehentlichem Überschreiben von Makros führte, wie inhttps://github.com/pgf-tikz/pgf/issues/702Aus diesem Grund wurde entschieden, den Gültigkeitsbereich der remember
Variablen strikt auf den Schleifenkörper zu beschränken.
Wenn Sie den Wert der Schleifenvariable aus der Schleife heraustragen möchten, können Sie eine \xdef
Zuweisung verwenden, wie inDeine AntwortZuDen letzten Wert in Tikz Foreach abrufenWenn Sie denken, dass eine Funktion hierfür allgemein nützlich wäre, können Sie eine Funktionsanfrage stellen unterhttps://github.com/pgf-tikz/pgf/issues.