关于 clist 函数和 tabular (LaTeX3) 的一个问题

关于 clist 函数和 tabular (LaTeX3) 的一个问题

这是 MWE。

\documentclass{article}

\usepackage{expl3}

\begin{document}
\ExplSyntaxOn
\clist_new:N \l_my_clist
\clist_new:N \l_my_tmp_clist
\clist_set:Nn \l_my_clist { x, y }
\begin{tabular}{cc}
  \clist_map_inline:Nn \l_my_clist
    { 
      \clist_set:Nn \l_my_tmp_clist { #1 }
      a & \clist_item:Nn \l_my_tmp_clist { 1 } \\
    }
\end{tabular}
\ExplSyntaxOff
\end{document}

输出:

在此处输入图片描述

我的问题是:为什么 LaTeX 输出像

a &  \\
a &  \\

代替

a & x \\
a & y \\

答案1

\clist_map_inline:Nn是一个不可扩展函数,这意味着它不能在 x 类型参数内扩展。更准确地说,上述情况可以等效地看作是将tabular环境中的所有内容以不变的方式打包到 tokenlist 中。当此 tokenlist 的内容被分成单个单元格时,我们可以看到,分配变量和提取值的命令在本地执行,从而访问\clist_item:Nn初始的空 clist。

我们可以做一个小测试来验证这一点。

\documentclass{article}
\begin{document}
\ExplSyntaxOn
\clist_new:N \l_my_clist
\clist_new:N \l_my_tmp_clist
\clist_set:Nn \l_my_clist { x, y }
\exp_args:Nx \tl_show:n
  {
    \clist_map_inline:Nn \l_my_clist
      { 
        \clist_set:Nn \l_my_tmp_clist { ##1 }
        a & \clist_item:Nn \l_my_tmp_clist { 1 } \\
      }
  }
\end{document}

我想出两种方法来解决这个问题。更简单的方法是\clist_set:Nn用其全局对应项替换。

\documentclass{article}
\begin{document}
\ExplSyntaxOn
\clist_new:N \l_my_clist
\clist_new:N \l_my_tmp_clist
\clist_set:Nn \l_my_clist { x, y }
\begin{tabular}{cc}
  \clist_map_inline:Nn \l_my_clist
    { 
      \clist_gset:Nn \l_my_tmp_clist { #1 }
      a & \clist_item:Nn \l_my_tmp_clist { 1 } \\
    }
\end{tabular}
\end{document}

第二种方法是预先将变量扩展为其实际值。


\documentclass{article}
\begin{document}
\ExplSyntaxOn
\clist_new:N \l_my_clist
\clist_new:N \l_my_tmp_clist
\clist_set:Nn \l_my_clist { x, y }

\tl_clear:N \l_tmpa_tl
\clist_map_inline:Nn \l_my_clist
  { 
    \clist_set:Nn \l_my_tmp_clist { #1 }
    \tl_put_right:Nx \l_tmpa_tl
      { a & \clist_item:Nn \l_my_tmp_clist { 1 } \\ }
  }
% \tl_show:N \l_tmpa_tl

\begin{tabular}{cc}
  \l_tmpa_tl
\end{tabular}
\end{document}

相关内容