我希望树形图中的所有级别都垂直对齐。问题是有些分支“跳过”了某个级别。具体来说,所有 x 和所有 C 都应该彼此相邻(其余部分保持原样即可)。我设法通过指定与根的距离来为 x 实现这一点。但 C 却乱七八糟。
\documentclass[12pt]{beamer}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{frame}
\begin{tikzpicture}
\tikzset{frontier/.style={distance from root=150pt}}
\Tree [.{\textbf{W}}
[.{\textbf{S}}
[.\textit{Onset} [.C {\textit{xx}} ]
[.C {\textit{x}} ] ]
[.\textit{Reim}
[.\textit{Nukleus} [.C {\textit{x}} ]
[.C {\textit{x}} ] ]
[.\textit{Koda} {C} ] ] ]
[.{\textbf{S}}
[.\textit{Onset} [.C {\textit{x}} ] ]
[.\textit{Reim }
[.\textit{Nukleus} [.C {\textit{x}} ] ]
[.\textit{Koda} {C} {C} ] ] ]
]
\end{tikzpicture}
\end{frame}
\end{document}
使用您的代码我得到以下图像:
答案1
我同意 cfrforest
对这种树的处理方式,但如果您有很多树并且不介意一些分支看起来有点奇怪,那么您可以简单地在错误级别的节点周围添加额外的括号。
\documentclass[12pt]{beamer}
\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{every tree node/.style={font=\itshape}}
\begin{document}
\begin{frame}
\begin{tikzpicture}
\tikzset{frontier/.style={distance from root=150pt}}
\Tree [.{\textbf{\upshape W}}
[.{\textbf{\upshape S}}
[.Onset [[.C {xx} ]]
[[.C {x} ]] ]
[.Reim
[.Nukleus [.C {x} ]
[.C {x} ] ]
[.Koda [.C {x} ] ] ] ]
[.{\textbf{\upshape S}}
[.Onset [[.C {x} ]] ]
[.Reim
[.Nukleus [.C {x} ] ]
[.Koda [.C {x} ] [.C {x} ] ] ] ]
]
\end{tikzpicture}
\end{frame}
\end{document}
我添加到树中的额外x
节点不会影响 C 的放置。x
即使缺少x
节点,您仍然可以对齐 C 节点和节点:
\documentclass[12pt]{beamer}
\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{every tree node/.style={font=\itshape}}
\begin{document}
\begin{frame}
\begin{tikzpicture}
\tikzset{frontier/.style={distance from root=150pt}}
\Tree [.{\textbf{\upshape W}}
[.{\textbf{\upshape S}}
[.Onset [[.C {xx} ]]
[[.C {x} ]] ]
[.Reim
[.Nukleus [.C {x} ]
[.C {x} ] ]
[.Koda [.C ] ] ] ]
[.{\textbf{\upshape S}}
[.Onset [[.C {x} ]] ]
[.Reim
[.Nukleus [.C {x} ] ]
[.Koda [.C ] [.C ] ] ] ]
]
\end{tikzpicture}
\end{frame}
\end{document}
答案2
由于还没有人回答,这里有一个 Forest 版本:
\documentclass[border=10pt]{standalone}
\usepackage[linguistics]{forest}
\begin{document}
\begin{forest}
before typesetting nodes={
where level<=1{font=\bfseries}{if content={C}{tier=c}{font=\itshape, if content={x}{tier=x}{}},}
},
[W
[S
[Onset
[C[xx]][C[x]]
]
[Reim
[Nukleus
[C[x]] [C[x]]
]
[Koda
[C]
]
]
]
[S
[Onset
[C[x]]
]
[Reim
[Nukleus
[C[x]]
]
[Koda
[C][C]
]
]
]
]
\end{forest}
\end{document}
当然,这样做的好处是 Forest 会完成所有工作:无需对距离进行硬编码,如果稍后修改了树的内容或结构,也无需更改距离。
答案3
经过反复尝试,我决定指定节点,然后单独移动每个节点。这有点繁琐,我必须对每棵树都这样做,所以如果有人有更好的解决方案,请告诉我。
代码如下:
\documentclass[12pt]{beamer}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{frame}
\begin{tikzpicture}
\tikzset{frontier/.style={distance from root=150pt}}
\Tree [.{\textbf{W}}
[.{\textbf{S}}
[.\textit{Onset} [.\node at (0,-1.1) {C}; {\textit{xx}} ]
[.\node at (0,-1.1) {C}; {\textit{x}} ] ]
[.\textit{Reim}
[.\textit{Nukleus} [.C {\textit{x}} ]
[.C {\textit{x}} ] ]
[.\textit{Koda} \node at (0,1) {C}; ] ] ]
[.{\textbf{S}}
[.\textit{Onset} [.\node at (0,-1.1) {C}; {\textit{x}} ] ]
[.\textit{Reim }
[.\textit{Nukleus} [.C {\textit{x}} ] ]
[.\textit{Koda} \node at (0,1.1) {C}; \node at (0,1.1) {C}; ] ] ]
]
\end{tikzpicture}
\end{frame}
\end{document}
这给了我想要的结果: