tikz-qtree を使用してツリーのレベルを揃える

tikz-qtree を使用してツリーのレベルを揃える

ツリー ダイアグラムのすべてのレベルを垂直に揃えたいのですが、問題は、一部のブランチがレベルを「スキップ」することです。具体的には、すべての 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}

これにより、希望どおりの結果が得られました。

すべての C は (ほぼ) 水平です。

関連情報