使用 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

我同意 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}

这给了我想要的结果:

所有 C 都 (大致) 处于同一水平。

相关内容