重新定义 enumitem 中 \item 的可选参数

重新定义 enumitem 中 \item 的可选参数

我正在使用enumitem包,我想重新定义命令的可选参数\item。默认情况下,可选参数接受文本来替换默认标签。我从未使用过此选项。相反,我希望可选参数接受一个数字,比如 10,然后以 (10 点) 的形式打印在项目段落的开头。标签本身不受影响,仍然会注册标签计数器。我知道此行为是由 实现的Exam Document Class,但我更喜欢通过 自定义我自己的列表enumitem。提前致谢。

答案1

您可以使用以下实现:

在此处输入图片描述

\documentclass{article}

\usepackage{enumitem,xparse}

\makeatletter
% enumitem-related constructions
\newlist{pointslist@}{enumerate}{1}
\setlist[pointslist@]{label=\arabic*.,ref=\arabic*}
% Create list emulator
\newenvironment{pointslist}[1][]
  {\begin{pointslist@}[#1]% \begin{pointslist}[<opts>]
     \let\olditem\item% Store \item in \olditem
     \RenewDocumentCommand{\item}{o}{% Redefine \item to
       \olditem\leavevmode% ... call \olditem...
       \IfNoValueF{##1}{(##1~points)}% ...and possibly (.. points)
     }}
  {\end{pointslist@}}% \end{pointslist}
\makeatother

\begin{document}

\begin{pointslist}
  \item This is some item
  \item[10] This is item is worth something
  \item Just another item
\end{pointslist}

\end{document}

原则上,我们创建一个enumitem-定义列表 - pointslist@- 并相应地设置所有内容。然后我们创建一个新的环境这将模拟列表,只需重新定义\item即可满足您的需要。

的重新定义\item是这样的,它总是在检查您是否提供了可选参数之前设置原始的\item\olditem在重新定义中)。如果指定了可选参数,它会设置相应的消息。


一个基本的 LaTeX2e 实现xparse命令重新定义可能类似于

\newenvironment{pointslist}[1][]
  {\begin{pointslist@}[#1]%
     \let\olditem\item
     \renewcommand{\item}[1][\relax]{%
       \olditem\leavevmode
       \ifx\relax##1\relax\else(##1~points)\fi%
     }}
  {\end{pointslist@}}

唯一的测试是查看用户是否提供了可选参数。检查此选项的选项位于带有和不带有可选参数的不同命令定义

相关内容