我需要创建一个这样的图形:
我的糟糕代码如下。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[rounded corners=15pt]
(10,0) rectangle ++(15,3);
\begin{tikzpicture}
\draw (5,1) circle (1cm);
\end{tikzpicture}
\end{tikzpicture}
\end{document}
但是这段代码不起作用,因为圆圈会超出矩形的范围,而这并不是我想要的。
我的问题是:
为什么这段代码不起作用?在其他程序中,当你将循环放在循环内时,它会按预期工作,但在这里将 a 放在tikzpicture
a 内却不能像我预期的那样工作。也就是说,嵌套的s 在 TikZ 中通常tikzpicture
是如何工作的?tikzpicture
答案1
完全可以嵌套循环。然而,嵌套tikzpicture
环境是危险的。虽然有时可以,但应该避免。基本上,它预计会破裂。
我要做的是画圆圈第一的以及fit
它们周围的外框。例如:
\documentclass[border=5pt,tikz,multi]{standalone}
\usetikzlibrary{fit,positioning}
\begin{document}
\begin{tikzpicture}[ultra thick]
\coordinate (c0) at (0,0);
\foreach \i [count=\j, evaluate=\j as \k using \j-1, evaluate=\j as \m using { int(mod(\j,5))==0 ? "" : "draw" }, evaluate=\j as \n using { \j>10 ? "20mm" : "10mm" }] in {1,...,11}
\node (c\j) [right=7.5pt of c\k |- c0, circle, anchor=north west, minimum size=\n, \m] {};
\node [fit=(c1) (c11), draw, rounded corners=15pt, inner xsep=5mm, minimum height=30mm] {};
\end{tikzpicture}
\end{document}
如果你愿意,你可以简单地逐个绘制圆圈,然后以同样的方式绘制方框。只需命名最左边和最右边,这样你就可以说出fit=(<name 1>) (<name 2>)
一切就好了。
在这个特殊情况下,如果您真的想要,您可以嵌套 s tikzpicture
。但是,(5,1)
位于x=5cm
,正好位于 框最左边界的左侧x=10cm
。因此,要将其放入框中,您需要将其放入框中。
您还需要将其放入tikzpicture
节点中。例如:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fit,positioning}
\begin{document}
\begin{tikzpicture}
\draw [rounded corners=15pt] (10,0) rectangle ++(15,3);
\node at (12.5,1.5) {% BREAKAGE EXPECTED !!
\begin{tikzpicture}% DON"T TRY THIS AT HOME !!
\draw circle (1cm);
\end{tikzpicture}
};
\end{tikzpicture}
\end{document}
但当写
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fit,positioning}
\begin{document}
\begin{tikzpicture}
\draw [rounded corners=15pt] (10,0) rectangle ++(15,3);
\draw (12.5,1.5) circle (1cm);
\end{tikzpicture}
\end{document}
它可以更轻松地产生相同的结果,而没有伴随的风险。
答案2
许多可能的解决方案之一(考虑到第一个@cfr 评论):
\documentclass[border=11mm,
tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[
box/.style = {draw, rounded corners=15pt,
minimum width=150mm, minimum height=30mm}
]
\node (a) [box] {};
\foreach \i in {1,...,4}
\draw ($(a.west)+(1.1*\i,0.5)$) circle (5mm);
\foreach \i in {1,...,4}
\draw ($(a.west)+(5+1.1*\i,0.5)$) circle (5mm);
\draw ($(a.east)-(2,0)$) circle (10mm);
\end{tikzpicture}
\end{document}