自定义枚举 \item 编号

自定义枚举 \item 编号

我需要用两个计数器枚举一个嵌套的项目列表,以便连续的项目具有像 1-1、1-2、1-3、1-4、然后 2-1、2-2、2-3、2-7、然后 4-1、4-3、4-5 等的数字。

这两个棘手的部分是我需要能够控制......

  1. 第二个计数器翻转(即在上面的例子中从 1-4 变为 2-1),并且

  2. 其中每个计数器的增量都大于 1(即在上面的例子中,从 2-3 到 2-7,或从 4-1 到 4-3 到 4-5)。

(我的文档是一本书的解决方案手册,该书的问题以这种方式编号,但我还没有针对每个问题的解决方案 - 因此我需要在某些地方跳过数字。但我非常希望避免手动编号\item,因为这会违背的目的enumerate。)

编辑以下是 MWE:

\documentclass[11pt,letterpaper]{article}
\usepackage{enumitem}
\begin{document}
\begin{enumerate}[label=\arabic*--\arabic*]
\item 1--1: This is easy.
\item 1--2: This is mostly easy but there's a twist.
\item 1--3: This is hard.
\item 2--1: This is very hard. % Step "major" number (1-->2).
\item 2--5: This is nearly impossible. % Discontinuous step in "minor" number (1-->5).
\end{enumerate}
\end{document}

这不会产生所需的问题数字,而是 1-1、2-2、3-3 等。

答案1

以下是类似的方法,只不过我将其覆盖,\item以便您可以使用它来更改问题计数器。例如,

\item[3-2]

将设置当前项目编号为,3-2之后\item将产生3-3,,3-4...,直到下一个\item带有可选参数的项目。

我已经使用了枚举项包将代码包装到新problems环境中,这也意味着您可以使用所有常见的enumitem格式等。对于扩展示例,

\begin{problems}[nosep]
  \item bla
  \item bla
  \item bla
  \item[1-8] bla
  \item bla
  \item[2-1] bla
  \item bla
  \item[2-4] bla
  \item bla
  \item[3-2] bla
  \item bla
\end{problems}

将产生

在此处输入图片描述

完整代码如下:

\documentclass{article}
\usepackage{enumitem}

\let\realItem\item
\newcounter{problem}
    \setcounter{problem}{1}
\newcounter{subproblem}[problem]
\renewcommand\thesubproblem{\arabic{problem}-\arabic{subproblem}}

\def\SetProblemCounters#1-#2!!{% extract new problem and subproblem numbers
  \setcounter{problem}{#1}
  \setcounter{subproblem}{\numexpr#2-1\relax}% so that \ref will work properly
}
\newcommand\myItem[1][]{%
   \if\relax\detokenize{#1}\relax\else\SetProblemCounters#1!!\fi%
   \refstepcounter{subproblem}%
   \realItem[\thesubproblem]%
}

\newlist{problems}{enumerate}{1}
\setlist[problems]{before=\let\item\myItem}
\begin{document}

\begin{problems}[nosep]
  \item bla
  \item bla
  \item bla
  \item[1-8] bla
  \item bla
  \item[2-1] bla
  \item bla
  \item[2-4] bla
  \item bla
  \item[3-2] bla
  \item bla
\end{problems}

\end{document}

代码的一些解释

  • 该宏\SetProblemCounters由 定义\def\SetProblemCounters#1-#2!!。这意味着它需要两个参数,其中#1是出现在\SetProblemCounters 和 a之间的内容-,而#2是出现在-和之间的内容!!。如果您尝试在不遵循此语法的情况下使用它,则会导致错误。-!!成为 定义的一部分的唯一原因是为了提供一种简单的方法来提取和 的\SetProblemCounters值。如下所述,这是使用 实现的。(您可以使用任何您想要的来代替,只要您还更改中的。)problemsubproblem\myItem!!!!\myItem
  • before=\let\item\myItem环境内部表示当你在环境内部时\setlist{...},这实际上是宏problemsproblems\item\myItem
  • 根据定义,\myItem它采用一个可选参数,默认情况下为空。该行\if\relax\detokenize{#1}\relax是检查是否#1为空的“标准方法”。当它不为空时,则\myItem“给出” #1!!-\SetProblemCounters特别注意,它添加了两个感叹号!!因此,在环境中problems,如果您输入\item[3-7],则这将变为\myItem[3-7]然后\SetProblemCounters3-7!!。因此,\SetProblemCounters最终等于#13等于#27(如果您\item[2]problems环境中输入,那么您将收到错误,因为\SetProblemCounters期望找到-。)
  • 实际操作\SetProblemCounters是将problem计数器设置为等于#1,将计数器subproblem设置为等于#2-1,这是使用\numexpr\relax指示\numexpr停止的位置)执行的。宏始终使用\myItem增加计数器,结果是和现在将具有预期值。subproblem\refstepcounter{subproblem}\label{...}\ref{...}
  • 最后,该行\let\realItem\item创建了原始命令的“副本” \item。这让我们可以\myItem使用“真实”项,通过\realItem[\thesubproblem],因为当\myItem使用宏时\item 实际上等于 \myItem

答案2

像这样吗?

在此处输入图片描述

使用\stepcounter\refstepcounter来增加outernum;使用\stepcounter\refstepcounter、 或\addtocounter{innernum}{<n>}来增加innernum

\documentclass{article}
%% Define two new counters
\newcounter{outernum}
\newcounter{innernum}[outernum]

%% Create a custom enumerated environment
\usepackage{enumitem}
\newlist{compenum}{enumerate}{1}
\setlist[compenum]{label=\arabic{outernum}-\arabic{innernum}}

%% Modify behavior of \item inside 'compenum' env.
\usepackage{etoolbox}
\AtBeginEnvironment{compenum}{%
  \let\origitem\item
  \renewcommand\item{\refstepcounter{innernum}\origitem}}

\begin{document}

\begin{compenum}
\stepcounter{outernum}
\item bla
\item bla
\item bla
\item bla

\stepcounter{outernum}
\item bla
\item bla
\item bla
\addtocounter{innernum}{3}
\item bla

\stepcounter{outernum}
\stepcounter{outernum}
\item bla
\addtocounter{innernum}{1}
\item bla
\addtocounter{innernum}{1}
\item bla
\end{compenum}

\end{document}

相关内容