我已经将问题缩小到下一个过于简单的令牌列表(还有更多我事先不知道的令牌)
\tl_set:Nn \l_tmpa_tl { \myFoo \myBar { \myBaz } }
例如
\cs_set:Npn \myFoo { Foo }
\cs_set:Npn \myBar { Bar }
\cs_set:Npn \myBaz { Baz }
我只想扩展\myBar
并且\myBaz
保持 \myFoo 不扩展以\l_tmpa_tl
变成
\myFoo Bar { Baz }
为了扩展\myBar
,我可以使用 的变体\tl_replace_once:Nnn
。这是我的代码片段
\tl_set:Nx \l_tmpb_tl { \myBar }
\cs_generate_variant:Nn \tl_replace_once:Nnn { NnV }
\tl_replace_once:NnV \l_tmpa_tl { \myBar } \l_tmpb_tl
结果实际上是
\myFoo Bar { \myBaz }
\myBaz
但是当它位于组内时,我该如何扩展它呢?
某种深度替换会有所帮助,或者至少是一种{ Baz }
仅从中创建令牌列表的方法\myBaz
。
答案1
考虑到你最后的评论,你可以对初始未扩展的标记进行分组,似乎你只需要考虑三个术语。这显示了
> \l_tmpa_tl=macro:
->{\myFoo \myFoo \myFoo }\myBar {\myBaz }.
l.11 \show\l_tmpa_tl
?
> \l_tmpb_tl=\long macro:
->{\myFoo \myFoo \myFoo }Bar{Baz}.
l.20 \show\l_tmpb_tl
如果你不想将第一个标记分组到最终输出中,你可以使用
\cs_set:Npn\zz_aux:NNn#1#2#3{\exp_not:n{#1}#2{#3}}
但上面的输出是用
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_set:Npn \myFoo { Foo }
\cs_set:Npn \myBar { Bar }
\cs_set:Npn \myBaz { Baz }
\tl_set:Nn \l_tmpa_tl { {\myFoo\myFoo\myFoo} \myBar { \myBaz } }
\show\l_tmpa_tl
\cs_set:Npn\zz_aux:NNn#1#2#3{{\exp_not:n{#1}}#2{#3}}
\cs_set:Npn\zz_expand:NN#1#2{
\cs_set:Npx#2{\exp_after:wN\zz_aux:NNn#1}
}
\zz_expand:NN \l_tmpa_tl \l_tmpb_tl
\show\l_tmpb_tl
\ExplSyntaxOff
\end{document}