tikz.dev / TikZpingus Manual

The TikZpingus package

Internals

C.3 Keys, Styles and Defaults

All keys of the package live in /pingu. Most of them only store a value, for example a color is stored with \pingu@color in a macro and read when it is drawn. The set /pingu/defaults puts everything back to the start, and \pingudefaults and \pingudefaultsappend add your own defaults to it. The composed keys, like /pingu/:ghost or /pingu/:hide, are styles that change the styles of the parts in /pingu/@<part>:

\newif\if@pingu@do@back@
\pgfqkeys{/pingu}{
:line/.style = {/pingu/@block/.append style={fill=none,draw=##1!80!black,shade=none,path fading=none}},
:fill/.style = {/pingu/body=#1,/pingu/body front=#1,/pingu/feet color=#1, /pingu/bill color=#1, /pingu/eyes color=#1, /pingu/eyes second color=#1},
:fill/.default = pingu@main,
:pingu/.style = {/pingu/@body/.style={#1},/pingu/@wings/.style={#1},/pingu/@eyes/.style={#1},/pingu/@bill/.style={#1},/pingu/@hair/.style={#1},/pingu/@feet/.style={#1}},
:toast/.style = {/pingu/left wing=none,/pingu/right wing=none,/pingu/feet=none,/pingu/hair=\@pingu@none},
:mix-draw/.style = {:pingu={/pingu/@block/.append style={/pingu/@pingu@all={####1!#1}, fill={####1!#1}}}},
:mix-draw/.default = 50!white,
:mix-all/.code = {\ifx\pingu@mixall\@empty\def\pingu@mixall{#1}\else\edef\pingu@mixall{\pingu@mixall!#1}\fi},
:mix-all/.default = 50!white,
:mix/.style = {
/pingu/@body/.code={\@pingu@color@mixwith\pingu@color@body@main{#1}\@pingu@color@mixwith\pingu@color@body@head{#1}},
/pingu/@wings/.code={\@pingu@color@mixwith\pingu@color@left@wing{#1}\@pingu@color@mixwith\pingu@color@right@wing{#1}},
/pingu/@eyes/.code={\@pingu@color@mixwith\pingu@color@eye@left{#1}\@pingu@color@mixwith\pingu@color@eye@right{#1}\@pingu@color@mixwith\pingu@color@eye@second@left{#1}\@pingu@color@mixwith\pingu@color@eye@second@right{#1}},
/pingu/@bill/.code={\@pingu@color@mixwith\pingu@color@bill{#1}},
/pingu/@hair/.code={\@pingu@color@mixwith\pingu@color@hair@a{#1}\@pingu@color@mixwith\pingu@color@hair@b{#1}\@pingu@color@mixwith\pingu@color@hair@c{#1}\@pingu@color@mixwith\pingu@color@hair@d{#1}\@pingu@color@mixwith\pingu@color@hair@e{#1}},
/pingu/@feet/.code={\@pingu@color@mixwith\pingu@color@foot@left{#1}\@pingu@color@mixwith\pingu@color@foot@right{#1}}
},
:mix/.default = 50!white,
:ghost parts/.style = {/pingu/@pingu@all/.append style={opacity={#1}}},
:ghost parts/.default = {.5},
:ghost/.style = {/pingu/@pingu/.append style={opacity=#1,transparency group}},
:ghost/.default = {.5},
:ghost glow/.style = {/pingu/@pingu/.append style={opacity=#1,transparency group},/pingu/@block/.append style={/pingu/@glow}},
:ghost glow/.default = {.5},
:devil/.style = {/pingu/devil horns=#1,/pingu/eyes devil=#1},
:devil/.default = pingu@purple,
:hide/.style = {/pingu/body type=none,/pingu/hair=\@pingu@none,/pingu/feet=none,/pingu/wings=none,/pingu/bill=none,/pingu/eyes=none},
:back/.code = {\pgfqkeys{/pingu}{eyes=none,bill=none,body front=\pingu@color@body@main,@pingu@main/.append style={xshift=2\pingu@w@half,xscale=-1},feet back}\gdef\pingu@back@init@call{\ifpengu@setup@manual@layers@\pgfsetlayers{foreground,middle,main,background}\fi\gdef\pingu@back@init@call{}}\@pingu@do@back@true}
}
\let\pingu@back@init@call\@empty

A part may need a group of its own, for example to place a part on another layer. This is what \pingu@layer is for:

\def\pingu@layer#1[#2]{\pgfonlayer{\csname pingu@L@#1\endcsname}\scope[/pingu/@pingu,#2]}
\def\endpingu@layer{\endscope\endpgfonlayer}