如何隐藏 tikz-qtree 中的较高节点

如何隐藏 tikz-qtree 中的较高节点

我想要创建一个tikz-qtree类似这样的图表:

在此处输入图片描述

其中“alt”、“a”和“s”在底部对齐,“R”、“AF”和“AF”也在底部对齐(请注意,我删除了叶子前的最后一条边;我需要这种方式)。

我的第一次尝试将“s”与更高的节点(它的姊妹节点)对齐:

\documentclass{standalone}

\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{every tree node/.style={align=center,anchor=base},
    frontier/.style={distance from root=80pt}
}

\begin{document}
    
    \begin{tikzpicture}
        
        \Tree
        [.Adj
            [.Adj
                [.alt\\R-Adj ]
                [.a\\AF-G ] ]
            [.s\\AF-N ] ]

    \end{tikzpicture}

\end{document}

在此处输入图片描述

然后我尝试在“s”前添加另一个节点,使“s”成为“alt”和“a”的姊妹节点。但是,顶部的“Adj”和“s”之间的线条被打破了,看起来不太美观。

\documentclass{standalone}

\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{every tree node/.style={align=center,anchor=base},
    frontier/.style={distance from root=80pt}
}

\begin{document}
    
    \begin{tikzpicture}
        
        \Tree
        [.Adj
            [.Adj
                [.alt\\R ]
                [.a\\AF ] ]
        [.\node[shape=coordinate] {};  %removes the space (gap) between the edges 
            [.s\\AF ] ]]

    \end{tikzpicture}

\end{document}

在此处输入图片描述

关于我的问题,我有两个问题:(1) 如何设置代码,使最右边的线从“Alt”直接到“s”,中间没有中断,同时仍保持“alt”、“a”和“s”在底部对齐?(2) 如何使每个“Adj”下方的边缘(即线条)长度相同,而无需更改为anchor=north?将更改为会使anchornorth的节点错位,因为姐妹节点中的字母“l”比“a”和“s”高。

答案1

Withforest包很简单(对我来说,因为我对它比 with 更熟悉tikz-qtree):

\documentclass[border=3.141592]{standalone}
\usepackage{forest}

\begin{document}
    \begin{forest}
for tree = {
% nodes styles
       align = center,
        font = \linespread{0.84}\selectfont,
   inner sep = 1pt,
% tree style
parent anchor = south,
 child anchor = north,
if n={1}{l sep=3mm,s sep=1mm}{l sep=6mm, s sep=4mm}
            
                }
%
[Adj
    [Adj,
        [alt\\R]
        [a\\AF, tier=L2]
    ]
    [s\\AF,  tier=L2]
]
    \end{forest}
\end{document}

在此处输入图片描述

编辑(1):

或者宁愿下一棵树的边缘有固定角度并且树顶没有节点。

编辑(2):

原来使用standalone文档类的示例现在被采用到 ˙beamer`。由此可见,图像与使用的文档类无关:

在此处输入图片描述

\documentclass{beamer}
\usepackage{forest}

\begin{document}
\begin{frame}
\frametitle{Tree drawn by \texttt{forest} package}
\center
    \begin{forest}
for tree = {
% nodes styles
       align = center,
        font = \linespread{0.84}\selectfont,
   inner sep = 1pt,
% tree with fixed angles of edges
      calign = fixed edge angles,
calign angle = 30,       
                }
%
[,coordinate
    [Adj,
        [alt\\R]
        [a\\AF, tier=L]
    ]
    [s\\AF,  tier=L]
]
    \end{forest}
\end{frame}
\end{document}

附录: 如果您更喜欢(出于某种原因)使用tikz-qtree包来绘制树并愿意对节点定位进行手动调整,那么您可以考虑以下解决方案,该解决方案在某种程度上简化了定义节点定位的级别距离:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{tikz-qtree}
\newlength{\LD}
                        

\begin{document}
    \begin{tikzpicture}
\pgfmathsetlength\LD{7mm}
\tikzset{
          nodes = {inner sep=2pt, align=center,anchor=base},
frontier/.style = {distance from root=3*\LD},
 level distance = \LD
        }
\Tree   [.~
            [.Adj
                [.alt R ]
                [.a AF  ] 
            ]
            [.\node[yshift=-\LD] {s}; AF ] 
        ]
    \end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

在摆弄了代码之后,我发现我一直在使用的代码是有效的;我只需要将部分tikzset{}从序言移到tikzpicture环境内部。我不知道为什么在环境中使用这些设置可以工作,而在序言中却不行,但事实确实如此。下面是我的“新”代码和输出。我添加了这个解决方案,以防它对其他人有帮助。

\documentclass{standalone}

\usepackage{tikz}
\usepackage{tikz-qtree}

\begin{document}
    
    \begin{tikzpicture}
        
        \tikzset{every tree node/.style={align=center,anchor=base},
            frontier/.style={distance from root=80pt}}
        
        \Tree
        [.Adj
            [.Adj
                {alt\\ R}
                {a\\ AF}
            ]
            {s\\ AF}
        ]
        
    \end{tikzpicture}
    
\end{document}

在此处输入图片描述

相关内容