文本项的随机排序

文本项的随机排序

我想生成随机文本,其中某些特定项目将按随机顺序排序并打印,每次编译时顺序都会有所不同。目的是消除列表构建方式中的任何隐藏偏差。我寻找过现成的软件包或解决方案,但没有找到。

更具体地说,我正在基于类似这样的事情开展工作。

\documentclass[12pt]{article}
\usepackage[a4paper]{geometry}
\newcommand{\tobesorted}{}
\newenvironment{sortingitems}{}{}
\begin{document}
In my farm there are:
\begin{sortingitems}
\tobesorted pigs,
\tobesorted cows,
\tobesorted rabbits,
\tobesorted gnus,
\end{sortingitems}
and they all live in perfect harmony.
\end{document} 

它将以随机顺序打印动物列表,每次编译时顺序都会有所不同。在我的预期应用程序中,我将有几百个短项目需要排序。目前,我不太关心最后一项末尾的标点符号(但我也感兴趣)。

答案1

\seq_shuffle:N您可以使用内核的内置命令来随机排列项目,然后将\seq_map_inline:Nn其映射到您的列表中。

这是一个将所有内容放入单个命令的版本。如果您愿意,您可以让命令只执行改组和映射,然后将该命令插入每个列表环境中。

\documentclass{article}
\ExplSyntaxOn
\seq_new:N \l_denis_shuffle_items_seq
\NewDocumentCommand{\shuffleitems}{m}{
    \seq_set_from_clist:Nn \l_denis_shuffle_items_seq {#1}
    \seq_shuffle:N \l_denis_shuffle_items_seq
    \begin{enumerate}
    \seq_map_inline:Nn \l_denis_shuffle_items_seq {\item ##1}
    \end{enumerate}
} 
\ExplSyntaxOff
\begin{document}
\shuffleitems{pigs, cows,rabbits,gnus}
\end{document}

代码的可能输出

在您的特定用例中,如果您希望枚举项作为逗号分隔列表插入到运行文本中,而不是枚举,则可以使用宏\seq_use:Nnnn来实现。这是一个非常好的宏,它接受一个序列,然后接受 3 个参数,这些参数对应于您想要的介于 2 个、2 个以上和最后 2 个元素之间的元素。

\documentclass{article}
\ExplSyntaxOn
\seq_new:N \l_denis_shuffle_questions_seq
\NewDocumentCommand{\shuffleitems}{m}{
    \seq_set_from_clist:Nn \l_denis_shuffle_questions_seq {#1}
    \seq_shuffle:N \l_denis_shuffle_questions_seq
    \seq_use:Nnnn \l_denis_shuffle_questions_seq {~and~}{,~}{,~and~}
}

\ExplSyntaxOff
\begin{document}
The \shuffleitems{pigs, cows,rabbits,gnus} all live in perfect harmony.
\end{document}

第二个示例的可能输出

答案2

使用 knitr 的方法:

平均能量损失

MWE.Rnw(Rstudio)或MWE.Rtex(Overleaf):

\documentclass{article}
\begin{document}
<<echo=F,>>=
v <- c("pigs","cows","rabbits","gnus")
@
\begin{itemize} 
\item I have \Sexpr{combine_words(sample(v))}
\item You have \Sexpr{combine_words(sample(v))}
\item He has \Sexpr{combine_words(sample(v))}
\item We have  
<<foo, echo=F,results='asis'>>=
cat("\\begin{itemize}\\item ")
cat(sample(v), sep="\n\\item ")
cat("\\end{itemize} ")
@
\item They have  
<<morefoo, echo=F,results='asis'>>=
<<foo>>
@
\end{itemize} 
\end{document}

相关内容