pgmathsetmacro 的结果在循环迭代中丢失

pgmathsetmacro 的结果在循环迭代中丢失

考虑下面的代码。

%!TEX program = lualatex
\documentclass[tikz]{standalone} 

\begin{document}

\pgfmathsetmacro{\sumk}{0}

\foreach \k in {1,2,...,10}{
  \pgfmathsetmacro{\sumk}{\k+\sumk}
  \directlua {print(\k,\sumk)}
}

\end{document}

在这个简单的例子中,我想从 1 到 10 递归求和。这只是为了重现我的问题:在下一次循环迭代中访问在循环中设置的变量,并且可能在循环结束后也访问它。

我的预期输出是(在日志中,用 lua 编写print

1   1.0
2   3.0
3   6.0
4   10.0
5   15.0
6   21.0
7   28.0
8   36.0
9   45.0
10  55.0

然而,

1   1.0
2   2.0
3   3.0
4   4.0
5   5.0
6   6.0
7   7.0
8   8.0
9   9.0
10  10.0

循环内定义的宏以后可以重复使用吗?

答案1

这里有一种方法:

\documentclass[tikz]{standalone} 

\begin{document}

\def\sumk{0}
\def\finsumk{0}
\noindent\foreach \k in {1,2,...,10}{%
  \pgfmathsetmacro{\sumk}{\k+\finsumk}%
  \xdef\finsumk{\sumk}%
  %\directlua {print(\k,\sumk)}
  \k, \finsumk\\
}

\end{document}

PS:添加lua代码代替我的简单LaTeX打印方式。

输出:您想要的输出。

失败的原因:尝试将我的更改\xdef\def,您会发现它不起作用,因为每次迭代中都会丢失(得到 0)。这是因为是\sumk代码中为一次使用而扩展的值,并且\xdef首先扩展它,然后全局保存它。

答案2

事实上,TiZ/pgf 提供了一个非常简单的解决方案。对我来说,标准行为完全出乎意料。

%!TEX program = lualatex
\documentclass[tikz]{standalone} 

\begin{document}

\pgfmathsetmacro{\sumk}{0}

\foreach \k [remember=\sumk as \sumk] in {1,2,...,10}{
  \pgfmathsetmacro{\sumk}{\k+\sumk}
  \directlua {print(\k,\sumk)}
}

\end{document}

答案3

\foreach与 相比,这实际上是 的常见行为。您可以在以下位置获取有关此行为的\pgfplotsinvokeforeach更多pgfplots信息和一些示例pgf-tikz手册 § 7实用工具pgfplots手册 § 8.1实用命令。我想是因为\foreach引入了作用域,而\pgfplotsinvokeforeach没有,所以\sumk变量没有被扩展。

以下示例产生所需的输出

%!TEX program = lualatex
\documentclass[tikz]{standalone} 
\usepackage{pgfplots}
\begin{document}

\pgfmathsetmacro{\sumk}{0}

\pgfplotsinvokeforeach{1,2,...,10}{
  \pgfmathsetmacro{\sumk}{#1+\sumk}
  \directlua {print(#1,\sumk)}
}

\end{document}

相关内容