我正在尝试为一位朋友写一份家谱,但遇到了一些小问题。
我的代码是
\documentclass{article}
\usepackage{tikz-qtree}
\begin{document}
\tikzset{edge from parent/.style=
{draw, edge from parent path={(\tikzparentnode.south)
-- +(0,-8pt)
-| (\tikzchildnode)}}}
\begin{tikzpicture}
\matrix
{
\node{\Tree
[.{}
[.{Robert - Margaret}
[.{Peter - Mary}
[.{Mary - W.P.}
[.{May - Robert}
[.{Robbie - Audrey} [.{Joan - Ewan} Isla ] [.{Gillian - Danny} Kenneth Joni Sarah Ruari ] [.{Angus - Michelle} Kirsteen Mikey ] ]]]
[.{Margaret} ]]]
[.{Robert - Janet}
[.{John - Anaple}
[.{Robert} ]]]]};\\
};
\end{tikzpicture}
\end{document}
输出如下所示:
有几个小问题我想解决。
有没有办法调整树以使其在输出 pdf 中正确显示?图像中的滚动条是树开始溢出边缘的地方。
在第一行,我不希望连接任何条,
Robert - Margaret
因为Robert - Janet
它们不相关。我想将第三排的
Margaret
和连接起来Robert
,但我不知道该怎么做。最后,是否可以将垂直连接杆连接在
-
每个婚姻点,而不是整个夫妇的中心?
谢谢你,
答案1
很难以美观的方式满足您的所有要求,但这是一种尝试。首先,以下是对您的一些问题的回答:
- 您可以在图片前手动插入一些负空间,以将其向左移动。(这不是理想的解决方案,但它有效)
- 如果您不想让节点连接,请将它们放入单独的树中。
- 您可以使用命令插入节点,然后
\Tree
使用命令连接它们,从而连接单独的 s 中的节点。要实现此功能,您需要使用整个环境的键;这允许跨单独的 引用节点。\node
\draw
remember picture
tikzpicture
tikzpictures
- 为了让条形图在婚姻的中心处连接,我创建了一个
\marriage
命令,该命令创建一个固定宽度的表格,并以--
作为规则。这确保--
始终是分支连接的中心点。垂直线不可能与水平线无缝相交;如果您希望它部分连接,则可以将规则向下移动,并在其第一个参数中使用负值。
这是你的树的新版本:
\documentclass{article}
\usepackage{array}
\usepackage{tikz-qtree}
% command to ensure the line connecting a marriage is centred
% change the rule command as needed; the width of the centre
% column should match the width of the rule
\newcommand*{\marriage}[2]{
\begin{tabular}{>{\raggedleft}p{.5in}@{}>{\centering}p{.2in}@{}>{}p{.5in}}%
#1 & \rule[3pt]{.2in}{\pgflinewidth} & #2
\end{tabular}}
\begin{document}
\tikzset{edge from parent/.style=
{draw, edge from parent path={(\tikzparentnode.base)
-- +(0,-8pt)
-| (\tikzchildnode)}}}
\hspace{-2in}
\begin{tikzpicture}[remember picture]
\matrix{
\node[anchor=north,inner sep=0pt]{\Tree
[.\marriage{Robert}{Margaret}
[.\marriage{Peter}{Mary}
[.\marriage{Mary}{W.P.}
[.\marriage{May}{Robert}
[.\marriage{Robbie}{Audrey} [.\marriage{Joan}{Ewan} Isla ]
[.\marriage{Gillian}{Danny} Kenneth Joni Sarah Ruari ]
[.\marriage{Angus}{Michelle} Kirsteen Mikey ] ]]]
[.\node[] (M) {Margaret}; ]]]};
&
\node[anchor=north,inner sep=0pt]{\Tree [.\marriage{Robert}{Janet}
[.\marriage{John}{Anaple}
[.\node[] (R) {Robert}; ]]] };\\
};
\draw (M) -- (M-|R.west);
\end{tikzpicture}
\end{document}
更新
当前版本的\marriage
命令对包含每个姓名的表格单元格使用固定宽度。从示意图上看,表格由包含Name1 <rule> Name2
两个姓名的列组成,并且包含两个姓名的列的宽度必须相同,否则两个姓名之间的规则将不会与婚姻的中心对齐。
这是婚姻命令的另一个版本,它更加动态:它将列的宽度调整为两个名字中最大的一个。与固定宽度相比,这将为较短的名字对节省一些空间。它还允许较长的名字,但有一个缺点:随着名字变长,它们会导致这些名字上方的树枝变宽,这可能会导致不良结果。
\newlength{\widestname}
% command to ensure the line connecting a marriage is centred
% change the rule command as needed; the width of the centre
% column should match the width of the rule.
% The width of the left and right columns matches the width of the
% largest name.
\newcommand*{\marriage}[2]{
\pgfmathsetlength{\widestname}{max(\widthof{#1},\widthof{#2})}
\begin{tabular}
{>{\raggedleft}p{\widestname}@{}>{\centering}p{.2in}@{}>{}p{\widestname}}%
#1 & \rule[3pt]{.2in}{\pgflinewidth} & #2
\end{tabular}}
答案2
树左侧不必要的空间来自于 位于\Tree
内\node
(而 位于 内,\matrix
而 仅包含单个节点)。如果\node{...};
从代码中删除 ,不必要的空间就会消失:
\documentclass{article}
\usepackage{tikz-qtree}
\begin{document}
\tikzset{edge from parent/.style=
{draw, edge from parent path={(\tikzparentnode.south)
-- +(0,-8pt)
-| (\tikzchildnode)}}}
\begin{tikzpicture}
\matrix
{
\Tree
[.{}
[.{Robert - Margaret}
[.{Peter - Mary}
[.{Mary - W.P.}
[.{May - Robert}
[.{Robbie - Audrey} [.{Joan - Ewan} Isla ] [.{Gillian - Danny} Kenneth Joni Sarah Ruari ] [.{Angus - Michelle} Kirsteen Mikey ] ]]]
[.{Margaret} ]]]
[.{Robert - Janet}
[.{John - Anaple}
[.{Robert} ]]]]\\
};
\end{tikzpicture}
\end{document}
艾伦的答案可以适应没有\matrix
和封闭的工作\node
(可以使用 s 移动树scope
,这也是在 TikZ-qtree 手册中的示例中所做的方式):
\documentclass{article}
\usepackage{array}
\usepackage{tikz-qtree}
% command to ensure the line connecting a marriage is centred
% change the rule command as needed; the width of the centre
% column should match the width of the rule
\newcommand*{\marriage}[2]{
\begin{tabular}{>{\raggedleft}p{.5in}@{}>{\centering}p{.2in}@{}>{}p{.5in}}%
#1 & \rule[3pt]{.2in}{\pgflinewidth} & #2
\end{tabular}}
\begin{document}
\tikzset{edge from parent/.style=
{draw, edge from parent path={(\tikzparentnode.base)
-- +(0,-8pt)
-| (\tikzchildnode)}}}
\begin{tikzpicture}[]
\Tree
[.\marriage{Robert}{Margaret}
[.\marriage{Peter}{Mary}
[.\marriage{Mary}{W.P.}
[.\marriage{May}{Robert}
[.\marriage{Robbie}{Audrey} [.\marriage{Joan}{Ewan} Isla ]
[.\marriage{Gillian}{Danny} Kenneth Joni Sarah Ruari ]
[.\marriage{Angus}{Michelle} Kirsteen Mikey ] ]]]
[.\node[] (M) {Margaret}; ]]]
\begin{scope}[xshift=6cm]
\Tree [.\marriage{Robert}{Janet}
[.\marriage{John}{Anaple}
[.\node[] (R) {Robert}; ]]]
\end{scope}
\draw (M) -- (M-|R.west);
\end{tikzpicture}
\end{document}
下面是使用 Alan 的动态宏截取的没有matrix
和 的树的屏幕截图。节点和背景矩形可见,以显示空白来自何处。请注意,树太宽,无法完全容纳在页面上,因此应该尝试使宏更节省空间,使用稍小的字体大小,或使用答案中描述的方法node
marriage
marriage
\makebox
中心图形的宽度大于 \textwidth
\documentclass{article}
\usepackage{array}
\usepackage{tikz-qtree}
\usetikzlibrary{backgrounds}
\newlength{\widestname}
% command to ensure the line connecting a marriage is centred
% change the rule command as needed; the width of the centre
% column should match the width of the rule.
% The width of the left and right columns matches the width of the
% largest name.
\newcommand*{\marriage}[2]{
\pgfmathsetlength{\widestname}{max(\widthof{#1},\widthof{#2})}
\begin{tabular}
{>{\raggedleft}p{\widestname}@{}>{\centering}p{.2in}@{}>{}p{\widestname}}%
#1 & \rule[3pt]{.2in}{\pgflinewidth} & #2
\end{tabular}}
\begin{document}
\tikzset{edge from parent/.style=
{draw, edge from parent path={(\tikzparentnode.base)
-- +(0,-8pt)
-| (\tikzchildnode)}}}
\begin{tikzpicture}[show background rectangle, tight background,every node/.style=draw]
\Tree
[.\marriage{Robert}{Margaret}
[.\marriage{Peter}{Mary}
[.\marriage{Mary}{W.P.}
[.\marriage{May}{Robert}
[.\marriage{Robbie}{Audrey} [.\marriage{Joan}{Ewan} Isla ]
[.\marriage{Gillian}{Danny} Kenneth Joni Sarah Ruari ]
[.\marriage{Angus}{Michelle} Kirsteen Mikey ] ]]]
[.\node[] (M) {Margaret}; ]]]
\begin{scope}[xshift=6cm]
\Tree [.\marriage{Robert}{Janet}
[.\marriage{John}{Anaple}
[.\node[] (R) {Robert}; ]]]
\end{scope}
\draw (M) -- (M-|R.west);
\end{tikzpicture}
\end{document}