我想绘制一些东西,tikz
其中内循环的范围取决于外循环(通过构建所涉及的数学)。我需要区分内循环中的偶数和奇数,因此我的第一个方法是定义范围,\foreach \ell in {[begin],[begin+2],...,[end]}
然后在循环中分别处理\ell
和\ell+1
(此带有方括号的代码无法运行,有关实际示例,请参阅下面的 MWE)。
问题是 - 与我的预期相反 - 对于出现的最小范围,tikz
评估\foreach \ell in {-1,1,...,-1}
为\ell in {-1,1}
)。文档(第 910 页)说(方括号和强调是我的):
在这种情况下,列表阅读的部分
x,y,...,z
被替换x,x+d,x+2d,...,x+md
,其中 [d=y-x
和] 最后的点是语义点,而不是句法点。该值m
是最大数,使得x+md<=z
如果d
为正,或者如果x+md>=z
为d
负。
我的解释是,就我的情况而言应该是这样的m
,0
但实际上可能很难实现 - 或者这种行为甚至可能是故意的。
无论如何,我都想避免拆分循环,并想找到解决方法。我猜可以根据奇偶性构建一个 if 子句\ell
(以区分偶数和奇数,并避免指定列表的第二个值),在我看来这也不太优雅。但就目前情况而言,也许没有办法解决这个问题……
作为我希望我的代码看起来像的样子的简要概述,这是一个 MWE(期望的结果应该只是一个带有(1,1)
标签“1”的节点):
\documentclass{article}
\usepackage[english]{babel}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \j in {1} % scale (normally more!)
{
% do something per scale here
\pgfmathsetmacro{\z}{2^(\j-1)}
\pgfmathsetmacro\istart{-\z}
\pgfmathsetmacro\isecond{\istart+2}
\pgfmathsetmacro\iend{\z-2}
\foreach \ell in {\istart,\isecond,...,\iend}
{
% do something for \ell here
\node at (\ell,\ell) {\ell}; % just for illustration
% do something for \ell+1 here
}
}
\end{tikzpicture}
\end{document}
答案1
TikZ 不会求解x+md<z
方程式来得出正确的结果m
。d
在这种情况下,它会在 (!) 评估和处的循环后开始添加\isecond - \istart
数量,因为这些点是给定的。然后检查是否没有,然后退出2
\istart
\isecond
1+2 < -1
我受够了。
\ifodd, \ifeven
如果要在 foreach 内部进行分支,可以使用if 子句。或者,您可以使用\pgfmathiseven{<number>}
并检查\pgfmathresult
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \j in {1,...,4}
{
\ifodd\j\relax
\node at (0,\j) {odd};
\else
\node at (\j,0) {even};
\fi
}
\end{tikzpicture}
\end{document}