我正在尝试形成一棵树,其中每个节点在节点前都有一个“(”,在节点后有一个“)”。我理解这可以通过类似以下方式实现:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[sibling distance=10em,
every node/.style = {shape=circle, draw, align=center}]]
\node[label={left:(}, label={right:)}] {}
child { node[label={left:(}, label={right:)}] {} }
child { node[label={left:(}, label={right:)}] {}
child { node[label={left:(}, label={right:)}] {}
child { node[label={left:(}, label={right:)}] {} }
child { node[label={left:(}, label={right:)}] {} }
child { node[label={left:(}, label={right:)}] {} } }
child { node[label={left:(}, label={right:)}] {} } };
\end{tikzpicture}
\end{document}
给出以下结果:
但是,这并不理想,我宁愿不必每次都复制和粘贴相同的代码(某些可维护性)。我尝试将标签代码放在节点样式中,但这似乎不受支持。我尝试找到一种方法来创建一个可以分配标签的自定义节点,但我也很难让这样的事情发挥作用/无法在上面找到任何东西。
为了便于理解,我试图显示一个 Dyck 词的树形表示,其中执行 DFS 后的前后数字代表“(”和“)”的索引。
所需代码形式:
\begin{figure}
\begin{tikzpicture}[sibling distance=10em,
every node/.style = {shape=circle, draw, align=center}]] % <-- some style here for the ()?
\node {}
child { node {} }
child { node {}
child { node {}
child { node {} }
child { node {} }
child { node {} } }
child { node {} } };
\end{tikzpicture}
\end{figure}
答案1
问题是every node
,这种样式会应用于标签,而标签也是节点,因此会产生无限递归。请使用every child node
。这种样式旨在仅应用于子节点,而不应用于标签。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[sibling distance=10em,
ears/.style={shape=circle, draw, align=center,
label={left:(}, label={right:)}},
every child node/.style = {ears}]]
\node[ears] {}
child { node {} }
child { node {}
child { node {}
child { node {} }
child { node {} }
child { node {} } }
child { node {} } };
\end{tikzpicture}
\end{document}
答案2
无论出于什么原因,在中设置标签都every node/.style
不起作用,但是,创建新的节点样式似乎可以。以下代码产生了所需的结果:
\documentclass{standalone}
\usepackage{tikz}
\tikzset{dyck/.style={
draw,
circle,
label={left:(},
label={right:)},
}
}
\begin{document}
\begin{tikzpicture}[sibling distance=10em,
every node/.style = {shape=circle, draw, align=center}]]
\node[dyck] {}
child { node[dyck] {} }
child { node[dyck] {}
child { node[dyck] {}
child { node[dyck] {} }
child { node[dyck] {} }
child { node[dyck] {} } }
child { node[dyck] {} } };
\end{tikzpicture}
\end{document}