连接家族树的两个分支

连接家族树的两个分支

我正在尝试为一位朋友写一份家谱,但遇到了一些小问题。

我的代码是

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

输出如下所示: 在此处输入图片描述

有几个小问题我想解决。

  1. 有没有办法调整树以使其在输出 pdf 中正确显示?图像中的滚动条是树开始溢出边缘的地方。

  2. 在第一行,我不希望连接任何条,Robert - Margaret因为Robert - Janet它们不相关。

  3. 我想将第三排的Margaret和连接起来Robert,但我不知道该怎么做。

  4. 最后,是否可以将垂直连接杆连接在-每个婚姻点,而不是整个夫妇的中心?

谢谢你,

答案1

很难以美观的方式满足您的所有要求,但这是一种尝试。首先,以下是对您的一些问题的回答:

  1. 您可以在图片前手动插入一些负空间,以将其向左移动。(这不是理想的解决方案,但它有效)
  2. 如果您不想让节点连接,请将它们放入单独的树中。
  3. 您可以使用命令插入节点,然后\Tree使用命令连接它们,从而连接单独的 s 中的节点。要实现此功能,您需要使用整个环境的键;这允许跨单独的 引用节点。\node\drawremember picturetikzpicturetikzpictures
  4. 为了让条形图在婚姻的中心处连接,我创建了一个\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和 的树的屏幕截图。节点和背景矩形可见,以显示空白来自何处。请注意,树太宽,无法完全容纳在页面上,因此应该尝试使宏更节省空间,使用稍小的字体大小,或使用答案中描述的方法nodemarriagemarriage\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}

相关内容