扩展 l3 变量以对其进行拆分

扩展 l3 变量以对其进行拆分

我需要扩展变量\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

您想要访问Vtl 变量的值,但还必须注意冒号在范围内\ExplSyntaxOn与正常设置中的不同。

如果你想在冒号处拆分存储在中的内容\l_pmbc_bounds_tl,那么正确的方法是

\seq_set_split:NVV \l_tmpb_seq \c_colon_str \l_pmbc_bounds_tl

注意大括号应该总是当参数类型为NV时可以省略每一个变量应该在其名称中声明其范围(lg或):是无效的名称。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}

相关内容