为什么我没有得到|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。
更改n
为x
,然后你会得到
> \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
因为我们处于定义中。
如果确实需要,请添加分组。