无foreach(正确结果)

无foreach(正确结果)

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}

相关内容