Выравнивание уровней в дереве с помощью 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. Вы по-прежнему можете выровнять узлы C и xузлы даже при отсутствующих 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 (примерно) на одном уровне.

Связанный контент