
Ich habe eine Frage zum forest
Paket. Ich möchte den folgenden Baum ändern, um etwas vertikalen Platz zu sparen, indem ich den Ordnerstil auf einer bestimmten Ebene so ändere, dass er abwechselnd ist oder in eine andere Richtung wächst. Dazu weiß ich nicht, warum die erste Ebene nicht vertikal ausgerichtet ist.
Bonusfrage: Wie ist es möglich, eine abwechselnde Ordnerstruktur zu haben? Wie zum Beispiel
A
|-B
C-|
or even E-|-D
So etwas hätte ich gerne.
Hier ist mein MWE:
\documentclass[tikz,multi]{standalone}
\usepackage[edges]{forest}
\usetikzlibrary{arrows.meta,shadows}
\begin{document}
\begin{forest}
basic/.style = {draw, thin, drop shadow, font=\sffamily},
my root/.style = {basic, rounded corners=2pt, fill=black!2},
upper style/.style = {basic, rounded corners=6pt, fill=black!6, text width=10.5em},
lower style/.style = {basic, rounded corners=0pt,fill=black!10, text width=9em},
for tree={%
parent anchor=south,
child anchor=north,
edge path={
\noexpand\path [-{Stealth[]}, \forestoption{edge}, thin]
(!u.parent anchor) -- +(0,-5pt) -| (.child anchor)\forestoption{edge label};
},
/tikz/>=LaTeX,
},
where level=0{%
my root,
%for 1={%
for tree={%
if={level()<3}{%
upper style,
}{%
lower style,
},
if={level()<2}{%
if={isodd(n_children())}{%
calign=child edge,
calign primary child/.wrap pgfmath arg={#1}{int((n_children()+1)/2)},
}{%
calign=edge midpoint,
},
}{%
folder,
grow'=0,
},
},
}{},
[Alphabet
[First five letters, folder, grow'=0,
[A, lower style,]
[B, lower style,]
[C, lower style,]
[D, lower style,]
[E, lower style, text width=12em]
]
[Some header]
[More letters
[Two
[F]
[G]
]
[Nine
[H]
[I]
[J]
[K]
[L]
[M]
[N]
[O]
[And a longer box, text width=12em]
]
[Some more stuff
[to fill]
[this tree]
]
]
]
\end{forest}
\end{document}
Vielen Dank für Ihre Zeit!
Antwort1
Ich glaube nicht, dass der folder
Stil wirklich auf Änderungen der Wachstumsrichtung ausgelegt ist. Daher sind nachträglich einige manuelle Anpassungen erforderlich. Zumindest denke ich, dass es am einfachsten ist, den relevanten Teilbaum einfach zu verschieben, bevor der Baum gezeichnet wird.
\documentclass[border=10pt]{standalone}
\usepackage[edges]{forest}
\usetikzlibrary{arrows.meta,shadows}
\begin{document}
\begin{forest}
basic/.style = {draw, thin, drop shadow, font=\sffamily},
upper style/.style = {basic, rounded corners=6pt, edge+={-Stealth, thin}, fill=black!6, text width=10.5em},
lower style/.style = {basic, rounded corners=0pt, edge+={-, line width=.4pt}, fill=black!10, text width=9em},
where level<=2{%
upper style,
edge path'={
(!u.parent anchor) -- +(0,-5pt) -| (.child anchor)
},
}{%
lower style,
},
where level<=1{%
parent anchor=children,
child anchor=parent,
if={isodd(n_children())}{%
calign=child edge,
calign primary child/.process={
O+nw+n{n children}{(#1+1)/2}
},
}{%
calign=edge midpoint,
},
}{
folder,
grow'=0,
},
[Alphabet
[First five letters, folder, grow'=0, for children={lower style},
before drawing tree={
tempdima/.option=!r2.max y,
tempdima-/.option=max y,
for tree={
y+/.register=tempdima,
},
}
[A]
[B]
[C]
[D]
[E, text width=12em]
]
[Some header]
[More letters
[Two
[F]
[G]
]
[Nine
[H]
[I]
[J]
[K]
[L]
[M]
[N]
[O]
[And a longer box, text width=12em]
]
[Some more stuff
[to fill]
[this tree]
]
]
]
\end{forest}
\end{document}
Die weiteren Desiderata sind meiner Meinung nach mit Forest nicht möglich, ohne die Struktur des Baums zu ändern. Das heißt, Sie könnten es vortäuschen, aber Sie können einige Kinder nicht so und andere anders platzieren, ohne manuell einen Satz oder einen anderen zu verschieben. An diesem Punkt ist es wahrscheinlich einfacher, Forest aufzugeben und Ti zu verwenden.kZ um alles direkt zu platzieren.
Wenn Sie bereit sind, die Struktur des Baums zu ändern (was Sie sogar automatisch tun könnten, obwohl ich mir die Mühe nicht machen würde, es sei denn, Sie haben sehr viele mit nur diesem Muster), könnten Sie einen Koordinatenknoten verwenden, um die Wachstumsrichtung zu ändern, d. h. einige der Kinder würden Enkelkinder ihres aktuellen Elternteils werden und Sie hätten eine Koordinate als Elternteil. Sie müssten dann einen weiteren Satz von drei Koordinaten einfügen, wodurch die ursprünglichen Kinder zu Urenkelkindern ihres ursprünglichen Elternteils würden. Ich bezweifle, dass es die zusätzliche Komplexität des Codes wert ist, aber hier ist ein Beispiel.
\begin{forest}
basic/.style = {draw, thin, drop shadow, font=\sffamily},
upper style/.style = {basic, rounded corners=6pt, edge+={-Stealth, thin}, fill=black!6, text width=10.5em},
lower style/.style = {basic, rounded corners=0pt, edge+={-, line width=.4pt}, fill=black!10, text width=9em},
where level<=2{%
upper style,
edge path'={
(!u.parent anchor) -- +(0,-5pt) -| (.child anchor)
},
}{%
lower style,
},
where level<=1{%
parent anchor=children,
child anchor=parent,
if={isodd(n_children())}{%
calign=child edge,
calign primary child/.process={
O+nw+n{n children}{(#1+1)/2}
},
}{%
calign=edge midpoint,
},
}{
folder,
grow'=0,
},
[Alphabet
[First five letters, folder, grow'=0, for children={lower style},
before drawing tree={
tempdima/.option=!r2.max y,
tempdima-/.option=max y,
for tree={
y+/.register=tempdima,
},
}
[A]
[B]
[C]
[D]
[E, text width=12em]
]
[Some header]
[More letters
[Two
[F]
[G]
]
[Nine
[H]
[I]
[J]
[K]
[, coordinate, grow'=-90, for descendants={edge path'={(!u.parent anchor) |- (.child anchor)}}, before packing={calign primary child=2}
[, coordinate
[And a longer box, text width=12em]
]
[, coordinate
[N]
[O]
]
[, coordinate
[L]
[M]
]
]
]
[Some more stuff
[to fill]
[this tree]
]
]
]
\end{forest}
Warum möchten Sie übrigens, dass einige Kanten eine normale Breite haben und andere thin
? Obwohl ich es hier beibehalten habe, halte ich es für eine seltsame Idee.