
ツリー ダイアグラムのすべてのレベルを垂直に揃えたいのですが、問題は、一部のブランチがレベルを「スキップ」することです。具体的には、すべての 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
cfr の言うとおり、forest
この種のツリーではこれが最善の方法です。ただし、ツリーの数が多く、一部のブランチが少し奇妙に見えてもかまわない場合は、間違ったレベルにあるノードの周りに括弧を追加するだけで済みます。
\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
が欠落している場合でも、C ノードとノードを揃えることができますx
。
\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}
これにより、希望どおりの結果が得られました。