在移动锚点的同时将子节点从父节点居中对齐

在移动锚点的同时将子节点从父节点居中对齐

森林重新指定分支位置 2,如果有奇数个节点,我希望中间的节点位于中心。

手册(p71)说使用这个:

\begin{forest}
[manual correction of B
  [A[1][2][3][4]]
  [B,before computing xy={s/.average={s}{siblings}}]
  [C[1][2][3][4]]
  ]
\end{forest} 

手册第 71 页

这使得 B 很好地居中。

但是,如果我更改锚点,使边从节点的东点发出,它仍会使用节点的中心点进行计算。我该如何调整,使锚点成为节点的新中心。

 \documentclass[10pt,a4paper]{article}
 \usepackage[latin1]{inputenc}
 \usepackage{forest}
 \begin{document}
 \begin{forest}
   [top, s sep=1cm,child anchor=90
   [A,child anchor=90]
   [B,parent anchor =south,before computing xy={s/.average={s}{siblings}}]
    [{CDDDDDDDD}, parent anchor=-10
       [A]
       [B]
       [C,before computing xy={s/.average={s}{siblings}}]
       [D]
       [E]     
]
]
\end{forest}
\end{document}

即底行中的 C 垂直位于通向 ABCDE 的边的起点下方,而不是垂直位于父节点的中间下方?可能需要根据父节点内容的长度进行一些水平移动。

例子

答案1

你想要这样的东西吗?

可能的目标输出

如果是这样,我建议使用我用来对齐中间子节点的样式(如果有的话)。如果这样做,您还可以通过消除获取平均值等的需要来大大简化现有代码,并且可以删除一些(但不是全部)锚点规范。

child anchor请注意,指定根节点几乎没有任何意义。有时是有意义的,但这种情况很少见。您可能想要的是parent anchor这里。

\documentclass[border=10pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{forest}
\forestset{
  align middle child/.style={
    before typesetting nodes={
      if={
        > Ow+P {n children}{isodd(##1)}
      }{
        calign child/.process={
          Ow+n {n children}{(##1+1)/2}
        },
        calign=child edge,
      }{},
    },
  },
  align middle children/.style={
    for tree={align middle child},
  },
}
\begin{document}
\begin{forest}
  align middle children
  [top, s sep=1cm
    [A, child anchor=90]
    [B]
    [{CDDDDDDDD}, parent anchor=-10
      [A]
      [B]
      [C]
      [D]
      [E]     
    ]
  ]
\end{forest}
\end{document}

相关内容