我正在尝试绘制一棵反驳树:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\Tree
[.\node[label= {$\langle \texttt{stateA(X)}, 0 \rangle$}] {};
[.\node[label= {$\langle \texttt{stateB(X, Y)}, 0 \rangle$}] {};
\edge node[left] {$X=a, Y=b$}; [.\node[label={$\langle \texttt{stateC(a,b)}, 0 \rangle$}] {};
\node[ label=below: {$\langle [], res1 \rangle$}] {};
]
\edge node[right] {$X=a, Y=c$}; [.\node[label={$\langle \texttt{stateD(b, c)}, 0 \rangle$}] {};
\node[ label=below: {$\langle [], res2 \rangle$}] {};
] ] ]
\end{tikzpicture}
\end{document}
但是,在生成的树中,大多数标签的位置都不正确。我该如何修复这个问题?
最初,我尝试使用这个例子但圆形或矩形似乎不太合适。
答案1
关于你的树的一些评论。
由于每个组成标签自动成为一个节点,因此通常不需要使用明确的
\node
命令。tikz-qtree
[.label ]
要标记树的一条边,您应该使用节点的
[auto=left]
和参数。这将确保更好地放置标签文本。[auto=right]
当制作复杂的节点标签时,如果为树的不同组件创建一些合理的标记,您的树将更具可读性。
这是考虑到所有这些想法的树的版本:
我创建了一个\brk
命令,用于将某些内容括在尖括号中。我还创建了一个\state
命令,用于将其参数放在中\texttt
。这样,如果您决定更改该格式设置,则只需更改一个命令即可。
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\newcommand\state[1]{\texttt{#1}}
\newcommand\brk[1]{$\langle #1 \rangle$}
\begin{document}
\begin{tikzpicture}[level distance=40pt,sibling distance=25mm]
\Tree
[.{\brk{ \state{stateA(X)}, 0 }}
[.{\brk{ \state{stateB(X, Y)}, 0 }}
\edge node[auto=right] {$X=a, Y=b$};
[.{\brk{ \state{stateC(a,b)}, 0 }}
[.{\brk{ [], res1 }} ]
]
\edge node[auto=left] {$X=a, Y=c$}; [.{\brk{ \state{stateD(b, c)}, 0 }}
[.{\brk{ [], res2 }} ]
] ] ]
\end{tikzpicture}
\end{document}