%% The LaTeX package genealogytree - version 2.1.0 (2021/09/20) %% gtrlib.debug.code.tex: Debugger %% %% ------------------------------------------------------------------------------------------- %% Copyright (c) 2013-2021 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.1.0} \RequirePackage{array,tabularx} \tcbuselibrary{breakable} \definecolorseries{gtr@debug}{rgb}{grad}[rgb]{.95,.85,.55}{3,11,17} \resetcolorseries[16]{gtr@debug} \def\gtr@debug@colorletfamily#1{% \pgfmathsetmacro\gtr@temp@col{int(Mod(\gtr@currentfamily,16)+1)}% \colorlet{#1}{gtr@debug!![\gtr@temp@col]}% } %------------------- % Parser Debugger %------------------- \def\gtr@debug@setleveldistance#1{% \pgfmathsetmacro#1{-(\gtrkv@debug@markerleft-\gtrkv@debug@markerright)*e^(-abs(\number\gtr@c@level)/4)-\gtrkv@debug@markerright}% } \tcbset{% gtr@debug@box/.style={enhanced,beforeafter skip=0pt,flushleft upper, boxrule=0.25mm,leftrule=5mm,colframe=gtr@debug@color, arc=5mm,boxsep=0pt,top=1mm,bottom=1mm}, debug marker left/.store in=\gtrkv@debug@markerleft, debug marker right/.store in=\gtrkv@debug@markerright, debug marker left=1.3cm, debug marker right=0.3cm, } \def\gtr@debug@person@content#1#2#3#4{% \gtr@debug@colorletfamily{gtr@debug@color}% \begin{tcolorbox}[gtr@debug@box,sharp corners=west, interior style={top color=gtr@debug@color!30!white,bottom color=gray!10!white}, overlay={\node[fill=gtr@debug@color!10!white,draw=black] at ([xshift=2.5mm]frame.west) {\small #1};}] #2: Individual~\gtr@currentperson, Family~\gtr@currentfamily, Level~\number\gtr@c@level% \ifblank{#3}{}{\par Options: {\ttfamily\detokenize{#3}}}% \par Content: {\ttfamily\detokenize{#4}}% \end{tcolorbox}% } \def\gtr@debug@family@begin#1#2{% \gtr@debug@colorletfamily{gtr@debug@color}% \begin{tcolorbox}[gtr@debug@box,rightrule=5mm,sharp corners, colback=gtr@debug@color!30!white, overlay={% \gtr@debug@setleveldistance{\gtr@temp}% \path[draw=gtr@debug@color,very thick,->] (frame.west) -- ++(\gtr@temp pt,0) -- ++(0,-0.5); }]% Start: #1 Family~\gtr@currentfamily, Level~\number\gtr@c@level \ifblank{#2}{}{\par Options: {\ttfamily\detokenize{#2}}}% \end{tcolorbox}% } \def\gtr@debug@family@end#1{% \gtr@debug@colorletfamily{gtr@debug@color}% \begin{tcolorbox}[gtr@debug@box,rightrule=5mm,sharp corners, colback=gtr@debug@color!30!white, overlay={% \gtr@debug@setleveldistance{\gtr@temp}% \path[draw=gtr@debug@color,very thick,->] (frame.west) -- ++(\gtr@temp pt,0) -- ++(0,0.5); }]% End: #1 Family~\gtr@currentfamily, Level~\number\gtr@c@level \end{tcolorbox}% } \newcommand{\gtrparserdebug}[2][]{% \begingroup% \parskip0pt% % \let\gtr@org@@parse@err=\gtr@parse@err% \let\gtr@org@@parse@error=\gtr@parse@error% \let\gtr@org@@parse@error@token=\gtr@parse@error@token% \def\gtr@parse@err{% \fbox{\textbf{Parser error}}% \gtr@org@@parse@err}% \long\def\gtr@parse@error##1{% \fbox{\textbf{Parser: undefined ##1}}% \gtr@org@@parse@error{##1}}% \long\def\gtr@parse@error@token{% \fbox{\textbf{Parser: unfeasible token '\@gtr@token'}}% \gtr@org@@parse@error@token}% % \def\gtr@proc@@parent@begin##1{\gtr@debug@family@begin{Parent}{##1}}% \def\gtr@proc@@child@begin##1{\gtr@debug@family@begin{Child}{##1}}% \def\gtr@proc@@union@begin##1{\gtr@debug@family@begin{Union}{##1}}% \def\gtr@proc@@sandclock@begin##1{\gtr@debug@family@begin{Sandclock}{##1}}% % \def\gtr@proc@@parent@end{\gtr@debug@family@end{Parent}}% \def\gtr@proc@@child@end{\gtr@debug@family@end{Child}}% \def\gtr@proc@@union@end{\gtr@debug@family@end{Union}}% \def\gtr@proc@@sandclock@end{\gtr@debug@family@end{Sandclock}}% % \long\def\gtr@proc@@parent@g@content##1##2{\gtr@debug@person@content{g}{Child}{##1}{##2}}% \long\def\gtr@proc@@child@g@content##1##2{\gtr@debug@person@content{g}{Parent}{##1}{##2}}% \long\def\gtr@proc@@p@content##1##2{\gtr@debug@person@content{p}{Parent}{##1}{##2}}% \long\def\gtr@proc@@c@content##1##2{\gtr@debug@person@content{c}{Child}{##1}{##2}}% \long\def\gtr@trav@@add@node##1##2##3{##3{##1}{##2}}% % \gtrset{% ignore/true/.code={}, } % \def\gtr@positioning{}% % \colorlet{gtr@debug@color}{black!75!white}% \begin{tcolorbox}[gtr@debug@box,before skip=\medskipamount, sharp corners,toprule=1mm,rightrule=5mm] Genealogytree Parser Debugger \ifblank{#1}{}{\par Graph Options: {\ttfamily\detokenize{#1}}}% \end{tcolorbox}% \gtr@reset@before@parser% \gtr@parsegraph[#1]{#2}% \begin{tcolorbox}[ gtr@debug@box,after skip=\medskipamount,sharp corners,colframe=black!75!white, bottomrule=1mm,rightrule=5mm] End of Genealogytree Parser Debugger \end{tcolorbox}% \endgroup% } \newcommand{\gtrparserdebuginput}[2][]{% \gtrparserdebug[#1]{input{#2}}} %------------------- % Processor Debugger %------------------- \def\gtr@debug@textnone{\textsf{$\langle$none$\rangle$}} \def\gtr@debug@person@tab#1#2{% #1 &% \ifcsname gtr@per@\gtr@currentperson @#1\endcsname% \csuse{gtr@per@\gtr@currentperson @#1}% \else% \gtr@debug@textnone% \fi% \\% } \def\gtr@debug@person@tabopt#1#2{% #1 &% \letcs\gtr@temp{gtr@per@\gtr@currentperson @#1}% \ifdefvoid{\gtr@temp}{\gtr@debug@textnone}{% \ttfamily\expandafter\detokenize\expandafter{\gtr@temp}}% \\% } \def\gtr@debug@family@tab#1#2{% #1 &% \ifcsname gtr@fam@\gtr@currentfamily @#1\endcsname% \csuse{gtr@fam@\gtr@currentfamily @#1}% \else% \gtr@debug@textnone% \fi% \\% } \def\gtr@debug@family@tablist#1#2{% #1 &% \ifcsname gtr@fam@\gtr@currentfamily @#1\endcsname% \def\dodo##1{, ##1}% \def\do##1{##1\let\do\dodo}% \dolistcsloop{gtr@fam@\gtr@currentfamily @#1}% \else% \gtr@debug@textnone% \fi% \\% } \def\gtr@debug@family@tabopt#1#2{% #1 &% \letcs\gtr@temp{gtr@fam@\gtr@currentfamily @#1}% \ifdefvoid{\gtr@temp}{\gtr@debug@textnone}{% \ttfamily\expandafter\detokenize\expandafter{\gtr@temp}}% \\% } \def\gtr@debug@person#1{% \gtr@set@currentperson{#1}% \begin{tcolorbox}[enhanced,beforeafter skip=3pt,flushleft upper, size=small,sharp corners,fontupper=\small, colframe=gtr@debug@color,colback=gtr@debug@color!5, colbacktitle=gtr@debug@color!20, coltitle=black,fonttitle=\bfseries, title={Person~\gtr@currentperson}, sidebyside,lower separated=false,sidebyside gap=1mm, code={\ifcsname gtr@per@\gtr@currentperson @box\endcsname% \tcbset{righthand width=\wd\csuse{gtr@per@\gtr@currentperson @box}}\fi}] \begin{tabularx}{\linewidth}{@{}>{\ttfamily}r@{: }X>{\itshape}X@{}} \gtr@debug@person@tabopt{id}{identifier (also node alias)}% \gtr@debug@person@tab{fam}{enclosing family}% \gtr@debug@person@tab{chiof}{child of family}% \gtr@debug@person@tab{parof}{parent of family}% \gtr@debug@person@tab{x}{$x$ anchor}% \gtr@debug@person@tab{y}{$y$ anchor}% \gtr@debug@person@tab{dim}{width (or height)}% \gtr@debug@person@tab{cwest@val}{west contour value}% \gtr@debug@person@tab{cwest@next}{west contour successor}% \gtr@debug@person@tab{cwest@thread}{west contour thread}% \gtr@debug@person@tab{cwest@tgap}{west contour thread gap}% \gtr@debug@person@tab{ceast@val}{east contour value}% \gtr@debug@person@tab{ceast@next}{east contour successor}% \gtr@debug@person@tab{ceast@thread}{east contour thread}% \gtr@debug@person@tab{ceast@tgap}{east contour thread gap}% \end{tabularx}% \tcblower \ifcsname gtr@per@\gtr@currentperson @box\endcsname% \copy\csuse{gtr@per@\gtr@currentperson @box}% \else\gtr@debug@textnone\fi% \end{tcolorbox}% } \def\gtr@debug@family#1{% \gtr@set@currentfamily{#1}% \gtr@debug@colorletfamily{gtr@debug@color}% \begin{tcolorbox}[enhanced,breakable,beforeafter skip=6pt,flushleft upper, colframe=gtr@debug@color,colback=gtr@debug@color!15,fontupper=\small, colbacktitle=gtr@debug@color!30, coltitle=black,fonttitle=\bfseries, title={Family~\gtr@currentfamily}, pad at break*=1mm ] \begin{tabularx}{\linewidth}{@{}>{\ttfamily}r@{: }X>{\itshape}X@{}} \gtr@debug@family@tab{type}{type of family}% \gtr@debug@family@tabopt{id}{identifier}% \gtr@debug@family@tab{fam}{enclosing family}% \gtr@debug@family@tab{offset}{$x$ (or $y$) offset relative to enclosing family}% \gtr@debug@family@tab{pos}{$y$ (or $x$) absolute position}% \gtr@debug@family@tab{cwest@anchor}{west contour starting node}% \gtr@debug@family@tab{ceast@anchor}{east contour starting node}% \gtr@debug@family@tab{g}{$g$-node of the family}% \gtr@debug@family@tablist{par}{parent nodes}% \gtr@debug@family@tablist{chi}{child nodes}% \gtr@debug@family@tablist{patpar}{patchwork parent nodes}% \gtr@debug@family@tablist{patchi}{patchwork child nodes}% \gtr@debug@family@tablist{union}{further partner families}% \gtr@debug@family@tab{ps}{pivot shift length (parents vs childs)}% \gtr@debug@family@tab{x}{$x$ anchor}% \gtr@debug@family@tab{y}{$y$ anchor}% \gtr@debug@family@tab{frac}{line positioning fraction}% \gtr@debug@family@tabopt{opt@family}{options for the family}% \gtr@debug@family@tabopt{opt@subtree}{options for the subtree}% \end{tabularx}% \ifcsname gtr@fam@\gtr@currentfamily @par\endcsname% \tcbsubtitle{Parents of Family~\gtr@currentfamily}% \let\do\gtr@debug@person% \dolistcsloop{gtr@fam@\gtr@currentfamily @par}% \fi% \ifcsname gtr@fam@\gtr@currentfamily @chi\endcsname% \tcbsubtitle{Childs of Family~\gtr@currentfamily}% \let\do\gtr@debug@person% \dolistcsloop{gtr@fam@\gtr@currentfamily @chi}% \fi% \end{tcolorbox}% } \def\gtr@debug@family@loop#1{% \ifnum#1<\numexpr\gtr@num@fam@last+1\relax% \gtr@debug@family{#1}% \expandafter\gtr@debug@family@loop\expandafter{\number\numexpr#1+1\expandafter}% \fi% } \newcommand{\gtrprocessordebug}[2][]{% \begingroup% \gtrset{% ignore/true/.code={}, } \begin{tcolorbox}[colframe=black!75!white,colback=yellow!10, beforeafter skip=\medskipamount,flushleft upper, sharp corners=south] \textbf{Genealogytree Processor Debugger} \ifblank{#1}{}{\par Graph Options: {\ttfamily\detokenize{#1}}}% \end{tcolorbox}% % \gtr@reset@before@parser% \gtr@parsegraph[#1]{#2}% \gtr@debug@family@loop{\gtr@num@fam@first}% % \begin{tcolorbox}[ colframe=black!75!white,colback=yellow!10, beforeafter skip=\medskipamount,flushleft upper, sharp corners=north] \textbf{End of Genealogytree Processor Debugger} \end{tcolorbox}% \endgroup% } \newcommand{\gtrprocessordebuginput}[2][]{% \gtrprocessordebug[#1]{input{#2}}} %------------------- % Graphical Debugger %------------------- \def\gtr@debug@contour#1#2#3#4{% \path[gtr@debug@tcb@options] \pgfextra{% \edef\gtr@currentperson{#1}% \tcb@gettikzxy{(p@\gtr@currentperson .#3)}{\gtr@x}{\gtr@y}% \pgfpathmoveto{\pgfqpoint{\gtr@x}{\gtr@y}}% \tcb@gettikzxy{(p@\gtr@currentperson .#4)}{\gtr@x}{\gtr@y}% \pgfpathlineto{\pgfqpoint{\gtr@x}{\gtr@y}}% \loop% \ifcsdef{gtr@per@\gtr@currentperson @c#2@next}{% \letcs\gtr@currentperson{gtr@per@\gtr@currentperson @c#2@next}% }{% \letcs\gtr@currentperson{gtr@per@\gtr@currentperson @c#2@thread}% }% \ifdefined\gtr@currentperson% \tcb@gettikzxy{(p@\gtr@currentperson .#3)}{\gtr@x}{\gtr@y}% \pgfpathlineto{\pgfqpoint{\gtr@x}{\gtr@y}}% \tcb@gettikzxy{(p@\gtr@currentperson .#4)}{\gtr@x}{\gtr@y}% \pgfpathlineto{\pgfqpoint{\gtr@x}{\gtr@y}}% \repeat% };% } \def\gtr@debug@contour@west@up#1{\gtr@debug@contour{#1}{west}{south west}{north west}} \def\gtr@debug@contour@west@down#1{\gtr@debug@contour{#1}{west}{north west}{south west}} \def\gtr@debug@contour@west@left#1{\gtr@debug@contour{#1}{west}{north east}{north west}} \def\gtr@debug@contour@west@right#1{\gtr@debug@contour{#1}{west}{north west}{north east}} \def\gtr@debug@contour@east@up#1{\gtr@debug@contour{#1}{east}{south east}{north east}} \def\gtr@debug@contour@east@down#1{\gtr@debug@contour{#1}{east}{north east}{south east}} \def\gtr@debug@contour@east@left#1{\gtr@debug@contour{#1}{east}{south east}{south west}} \def\gtr@debug@contour@east@right#1{\gtr@debug@contour{#1}{east}{south west}{south east}} \newif\ifgtr@debug@west \newif\ifgtr@debug@east \gtrset{debug/.cd, family number/.store in=\gtrkv@debug@fam, family id/.code={\gtr@getFamNumForId{#1}\let\gtrkv@debug@fam\gtr@tmp@num}, contour/.is choice, contour/west/.code={\gtr@debug@westtrue\gtr@debug@eastfalse}, contour/east/.code={\gtr@debug@westfalse\gtr@debug@easttrue}, contour/both/.code={\gtr@debug@westtrue\gtr@debug@easttrue}, contour/none/.code={\gtr@debug@westfalse\gtr@debug@eastfalse}, tikz@options/.style={/tikz/gtr@debug@tcb@options/.style={#1}}, } \def\gtr@debug@contour@par@down{% \ifgtr@debug@west\gtr@debug@contour@west@up{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@anchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@up{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@anchor}}\fi% } \def\gtr@debug@contour@par@up{% \ifgtr@debug@west\gtr@debug@contour@west@down{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@anchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@down{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@anchor}}\fi% } \def\gtr@debug@contour@par@left{% \ifgtr@debug@west\gtr@debug@contour@west@right{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@anchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@right{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@anchor}}\fi% } \def\gtr@debug@contour@par@right{% \ifgtr@debug@west\gtr@debug@contour@west@left{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@anchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@left{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@anchor}}\fi% } \def\gtr@debug@contour@chi@down{% \ifgtr@debug@west\gtr@debug@contour@west@down{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@anchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@down{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@anchor}}\fi% } \def\gtr@debug@contour@chi@up{% \ifgtr@debug@west\gtr@debug@contour@west@up{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@anchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@up{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@anchor}}\fi% } \def\gtr@debug@contour@chi@left{% \ifgtr@debug@west\gtr@debug@contour@west@left{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@anchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@left{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@anchor}}\fi% } \def\gtr@debug@contour@chi@right{% \ifgtr@debug@west\gtr@debug@contour@west@right{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@anchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@right{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@anchor}}\fi% } \def\gtr@debug@contour@san@down{% \ifgtr@debug@west\gtr@debug@contour@west@up{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@panchor}}\gtr@debug@contour@west@down{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@canchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@up{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@panchor}}\gtr@debug@contour@east@down{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@canchor}}\fi% } \def\gtr@debug@contour@san@up{% \ifgtr@debug@west\gtr@debug@contour@west@down{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@panchor}}\gtr@debug@contour@west@up{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@canchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@down{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@panchor}}\gtr@debug@contour@east@up{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@canchor}}\fi% } \def\gtr@debug@contour@san@left{% \ifgtr@debug@west\gtr@debug@contour@west@right{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@panchor}}\gtr@debug@contour@west@left{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@canchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@right{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@panchor}}\gtr@debug@contour@east@left{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@canchor}}\fi% } \def\gtr@debug@contour@san@right{% \ifgtr@debug@west\gtr@debug@contour@west@left{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@panchor}}\gtr@debug@contour@west@right{\csuse{gtr@fam@\gtrkv@debug@fam @cwest@canchor}}\fi% \ifgtr@debug@east\gtr@debug@contour@east@left{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@panchor}}\gtr@debug@contour@east@right{\csuse{gtr@fam@\gtrkv@debug@fam @ceast@canchor}}\fi% } % no contour for union \newcommand{\gtrdebugdrawcontour}[2]{% \gtrset{debug/.cd,family number=1,contour=both,tikz@options={draw,#2},#1}% \csuse{gtr@debug@contour@\csuse{gtr@fam@\gtrkv@debug@fam @type}@\gtrkv@timeflow}% } \def\gtr@show@family@id#1{% \node[fill=white,fill opacity=0.8,outer sep=0pt,inner sep=2pt] at (f@#1) {\ifcsvoid{gtr@fam@#1@id}{\def\gtr@temp{???}}{\letcs\gtr@temp{gtr@fam@#1@id}}% \ttfamily\expandafter\detokenize\expandafter{\gtr@temp}}; } \def\gtr@show@family@number#1{% \node[fill=white,fill opacity=0.8,outer sep=0pt,inner sep=2pt] at (f@#1) {\ttfamily\expandafter\detokenize\expandafter{#1}}; } \gtrset{ show/.style={box={finish={% \node[fill=white,fill opacity=0.8,outer sep=0pt,inner sep=2pt] at (frame.center) {% \setbox0=\hbox{\resizebox{\the\dimexpr\tcb@width-4pt}{!}{\bfseries#1}}% \ifdim\dimexpr\ht0+\dp0>\dimexpr\tcb@height-4pt\relax% \resizebox*{!}{\the\dimexpr\tcb@height-4pt}{\usebox0}% \else% \usebox0% \fi% };}}}, show@family@number/.style={after tree={% \begin{scope}% \ifgtr@timeflow@vertical\else\tikzset{every node/.style={rotate=90,transform shape}}\fi% \gtr@forall@families{\gtr@show@family@number}% \end{scope}% }}, show@family@id/.style={after tree={% \begin{scope}% \ifgtr@timeflow@vertical\else\tikzset{every node/.style={rotate=90,transform shape}}\fi% \gtr@forall@families{\gtr@show@family@id}% \end{scope}% }}, show number/.style={show={\ttfamily\gtr@currentperson},show@family@number}, show family/.style={show={\ttfamily\gtr@currentfamily},show@family@number}, show id/.style={show={\ttfamily\gtrnodeid},show@family@id% }, show level/.style={show={\ttfamily\number\gtr@c@level}}, show type/.style={show={\ttfamily\strut\gtrnodetype}}, }