考虑下面的代码。
%!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
事实上,Ti钾Z/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}