[Tex/LaTex] Optional argument to \item in enumitem list

enumitemlists

I'm trying to set up a list environment for typesetting a problem set. I'd like to be able to input something like the following:

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

and have it come out as:

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

with the optional argument to \item being typeset in parentheses if it's present. I assume I should be able to \renewcommand{\makelabel} somehow, but I can't figure out how to do it. I can't get anything like the following to work:

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

What's the right way?

Best Answer

I would use a different command instead of \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}

In the label I add a command \thispitem (with \protect so enumitem doesn't interpret it when setting up the environment).

Then \pitem examines the presence of an optional argument and acts consequently: if none is specified, it just prints a period, otherwise a space, the parenthesized argument and the period.

enter image description here

Related Question