命令已定义(自定义命令)

命令已定义(自定义命令)

当编译以下代码时,编译器告诉我命令已经定义(名称为\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}

结果

相关内容