我需要用两个计数器枚举一个嵌套的项目列表,以便连续的项目具有像 1-1、1-2、1-3、1-4、然后 2-1、2-2、2-3、2-7、然后 4-1、4-3、4-5 等的数字。
这两个棘手的部分是我需要能够控制......
第二个计数器翻转(即在上面的例子中从 1-4 变为 2-1),并且
其中每个计数器的增量都大于 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
值。如下所述,这是使用 实现的。(您可以使用任何您想要的来代替,只要您还更改中的。)problem
subproblem
\myItem
!!
!!
\myItem
before=\let\item\myItem
环境内部表示当你在环境内部时\setlist{...}
,这实际上是宏problems
problems
\item
\myItem
- 根据定义,
\myItem
它采用一个可选参数,默认情况下为空。该行\if\relax\detokenize{#1}\relax
是检查是否#1
为空的“标准方法”。当它不为空时,则\myItem
“给出”#1!!
-\SetProblemCounters
特别注意,它添加了两个感叹号!!因此,在环境中problems
,如果您输入\item[3-7]
,则这将变为\myItem[3-7]
然后\SetProblemCounters3-7!!
。因此,\SetProblemCounters
最终等于#1
和3
等于#2
。7
(如果您\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}