我怎样才能避免这里对全局变量的需要?

我怎样才能避免这里对全局变量的需要?

请考虑以下示例:

http://i.imgur.com/I8eMFgo.png

\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,因为它是一个标记列表变量。

相关内容