更新指令兩次時出現問題

更新指令兩次時出現問題

我希望製作一個用彩色數字列舉的清單。我發現的方法是更新枚舉環境使用的 \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}

在此輸入影像描述

相關內容