我发现该forest
软件包在绘制树方面比 更好tikz-qtree
。我想迁移我的绘图,但是,我找不到轻松格式化树的方法。
我发现有定义样式并将它们单独应用于每个节点的方法(例如{Tikz}{Tree} 如何减少树叶的放置)。但是,我想要一种类似于tikz-qtree
您可以说every leaf node
或的语法every tree node
,并且所有节点都会自动格式化。
\documentclass[convert]{standalone}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usepackage{forest}
\tikzset{
every leaf node/.style={draw=cyan, fill=cyan!50, ellipse, text width=1cm},
every tree node/.style={draw=blue, fill=blue!50, rectangle, text width=2cm, align=center, font=\ttfamily}
}
\begin{document}
\begin{tikzpicture}
\Tree [./
[.usr
[.mji
\texttt{sh.c}
]
]
[.bin
\texttt{sh}
\texttt{ls}
]
]
\end{tikzpicture}
\begin{forest}
% insert here a similar "every leaf node"
% insert here a similar "every tree node"
[/
[usr
[mji
\texttt{sh.c}
]
]
[bin
\texttt{sh}
\texttt{ls}
]
]
\end{forest}
\end{document}
答案1
您可以使用
if n children={0}
{<style(s) when no children are present>}
{<style(s) when children are present>}
或更加可定制
if={n_children==0}
{<style(s) when no children are present>}
{<style(s) when children are present>}
的第一个参数if
将由 PGFmath 评估。如果结果为0
( false
),则将执行第三个参数,否则将执行第二个参数。
代码
\documentclass[tikz]{standalone}
\usepackage{forest}
\tikzset{
every leaf node/.style={draw=cyan, fill=cyan!50, ellipse, text width=1cm, align=center},
every tree node/.style={draw=blue, fill=blue!50, rectangle,
text width=2cm, align=center, font=\ttfamily},
tt/.style={font=\ttfamily},
}
\forestset{tikzQtree/.style={for tree={if n children=0{
node options=every leaf node/.try}{node options=every tree node/.try}}}}
\begin{document}
\begin{forest} tikzQtree, % for tree={parent anchor=south, child anchor=north}
[/
[usr
[mji
[sh.c, tt]
]
]
[bin
[sh, tt]
[ls, tt]
]
]
\end{forest}
\end{document}
答案2
请注意,我不认为forest
它更适合绘制树。它更强大,更灵活。它在某些方面尤其擅长,例如紧凑树。
但是如果你用另一个包绘制了完美的树,并且你对它们很满意,我认为重新编码它们是在浪费时间。除非你这样做是为了学习如何使用这个包,因为你只是想这样做,或者因为你在未来的项目中需要更大的灵活性。
如果您对现有的树木不满意,那就另当别论了。
但是仅仅因为某种程度上“更好”而将现有的树切换forest
为,forest
即也可以绘制其他类型的树(即使您没有尝试绘制其他类型的树),在我看来是一种拖延的做法,而不是真正具有建设性的做法。
如果您想要一些灵活性,例如您希望能够说这棵树的叶子应该是这样的,而下一棵树的叶子应该是这样的,那么您可以采取略有不同的方法。例如:
\documentclass[tikz, border=5pt, multi]{standalone}
\usepackage{forest}
\tikzset{
my colour/.style={draw=#1, fill=#1!50},
my leaf/.style={my colour=cyan, ellipse, text width=1cm, align=center},
my tree/.style={my colour=blue, rectangle, text width=2cm, align=center, font=\ttfamily},
}
\forestset{
every leaf node/.style={
if n children=0{#1}{}
},
every tree node/.style={
if n children=0{}{#1}
},
}
\begin{document}
\begin{forest}
for tree={
every leaf node={my leaf},
every tree node={my tree},
parent anchor=south,
child anchor=north
}
[/
[usr
[mji
[sh.c]
]
]
[bin
[sh]
[ls]
]
]
\end{forest}
\begin{forest}
for tree={
align=center,
thick,
every leaf node={rounded corners=2pt, text=red, draw=red!50!black},
every tree node={font=\small, text=blue!50!black, draw=blue!25!black},
grow=0
}
[long lines of text in\\a smaller font size
[this is another long line
[short\\leaf]
[short\\leaf]
]
[this is very long indeed
[short\\leaf]
]
]
\end{forest}
\end{document}