forest “每个叶节点”和“每个树节点”类似语法

forest “每个叶节点”和“每个树节点”类似语法

我发现该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}

灵活的风格

相关内容