我想画一棵树,而不是画出特定的边。我尝试这样做
\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 parent
。edge 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:添加为另一个选项