我正在尝试设置一个列表环境来排版问题集。我希望能够输入以下内容:
\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}