无foreach
(正确结果)
\documentclass[tikz,border=12pt]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[gray!10] (0,0) grid (5,5);
\draw[red] (0,0) rectangle (2,1)
[shift={(1,1)}] (0,0) rectangle (2,1)
[shift={(1,1)}] (0,0) rectangle (2,1)
[shift={(1,1)}] (0,0) rectangle (2,1)
;
\end{tikzpicture}
\end{document}
出现foreach
(错误结果)
\documentclass[tikz,border=12pt]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[gray!10] (0,0) grid (5,5);
\draw[red] (0,0) rectangle (2,1)
\foreach\i in {1,2,3}{[shift={(1,1)}] (0,0) rectangle (2,1)};
\end{tikzpicture}
\end{document}
问题
我不明白为什么转化不能通过 进行积累\foreach
。为什么?
答案1
来自文档
然而,所有变换都是当前 TEX 组的局部变换。
您的用法\foreach
与
\documentclass[tikz,border=12pt]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[gray!10] (0,0) grid (5,5);
\draw[red] (0,0) rectangle (2,1)
{[shift={(1,1)}] (0,0) rectangle (2,1)}
{[shift={(1,1)}] (0,0) rectangle (2,1)}
{[shift={(1,1)}] (0,0) rectangle (2,1)}
;
\end{tikzpicture}
\end{document}
结果如下:
您可以从范围索引计算偏移:
\documentclass[tikz,border=12pt]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[gray!10] (0,0) grid (5,5);
\draw[red] (0,0) rectangle (2,1)
\foreach[count=\j from 1] \i in {1,2,3}
{[shift={(\j*1,\j*1)}](0,0) rectangle(2,1)}
;
\end{tikzpicture}
\end{document}
或者您可以使用相对坐标:
\documentclass[tikz,border=12pt]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[gray!10] (0,0) grid (5,5);
\draw[red](0,0)coordinate(temp) rectangle (2,1)
foreach\i in {1,2,3}
{([shift={(1,1)}] temp)coordinate(temp) rectangle+(2,1)};
\end{tikzpicture}
\end{document}
两者都导致
答案2
正如已经指出的那样,foreach 循环中的每个项目似乎都包含在新的 tikz 范围内,因此,转换是局部的并且不会累积。
这是手工积累的一种方法。
\documentclass[tikz,border=12pt]{standalone}
\begin{document}
\begin{tikzpicture}
\def\transfo{}
\draw[red] foreach \i in {0,1,2,3}
{
\transfo \pgfextra{\xdef\transfo{\transfo[shift={(1,1)}]}}
(0,0) rectangle (2,1)
} ;
\end{tikzpicture}
\end{document}