TeXLive2019 中与 \foreach \x[remember=\x as \MyLastx] 相关的更改

TeXLive2019 中与 \foreach \x[remember=\x as \MyLastx] 相关的更改

我最近刚刚升级到 TeXLive2019,下面的代码无法在 TeXLive2019 中编译,并显示以下消息

Undefined control sequence. 
<argument> \MyLastx 

但在 TeXLive2018 中编译得很好。

但是,如果我取消注释

%\newcommand{\MyLastx}{1}

行,那么它也可以在 TeXLive2019 中使用。

这是 TeXLive2019 的问题还是我的代码的问题,该代码不应该在 TeXLive2019 中运行?

参考

代码:

\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}

答案1

我要大胆地说,使用 TeX live 2019 (TiZ 3.1.4b) 是故意的,但至少与文档一致。如果remember先前将变量置于循环之外,则这不是记录的行为,并且不可信赖。

文档中remember说(并且已经说了很长一段时间了——我检查了 3.0.1a)

/pgf/foreach/remember=<variable> as <macro> (initially <value>)(无默认值)

<variable>此键允许在下一次迭代中记住存储在 中的项值,存储在 中<macro>。如果对变量进行求值,则记住此求值的结果。默认情况下,<variable>第一次迭代的值为零,但是,可选的(最初<value>)语句允许<macro>将 最初定义为<value>

这里的关键是在下一次迭代中被记住,这仅保证变量在下一次迭代步骤中可用,但不保证在循环之后可用。

在以前的 PGF 版本中,情况并非如此,这会导致意外行为和意外的宏覆盖,例如https://github.com/pgf-tikz/pgf/issues/702。因此决定将remember变量的范围严格限制在循环体内。

如果要将循环变量的值带出循环,可以使用赋值,\xdef您的答案获取 tikz foreach 中的最后一个值。如果您认为此功能通常很有用,您可以在以下位置打开功能请求:https://github.com/pgf-tikz/pgf/issues

相关内容