summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/genealogytree/gtrcore.parser.code.tex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/genealogytree/gtrcore.parser.code.tex
Initial commit
Diffstat (limited to 'macros/latex/contrib/genealogytree/gtrcore.parser.code.tex')
-rw-r--r--macros/latex/contrib/genealogytree/gtrcore.parser.code.tex627
1 files changed, 627 insertions, 0 deletions
diff --git a/macros/latex/contrib/genealogytree/gtrcore.parser.code.tex b/macros/latex/contrib/genealogytree/gtrcore.parser.code.tex
new file mode 100644
index 0000000000..27e1cdaaf3
--- /dev/null
+++ b/macros/latex/contrib/genealogytree/gtrcore.parser.code.tex
@@ -0,0 +1,627 @@
+%% The LaTeX package genealogytree - version 1.32 (2019/04/08)
+%% gtrcore.parser.code.tex: Parser
+%%
+%% -------------------------------------------------------------------------------------------
+%% Copyright (c) 2013-2019 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{1.32}
+
+%% (local) stack implementation
+\def\gtrnewstack#1{%
+ \csedef{gtr@stack@#1@size}{0}%
+}
+
+\def\gtrstacksize#1{%
+ \csname gtr@stack@#1@size\endcsname%
+}
+
+\def\gtrstackpush#1#2{%
+ \count@\gtrstacksize{#1}%
+ \advance\count@ 1\relax%
+ \csedef{gtr@stack@#1@size}{\number\count@}%
+ \csedef{gtr@stack@#1@\number\count@}{#2}%
+}
+
+\def\gtrstackpopto#1#2{%
+ \count@\gtrstacksize{#1}%
+ \edef#2{\csname gtr@stack@#1@\number\count@\endcsname}%
+ \advance\count@ -1\relax%
+ \csedef{gtr@stack@#1@size}{\number\count@}%
+}
+
+\def\gtrstackpop#1{%
+ \count@\gtrstacksize{#1}%
+ \csname gtr@stack@#1@\number\count@\endcsname%
+ \advance\count@ -1\relax%
+ \csedef{gtr@stack@#1@size}{\number\count@}%
+}
+
+\def\gtrstackpeekto#1#2{%
+ \count@\gtrstacksize{#1}%
+ \edef#2{\csname gtr@stack@#1@\number\count@\endcsname}%
+}
+
+\def\gtrstackpeek#1{%
+ \count@\gtrstacksize{#1}%
+ \csname gtr@stack@#1@\number\count@\endcsname%
+}
+
+\def\gtrmakestack#1{%
+ \gtrnewstack{#1}%
+ \csedef{gtr@stack@#1@size}{0}%
+ \csdef{#1size}{\gtrstacksize{#1}}%
+ \csdef{#1push}{\gtrstackpush{#1}}%
+ \csdef{#1popto}{\gtrstackpopto{#1}}%
+ \csdef{#1pop}{\gtrstackpop{#1}}%
+ \csdef{#1peekto}{\gtrstackpeekto{#1}}%
+ \csdef{#1peek}{\gtrstackpeek{#1}}%
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%% Main Parser
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\newcount\gtr@c@level%
+\newcount\gtr@c@family%
+\newcount\gtr@c@pid%
+
+\gtrmakestack{gtr@famstack@}%
+\gtrmakestack{gtr@levelstack@}%
+
+\gtr@c@family\z@\relax
+\gtr@c@pid\z@\relax
+
+\newcommand{\gtr@parsegraph}[2][]{%
+ \gtrset{#1,ignore family database}%
+ \gtrkv@tikzset%
+ \gtrkv@tcbset%
+ %
+ \let\gtr@timeflow=\gtrkv@timeflow%
+ \letcs\gtr@init@leveldimens{gtr@init@timeflow@\gtr@timeflow}%
+ \letcs\gtr@set@level@position{gtr@set@level@position@\gtr@timeflow}%
+ \letcs\gtr@set@position@family{gtr@set@position@family@\gtr@timeflow}%
+ %
+ \edef\gtr@level@reference{0pt}%
+ \gtr@proc@level@save@settings%
+ \gtr@set@level{\gtrkv@proband@level}%
+ \let\gtr@currentfamily=\@undefined%
+ \numdef\gtr@num@fam@first{\gtr@c@family+1}%
+ \numdef\gtr@num@per@first{\gtr@c@pid+1}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@graph}#2x%
+ \numdef\gtr@num@fam@last{\gtr@c@family}%
+ \numdef\gtr@num@per@last{\gtr@c@pid}%
+ \gtr@set@currentfamily{\gtr@num@fam@first}%
+ \csdimdef{gtr@fam@\gtr@currentfamily @offset}{\gtrkv@tree@offset}%
+ \gtr@positioning%
+}
+
+\def\gtr@parse@graphwithhandle#1{%
+ \let\gtr@handle@continue=#1%
+ \gtr@parse@graph%
+}
+
+\def\gtr@parse@graph{%
+ \afterassignment\gtr@handle@graph\let\@gtr@token=%
+}
+
+\def\gtr@handle@graph{%
+ \let\@next=\gtr@parse@error@token%
+ \ifx\@gtr@token x%
+ \let\@next=\gtr@parse@x%
+ \else%
+ \expandafter\ifx\space\@gtr@token%
+ \let\@next\gtr@parse@graph%
+ \else%
+ \ifx\@gtr@token i%
+ \let\@next\gtr@parse@i%
+ \else%
+ \ifx\@gtr@token\par%
+ \let\@next\gtr@parse@graph%
+ \else%
+ \gtr@handle@continue%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \@next%
+}
+
+\def\gtr@handle@continue@graph{%
+ \ifx\@gtr@token p%
+ \let\gtr@handle@continue\gtr@handle@continue@parent%
+ \let\@next=\gtr@parse@graph@parent@%
+ \else%
+ \ifx\@gtr@token c%
+ \let\gtr@handle@continue\gtr@handle@continue@child%
+ \let\@next=\gtr@parse@graph@child@%
+ \else%
+ \ifx\@gtr@token s%
+ \let\gtr@handle@continue\gtr@handle@continue@sandclock%
+ \let\@next=\gtr@parse@graph@sandclock@%
+ \fi%
+ \fi%
+ \fi%
+}
+
+
+\def\gtr@parse@graph@parent@ arent{\@ifnextchar[{\gtr@parent@@parent}{\gtr@parent@@parent[]}}
+
+\def\gtr@parse@graph@child@ hild{%
+ \gtr@up@level%
+ \dimdef\gtr@level@reference{\gtr@level@reference+\gtr@level@size+\gtr@level@distance}%
+ \@ifnextchar[{\gtr@child@@child}{\gtr@child@@child[]}}
+
+\def\gtr@parse@graph@sandclock@ andclock{\@ifnextchar[{\gtr@sandclock@@}{\gtr@sandclock@@[]}}
+
+\def\gtr@parse@i n{%
+ \@ifnextchar p{\gtr@parse@input@}{\gtr@parse@insert@}}
+
+\def\gtr@parse@input@ put#1{\expandafter\expandafter\expandafter \gtr@parse@graph \csname @@input\endcsname #1 }
+
+\def\gtr@parse@insert@ sert#1{\expandafter\expandafter\expandafter\gtr@parse@graph\csname#1\endcsname}
+
+\def\gtr@parse@x{}
+
+\def\gtr@parse@err{%
+ \gtr@error{Parser error}{Some went wrong during parsing your genealogy tree data}%
+}
+
+\def\gtr@parse@error@token{%
+ \gtr@error{Parser: unfeasible token}{You probably used some unfeasible token in your genealogy tree data.
+ Press return to display this token.}%
+ \show\@gtr@token
+}
+
+\long\def\gtr@parse@error#1{%
+ \gtr@error{Parser: undefined #1}{Some went wrong during parsing your genealogy tree data}%%
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%% Parent Parser
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\gtr@handle@continue@parent{%
+ \ifx\@gtr@token g%
+ \let\@next=\gtr@pparse@g%
+ \else%
+ \ifx\@gtr@token p%
+ \let\@next=\gtr@pparse@p%
+ \else
+ \ifx\@gtr@token c%
+ \let\@next=\gtr@pparse@c%
+ \fi%
+ \fi%
+ \fi%
+}
+
+\def\gtr@pparse@c{\@ifnextchar[{\gtr@parent@@c}{\gtr@parent@@c[]}}
+\long\def\gtr@parent@@c[#1]#2{%
+ \gtr@trav@@c[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@parent}%
+}
+
+\def\gtr@pparse@p{%
+ \@ifnextchar a{\gtr@pparse@parent@}{\gtr@pparse@p@}}
+\def\gtr@pparse@parent@ arent{\@ifnextchar[{\gtr@parent@@parent}{\gtr@parent@@parent[]}}
+\long\def\gtr@parent@@parent[#1]#2{%
+ \gtr@trav@@parent[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@parent}%
+}
+\def\gtr@pparse@p@{\@ifnextchar[{\gtr@parent@@p}{\gtr@parent@@p[]}}
+\long\def\gtr@parent@@p[#1]#2{%
+ \gtr@trav@@p[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@parent}%
+}
+
+\def\gtr@pparse@g{\@ifnextchar[{\gtr@parent@@g}{\gtr@parent@@g[]}}
+\long\def\gtr@parent@@g[#1]#2{%
+ \gtr@trav@@parent@g[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@parent}%
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%% Child Parser
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\gtr@handle@continue@child{%
+ \ifx\@gtr@token g%
+ \let\@next=\gtr@cparse@g%
+ \else%
+ \ifx\@gtr@token p%
+ \let\@next=\gtr@cparse@p%
+ \else
+ \ifx\@gtr@token c%
+ \let\@next=\gtr@cparse@c%
+ \else
+ \ifx\@gtr@token u%
+ \let\@next=\gtr@cparse@u%
+ \fi
+ \fi%
+ \fi%
+ \fi%
+}
+
+
+\def\gtr@cparse@p{\@ifnextchar[{\gtr@child@@p}{\gtr@child@@p[]}}
+\long\def\gtr@child@@p[#1]#2{%
+ \gtr@trav@@p[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@child}%
+}
+
+\def\gtr@cparse@c{%
+ \@ifnextchar h{\gtr@cparse@child@}{\gtr@cparse@c@}}
+\def\gtr@cparse@child@ hild{\@ifnextchar[{\gtr@child@@child}{\gtr@child@@child[]}}
+\long\def\gtr@child@@child[#1]#2{%
+ \gtr@trav@@child[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@child}%
+}
+\def\gtr@cparse@c@{\@ifnextchar[{\gtr@child@@c}{\gtr@child@@c[]}}
+\long\def\gtr@child@@c[#1]#2{%
+ \gtr@trav@@c[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@child}%
+}
+
+\def\gtr@cparse@u nion{\@ifnextchar[{\gtr@child@@union}{\gtr@child@@union[]}}
+\long\def\gtr@child@@union[#1]#2{%
+ \gtr@trav@@union[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@child}%
+}
+
+\def\gtr@cparse@g{\@ifnextchar[{\gtr@child@@g}{\gtr@child@@g[]}}
+\long\def\gtr@child@@g[#1]#2{%
+ \gtr@trav@@child@g[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@child}%
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%% Union Parser
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\gtr@handle@continue@union{%
+ \ifx\@gtr@token c%
+ \let\@next=\gtr@uparse@c%
+ \else%
+ \ifx\@gtr@token p%
+ \let\@next=\gtr@uparse@p%
+ \fi%
+ \fi%
+}
+
+\def\gtr@uparse@c{%
+ \@ifnextchar h{\gtr@uparse@child@}{\gtr@uparse@c@}}
+\def\gtr@uparse@child@ hild{\@ifnextchar[{\gtr@union@@child}{\gtr@union@@child[]}}
+\long\def\gtr@union@@child[#1]#2{%
+ \let\gtr@handle@continue\gtr@handle@continue@child%
+ \gtr@trav@@child[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@union}%
+}
+\def\gtr@uparse@c@{\@ifnextchar[{\gtr@union@@c}{\gtr@union@@c[]}}
+\long\def\gtr@union@@c[#1]#2{%
+ \gtr@trav@@c[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@union}%
+}
+
+\def\gtr@uparse@p{\@ifnextchar[{\gtr@union@@p}{\gtr@union@@p[]}}
+\long\def\gtr@union@@p[#1]#2{%
+ \gtr@trav@@p[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@union}%
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%% Sandclock Parser
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\gtr@handle@continue@sandclock{%
+ \ifx\@gtr@token c%
+ \let\@next=\gtr@sparse@c%
+ \else%
+ \ifx\@gtr@token p%
+ \let\@next=\gtr@sparse@p%
+ \fi%
+ \fi%
+}
+
+
+\long\def\gtr@sandclock@@[#1]#2{%
+ \gtr@trav@@sandclock[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@graph}%
+}
+
+\def\gtr@sparse@c{%
+ \@ifnextchar h{\gtr@sparse@child@}{\gtr@sparse@c@}}
+\def\gtr@sparse@child@ hild{\@ifnextchar[{\gtr@sandclock@@child}{\gtr@sandclock@@child[]}}
+\long\def\gtr@sandclock@@child[#1]#2{%
+ \gtr@trav@@child[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@sandclock}%
+}
+\def\gtr@sparse@c@{\@ifnextchar[{\gtr@sandclock@@c}{\gtr@sandclock@@c[]}}
+\long\def\gtr@sandclock@@c[#1]#2{%
+ \gtr@trav@@c[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@sandclock}%
+}
+
+\def\gtr@sparse@p{%
+ \@ifnextchar a{\gtr@sparse@parent@}{\gtr@sparse@p@}}
+\def\gtr@sparse@parent@ arent{\@ifnextchar[{\gtr@sandclock@@parent}{\gtr@sandclock@@parent[]}}
+\long\def\gtr@sandclock@@parent[#1]#2{%
+ \gtr@trav@@parent[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@sandclock}%
+}
+\def\gtr@sparse@p@{\@ifnextchar[{\gtr@sandclock@@p}{\gtr@sandclock@@p[]}}
+\long\def\gtr@sandclock@@p[#1]#2{%
+ \gtr@trav@@p[#1]{#2}%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@sandclock}%
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%% Traversing
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\gtr@set@currentfamily#1{\edef\gtr@currentfamily{\number#1}}
+
+\def\gtr@next@family{%
+ \let\gtr@lastfamily=\gtr@currentfamily%
+ \ifdef{\gtr@currentfamily}{\gtr@famstack@push{\gtr@currentfamily}}{}%
+ \advance\gtr@c@family 1\relax%
+ \gtr@set@currentfamily{\gtr@c@family}%
+}
+
+\def\gtr@previous@family{%
+ \let\gtr@lastfamily=\gtr@currentfamily%
+ \ifnum\gtr@famstack@size>0%
+ \gtr@famstack@popto{\gtr@currentfamily}%
+ \else%
+ \let\gtr@currentfamily=\@undefined%
+ \fi%
+}
+
+\def\gtr@set@currentperson#1{\edef\gtr@currentperson{\number#1}}
+
+\def\gtr@next@person{%
+ \advance\gtr@c@pid 1\relax%
+ \gtr@set@currentperson{\gtr@c@pid}%
+}
+
+\def\gtr@set@level#1{%
+ \gtr@c@level#1\relax%
+ \gtr@proc@level@opt%
+}
+
+\def\gtr@up@level{%
+ \advance\gtr@c@level 1\relax%
+ \gtr@proc@level@opt%
+}
+
+\def\gtr@up@level@push{%
+ \gtr@levelstack@push{\gtr@level@reference}%
+ \gtr@up@level%
+ \dimdef\gtr@level@reference{\gtr@level@reference+\gtr@level@size+\gtr@level@distance}%
+}
+
+\def\gtr@up@level@pop{%
+ \gtr@up@level%
+ \gtr@levelstack@popto{\gtr@level@reference}%
+}
+
+\def\gtr@down@level{%
+ \advance\gtr@c@level -1\relax%
+ \gtr@proc@level@opt%
+}
+
+\def\gtr@down@level@push{%
+ \gtr@levelstack@push{\gtr@level@reference}%
+ \dimdef\gtr@level@reference{\gtr@level@reference-\gtr@level@size-\gtr@level@distance}%
+ \gtr@down@level%
+}
+
+\def\gtr@down@level@pop{%
+ \gtr@down@level%
+ \gtr@levelstack@popto{\gtr@level@reference}%
+}
+
+\long\def\gtr@trav@@parent[#1]#2{%
+ \gtr@up@level@push%
+ \gtr@next@family%
+ \gtr@proc@@parent@begin{#1}%
+ \ifgtr@ignore%
+ \advance\gtr@c@family -1\relax%
+ \else%
+ \gtr@parse@beginfamily@hook%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@parent}#2x%
+ \gtr@parse@endfamily@hook%
+ \gtr@proc@@parent@end%
+ \fi%
+ \gtr@previous@family%
+ \gtr@down@level@pop%
+ \gtr@parse@afterfamily@hook%
+}
+
+\long\def\gtr@trav@@child[#1]#2{%
+ \gtr@down@level@push%
+ \gtr@next@family%
+ \gtr@proc@@child@begin{#1}%
+ \ifgtr@ignore%
+ \advance\gtr@c@family -1\relax%
+ \else%
+ \gtr@parse@beginfamily@hook%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@child}#2x%
+ \gtr@parse@endfamily@hook%
+ \gtr@proc@@child@end%
+ \fi%
+ \gtr@previous@family%
+ \gtr@up@level@pop%
+ \gtr@parse@afterfamily@hook%
+}
+
+\long\def\gtr@trav@@sandclock[#1]#2{%
+ \gtr@up@level@push%
+ \gtr@next@family%
+ \gtr@proc@@sandclock@begin{#1}%
+ \ifgtr@ignore%
+ \advance\gtr@c@family -1\relax%
+ \else%
+ \gtr@parse@beginfamily@hook%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@sandclock}#2x%
+ \gtr@parse@endfamily@hook%
+ \gtr@proc@@sandclock@end%
+ \fi%
+ \gtr@previous@family%
+ \gtr@down@level@pop%
+}
+
+\long\def\gtr@trav@@union[#1]#2{%
+ \gtr@next@family%
+ \gtr@proc@@union@begin{#1}%
+ \ifgtr@ignore%
+ \advance\gtr@c@family -1\relax%
+ \else%
+ \gtr@parse@beginfamily@hook%
+ \gtr@parse@graphwithhandle{\gtr@handle@continue@union}#2x%
+ \gtr@parse@endfamily@hook%
+ \gtr@proc@@union@end%
+ \fi%
+ \gtr@previous@family%
+ \gtr@parse@afterfamily@hook%
+}
+
+
+\long\def\gtr@trav@@add@node#1#2#3{%
+ \gtr@proc@add@node{#1}{#2}%
+ \ifgtr@ignore%
+ \advance\gtr@c@pid -1\relax%
+ \else%
+ #3%
+ \fi%
+}
+
+\long\def\gtr@trav@@parent@g[#1]#2{%
+ \gtr@down@level@push%
+ \gtr@next@person%
+ \def\gtrnodetype{g}%
+ \let\gtrifcnode\@secondoftwo%
+ \let\gtrifpnode\@secondoftwo%
+ \let\gtrifgnode\@firstoftwo%
+ \ifcsdef{gtr@fam@\gtr@currentfamily @fam}{%
+ \let\gtrifroot\@secondoftwo%
+ \let\gtrifparent\@firstoftwo%
+ \let\gtrifleaf\@secondoftwo%
+ \let\gtrifleafchild\@secondoftwo%
+ }{%
+ \let\gtrifroot\@firstoftwo%
+ \let\gtrifparent\@secondoftwo%
+ \let\gtrifleaf\@firstoftwo%
+ \let\gtrifleafchild\@firstoftwo%
+ }%
+ \let\gtrifchild\@firstoftwo%
+ \let\gtrifleafparent\@secondoftwo%
+ \gtr@trav@@add@node{#1}{#2}{\gtr@proc@@parent@g@content}%
+ \gtr@up@level@pop%
+ \gtr@parse@afternode@hook%
+}
+
+\long\def\gtr@trav@@child@g[#1]#2{%
+ \gtr@next@person%
+ \def\gtrnodetype{g}%
+ \let\gtrifcnode\@secondoftwo%
+ \let\gtrifpnode\@secondoftwo%
+ \let\gtrifgnode\@firstoftwo%
+ \ifcsdef{gtr@fam@\gtr@currentfamily @fam}{%
+ \let\gtrifroot\@secondoftwo%
+ \let\gtrifchild\@firstoftwo%
+ \let\gtrifleaf\@secondoftwo%
+ \let\gtrifleafparent\@secondoftwo%
+ }{%
+ \let\gtrifroot\@firstoftwo%
+ \let\gtrifchild\@secondoftwo%
+ \let\gtrifleaf\@firstoftwo%
+ \let\gtrifleafparent\@firstoftwo%
+ }%
+ \let\gtrifparent\@firstoftwo%
+ \let\gtrifleafchild\@secondoftwo%
+ \gtr@trav@@add@node{#1}{#2}{\gtr@proc@@child@g@content}%
+ \gtr@parse@afternode@hook%
+}
+
+\long\def\gtr@trav@@p[#1]#2{%
+ \gtr@next@person%
+ \def\gtrnodetype{p}%
+ \let\gtrifcnode\@secondoftwo%
+ \let\gtrifpnode\@firstoftwo%
+ \let\gtrifgnode\@secondoftwo%
+ \let\gtrifroot\@secondoftwo%
+ \let\gtrifchild\@secondoftwo%
+ \let\gtrifparent\@firstoftwo%
+ \let\gtrifleaf\@firstoftwo%
+ \let\gtrifleafchild\@secondoftwo%
+ \let\gtrifleafparent\@firstoftwo%
+ \gtr@trav@@add@node{#1}{#2}{\gtr@proc@@p@content}%
+ \gtr@parse@afternode@hook%
+}
+
+\long\def\gtr@trav@@c[#1]#2{%
+ \gtr@down@level@push%
+ \gtr@next@person%
+ \def\gtrnodetype{c}%
+ \let\gtrifcnode\@firstoftwo%
+ \let\gtrifpnode\@secondoftwo%
+ \let\gtrifgnode\@secondoftwo%
+ \let\gtrifroot\@secondoftwo%
+ \let\gtrifchild\@firstoftwo%
+ \let\gtrifparent\@secondoftwo%
+ \let\gtrifleaf\@firstoftwo%
+ \let\gtrifleafchild\@firstoftwo%
+ \let\gtrifleafparent\@secondoftwo%
+ \gtr@trav@@add@node{#1}{#2}{\gtr@proc@@c@content}%
+ \gtr@up@level@pop%
+ \gtr@parse@afternode@hook%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%% Hooks
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\gtr@parse@init@hook#1#2{%
+ \ifcsvoid{#1@content}{%
+ \csdef{#1}{%
+ \letcs\gtr@currentid{#2}%
+ \ifdefvoid{\gtr@currentid}{}{\csuse{#1@content}}%
+ }%
+ }{}%
+}
+
+\def\gtr@parse@appto@hook#1#2#3{%
+ \begingroup\edef\x{\endgroup\noexpand\appto\expandonce{\csname #1@content\endcsname}{%
+ \noexpand\ifdefstring{\noexpand\gtr@currentid}{\expandonce{#2}}{%
+ \noexpand\gtr@parse@graph\expandonce{#3}x}{}%
+ }}\x%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%
+%% Information
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\gtrnodenumber{\gtr@currentperson}
+\def\gtrnodefamily{\gtr@currentfamily}
+\def\gtrnodelevel{\number\gtr@c@level}
+
+\newrobustcmd\gtrifnodeid[2]{\ifdefvoid{\gtr@gkv@id}{#2}{#1}}
+\def\gtrnodeid{\gtrifnodeid{\expandafter\detokenize\expandafter{\gtr@gkv@id}}{???}}