我正在尝试建立一个家谱,在网上找到的众多例子中,这个是最有用的:
然而,在这张家谱中,有两件事我无法做到。我想:
1)在家族树中进一步添加婚姻关系,并让姻亲配偶拥有自己的家族谱系,并且
2)我想为一个人添加多个配偶(我是为一个前现代中国家庭做的,一家之主同时有一个主要妻子和一个次要妻子)
任何帮助将不胜感激!
更新
这是我想画的树的近似图。我用三角形和圆圈表示男性和女性,但我也可以用灰色阴影(如上面链接的问题中的树一样),因为家庭成员的名字可能不适合放在三角形和圆圈内。或者名字可以放在它们下面。无论如何,方框的形状并不重要。
答案1
这是我的尝试。不过代码有点笨拙。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{trees,calc}
\begin{document}
\centering
\begin{tikzpicture}[font=\footnotesize]
\tikzset{
% edge styles
level distance=15mm,
married/.style={edge from parent/.style={draw,double distance=3pt}},
mleft/.style={grow=left,edge from parent path={(\tikzparentnode.west)--(\tikzchildnode.east)}},
mright/.style={grow=right,edge from parent path={(\tikzparentnode.east)--(\tikzchildnode.west)}},
% node styles
man/.style={rectangle,fill=blue!20},
wife1/.style={rectangle,fill=red!40,rounded corners},
wife2/.style={rectangle,fill=red!15,rounded corners},
}
% Generation 0
% \node(<gen_label>)[<options>]{<name>}
% % add children and coordinate labels as in the other generations
% ;
% 1st Generation
\node[man]{Gen1 M1}
child[mleft,married,level distance=20mm]{coordinate(G1C1) child{node[wife1]{Gen1 F1}}}
child[mright,married,level distance=20mm]{coordinate(G1C2) child{node[wife2]{Gen1 F2}}}
;
% 2nd Generation
\node at(G1C1){}
[edge from parent fork down]
child[sibling distance=30mm]{node[man]{Gen2 M1}
child[married,mleft]{coordinate(G2C1) child{node[wife1]{Gen2 F1}}}
}
child[missing]
;
\node at(G1C2){}
[edge from parent fork down,sibling distance=15mm]
child{node[wife1]{Gen2 F1}
child[married,mleft]{child[level distance=10mm]{node[man]{Gen2 M2}}}
}
child{node[man]{Gen2 M3}
child[married,mright]{coordinate(G2C3) child{node(G2F3)[wife1]{Gen2 F3}}}
}
;
% 1st Generation Loner
\node[man]at($(G2F3)+(0,\tikzleveldistance)$){Gen1 M2} edge (G2F3);
% 3rd Generation
\node at(G2C1){}
child{node[man]{Gen3 M1}}
;
\node at(G2C3){}
[edge from parent fork down]
child{node[man]{Gen3 M2}}
child{node[man]{Gen3 M3}}
child{node[man]{Gen3 M4}}
;
\end{tikzpicture}
\end{document}
编辑
在代码中,我使用coordinate(<label>)
和node(<label>)
来标记下一代(子)树开始的特定坐标。s<label>
是稍后绘制树时可以参考的那些点的名称。例如,标签(G1C1)
是“第 1 代夫妇 1”的简写。
请注意,除第一代外,每一代都以 开始\node at(<label>)...;
。因此,我所做的本质上是将新一代附加到上一代标记的特定坐标上。例如,Gen2 M1
是第一代夫妇 1 的后代G1C1
。因此,要添加上一代,比如Gen0
,只需将其绘制为任何其他代,标记开始的点Gen1
(比如(G0C1)
),并通过添加 来修改第一代的开头at(G0C1)
:
\node[man] at(G0C1) {Gen1 M1}...;
答案2
这是使用新genealogytree
包的另一种可能性。
为了使次要的妻子关系可视化,我添加了两种样式secondary wife
,并secondary family
更改节点颜色并将边缘绘制为虚线。这些可以单独使用。
该图由两个结构构建而成\genealogytree
。第一个结构用于主图。第二个结构用于添加父级Gen1 M2
,但不能直接添加。
\documentclass{article}
\usepackage[all]{genealogytree}
\begin{document}
\begin{tikzpicture}
\gtrset{
timeflow=down, % time flows down
processing=tcbox*, % draw nodes with tcolorbox
node size from=8mm to 5cm, % width of nodes
level size=6mm, % height of nodes
level distance=10mm, % generation distance
% redefine default setting for female,male,neuter:
tcbset={
female/.style={colback=red!40,colframe=red!40!black,arc=2mm},
male/.style={colback=blue!20,colframe=blue!40!black,sharp corners},
},
secondary wife/.style={box={colback=red!15,colframe=red!50,arc=2mm}},
secondary family/.style={family edges={foreground={black,line width=0.25mm,dashed}}},
%
box={size=fbox,drop fuzzy shadow}, % node settings
%
edges={foreground={black,line width=0.25mm}, % edge settings
background={white,line width=0.5mm}}
}
\genealogytree
{
child{
p[female]{Gen1 F1}
g[male]{Gen1 M1}
child{
p[female]{Gen2 F1}
g[male]{Gen2 M1}
c[male]{Gen3 M1}
}
union[secondary family]{
p[secondary wife]{Gen1 F2}
child{
p[male]{Gen2 M2}
g[female]{Gen2 F2}
c[phantom]- % reserve space (for safety)
}
child{
g[male]{Gen2 M3}
p[female,id=Gen2-F3@1]{Gen2 F3}% remember node
c[male]{Gen3 M2}
c[male]{Gen3 M3}
c[male]{Gen3 M4}
}
}
}
}
\genealogytree[set position=Gen2-F3@2 at Gen2-F3@1]% place at remembered position
{
child{
g[male]{Gen1 M2}
c[phantom*,id=Gen2-F3@2]-
}
}
\end{tikzpicture}
\end{document}
答案3
forest
并不是专门为这种图设计的,但只要有一点耐心,它还是可以做得很好的。然而,指定树的最佳方式在语义上并不具有表现力:绘制树时指定的关系并不代表图表所示的关系。
这使用了一个实验性的软件包justtrees
。在某个地方有一个副本,但是如果你想尝试它,请向我索要 0.03 版本。justtrees
可以更轻松地指定 OP 绘图右侧显示的代标签,但在提供的其他答案中省略了这些标签。
我使用粉色代表女性(叹气),蓝色代表男性(再次叹气),紫色代表“二房”(尖叫)。等号用于指定婚姻关系。
\PassOptionsToPackage{rgb,x11names,svgnames,dvipsnames}{xcolor}
\documentclass[tikz,border=5pt,multi]{standalone}
\usepackage{justtrees}% version 0.03
\usetikzlibrary{shadows}
\begin{document}
\forestset{
reln/.style={
content={$=$},
really no edge,
inner xsep=0pt,
},
really no edge/.style={
edge={draw=none}
},
}
\begin{justtree}
{% tree preamble goes here
person/.style={draw=#1, inner color=#1!10, outer color=#1!15, text=#1, thick, rounded corners, drop shadow},
fe/.style={person=WildStrawberry},
fe2/.style={person=WildStrawberry!50!DeepSkyBlue4},
ma/.style={person=DeepSkyBlue4},
just format/.style={font=\itshape},
for tree={
edge path={
\noexpand\path [draw, \forestoption{edge}] (!u.parent anchor) -- +(0,-5pt) -| (.child anchor)\forestoption{edge label};
},
edge={thick},
}
}
[female, fe, right just={first generation}]
[, reln
[female, fe, really no edge, right just={second generation}]
[, reln
[male, ma, calign with current, right just={third generation}]
]
[male, ma]
[male, ma, really no edge]
[, reln, calign with current]
]
[male, ma]
[, reln
[female, fe]
[, phantom, calign with current]
[male, ma]
]
[female, fe2]
[,phantom
[, reln
[male, ma]
[male, ma]
[male, ma]
]
]
[male, ma
[female, fe]
]
\end{justtree}
\end{document}