使用 expl3 在宏内搜索单词

使用 expl3 在宏内搜索单词

这个问题的标题指的是一般意义上的单词,但在我的特定情况下,我在先前定义的宏中搜索数字。在该宏中,我只有用空格分隔的数字。我想在内部搜索\teststr存储在计数器中的数字,例如:

\newcounter{testx}
\newcounter{testy}
\def\teststr{ 1 2 3 4 5 9 10 11 30 }
\ExplSyntaxOn
\cs_generate_variant:Nn \seq_set_split:Nnn {NVV}
\cs_new:Npn \test #1#2#3{
 \int_set_eq:NN \l_tmpa_int {#2}
 \seq_set_split:NVV \l_tmpa_seq \l_tmpa_int {#1}
 \int_set:cn {c@#3} {(\seq_count:N \l_tmpa_seq) -1}}
\ExplSyntaxOff

\test应按以下方式调用该宏:

\test{\teststr}{\value{testx}}{testy}

在以下示例中,计数器testy存储数字1。这是预期的行为。

\setcounter{testx}{4}
\test{\teststr}{\value{testx}}{testy}

现在,testy应该包含0其值。它也可以工作:

\setcounter{testx}{6}
\test{\teststr}{\value{testx}}{testy}

但其1行为并不如我所愿:

\setcounter{testx}{1}
\test{\teststr}{\value{testx}}{testy}

它存储4因为\teststr包含四次出现的1,这是正确的,但我想像搜索“单词”那样进行搜索,即在搜索模式之前和之后有空格。

我确实对第二个参数_tl_str变量类型进行了测试,但\seq_set_split没有成功。

任何帮助都将不胜感激。提前致谢。

答案1

您可以使用\regex_count:nnN

\documentclass{article}

\newcounter{testx}
\newcounter{testy}
\def\teststr{ 1 2 3 4 5 9 10 11 30 }

\ExplSyntaxOn

\cs_generate_variant:Nn \regex_count:nnN { nV }
\cs_new_protected:Npn \test #1#2#3
 {
  \tl_set:Nx \l_tmpa_tl { \int_eval:n { #2 } }
  \regex_count:nVN { \b \u{l_tmpa_tl} \b } #1 \l_tmpa_int
  \int_set_eq:cN {c@#3} \l_tmpa_int
 }
\ExplSyntaxOff

\setcounter{testx}{4}
\test{\teststr}{\value{testx}}{testy}
\showthe\value{testy}

\setcounter{testx}{1}
\test{\teststr}{\value{testx}}{testy}
\showthe\value{testy}

\def\teststr{ 1 2 3 4 5 9 10 11 30 1}
\test{\teststr}{\value{testx}}{testy}
\showthe\value{testy}

\stop

在控制台中你得到

> 1.
<recently read> \c@testy

l.20 \showthe\value{testy}

?
> 1.
<recently read> \c@testy

l.24 \showthe\value{testy}

?
> 2.
<recently read> \c@testy

l.28 \showthe\value{testy}

相关内容