我使用 TikZ-qtree 包绘制了一棵二叉树。
1) 我现在想将树右侧的标题与其每一层级对齐——并且我希望放置是自动的(理想情况下,我只需要指定我希望它位于树右边界的 Xpx 处,垂直定位会自行处理)。
2) 我希望能够在树中绘制几个括号,覆盖一些(连续的)节点。理想情况下,我只需指定节点,而不必关心定位!
这是我目前拥有的代码:
\documentclass{article}
\usepackage{tikz, pgf}
\usepackage{tikz-qtree}
\def\tn#1{{\bf #1}}
\begin{document}
\begin{tikzpicture}
\Tree [.0
[.0
[.0
[.{\tn 0} ]
[.{\tn 1} ] ]
[.1
[.{\tn 2} ]
[.{\tn 3} ] ] ]
[.1
[.2
[.{\tn 4} ]
[.0
[.{\tn 0} ]
[.{\tn 1} ] ] ]
[.3
[.1
[.{\tn 2} ]
[.{\tn 3} ] ]
[.2
[.{\tn 4} ]
[.0 \edge[roof]; {... } ] ] ] ] ]
\end{tikzpicture}
\end{document}
以下是我想要做的事情的一个例子:
任何帮助都非常感谢。
答案1
对于标题,您可以在第一棵树的右侧绘制第二棵树,并将分支样式设置为[draw=none]
。这将确保标题对齐。
对于下划线节点集,您需要使用命令创建起始和结束节点\node
,然后绘制下划线。对于这部分,我使用了一些非常有用的代码,由杰克,它在 TikZ 中实现了与 PSTricks\ncbar
命令等效的功能。
我还删除了您的\tn
宏,这是不需要的,因为您可以为每个终端(叶)节点定义单独的样式tikz-qtree
。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{tikz-qtree}
% The following code is due to Jake
% and implements in tikz the equivalent of PSTrick's \ncbar command
% http://chat.stackexchange.com/transcript/message/4527875#4527875
\tikzset{
ncbar/.style={
to path=(\tikztostart)
-- ($(\tikztostart)!#1!90:(\tikztotarget)$)
-- ($(\tikztotarget)!#1!-90:(\tikztostart)$)
-- (\tikztotarget)
},
ncbar/.default=0.25cm
}
% end Jake's code
\begin{document}
\begin{tikzpicture}[every leaf node/.style={font=\bfseries}]
\Tree [.0
[.0
[.0
\node (0) {0};
1 ]
[.1
2
3 ] ]
[.1
[.2
\node (4) {4};
[.0
0
1 ] ]
[.3
[.1
2
3 ]
[.2
4
[.0 \edge[roof]; {... } ] ] ] ] ]
\draw[ncbar=-.4cm] (0) to (4);
\begin{scope}[xshift=2in]
\tikzset{edge from parent/.append style={draw=none},
every tree node/.append style={font=\sffamily\bfseries}
}
\Tree [[.{V=2} [.{V=4} [.{V=8} [.{V=5} ] ]]]]
\end{scope}
\end{tikzpicture}
\end{document}
答案2
这是与实验版本 0.05 相同的树形排版justtrees.sty
。(如果您愿意充当我的小白鼠,请告诉我,以便我可以为您提供最新版本。早期版本在此网站的某个地方。)
回答这个问题时justtrees
让我修复一个以上的错误……
要在右侧添加标签,只需just=<label>
对树中相应级别的任何节点说 即可。由于标签包含=
在其中,因此在本例中需要用花括号保护它们。
节点组的括号使用新样式完成bracket me=<end node>
。这应应用于组的最左侧节点。参数应是forest
组最右侧节点的引用(名称或相对名称或别名等)。我在这里将 2 个这样的组括起来只是为了演示目的。
\documentclass[tikz,border=10pt]{standalone}
\usepackage{justtrees}% version 0.05
\begin{document}
\begin{justtree}
{
/tikz/every node/.append style={font=\sffamily},
/tikz/select/.style={font=\sffamily\bfseries},
just format={font=\sffamily\bfseries},
/forest/bracket me/.style={
tikz+={\draw [thick] (.south west) +(0,5pt) |- (#1.south east) -- +(0,5pt);}
}
}
[0
[0, just={v=2}
[0, just={v=4}
[0, just={v=8}, select, bracket me=4]
[1, select]
]
[1
[2, select]
[3, select]
]
]
[1
[2
[4, select, name=4]
[0
[0, select, bracket me=p]
[1, select]
]
]
[3
[1
[2, just={v=5}, select]
[3, select]
]
[2
[4, select, name=p]
[0
[\dots, triangle]
]
]
]
]
]
\end{justtree}
\end{document}
答案3
另一种解决方案是使用forest
:
\begin{forest}
label tree,
for tree={
circle,draw,
s sep'=10pt,
edge+=thick,
font=\strut\footnotesize\sffamily,
},
[A, name=lvl0
[B
[C, edge label={node[midway,left] {}} ]
[D]
[E
[F]
[G]
]
]
[H, name=lvl1
[I
[J]
[K]
]
[L]
[M, name=lvl2
[N, name=lvl3
]
]
]
]
\node[right=4.05cm of lvl0, Comment] {Level 0};
\node[right=1.75cm of lvl1, Comment] {Level 1};
\node[right=0.6cm of lvl2, Comment] {Level 2};
\node[right=0.6cm of lvl3, Comment] {Level 3};
\end{forest}
最小工作代码:
\documentclass[aspectratio=169,10pt]{beamer}
% \documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usepackage{forest}
\forestset{%
label tree/.style={
for tree={tier/.option=level},
level label/.style={
before typesetting nodes={
for nodewalk={current,tempcounta/.option=level,group={root,tree breadth-first},ancestors}{if={>OR={level}{tempcounta}}{before drawing tree={label me=##1}}{}},
}
},
before drawing tree={
tikz+={\coordinate (a) at (current bounding box.north);},
},
},
label me/.style={tikz+={\node [anchor=base west] at (.parent |- a) {#1};}},
}
\usetikzlibrary{arrows.meta, calc, positioning}
\tikzset{%
Comment/.style={%
draw=none,
inner sep=0mm,
outer sep=0mm,
minimum height=5mm,
align=right
},
}
\begin{document}
\begin{frame}{}
\begin{forest}
label tree,
for tree={
circle,draw,
s sep'=10pt,
edge+=thick,
font=\strut\footnotesize\sffamily,
},
[A, name=lvl0
[B
[C, edge label={node[midway,left] {}} ]
[D]
[E
[F]
[G]
]
]
[H, name=lvl1
[I
[J]
[K]
]
[L]
[M, name=lvl2
[N, name=lvl3
]
]
]
]
\node[right=4.05cm of lvl0, Comment] {Level 0};
\node[right=1.75cm of lvl1, Comment] {Level 1};
\node[right=0.6cm of lvl2, Comment] {Level 2};
\node[right=0.6cm of lvl3, Comment] {Level 3};
\end{forest}
\end{frame}
\end{document}
该代码适用于投影仪以及其他类别。