我想生成随机文本,其中某些特定项目将按随机顺序排序并打印,每次编译时顺序都会有所不同。目的是消除列表构建方式中的任何隐藏偏差。我寻找过现成的软件包或解决方案,但没有找到。
更具体地说,我正在基于类似这样的事情开展工作。
\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}