我需要扩展变量\pmbc_bounds_tl
来拆分它。我尝试过各种方法,但没有成功。我应该使用exp_args
哪个版本?exp_args
\documentclass{article}
\ExplSyntaxOn
\tl_new:N \pmbc_bounds_tl
\NewDocumentEnvironment{foo}{b}{
\seq_set_split:Nnn \l_tmpa_seq { ; } { #1 }
% \seq_show:N \l_tmpa_seq
\seq_pop_left:NNTF \l_tmpa_seq \pmbc_bounds_tl { } {
BOUNDS ~ PB !
}
% \tl_show:N \pmbc_bounds_tl
% WHICH VERSION TO USE?
\seq_set_split:Nnn \l_tmpb_seq { : } { \pmbc_bounds_tl }
\seq_show:N \l_tmpb_seq
}{}
\ExplSyntaxOff
\begin{document}
TEST.
\begin{foo}
a = b : c ;
d = e : f
\end{foo}
\end{document}
答案1
您想要访问V
tl 变量的值,但还必须注意冒号在范围内\ExplSyntaxOn
与正常设置中的不同。
如果你想在冒号处拆分存储在中的内容\l_pmbc_bounds_tl
,那么正确的方法是
\seq_set_split:NVV \l_tmpb_seq \c_colon_str \l_pmbc_bounds_tl
注意大括号应该总是当参数类型为N
或V
时可以省略每一个变量应该在其名称中声明其范围(l
或g
或):是无效的名称。c
\pmbc_bounds_tl
n
每个在签名中有的函数都可以有一个带有V
替换的变体n
,在这种情况下我们\seq_set_split:Nnn
在变体中使用 but \seq_set_split:NVV
。
此变体是预定义的,但情况并非总是如此。如果 LaTeX 无法定义未定义的变体,最好使用标准方法执行
\cs_generate_variant:Nn
而不是尝试某些\exp_args:...
功能:代码将变得更加清晰,并且性能不会受到显著影响。
在这种情况下,以宏扩展的方式思考并不是正确的方法,因为它更像是“访问值”,而事实上这是通过宏扩展在内部实现的,这并不是什么问题。
答案2
感谢前两条评论,上面给出了解决方案。
\documentclass{article}
\ExplSyntaxOn
\tl_new:N \l_pmbc_bounds_tl
\NewDocumentEnvironment{foo}{b}{
\seq_set_split:Nnn \l_tmpa_seq { ; } { #1 }
% \seq_show:N \l_tmpa_seq
\seq_pop_left:NNTF \l_tmpa_seq \l_pmbc_bounds_tl { } {
BOUNDS ~ PB !
}
% \tl_show:N \l_pmbc_bounds_tl
\seq_set_split:NVV \l_tmpb_seq \c_colon_str \l_pmbc_bounds_tl
\seq_show:N \l_tmpb_seq
}{}
\ExplSyntaxOff
\begin{document}
TEST.
\begin{foo}
a = b : c ;
d = e : f
\end{foo}
\end{document}