![tikz/pgf-pie:在 \newcommand 中包装饼图](https://linux22.com/image/350218/tikz%2Fpgf-pie%EF%BC%9A%E5%9C%A8%20%5Cnewcommand%20%E4%B8%AD%E5%8C%85%E8%A3%85%E9%A5%BC%E5%9B%BE.png)
尝试使用文档中的饼图来表示有理数,如下所示:
\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}