Mudança relacionada a \foreach \x[remember=\x as \MyLastx] no TeXLive2019

Mudança relacionada a \foreach \x[remember=\x as \MyLastx] no TeXLive2019

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 rememberanteriormente a variável fosse disponibilizada fora do loop, esse comportamento não seria documentado e não poderia ser confiável.

A documentação rememberdiz (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 remembervariável ao corpo do loop.

Se quiser transportar o valor da variável do loop para fora do loop, você pode usar uma \xdefatribuiçã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.

informação relacionada