![重新定义 enumitem 中 \item 的可选参数](https://linux22.com/image/304610/%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%20enumitem%20%E4%B8%AD%20%5Citem%20%E7%9A%84%E5%8F%AF%E9%80%89%E5%8F%82%E6%95%B0.png)
我正在使用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@}}
唯一的测试是查看用户是否提供了可选参数。检查此选项的选项位于带有和不带有可选参数的不同命令定义。