Alinhe os níveis em uma árvore usando tikz-qtree

Alinhe os níveis em uma árvore usando tikz-qtree

Gostaria que todos os níveis do meu diagrama de árvore estivessem alinhados verticalmente. O problema é que alguns ramos ‘pulam’ um nível. Especificamente, todos os x e todos os C devem estar próximos um do outro (o resto está bem como está). Consegui fazer isso para x especificando a distância da raiz. Mas os C's estão por toda parte.

\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}

com seu código obtenho a seguinte imagem:

insira a descrição da imagem aqui

Responder1

Eu concordo com o cfr que foresté o caminho a seguir para esse tipo de árvore, mas se você tiver muitas delas e não se importar com alguns galhos parecendo um pouco estranhos, você pode simplesmente adicionar colchetes extras ao redor dos nós que estão errados nível.

\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}

saída de código

Os nós extras xque adicionei à árvore não afetam o posicionamento dos Cs. Você ainda pode alinhar os nós C e os xnós mesmo com xnós ausentes:

\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}

saída de código

Responder2

Como ninguém respondeu ainda, aqui está uma versão do 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}

Versão florestal

O bom disso, claro, é que o Forest faz todo o trabalho: não há necessidade de codificar as distâncias ou alterá-las se o conteúdo ou a estrutura da árvore for modificado posteriormente.

Responder3

Depois de algumas tentativas e erros, decidi especificar os nós e, em seguida, mover cada nó individualmente. Isso é um pouco tedioso e terei que fazer isso para cada árvore individual, então se alguém tiver uma solução melhor, por favor me diga.

Aqui está o código:

\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}

O que me dá o resultado desejado:

Todos os C's são (aproximadamente) nivelados.

informação relacionada