由于某种原因,使用变量作为列表项的索引无法检索该项目。但使用数字代替变量却可以。为什么?
\documentclass{standalone}
\usepackage{expl3}
\ExplSyntaxOn
\begin{document}
\clist_new:N\myList
\clist_set:Nn\myList{1,south}
\int_new:N\myCounter
\int_set:Nn\myCounter{1}
\int_do_until:nNnn{\myCounter}={\clist_count:N\myList+1}
{ \regex_set:Nn\myExp{[0-9]+}
% following line doesn't work
%\regex_match:NnT\myExp{\clist_item:Nn\myList{\int_use:N\myCounter}}
% but as soon as we change \int_use:N\myCounter to 1, it works
\regex_match:NnT\myExp{\clist_item:Nn\myList{1}}
{ (is a number) % output
}
\int_incr:N\myCounter
}
\end{document}
答案1
您正在使用正则表达式来文字文本\clist_item:Nn\myList{\int_use:N\myCounter}
,而不是执行结果。如果您使用显式1
,则可行,但如果没有1
当前文本,则不行。
通过扩展来解决这个问题,并且使用标准变量名加上步骤循环(在这里似乎更容易),我会
\documentclass{standalone}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\clist_set:Nn \l_tmpa_clist { 1 , south }
\regex_set:Nn \l_tmpa_regex { [0-9]+ }
\int_step_inline:nn { \clist_count:N \l_tmpa_clist }
{
\exp_args:NNf \regex_match:NnT \l_tmpa_regex
{ \clist_item:Nn \l_tmpa_clist {#1} }
{ (is ~ a ~ number ) }
}
\ExplSyntaxOff
\end{document}
答案2
n
中的参数类型\regex_match:NnT
表明参数是“逐字”传递的,没有处理,但您需要的是该项目,而不是检索它所需的指令。您可以定义一个变体
\prg_generate_conditional_variant:Nnn \regex_match:nn { ne } { T,F,TF }
并使用\regex_match:NeT
,但实际上使用起来更容易,\clist_map_inline:Nn
它可以一次访问 clist 的一个项目:
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\clist_new:N \l_bp_mylist_clist
\clist_set:Nn \l_bp_mylist_clist {1,south}
\clist_map_inline:Nn \l_bp_mylist_clist
{
\regex_match:nnTF { [0-9]+ } { #1 }
{ #1~is~a~number \par }
{ #1~is~not~a~number \par }
}
\ExplSyntaxOff
\end{document}
如果您需要使用产品编号,
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\clist_new:N \l_bp_mylist_clist
\clist_set:Nn \l_bp_mylist_clist {1,south}
\prg_generate_conditional_variant:Nnn \regex_match:nn { ne } { T,F,TF }
\int_step_inline:nn { \clist_count:N \l_bp_mylist_clist }
{
\regex_match:neTF { [0-9]+ } { \clist_item:Nn \l_bp_mylist_clist { #1 } }
{ Item~#1~`\clist_item:Nn \l_bp_mylist_clist { #1 }'~is~a~number \par }
{ Item~#1~`\clist_item:Nn \l_bp_mylist_clist { #1 }'~is~not~a~number \par }
}
\ExplSyntaxOff
\end{document}