是否有可能实现tikz-qtree
与原始qtree
包中相同的节点间距?比较两者:
配额树:
tikz-qtree:
同一层级的节点间距应该相同。另外,我有点不喜欢边的长度取决于内容(参见点与 Z)。
我使用它的原因tikz-qtree
是我有一棵树,其中有一个超过 5 个分支的节点,它qtree
不支持。
编辑:以及树代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{tikz-qtree}
% or \usepackage{qtree}
\newcommand{\bftt}[1]{\textbf{\texttt{#1}}}
\newcommand{\ts}[1]{\bftt{#1}}
\begin{document}
\Tree [.$Z$ \ts{(} [.$Z$ \ts{.} [.$Z$ \ts{(} [.$Z$ $\epsilon$ ] \ts{)} [.$Z$ $\epsilon$ ] ] ] \ts{)} [.$Z$ $\epsilon$ ] ]
\end{document}
答案1
很难复制qtree
间距,tikz-qtree
因为后者的包使用完全不同的节点间距方法;大多数情况下,这会导致树看起来更好,尤其是对于语言学,这是它的预期用途。您可以通过将其内容括在显式命令中\node
并指定宽度来手动平衡特定节点。不平衡是由于第一级节点的宽度差异很大。参见如何使该 qtree 居中?类似的问题。对于节点大小问题,我使用了 egreg 的\phantom
解决方案。
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{every tree node/.style={align=center,anchor=north}}
\newcommand{\bftt}[1]{\textbf{\texttt{#1}}}
\newcommand{\ts}[1]{\bftt{#1}\protect\vphantom{$A$}}
\begin{document}
\begin{tikzpicture}[]
\Tree [.$Z$ \node[minimum width=1cm]{\ts{(}}; [.$Z$ \ts{.} [.$Z$ \ts{(}
[.$Z$ $\epsilon$ ] \ts{)} [.$Z$ $\epsilon$ ] ] ] \node[minimum width=2cm]
{\ts{)}}; [.$Z$ $\epsilon$ ] ]
\end{tikzpicture}
\end{document}
forest
使用包的解决方案
最近的forest
软件包提供了相当容易实现这一目标的工具。尽管其主要存在的理由是为了制作更紧凑的树,它也提供了钩子来制作不太紧凑的树。输入语法有点不同:没有.
标记节点标签,也没有终端节点必须被封闭在[ ... ]
……内
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{forest}
\newcommand{\bftt}[1]{\textbf{\texttt{#1}}}
\newcommand{\ts}[1]{\bftt{#1}\protect\vphantom{$A$}}
\begin{document}
\forestset{qtree edges/.style={for tree={
parent anchor=south, child anchor=north}}}
\begin{forest}
[$Z$, qtree edges,s sep=1cm [\ts{(}] [$Z$ [\ts{.}] [$Z$ [\ts{(}] [$Z$ [$\epsilon$] ]
[\ts{)}] [$Z$ [$\epsilon$] ] ] ] [\ts{)}] [$Z$ [$\epsilon$] ] ]
\end{forest}
\end{document}
答案2
文档中tikz-qtree
提到了关键点sibling distance
;你可以使用如下命令进行全局设置,
\tikzset{sibling distance=1pc}
在序言中或本地针对特定树
\begin{tikzpicture}[sibling distance=1pc]
\Tree [...]
\end{tikzpicture}
对于节点的高度,我建议在定义中放置一个幻影\ts
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz-qtree}
\newcommand{\bftt}[1]{\textbf{\texttt{#1}}}
\newcommand{\ts}[1]{\bftt{#1}\protect\vphantom{$A$}}
\begin{document}
\begin{tikzpicture}[sibling distance=1pc]
\Tree [.$Z$ \ts{(} [.$Z$ \ts{.} [.$Z$ \ts{(} [.$Z$ $\epsilon$ ] \ts{)}
[.$Z$ $\epsilon$ ] ] ] \ts{)} [.$Z$ $\epsilon$ ] ]
\end{tikzpicture}
\end{document}