% 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; \pgfpie@ifchangedirection{% \pgfmathparse{min(((#1)-(#2)-10)/110*(-0.3),0)} }{% \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}{% .search also={/tikz,/pgf}, 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/.code={% \def\pgfpie@afternumber{#1}% \def\pgfpie@late@afternumber{}% }, text/.store in=\pgfpie@text, sum/.code={% \def\pgfpie@sum{#1}% \pgfpie@ifx\pgfpie@sum\pgfpie@sum@c{% \def\pgfpie@late@afternumber{\def\pgfpie@afternumber{\%}}% }{% \def\pgfpie@late@afternumber{}% }% }, rotate/.store in=\pgfpie@rotate, } \pgfpie@newif{polar} \pgfqkeys{/pgfpie}{polar/.is if=pgfpie@polar} \pgfpie@newif{legend} \pgfpie@newif{changedirection} \pgfqkeys{/pgfpie}{change direction/.is if=pgfpie@changedirection} \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{% \scope[% % to be compatible with "babel" lib handle active characters in nodes=false, % load default parameters /pgfpie/.cd, 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, change direction=false, polar=false, square=false, cloud=false, scale font=false, hide number=false, hide label=false, every pie/.try,% % load user's parameters #1] % add percentage automatically \pgfpie@late@afternumber % 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}% }{}}% \endscope } \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}% } \pgfpie@ifchangedirection{% \pgfmathsetlength{\pgfpie@angleEnd}{\pgfpie@sum} }{}% \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 \pgfpie@ifchangedirection{% \pgfmathaddtolength{\pgfpie@angleEnd}{-(\pgfpie@p)} }{% \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 }