Recentemente atualizei para o TeXLive2019 e o código abaixo não consegue compilar no TeXLive2019 com a mensagem
Undefined control sequence. <argument> \MyLastx
Mas compila bem no TeXLive2018.
No entanto, se eu descomentar o
%\newcommand{\MyLastx}{1}
line então também funciona no TeXLive2019.
Isso é um problema com o TeXLive2019 ou um problema com meu código que não deveria ter funcionado no TeXLive2019?
Referências
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}
Responder1
Vou arriscar e dizer que o comportamento observado com o TeX live 2019 (TikZ 3.1.4b) é intencional, mas pelo menos consistente com a documentação. Se remember
anteriormente a variável fosse disponibilizada fora do loop, esse comportamento não seria documentado e não poderia ser confiável.
A documentação remember
diz (e já diz isso há um bom tempo – verifiquei com 3.0.1a)
/pgf/foreach/remember=<variable> as <macro> (initially <value>)
(nenhum padrão)Esta chave permite que o valor do item armazenado
<variable>
seja lembrado durante a próxima iteração, armazenado em<macro>
. Se uma variável for avaliada, o resultado desta avaliação será lembrado. Por padrão, o valor de<variable>
é zero para a primeira iteração, no entanto, a<value>
instrução opcional (inicialmente), permite que<macro>
seja inicialmente definido como<value>
.
A chave aqui é oa ser lembrado durante a próxima iteração, o que garante apenas que a variável esteja disponível na próxima etapa da iteração, mas não após o loop.
Nas versões anteriores do PGF este não era o caso, o que levou a um comportamento inesperado e substituições acidentais de macros, como emhttps://github.com/pgf-tikz/pgf/issues/702. Portanto foi tomada a decisão de restringir estritamente o escopo da remember
variável ao corpo do loop.
Se quiser transportar o valor da variável do loop para fora do loop, você pode usar uma \xdef
atribuição conforme sugerido emsua RespostaparaObtendo o último valor no tikz foreach. Se você acha que uma função para isso seria um recurso geralmente útil, você pode abrir uma solicitação de recurso emhttps://github.com/pgf-tikz/pgf/issues.