当编译以下代码时,编译器告诉我命令已经定义(名称为\c@b...
)。
\documentclass{article}
\usepackage{calc}
\usepackage{ifthen}
\usepackage{tikz}
\usepackage{verbatim}
\newcommand{\piepart}[5]
{
\draw[thick,fill=#4] (0,0) -- (#1:1) arc (#1:#2:1) -- cycle;
\pgfmathparse{0.5*#1+0.5*#2}
\let\midangle\pgfmathresult
\pgfmathtruncatemacro{\trunc}{\midangle}
\ifthenelse{\trunc < 90}{
\draw (\midangle:1) node[above right]{#3};
}
{
\ifthenelse{\trunc < 180}{
\draw (\midangle:1) node[above left]{#3};
}
{
\ifthenelse{\trunc < 270}{
\draw (\midangle:1) node[below left]{#3};
}
{
\draw (\midangle:1) node[below right]{#3};
}
}
}
\pgfmathparse{min((#2-#1-10)/110*(-0.3),0)}
\let\temp\pgfmathresult
\pgfmathparse{max(\temp,-0.5) + 0.8}
\let\innerpos\pgfmathresult
\node at (\midangle:0.8) {#5};
}
\newcommand{\piechart}[1]
{
\newcounter{a}
\newcounter{b}
\foreach \p/\mcolor/\mname in #1
{
\setcounter{a}{\value{b}}
\addtocounter{b}{\p}
\piepart{\thea/100*360}
{\theb/100*360}
{\mname}{\mcolor}{\p\%}
}
}
\begin{document}
\begin{tikzpicture}[scale=1.5]
\tikzstyle{every node}=[font=\tiny]
\piechart{{75/gray/A, 18/green/B, 7/red/C}}
\end{tikzpicture}
\begin{tikzpicture}[scale=1.5]
\tikzstyle{every node}=[font=\tiny]
\piechart{{75/gray/A, 18/green/B, 7/red/C}}
\end{tikzpicture}
\end{document}
如果有人知道是什么导致了错误,或者如何解决它,请告诉我。
谢谢
答案1
宏中有两次\newcounter
调用\pichart
。当第二次调用宏时,计数器已经定义,您会收到有关已定义命令\c@a
和的错误消息\c@b
,它们是计数器的内部命令表示。
将\newcounter
调用移到外部并重置宏内的计数器:
\newcounter{a}
\newcounter{b}
\newcommand*{\piechart}[1]{%
\setcounter{a}{0}%
\setcounter{b}{0}%
...
}
完整的示例(并使用更大的字体):
\documentclass{article}
\usepackage{calc}
\usepackage{ifthen}
\usepackage{tikz}
\usepackage{verbatim}
\newcommand{\piepart}[5]
{
\draw[thick,fill=#4] (0,0) -- (#1:1) arc (#1:#2:1) -- cycle;
\pgfmathparse{0.5*#1+0.5*#2}
\let\midangle\pgfmathresult
\pgfmathtruncatemacro{\trunc}{\midangle}
\ifthenelse{\trunc < 90}{
\draw (\midangle:1) node[above right]{#3};
}
{
\ifthenelse{\trunc < 180}{
\draw (\midangle:1) node[above left]{#3};
}
{
\ifthenelse{\trunc < 270}{
\draw (\midangle:1) node[below left]{#3};
}
{
\draw (\midangle:1) node[below right]{#3};
}
}
}
\pgfmathparse{min((#2-#1-10)/110*(-0.3),0)}
\let\temp\pgfmathresult
\pgfmathparse{max(\temp,-0.5) + 0.8}
\let\innerpos\pgfmathresult
\node at (\midangle:0.8) {#5};
}
\newcounter{a}
\newcounter{b}
\newcommand{\piechart}[1]
{
\setcounter{a}{0}%
\setcounter{b}{0}%
\foreach \p/\mcolor/\mname in #1
{
\setcounter{a}{\value{b}}
\addtocounter{b}{\p}
\piepart{\thea/100*360}
{\theb/100*360}
{\mname}{\mcolor}{\p\%}
}
}
\begin{document}
\begin{tikzpicture}[scale=1.5]
\tikzstyle{every node}=[font=\footnotesize]
\piechart{{75/gray/A, 18/green/B, 7/red/C}}
\end{tikzpicture}
\begin{tikzpicture}[scale=1.5]
\tikzstyle{every node}=[font=\footnotesize]
\piechart{{75/gray/A, 18/green/B, 7/red/C}}
\end{tikzpicture}
\end{document}