我正在尝试在 TikZ 图片中使用计数器,并使用该计数器计算得出的值。例如,我想要的i
范围从 0 到 9,j
是i*5
和k
是i*10
。我设法通过以下方式使其工作:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,9}
{
\def \j {\pgfmathparse{\i * 5}\pgfmathresult}
\def \k {\pgfmathparse{\i * 10}\pgfmathresult}
\node at (0, -\i) {\tiny \i,\j,\k};
}
\end{tikzpicture}
\end{document}
这正如我预期的那样工作,输出为:
0,0.0,0.0
1,5.0,10.0
2,10.0,20.0
3,15.0,30.0
4,20.0,40.0
5,25.0,50.0
6,30.0,60.0
7,35.0,70.0
8,40.0,80.0
9,45.0,90.0
现在,这就是事情变得棘手的地方,我想使用辅助计数器,比如说j
作为节点的坐标:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,9}
{
\def \j {\pgfmathparse{\i * 5}\pgfmathresult}
\def \k {\pgfmathparse{\i * 10}\pgfmathresult}
\node at (0, \j) {\tiny \i,\j,\k};
}
\end{tikzpicture}
\end{document}
我最终遇到了这个错误:
! Incomplete \iffalse; all text was ignored after line 9.
<inserted text>
\fi
<*> mwe.tex
为什么不起作用?实现我想要做的事情的正确方法是什么?
答案1
您的尝试不起作用,因为直到在坐标系中使用\pgfmathparse{…}\pgfmathresult
后才会展开\j
\node
。Ti钾当然,Z 并不期望这一点,因此它无法解析坐标。要解决这个问题,您可以在定义时扩展宏。
我相信,这是您的代码最直接的类似物:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,9} {
\pgfmathparse{\i * 5}\edef\j{\pgfmathresult}
\pgfmathparse{\i * 10}\edef\k{\pgfmathresult}
\node at (0, \j) {\tiny \i,\j,\k};
}
\end{tikzpicture}
\end{document}
这是一种常见的模式,因此\pgfmathsetmacro
提供了一个快捷方式:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,9} {
\pgfmathsetmacro{\j}{\i * 5}
\pgfmathsetmacro{\k}{\i * 10}
\node at (0, \j) {\tiny \i,\j,\k};
}
\end{tikzpicture}
\end{document}
两者的结果相同。
答案2
不完全确定为什么你会得到这个,但是可以使用它evaluate
。
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach [evaluate=\i as \j using \i*5,evaluate=\i as \k using \i*10] \i in {0,...,9}
{
\node at (0, \j) {\tiny \i,\j,\k};
}
\end{tikzpicture}
\end{document}