如何将父节点对齐到树中的左侧/顶部

如何将父节点对齐到树中的左侧/顶部

我在 LATEX 中画树。这个qtree库似乎是我需要的,但是父级总是被放置在其子级的中心,如下所示:

    parent
    /    \ 
child_1 child_2

我是新用户,没有足够的声誉来发布图片。

我想要的是一棵像这样生长正常的树:

root  -- child_1  -- grandchild_1_1
      \- child_2
      \- child_3  -- grandchild_3_1
                  \- grandchild_3_2 -- great-grandchild_3_2_1
      \- child_4  -- grandchild_4_1

旋转qtree到右增长是不够的,因为父节点垂直对齐到它们的子节点的中心,但我需要它们保持在其子树的顶部。

我尝试过treesTikZ 库,它允许自定义“增长函数”来指定子节点的位置。但是它不考虑子树的大小,因此在这种情况下child_4会紧跟在 之下child_3grandchild_4_1与 重叠grandchild_3_2

有没有一种简单的方法可以“禁用”父级居中qtree?或者有没有更好的解决方案(可能是编写我自己的宏)?

答案1

我不确定这是否是您想要的,但这里有一个使用该forest包的解决方案。它提供了一个对齐参数,用于对齐节点的子节点,这可以满足您的大部分需求。我不知道您是否想要方形边缘,但它们似乎更适合这种树,(在屏幕截图中,线条看起来很奇怪,但这是屏幕渲染的产物)。我添加了一个简单的替代方案,没有方形边缘看起来更漂亮一些。

\documentclass{article}
\usepackage{forest}
\begin{document}

\begin{forest}
grow right/.style={for tree={%
  calign=last,
  grow=east,
  ,s sep=.5cm,
  parent anchor=east,
  child anchor=west,
  edge path={\noexpand\path[\forestoption{edge}] 
     (!u.parent anchor) -- +(0pt,-10pt) |- (.child anchor)
     \forestoption{edge label};}
  }
}
,grow right
[Root [Child1 ] 
      [Child2
         [GChild1 ]
         [Gchild2 ]
         [GChild3 ]
      ] 
      [Child3
         [Gchild4 ]
         [Gchild5 ]
      ]
]
\end{forest}
\hfill
\begin{forest}
[Root,for tree={calign=last,grow=east,draw, parent anchor=east,child anchor=west} [Child1 ] 
      [Child2
         [GChild1 ]
         [Gchild2 ]
         [GChild3 ]
      ] 
      [Child3
         [Gchild4 ]
         [Gchild5 ]
      ]
]
\end{forest}
\end{document}

代码输出

编辑:请注意,由于坐标为逆时针方向,子节点的排列顺序是相反的。使用块calign=first, reversed=true中的选项for tree = {...}可以生成所需的精确树,如下所示:

命令更正

答案2

这只是Alan Munn 的回答它使用edges当前版本的 Forest 的库和其他功能。因此需要版本 2+。

\documentclass[tikz,border=10pt,multi,rgb]{standalone}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
  for tree={
    grow'=0,
    parent anchor=children,
    child anchor=parent,
    anchor=parent,
    if n children=0{folder}{},
    edge path'={(!u.parent anchor) -- ++(5pt,0) |- (.child anchor)},
  },
  where n=1{
    calign with current edge
  }{},
  [Root
    [Child1]
    [Child2
      [GChild1]
      [Gchild2]
      [GChild3]
    ]
    [Child3
      [Gchild4 ]
      [Gchild5 ]
    ]
  ]
\end{forest}
\end{document}

此代码生成树的平方边版本:

方形边缘

我认为路径起点处(垂直线之前)的小偏移看起来更整洁一些,但如果愿意,可以通过将边缘路径的定义更改为来消除这一点

edge path'={(!u.parent anchor) |- (.child anchor)}, 

直角边缘无偏移

或者,完全删除此行将导致使用默认路径的树:

非平方默认边

相关内容