summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/genealogytree/gtrcore.drawing.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/genealogytree/gtrcore.drawing.code.tex')
-rw-r--r--Master/texmf-dist/tex/latex/genealogytree/gtrcore.drawing.code.tex558
1 files changed, 558 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/genealogytree/gtrcore.drawing.code.tex b/Master/texmf-dist/tex/latex/genealogytree/gtrcore.drawing.code.tex
new file mode 100644
index 00000000000..d79674f49ea
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/genealogytree/gtrcore.drawing.code.tex
@@ -0,0 +1,558 @@
+%% The LaTeX package genealogytree - version 0.90 (2015/05/22)
+%% gtrcore.drawing.code.tex: Drawing
+%%
+%% -------------------------------------------------------------------------------------------
+%% Copyright (c) 2013-2015 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% -------------------------------------------------------------------------------------------
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `author-maintained'.
+%%
+%% This work consists of all files listed in README
+%%
+\gtr@set@library@version{0.90}
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%% Drawing
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\tikzset{genealogytree edges scope/.style={}}
+
+\def\gtr@reset@after{%
+ \global\def\gtrkv@after@parser{}%
+ \def\gtrkv@after@tree{}%
+ \def\gtr@parse@afternode@hook{}%
+ \def\gtr@parse@afterfamily@hook{}%
+ \def\gtr@parse@beginfamily@hook{}%
+ \def\gtr@parse@endfamily@hook{}%
+ \undef\gtr@parse@afternode@hook@content%
+ \undef\gtr@parse@afterfamily@hook@content%
+ \undef\gtr@parse@beginfamily@hook@content%
+ \undef\gtr@parse@endfamily@hook@content%
+}
+
+\newcommand{\genealogytree}[2][]{%
+ \ifdefined\pgfpictureid%
+ \else%
+ \gtr@error{\genealogytree\space outside tikzpicture environment}
+ {\genealogytree\space can only be used inside a tikzpicture environment.
+ Alternatively, use genealogypicture (see documentation).}%
+ \fi%
+ \gtr@reset@after%
+ \tcb@layer@pushup%
+ \gtr@parsegraph[#1]{#2}%
+ \gtrkv@after@parser%
+ %
+ \tikzset{gtr@init@timeflow@\gtrkv@timeflow}%
+ \letcs\gtr@predraw@family{gtr@predraw@family@\gtr@timeflow}%
+ %
+ \gtr@create@all@persons%
+ \gtr@draw@all@families%
+ \gtr@draw@all@boxes%
+ %
+ \gtrkv@after@tree%
+}
+
+
+\NewEnviron{genealogypicture}[1][]{%
+ \ifdefined\pgfpictureid%
+ \gtr@error{genealogypicture inside tikzpicture environment}
+ {genealogypicture cannot be used inside a tikzpicture environment.
+ Alternatively, use \genealogytree\space (see documentation).}%
+ \fi%
+ \gtr@reset@after%
+ \def\gtr@reset@after{}%
+ \gtrset{#1}%
+ \begingroup\edef\x{\endgroup\noexpand\begin{tikzpicture}[\expandonce\gtrkv@tikzpicture]%
+ \noexpand\genealogytree{\expandonce\BODY}%
+ \noexpand\end{tikzpicture}}%
+ \x%
+}
+
+\newcommand{\genealogytreeinput}[2][]{\genealogytree[#1]{input{#2}}}
+
+\tikzset{%
+ gtr@init@timeflow@down/.style={gtr@node@person/.style={below right}},%
+ gtr@init@timeflow@up/.style={gtr@node@person/.style={above right}},%
+ gtr@init@timeflow@left/.style={gtr@node@person/.style={below left}},%
+ gtr@init@timeflow@right/.style={gtr@node@person/.style={below right}}%
+}
+
+\def\gtr@create@node@person#1{%
+ \letcs\gtr@temp{gtr@per@#1@box}%
+ \node[minimum width=\dimexpr\wd\gtr@temp\relax,
+ minimum height=\dimexpr\ht\gtr@temp+\dp\gtr@temp\relax,
+ alias={\csuse{gtr@per@#1@id}}] (p@#1)
+ at (\csuse{gtr@per@#1@x},\csuse{gtr@per@#1@y}){};
+}
+
+\def\gtr@create@all@persons{%
+ \begin{scope}[line width=0pt,inner sep=0pt,outer sep=0pt,draw=none,fill=none,rectangle,gtr@node@person]%
+ \gtr@forall@nodes{\gtr@create@node@person}%
+ \end{scope}%
+}
+
+\def\gtr@draw@box@person#1{%
+ \node at (p@#1) {\unhbox\csuse{gtr@per@#1@box}};%
+}
+
+\def\gtr@draw@all@boxes{%
+ \begin{scope}[line width=0pt,inner sep=0pt,outer sep=0pt,draw=none,fill=none,rectangle]%
+ \gtr@forall@nodes{\gtr@draw@box@person}%
+ \end{scope}%
+}
+
+\newcommand*{\gtr@forlistloop}[2]{%
+ \def\gtr@tmp@macro##1{#1(##1)}%
+ \ifdefined#2\forlistloop{\gtr@tmp@macro}{#2}\fi%
+}
+
+%% edge draw preparation
+\def\gtr@reset@minmax{%
+ \dimdef\gtr@dim@min{\maxdimen}%
+ \dimdef\gtr@dim@max{-\maxdimen}%
+ \let\gtr@level@mid=\@undefined%
+ \let\gtr@dat@draw@x=\@undefined%
+ \let\gtr@dat@draw@y=\@undefined%
+ \let\gtr@dat@draw@par=\@undefined%
+ \let\gtr@dat@draw@chi=\@undefined%
+ \def\gtr@legnum{0}%
+}
+
+\def\gtr@record@minmax#1{%
+ \ifdim\dimexpr#1<\gtr@dim@min\relax\let\gtr@dim@min=#1\fi%
+ \ifdim\dimexpr#1>\gtr@dim@max\relax\let\gtr@dim@max=#1\fi%
+ \numdef\gtr@legnum{\gtr@legnum+1}%
+}
+
+\def\gtr@process@anchor#1#2{%
+ \pgf@process{\pgfpointanchor{#1}{#2}}%
+ \dimdef\gtr@x{\pgf@x}%
+ \dimdef\gtr@y{\pgf@y}%
+}
+
+\def\gtr@predraw@family@vert#1#2#3{%
+ \gtr@reset@minmax%
+ \def\do##1{%
+ \gtr@process@anchor{p@##1}{#2}%
+ \gtr@record@minmax{\gtr@x}%
+ \listeadd{\gtr@dat@draw@chi}{\gtr@x,\gtr@y}%
+ }%
+ \ifcsname gtr@fam@#1@chi\endcsname\dolistcsloop{gtr@fam@#1@chi}\fi%
+ \letcs\gtr@gnode{gtr@fam@#1@g}%
+ \def\do##1{%
+ \gtr@process@anchor{p@##1}{#3}%
+ \edef\gtr@temp{##1}%
+ \ifdefequal{\gtr@gnode}{\gtr@temp}{%
+ \edef\gtr@temp@w{\csuse{gtr@per@##1@dim}}%
+ \dimdef\gtr@x{\gtr@x-0.5\dimexpr\gtr@temp@w\relax+\csname gtr@fam@#1@frac\endcsname\dimexpr\gtr@temp@w}%
+ }{}%
+ \gtr@record@minmax{\gtr@x}%
+ \listeadd{\gtr@dat@draw@par}{\gtr@x,\gtr@y}%
+ }%
+ \ifcsname gtr@fam@#1@par\endcsname\dolistcsloop{gtr@fam@#1@par}\fi%
+ \ifnum\gtr@legnum>0\relax%
+ \dimdef\gtr@dat@draw@x{(\gtr@dim@min+\gtr@dim@max)/2}%
+ \else%
+ \letcs\gtr@dat@draw@x{gtr@fam@#1@x}%
+ \fi%
+ \letcs\gtr@dat@draw@y{gtr@fam@#1@pos}%
+}
+
+\def\gtr@predraw@family@down#1{%
+ \gtr@predraw@family@vert{#1}{\gtrkv@edge@anchor@vert@A}{\gtrkv@edge@anchor@vert@B}%
+}
+
+\def\gtr@predraw@family@up#1{%
+ \gtr@predraw@family@vert{#1}{\gtrkv@edge@anchor@vert@B}{\gtrkv@edge@anchor@vert@A}%
+}
+
+\def\gtr@predraw@family@hori#1#2#3{%
+ \gtr@reset@minmax%
+ \def\do##1{%
+ \gtr@process@anchor{p@##1}{#2}%
+ \gtr@record@minmax{\gtr@y}%
+ \listeadd{\gtr@dat@draw@chi}{\gtr@x,\gtr@y}%
+ }%
+ \ifcsname gtr@fam@#1@chi\endcsname\dolistcsloop{gtr@fam@#1@chi}\fi%
+ \letcs\gtr@gnode{gtr@fam@#1@g}%
+ \def\do##1{%
+ \gtr@process@anchor{p@##1}{#3}%
+ \edef\gtr@temp{##1}%
+ \ifdefequal{\gtr@gnode}{\gtr@temp}{%
+ \edef\gtr@temp@w{\csuse{gtr@per@##1@dim}}%
+ \dimdef\gtr@y{\gtr@y+0.5\dimexpr\gtr@temp@w\relax-\csname gtr@fam@#1@frac\endcsname\dimexpr\gtr@temp@w}%
+ }{}%
+ \gtr@record@minmax{\gtr@y}%
+ \listeadd{\gtr@dat@draw@par}{\gtr@x,\gtr@y}%
+ }%
+ \ifcsname gtr@fam@#1@par\endcsname\dolistcsloop{gtr@fam@#1@par}\fi%
+ \letcs\gtr@dat@draw@x{gtr@fam@#1@pos}%
+ \ifnum\gtr@legnum>0\relax%
+ \dimdef\gtr@dat@draw@y{(\gtr@dim@min+\gtr@dim@max)/2}%
+ \else%
+ \letcs\gtr@dat@draw@y{gtr@fam@#1@y}%
+ \fi%
+}
+
+\def\gtr@predraw@family@left#1{%
+ \gtr@predraw@family@hori{#1}{\gtrkv@edge@anchor@hori@A}{\gtrkv@edge@anchor@hori@B}%
+}
+
+\def\gtr@predraw@family@right#1{%
+ \gtr@predraw@family@hori{#1}{\gtrkv@edge@anchor@hori@B}{\gtrkv@edge@anchor@hori@A}%
+}
+
+% edge mode = perpendicular
+
+\def\gtr@edge@perpendicular@line@vert(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsend{}\pgfsetshortenend{0pt}} (#1,#2)--(#1,\gtr@dat@draw@y);
+}
+
+\def\gtr@edge@perpendicular@line@vert@inv(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsstart{}\pgfsetshortenstart{0pt}} (#1,\gtr@dat@draw@y)--(#1,#2);
+}
+
+\def\gtr@edge@perpendicular@hori(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsend{}\pgfsetshortenend{0pt}} (#1,#2)--(\gtr@dat@draw@x,#2);
+}
+
+\def\gtr@edge@perpendicular@hori@inv(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsstart{}\pgfsetshortenstart{0pt}} (\gtr@dat@draw@x,#2)--(#1,#2);
+}
+
+\def\gtr@edge@perpendicular@down{%
+ \gtr@forlistloop{\gtr@edge@perpendicular@line@vert@inv}{\gtr@dat@draw@chi}%
+ \gtr@forlistloop{\gtr@edge@perpendicular@line@vert}{\gtr@dat@draw@par}%
+ \draw[line cap=round,gtr@link,-]\pgfextra{\pgfsetshortenstart{0pt}\pgfsetshortenend{0pt}} (\gtr@dim@min,\gtr@dat@draw@y)--(\gtr@dim@max,\gtr@dat@draw@y);%
+}
+
+\let\gtr@edge@perpendicular@up\gtr@edge@perpendicular@down
+
+\def\gtr@edge@perpendicular@left{%
+ \gtr@forlistloop{\gtr@edge@perpendicular@hori@inv}{\gtr@dat@draw@chi}%
+ \gtr@forlistloop{\gtr@edge@perpendicular@hori}{\gtr@dat@draw@par}%
+ \draw[line cap=round,gtr@link,-]\pgfextra{\pgfsetshortenstart{0pt}\pgfsetshortenend{0pt}} (\gtr@dat@draw@x,\gtr@dim@min)--(\gtr@dat@draw@x,\gtr@dim@max);%
+}
+
+\let\gtr@edge@perpendicular@right\gtr@edge@perpendicular@left
+
+
+% edge mode = rounded
+
+\def\gtr@edge@rounded@line@vert(#1,#2){%
+ \def\gtr@temp{\pgfsetcornersarced{\pgfpoint{\gtrkv@edge@arc}{\gtrkv@edge@arc}}}%
+ \ifdim\dimexpr#1-\gtr@dat@draw@x>-\gtrkv@edge@arc\relax%
+ \ifdim\dimexpr#1-\gtr@dat@draw@x<\gtrkv@edge@arc\relax%
+ \def\gtr@temp{}%
+ \fi\fi%
+ \draw[gtr@link]\pgfextra{\gtr@temp\pgfsetarrowsend{}\pgfsetshortenend{0pt}} (#1,#2)|-(dat@draw);%
+}
+
+\def\gtr@edge@rounded@line@vert@inv(#1,#2){%
+ \def\gtr@temp{\pgfsetcornersarced{\pgfpoint{\gtrkv@edge@arc}{\gtrkv@edge@arc}}}%
+ \ifdim\dimexpr#1-\gtr@dat@draw@x>-\gtrkv@edge@arc\relax%
+ \ifdim\dimexpr#1-\gtr@dat@draw@x<\gtrkv@edge@arc\relax%
+ \def\gtr@temp{}%
+ \fi\fi%
+ \draw[gtr@link]\pgfextra{\gtr@temp\pgfsetarrowsstart{}\pgfsetshortenstart{0pt}} (dat@draw)-|(#1,#2);%
+}
+
+\def\gtr@edge@rounded@line@hori(#1,#2){%
+ \def\gtr@temp{\pgfsetcornersarced{\pgfpoint{\gtrkv@edge@arc}{\gtrkv@edge@arc}}}%
+ \ifdim\dimexpr#2-\gtr@dat@draw@y>-\gtrkv@edge@arc\relax%
+ \ifdim\dimexpr#2-\gtr@dat@draw@y<\gtrkv@edge@arc\relax%
+ \def\gtr@temp{}%
+ \fi\fi%
+ \draw[gtr@link]\pgfextra{\gtr@temp\pgfsetarrowsend{}\pgfsetshortenend{0pt}} (#1,#2)-|(dat@draw);%
+}
+
+\def\gtr@edge@rounded@line@hori@inv(#1,#2){%
+ \def\gtr@temp{\pgfsetcornersarced{\pgfpoint{\gtrkv@edge@arc}{\gtrkv@edge@arc}}}%
+ \ifdim\dimexpr#2-\gtr@dat@draw@y>-\gtrkv@edge@arc\relax%
+ \ifdim\dimexpr#2-\gtr@dat@draw@y<\gtrkv@edge@arc\relax%
+ \def\gtr@temp{}%
+ \fi\fi%
+ \draw[gtr@link]\pgfextra{\gtr@temp\pgfsetarrowsstart{}\pgfsetshortenstart{0pt}} (dat@draw)|-(#1,#2);%
+}
+
+\def\gtr@edge@rounded@down{%
+ \gtr@forlistloop{\gtr@edge@rounded@line@vert@inv}{\gtr@dat@draw@chi}%
+ \gtr@forlistloop{\gtr@edge@rounded@line@vert}{\gtr@dat@draw@par}%
+ \draw[line cap=round,gtr@link,-]\pgfextra{\pgfsetshortenstart{0pt}\pgfsetshortenend{0pt}} (dat@draw)--(dat@draw);%
+}
+
+\let\gtr@edge@rounded@up\gtr@edge@rounded@down
+
+\def\gtr@edge@rounded@left{%
+ \gtr@forlistloop{\gtr@edge@rounded@line@hori@inv}{\gtr@dat@draw@chi}%
+ \gtr@forlistloop{\gtr@edge@rounded@line@hori}{\gtr@dat@draw@par}%
+ \draw[line cap=round,gtr@link,-]\pgfextra{\pgfsetshortenstart{0pt}\pgfsetshortenend{0pt}} (dat@draw)--(dat@draw);%
+}
+
+\let\gtr@edge@rounded@right\gtr@edge@rounded@left
+
+
+% edge mode = swing
+
+\def\gtr@edge@swing@line@vertA(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsend{}\pgfsetshortenend{0pt}} (#1,#2) to[controls=+(270:\gtrkv@edge@swingcontrol) and +(90:\gtrkv@edge@swingcontrol)] (dat@draw);
+}
+
+\def\gtr@edge@swing@line@vertA@inv(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsstart{}\pgfsetshortenstart{0pt}} (dat@draw) to[controls=+(90:\gtrkv@edge@swingcontrol) and +(270:\gtrkv@edge@swingcontrol)] (#1,#2);
+}
+
+\def\gtr@edge@swing@line@vertB(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsend{}\pgfsetshortenend{0pt}} (#1,#2) to[controls=+(90:\gtrkv@edge@swingcontrol) and +(270:\gtrkv@edge@swingcontrol)] (dat@draw);
+}
+
+\def\gtr@edge@swing@line@vertB@inv(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsstart{}\pgfsetshortenstart{0pt}} (dat@draw) to[controls=+(270:\gtrkv@edge@swingcontrol) and +(90:\gtrkv@edge@swingcontrol)] (#1,#2);
+}
+
+\def\gtr@edge@swing@line@horiA(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsend{}\pgfsetshortenend{0pt}} (#1,#2) to[controls=+(180:\gtrkv@edge@swingcontrol) and +(0:\gtrkv@edge@swingcontrol)] (dat@draw);
+}
+
+\def\gtr@edge@swing@line@horiA@inv(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsstart{}\pgfsetshortenstart{0pt}} (dat@draw) to[controls=+(0:\gtrkv@edge@swingcontrol) and +(180:\gtrkv@edge@swingcontrol)] (#1,#2);
+}
+
+\def\gtr@edge@swing@line@horiB(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsend{}\pgfsetshortenend{0pt}} (#1,#2) to[controls=+(0:\gtrkv@edge@swingcontrol) and +(180:\gtrkv@edge@swingcontrol)] (dat@draw);
+}
+
+\def\gtr@edge@swing@line@horiB@inv(#1,#2){%
+ \draw[gtr@link]\pgfextra{\pgfsetarrowsstart{}\pgfsetshortenstart{0pt}} (dat@draw) to[controls=+(180:\gtrkv@edge@swingcontrol) and +(0:\gtrkv@edge@swingcontrol)] (#1,#2);
+}
+
+\def\gtr@edge@swing@down{%
+ \gtr@forlistloop{\gtr@edge@swing@line@vertB@inv}{\gtr@dat@draw@chi}%
+ \gtr@forlistloop{\gtr@edge@swing@line@vertA}{\gtr@dat@draw@par}%
+}
+
+\def\gtr@edge@swing@up{%
+ \gtr@forlistloop{\gtr@edge@swing@line@vertA@inv}{\gtr@dat@draw@chi}%
+ \gtr@forlistloop{\gtr@edge@swing@line@vertB}{\gtr@dat@draw@par}%
+}
+
+\def\gtr@edge@swing@left{%
+ \gtr@forlistloop{\gtr@edge@swing@line@horiB@inv}{\gtr@dat@draw@chi}%
+ \gtr@forlistloop{\gtr@edge@swing@line@horiA}{\gtr@dat@draw@par}%
+}
+
+\def\gtr@edge@swing@right{%
+ \gtr@forlistloop{\gtr@edge@swing@line@horiA@inv}{\gtr@dat@draw@chi}%
+ \gtr@forlistloop{\gtr@edge@swing@line@horiB}{\gtr@dat@draw@par}%
+}
+
+
+% edge mode = mesh
+
+\def\gtr@edge@mesh@line(#1){%
+ \def\do##1{%
+ \begingroup\edef\x{\endgroup\noexpand\draw[gtr@link] (#1) to[\expandonce\gtrkv@edge@meshoptions] (##1);}%
+ \x%
+ }%
+ \dolistloop{\gtr@dat@draw@chi}%
+}
+
+\def\gtr@edge@mesh@down{%
+ \gtr@forlistloop{\gtr@edge@mesh@line}{\gtr@dat@draw@par}%
+}
+
+\let\gtr@edge@mesh@up\gtr@edge@mesh@down
+\let\gtr@edge@mesh@left\gtr@edge@mesh@down
+\let\gtr@edge@mesh@right\gtr@edge@mesh@down
+
+
+% edge mode = custom
+
+\def\gtr@edge@custom@none@macro#1#2#3#4{}
+
+\def\gtr@edge@custom@down{\gtr@edge@custom@down@macro{\gtr@dat@draw@par}{\gtr@dat@draw@chi}{dat@draw}{gtr@link}}
+\def\gtr@edge@custom@up{\gtr@edge@custom@up@macro{\gtr@dat@draw@par}{\gtr@dat@draw@chi}{dat@draw}{gtr@link}}
+\def\gtr@edge@custom@left{\gtr@edge@custom@left@macro{\gtr@dat@draw@par}{\gtr@dat@draw@chi}{dat@draw}{gtr@link}}
+\def\gtr@edge@custom@right{\gtr@edge@custom@right@macro{\gtr@dat@draw@par}{\gtr@dat@draw@chi}{dat@draw}{gtr@link}}
+
+%%%%%%%%%%%%%%%%%%
+
+\def\gtr@draw@family@extra(#1#2#3){%
+ \begingroup%
+ \csundef{gtr@fam@\gtr@currentfamily @par}%
+ \def\do##1{%
+ \gtr@getPerNumForId{##1}%
+ \ifdefempty{\gtr@tmp@num}{}{%
+ \listcseadd{gtr@fam@\gtr@currentfamily @par}{\gtr@tmp@num}}%
+ }%
+ \docsvlist{#1}%
+ \csundef{gtr@fam@\gtr@currentfamily @chi}%
+ \def\do##1{%
+ \gtr@getPerNumForId{##1}%
+ \ifdefempty{\gtr@tmp@num}{}{%
+ \listcseadd{gtr@fam@\gtr@currentfamily @chi}{\gtr@tmp@num}}%
+ }%
+ \docsvlist{#2}%
+ \gtrset{edges={#3}}%
+ %
+ \gtr@predraw@family{\gtr@currentfamily}%
+ \dimdef\gtr@dat@draw@x{\gtr@dat@draw@x+\gtrkv@edge@core@xshift}%
+ \dimdef\gtr@dat@draw@y{\gtr@dat@draw@y+\gtrkv@edge@core@yshift}%
+ \coordinate (dat@draw) at (\gtr@dat@draw@x,\gtr@dat@draw@y) {};
+ \ifnum\numexpr\gtr@legnum>\gtrkv@edge@noleg\relax%
+ \tikzset{gtr@link/.style={/gtr/edge/gtr@edge@background}}%,
+ \csuse{gtr@edge@\gtrkv@edgemode @\gtr@timeflow}%
+ \tikzset{gtr@link/.style={/gtr/edge/gtr@edge@foreground}}%,
+ \csuse{gtr@edge@\gtrkv@edgemode @\gtr@timeflow}%
+ \fi%
+ \endgroup%
+}
+
+\def\gtr@draw@family#1{%
+ \begingroup%
+ \let\gtr@extra@edges@pre=\@undefined%
+ \let\gtr@extra@edges@app=\@undefined%
+ \gtrset{code={%
+ \gtr@cs@keysalsofrom{gtr@fam@#1@opt@subtree}%
+ \gtr@cs@keysalsofrom{gtr@fam@#1@opt@family}%
+ }}%
+ \gtr@forlistloop{\gtr@draw@family@extra}{\gtr@extra@edges@pre}%
+ \gtr@predraw@family{#1}%
+ \dimdef\gtr@dat@draw@x{\gtr@dat@draw@x+\gtrkv@edge@core@xshift}%
+ \dimdef\gtr@dat@draw@y{\gtr@dat@draw@y+\gtrkv@edge@core@yshift}%
+ \coordinate[alias={\csuse{gtr@fam@#1@id}},alias={f@#1}] (dat@draw) at (\gtr@dat@draw@x,\gtr@dat@draw@y) {};
+ \ifnum\numexpr\gtr@legnum>\gtrkv@edge@noleg\relax%
+ \tikzset{gtr@link/.style={/gtr/edge/gtr@edge@background}}%,
+ \csuse{gtr@edge@\gtrkv@edgemode @\gtr@timeflow}%
+ \tikzset{gtr@link/.style={/gtr/edge/gtr@edge@foreground}}%,
+ \csuse{gtr@edge@\gtrkv@edgemode @\gtr@timeflow}%
+ \fi%
+ \gtr@forlistloop{\gtr@draw@family@extra}{\gtr@extra@edges@app}%
+ \ifdefvoid{\gtrkv@family@label}{}{%
+ \begingroup\edef\x{\endgroup\noexpand\node[\expandonce\gtrkv@family@label@options] at (f@#1) {\expandonce\gtrkv@family@label};}%
+ \x%
+ }%
+ \endgroup%
+}
+
+\def\gtr@draw@all@families{%
+ \begin{scope}[genealogytree edges scope]%
+ \gtrset{%
+ use family database,
+ database format=marriage,
+ code={\pgfkeysalsofrom{\gtrkv@database@label}},
+ }%
+ \gtr@forall@families{\gtr@draw@family}%
+ \end{scope}%
+}
+
+
+% fit to family / subtree
+
+\def\gtr@addboundary@node#1{%
+ \pgfpointanchor{p@#1}{south west}\unskip%
+ \ifdim\pgf@x<\pgf@xa\relax%
+ \pgf@xa\pgf@x%
+ \fi%
+ \ifdim\pgf@y<\pgf@ya\relax%
+ \pgf@ya\pgf@y%
+ \fi%
+ \pgfpointanchor{p@#1}{north east}\unskip%
+ \ifdim\pgf@x>\pgf@xb\relax%
+ \pgf@xb\pgf@x%
+ \fi%
+ \ifdim\pgf@y>\pgf@yb\relax%
+ \pgf@yb\pgf@y%
+ \fi%
+}%
+
+
+\def\gtr@getboundingrectangle@family#1{%
+ \pgf@xa=\maxdimen%
+ \pgf@ya=\maxdimen%
+ \pgf@xb=-\maxdimen%
+ \pgf@yb=-\maxdimen%
+ \letcs\gtr@temp@list{gtr@fam@#1@chi}%
+ \ifdefvoid{\gtr@temp@list}{}{%
+ \forlistloop{\gtr@addboundary@node}{\gtr@temp@list}%
+ }%
+ \letcs\gtr@temp@list{gtr@fam@#1@par}%
+ \ifdefvoid{\gtr@temp@list}{}{%
+ \forlistloop{\gtr@addboundary@node}{\gtr@temp@list}%
+ }%
+ \ifdim\pgf@xa>\pgf@xb\relax%
+ \pgf@xa=0pt%
+ \pgf@ya=0pt%
+ \pgf@xb=0pt%
+ \pgf@yb=0pt%
+ \fi%
+}
+
+\def\gtr@pushchildfamily#1{%
+ \ifcsname gtr@per@#1@parof\endcsname%
+ \gtr@famstack@push{\csname gtr@per@#1@parof\endcsname}%
+ \fi%
+}
+
+\def\gtr@pushparentfamily#1{%
+ \ifcsname gtr@per@#1@chiof\endcsname%
+ \gtr@famstack@push{\csname gtr@per@#1@chiof\endcsname}%
+ \fi%
+}
+
+
+\def\gtr@getboundingrectangle@subtree#1{%
+ \pgf@xa=\maxdimen%
+ \pgf@ya=\maxdimen%
+ \pgf@xb=-\maxdimen%
+ \pgf@yb=-\maxdimen%
+ \gtr@famstack@push{#1}%
+ \loop%
+ \gtr@famstack@popto{\gtr@currentfamily}%
+ \letcs\gtr@temp@list{gtr@fam@\gtr@currentfamily @patchi}%
+ \ifdefvoid{\gtr@temp@list}{}{%
+ \forlistloop{\gtr@addboundary@node}{\gtr@temp@list}%
+ \ifcsstring{gtr@fam@\gtr@currentfamily @type}{chi}{%
+ \forlistloop{\gtr@pushchildfamily}{\gtr@temp@list}}%
+ {%
+ \ifcsstring{gtr@fam@\gtr@currentfamily @type}{uni}{%
+ \forlistloop{\gtr@pushchildfamily}{\gtr@temp@list}}{}%
+ }%
+ }%
+ \letcs\gtr@temp@list{gtr@fam@\gtr@currentfamily @patpar}%
+ \ifdefvoid{\gtr@temp@list}{}{%
+ \forlistloop{\gtr@addboundary@node}{\gtr@temp@list}%
+ \ifcsstring{gtr@fam@\gtr@currentfamily @type}{par}{%
+ \forlistloop{\gtr@pushparentfamily}{\gtr@temp@list}}{}%
+ }%
+ \ifnum\gtr@famstack@size>0\relax%
+ \repeat%
+ \ifdim\pgf@xa>\pgf@xb\relax%
+ \pgf@xa=0pt%
+ \pgf@ya=0pt%
+ \pgf@xb=0pt%
+ \pgf@yb=0pt%
+ \fi%
+}
+
+
+\tikzset{
+ fit to family/.code={%
+ \gtr@getFamNumForId{#1}%
+ \gtr@getboundingrectangle@family{\gtr@tmp@num}%
+ \pgfkeysalso{fit/.expanded={(\the\pgf@xa,\the\pgf@ya)(\the\pgf@xb,\the\pgf@yb)}}%
+ },
+ fit to subtree/.code={%
+ \gtr@getFamNumForId{#1}%
+ \gtr@getboundingrectangle@subtree{\gtr@tmp@num}%
+ \pgfkeysalso{fit/.expanded={(\the\pgf@xa,\the\pgf@ya)(\the\pgf@xb,\the\pgf@yb)}}%
+ },
+}