Expl3 - 在 Tabularray 中排序并显示序列

Expl3 - 在 Tabularray 中排序并显示序列

我想在tblr环境中打印一个序列。该\sortdata命令接受要排序的整数列表以及一个可选参数来指定如何打印出来。我想&在打印时将其作为序列的分隔符。这在tabular环境中有效,但在 中无效tblr


\documentclass{article}
\usepackage{tabularray}
\ExplSyntaxOn
\seq_clear_new:c{l_data_seq}
\seq_clear_new:c{l_sorted_seq}

\NewExpandableDocumentCommand{\sortdata}{O{,}m}{
  \aljumaily_sort:nn{#1}{#2}
   \seq_use:cn{l_sorted_seq}{#1}
}

\cs_new_protected:Npn \aljumaily_sort:nn #1 #2{
  \seq_gset_split:cnn {l_data_seq}{,}{#2}
    \seq_gset_eq:cc{l_sorted_seq}{l_data_seq}
    \seq_gsort:cn {l_sorted_seq} {
        \int_compare:nNnTF {##1} > {##2}{\sort_return_swapped:}{\sort_return_same:}
    }
}
\cs_generate_variant:Nn \seq_gset_split:Nnn {cnn}
\ExplSyntaxOff

\begin{document}
\begin{tblr}[expand=\expanded]{vlines}
    % \expanded{\sortdata[&]{7, 9, 5, 3}} \\ % Doesn't compile
    % \sortdata[&]{7, 9, 5, 3}            \\ % Doesn't compile
    \expanded{\sortdata[&]{7, 9, 5, 3}}   \\ % Compiles but no output
    \sortdata[,]{7, 9, 5, 3}              \\ % Compiles but cannot place [&]
\end{tblr}

% Works correctly:
\begin{tabular}{|c|c|c|c|}
    \sortdata[ & ]{7, 9, 5, 3} \\
\end{tabular}
\end{document}

答案1

以下将您的数据排序为命名序列,然后以tblr可扩展的方式使用该命名序列:

\documentclass{article}
\usepackage{tabularray}

\ExplSyntaxOn
\NewDocumentCommand{\sortdata}{m m}
  {
    \seq_clear_new:c { l_jumaily_data_ #1 _seq }
    \seq_set_from_clist:cn { l_jumaily_data_ #1 _seq } {#2}
    \seq_sort:cn { l_jumaily_data_ #1 _seq }
      {
        \int_compare:nNnTF {##1} > {##2}
          {\sort_return_swapped:}
          {\sort_return_same:}
      }
  }
\NewExpandableDocumentCommand\usedata{O{,}m}
  { \seq_use:cn { l_jumaily_data_ #2 _seq } {#1} }
\ExplSyntaxOff

\begin{document}
\sortdata{test}{7, 9, 5, 3}
\begin{tblr}[expand=\expanded]{vlines}
  \usedata{test} \\
\end{tblr}
\begin{tblr}[expand=\expanded]{vlines}
  \expanded{\usedata[&]{test}} \\
\end{tblr}

% Works correctly:
\begin{tabular}{|c|c|c|c|}
  \sortdata{test2}{7, 9, 5, 3}\usedata[&]{test2} \\
\end{tabular}
\end{document}

如果您只想要一个函数,那么您需要将一切都做得可扩展。这确实是可能的,但需要在 token-lists 的世界里绕一圈,因为目前没有可扩展的clist-sort(而且序列是完全不可能的,没有可扩展的序列创建器)。

下面实现了这个绕行步骤。您仍然需要使用\expandedin 来触发完整扩展tblr

\documentclass{article}
\usepackage{tabularray}

\ExplSyntaxOn
\NewExpandableDocumentCommand \usesorteddata { O{,} m }
  {
    \exp_not:e
      {
        \__jumaily_output_tl:en
          { \__jumaily_sort:e { \__jumaily_clist_to_tl:n {#2} } }
          {#1}
      }
  }
\cs_new:Npn \__jumaily_sort:n #1
  { \tl_sort:nN {#1} \__jumaily_sort_ascending:nnTF }
\cs_new:Npn \__jumaily_sort_ascending:nnTF #1#2
  { \int_compare:nNnTF {#1} > {#2} \use_ii:nn \use_i:nn }
\cs_new:Npn \__jumaily_clist_to_tl:n #1
  { \clist_map_function:nN {#1} \__jumaily_clist_to_tl_aux:n }
\cs_new:Npn \__jumaily_clist_to_tl_aux:n #1 { { \exp_not:n {#1} } }
\cs_new:Npn \__jumaily_output_tl:nn #1#2
  {
    \tl_if_empty:nF {#1}
      {
        \exp_last_unbraced:Ne \use_none:nn
          { \tl_map_tokens:nn {#1} { \__jumaily_output_tl_aux:nn {#2} } }
      }
  }
\cs_new:Npn \__jumaily_output_tl_aux:nn #1#2
  { \exp_not:n { \exp_not:n {#1} \exp_not:n {#2} } }
\cs_generate_variant:Nn \__jumaily_output_tl:nn { e }
\cs_generate_variant:Nn \__jumaily_sort:n { e }
\ExplSyntaxOff

\begin{document}
\begin{tblr}[expand=\expanded]{vlines}
  \expanded{\usesorteddata[&]{7, 9, 5, 3}} \\
\end{tblr}

% Works correctly:
\begin{tabular}{|c|c|c|c|}
  \usesorteddata[&]{7, 9, 5, 3} \\
\end{tabular}
\end{document}

相关内容