Problemas ao renovar um comando duas vezes

Problemas ao renovar um comando duas vezes

Desejo fazer uma lista enumerada com números coloridos. A maneira que encontrei foi renovar o comando \labelenumi usado pelo ambiente enumerado para rotular itens. No entanto, quero poder voltar ao padrão e conseguir tudo usando este trecho de código com a ajuda do pacote CircledSteps.

\newcommand{\colorlabel}{
    \let\oldlabelenumi\labelenumi
    \renewcommand{\labelenumi}{
    \Circled[inner color=white,fill color=mycolor,outer color=mycolor]{\textsf{\arabic{enumi}}}
    }
}
\newcommand{\defaultlabel}{
    \renewcommand{\labelenumi}{\oldlabelenumi}
}

O problema é que na primeira vez que uso \colorlabel e \defaultlabel funciona. Na segunda vez que mudo para rótulos coloridos, ele também funciona, mas voltar ao padrão novamente não funciona (se usado dentro do grupo enumerado \defaultlabel não faz nada e, se usado fora, faz com que o código não seja compilado). Posso consertar rotulando manualmente tudo que não está colorido e nunca voltando ao padrão, mas gostaria de evitar essa solução.

Editar:

Aqui está uma versão compilável do código. Se você descomentar a última parte, o código não será compilado.

\documentclass[a4paper,11 pt]{article}
\usepackage{enumitem}
\usepackage{xcolor}
\usepackage{circledsteps}
\newcommand{\colorlabel}{
    \let\oldlabelenumi\labelenumi
    \renewcommand{\labelenumi}{
    \Circled[inner color=white,fill color=mycolor,outer color=mycolor]{\textsf{\arabic{enumi}}}
    }
}
\newcommand{\defaultlabel}{
    \renewcommand{\labelenumi}{\oldlabelenumi}
}

\begin{document}

\definecolor{hardex}{RGB}{204,51,0}
\definecolor{mediumex}{RGB}{204,153,0}
\definecolor{easyex}{RGB}{0,153,51}
\colorlet{mycolor}{easyex}
\newcommand{\ritem}{\colorlet{mycolor}{hardex} \item}
\newcommand{\yitem}{\colorlet{mycolor}{mediumex} \item}
\newcommand{\gitem}{\colorlet{mycolor}{easyex} \item}

\colorlabel
\begin{enumerate}
    \gitem green
    \yitem yellow
    \ritem red
    \item red again
\end{enumerate}
\defaultlabel

\begin{enumerate}
    \item one
    \item two
\end{enumerate}

\colorlabel
\begin{enumerate}
    \gitem green
\end{enumerate}
\defaultlabel

%\begin{enumerate}
%    \item ?
%\end{enumerate}

\end{document}

Responder1

Você precisa inicializar \oldlabelenumi, caso contrário, uma inicial ausente \colorlabelproduzirá o erro.

\documentclass[a4paper,11 pt]{article}
\usepackage{enumitem}
\usepackage{xcolor}
\usepackage{circledsteps}

\let\oldlabelenumi\labelenumi
\newcommand{\colorlabel}{%
  \renewcommand{\labelenumi}{%
    \Circled[inner color=white,fill color=mycolor,outer color=mycolor]{\textsf{\arabic{enumi}}}
  }%
}
\newcommand{\defaultlabel}{%
  \let\labelenumi\oldlabelenumi
}

\definecolor{hardex}{RGB}{204,51,0}
\definecolor{mediumex}{RGB}{204,153,0}
\definecolor{easyex}{RGB}{0,153,51}
\colorlet{mycolor}{easyex}

\newcommand{\ritem}{\colorlet{mycolor}{hardex} \item}
\newcommand{\yitem}{\colorlet{mycolor}{mediumex} \item}
\newcommand{\gitem}{\colorlet{mycolor}{easyex} \item}

\begin{document}

\colorlabel
\begin{enumerate}
    \gitem green
    \yitem yellow
    \ritem red
    \item red again
\end{enumerate}
\defaultlabel

\begin{enumerate}
    \item one
    \item two
\end{enumerate}

\colorlabel
\begin{enumerate}
    \gitem green
\end{enumerate}
\defaultlabel

\begin{enumerate}
    \item one
    \item two
\end{enumerate}

\end{document}

Por outro lado, prefiro uma estratégia diferente, ou seja, definir um colorenumerateambiente.

\documentclass[a4paper,11 pt]{article}
\usepackage{enumitem}
\usepackage{xcolor}
\usepackage{circledsteps}

\newenvironment{colorenumerate}[1][]{%
  \begin{enumerate}[#1]
  \renewcommand{\labelenumi}{%
    \Circled[inner color=white,fill color=mycolor,outer color=mycolor]{\textsf{\arabic{enumi}}}
  }%
}{\end{enumerate}}

\definecolor{hardex}{RGB}{204,51,0}
\definecolor{mediumex}{RGB}{204,153,0}
\definecolor{easyex}{RGB}{0,153,51}
\colorlet{mycolor}{easyex}

\newcommand{\ritem}{\colorlet{mycolor}{hardex}\item}
\newcommand{\yitem}{\colorlet{mycolor}{mediumex}\item}
\newcommand{\gitem}{\colorlet{mycolor}{easyex}\item}

\begin{document}

\begin{colorenumerate}
  \gitem green
  \yitem yellow
  \ritem red
  \item red again
\end{colorenumerate}

\begin{enumerate}
  \item one
  \item two
\end{enumerate}

\begin{colorenumerate}
  \gitem green
\end{colorenumerate}

\begin{enumerate}
  \item one
  \item two
\end{enumerate}

\end{document}

insira a descrição da imagem aqui

informação relacionada