tikz/pgf-pie:在 \newcommand 中包装饼图

tikz/pgf-pie:在 \newcommand 中包装饼图

尝试使用文档中的饼图来表示有理数,如下所示:

\documentclass{article}

\usepackage{tikz}
\usepackage{pgf-pie}

\begin{document}

\begin{tabular}{|p{4cm}|p{4cm}|p{4cm}|}

$\frac{1}{2}$ & $\frac{2}{2}$ \\

% 1/2
\begin{tikzpicture}

\pie[rotate=90, radius=2, sum=auto, color={white,blue}, /tikz/nodes={opacity=0,overlay}] {1 , 1 }

\end{tikzpicture} 

&

% 2/2 
\begin{tikzpicture}

\pie[rotate=90, radius=2, sum=auto, color={blue,blue}, /tikz/nodes={opacity=0,overlay}] {1 , 1 }

\end{tikzpicture} 

\\

$\frac{1}{3}$ & $\frac{2}{3}$ & $\frac{3}{3}$ \\


% 1/3
\begin{tikzpicture}

\pie[rotate=90, radius=2, sum=auto, color={white,white,blue}, /tikz/nodes={opacity=0,overlay}] {1 , 1, 1 }

\end{tikzpicture} 

&

% 2/3
\begin{tikzpicture}

\pie[rotate=90, radius=2, sum=auto, color={white,blue,blue}, /tikz/nodes={opacity=0,overlay}] {1 , 1, 1 }

\end{tikzpicture} 

&

% 3/3
\begin{tikzpicture}

\pie[rotate=90, radius=2, sum=auto, color={blue,blue,blue}, /tikz/nodes={opacity=0,overlay}] {1 , 1, 1 }

\end{tikzpicture} 


\end{tabular}

\end{document}

文档或多或少满足了预期。但是,可以使用创建每个饼图的新命令来改进它。新命令应该有两个参数,分别对应于分母和分子。例如:

\newcommand{\rationalpie}[2]{
    \begin{tikzpicture}

    \pie[rotate=90, radius=2, sum=auto, color={white,blue,blue}, /tikz/nodes={opacity=0,overlay}] {1 , 1, 1 }

    \end{tikzpicture} 
}

可以用作:

\rationalpie{2}{3}

问题是:如何定义这个新命令?固定列表 {1,1,1} 必须用许多“1”替换为分母参数,列表 {white,blue,blue} 必须用许多元素替换为分母,其中“blue”重复分子次数。

答案1

这是使用令牌列表和包的实现forloop

\documentclass{article}
\usepackage{pgf-pie}
\usepackage{forloop}
\newtoks\colors
\newtoks\parts
\newcounter{parts}
\newcommand\rationalpiex[2]%
  {\begin{tikzpicture}
   \pie[rotate=90, radius=2, sum=auto, color={#1}, /tikz/nodes={opacity=0,overlay}] {#2}
   \end{tikzpicture}%
  }
\newcommand\rationalpie[2]%
  {\colors{}\parts{}%
   \forloop[-1]{parts}{#2}{\value{parts} > 0}%
     {\parts\expandafter{\the\parts1}%
      \ifthenelse{\value{parts} > #1}%
        {\colors\expandafter{\the\colors white}}%
        {\colors\expandafter{\the\colors blue}}%
      \ifthenelse{\value{parts} > 1}%
        {\parts\expandafter{\the\parts,}%
         \colors\expandafter{\the\colors,}%
        }%
        {}%
     }%
   \edef\rationalpiexx{\noexpand\rationalpiex{\the\colors}{\the\parts}}%
   \rationalpiexx
  }

\begin{document}
\begin{tabular}{|p{4cm}|p{4cm}|p{4cm}|}
$\frac12$      & $\frac22$                      \\
\rationalpie12 & \rationalpie22                 \\
$\frac13$      & $\frac23$      & $\frac33$     \\
\rationalpie13 & \rationalpie23 & \rationalpie33 
\end{tabular}
\end{document}

答案2

这是一个不使用任何附加包的实现。

正确创建列表后,例如

\gdef\card{1}
\foreach \i in {1,...,\numexpr#2-1\relax} {\xdef\card{\card,1}}
\ifnum#1=#2
  \gdef\select{blue}
  \foreach \i in {1,...,\numexpr#2-1\relax} {\xdef\select{\select,blue}}
\else
  \gdef\select{white}
  \foreach \i in {1,...,\numexpr#1\relax} {\xdef\select{\select,blue}}
  \foreach \i in {1,...,\numexpr#2-#1-1\relax} {\xdef\select{\select,white}}
\fi

其中#1分子和#2分母是,这基本上是一个扩展问题,可以用老办法解决

\begingroup\edef\x{\endgroup
    \noexpand\expandafter\noexpand\pie\piearguments}\x

假如说

\def\piearguments{[rotate=90, radius=2, sum=auto, color={\select}, /tikz/nodes={opacity=0,overlay}]{\card}}

完整示例:

\documentclass{article}

\usepackage{tikz}
\usepackage{pgf-pie}

\newcommand*\rationalpie[2]{%
  \gdef\card{1}
  \foreach \i in {1,...,\numexpr#2-1\relax} {\xdef\card{\card,1}}
  \ifnum#1=#2
    \gdef\select{blue}
    \foreach \i in {1,...,\numexpr#2-1\relax} {\xdef\select{\select,blue}}
  \else
    \gdef\select{white}
      \foreach \i in {1,...,\numexpr#1\relax} {\xdef\select{\select,blue}}
    \foreach \i in {1,...,\numexpr#2-#1-1\relax} {\xdef\select{\select,white}}
  \fi
  \begin{tikzpicture}
    \begingroup\edef\x{\endgroup
    \noexpand\expandafter\noexpand\pie\piearguments}\x
  \end{tikzpicture} 
}
\def\piearguments{[rotate=90, radius=2, sum=auto, color={\select}, /tikz/nodes={opacity=0,overlay}]{\card}}

\begin{document}

\begin{tabular}{|p{4cm}|p{4cm}|p{4cm}|}

$\frac{1}{2}$ & $\frac{2}{2}$ \\

% 1/2
\rationalpie{1}{2}

&

% 2/2 
\rationalpie{2}{2}

\\

$\frac{1}{3}$ & $\frac{2}{3}$ & $\frac{3}{3}$ \\


% 1/3
\rationalpie{1}{3}

&

% 2/3
\rationalpie{2}{3}

&

% 3/3
\rationalpie{3}{3}

\end{tabular}

\end{document}

output

相关内容