请考虑以下示例:
\documentclass{article}
\usepackage{xparse}
\usepackage{longtable}
\usepackage{multirow}
\usepackage{hyperref}
\ExplSyntaxOn
\int_new:N \g__ioiooiioio_args_int
\tl_new:N \g__ioiooiioio_link_name
\NewDocumentCommand{\mymacro}{ m m m } % So the solution should have { m m m }
{
\ioiooiioio_setargs:nnn { #1 } { #2 } { #3 }
\ioiooiioio_print:
}
\seq_new:N \l__ioiooiioio_first_col_seq
\seq_new:N \l__ioiooiioio_second_col_seq
\tl_new:N \l__ioiooiioio_table_body_tl
\int_new:N \l__ioiooiioio_step_int
\cs_new_protected:Npn \ioiooiioio_setargs:nnn #1 #2 #3
{
\seq_set_split:Nnn \l__ioiooiioio_first_col_seq { , } { #1 }
\seq_set_split:Nnn \l__ioiooiioio_second_col_seq { , } { #2 }
\tl_clear:N \l__ioiooiioio_table_body_tl
\tl_gclear:N \g_ioiooiioio_link_name
\int_zero:N \l__ioiooiioio_step_int
\int_gzero:N \g__ioiooiioio_args_int
\tl_gset:Nn \g_ioiooiioio_link_name { #3 }
\int_gset:Nn \g__ioiooiioio_args_int { \seq_count:N \l__ioiooiioio_first_col_seq }
\seq_mapthread_function:NNN
\l__ioiooiioio_first_col_seq
\l__ioiooiioio_second_col_seq
\__ioiooiioio_fill_body:nn
}
\cs_new_protected:Npn \__ioiooiioio_fill_body:nn #1 #2
{
\int_incr:N \l__ioiooiioio_step_int
\tl_put_right:Nn \l__ioiooiioio_table_body_tl { & #1 & #2 & }
\int_compare:nT { \l__ioiooiioio_step_int = 1}
{
\tl_put_right:Nn \l__ioiooiioio_table_body_tl
{
\multirow{ \g__ioiooiioio_args_int }{*}{
\hyperlink { doc.rc.\g_ioiooiioio_link_name } { $ \rightarrow $ }
}
}
}
\int_compare:nTF { \l__ioiooiioio_step_int = \g__ioiooiioio_args_int}
{
\tl_put_right:Nn \l__ioiooiioio_table_body_tl
{ \\ }
}
{
\tl_put_right:Nn \l__ioiooiioio_table_body_tl
{ \\* }
}
}
\cs_new_protected:Npn \ioiooiioio_print:
{
\multirow{ \g__ioiooiioio_args_int }{*}{ \seq_item:Nn \l__ioiooiioio_first_col_seq { 1 } } \l__ioiooiioio_table_body_tl
}
\ExplSyntaxOff
\begin{document}
\begin{longtable}{cccc}
\mymacro{this is a test,this,is a,test}{now its,not a,test,anymore}{stuff}
\\ % for space, not relevant to the question
\\ % for space, not relevant to the question
\multirow{4}{*}{this is a test} & this is a test & now its & \multirow{4}{*}{\hyperlink{doc.rc.stuff}{$\rightarrow$}} \\*
& this & not a & \\*
& is a & test & \\*
& test & anymore & \\
\end{longtable}
\end{document}
我的宏完全模仿了下面表格的部分。但我不想使用所有这些全局变量(它们很丑陋)。如何在不需要全局变量的情况下实现相同的效果?
答案1
我同意大多数人的看法,即你提出问题的方式没有帮助。不过,我还是要说:你不需要全局变量,只需要关心什么时候扩展——扩展控制是 的一大优势expl3
。
您最新代码中的错误与上一次迭代中的错误相同:您在单元格内部扩展,而不是在表格主体的组成点扩展。这能可以通过全局设置变量来解决,但您也可以在适当的时候通过明智地使用 、 和 来扩展它们\tl_put_right:Nx
。\int_use:N
您\exp_not:N
想要的是
\int_compare:nT { \l__ioiooiioio_step_int = \c_one }
{
\tl_put_right:Nx \l__ioiooiioio_table_body_tl
{
\exp_not:N \multirow { \int_use:N \l__ioiooiioio_args_int } { * }
{
\exp_not:N \hyperlink
{ doc.rc. \l__ioiooiioio_link_name_tl }
{ $ \rightarrow $ }
}
}
}
然后,您可以将所有全局设置更改为本地设置。如果您不确定主体中实际包含什么,请\tl_show:N
在战略要点处执行。这将让您看到是否插入了变量或其值(这是您想要的)。
另外,请记住根据变量名称的类型为其赋予正确的后缀:它应该是\l__ioiooiioio_link_name_tl
而不是\l__ioiooiioio_link_name
,因为它是一个标记列表变量。