这是我第一次使用 Tikz。我有一个使用此代码的 Tikz 树
\documentclass{standalone}
\usepackage{tikz-qtree}
\begin{document}
\tikzset{every tree node/.style={minimum width=2em,draw,circle},
blank/.style={draw=none},
edge from parent/.style=
{draw,edge from parent path={(\tikzparentnode) -- (\tikzchildnode)}},
level distance=1.5cm}
\begin{tikzpicture}
\Tree
[.c
\edge[]; [.a
]
\edge[]; [.b
]
\edge[]; [.d
\edge[]; {d1}
\edge[]; {d2}
]
\edge[]; [.e
\edge[]; {e1}
\edge[]; {e2}
]
]
\end{tikzpicture}
\end{document}
这给了我;
我想要的是“a”位于“c”的左上方,“b”位于右上方,而树的其余部分则正常向下生长。
我一直在寻找 Tikz 示例,但还没有找到一个我喜欢的。欢迎提出任何建议。谢谢。
=== 第二次迭代
\documentclass{standalone}
\usepackage{tikz-qtree}
\begin{document}
\tikzset{every tree node/.style={minimum width=2em,draw,circle},
blank/.style={draw=none},
edge from parent/.style=
{draw,edge from parent path={(\tikzparentnode) -- (\tikzchildnode)}},
level distance=1.5cm}
\begin{tikzpicture}
\Tree
[.c
\edge[]; \node(first) [draw, align=left, above=28mm, left=14mm] {\textbf{a}};
\edge[]; \node(second) [draw, align=right, above=28mm, right=14mm] {\textbf{b}};
\edge[]; [.d
\edge[]; {d1}
\edge[]; {d2}
]
\edge[]; [.e
\edge[]; {e1}
\edge[]; {e2}
]
]
\end{tikzpicture}
\end{document}
几乎给我我想要的东西,但是“a”和“b”被挤压到左边。
答案1
更新: 这是一个更通用的解决方案。
这是一个使用 的解决方案forest
,它比 更灵活qtree
。您可以使用 为各个节点添加手动调整。您可以使用 为或坐标before drawing tree
添加或减去,或者使用 设置坐标。x
y
y±=<length>,x±=<length>
y=<coordinate>,x=<coordinate>
我不清楚您是否还希望d
和e
子树被移动,以便它们相对于c
节点对称。
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={draw,circle,minimum width=2em,anchor=center}
[c
[a,before drawing tree={y=1cm,x=-1cm}]
[b,before drawing tree={y=1cm,x=1cm}]
[d
[d1]
[d2]]
[e
[e1]
[e2]]]
\end{forest}
\end{document}
为了更灵活的解决方案,如果a
和b
节点具有非空子树,您可以为节点创建两个空子节点c
并设置它们的grow
方向。但在计算空子节点的位置之前,使用before computing xy={l=0,s=0}
将空节点放置在根节点。语法if level=1{<do this>}{<else do this>}
可以放在主中for tree
。
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={minimum width=2.5em, anchor=center, circle,
if level=1{no edge, before computing xy={l=0,s=0}}{draw}}
[c
[, for tree={grow'=north}
[a[a1][a2]]
[b[b1][b2]]]
[,
[d
[d1]
[d2]]
[e
[e1]
[e2]]]]
\end{forest}
\end{document}