我试图将我的树放在一张 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
,您的目标使用无衬线字体,而您的代码根本没有使用文本字体。如果您想要文本字体,请删除math content
。如果您想要无衬线字体,请添加font=\sffamily
到for tree
列表中。
以下是一个可行的方法草图。它很容易放在 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}