仅为特定问题附加项目标签

仅为特定问题附加项目标签

以下是 MWE:

\documentclass{article}
\usepackage[shortlabels]{enumitem}
\begin{document}
\begin{enumerate}[label={Q.\arabic*.}]
  \item This is 1
  \item This is 2
  \item This is 3A
  \item This is 3B
  \item This is 4
\end{enumerate}
\end{document}

我如何让标签与商品详情相匹配?那么,它应该是 Q.1.、Q.2.、Q.3.A、Q.3.B、Q.4 等,而不是 Q.1.、Q.2.、...、Q.5. 等?

答案1

如果您不介意半手动处理特殊情况,您可以执行以下操作:

\documentclass{article}
\usepackage[shortlabels]{enumitem}

\newlength{\aw}
\settowidth{\aw}{A}

\begin{document}
\begin{enumerate}[label={Q.\arabic*.\hspace*{\aw}}]
  \item This is 1
  \item This is 2
  \addtocounter{enumi}{1}
  \item[Q.\arabic{enumi}A.] This is 3A
  \item[Q.\arabic{enumi}B.] This is 3B
  \item This is 4
  \item This is 5
\end{enumerate}
\end{document}

在此处输入图片描述

答案2

以下是构建这些列表的半自动化方法。使用下面的代码,您可以使用命令

  \begin{MyList}
    \item This is 1
    \item This is 2
    \item* This is 3A
    \item* This is 3B\label{3B}
    \item This is 4
  \end{MyList}

生成列表:

在此处输入图片描述

因此,只要\item*使用 ,就会在商品编号中添加一个字母,只有当最后一个商品没有星号时,商品编号才会增加。\item[label]如果您愿意,仍然可以使用 来覆盖商品标签,但要注意的是,使用 时可选标签将被忽略\item*[optional label]

以下是完整代码,下面有一些解释:

\documentclass{article}
\usepackage[shortlabels]{enumitem}
\usepackage{xparse}

\let\realItem\item% save \item for use in \repeatingItem
\newif\ifRepeatingItem
\newcounter{repeatLabel}
\renewcommand\therepeatLabel{Q.\arabic{MyListi}\Alph{repeatLabel}.}
\NewDocumentCommand\repeatingItem{ so }{%
  \IfBooleanTF{#1}{%
     \ifRepeatingItem% need to stop enumi from incrementing
     \else\stepcounter{MyListi}\setcounter{repeatLabel}{0}% reset repeat label counter
     \fi%
     \refstepcounter{repeatLabel}% increment counter
     \realItem[\therepeatLabel]% print the label
     \RepeatingItemtrue%
     }{\IfValueTF{#2}{\realItem[#2]}{\realItem}%
     \RepeatingItemfalse%
  }%
}
\newlist{MyList}{enumerate}{1}% assuming no nesting
\setlist[MyList]{
    label=Q.\arabic*.,
    before=\let\item\repeatingItem,
    widest=Q.8A.
}

\begin{document}

  \begin{MyList}
    \item This is 1
    \item This is 2
    \item* This is 3A
    \item* This is 3B\label{3B}
    \item This is 4
  \end{MyList}

\end{document}

我曾经\newlist定义过一个新的enumerate类似列表,我假设它不会嵌套——可以允许嵌套,但这有点复杂。在环境中,MyList命令\item实际上是\repeatingItem,它使用了一些解析magic 来确定何时*使用。由于 的行为\item*会根据前一个项目是否已加星标而有所不同,因此我定义了一个布尔值\ifRepeatingItem来跟踪最后一个项目是否已加星标。除此之外,我们只需增加输出所需的各种计数器即可。

相关内容