为什么使用变量作为列表项的索引不能通过 \clist_item:Nn 检索该项目?

为什么使用变量作为列表项的索引不能通过 \clist_item:Nn 检索该项目?

由于某种原因,使用变量作为列表项的索引无法检索该项目。但使用数字代替变量却可以。为什么?

\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}

在此处输入图片描述

相关内容