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.options.code.tex |
Initial commit
Diffstat (limited to 'macros/latex/contrib/genealogytree/gtrcore.options.code.tex')
-rw-r--r-- | macros/latex/contrib/genealogytree/gtrcore.options.code.tex | 491 |
1 files changed, 491 insertions, 0 deletions
diff --git a/macros/latex/contrib/genealogytree/gtrcore.options.code.tex b/macros/latex/contrib/genealogytree/gtrcore.options.code.tex new file mode 100644 index 0000000000..b2a97d807c --- /dev/null +++ b/macros/latex/contrib/genealogytree/gtrcore.options.code.tex @@ -0,0 +1,491 @@ +%% The LaTeX package genealogytree - version 1.32 (2019/04/08) +%% gtrcore.options.code.tex: Options +%% +%% ------------------------------------------------------------------------------------------- +%% 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} + +%%%%%%%%%%%%%%%%%%%%%%% +%% General handling +%%%%%%%%%%%%%%%%%%%%%%% + +% #1 macro +% #2 key list to append +\newrobustcmd{\gtrkeysappto}[2]{% + \ifdefvoid{#1}% + {\edef#1{\unexpanded{#2}}}% + {\edef#1{\expandonce#1,\unexpanded{#2}}}} + + +% #1 macro +% #2 key list to append (global) +\newrobustcmd{\gtrkeysgappto}[2]{% + \ifdefvoid{#1}% + {\xdef#1{\unexpanded{#2}}}% + {\xdef#1{\expandonce#1,\unexpanded{#2}}}} + + +% #1 key +% #2 key list to append +\newrobustcmd{\gtr@keys@addvalue}[2]{% + \pgfkeysifdefined{#1}{% + \pgfkeysgetvalue{#1}{\gtr@temp}% + \edef\gtr@temp{\noexpand\pgfkeyssetvalue{#1}{\expandonce\gtr@temp,\unexpanded{#2}}}% + \gtr@temp% + }{% + \pgfkeyssetvalue{#1}{#2}% + }% +} + + +% #1 command sequence +% #2 is a macro containing keys +\def\gtr@cs@storekey#1#2{% + \ifdefvoid{#2}{}{\cslet{#1}{#2}}% +} + +% #1 command sequence +% #2 #3 are macros containing keys +\def\gtr@cs@storekeys#1#2#3{% + \ifdefvoid{#2}{% + \ifdefvoid{#3}{}{\cslet{#1}{#3}}% + }{% + \ifdefvoid{#3}{% + \cslet{#1}{#2}% + }{% + \csedef{#1}{\expandonce#2,\expandonce#3}% + }% + }% +} + + +% set keys from command sequence #1 +\newrobustcmd*{\gtr@cs@keysalsofrom}[1]{% + \letcs\gtr@temp{#1}% + \ifdefvoid{\gtr@temp}{}{\pgfkeysalsofrom{\gtr@temp}}% +} + + +% set keys from stored key #1 +\newrobustcmd*{\gtr@key@keysalsofrom}[1]{% + \pgfkeysifdefined{#1}{% + \pgfkeysgetvalue{#1}{\gtr@temp}% + \pgfkeysalsofrom{\gtr@temp}% + }{}% +} + + +%%%%%%%%%%%%%%%%%%%%%%% +%% Key Management +%%%%%%%%%%%%%%%%%%%%%%% + + +\newcommand{\gtrsetoptionsforsubtree}[2]{% + \def\do##1{% + \gtr@keys@addvalue{/gtr/sopt/##1}{subtree={#2}}% + }% + \docsvlist{#1}% +} + + +\newcommand{\gtrsetoptionsforfamily}[2]{% + \def\do##1{% + \gtr@keys@addvalue{/gtr/sopt/##1}{family={#2}}% + }% + \docsvlist{#1}% +} + +\newcommand{\gtrsetoptionsfornode}[2]{% + \def\do##1{% + \gtr@keys@addvalue{/gtr/nopt/##1}{#2}% + }% + \docsvlist{#1}% +} + + +\newcommand{\gtrignoresubtree}[1]{% + \def\do##1{% + \gtr@keys@addvalue{/gtr/sopt/##1}{ignore}% + }% + \docsvlist{#1}% +} + +\newcommand{\gtrignorenode}[1]{% + \gtrsetoptionsfornode{#1}{ignore}% +} + + +\def\gtr@set@level@position@down#1{% + \csdimdef{gtr@per@#1@y}{\gtr@level@reference}% + \csdimdef{gtr@per@#1@dim}{\wd\csuse{gtr@per@#1@box}}% +} + +\def\gtr@set@level@position@up#1{% + \csdimdef{gtr@per@#1@y}{-\gtr@level@reference}% + \csdimdef{gtr@per@#1@dim}{\wd\csuse{gtr@per@#1@box}}% +} + +\def\gtr@set@level@position@left#1{% + \csdimdef{gtr@per@#1@x}{\gtr@level@reference}% + \csdimdef{gtr@per@#1@dim}{\ht\csuse{gtr@per@#1@box}+\dp\csuse{gtr@per@#1@box}}% +} + +\def\gtr@set@level@position@right#1{% + \csdimdef{gtr@per@#1@x}{-\gtr@level@reference}% + \csdimdef{gtr@per@#1@dim}{\ht\csuse{gtr@per@#1@box}+\dp\csuse{gtr@per@#1@box}}% +} + +\gtrset{% + reset edge level shift/.code={% + \def\gtr@set@position@family@down##1{% + \csdimdef{gtr@fam@##1@pos}{\gtr@level@reference-\gtr@level@size-\csuse{gtr@fam@##1@frac}\dimexpr\gtr@level@distance}% + }% + \def\gtr@set@position@family@up##1{% + \csdimdef{gtr@fam@##1@pos}{-\gtr@level@reference+\gtr@level@size+\csuse{gtr@fam@##1@frac}\dimexpr\gtr@level@distance}% + }% + \let\gtr@set@position@family@left=\gtr@set@position@family@down% + \let\gtr@set@position@family@right=\gtr@set@position@family@up% + }, + nullify edge level shift/.code={% + \def\gtr@set@position@family@down##1{% + \csdimdef{gtr@fam@##1@pos}{\gtr@level@reference-\gtr@level@size-0.5\dimexpr\gtr@level@distance}% + }% + \def\gtr@set@position@family@up##1{% + \csdimdef{gtr@fam@##1@pos}{-\gtr@level@reference+\gtr@level@size+0.5\dimexpr\gtr@level@distance}% + }% + \let\gtr@set@position@family@left=\gtr@set@position@family@down% + \let\gtr@set@position@family@right=\gtr@set@position@family@up% + }, + switch edge level shift/.code={% + \def\gtr@set@position@family@down##1{% + \csdimdef{gtr@fam@##1@pos}{\gtr@level@reference-\gtr@level@size-\gtr@level@distance+\csuse{gtr@fam@##1@frac}\dimexpr\gtr@level@distance}% + }% + \def\gtr@set@position@family@up##1{% + \csdimdef{gtr@fam@##1@pos}{-\gtr@level@reference+\gtr@level@size+\gtr@level@distance-\csuse{gtr@fam@##1@frac}\dimexpr\gtr@level@distance}% + }% + \let\gtr@set@position@family@left=\gtr@set@position@family@down% + \let\gtr@set@position@family@right=\gtr@set@position@family@up% + }, +} + +\newif\ifgtr@timeflow@vertical + +\def\gtr@init@timeflow@down{% + \gtr@timeflow@verticaltrue% + \let\gtrNodeMinWidth=\gtr@node@minsize% + \let\gtrNodeMaxWidth=\gtr@node@maxsize% + \let\gtrNodeMinHeight=\gtr@level@size% + \let\gtrNodeMaxHeight=\gtr@level@size% +} + +\let\gtr@init@timeflow@up=\gtr@init@timeflow@down + +\def\gtr@init@timeflow@left{% + \gtr@timeflow@verticalfalse% + \let\gtrNodeMinWidth=\gtr@level@size% + \let\gtrNodeMaxWidth=\gtr@level@size% + \let\gtrNodeMinHeight=\gtr@node@minsize% + \let\gtrNodeMaxHeight=\gtr@node@maxsize% +} + +\let\gtr@init@timeflow@right=\gtr@init@timeflow@left + +\newif\ifgtr@ignore + +\gtrset{% + id prefix/.store in=\gtrkv@idprefix, + id suffix/.store in=\gtrkv@idsuffix, + id/.code={\xdef\gtr@gkv@id{\expandonce\gtrkv@idprefix\unexpanded{#1}\expandonce\gtrkv@idsuffix}}, + distance/.gstore in=\gtr@gkv@distance, + tikz/.gstore in=\gtr@gkv@tikz, + pivot@@value/.gstore in=\gtr@gkv@pivot, + pivot@none/.style={pivot@@value=0}, + pivot@child/.style={pivot@@value=1}, + pivot@parent/.style={pivot@@value=2}, + pivot@both/.style={pivot@@value=3}, + pivot/.style={pivot@#1}, + pivot/.default={both}, + pivot shift/.gstore in=\gtr@gkv@pivotshift, + % + ignore/.is choice, + ignore/true/.code={\global\gtr@ignoretrue}, + ignore/false/.code={\global\gtr@ignorefalse}, + ignore/.default=true, + % + insert after node/.code n args={2}{% + \gtr@parse@init@hook{gtr@parse@afternode@hook}{gtr@per@\gtr@currentperson @id}% + \gtr@parse@appto@hook{gtr@parse@afternode@hook}{#1}{#2}% + }, + insert after family/.code n args={2}{% + \gtr@parse@init@hook{gtr@parse@afterfamily@hook}{gtr@fam@\gtr@lastfamily @id}% + \gtr@parse@appto@hook{gtr@parse@afterfamily@hook}{#1}{#2}% + }, + insert at begin family/.code n args={2}{% + \gtr@parse@init@hook{gtr@parse@beginfamily@hook}{gtr@fam@\gtr@currentfamily @id}% + \gtr@parse@appto@hook{gtr@parse@beginfamily@hook}{#1}{#2}% + }, + insert at end family/.code n args={2}{% + \gtr@parse@init@hook{gtr@parse@endfamily@hook}{gtr@fam@\gtr@currentfamily @id}% + \gtr@parse@appto@hook{gtr@parse@endfamily@hook}{#1}{#2}% + }, + % + family/.style={#1}, + subtree/.style={#1}, + node/.style={#1}, + % + box/.code={\gtrkeysappto\gtrNodeBoxOptions{#1}}, + box clear/.code={\def\gtrNodeBoxOptions{}}, + % + node box/.style={node={box={#1}}}, + family box/.style={family={box={#1}}}, + subtree box/.style={subtree={box={#1}}}, + % + label/.store in=\gtrkv@family@label, + family label/.style={family={label={#1}}}, + subtree label/.style={subtree={label={#1}}}, + label options/.store in=\gtrkv@family@label@options, + label database options/.store in=\gtrkv@database@label, + ignore family database/.style={family@database/.code=}, + use family database/.style={family@database/.code={% + \gtrset{database/.cd,db@reset,##1}% + \gtrOptionsDatabase% + \gtrset{label={\gtrPrintDatabase}}% + }}, + family database/.style={family={family@database={#1}}}, + % + node processor/.code={\let\gtr@box@content@processor=#1}, + processing/.is choice,% + % + time@flow/.store in=\gtrkv@timeflow, + timeflow/.is choice, + timeflow/down/.style={time@flow=down}, + timeflow/up/.style={time@flow=up}, + timeflow/left/.style={time@flow=left}, + timeflow/right/.style={time@flow=right}, + % + level distance/.dimstore in=\gtr@@kv@@gtr@level@distance, + level size/.dimstore in=\gtr@@kv@@gtr@level@size, + node size from/.code args={#1 to #2}{\dimdef\gtr@@kv@@gtr@node@minsize{#1}\dimdef\gtr@@kv@@gtr@node@maxsize{#2}}, + node size/.code={\dimdef\gtr@@kv@@gtr@node@minsize{#1}\dimdef\gtr@@kv@@gtr@node@maxsize{#1}},% + child distance in parent graph/.dimstore in=\gtr@@kv@@gtr@dist@sibling@par,% + child distance in child graph/.dimstore in=\gtr@@kv@@gtr@dist@sibling@chi,% + parent distance in parent graph/.dimstore in=\gtr@@kv@@gtr@dist@parent@par,% + parent distance in child graph/.dimstore in=\gtr@@kv@@gtr@dist@parent@chi,% + further distance/.dimstore in=\gtr@@kv@@gtr@dist@further,% + % + child distance/.style={child distance in parent graph=#1,child distance in child graph=#1},% + parent distance/.style={parent distance in parent graph=#1,parent distance in child graph=#1},% + % + proband level/.store in=\gtrkv@proband@level, + tree offset/.store in=\gtrkv@tree@offset, + after parser/.code={\gappto\gtrkv@after@parser{#1}}, + add child/.code args={#1 to #2}{\gappto\gtrkv@after@parser{\gtr@add@child@after@parser{#1}{#2}}},% + add parent/.code args={#1 to #2}{\gappto\gtrkv@after@parser{\gtr@add@parent@after@parser{#1}{#2}}},% + remove child/.code args={#1 from #2}{\gappto\gtrkv@after@parser{\gtr@remove@child@after@parser{#1}{#2}}},% + remove parent/.code args={#1 from #2}{\gappto\gtrkv@after@parser{\gtr@remove@parent@after@parser{#1}{#2}}},% + disconnect/.is choice, + disconnect/child/.code={% + \ifdefvoid{\gtr@currentperson}{}{% + \begingroup\edef\x{\endgroup\noexpand\gappto\noexpand\gtrkv@after@parser{% + \noexpand\gtr@disconnect@node@as@child{\gtr@currentperson}% + }}\x% + }% + }, + disconnect/parent/.code={% + \ifdefvoid{\gtr@currentperson}{}{% + \begingroup\edef\x{\endgroup\noexpand\gappto\noexpand\gtrkv@after@parser{% + \noexpand\gtr@disconnect@node@as@parent{\gtr@currentperson}% + }}\x% + }% + }, + disconnect/both/.code={% + \ifdefvoid{\gtr@currentperson}{}{% + \begingroup\edef\x{\endgroup\noexpand\gappto\noexpand\gtrkv@after@parser{% + \noexpand\gtr@disconnect@node@as@child{\gtr@currentperson}% + \noexpand\gtr@disconnect@node@as@parent{\gtr@currentperson}% + }}\x% + }% + }, + disconnect/.default=both, + % + options for subtree/.code 2 args={\gtrsetoptionsforsubtree{#1}{#2}}, + options for family/.code 2 args={\gtrsetoptionsforfamily{#1}{#2}}, + options for node/.code 2 args={\gtrsetoptionsfornode{#1}{#2}}, + % + ignore subtree/.code={\gtrignoresubtree{#1}}, + ignore node/.code={\gtrignorenode{#1}}, + ignore level/.code={% + \ifnum#1>0% + \gtrset{level #1/.style={node=ignore}}% + \edef\gtrtemp{\the\numexpr#1+1\relax}% + \gtrset{level \gtrtemp/.style=ignore}% + \else\ifnum#1<0% + \gtrset{level #1/.style={ignore,node=ignore}}% + \fi\fi% + }, + % + edges/.code={\gtredgeset{#1}}, + family edges/.style={family={edges={#1}}}, + edges for family/.style 2 args={options for family={#1}{edges={#2}}}, + subtree edges/.style={subtree={edges={#1}}}, + edges for subtree/.style 2 args={options for subtree={#1}{edges={#2}}}, + % + tikzpicture/.store in=\gtrkv@tikzpicture, + after tree/.code={\appto\gtrkv@after@tree{#1}}, + tikzset/.code={\def\gtrkv@tikzset{\tikzset{#1}}}, + tcbset/.code={\def\gtrkv@tcbset{\tcbset{#1}}}, + % + extra edges/.code={\listadd{\gtr@extra@edges@app}{#1}}, + extra edges prepend/.code={\listadd{\gtr@extra@edges@pre}{#1}}, + family extra edges/.style n args={3}{family={extra edges={#1}{#2}{#3}}}, + family extra edges prepend/.style n args={3}{family={extra edges prepend={#1}{#2}{#3}}}, + extra edges for family/.style n args={4}{options for family={#1}{extra edges={#2}{#3}{#4}}}, + extra edges prepend for family/.style n args={4}{options for family={#1}{extra edges prepend={#2}{#3}{#4}}}, + extra edges for families/.style 2 args={% + x/.style n args={3}{extra edges for family={##1}{##2}{##3}{#2}},% + #1}, + extra edges prepend for families/.style 2 args={% + x/.style n args={3}{extra edges prepend for family={##1}{##2}{##3}{#2}},% + #1}, + % + edges@shift@down/.style={family edges={yshift=#1}}, + edges@shift@up/.style={family edges={yshift=-#1}}, + edges@shift@left/.style={family edges={xshift=#1}}, + edges@shift@right/.style={family edges={xshift=-#1}}, + edges shift/.style={edges@shift@\gtr@timeflow={#1}}, + edges up/.style={edges shift=\gtr@level@distance/3}, + edges down/.style={edges shift=-\gtr@level@distance/3}, + edges up by/.style args={#1 of #2}{edges shift=#1\dimexpr\gtr@level@distance/#2}, + edges down by/.style args={#1 of #2}{edges shift=-#1\dimexpr\gtr@level@distance/#2}, + % + phantom*/.style={subtree={processing=tcolorbox,deletion content interpreter,edges=none, + box={empty,notitle,no underlay,no overlay,no shadow,no borderline,code={\ifstrempty{#1}{}{% + \ifgtr@timeflow@vertical\tcbset{width=#1}\else\tcbset{height=#1}\fi% + }}}}}, + phantom*/.default=, + phantom/.style={phantom*={#1},subtree=disconnect}, + phantom/.default=, +} + +\pgfkeys{/gtr/edge/.is family} +\def\gtredgeset{\pgfqkeys{/gtr/edge}} + +\gtredgeset{ + edge@mode/.store in=\gtrkv@edgemode, + perpendicular/.style={edge@mode=perpendicular}, + rounded@arc/.store in=\gtrkv@edge@arc, + rounded/.style={edge@mode=rounded,rounded@arc={#1}}, + rounded/.default=6pt, + swing@control/.store in=\gtrkv@edge@swingcontrol, + swing/.style={edge@mode=swing,swing@control={#1}}, + swing/.default=12pt, + mesh@options/.store in=\gtrkv@edge@meshoptions, + mesh/.style={edge@mode=mesh,mesh@options={#1}}, + mesh/.default=, + custom/.code n args={4}{% + \let\gtr@edge@custom@down@macro=#1% + \let\gtr@edge@custom@up@macro=#2% + \let\gtr@edge@custom@left@macro=#3% + \let\gtr@edge@custom@right@macro=#4% + \gtredgeset{edge@mode=custom}% + }, + none/.style={custom={\gtr@edge@custom@none@macro}{\gtr@edge@custom@none@macro}{\gtr@edge@custom@none@macro}{\gtr@edge@custom@none@macro}}, + foreground/.style={gtr@edge@foreground/.style={line width=1pt,draw=green!25!black,#1}}, + background/.style={gtr@edge@background/.style={line width=1.75pt,draw=green!15!white,#1}}, + no foreground/.style={gtr@edge@foreground/.style={draw=none,fill=none}}, + no background/.style={gtr@edge@background/.style={draw=none,fill=none}}, + anchoring/.is choice, + anchoring/periphery/.code={% + \def\gtrkv@edge@anchor@vert@A{north}% + \def\gtrkv@edge@anchor@vert@B{south}% + \def\gtrkv@edge@anchor@hori@A{east}% + \def\gtrkv@edge@anchor@hori@B{west}% + }, + anchoring/center/.code={% + \def\gtrkv@edge@anchor@vert@A{center}% + \def\gtrkv@edge@anchor@vert@B{center}% + \def\gtrkv@edge@anchor@hori@A{center}% + \def\gtrkv@edge@anchor@hori@B{center}% + }, + hide single leg/.is choice, + hide single leg/true/.code={\def\gtrkv@edge@noleg{1}}, + hide single leg/false/.code={\def\gtrkv@edge@noleg{0}}, + hide single leg/.default=true, + xshift/.store in=\gtrkv@edge@core@xshift, + yshift/.store in=\gtrkv@edge@core@yshift, +} + +\def\gtr@adjust@position#1 #2 of #3 distance #4 shift #5 #6\@nil{% + \gappto\gtrkv@after@parser{\gtr@adjust{#1}{#2}{#3}{#4}{#5}}% +} + +\def\gtr@adjust@node@right#1#2#3#4{\gappto\gtrkv@after@parser{\gtr@adjust{#1}{right}{#2.east}{#3}{#4}}} +\def\gtr@adjust@node@left#1#2#3#4{\gappto\gtrkv@after@parser{\gtr@adjust{#1}{left}{#2.west}{#3}{#4}}} +\def\gtr@adjust@node@above#1#2#3#4{\gappto\gtrkv@after@parser{\gtr@adjust{#1}{above}{#2.north}{#3}{#4}}} +\def\gtr@adjust@node@below#1#2#3#4{\gappto\gtrkv@after@parser{\gtr@adjust{#1}{below}{#2.south}{#3}{#4}}} + +\def\gtr@adjust@node#1 #2 of #3 distance #4 shift #5 #6\@nil{% + \csname gtr@adjust@node@#2\endcsname{#1}{#3}{#4}{#5}% +} + +\gtrset{ + adjust position/.code={\gtr@adjust@position#1 shift 0mm \@nil},% + adjust node/.code={\gtr@adjust@node#1 shift 0mm \@nil},% + set position/.code args={#1 at #2}{\gappto\gtrkv@after@parser{\gtr@setposition{#1}{#2}}},% +} + +\gtrset{% + turn/.is choice, + turn/.default=right, + turn/right/.style={box={rotate=90,gtrNodeDimensionsLandscape}}, + turn/left/.style={box={rotate=270,gtrNodeDimensionsLandscape}}, + turn/off/.style={box={rotate=0,gtrNodeDimensions}}, + turn/upsidedown/.style={box={rotate=180,gtrNodeDimensions}}, + % + male/.style={box={male}}, + female/.style={box={female}}, + neuter/.style={box={neuter}}, +} + +\gtrset{% + reset/.style={% + reset edge level shift, + id prefix=, + id suffix=, + timeflow=down, + level distance=5mm, + level size=3.5cm, + node size=2.5cm, + proband level=0, + tree offset=0pt, + level/.style=, + box clear, + processing=fit, + edges={perpendicular,foreground=,background=,anchoring=periphery,hide single leg,xshift=0pt,yshift=0pt}, + child distance in parent graph=1mm,% + child distance in child graph=2mm,% + parent distance in parent graph=2mm,% + parent distance in child graph=1mm,% + further distance=3mm,% + tikzpicture=,code={\def\gtrkv@tikzset{}\def\gtrkv@tcbset{}},% + ignore family database, + label options=, + label database options=, + no content interpreter, + }, + reset +} |