如何控制设置变量的范围

如何控制设置变量的范围

为什么我没有得到|col. 1|col. 2| ... etc?显然我没有控制正确设置变量的范围\l_rn_i_int,但无法确定我哪里出错了。

\documentclass{article}
% RN. 19 November 2017
%=======================
\usepackage[check-declarations]{expl3}
\usepackage{xparse}
\usepackage[T1]{fontenc}
%-----------------------
\ExplSyntaxOn
\int_new:N \l_rn_i_int  %  local, for looping

\tl_new:N \fr_rn_buildVariable_tl
\cs_new:Npn \rn_buildVariable_fr:n #1
%  PARAMETER:  #1 the number of entries per row  
%  RETURNS: \fr_rn_buildVariable_tl
  {
\group_begin:
  \tl_gclear:N \fr_rn_buildVariable_tl
  \tl_gput_right:Nx \fr_rn_buildVariable_tl {|}
  \int_set:Nn \l_rn_i_int {1}
  \int_until_do:nNnn {\l_rn_i_int} > {#1}
    {
      \int_use:N \l_rn_i_int\\
      \tl_gput_right:Nn ~\fr_rn_buildVariable_tl {col.~\int_use:N \l_rn_i_int |}
      \int_incr:N \l_rn_i_int
    }
\group_end:
  }  %  \rn_buildVariable_fr:n

\NewDocumentCommand\myTLVariable{O{5}}
%  PARAMETER:  #1 nr of items in \tl_ variable
  {
\group_begin:
  MWE\\
  \rn_buildVariable_fr:n {#1}
  \fr_rn_buildVariable_tl
\group_end:
  }  %  \myTLVariable
\ExplSyntaxOff
%-----------------------
\begin{document}
  \myTLVariable
  \myTLVariable[8]
\end{document}

答案1

如果你添加

\tl_show:N \fr_rn_buildVariable_tl

你看

> \fr_rn_buildVariable_tl=macro:
->|col. \int_use:N \l_rn_i_int |col. \int_use:N \l_rn_i_int |col. \int_use:N \l
_rn_i_int |col. \int_use:N \l_rn_i_int |col. \int_use:N \l_rn_i_int |.
\rn_buildVariable_fr:n ...\fr_rn_buildVariable_tl 

因此,尽管您正在建立列表,但您只是输入了多个引用,\l_rn_i_int当您使用它们时,它们都会给出 0。

更改nx,然后你会得到

> \fr_rn_buildVariable_tl=macro:
->|col. 1|col. 2|col. 3|col. 4|col. 5|.

所以

\documentclass{article}
% RN. 19 November 2017
%=======================
\usepackage[check-declarations]{expl3}
\usepackage{xparse}
\usepackage[T1]{fontenc}
%-----------------------
\ExplSyntaxOn
\int_new:N \l_rn_i_int  %  local, for looping

\tl_new:N \fr_rn_buildVariable_tl
\cs_new:Npn \rn_buildVariable_fr:n #1
%  PARAMETER:  #1 the number of entries per row  
%  RETURNS: \fr_rn_buildVariable_tl
  {
\group_begin:
  \tl_gclear:N \fr_rn_buildVariable_tl
  \tl_gput_right:Nx \fr_rn_buildVariable_tl {|}
  \int_set:Nn \l_rn_i_int {1}
  \int_until_do:nNnn {\l_rn_i_int} > {#1}
    {
      \int_use:N \l_rn_i_int\\
      \tl_gput_right:Nx \fr_rn_buildVariable_tl {col.~\int_use:N \l_rn_i_int |}
      \int_incr:N \l_rn_i_int
    }
\tl_show:N \fr_rn_buildVariable_tl
\group_end:
  }  %  \rn_buildVariable_fr:n

\NewDocumentCommand\myTLVariable{O{5}}
%  PARAMETER:  #1 nr of items in \tl_ variable
  {
\group_begin:
  MWE\\
  \rn_buildVariable_fr:n {#1}
  \fr_rn_buildVariable_tl
\group_end:
  }  %  \myTLVariable
\ExplSyntaxOff
%-----------------------
\begin{document}
  \myTLVariable
  \myTLVariable[8]
\end{document}

答案2

你用

\tl_gput_right:Nx \fr_rn_buildVariable_tl {|}

什么x都不做,但是

\tl_gput_right:Nn ~\fr_rn_buildVariable_tl {col.~\int_use:N \l_rn_i_int |}

何时应使用\tl_gput_right:Nx来展开\int_use:N。应删除~后面的\tl_gput_right:Nn( 或)。\tl_gput_right:Nx

该前缀\fr不在变量的推荐前缀中:\l\g\c(局部、全局或常量)。

目前还不清楚为什么您要使用 in\rn_buildVariable_fr:n和 in双重分组\myTLVariable。此外,您使用的循环可以简化为\int_step_inline:nnnn

\documentclass{article}
% RN. 19 November 2017
%=======================
\usepackage[check-declarations]{expl3}
\usepackage{xparse}
\usepackage[T1]{fontenc}

\ExplSyntaxOn

\tl_new:N \l_rn_buildVariable_tl

\cs_new:Npn \rn_buildVariable_fr:n #1
 {
  %  PARAMETER:  #1 the number of entries per row  
  %  RETURNS: \fr_rn_buildVariable_tl
  \tl_clear:N \l_rn_buildVariable_tl
  \tl_put_right:Nn \l_rn_buildVariable_tl {|}
  \int_step_inline:nnnn { 1 } { 1 } { #1 }
   {
    ##1 \\
    \tl_put_right:Nn \l_rn_buildVariable_tl {col.~##1|}
   }
 }  %  \rn_buildVariable_fr:n

\NewDocumentCommand\myTLVariable{O{5}}
 {
  %  PARAMETER:  #1 nr of items in \tl_ variable
  MWE\\
  \rn_buildVariable_fr:n {#1}
  \tl_use:N \l_rn_buildVariable_tl
 }

\ExplSyntaxOff

\begin{document}

\myTLVariable

\myTLVariable[8]

\end{document}

在循环中隐式变量的当前值的第四个参数\int_step_inline:nnnn可用作#1,这里变成##1因为我们处于定义中。

如果确实需要,请添加分组。

在此处输入图片描述

相关内容