Ich möchte eine Grafik erstellen, die einen Stapel von Rechtecken darstellt. Am besten wäre ein einfacher Befehl wie \stack{5}, um einen Stapel von 5 Rechtecken zu erstellen.
Ich kann den folgenden Code verwenden:
\draw[fill=blue] (0.4,-0.4) rectangle +(3,2);
\draw[fill=blue] (0.3,-0.3) rectangle +(3,2);
\draw[fill=blue] (0.2,-0.2) rectangle +(3,2);
\draw[fill=blue] (0.1,-0.1) rectangle +(3,2);
\draw[fill=blue] (0.0,-0.0) rectangle +(3,2);
Es scheint jedoch schwierig, daraus einen Befehl zu machen, und wenn wir den Stapel verschieben müssen, ist es mühsam, alle Koordinaten zu ändern. Ich dachte, das hier wäre vielleicht besser:
\draw[fill=blue] (0.4,-0.4)
rectangle +(3,2) ++(-0.1,0.1)
rectangle +(3,2) ++(-0.1,0.1)
rectangle +(3,2) ++(-0.1,0.1)
rectangle +(3,2) ++(-0.1,0.1)
rectangle +(3,2) ++(-0.1,0.1);
Das hat den Vorteil, dass sich durch das Verschieben nur die Koordinaten an einer offensichtlichen Stelle ändern und es ist sogar noch etwas klarer, was beabsichtigt ist.
Leider füllt diese zweite Version zuerst alle Rechtecke und zeichnet dann ihre Umrisse, sodass das „oberste“ Rechteck nicht den Rest des Stapels abdeckt.
Gibt es eine einfache Möglichkeit, überlappende Bereiche mit relativen Zeichenbefehlen zu zeichnen?
Antwort1
Hier ist eine Lösung, die die Tatsache ausnutzt, dass mit dem edge
Befehl erstellte Pfade getrennt sind und daher getrennt gezeichnet werden. Ein edge
Pfad ist so flexibel wie ein to
Pfad und kann daher angepasst werden, um praktisch alles zu zeichnen, einschließlich eines Rechtecks. Also definieren wir einen neuen to path
und einen edge
Stil, der ihn aufruft.
\documentclass{article}
%\url{http://tex.stackexchange.com/q/68555/86}
\usepackage{tikz}
\tikzset{
edge rectangle/.style={
to path={ rectangle (\tikztotarget)}
}
}
\begin{document}
\begin{tikzpicture}
\draw[every edge/.append style={edge rectangle,fill=blue}] (0.4,-0.4)
edge +(3,2) ++(-0.1,0.1)
edge +(3,2) ++(-0.1,0.1)
edge +(3,2) ++(-0.1,0.1)
edge +(3,2) ++(-0.1,0.1)
edge +(3,2) ++(-0.1,0.1);
\end{tikzpicture}
\end{document}
Daraus ergibt sich folgendes:
Antwort2
Sie können einfach alles in einem Befehl zusammenfassen.
\documentclass{article}
\usepackage{tikz}
\newcommand{\stack}[3][5]{
\foreach \x in {1,...,#1}
{ \draw[fill=blue] (\x/10,-\x/10) rectangle +(#2,#3); }
}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}
\stack{3}{2};
\stack[2]{-2}{3};
\end{tikzpicture}
\end{document}
Antwort3
Hier ist eine einfache Lösung basierend auf der Antwort von Andrew Swann:
\documentclass{article}
\usepackage{tikz}
% \stack{5}{(4,0)}{(3,2)}{Label} draws a stack of 5 at (4,0) with dimensions (3,2)
% and labels the center with "Label"
\newcommand{\stack}[4]{
\foreach \i in {1,...,#1} {
\draw[fill=blue!50] #2 ++({0.1*(#1)},{-0.1*(#1)}) ++({-0.1*\i},{0.1*\i}) rectangle +#3;
}
\path #2 -- +#3 node[pos=0.5] {#4};
}
\begin{document}
\begin{tikzpicture}
\stack{5}{(0,0)}{(3,2)}{I}
\stack{3}{(4,0)}{(3,2)}{II}
\stack{1}{(8,0)}{(3,2)}{III}
\end{tikzpicture}
\end{document}