对 \seq_map_inline 中第一项和最后一项进行特殊处理

对 \seq_map_inline 中第一项和最后一项进行特殊处理

对序列的第一项和最后一项进行特殊处理是很常见的。我想知道在 中处理这些情况的最佳方法是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}

在此处输入图片描述

相关内容