编辑

编辑

我正在尝试用 制作树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 nodessn edgesroof

\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将使用选项,这些选项将传递给 TiZ,因为它们不被识别为森林钥匙。

    },

延迟处理结束。

    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,
  },

这只是一个标准的 TiZ 风格具有常用选项。

  my label/.style={

另一种森林风格。这旨在应用于特定节点,而不是整个树。它需要一个参数,该参数将成为节点边缘的标签。

    if={
      >Ow+P{n}{isodd(##1)}

这将检查该节点是奇数子节点还是偶数子节点。

    }{
      edge label={node [my label look, anchor=south east] {#1}}

如果是奇数,我们将锚点设置为south east,因此标签将向左移动。我们还应用my label lookTiZ 样式。参数成为边缘上的标签的内容。

    }{
      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}

最终树

相关内容