summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib/pgf-pie/tikzlibrarypie.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/contrib/pgf-pie/tikzlibrarypie.code.tex')
-rw-r--r--graphics/pgf/contrib/pgf-pie/tikzlibrarypie.code.tex465
1 files changed, 465 insertions, 0 deletions
diff --git a/graphics/pgf/contrib/pgf-pie/tikzlibrarypie.code.tex b/graphics/pgf/contrib/pgf-pie/tikzlibrarypie.code.tex
new file mode 100644
index 0000000000..dd949d9644
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-pie/tikzlibrarypie.code.tex
@@ -0,0 +1,465 @@
+% SPDX-License-Identifier: GPL-2.0-only OR LPPL-1.3c
+\RequirePackage{scalefnt}
+
+%
+% Utilities
+%
+
+\def\pgfpie@ifx#1#2{%
+ \ifx#1#2%
+ \expandafter\pgfutil@firstoftwo
+ \else
+ \expandafter\pgfutil@secondoftwo
+ \fi}
+
+\def\pgfpie@ifdim#1#2#3{%
+ \ifdim\dimexpr#1\relax#2\dimexpr#3\relax
+ \expandafter\pgfutil@firstoftwo
+ \else
+ \expandafter\pgfutil@secondoftwo
+ \fi}
+
+\def\pgfpie@ifnum#1#2#3{%
+ \ifnum\numexpr#1\relax#2\numexpr#3\relax
+ \expandafter\pgfutil@firstoftwo
+ \else
+ \expandafter\pgfutil@secondoftwo
+ \fi}
+
+\def\pgfpie@ifodd#1{%
+ \ifodd\numexpr#1\relax
+ \expandafter\pgfutil@firstoftwo
+ \else
+ \expandafter\pgfutil@secondoftwo
+ \fi}
+
+\def\pgfpie@newif#1{%
+ \csname newif\expandafter\endcsname\csname ifpgfpie@#1\endcsname
+ \expandafter\def\csname pgfpie@if#1\expandafter\endcsname\expandafter{%
+ \csname ifpgfpie@#1\endcsname
+ \expandafter\pgfutil@firstoftwo
+ \else
+ \expandafter\pgfutil@secondoftwo
+ \fi}%
+}
+
+%
+% Constants for text comparison
+%
+
+\def\pgfpie@text@inside{inside}
+\def\pgfpie@text@legend{legend}
+\def\pgfpie@sum@c{100}
+\def\pgfpie@sum@auto{auto}
+
+% args:
+% #1: begin angle
+% #2: end angle
+% #3: number
+% #4: label
+% #5: explode
+% #6: fill color
+% #7: radius
+% #8: center
+\def\pgfpie@slice#1#2#3#4#5#6#7#8{%
+ \pgfmathparse{0.5*(#1)+0.5*(#2)}
+ \let\pgfpie@midangle\pgfmathresult
+
+ \path (#8) -- ++({\pgfpie@midangle}:{#5}) coordinate (pgfpie@O);
+
+ \pgfmathparse{(#7)+(#5)}
+ \let\pgfpie@radius\pgfmathresult
+
+ % slice
+ \draw[line join=round,fill={#6},\pgfpie@style] (pgfpie@O) -- ++({#1}:{#7}) arc ({#1}:{#2}:{#7}) -- cycle;
+
+ \pgfmathparse{min(((#2)-(#1)-10)/110*(-0.3),0)}
+ \pgfmathparse{(max(\pgfmathresult,-0.5) + 0.8)*(#7)}
+ \let\pgfpie@innerpos\pgfmathresult
+
+ \pgfpie@ifx\pgfpie@text\pgfpie@text@inside{%
+ % label and number together
+ \path (pgfpie@O) -- ++({\pgfpie@midangle}:{\pgfpie@innerpos}) node[align=center]
+ {\pgfpie@scalefont{#3}\pgfpie@labeltext{#4}\\\pgfpie@numbertext{#3}};
+ }{%
+ % label
+ \pgfpie@ifhidelabel{}{%
+ \pgfpie@iflegend{}{%
+ \path (pgfpie@O) -- ++ ({\pgfpie@midangle}:{\pgfpie@radius})
+ node[inner sep=0, \pgfpie@text={\pgfpie@midangle:#4}]{};
+ }%
+ }%
+
+ % number
+ \path (pgfpie@O) -- ++({\pgfpie@midangle}:{\pgfpie@innerpos}) node
+ {\pgfpie@scalefont{#3}\pgfpie@numbertext{#3}};
+ }%
+}
+
+\def\pgfpie@findColor#1{%
+ \pgfmathparse{int(mod(#1,\the\pgfpie@colorLength))}%
+ \let\pgfpie@ci\pgfmathresult
+ \foreach \pgfpie@c [count=\pgfpie@j from 0] in \pgfpie@color {%
+ \pgfpie@ifnum{\pgfpie@j}{=}{\pgfpie@ci}{%
+ \xdef\pgfpie@thecolor{\pgfpie@c}%
+ \breakforeach
+ }{}%
+ }
+}
+
+\def\pgfpie@findExplode#1{%
+ \pgfmathparse{int(mod(#1,\the\pgfpie@explodeLength))}%
+ \let\pgfpie@ei\pgfmathresult
+ \foreach \pgfpie@e [count=\pgfpie@j from 0] in \pgfpie@explode {%
+ \pgfpie@ifnum{\pgfpie@j}{=}{\pgfpie@ei}{%
+ \xdef\pgfpie@theexplode{\pgfpie@e}%
+ \breakforeach
+ }{}%
+ }%
+}
+
+% #1: bottom left point
+% #2: size
+% #3: number
+% #4: color
+% #5: text
+\def\pgfpie@square#1#2#3#4#5{%
+ \pgfpie@ifx\pgfpie@text\pgfpie@text@inside{%
+ \draw[fill={#4},\pgfpie@style] (#1) rectangle node[align=center]
+ {\pgfpie@scalefont{#3}\pgfpie@labeltext{#5}\\\pgfpie@numbertext{#3}} ++(#2);
+ }{%
+ \draw[fill={#4},\pgfpie@style] (#1) rectangle node
+ {\pgfpie@scalefont{#3}\pgfpie@numbertext{#3}} ++(#2);
+ }%
+}
+
+% #1: pos
+% #2: radius
+% #3: number
+% #4: color
+% $5: style
+% $6: label
+\def\pgfpie@cloud#1#2#3#4#5#6{%
+ \draw[fill=#4, #5] (#1) circle[radius=#2];
+ \pgfpie@ifx\pgfpie@text\pgfpie@text@inside{%
+ \node[align=center] at (#1) {\pgfpie@scalefont{#3}\pgfpie@labeltext{#6}\\\pgfpie@numbertext{#3}};
+ }{%
+ \node at (#1) {\pgfpie@scalefont{#3}\pgfpie@numbertext{#3}};
+ }%
+}
+
+\newdimen\pgfpie@angleEnd
+\newcount\pgfpie@explodeLength
+\newcount\pgfpie@colorLength
+\newcount\pgfpie@sliceLength
+
+\pgfqkeys{/pgfpie}{%
+ explode/.store in=\pgfpie@explode,
+ color/.store in=\pgfpie@color,
+ radius/.store in=\pgfpie@radius,
+ pos/.store in=\pgfpie@pos,
+ style/.store in=\pgfpie@style,
+ before number/.store in=\pgfpie@beforenumber,
+ after number/.store in=\pgfpie@afternumber,
+ text/.store in=\pgfpie@text,
+ sum/.store in=\pgfpie@sum,
+ rotate/.store in=\pgfpie@rotate,
+}
+
+\pgfpie@newif{polar}
+\pgfqkeys{/pgfpie}{polar/.is if=pgfpie@polar}
+
+\pgfpie@newif{legend}
+
+\pgfpie@newif{square}
+\pgfqkeys{/pgfpie}{square/.is if=pgfpie@square}
+
+\pgfpie@newif{cloud}
+\pgfqkeys{/pgfpie}{cloud/.is if=pgfpie@cloud}
+
+\pgfpie@newif{scalefont}
+\pgfqkeys{/pgfpie}{scale font/.is if=pgfpie@scalefont}
+\def\pgfpie@scalefont#1{%
+ \pgfpie@ifscalefont{%
+ \pgfmathparse{(#1) / (\pgfpie@sum) * 3 + 0.9}%
+ \scalefont{\pgfmathresult}%
+ }{}%
+}
+
+\pgfpie@newif{hidenumber}
+\pgfqkeys{/pgfpie}{hide number/.is if=pgfpie@hidenumber}
+\def\pgfpie@numbertext#1{%
+ \pgfpie@ifhidenumber{}{%
+ \pgfpie@beforenumber#1\pgfpie@afternumber
+ }%
+}
+
+\pgfpie@newif{hidelabel}
+\pgfqkeys{/pgfpie}{hide label/.is if=pgfpie@hidelabel}
+\def\pgfpie@labeltext#1{\pgfpie@ifhidelabel{}{#1}}
+
+\tikzaddtikzonlycommandshortcutlet{\pie}{\pgfpie@pie}%
+
+\def\pgfpie@pie{%
+ \pgfutil@ifnextchar[{\pgfpie@@pie}{\pgfpie@@pie[]}%
+}
+
+\def\pgfpie@@pie[#1]#2{%
+ % load default parameters
+ \pgfqkeys{/pgfpie}{
+ explode=0,
+ color={blue!60, cyan!60, yellow!60, orange!60, red!60,
+ blue!60!cyan!60, cyan!60!yellow!60, red!60!cyan!60,
+ red!60!blue!60, orange!60!cyan!60},
+ radius=3,
+ pos={0,0},
+ style={thick},
+ before number=,
+ after number=,
+ text=label,
+ sum=100,
+ rotate=0,
+ polar=false,
+ square=false,
+ cloud=false,
+ scale font=false,
+ hide number=false,
+ hide label=false,
+ every pie/.try,
+ }%
+ % load user's parameters
+ \pgfqkeys{/pgfpie}{#1}%
+ % add percentage automatically
+ \pgfpie@ifx\pgfpie@sum\pgfpie@sum@c{%
+ \pgfqkeys{/pgfpie}{after number=\%}%
+ \pgfqkeys{/pgfpie}{#1}%
+ }{}%
+
+ % legend or not
+ \pgfpie@ifx\pgfpie@text\pgfpie@text@legend{%
+ \pgfpie@legendtrue
+ }{%
+ \pgfpie@legendfalse
+ }%
+
+ % handle sum
+ \pgfpie@ifx\pgfpie@sum\pgfpie@sum@auto{%
+ % sum all input
+ \xdef\pgfpie@sum{0}%
+ \foreach \pgfpie@p/\pgfpie@t in {#2} {%
+ \pgfmathparse{(\pgfpie@sum) + (\pgfpie@p)}%
+ \xdef\pgfpie@sum{\pgfmathresult}%
+ }%
+ }{}%
+
+ % init counters
+ \global\pgfpie@explodeLength=0
+ \foreach \pgfpie@e in \pgfpie@explode {%
+ \global\advance\pgfpie@explodeLength by 1
+ }%
+
+ \global\pgfpie@colorLength=0
+ \foreach \pgfpie@c in \pgfpie@color {%
+ \global\advance\pgfpie@colorLength by 1
+ }%
+
+ \pgfmathsetlength{\pgfpie@angleEnd}{0}%
+
+ \global\pgfpie@sliceLength=0
+ \foreach \pgfpie@p/\pgfpie@e in {#2} {%
+ \global\advance\pgfpie@sliceLength by 1
+ }%
+
+ \pgfpie@ifsquare{%
+ \pgfpie@pie@square{#2}%
+ }{\pgfpie@ifcloud{\pgfpie@pie@cloud{#2}%
+ }{\pgfpie@pie@circle{#2}}}
+
+ % legend
+ \pgfpie@ifhidelabel{}{%
+ \pgfpie@iflegend{%
+ \pgfpie@legend{#2}%
+ }{}}%
+}
+
+\def\pgfpie@pie@square#1{%
+ \pgfmathparse{(\pgfpie@radius)*2}
+ \xdef\pgfpie@verticalLength{\pgfmathresult}
+ \xdef\pgfpie@horizontalLength{\pgfmathresult}
+ \path (\pgfpie@pos) -- ++({-\pgfpie@radius},{-\pgfpie@radius}) coordinate (pgfpie@start);
+ \pgfmathparse{(\pgfpie@verticalLength) * (\pgfpie@horizontalLength) / (\pgfpie@sum)}
+ \let\pgfpie@squareUnit\pgfmathresult
+
+ % drawing loop
+ \foreach \pgfpie@p/\pgfpie@t [count=\pgfpie@i from 0] in {#1}
+ {
+ \pgfpie@findColor{\pgfpie@i}
+
+ \pgfpie@ifdim{\pgfpie@verticalLength cm}{>}{\pgfpie@horizontalLength cm}{%
+ \pgfmathparse{(\pgfpie@p) * (\pgfpie@squareUnit) / (\pgfpie@horizontalLength)}
+ \let\pgfpie@height\pgfmathresult
+
+ \pgfpie@square{pgfpie@start}{\pgfpie@horizontalLength,\pgfpie@height}
+ {\pgfpie@p}
+ {\pgfpie@thecolor}
+ {\pgfpie@t}
+ %label
+ \pgfpie@iflegend{}{%
+ \pgfpie@ifx\pgfpie@text\pgfpie@text@inside{}{%
+ \pgfpie@ifhidelabel{}{%
+ \path (pgfpie@start) -- ++({\pgfpie@horizontalLength},{\pgfpie@height*0.5})
+ node[inner sep=0, \pgfpie@text={0:{\pgfpie@t}}]{};
+ }%
+ }%
+ }%
+
+ \pgfmathparse{\pgfpie@verticalLength - \pgfpie@height}
+ \xdef\pgfpie@verticalLength{\pgfmathresult}
+ \path (pgfpie@start) -- ++(0, \pgfpie@height) coordinate (pgfpie@start);
+ }{%
+ \pgfmathparse{(\pgfpie@p) * (\pgfpie@squareUnit) / (\pgfpie@verticalLength)}%
+ \let\pgfpie@width\pgfmathresult
+
+ \pgfpie@square{pgfpie@start}{\pgfpie@width,\pgfpie@verticalLength}
+ {\pgfpie@p}
+ {\pgfpie@thecolor}
+ {\pgfpie@t}
+ %label
+ \pgfpie@iflegend{}{%
+ \pgfpie@ifx\pgfpie@text\pgfpie@text@inside{}{%
+ \pgfpie@ifhidelabel{}{%
+ \path (pgfpie@start) -- ++({\pgfpie@width*0.5},{\pgfpie@verticalLength})
+ node[inner sep=0, \pgfpie@text={90:{\pgfpie@t}}]{};
+ }%
+ }%
+ }%
+
+ \pgfmathparse{(\pgfpie@horizontalLength) - (\pgfpie@width)}%
+ \xdef\pgfpie@horizontalLength{\pgfmathresult}%
+ \path (pgfpie@start) -- ++({\pgfpie@width},0) coordinate (pgfpie@start);
+ }%
+ }%
+}
+
+\def\pgfpie@pie@cloud#1{%
+ % drawing loop
+ \foreach \pgfpie@p/\pgfpie@t [count=\pgfpie@i from 0] in {#1}
+ {
+ % find explode
+ \pgfpie@findExplode{\pgfpie@i}
+ \def\pgfpie@cloudGap{(\pgfpie@theexplode) + 0.1}
+ \pgfmathparse{sqrt((\pgfpie@p) / (\pgfpie@sum)) * (\pgfpie@radius)}
+ \let\pgfpie@cloudR\pgfmathresult
+ \pgfpie@ifnum{\pgfpie@i}{=}{0}{%
+ % first cloud
+ \coordinate (pgfpie@O) at (\pgfpie@pos);
+ \xdef\pgfpie@cloudRone{\pgfpie@cloudR}
+ \xdef\pgfpie@cloudExtendDir{180+(\pgfpie@rotate)}
+ }{\pgfpie@ifnum{\pgfpie@i}{=}{1}{%
+ % second cloud
+ \xdef\pgfpie@cloudRtwo{\pgfpie@cloudR}
+ \xdef\pgfpie@cloudExtendDir{45+(\pgfpie@rotate)}
+ \path (pgfpie@O) -- ++({\pgfpie@cloudExtendDir}:{(\pgfpie@cloudRone)+(\pgfpie@cloudGap)+(\pgfpie@cloudRtwo)}) coordinate (pgfpie@O);
+ }{%
+ % next cloud
+ \pgfmathparse{(\pgfpie@cloudRone)+(\pgfpie@cloudGap)+(\pgfpie@cloudRtwo)}
+ \let\pgfpie@la\pgfmathresult
+ \pgfmathparse{(\pgfpie@cloudRone)+(\pgfpie@cloudGap)+(\pgfpie@cloudR)}
+ \let\pgfpie@lb\pgfmathresult
+ \pgfmathparse{(\pgfpie@cloudRtwo)+(\pgfpie@cloudGap)+(\pgfpie@cloudR)}
+ \let\pgfpie@lc\pgfmathresult
+ \pgfmathparse{(\pgfpie@la)^2+(\pgfpie@lc)^2-(\pgfpie@lb)^2}
+ \let\pgfpie@tmp\pgfmathresult
+ \pgfmathparse{180 - acos((\pgfpie@tmp) / 2 / (\pgfpie@la) / (\pgfpie@lc))}
+ \let\pgfpie@cloudRot\pgfmathresult
+ \pgfpie@ifodd{\pgfpie@i}{%
+ \pgfmathparse{-(\pgfpie@cloudRot)}
+ \let\pgfpie@cloudRot\pgfmathresult
+ }{}%
+ \pgfmathparse{(\pgfpie@cloudExtendDir) - (\pgfpie@cloudRot)}
+ \xdef\pgfpie@cloudExtendDir{\pgfmathresult}
+ \path (pgfpie@O) -- ++({\pgfpie@cloudExtendDir}:{\pgfpie@lc}) coordinate (pgfpie@O);
+ \xdef\pgfpie@cloudRone{\pgfpie@cloudRtwo}
+ \xdef\pgfpie@cloudRtwo{\pgfpie@cloudR}
+ }}%
+
+ % find color
+ \pgfpie@findColor{\pgfpie@i}
+
+ \pgfpie@cloud{pgfpie@O}{\pgfpie@cloudR}{\pgfpie@p}
+ {\pgfpie@thecolor}{\pgfpie@style}{\pgfpie@t}
+
+ % label
+ \pgfpie@iflegend{}{%
+ \pgfpie@ifx\pgfpie@text\pgfpie@text@inside{}{%
+ \pgfpie@ifhidelabel{}{%
+ \path (pgfpie@O) -- ++({\pgfpie@cloudExtendDir}:{\pgfpie@cloudR})
+ node[inner sep=0, \pgfpie@text={\pgfpie@cloudExtendDir:{\pgfpie@t}}] {};
+ }%
+ }%
+ }%
+ }%
+}
+
+\def\pgfpie@pie@circle#1{%
+ \pgfpie@ifpolar{%
+ \xdef\pgfpie@maxValue{0}
+ \foreach \pgfpie@p/\pgfpie@e in {#1} {
+ \pgfmathparse{\pgfpie@p}%
+ \pgfpie@ifdim{\pgfpie@maxValue pt}{<}{\pgfmathresult pt}{%
+ \xdef\pgfpie@maxValue{\pgfpie@p}
+ }{}%
+ }
+ \pgfmathparse{(\pgfpie@sum) / \the\pgfpie@sliceLength}
+ \xdef\pgfpie@polarangle{\pgfmathresult}
+ \pgfmathparse{(\pgfpie@radius) / sqrt(\pgfpie@maxValue)}
+ \xdef\pgfpie@polarRadiusUnit{\pgfmathresult}
+ }{%
+ \xdef\pgfpie@theradius{\pgfpie@radius}%
+ }
+
+ \xdef\pgfpie@angleBegin{\the\pgfpie@angleEnd}
+ % drawing loop
+ \foreach \pgfpie@p/\pgfpie@t [count=\pgfpie@i from 0] in {#1}
+ {
+ \pgfmathsetlength{\pgfpie@angleEnd}{\pgfpie@angleBegin}
+ \pgfpie@ifpolar{%
+ % Polar area diagram
+ \pgfmathaddtolength{\pgfpie@angleEnd}{\pgfpie@polarangle}
+ \pgfmathparse{sqrt(\pgfpie@p) * (\pgfpie@polarRadiusUnit)}
+ \xdef\pgfpie@theradius{\pgfmathresult}
+ }{%
+ % normal pie
+ \pgfmathaddtolength{\pgfpie@angleEnd}{\pgfpie@p}
+ }
+
+ % find explode
+ \pgfpie@findExplode{\pgfpie@i}
+
+ % find color
+ \pgfpie@findColor{\pgfpie@i}
+ \pgfpie@slice{(\pgfpie@angleBegin)/(\pgfpie@sum)*360+(\pgfpie@rotate)}
+ {\the\pgfpie@angleEnd/(\pgfpie@sum)*360+(\pgfpie@rotate)}
+ {\pgfpie@p}
+ {\pgfpie@t}
+ {\pgfpie@theexplode}
+ {\pgfpie@thecolor}
+ {\pgfpie@theradius}
+ {\pgfpie@pos}
+ \xdef\pgfpie@angleBegin{\the\pgfpie@angleEnd}
+ }
+}
+
+\def\pgfpie@legend#1{%
+ \coordinate[xshift=0.8cm,
+ yshift={(\the\pgfpie@sliceLength*0.5+1)*0.5cm}] (pgfpie@legendpos) at
+ (current bounding box.east);
+
+ \scope[node distance=0.5cm]
+ \foreach \pgfpie@p/\pgfpie@t [count=\pgfpie@i from 0] in {#1}
+ {
+ \pgfpie@findColor{\pgfpie@i}
+ \node[draw, fill={\pgfpie@thecolor}, \pgfpie@style, below of={pgfpie@legendpos}, label={0:{\pgfpie@t}}] (pgfpie@legendpos) {};
+ }
+ \endscope
+}