我最近剛升級到 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 (TikZ 3.1.4b) 是有意為之,但至少與文件一致。如果remember
之前使該變數在循環之外可用,則該行為未記錄在案,因此無法依賴。
的文檔remember
說(並且已經說了很長一段時間了 – 我檢查了 3.0.1a)
/pgf/foreach/remember=<variable> as <macro> (initially <value>)
(無預設值)
<variable>
此鍵允許在下一次迭代期間記住儲存在 中的項目值,儲存在 中<macro>
。如果變數求值,則會記住該求值的結果。預設情況下,第一次迭代的 值<variable>
為零,但是,可選的 (initially<value>
) 語句允許<macro>
將 最初定義為<value>
。
這裡的關鍵是在下一次迭代中被記住,它僅保證該變數在下一個迭代步驟中可用,但在循環之後不可用。
在 PGF 的早期版本中,情況並非如此,這會導致意外行為和意外巨集覆蓋,如下所示https://github.com/pgf-tikz/pgf/issues/702。因此決定嚴格限制remember
變數的範圍到循環體。
如果您想將循環變數的值帶出循環,您可以\xdef
按照建議使用賦值您的答案到取得 tikz foreach 中的最後一個值。如果您認為此功能是普遍有用的功能,您可以在以下位置提出功能請求:https://github.com/pgf-tikz/pgf/issues。