蒂克兹

蒂克兹

我想画一棵树,而不是画出特定的边。我尝试这样做

\documentclass[preview]{standalone}
\usepackage{tikz} 
\begin{document}
   \begin{tikzpicture}[every node/.style={circle,draw}]
      \node (r) {$r$}
      child { node (T1) {$T_1$} }
      child { edge from parent[draw=none] node[draw=none] (ellipsis) {$\ldots$} }
      child { node (Tn) {$T_n$} };
   \end{tikzpicture}
\end{document}

这确实会降低中间子节点的边缘,但出于某种原因会将节点向上移动。我希望将其放置在与其兄弟节点相同的水平。如果不在和之间手动绘制节点,是否可以做到这(T1)一点(Tn)

在此处输入图片描述

答案1

编辑: 弄清楚问题是什么之后,我建议尝试以下操作:

\documentclass[border=3mm,tikz,preview]{standalone}

\begin{document}
   \begin{tikzpicture}[every node/.style={circle,draw}]
      \node (r) {$r$}
      child { node (T1) {$T_1$} }
      child {node {$\ldots$}  edge from parent[draw=none]}
      child { node (Tn) {$T_n$} };
   \end{tikzpicture}
\end{document}

在此处输入图片描述

编辑(2):感谢@cfr,他向我指出了简单的解决方案:你的行

child { edge from parent[draw=none] node[draw=none] (ellipsis) {$\ldots$} }

重新排序

 child {node[draw=none] {$\ldots$} edge from parent[draw=none]}

您将获得所需的结果。您可以在 cfr 答案中找到深入的解释。它非常有启发性。

答案2

我提出了两种解决方案。第一种使用标准的 TikZ 树语法。第二种使用功能强大的树绘制包,森林


蒂克兹

这个问题与你没有绘制边缘无关。问题是你不能用这种方式修改样式edge from parentedge from parent两个都edge绘制操作一种风格。问题中的代码混淆了这两者,但通过例子来解释会更容易。

要看到这一点,只需将行

  child { edge from parent[draw=none] node[draw=none] (ellipsis) {$\ldots$} }

  child { edge from parent[draw=green] node[draw=none] (ellipsis) {$\ldots$} }

绿边

显然,这不是正确的做法。edge from parent是一个edge绘图操作和一个style我们想要改变的风格。但是我们不能通过说 来改变 TikZ 样式(通常,无论如何)<style name>[<new options>]。这不是正确的语法。相反,我们通常会说类似

<style name>/.style={<new options>}

或者

<style name>/.append style={<new options>}

或者,在某些情况下,

<style name>={<new options>}

但我们只能在\tikzset{}TikZ 内部或期望指定样式的其他地方使用这些东西。

对于子路径,TikZ 期望edge from parent在末尾找到操作。如果我们将一个节点TikZ 假设我们想要创建一个标签在路径上,默认情况下,它位于中间。如果该节点应该是树中的节点,则它需要edge,就像在 TikZ 中绘制边缘的其他情况一样。

所以,

  child { node[draw=none] (ellipsis) {$\ldots$} edge from parent[draw=green] }

生产

树中的节点

  child { node[draw=none] (ellipsis) {$\ldots$} edge from parent[draw=green] node [draw=none, font=\scriptsize] {label} node [font=\scriptsize, at end, draw=none] {end label} }

生产

标记边

而且当然,

  child { node[draw=none] (ellipsis) {$\ldots$} edge from parent[draw=none] }

生产

正确放置树中的节点

如果我们想在任何地方指定它,我们可以这样做,但我们需要确保操作edge from parent仍然在最后进行。这是默认设置,因此不使用它就可以了。我们仍然可以更改其样式,只要我们更改其样式即可。例如,

  child { [edge from parent/.style={draw=none}] node[draw=none] (ellipsis) {$\ldots$} }

将产生相同的输出。

为了方便起见,也为了让扎科高兴,我们可以创建一个森林类似的风格更容易做到这一点:

   no edge/.style={
     edge from parent/.append style={draw=none}
   }

然后说

  child { [no edge] node [draw=none] (ellipsis) {$\ldots$} }

以产生所需的结果。

使示例完整,

\documentclass[border=10pt,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
 [
   every node/.style={circle, draw},
   no edge/.style={
     edge from parent/.append style={draw=none}
   }
 ]
  \node (r) {$r$}
  child { node (T1) {$T_1$} }
  child { [no edge] node [draw=none] (ellipsis) {$\ldots$} }
  child { node (Tn) {$T_n$} };
\end{tikzpicture}
\end{document}

生产

标准无边


森林

如果你愿意使用不同的包,森林有一个no edge选项,无论您将它应用到哪个节点,它都会按照其说明进行操作。

例如:

\usepackage{forest}
\forestset{
  forest circles/.style={
    for tree={
      math content,
      draw,
      circle,
      minimum size=20pt,
      inner sep=0pt,
      text centered
    },
    no edge/.append style={draw=none}
  },
}
\begin{document}
\begin{forest}
  forest circles,
  [r
    [T_1]
    [\cdots, no edge]
    [T_n]
  ]
\end{forest}
\end{document}

缺失边缘

答案3

在找到这个答案之前,我回答了一个重复的问题,并且使用了不透明度作为一种技巧:

\documentclass[preview]{standalone}
\usepackage{tikz} 
\begin{document}
   \begin{tikzpicture}[every node/.style={circle,draw}]
      \node (r) {$r$}
      child { node (T1) {$T_1$} }
      child[opacity=0] { node[draw=white,opacity=1]  {$\ldots$} }
      child { node (Tn) {$T_n$} };
   \end{tikzpicture}
\end{document}

输出:

在此处输入图片描述

PS:添加为另一个选项

相关内容