对序列的第一项和最后一项进行特殊处理是很常见的。我想知道在 中处理这些情况的最佳方法是expl3
什么\seq_map_inline
。
例如,假设我想创建以下表格(ASCII 艺术):
Words foo
---
bar
---
baz
其中单词“foo”、“bar”、“baz”是序列的项。这可以按以下方式完成:
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\seq_new:N \l_my_sequence_seq
\seq_set_from_clist:Nn \l_my_sequence_seq {foo,bar,baz}
\begin{tabular}{ll}
\seq_map_inline:Nn \l_my_sequence_seq {
\int_gincr:N \g_tmpa_int
\int_compare:nNnT {\g_tmpa_int}={1}{Words}
& #1
\int_compare:nNnF {\g_tmpa_int}={\seq_count:N \l_my_sequence_seq}{\\\cline{2-2}}
}
\end{tabular}
\ExplSyntaxOff
\end{document}
但我想知道是否有更好的方法来实现相同的结果。
答案1
我建议删除该项目的测试1st
,然后从临时列表中弹出该项目\seq_map_function:NN
。
弹出发生在组内部,因此\l_tmpa_seq
在映射循环中不会受到太大影响。
请注意,\bitouze_map_function:n
需要一个参数(实际上是当前的\seq_item
,但这里根本没有使用这个参数!)
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\seq_new:N \l_my_sequence_seq
\seq_set_from_clist:Nn \l_my_sequence_seq {foo,bar,baz}
\begin{tabular}{ll}
\seq_map_inline:Nn \l_my_sequence_seq {
\int_gincr:N \g_tmpa_int
\int_compare:nNnT {\g_tmpa_int}={1}{Words}
& #1
\int_compare:nNnF {\g_tmpa_int}={\seq_count:N \l_my_sequence_seq}{\\\cline{2-2}}
}
\end{tabular}
\seq_set_eq:NN \l_tmpa_seq \l_my_sequence_seq
\cs_new:Nn \bitouze_map_function:n {
&\seq_gpop_left:NN \l_tmpa_seq \l_tmpa_tl
\tl_use:N \l_tmpa_tl \tabularnewline
\seq_if_empty:NTF \l_tmpa_seq{% False branch
\cline{2-2}
}
}
\begin{tabular}{ll}
Words
\seq_map_function:NN \l_tmpa_seq \bitouze_map_function:n
\end{tabular}
\ExplSyntaxOff
\end{document}
答案2
我猜您想分离序列的最后一个元素:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_db_wordlist_seq
\tl_new:N \l_db_wordlist_last_tl
\NewDocumentCommand{\wordlist}{m}
{
\seq_set_from_clist:Nn \l_db_wordlist_seq { #1 }
\seq_pop_right:NN \l_db_wordlist_seq \l_db_wordlist_last_tl
\begin{tabular}{ll}
Words \seq_map_function:NN \l_db_wordlist_seq \__db_wordlist_do:n
& \l_db_wordlist_last_tl
\end{tabular}
}
\cs_new_protected:Nn \__db_wordlist_do:n { & #1 \\ \cline{2-2} }
\ExplSyntaxOff
\begin{document}
\wordlist{foo,bar,baz}
\end{document}