foreach 循环的问题

foreach 循环的问题

我想画一些圆和正方形,然后把它们放到一个循环中。但这似乎行不通。任何帮助都很好。

\documentclass[tikz]{standalone}

\usepackage{xfp} % floating point unit f\"ur fpeval

\usepackage{tikz}
\usetikzlibrary{quotes}

\begin{document}
   \begin{tikzpicture}
      \edef\r{1.0}

         \draw circle (\r);
         \draw (-1.0*\r,\r) to (\r,\r); % oben
         \draw (-1.0*\r,-1.0*\r) to (1.0*\r,-1.0*\r); % unten
         \draw (-1.0*\r,0) to ["\fpeval{\r}"] (-1.0*\r,1.0*\r); % Mitte
         \draw (-1.0*\r,-1.0*\r) to (-1.0*\r,1.0*\r); % links
         \draw (1.0*\r,-1.0*\r) to (1.0*\r,1.0*\r); % rechts
         \pgfmathparse{sqrt(\r^2 + \r^2)}\edef\r{\pgfmathresult};

         \draw circle (\r);
         \draw (-1.0*\r,\r) to (\r,\r); % oben
         \draw (-1.0*\r,-1.0*\r) to (1.0*\r,-1.0*\r); % unten
         \draw (-1.0*\r,0) to ["\fpeval{\r}"] (-1.0*\r,1.0*\r); % Mitte
         \draw (-1.0*\r,-1.0*\r) to (-1.0*\r,1.0*\r); % links
         \draw (1.0*\r,-1.0*\r) to (1.0*\r,1.0*\r); % rechts
         \pgfmathparse{sqrt(\r^2 + \r^2)}\edef\r{\pgfmathresult};

         \draw circle (\r);
         \draw (-1.0*\r,\r) to (\r,\r); % oben
         \draw (-1.0*\r,-1.0*\r) to (1.0*\r,-1.0*\r); % unten
         \draw (-1.0*\r,0) to ["\fpeval{\r}"] (-1.0*\r,1.0*\r); % Mitte
         \draw (-1.0*\r,-1.0*\r) to (-1.0*\r,1.0*\r); % links
         \draw (1.0*\r,-1.0*\r) to (1.0*\r,1.0*\r); % rechts
         \pgfmathparse{sqrt(\r^2 + \r^2)}\edef\r{\pgfmathresult};

         \draw circle (\r);
         \draw (-1.0*\r,\r) to (\r,\r); % oben
         \draw (-1.0*\r,-1.0*\r) to (1.0*\r,-1.0*\r); % unten
         \draw (-1.0*\r,0) to ["\fpeval{\r}"] (-1.0*\r,1.0*\r); % Mitte
         \draw (-1.0*\r,-1.0*\r) to (-1.0*\r,1.0*\r); % links
         \draw (1.0*\r,-1.0*\r) to (1.0*\r,1.0*\r); % rechts
         \pgfmathparse{sqrt(\r^2 + \r^2)}\edef\r{\pgfmathresult};

         \draw circle (\r);
         \draw (-1.0*\r,\r) to (\r,\r); % oben
         \draw (-1.0*\r,-1.0*\r) to (1.0*\r,-1.0*\r); % unten
         \draw (-1.0*\r,0) to ["\fpeval{\r}"] (-1.0*\r,1.0*\r); % Mitte
         \draw (-1.0*\r,-1.0*\r) to (-1.0*\r,1.0*\r); % links
         \draw (1.0*\r,-1.0*\r) to (1.0*\r,1.0*\r); % rechts
         \pgfmathparse{sqrt(\r^2 + \r^2)}\edef\r{\pgfmathresult};

      \foreach \I in {1, ..., 5}{
         \draw circle (\r);
         \draw (-1.0*\r,\r) to (\r,\r); % oben
         \draw (-1.0*\r,-1.0*\r) to (1.0*\r,-1.0*\r); % unten
         \draw (-1.0*\r,0) to ["\fpeval{\r}"] (-1.0*\r,1.0*\r); % Mitte
         \draw (-1.0*\r,-1.0*\r) to (-1.0*\r,1.0*\r); % links
         \draw (1.0*\r,-1.0*\r) to (1.0*\r,1.0*\r); % rechts
         \pgfmathparse{sqrt(\r^2 + \r^2)}\edef\r{\pgfmathresult};
      }
   \end{tikzpicture}
\end{document}

答案1

使用\pgfmathsetmacro、节点和节点上方的标签(概念与@Qrrbrbirlbel 的回答非常相似:+1):

\documentclass[margin=3mm, tikz]{standalone}

\usepackage{xfp} % floating point unit f\"ur fpeval

\usepackage{tikz}
\usetikzlibrary{quotes}
\usepackage{pgfmath}

\begin{document}
   \begin{tikzpicture}[
every label/.style = {font=\footnotesize}
                        ]
      \edef\r{1.0}
\foreach \i in {0,1,...,4}
{
   \pgfmathsetmacro{\R}{+sqrt(2)^\i*\r} %
\node[draw, minimum size=2*\R cm, label=\R] {};
\node[circle, draw, minimum size=2*\R cm] {};
}
   \end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

循环主体中的赋值\foreach是局部的。您可以使用\global\edef/使其成为全局的\xdef

\pgfmathparse{sqrt(\r^2 + \r^2)}\xdef\r{\pgfmathresult}

然而这会破坏\r(把变音环在信上)。即使你不需要这样做,我也不建议你这样做。

\foreach提供了更好的选择:

对于你的情况,你会想要这样的东西:

\foreach \I[
  evaluate={\nextR = \r * sqrt 2;},
  remember=\nextR as \r (initially 1)
] in {1, ..., 5}{

对于每个实例\foreach都会进行评估\r * sqrt 2(相当于原来的sqrt(\r^2+\r^2))并将其存储在中\nextR,就像您已经完成一样

\pgfmathsetmacro\nextR{\r * sqrt 2}

并且这个被评估的\nextR将是\r下一个循环的,除了第一次(通过使用声明\r)。1(initially 1)

我擅自使用rectangle路径操作替代链接)并使用现代语法来指定圆的半径radius=…代替(…))。

代码

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \i[
  evaluate={\nextR = \r * sqrt 2;},
  remember=\nextR as \r (initially 1)
] in {1,...,10} {
\draw circle[radius=\r]
  (-\r, -\r) rectangle (\r,\r)
  node[left] at (-\r,.5*\r) {\pgfmathprintnumber{\r}}
  ;
}
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容