![关于 clist 函数和 tabular (LaTeX3) 的一个问题](https://linux22.com/image/460774/%E5%85%B3%E4%BA%8E%20clist%20%E5%87%BD%E6%95%B0%E5%92%8C%20tabular%20(LaTeX3)%20%E7%9A%84%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98.png)
这是 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}