我正在尝试用 制作树tikz-qtree
。我希望每个“分裂”的节点都是一个黑色圆圈,具体来说,我希望根节点是黑色圆圈。我不知道如何做到这一点。
\documentclass[a4paper, 11pt]{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{positioning}
\begin{document}
\begin{figure}[t]
\begin{tikzpicture}[sibling distance=10mm, level distance=10mm, ->,
every node/.append style={midway},
every circle node/.append style={fill=black}]
\node (Source) [circle] {}
child {node (He) {He} edge from parent node[left] {\scriptsize A}
}
child {node (gave) {gve} edge from parent node[right] {\scriptsize A}}
child {node (an apple) [circle] {}
{
child {node (an) {an} edge from parent node[left] {\scriptsize E}}
child {node (apple){apple} edge from parent node[right] {\scriptsize C}}
} edge from parent node[right] {\scriptsize P} }
;
\end{tikzpicture}
\end{figure}
\end{document}
这是我收到的包裹
\documentclass[a4paper, 11pt]{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{positioning}
\begin{document}
\begin{figure}[t]
\begin{tikzpicture}[sibling distance=10mm, level distance=10mm, ->,
every node/.append style={midway},
every circle node/.append style={fill=black}]
\Tree [
\edge node[auto=right]{\scriptsize A}; He
\edge node[auto=left]{\scriptsize P}; gave
\edge node[auto=right]{\scriptsize A};
[
\edge node[auto=right]{\scriptsize A}; an
\edge node[auto=left]{\scriptsize P}; apple
]]
\end{tikzpicture}
\end{figure}
\end{document}
答案1
下面是一个使用 Forest 的简单版本,它允许您说“每个具有 2 个或更多子节点的节点都是一个实心的圆”:
\documentclass[border=11pt]{standalone}
\usepackage[linguistics]{forest}
\begin{document}
\begin{forest}
before typesetting nodes={
where content={}{coordinate}{},
where n children>=2{circle, fill}{},
},
/tikz/my label look/.style={
font=\scriptsize,
pos=.6,
inner sep=1pt,
fill=white,
},
my label/.style={
if={
>Ow+P{n}{isodd(##1)}
}{
edge label={node [my label look, anchor=south east] {#1}}
}{
edge label={node [my label look, anchor=south west] {#1}}
}
},
for tree={
edge+={->},
l'+=7.5pt,
}
[
[He, my label=A]
[gave, my label=P]
[, my label=A
[an, my label=E][apple, my label=C]
]
[, my label=A
[to, my label=R][John, my label=C]
]
]
\end{forest}
\end{document}
编辑
circles at splits
如果您希望多棵树使用相同的样式,可以使用以下样式。该my label
样式是独立的,因此,如果需要,也可以在其他类型的树中使用。
% ateb: https://tex.stackexchange.com/a/409170/ addaswyd o ateb borgr: https://tex.stackexchange.com/a/408920/
\documentclass[border=11pt]{standalone}
\usepackage[linguistics]{forest}
\forestset{%
circles at splits/.style={%
before typesetting nodes={
where content={}{coordinate}{},
where n children>=2{circle, fill}{},
},
for tree={
edge+={->},
l'+=7.5pt,
},
},
/tikz/my label look/.style={
font=\scriptsize,
pos=.6,
inner sep=1pt,
fill=white,
},
my label/.style={
if={
>Ow+P{n}{isodd(##1)}
}{
edge label={node [my label look, anchor=south east] {#1}}
}{
edge label={node [my label look, anchor=south west] {#1}}
}
},
}
\begin{document}
\begin{forest}
circles at splits
[
[He, my label=A]
[gave, my label=P]
[, my label=A
[an, my label=E][apple, my label=C]
]
[, my label=A
[to, my label=R][John, my label=C]
]
]
\end{forest}
\end{document}
以下是评论中要求的关于风格的一些解释。有关更多详细信息,请参阅 Forest 手册。
\usepackage[linguistics]{forest}
linguistics
安装一些通常适用于语言学树的默认值,但也适用于其他类型的树。例如,这会影响边连接的方式。尝试删除此选项并重新编译以查看差异。虽然这里没有使用,但此选项还提供各种非标准样式,例如nice empty nodes
、sn edges
和roof
。
\forestset{%
circles at splits/.style={%
创建一种circles at splits
可应用(或不应用)于任何树的样式。
before typesetting nodes={
这会延迟处理键的参数,直到 Forest 解析完树为止。Forest 的工作分为不同的“阶段”,这对于某些类型的定制至关重要。在这里,我们希望content
在排版节点之前、解析完节点内容之后检查节点。
where content={}{coordinate}{},
这适用于整个树,当节点没有内容时,形状设置为coordinate
。当节点有内容时,则不执行任何操作。这可以避免节点为空时出现难看的间隙。
where n children>=2{circle, fill}{},
这将遍历树并查找所有至少有 2 个子节点的节点。在这些情况下,circle, fill
将使用选项,这些选项将传递给 Ti钾Z,因为它们不被识别为森林钥匙。
},
延迟处理结束。
for tree={
edge+={->},
l'+=7.5pt,
},
for tree
遍历树的所有节点。对于每个节点,->
都会添加到应用于节点的选项edge
(即来自父节点的线)中,并且级别距离会增加 7.5pt。(级别之间的实际距离取决于多种因素,并且l
根据执行它的 Forest 阶段会产生不同的效果。但这对我们来说已经足够了 - 它会垂直拉伸树并稍微拉开空间。这可以避免我们的边缘标签过于拥挤。)当节点的内容非常小或为零,但边缘或节点周围有标签时,通常需要调整间距,因为 Forest 不会自动考虑标签占用的空间。
},
风格的终结circles at splits
。
/tikz/my label look/.style={
font=\scriptsize,
pos=.6,
inner sep=1pt,
fill=white,
},
这只是一个标准的 Ti钾Z 风格具有常用选项。
my label/.style={
另一种森林风格。这旨在应用于特定节点,而不是整个树。它需要一个参数,该参数将成为节点边缘的标签。
if={
>Ow+P{n}{isodd(##1)}
这将检查该节点是奇数子节点还是偶数子节点。
}{
edge label={node [my label look, anchor=south east] {#1}}
如果是奇数,我们将锚点设置为south east
,因此标签将向左移动。我们还应用my label look
Ti钾Z 样式。参数成为边缘上的标签的内容。
}{
edge label={node [my label look, anchor=south west] {#1}}
类似地,如果节点是偶数,只是将锚点设置为south west
,这样标签就会向右移动。
}
},
}
就这样,我们就完成了。
答案2
我设法做到了,这里是其他希望做类似事情的人的方法。基本上,需要做的是在用“[”打开相关分割后,用“。”添加节点。
\documentclass[a4paper, 11pt]{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{positioning}
\begin{document}
\begin{figure}[t]
\begin{tikzpicture}[sibling distance=10mm, level distance=10mm, ->,
every node/.append style={midway},
every circle node/.append style={fill=black}]
\Tree [.\node [circle] (rootu) {};
\edge node [auto=right]{\scriptsize A}; \node (Heu) {He};
\edge node[auto=right down]{\scriptsize P}; \node (gve) {gve};
\edge node[auto=right]{\scriptsize A};
[.\node [circle](an appleu) {};
\edge node[auto=right]{\scriptsize E}; \node (anu) {an};
\edge node[auto=left]{\scriptsize C}; \node (appleu) {apple};
]
\edge node[auto=right]{\scriptsize A};
[.\node [circle](for john) {};
\edge node[auto=right]{\scriptsize R};\node (for) {for};
\edge node[auto=left]{\scriptsize C}; \node (john) {john};
]]
\end{tikzpicture}
\end{figure}
\end{document}