这个问题和上一个问题密切相关:
Steven B. Segletes 提出的解决方案在仅要求第二级项目遵守规定的顺序时非常有效。Steven 本人告诉我们:
“prenumerate 环境可以嵌入到 enumerate 内部,但不能与其他 prenumerate 嵌套。”
那么,当一个人想要
示例集 1。
(a)示例集1-a);
(b)示例集1-b);
(c)示例集1-c);
(d)示例集 1-d)。
示例集 2。
(a)示例集2-a);
(b)示例集2-b);
(c)示例集2-c);
(d)示例集 2-d)。
以下规则(作为示例):
2B,2C,2A,2D,1C,1D,1A,1B,
这将产生以下输出:
示例集 2。
(a)示例集2-b);
(b)示例集2-c);
(c)示例集2-a);
(d)示例集 2-d)。
示例集 1。
(a)示例集1-c);
(b)示例集1-d);
(c)示例集1-a);
(d)示例集 1-b)。
提前致谢,
保罗
答案1
先前的答案(OP 引用)可以在语法上略有变化的情况下使用。也就是说,内部的prenumerate
s 需要包含在它们自己的组中。
我还添加了一个可选参数来prenumerate
抑制尾随的自动标点符号,因为内部标点符号prenumerate
会自行落在后续行上。
\documentclass{article}
\usepackage{listofitems,environ}
\NewEnviron{prenumerate}[2][\relax]{%
\ignoreemptyitems
\setsepchar{,}%
\readlist\listorder{#2}%
\setsepchar{\item||\par\item}%
\expandafter\readlist\expandafter
\prenumlist\expandafter{\expandafter\item\expandafter\relax\BODY}%
\begin{enumerate}
\foreachitem\x\in\listorder[]{%
\expandafter\expandafter\expandafter\item
\prenumlist[\the\numexpr\x+1\relax]%
\ifx\relax#1\relax\ifnum\xcnt=\listlen\listorder[]\relax.\else;\fi\fi%
}%
\end{enumerate}
}
\begin{document}
\newcommand\preordB{3,1,4,2}
To nest prenumerate environments, group the inner environments.
Also, optional argument provided to suppress trailing auto-punctuation.
\begin{prenumerate}[x]{2,1}
\item Examples.
{\begin{prenumerate}{4,3,1,2}
\item Example 1
\item Example 2
\item Example 3
\item Example 4
\end{prenumerate}}
\item Examples ordered differently.
{\begin{prenumerate}{\preordB}
\item Example 1
\item Example 2
\item[$\bullet$] Example 3
\item Example 4
\end{prenumerate}}
\end{prenumerate}
\end{document}
补充
用户 PaulSmith 询问是否prenumerate
可以使用延迟输出重新处理环境;即保存以供以后使用。对于很多\expandafter
s,答案是肯定的。
我给这个环境命名renumerate
,它需要一个额外的强制参数,一个用于存储内部列表数据的唯一宏名称。例如,这里我提供了名称\z
:
\begin{renumerate}[x]{2,1}{\z}
\item The first
\item the second
\end{renumerate}
稍后,当需要该列表时,需要使用宏来调用它\zlist
,本质上是将单词添加list
到提供的唯一宏名称的末尾。
在 MWE 中,我使用普通的prenumerate
。然后我创建 2 renumerate
,然后先显示第二个,然后再显示第一个(使用 的resume
键enumitem
)。
\documentclass{article}
\usepackage{listofitems,environ,enumitem}
\NewEnviron{prenumerate}[2][\relax]{%
\ignoreemptyitems
\setsepchar{,}%
\readlist\listorder{#2}%
\setsepchar{\item||\par\item}%
\expandafter\readlist\expandafter
\prenumlist\expandafter{\expandafter\item\expandafter\relax\BODY}%
\begin{enumerate}
\foreachitem\x\in\listorder[]{%
\expandafter\expandafter\expandafter\item
\prenumlist[\the\numexpr\x+1\relax]%
\ifx\relax#1\relax\ifnum\xcnt=\listlen\listorder[]\relax.\else;\fi\fi%
}%
\end{enumerate}
}
\makeatletter
\NewEnviron{renumerate}[3][\relax]{%
\edef\tmp{\expandafter\@gobble\string#3}%
\ignoreemptyitems
\setsepchar{,}%
\greadlist#3{#2}%
\setsepchar{\item||\par\item}%
\expandafter\greadlist\csname prenum\tmp\expandafter
\endcsname\expandafter{\expandafter\item\expandafter\relax\BODY}%
\def\tempA{\begin{enumerate}\foreachitem\x\in#3[]}%
\def\tempB{\expandafter\expandafter\expandafter\item}%
\def\tempC{\csname prenum}%
\expandafter\gdef\csname \tmp list\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
\endcsname\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter{%
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\tempA\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter{\expandafter
\expandafter\expandafter\tempB\expandafter
\tempC\tmp[\the\numexpr\x+1\relax]\endcsname%
\ifx\relax#1\relax\ifnum\xcnt=\listlen#3[]\relax.\else;\fi\fi%
}%
\end{enumerate}
}%
}
\makeatother
\begin{document}
Here is one that is not deferred:
\newcommand\preordB{3,1,4,2}
To nest prenumerate environments, group the inner environments.
Also, optional argument provided to suppress trailing auto-punctuation.
\begin{prenumerate}[x]{2,1}
\item Examples.
{\begin{prenumerate}{4,3,1,2}
\item Example 1
\item Example 2
\item Example 3
\item Example 4
\end{prenumerate}}
\item Examples ordered differently.
{\begin{prenumerate}{\preordB}
\item Example 1
\item Example 2
\item[$\bullet$] Example 3
\item Example 4
\end{prenumerate}}
\end{prenumerate}
\hrulefill
\begin{renumerate}[x]{2,1}{\z}
\item The first
\item the second
\end{renumerate}
Saved the first renumerate
\hrulefill
\begin{renumerate}[x]{2,1}{\zz}
\item Examples.
{\begin{prenumerate}{4,3,1,2}
\item Example 1
\item Example 2
\item Example 3
\item Example 4
\end{prenumerate}}
\item Examples ordered differently.
{\begin{prenumerate}{\preordB}
\item Example 1
\item Example 2
\item[$\bullet$] Example 3
\item Example 4
\end{prenumerate}}
\end{renumerate}
Saved the second renumerate.
\hrulefill
Now we present the 2nd
\zzlist
Now here is the first:\setlist{resume}
\zlist
\end{document}