两次更新命令时出现问题

两次更新命令时出现问题

我希望制作一个用彩色数字枚举的列表。我发现的方法是更新枚举环境用来标记项目的 \labelenumi 命令。但是,我希望能够切换回默认设置,并且使用这段代码在 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}
}

问题是,我第一次使用 \colorlabel 和 \defaultlabel 时,它们可以正常工作。第二次切换到彩色标签时,它也可以正常工作,但再次恢复默认设置则不行(如果在枚举组内使用,\defaultlabel 不会执行任何操作,如果在外部使用,则会导致代码无法编译)。我可以通过手动标记所有未着色的内容并永远不切换回默认设置来解决这个问题,但我想避免这种解决方案。

编辑:

这是代码的可编译版本。如果您取消注释最后一部分,代码将无法编译。

\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}

答案1

您需要初始化\oldlabelenumi,否则缺少初始值\colorlabel会产生错误。

\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}

另一方面,我更喜欢不同的策略,即定义一个colorenumerate环境。

\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}

在此处输入图片描述

相关内容