我正在尝试使用森林包创建一棵树,其中叶节点都在同一层。
但是,连接较高节点的线会穿过其他节点。有没有什么方法可以防止此包出现这种情况?
以下是相关代码片段:
\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}