enumitem 列表中 \item 的可选参数

enumitem 列表中 \item 的可选参数

我正在尝试设置一个列表环境来排版问题集。我希望能够输入以下内容:

\begin{pset}
\item First solution.
\item[2.2] Second solution.
\end{pset}

并得到如下结果:

Problem 1. First solution.
Problem 2 (2.2). Second solution

\item如果存在可选参数,则将其排版在括号中。我想我应该能够以\renewcommand{\makelabel}某种方式做到这一点,但我不知道该怎么做。我无法让下面的任何内容工作:

\newcommand{\makepsetlabel}[1]{some if/then involving #1, checking if empty}
\newlist{pset}{enumerate}{1}
\setlist[pset]{
   before={\renewcommand\makelabel[1]{\makepsetlabel{##1}}
}

什么才是正确的方法?

答案1

我会使用不同的命令来代替\item

\documentclass{article}
\usepackage{enumitem}

\newlist{pset}{enumerate}{1}
\setlist[pset]{
  label=Problem \arabic*\protect\thispitem,
  ref=\arabic*,
  align=left
}
\newcommand{\pitem}[1][]{%
  \if\relax\detokenize{#1}\relax
    \def\thispitem{.}%
  \else
    \def\thispitem{ (#1).}%
  \fi
  \item}

\begin{document}

\begin{pset}
\pitem First
\pitem[2.2] Second
\end{pset}

\end{document}

在标签中我添加了一个命令\thispitem\protect因此enumitem在设置环境时不会解释它)。

然后\pitem检查可选参数是否存在并采取相应措施:如果没有指定,则只打印句点,否则打印空格、括号内的参数和句点。

在此处输入图片描述

答案2

一种可能性是使用您自己的命令来获取可选参数,这样就\item看不到它了。

\documentclass{article}
\newcommand\myitem[1][\relax]{\item\ifx#1\relax\else(#1)\fi}
\begin{document}
\begin{itemize}
\myitem abc
\myitem[2.1] def
\end{itemize}
\end{document}

相关内容