我想画一些圆和正方形,然后把它们放到一个循环中。但这似乎行不通。任何帮助都很好。
\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
提供了更好的选择:
- 这
evaluate
钥匙和 - 这
remember
钥匙。
对于你的情况,你会想要这样的东西:
\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}