假设我有以下文档:
例子。
a)示例1;
b)示例2;
c)示例3;
d)示例4.
在不同版本的文档中,我想要以下内容:
例子。
a)示例4;
b)示例3;
c)示例1;
d)示例2.
(请注意顺序的改变。)
也就是说,在第二个版本的文档中,我想指示 LaTeX 按照 DCAB 顺序写入项目。这可以在不更改第一个文档的枚举代码的情况下实现吗?也就是说,不更改以下代码?
\begin{enumerate}
\item Examples.
\begin{enumerate}
\item Example 1;
\item Example 2;
\item Example 3;
\item Example 4.
\end{enumerate}
\end{enumerate}
提前致谢,
保罗
答案1
从字面上理解 OP(“在我的示例中,规则是:DCAB”),即列表顺序是预先指定的,这是一种listofitems
对预先指定的列表进行排序的方法。请注意,如 MWE 中所示,预先指定的列表可以直接作为环境参数给出,也可以预先存储在宏中,然后由宏代替它传递。
请注意,该方法\item
也可以处理可选参数。
已编辑,允许每个项目中有多个段落,以及tabular
s 等。
我已经按以下方式设置了标点符号...我建议从\item
输入中省略尾随标点符号prenumerate
,然后将其作为输出的一部分插入。
\documentclass{article}
\usepackage{listofitems,environ}
\NewEnviron{prenumerate}[1]{%
\ignoreemptyitems
\setsepchar{,}%
\readlist\listorder{#1}%
\setsepchar{\item||\par\item}%
\expandafter\readlist\expandafter*\expandafter
\prenumlist\expandafter{\expandafter\item\expandafter\relax\BODY}%
\begin{enumerate}
\foreachitem\x\in\listorder[]{%
\expandafter\expandafter\expandafter\item
\prenumlist[\the\numexpr\x+1\relax]%
\ifnum\xcnt=\listlen\listorder[]\relax.\else;\fi%
}%
\end{enumerate}
}
\begin{document}
\newcommand\preordA{4,3,1,2}
\newcommand\preordB{3,1,4,2}
\begin{prenumerate}{\preordA}
\item Example 1
Multiple paragraphs
and another paragraph
\item Example 2
\item Example 3---tabular
\begin{tabular}{|c|c|}
\hline
a & b\\c & d\\\hline
\end{tabular}
\item Example 4
\end{prenumerate}
The prenumerate environment can be embedded inside enumerate, but
not nested with other prenumerates.
\begin{enumerate}
\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{enumerate}
\end{document}