%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrcore.processing.code.tex: Processing %% %% ------------------------------------------------------------------------------------------- %% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm %% ------------------------------------------------------------------------------------------- %% %% 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{2.3.0} %%%%%%%%%%%%%%%%%%%%%%% %% Processing - common %%%%%%%%%%%%%%%%%%%%%%% % register a macro to localizable for levels % #1: variable % #2: key setting % #3: global save \def\gtr@proc@register@level@local@core#1#2#3{% \appto\gtr@proc@level@save@settings{\let#3#2}% \appto\gtr@proc@level@load@settings{\let#2#3}% \appto\gtr@proc@level@globalize@settings{\global\let#1#2}% } % register a macro to be localizable for levels % #1: variable % key setting: gtr@@kv@@#1 % global save: gtr@@save@@#1 \def\gtr@proc@register@level@local#1{% \begingroup\edef\x{\endgroup\noexpand\gtr@proc@register@level@local@core{% \noexpand#1% }{% \csname gtr@@kv@@\expandafter\@gobble\string#1\endcsname% }{% \csname gtr@@save@@\expandafter\@gobble\string#1\endcsname% }}\x% } \gtr@proc@register@level@local{\gtr@level@distance} \gtr@proc@register@level@local{\gtr@level@size} \gtr@proc@register@level@local{\gtr@node@minsize} \gtr@proc@register@level@local{\gtr@node@maxsize} \gtr@proc@register@level@local{\gtr@dist@sibling@par} \gtr@proc@register@level@local{\gtr@dist@sibling@chi} \gtr@proc@register@level@local{\gtr@dist@parent@par} \gtr@proc@register@level@local{\gtr@dist@parent@chi} \gtr@proc@register@level@local{\gtr@dist@further} \def\gtr@proc@level@opt{% \begingroup% \gtr@proc@level@load@settings% % \global\let\gtr@gkv@opt@family@level\@empty% \global\let\gtr@gkv@opt@subtree@level\@empty% \global\let\gtr@gkv@opt@node@level\@empty% % \gtrset{% family/.code={\gtrkeysgappto\gtr@gkv@opt@family@level{##1}}, subtree/.code={\gtrkeysgappto\gtr@gkv@opt@subtree@level{##1}}, node/.code={\gtrkeysgappto\gtr@gkv@opt@node@level{##1}}, }% % \global\gtr@ignorefalse% \gtrset{level=\number\gtr@c@level,level \number\gtr@c@level/.try}% \ifgtr@ignore% \global\def\gtr@gkv@opt@ignore@level{ignore}% \else% \global\let\gtr@gkv@opt@ignore@level\@empty% \fi% % \gtr@proc@level@globalize@settings% % \endgroup% % \gtr@init@leveldimens% } \long\def\gtr@proc@subtree@opt#1{% \global\gtr@ignorefalse% \begingroup% \gtrset{id=,pivot shift=0pt, family/.code={\gtrkeysgappto\gtr@gkv@opt@family{##1}\gtrset{##1}}, subtree/.code={\gtrkeysgappto\gtr@gkv@opt@subtree{##1}}, node/.code={\gtrkeysgappto\gtr@gkv@opt@family{##1}},% sic! }% \global\let\gtr@gkv@opt@family\gtr@gkv@opt@family@level% \global\let\gtr@gkv@opt@subtree\gtr@gkv@opt@subtree@level% \gtrset{#1,code={\pgfkeysalsofrom{\gtr@gkv@opt@ignore@level}\gtr@key@keysalsofrom{/gtr/sopt/\gtr@gkv@id}}}% \endgroup% \csedef{gtr@fam@\gtr@currentfamily @id}{\gtr@gkv@id}% \csedef{gtr@fam@\gtr@currentfamily @ps}{\gtr@gkv@pivotshift}% % \gtr@cs@storekey{gtr@fam@\gtr@currentfamily @opt@family}{\gtr@gkv@opt@family}% % \ifcsdef{gtr@fam@\gtr@currentfamily @fam}{% \letcs\gtr@encfamily{gtr@fam@\gtr@currentfamily @fam}% \letcs\gtr@temp{gtr@fam@\gtr@encfamily @opt@subtree}% \gtr@cs@storekeys{gtr@fam@\gtr@currentfamily @opt@subtree}{\gtr@temp}{\gtr@gkv@opt@subtree}% }{% \gtr@cs@storekey{gtr@fam@\gtr@currentfamily @opt@subtree}{\gtr@gkv@opt@subtree}% }% } \def\gtr@proc@@set@enc@family{% \ifnum\gtr@famstack@size>0\relax% \gtr@famstack@peekto{\gtr@encfamily}% \csedef{gtr@fam@\gtr@currentfamily @fam}{\gtr@encfamily}% \fi% \csdef{gtr@fam@\gtr@currentfamily @offset}{0pt}% } \long\def\gtr@proc@@family@begin#1{% \gtr@proc@@set@enc@family% \gtr@proc@subtree@opt{#1}% } \def\gtr@proc@@parent@begin{% \csdef{gtr@fam@\gtr@currentfamily @type}{par}% \gtr@proc@@family@begin% } \def\gtr@proc@@child@begin{% \csdef{gtr@fam@\gtr@currentfamily @type}{chi}% \gtr@proc@@family@begin% } \def\gtr@proc@@union@begin{% \csdef{gtr@fam@\gtr@currentfamily @type}{uni}% \gtr@proc@@family@begin% } \def\gtr@proc@@sandclock@begin{% \csdef{gtr@fam@\gtr@currentfamily @type}{san}% \gtr@proc@@family@begin% } \def\gtr@proc@pivot@reset{% \let\gtr@current@pivot@chi=\@undefined% \let\gtr@current@pivot@par=\@undefined% } \def\gtr@proc@pivot@check@child#1#2{% \ifcsname gtr@per@#1@pivo@chi\endcsname% \let\gtr@current@pivot@chi=#2% \fi% } \def\gtr@proc@pivot@check@parent#1#2{% \ifcsname gtr@per@#1@pivo@par\endcsname% \let\gtr@current@pivot@par=#2% \fi% } \def\gtr@proc@compute@pivotpoint@chi{% \ifdefined\gtr@current@pivot@chi% \let\gtr@tmp@chipos@mid=\gtr@current@pivot@chi% \else% \dimdef\gtr@tmp@chipos@mid{(\gtr@tmp@chipos@A+\gtr@tmp@chipos@B)/2}% \fi% } \def\gtr@proc@compute@pivotpoint@par{% \ifdefined\gtr@current@pivot@par% \let\gtr@tmp@parpos@mid=\gtr@current@pivot@par% \else% \dimdef\gtr@tmp@parpos@mid{(\gtr@tmp@parpos@A+\gtr@tmp@parpos@B)/2}% \fi% } %%%%%%%%%%%%%%%%%%%%%%% %% Processing - parent %%%%%%%%%%%%%%%%%%%%%%% \def\gtr@procpar@following@parent#1{% \ifcsname gtr@per@#1@chiof\endcsname \letcs\gtr@parent@fam{gtr@per@#1@chiof}% \gtr@cont@merge@tree{\gtr@parent@fam}{\gtr@dist@parent@par}% \else \gtr@cont@merge@node{#1}{\gtr@dist@parent@par}% \fi% \let\gtr@tmp@parpos@B=\gtr@tmp@linkpos% \gtr@proc@pivot@check@parent{#1}{\gtr@tmp@linkpos}% } \def\gtr@procpar@first@parent#1{% \let\do=\gtr@procpar@following@parent% \ifcsname gtr@per@#1@chiof\endcsname \letcs\gtr@parent@fam{gtr@per@#1@chiof}% \gtr@cont@first@tree{\gtr@parent@fam}% \else \gtr@cont@first@node{#1}% \fi% \let\gtr@tmp@parpos@A=\gtr@tmp@linkpos% \let\gtr@tmp@parpos@B=\gtr@tmp@linkpos% \gtr@proc@pivot@check@parent{#1}{\gtr@tmp@linkpos}% } \def\gtr@procpar@following@child#1{% \gtr@cont@merge@anchor{#1}{\gtr@dist@sibling@par}% \let\gtr@tmp@chipos@B=\gtr@tmp@linkpos% \gtr@proc@pivot@check@child{#1}{\gtr@tmp@linkpos}% } \def\gtr@procpar@first@child#1{% \let\do=\gtr@procpar@following@child% \gtr@cont@first@anchor{#1}% \let\gtr@tmp@chipos@A=\gtr@tmp@linkpos% \let\gtr@tmp@chipos@B=\gtr@tmp@linkpos% \gtr@proc@pivot@check@child{#1}{\gtr@tmp@linkpos}% } \def\gtr@proc@@parent@end{% \ifcsname gtr@fam@\gtr@currentfamily @g\endcsname% \else\gtr@error{No g-node in parent family (\gtr@currentfamily)}{Every family needs a g-node}% \fi% \gtr@proc@pivot@reset% \csdef{gtr@fam@\gtr@currentfamily @frac}{0.5}% \gtr@set@position@family{\gtr@currentfamily}% \let\gtr@tmp@nextwest=\@undefined% \let\gtr@tmp@nexteast=\@undefined% % \csdef{gtr@fam@\gtr@currentfamily @offset}{0pt}% \letcs\gtr@currentchildlist{gtr@fam@\gtr@currentfamily @chi}% \letcs\gtr@currentparentlist{gtr@fam@\gtr@currentfamily @par}% % \ifdefined\gtr@currentparentlist% \let\do=\gtr@procpar@first@parent% \dolistloop{\gtr@currentparentlist}% \gtr@proc@compute@pivotpoint@par% \fi% \let\do=\gtr@procpar@first@child% \dolistloop{\gtr@currentchildlist}% \gtr@proc@compute@pivotpoint@chi% \ifdefined\gtr@currentparentlist% \dimdef\gtr@temp{\gtr@tmp@parpos@mid-\gtr@tmp@chipos@mid+\csuse{gtr@fam@\gtr@currentfamily @ps}}% \gtr@cont@shift{\gtr@currentchildlist}{\gtr@temp}% \fi% } %%%%%%%%%%%%%%%%%%%%%%% %% Processing - child %%%%%%%%%%%%%%%%%%%%%%% \def\gtr@procchi@following@parent#1{% \gtr@cont@merge@anchor{#1}{\gtr@dist@parent@chi}% \let\gtr@tmp@parpos@B=\gtr@tmp@linkpos% \gtr@proc@pivot@check@parent{#1}{\gtr@tmp@linkpos}% } \def\gtr@procchi@first@parent#1{% \let\do=\gtr@procchi@following@parent% \gtr@cont@first@anchor{#1}% \let\gtr@tmp@parpos@A=\gtr@tmp@linkpos% \let\gtr@tmp@parpos@B=\gtr@tmp@linkpos% \gtr@proc@pivot@check@parent{#1}{\gtr@tmp@linkpos}% } \def\gtr@procchi@following@child#1{% \ifcsname gtr@per@#1@parof\endcsname \letcs\gtr@child@fam{gtr@per@#1@parof}% \gtr@cont@merge@tree{\gtr@child@fam}{\gtr@dist@sibling@chi}% \else \gtr@cont@merge@node{#1}{\gtr@dist@sibling@chi}% \fi% \let\gtr@tmp@chipos@B=\gtr@tmp@linkpos% \gtr@proc@pivot@check@child{#1}{\gtr@tmp@linkpos}% } \def\gtr@procchi@first@child#1{% \let\do=\gtr@procchi@following@child% \ifcsname gtr@per@#1@parof\endcsname \letcs\gtr@child@fam{gtr@per@#1@parof}% \gtr@cont@first@tree{\gtr@child@fam}% \else \gtr@cont@first@node{#1}% \fi% \let\gtr@tmp@chipos@A=\gtr@tmp@linkpos% \let\gtr@tmp@chipos@B=\gtr@tmp@linkpos% \gtr@proc@pivot@check@child{#1}{\gtr@tmp@linkpos}% } \def\gtr@proc@@child@end{% \ifcsname gtr@fam@\gtr@currentfamily @g\endcsname% \else\gtr@error{No g-node in child family (\gtr@currentfamily)}{Every family needs a g-node}% \fi% \gtr@proc@pivot@reset% \letcs\gtr@gnode{gtr@fam@\gtr@currentfamily @g}% \csdef{gtr@fam@\gtr@currentfamily @offset}{0pt}% \ifcsname gtr@fam@\gtr@currentfamily @union\endcsname% \numdef\gtr@@parts{2}% \def\do##1{\numdef\gtr@@parts{\gtr@@parts+1}}% \dolistcsloop{gtr@fam@\gtr@currentfamily @union}% \dimdef\gtr@@dimfrac{1pt/\gtr@@parts}% \pgfmathqparse{\gtr@@dimfrac}% \csedef{gtr@fam@\gtr@currentfamily @frac}{\pgfmathresult}% \gtr@set@position@family{\gtr@currentfamily}% \let\gtr@@dimsumfrac=\gtr@@dimfrac% % \def\dodo##1{% \dimdef\gtr@@dimsumfrac{\gtr@@dimsumfrac+\gtr@@dimfrac}% \pgfmathqparse{\gtr@@dimsumfrac}% \csedef{gtr@fam@##1@frac}{\pgfmathresult}% \gtr@set@position@family{##1}% \ifcsname gtr@fam@##1@g\endcsname% \else% \listcseadd{gtr@fam@##1@par}{\gtr@gnode}% \gtr@add@gnode{\gtr@gnode}{##1}% \fi% \let\do=\dodo% loop-in-loop }% \let\do=\dodo% \dolistcsloop{gtr@fam@\gtr@currentfamily @union}% \else% \csdef{gtr@fam@\gtr@currentfamily @frac}{0.5}% \gtr@set@position@family{\gtr@currentfamily}% \fi% \let\gtr@tmp@nextwest=\@undefined% \let\gtr@tmp@nexteast=\@undefined% % \letcs\gtr@currentchildlist{gtr@fam@\gtr@currentfamily @patchi}% \letcs\gtr@currentparentlist{gtr@fam@\gtr@currentfamily @patpar}% % \ifdefined\gtr@currentchildlist% \let\do=\gtr@procchi@first@child% \dolistloop{\gtr@currentchildlist}% \gtr@proc@compute@pivotpoint@chi% \fi% \let\do=\gtr@procchi@first@parent% \dolistloop{\gtr@currentparentlist}% \gtr@proc@compute@pivotpoint@par% \ifdefined\gtr@currentchildlist% \dimdef\gtr@temp{\gtr@tmp@chipos@mid-\gtr@tmp@parpos@mid-\csuse{gtr@fam@\gtr@currentfamily @ps}}% \gtr@cont@shift{\gtr@currentparentlist}{\gtr@temp}% \fi% } %%%%%%%%%%%%%%%%%%%%%%% %% Processing - union %%%%%%%%%%%%%%%%%%%%%%% % merge list #1 to #2 \def\gtr@procuni@mergechild@list#1#2{% \ifcsname#1\endcsname% \def\do##1{% \ifcsname gtr@per@##1@parof\endcsname% \else% \gtr@add@family{##1}{\gtr@encfamily}% \fi% \listcseadd{#2}{##1}% }% \dolistcsloop{#1}% \fi% } % merge list #1 to #2 \def\gtr@procuni@mergeparent@list#1#2{% \ifcsname#1\endcsname% \def\do##1{% \gtr@add@family{##1}{\gtr@encfamily}% \listcseadd{#2}{##1}% }% \dolistcsloop{#1}% \fi% } \def\gtr@proc@@union@end{% \gtr@famstack@peekto{\gtr@encfamily}% \gtr@add@union{\gtr@currentfamily}{\gtr@encfamily}% \gtr@procuni@mergechild@list{gtr@fam@\gtr@currentfamily @chi}{gtr@fam@\gtr@encfamily @patchi}% \gtr@procuni@mergeparent@list{gtr@fam@\gtr@currentfamily @par}{gtr@fam@\gtr@encfamily @patpar}% \ifcsname gtr@fam@\gtr@encfamily @g\endcsname \letcs\gtr@gnode{gtr@fam@\gtr@encfamily @g}% \listcseadd{gtr@fam@\gtr@currentfamily @par}{\gtr@gnode}% \gtr@add@gnode{\gtr@gnode}{\gtr@currentfamily}% \fi% } %%%%%%%%%%%%%%%%%%%%%%% %% Processing - sandclock %%%%%%%%%%%%%%%%%%%%%%% \def\gtr@proc@@sandclock@end{% \gtr@proc@pivot@reset% \csdef{gtr@fam@\gtr@currentfamily @frac}{0.5}% \gtr@set@position@family{\gtr@currentfamily}% \let\gtr@tmp@nextwest=\@undefined% \let\gtr@tmp@nexteast=\@undefined% % \csdef{gtr@fam@\gtr@currentfamily @offset}{0pt}% \letcs\gtr@currentchildlist{gtr@fam@\gtr@currentfamily @chi}% \letcs\gtr@currentparentlist{gtr@fam@\gtr@currentfamily @par}% % \ifdefined\gtr@currentparentlist% \let\do=\gtr@procpar@first@parent% \dolistloop{\gtr@currentparentlist}% \gtr@proc@compute@pivotpoint@par% \csedef{gtr@fam@\gtr@currentfamily @ceast@panchor}{\gtr@tmp@nexteast}% \csedef{gtr@fam@\gtr@currentfamily @cwest@panchor}{\gtr@tmp@nextwest}% \fi% % \let\gtr@tmp@nextwest=\@undefined% \let\gtr@tmp@nexteast=\@undefined% \ifdefined\gtr@currentchildlist% \let\do=\gtr@procchi@first@child% \dolistloop{\gtr@currentchildlist}% \gtr@proc@compute@pivotpoint@chi% \dimdef\gtr@temp{\gtr@tmp@chipos@mid-\gtr@tmp@parpos@mid-\csuse{gtr@fam@\gtr@currentfamily @ps}}% \ifdefined\gtr@currentparentlist% \gtr@cont@shift@sandclock{\gtr@currentparentlist}{\gtr@temp}% \fi% \csedef{gtr@fam@\gtr@currentfamily @ceast@canchor}{\gtr@tmp@nexteast}% \csedef{gtr@fam@\gtr@currentfamily @cwest@canchor}{\gtr@tmp@nextwest}% \fi% } %%%%%%%%%%%%%%%%%%%%%%% %% Processing - g/p/c %%%%%%%%%%%%%%%%%%%%%%% \long\def\gtr@proc@@parent@g@content{% \gtr@add@child{\gtr@currentperson}{\gtr@currentfamily}% \gtr@add@gnode{\gtr@currentperson}{\gtr@currentfamily}% \gtr@add@family{\gtr@currentperson}{\gtr@currentfamily}% \ifnum\gtr@famstack@size>0\relax% \gtr@famstack@peekto{\gtr@childfamily}% \gtr@add@parent{\gtr@currentperson}{\gtr@childfamily}% \fi% } \long\def\gtr@proc@@child@g@content{% \gtr@add@parent{\gtr@currentperson}{\gtr@currentfamily}% \gtr@add@gnode{\gtr@currentperson}{\gtr@currentfamily}% \gtr@add@family{\gtr@currentperson}{\gtr@currentfamily}% \ifnum\gtr@famstack@size>0\relax% \gtr@famstack@peekto{\gtr@parentfamily}% \gtr@add@child{\gtr@currentperson}{\gtr@parentfamily}% \fi% } \long\def\gtr@proc@@p@content{% \gtr@add@parent{\gtr@currentperson}{\gtr@currentfamily}% \gtr@add@family{\gtr@currentperson}{\gtr@currentfamily}% } \long\def\gtr@proc@@c@content{% \gtr@add@child{\gtr@currentperson}{\gtr@currentfamily}% \gtr@add@family{\gtr@currentperson}{\gtr@currentfamily}% } \gtrset{ linked@family@options/.is choice, linked@family@options/p/.code={}, linked@family@options/c/.code={}, linked@family@options/pc/.code={}, linked@family@options/gc/.code={}, c@mpl@m@nt@d/.code={\gdef\gtr@flag@node@c{true}}, } \def\gtr@linked@family@options@p{} \def\gtr@linked@family@options@c{} \def\gtr@linked@family@options@g{% \ifnum\gtr@famstack@size>0\relax% \gtr@famstack@peekto{\gtr@linkedfamily}% \gtr@cs@keysalsofrom{gtr@fam@\gtr@linkedfamily @opt@family}% \fi% } \long\def\gtr@proc@add@node#1#2{% \ifcsdef{gtr@per@\gtr@currentperson @box}% {\letcs\gtr@pbox{gtr@per@\gtr@currentperson @box}}% {\newbox\gtr@pbox\csxdef{gtr@per@\gtr@currentperson @box}{\the\gtr@pbox}}% % \setbox\gtr@pbox\hbox{% \begingroup% \begin{pgfinterruptpicture}% \global\gtr@ignorefalse% \gdef\gtr@flag@node@c{false}% \gdef\gtr@flag@node@r{unrelated}% \gdef\gtr@flag@node@s{neuter}% \gtrset{id=,distance=-1sp,pivot=none,tikz=, code={% \gtr@cs@keysalsofrom{gtr@fam@\gtr@currentfamily @opt@subtree}% \csuse{gtr@linked@family@options@\gtrnodetype}% \gtr@cs@keysalsofrom{gtr@fam@\gtr@currentfamily @opt@family}% \pgfkeysalsofrom{\gtr@gkv@opt@node@level}},% #1, code={\gtr@key@keysalsofrom{/gtr/nopt/\gtr@gkv@id}}% }% \unless\ifgtr@ignore% \gtr@box@content@interpreter{#2}% \gtr@box@content@processor% \fi% \end{pgfinterruptpicture}% \endgroup% }% \unless\ifgtr@ignore% \csedef{gtr@per@\gtr@currentperson @id}{\gtr@gkv@id}% \csedef{gtr@per@\gtr@currentperson @flag@c}{\gtr@flag@node@c}% \csedef{gtr@per@\gtr@currentperson @flag@r}{\gtr@flag@node@r}% \csedef{gtr@per@\gtr@currentperson @flag@s}{\gtr@flag@node@s}% \ifdim\gtr@gkv@distance>-1sp\relax% \csedef{gtr@per@\gtr@currentperson @distance}{\gtr@gkv@distance}% \fi% \ifcase\number\gtr@gkv@pivot\relax% \or\csedef{gtr@per@\gtr@currentperson @pivo@chi}{}% \or\csedef{gtr@per@\gtr@currentperson @pivo@par}{}% \else\csedef{gtr@per@\gtr@currentperson @pivo@chi}{}% \csedef{gtr@per@\gtr@currentperson @pivo@par}{}% \fi% \ifx\gtr@gkv@tikz\@empty\else% \csedef{gtr@per@\gtr@currentperson @tikz}{\gtr@gkv@tikz}% \fi% % \gtr@set@level@position{\gtr@currentperson}% \fi% } \def\gtr@add@parent#1#2{% \listcseadd{gtr@fam@#2@par}{#1}% \listcseadd{gtr@fam@#2@patpar}{#1}% \csedef{gtr@per@#1@parof}{#2}% } \def\gtr@add@child#1#2{% \listcseadd{gtr@fam@#2@chi}{#1}% \listcseadd{gtr@fam@#2@patchi}{#1}% \csedef{gtr@per@#1@chiof}{#2}% } \def\gtr@add@gnode#1#2{% \csedef{gtr@fam@#2@g}{#1}% } \def\gtr@add@family#1#2{% \csedef{gtr@per@#1@fam}{#2}% } \def\gtr@add@union#1#2{% \listcseadd{gtr@fam@#2@union}{#1}% } % loop through a single tree \def\gtr@forall@nodes#1{% \numdef\gtr@num@per@count{\gtr@num@per@first}% \loop% \ifnum\gtr@num@per@count<\numexpr\gtr@num@per@last+1\relax% \gtr@set@currentperson{\gtr@num@per@count}% #1{\gtr@currentperson}% \numdef\gtr@num@per@count{\gtr@num@per@count+1}% \repeat% } \def\gtr@forall@families#1{% \numdef\gtr@num@fam@count{\gtr@num@fam@first}% \loop% \ifnum\gtr@num@fam@count<\numexpr\gtr@num@fam@last+1\relax% \gtr@set@currentfamily{\gtr@num@fam@count}% #1{\gtr@currentfamily}% \numdef\gtr@num@fam@count{\gtr@num@fam@count+1}% \repeat% } % linear search for all trees \def\gtr@getPerNumForId@loop#1{% \ifnum#1<\numexpr\gtr@num@per@last+1\relax% \gtr@set@currentperson{#1}% \letcs\gtr@currentid{gtr@per@\gtr@currentperson @id}% \ifx\gtr@tmp@id\gtr@currentid\relax% \let\gtr@tmp@num\gtr@currentperson% \else% \expandafter\gtr@getPerNumForId@loop\expandafter{\number\numexpr#1+1\expandafter}% \fi% \fi% } \def\gtr@getPerNumForId#1{% \edef\gtr@tmp@id{#1}% \edef\gtr@tmp@num{}% \gtr@getPerNumForId@loop{1}% } \def\gtr@getFamNumForId@loop#1{% \ifnum#1<\numexpr\gtr@num@fam@last+1\relax% \gtr@set@currentfamily{#1}% \letcs\gtr@currentid{gtr@fam@\gtr@currentfamily @id}% \ifx\gtr@tmp@id\gtr@currentid\relax% \let\gtr@tmp@num\gtr@currentfamily% \else% \expandafter\gtr@getFamNumForId@loop\expandafter{\number\numexpr#1+1\expandafter}% \fi% \fi% } \def\gtr@getFamNumForId#1{% \edef\gtr@tmp@id{#1}% \edef\gtr@tmp@num{}% \gtr@getFamNumForId@loop{1}% } % #1: child (id) % #2: family (id) \def\gtr@add@child@after@parser#1#2{% \gtr@getPerNumForId{#1}% \let\gtr@tmp@pnum\gtr@tmp@num% person number for ID % \gtr@getFamNumForId{#2}% \let\gtr@tmp@fnum\gtr@tmp@num% family number for ID % \listcseadd{gtr@fam@\gtr@tmp@fnum @chi}{\gtr@tmp@pnum}% } % #1: parent (id) % #2: family (id) \def\gtr@add@parent@after@parser#1#2{% \gtr@getPerNumForId{#1}% \let\gtr@tmp@pnum\gtr@tmp@num% person number for ID % \gtr@getFamNumForId{#2}% \let\gtr@tmp@fnum\gtr@tmp@num% family number for ID % \listcseadd{gtr@fam@\gtr@tmp@fnum @par}{\gtr@tmp@pnum}% } \def\gtr@disconnect@child#1#2{% \letcs\gtr@temp@list{gtr@fam@#2@chi}% \ifdefvoid{\gtr@temp@list}{}{% \csundef{gtr@fam@#2@chi}% \def\do##1{% \ifdefstring{#1}{##1}{}{\listcseadd{gtr@fam@#2@chi}{##1}}% }% \dolistloop{\gtr@temp@list}% }% } \def\gtr@disconnect@node@as@child#1{% \def\gtr@tmp@pnum{#1}% \letcs\gtr@tmp@fnum{gtr@per@#1@chiof}% \ifdefvoid{\gtr@tmp@fnum}{}{% \gtr@disconnect@child{\gtr@tmp@pnum}{\gtr@tmp@fnum}% }% } \def\gtr@remove@child@after@parser#1#2{% \gtr@getPerNumForId{#1}% \ifdefempty{\gtr@tmp@num}{}{% \let\gtr@tmp@pnum\gtr@tmp@num% person number for ID % \gtr@getFamNumForId{#2}% \ifdefempty{\gtr@tmp@num}{}{% \let\gtr@tmp@fnum\gtr@tmp@num% family number for ID % \gtr@disconnect@child{\gtr@tmp@pnum}{\gtr@tmp@fnum}% }% }% } \def\gtr@disconnect@parent#1#2{% \letcs\gtr@temp@list{gtr@fam@#2@par}% \ifdefvoid{\gtr@temp@list}{}{% \csundef{gtr@fam@#2@par}% \def\do##1{% \ifdefstring{#1}{##1}{}{\listcseadd{gtr@fam@#2@par}{##1}}% }% \dolistloop{\gtr@temp@list}% }% } \def\gtr@disconnect@node@as@parent#1{% \def\gtr@tmp@pnum{#1}% \letcs\gtr@tmp@fnum{gtr@per@#1@parof}% \ifdefvoid{\gtr@tmp@fnum}{}{% \gtr@disconnect@parent{\gtr@tmp@pnum}{\gtr@tmp@fnum}% }% } \def\gtr@remove@parent@after@parser#1#2{% \gtr@getPerNumForId{#1}% \ifdefempty{\gtr@tmp@num}{}{% \let\gtr@tmp@pnum\gtr@tmp@num% person number for ID % \gtr@getFamNumForId{#2}% \ifdefempty{\gtr@tmp@num}{}{% \let\gtr@tmp@fnum\gtr@tmp@num% family number for ID % \gtr@disconnect@parent{\gtr@tmp@pnum}{\gtr@tmp@fnum}% }% }% }