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 (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

相關內容