我想要创建一个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
?将更改为会使anchor
我north
的节点错位,因为姐妹节点中的字母“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}