这个问题的标题指的是一般意义上的单词,但在我的特定情况下,我在先前定义的宏中搜索数字。在该宏中,我只有用空格分隔的数字。我想在内部搜索\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}