绕过线来绘制包林中的节点

绕过线来绘制包林中的节点

我正在尝试使用森林包创建一棵树,其中叶节点都在同一层。

但是,连接较高节点的线会穿过其他节点。有没有什么方法可以防止此包出现这种情况?

以下是相关代码片段:

\begin{forest}    
    where n children=0{tier=word}{}    
    [equation, %for tree={parent anchor=south, child anchor=north}    
        [VARIABLE[y]]    
        [{=}]    
        [expression    
            [additionOrSubtraction    
                [multiplicationOrDivision    
                    [atom[VARIABLE[x]]]    
                ]    
                [{*}]    
                [atom    
                    [{(}]    
                    [expression    
                        [additionOrSubtraction    
                            [multiplicationOrDivision    
                                [atom[INTEGER[2]]]    
                            ]    
                            [{+}]    
                            [multiplicationOrDivision    
                                [atom[INTEGER[3]]]    
                                [{*}]    
                                [atom[VARIABLE[x]]]    
                            ]    
                        ]    
                    ]    
                    [{)}]    
                ]    
            ]    
        ]    
    ]        
\end{forest}

这是其图片: 这是问题的图片

答案1

我首先将路径设置为使用正交边缘(在edge path森林手册第 33 页的部分中描述)。理论上也可以使用弯曲路径,但我认为这会花费更多的时间。

s sep接下来,我根据具体情况, 通过增加数值(手册第 32 页所述)来扩大儿童之间的距离。在某些级别,10 毫米就足够了,但在其他级别,20 毫米是必要的。

我不确定您是否会用符号或图标替换“multiplicationOrDivision”和类似的字符串(我建议这样做 - 或者允许在这些字符串中换行),所以我只是快速估算了一下距离。当然,对于发布来说,它们仍然需要进行微调。

不幸的是,图片尺寸变大了一点。也许 asidewaysfigure或 a\resizebox可以让它适合你需要的上下文?

结果:科尔塔克的树

代码:

 \documentclass{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}for tree={% 
    edge path={\noexpand\path[\forestoption{edge}] (!u.parent anchor) -- +(0,-\baselineskip) -| (.child anchor)\forestoption{edge label};}},
    where n children=0{tier=word}{}    
    [equation, s sep=15mm %for tree={parent anchor=south, child anchor=north}    
        [VARIABLE[y]]    
        [{=}]    
        [expression    
            [additionOrSubtraction, s sep=20mm
                [multiplicationOrDivision
                    [atom[VARIABLE[x]]]    
                ]    
                [{*}]    
                [atom, s sep=20mm
                    [{(}]    
                    [expression    
                        [additionOrSubtraction, s sep=20mm
                            [multiplicationOrDivision    
                                [atom[INTEGER[2]]]    
                            ]    
                            [{+}]    
                            [multiplicationOrDivision, s sep=10mm  
                                [atom[INTEGER[3]]]    
                                [{*}]    
                                [atom[VARIABLE[x]]]    
                            ]    
                        ]    
                    ]    
                    [{)}]    
                ]    
            ]    
        ]    
    ]        
\end{forest}
\end{document}

答案2

如果方形边缘是可以接受的,那么它们可能会制作出最整洁的树,正如建议的那样。

但是,不需要手动配置,因为当前 Forestforked edges在其edges库中提供了此功能。

\usepackage[edges,linguistics]{forest}

在树的序言中

  forked edges,

我还建议fit=band避免手动移动物品或通过反复试验找出正确尺寸的需要。

  for tree={%
    fit=band,
  },

inner xsep=0pt除最后一层外的所有节点的设置也可能有帮助。

  where n children=0{%
    tier=word,
  }{%
    inner xsep=0pt,
  },

我还将其拆分...Or...为多行节点。我不知道这对您的使用是否可接受,但它确实使图表更易于管理。

我建议设置几个宏:一个用于加法/减法,一个用于乘法/除法。这样,您只需修改序言中的通用宏定义,就可以尝试不同的选项。

例如:

\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}

还有星号 - 这些应该放在中间而不是顶部吗?您可能需要考虑对最后一层节点使用数学模式。

\newcommand*\asthere{\textasteriskcentered}

然后树规范

  [equation
    [VARIABLE[y]]
    [{=}]
    [expression
      [\addorsub
        [\multordiv
          [atom
            [VARIABLE
              [x]
            ]
          ]
        ]
        [\asthere]
        [atom
          [{(}]
          [expression
            [\addorsub
              [\multordiv
                [atom
                  [INTEGER
                    [2]
                  ]
                ]
              ]
              [{+}]
              [\multordiv
                [atom
                  [INTEGER
                    [3]
                  ]
                ]
                [\asthere]
                [atom
                  [VARIABLE
                    [x]
                  ]
                ]
              ]
            ]
          ]
          [{)}]
        ]
      ]
    ]
  ]

产生一些相当整洁的东西,即使不是非常紧凑,至少也更加包含。

更包含树

完整代码:

\documentclass[border=5pt,tikz,multi]{standalone}
\usepackage[edges,linguistics]{forest}
\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}
\newcommand*\asthere{\textasteriskcentered}
\begin{document}
\begin{forest}
  where n children=0{%
    tier=word,
  }{%
    inner xsep=0pt,
  },
  for tree={%
    fit=band,
  },
  forked edges,
  [equation
    [VARIABLE[y]]
    [{=}]
    [expression
      [\addorsub
        [\multordiv
          [atom
            [VARIABLE
              [x]
            ]
          ]
        ]
        [\asthere]
        [atom
          [{(}]
          [expression
            [\addorsub
              [\multordiv
                [atom
                  [INTEGER
                    [2]
                  ]
                ]
              ]
              [{+}]
              [\multordiv
                [atom
                  [INTEGER
                    [3]
                  ]
                ]
                [\asthere]
                [atom
                  [VARIABLE
                    [x]
                  ]
                ]
              ]
            ]
          ]
          [{)}]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

相关内容