[Tex/LaTex] Order items in enumerate environment automatically

#enumeratesorting

I have a list of almost 300 items in an enumerate environment

\documentclass{article}
\begin{document}
\begin{enumerate}
\item This is the second item.
\item This is the third item.
\item This is the first item.
\end{enumerate}
\end{document}

that I want to list in a different order (the third item should be first, the first item should be second, and the second item should be third.) I want the output to look like this:

enter image description here

Is there a way I can pass the argument [3, 1, 2] to some function and have the list typeset in the order automatically instead of doing so manually ? Thank you.

EDIT: I see that we use xpatch to use the old item. However, in my document I have redefined item as follows:

\newcounter{myenumi}
\renewcommand{\themyenumi}{\textbf{Example \thesection.\arabic{myenumi}.}}
\newenvironment{exenumerate}{%
% stuff for beginning of environment goes here
\setlength{\parindent}{0pt}% don't indent paragraphs
\setcounter{myenumi}{0}% restart numbering
\bigskip% skip a line
\renewcommand{\item}{% new definition of item
\par %start a new line
\medskip
\refstepcounter{myenumi}% advance counter
\noindent \makebox[8em][l]{\themyenumi}% print counter to width of 3em, aligned to left
 }% end of definition of item
 }{% at end of environment
 \par% start new paragraph
 \bigskip% skip a line
 \noindent% don't indent new paragraph
 \ignorespacesafterend% ignore spaces after environment
 }

Will Werner's solution still work?

Best Answer

Although LaTeX is not the best language for this sort of thing, here is a potential solution. It uses the pgffor package.

First, we load the pgffor package and define a counter that will keep track of how many items there are in our list.

\usepackage{pgffor}
\newcounter{SortListTotal}

Then, we define a command that will store the list items.

\newcommand{\sortitem}[2]{\expandafter\def\csname SortListItem#1\endcsname{#2}\stepcounter{SortListTotal}}

The first argument of \sortitem is the item's number; the second is the item text.

Now, we define a command to print out the list. This command also resets the counter, ready for a new sorted list.

\newcommand{\printsortlist}{\foreach\currentlistitem in{1,2,...,\value{SortListTotal}}{\item[\currentlistitem]\csname SortListItem\currentlistitem\endcsname}\setcounter{SortListTotal}{0}}

These commands are used as in the following:

\begin{enumerate}
\sortitem{3}{This is the third item.}
\sortitem{4}{This is the fourth item.}
\sortitem{1}{This is the first item.}
\sortitem{2}{This is the second item.}
\printsortlist
\end{enumerate}

Alternatively, if you want to specify the order after storing the items:

\makeatletter
\newcounter{SortListTotal}
\newcommand{\sortitem}[1]{\stepcounter{SortListTotal}\expandafter\def\csname SortItem\arabic{SortListTotal}\endcsname{#1}}
\newcommand{\printsortlist}[1]{\@for\currentitem:=#1\do{\item\csname SortItem\currentitem\endcsname}\setcounter{SortListTotal}{0}}
\makeatother

These commands are used as in the following:

\begin{enumerate}
\sortitem{This is the third item.}
\sortitem{This is the fourth item.}
\sortitem{This is the first item.}
\sortitem{This is the second item.}
\printsortlist{3,4,1,2}
\end{enumerate}
Related Question