根节点定位和子节点水平对齐

根节点定位和子节点水平对齐

我试图将我的树放在一张 A4 纸上。不幸的是,我无法按照我的要求对齐节点。

目前看起来是这样的: 电流输出

由于我的树非常片面,我希望它看起来更像这样 - 根节点在左边,子节点以不平等的边角适合每条线,使得所有节点都适合一侧。 在此处输入图片描述

获取当前图的乳胶代码如下所示:

\documentclass{article}
\usepackage{forest}
\begin{document}
     \forestset{
          EL/.style={% abbreviation for Edge Label
              edge label={node[midway, font=\small, text=black,
              fill=white, inner sep=2pt]{$#1$}}
              }
      }

      \begin{forest}
      for tree = {
          % node style
          %circle,
          draw=none,
          minimum size = 1.5em,
          inner sep=0pt,
          math content,
          % tree style
          edge={very thick},
          s sep=1mm,
          l sep=12mm,
      }
      [plus,
          [minus, edge=blue, EL=3000000, fit=band
              [xor, edge=blue, EL=2000000
                  [distr, edge=blue, EL=2000000, fit=band
                      [something, edge=black, EL=1234567]
                      [else, edge=black, EL=1000104]
                      [example, edge=blue, EL=500001]
                      [word, edge=black, EL=1700]
                      [node, edge=black, EL=904]
                      [mul, edge=black, EL=901]
                      [division, edge=black, EL=78]
                      [plus, edge=black, EL=31]
                      [minus plus mul, edge=black, EL=3]
                  ]
              ]
              [something, edge=black, EL=1000
                  [, edge=black, EL=\dots]
              ]
              [hello, edge=black, EL=400
                  [, edge=black, EL=\dots]
              ]
              [for each, edge=black, EL=300
                  [, edge=black, EL=\dots]
              ]
              [for, edge=black, EL=20
                  [, edge=black, EL=\dots]
              ]
              [if, edge=black, EL=15
                  [, edge=black, EL=\dots]
              ]
          ]
          [else, edge=black, EL=4, fit=band
              [, edge=black, EL=\dots]
          ]
      ]
     \end{forest}

\end{document}

答案1

将第一个子项与父项对齐很简单。where n=1{calign with current edge}基本上,将对齐父项和子项锚点,使边缘在左侧垂直排列。

一致,但不太易懂

但结果不太容易理解。如果你的实际树类似,我认为你需要重新考虑它的外观。我不知道什么可能有效,但旋转一些节点并\dots用虚线边缘替换边缘节点可能会有所帮助。

fit=band告诉forest不要使用此子树下方的任何垂直空间。这就是迫使事物向右移动的原因。所以你需要删除它们。

删除 fit=band

您的代码似乎与目标外观不一致,所以我不确定您的确切意图。除了 之外fit=band,您的目标使用无衬线字体,而您的代码根本没有使用文本字体。如果您想要文本字体,请删除math content。如果您想要无衬线字体,请添加font=\sffamilyfor tree列表中。

以下是一个可行的方法草图。它很容易放在 A4 纸上,而且相当紧凑和清晰。

将庞大的树安装到 A4 上的可能方法

请注意,边缘节点仍为衬线,因为它们明确处于数学模式。由于它们是数字,所以我保留了它们。

\documentclass{standalone}
\usepackage{forest}
\begin{document}
\forestset{%
  declare toks={EL}{},
  declare boolean={turned}{0},
  EL style/.style={% abbreviation for Edge Label
    before typesetting nodes={%
      where EL={}{%
        if content={}{%
          edge+=dotted,
        }{%
        },
      }{%
        if n=1{%
          EL left/.option=EL,
        }{%
          if turned={%
            EL perp/.option=EL,edge path'={(!u.parent anchor) -| (.child anchor)},
          }{%
            EL standard/.option=EL,
          },
        },
      },
    },
  },
  EL standard/.style={edge label={node[midway,font=\small,text=black,fill=white,inner sep=2pt]{$#1$}}},
  EL left/.style={edge label={node[midway,left,font=\small,anchor=east,inner sep=2pt]{$#1$}}},
  EL perp/.style={edge label={node[pos=.75,rotate=-90,font=\small,above,inner sep=2pt]{$#1$}}},
}

\begin{forest}
  for tree = {%
    % node style
    font=\sffamily,
    % tree style
    edge={very thick,black},
    s sep'=1mm,
    l sep'=12mm,
  },
  EL style,
  where n=1{
    calign with current edge,
  }{},
  where={ > On= On= | {n}{1} {n}{0} }{
    for children={if n=1{}{turned,}},
  }{},
  where={> On= On=! & {n children}{0}{n}{1} }{turned,rotate=-90, anchor=base west, child anchor=base west,}{},
  [plus,
    [minus, edge=blue, EL=3000000
        [xor, edge=blue, EL=2000000
            [distr, edge=blue, EL=2000000
                [something,  EL=1234567]
                [else,  EL=1000104]
                [example, edge=blue, EL=500001]
                [word,  EL=1700]
                [node,  EL=904]
                [mul,  EL=901]
                [division,  EL=78]
                [plus,  EL=31]
                [minus plus mul,  EL=3]
            ]
        ]
        [something,  EL=1000
            []
        ]
        [hello,  EL=400
            []
        ]
        [for each,  EL=300
            []
        ]
        [for,  EL=20
            []
        ]
        [if,  EL=15
            []
        ]
    ]
    [else,  EL=4
        []
    ]
  ]
\end{forest}
\end{document}

相关内容