diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /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.tex | 627 |
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}}{???}} |