Beim Positionieren mehrerer Knoten, die selbst TikZ-Bilder enthalten, relativ zueinander (unter Verwendung der positioning
TikZ-Bibliothek), scheint es, als würden die Knoten in den enthaltenen Bildern leicht verschoben:
Dieses Bild ergibt sich aus dem folgenden Code
\documentclass{article}
\usepackage{tikz}
\usepackage{fp}
\usetikzlibrary{positioning}
\tikzstyle{vertex}=[circle, fill=black, minimum size=2pt, inner sep=0pt]
\newcommand{\makeTikzTree}[1]{%
\FPeval{\result}{#1/2}
\begin{tikzpicture}[thick, scale=0.4]
\draw (0, 0) -- (0, -1) node[vertex]{};
\ifodd#1
\draw (0, 1) node[vertex]{} -- (0, 0);
\foreach \x in {1, ..., \result} {
\draw (-\x, 1) node[vertex]{} -- (0, 0);
\draw (\x, 1) node[vertex]{} -- (0, 0);
}
\else
\foreach \x in {0.5, ..., \result} {
\draw (-\x, 1) node[vertex]{} -- (0, 0);
\draw (\x, 1) node[vertex]{} -- (0, 0);
}
\fi
\end{tikzpicture}
}
\begin{document}
\begin{center}
\begin{tikzpicture}
\node (tree1) {\makeTikzTree{5}};
\node [right=of tree1] (tree2) {\makeTikzTree{4}};
\node [right=of tree2] (tree3) {\makeTikzTree{7}};
\end{tikzpicture}
\end{center}
\end{document}
Beachten Sie, dass die Ausrichtung im ersten Baum einwandfrei ist. Was ist hier los? Wie kommt es, dass dies einwandfrei funktioniert, wenn absolute Positionen für die Knoten angegeben werden, aber nicht bei der relativen Positionierung?
Antwort1
Dein Code verschachtelt leider tikzpicture
s. Das ist zu vermeiden, da die Werte der pgf-Schlüssel des Umgebungsbildes vererbt werden. Das brauchst du auch nicht zu tun, TikZ hat pic
zu diesem Zweck s. Selbst dann müssen Sie sicherstellen, dass der vertex
den Anker nicht von der Positionierung erbt. right
impliziert, dass der Anker ist , was erklärt, dass alle Eckpunkte links von ihnen verbunden werden. Sie können dies vermeiden, indem Sie den Optionen von west
hinzufügen .anchor=center
vertex
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{center}
\begin{tikzpicture}[vertex/.style={circle, fill=black, minimum
size=2pt,inner sep=0pt,anchor=center},
pics/little tree/.style={code={
\pgfmathtruncatemacro{\xmax}{#1/2}
\draw (0, 0) -- (0, -1) node[vertex]{};
\ifodd#1
\draw (0, 1) node[vertex]{} -- (0, 0);
\foreach \x in {1, ..., \xmax} {
\draw (-\x, 1) node[vertex]{} -- (0, 0);
\draw (\x, 1) node[vertex]{} -- (0, 0);
}
\else
\foreach \x in {0.5, ..., \xmax} {
\draw (-\x, 1) node[vertex]{} -- (0, 0);
\draw (\x, 1) node[vertex]{} -- (0, 0);
}
\fi}}]
\node[matrix] (tree1) {\pic[scale=0.4]{little tree=5};\\};
\node[matrix,right=of tree1] (tree2) {\pic[scale=0.4]{little tree=4};\\};
\node[matrix,right=of tree2] (tree3) {\pic[scale=0.4]{little tree=7};\\};
\end{tikzpicture}
\end{center}
\end{document}
Antwort2
Wie Schrödingers Katze würde ich Ihre Bäume als implementieren pic
. Sie können Ihren Code folgendermaßen vereinfachen:
\tikzset{
vertex/.style={circle, fill=black, minimum size=2pt, inner sep=0pt},
pics/tree/.style = {
code = {
\begin{scope}[scale=0.4, thick]
\node[vertex] (0) at (0,0){};
\draw(0)--(0,1);
\foreach \x in {1,...,#1} {
\node[vertex] (n\x) at (\x-#1/2-1/2,2){};
\draw(0,1)--(n\x);
}
\end{scope}
}
}
}
Beachten Sie insbesondere, dass Sie \FPeval
oder nicht verwenden müssen \ifodd
. Außerdem \tikzstyle
wurde zugunsten von abgewertet \tikzset
.
Wenn dies vorhanden ist, ist mein Verständnis der Positionierungsbibliothek anhand von Beispielen, dass der folgende Code funktionieren sollte
\begin{tikzpicture}
\pic (tree1) at (0,0){tree=5};
\pic[right=of tree1] (tree2) {tree=4};
\pic[right=of tree2] (tree3) {tree=7};
\end{tikzpicture}
aber aus Gründen, die ich nicht verstehe, gibt dies einen Fehler aus. Anstatt dies zu verwenden, positioning library
pflanze ich die Bäume lieber manuell, um Folgendes zu erhalten:
Alternativ können Sie den netten Trick von Schrödingers Katze verwenden:
\begin{tikzpicture}
\node[matrix] (tree1) {\pic{tree=5};\\};
\node[matrix,right=of tree1] (tree2) {\pic{tree=4};\\};
\node[matrix,right=of tree2] (tree3) {\pic{tree=7};\\};
\end{tikzpicture}
Hier ist der vollständige Code:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{
vertex/.style={circle, fill=black, minimum size=2pt, inner sep=0pt},
pics/tree/.style = {
code = {
\begin{scope}[scale=0.4, thick]
\node[vertex] (0) at (0,0){};
\draw(0)--(0,1);
\foreach \x in {1,...,#1} {
\node[vertex] (n\x) at (\x-#1/2-1/2,2){};
\draw(0,1)--(n\x);
}
\end{scope}
}
}
}
\begin{document}
\begin{center}
\begin{tikzpicture}
\pic at (0,0){tree=5};
\pic at (2,0){tree=4};
\pic at (4.5,0){tree=7};
\end{tikzpicture}
\end{center}
% Schrödinger's cat's nice trick
\begin{tikzpicture}
\node[matrix] (tree1) {\pic{tree=5};\\};
\node[matrix,right=of tree1] (tree2) {\pic{tree=4};\\};
\node[matrix,right=of tree2] (tree3) {\pic{tree=7};\\};
\end{tikzpicture}
\end{document}