Änderung in Bezug auf \foreach \x[remember=\x as \MyLastx] in TeXLive2019

Änderung in Bezug auf \foreach \x[remember=\x as \MyLastx] in TeXLive2019

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 rememberdie 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 rememberheiß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 rememberVariablen strikt auf den Schleifenkörper zu beschränken.

Wenn Sie den Wert der Schleifenvariable aus der Schleife heraustragen möchten, können Sie eine \xdefZuweisung 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.

verwandte Informationen