我如何随机地重新排序表的行(在我的情况下使用 tabu 包)?
例如
\documentclass{article}
\usepackage{tabu}
\begin{document}
\begin{tabu}{XX}
Header & line \\
1 & 2 \\
3 & 4 \\
5 & 6 \\
\end{tabu}
\end{document}
答案1
以下代码将在每次运行时输出随机行(我为此引入了一个新的环境)。
注意:此代码仅适用于 pdfLaTeX 或 LuaLaTeX,因为它使用randint
。
\documentclass{article}
\usepackage{tabu}
\usepackage{environ}
\usepackage{expl3}
\ExplSyntaxOn
\cs_generate_variant:Nn \regex_split:nnN { no }
\cs_generate_variant:Nn \tl_set:Nn { Nx }
\cs_generate_variant:Nn \seq_item:Nn { NV }
\cs_set:Npn \processbody #1 {
\seq_gclear:N \l_tmpa_seq
\regex_split:noN { \c{\\} } { #1 } \l__student_tmp_seq
\seq_remove_all:Nn \l__student_tmp_seq { }
\seq_gpop_left:NN \l__student_tmp_seq \l_tmpa_tl
\tl_use:N \l_tmpa_tl\\
\int_do_while:nn { \seq_count:N \l_tmpa_seq < \seq_count:N \l__student_tmp_seq }
{
\int_set:Nn \l_tmpa_int { \fp_eval:n { randint(\seq_count:N \l__student_tmp_seq) } }
\seq_if_in:NVF \l_tmpa_seq \l_tmpa_int
{
\seq_gput_right:NV \l_tmpa_seq \l_tmpa_int
\seq_item:NV \l__student_tmp_seq \l_tmpa_int \\
}
}
}
\ExplSyntaxOff
\NewEnviron{randtabu}[1]{
\begin{tabu}{#1}
\processbody\BODY
\end{tabu}
}
\begin{document}
\begin{randtabu}{XX}
Header & line \\
1 & 2 \\
3 & 4 \\
5 & 6 \\
\end{randtabu}
\end{document}