我正在尝试用 tikz 绘制一些递归定义的序列,但遇到了一些我无法理解的行为,这是我的代码:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\f}{1}
\foreach\i in {1,...,10} {
\pgfmathsetmacro{\ff}{\i*\f}
\draw (0,\i) node {\ff};
\pgfmathsetmacro{\f}{\ff}
}
\end{tikzpicture}
\end{document}
我本来希望这会打印前十个整数的阶乘序列(向下),但我得到的是 10,9,...,1。发生了什么?我该如何在 Tikz 中处理这种递归定义的函数?
答案1
循环中的代码foreach
位于 TeX 组中,因此所有定义都属于该组。\global\let\f=\ff
在循环末尾添加。正如 egreg 在其评论中所建议的那样,名称较短的全局宏很可能会破坏某些东西。您可以\f
使用较长的名称进行重命名。
另一个问题:$7!$
TeX 可计算的最大阶乘是多少(TeX 最大值是 16383.99998)。
以下是代码:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\myglobalfactorial}{1}
\foreach\i in {1,...,7} {
\pgfmathsetmacro{\ff}{\i*\myglobalfactorial}
\draw (0,\i) node {\ff};
%\pgfmathsetmacro{\myglobalfactorial}{\ff}
\global\let\myglobalfactorial=\ff
}
\end{tikzpicture}
\end{document}
其他解决方案使用evaluate
和remember
键(记住的变量始终是全局的,因此选择一个长名称):
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\foreach \i [evaluate=\i as \ff using \i*\myglobalfactorial,
remember=\ff as \myglobalfactorial (initially 1)] in {1,...,7} {
\draw (0,\i) node {\ff};
}
\end{tikzpicture}
\end{document}