Recientemente actualicé a TeXLive2019 y el siguiente código no se compila en TeXLive2019 con el mensaje
Undefined control sequence. <argument> \MyLastx
Pero se compila bien en TeXLive2018.
Sin embargo, si descomento el
%\newcommand{\MyLastx}{1}
línea entonces también funciona en TeXLive2019.
¿Es esto un problema con TeXLive2019 o un problema con mi código que no debería haber funcionado en TeXLive2019?
Referencias
Código:
\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}
Respuesta1
Voy a arriesgarme y decir que el comportamiento observado con TeX live 2019 (TikZ 3.1.4b) es intencional, pero al menos coherente con la documentación. Si remember
previamente la variable estaba disponible fuera del bucle, ese no era un comportamiento documentado y no se podía confiar en él.
La documentación remember
dice (y ha dicho esto durante bastante tiempo; verifiqué con 3.0.1a)
/pgf/foreach/remember=<variable> as <macro> (initially <value>)
(ningún valor predeterminado)Esta clave permite
<variable>
recordar el valor del elemento almacenado en durante la siguiente iteración, almacenado en<macro>
. Si se evalúa una variable, se recuerda el resultado de esta evaluación. De forma predeterminada, el valor de<variable>
es cero para la primera iteración; sin embargo, la<value>
declaración opcional (inicialmente) permite que<macro>
se defina inicialmente como<value>
.
La clave aquí es lapara ser recordado durante la próxima iteración, que solo garantiza que la variable esté disponible en el siguiente paso de iteración, pero no después del ciclo.
En versiones anteriores de PGF este no era el caso, lo que provocaba un comportamiento inesperado y sobrescrituras accidentales de macros como enhttps://github.com/pgf-tikz/pgf/issues/702. Por lo tanto, se tomó la decisión de restringir estrictamente el alcance de la remember
variable al cuerpo del bucle.
Si desea sacar el valor de la variable del bucle fuera del bucle, puede utilizar una \xdef
asignación como se sugiere enTu respuestaaObteniendo el último valor en tikz foreach. Si cree que una función para esto sería una característica útil en general, puede abrir una solicitud de función enhttps://github.com/pgf-tikz/pgf/issues.