随机重新排列表格行,无需触碰标题行

随机重新排列表格行,无需触碰标题行

我如何随机地重新排序表的行(在我的情况下使用 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}

相关内容