如何将第一级枚举项和第二级枚举项按照规定的顺序排列?

如何将第一级枚举项和第二级枚举项按照规定的顺序排列?

这个问题和上一个问题密切相关:

如何按规定的顺序排列第二级枚举的项目

Steven B. Segletes 提出的解决方案在仅要求第二级项目遵守规定的顺序时非常有效。Steven 本人告诉我们:

“prenumerate 环境可以嵌入到 enumerate 内部,但不能与其他 prenumerate 嵌套。”

那么,当一个人想要

  1. 示例集 1。

    (a)示例集1-a);

    (b)示例集1-b);

    (c)示例集1-c);

    (d)示例集 1-d)。

  2. 示例集 2。

    (a)示例集2-a);

    (b)示例集2-b);

    (c)示例集2-c);

    (d)示例集 2-d)。

以下规则(作为示例):

2B,2C,2A,2D,1C,1D,1A,1B,

这将产生以下输出:

  1. 示例集 2。

    (a)示例集2-b);

    (b)示例集2-c);

    (c)示例集2-a);

    (d)示例集 2-d)。

  2. 示例集 1。

    (a)示例集1-c);

    (b)示例集1-d);

    (c)示例集1-a);

    (d)示例集 1-b)。

提前致谢,

保罗

答案1

先前的答案(OP 引用)可以在语法上略有变化的情况下使用。也就是说,内部的prenumerates 需要包含在它们自己的组中。

我还添加了一个可选参数来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可以使用延迟输出重新处理环境;即保存以供以后使用。对于很多\expandafters,答案是肯定的。

我给这个环境命名renumerate,它需要一个额外的强制参数,一个用于存储内部列表数据的唯一宏名称。例如,这里我提供了名称\z

\begin{renumerate}[x]{2,1}{\z}
\item The first

\item the second
\end{renumerate}

稍后,当需要该列表时,需要使用宏来调用它\zlist,本质上是将单词添加list到提供的唯一宏名称的末尾。

在 MWE 中,我使用普通的prenumerate。然后我创建 2 renumerate,然后先显示第二个,然后再显示第一个(使用 的resumeenumitem)。

\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}

在此处输入图片描述

相关内容