我最近刚刚升级到 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 (Ti钾Z 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。