我想在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(而且序列是完全不可能的,没有可扩展的序列创建器)。
下面实现了这个绕行步骤。您仍然需要使用\expanded
in 来触发完整扩展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}