假设有两个定义
\seq_new:N \l_input_seq % declare a list (seq) variable
由 2 个宏共享\NewDocumentCommand
。有没有办法检查是否\l_input_seq
已经定义?类似的东西\seq_provide:N
?到目前为止,我只发现\cs_if_exist:NTF
和
\cs_if_exist:NTF \l_input_seq { } { \seq_new:N \l_input_seq }
正是我所需要的。
更新:在我的特定情况下,我可以使用两次
\seq_new:N
来定义两个不同的变量,例如\l_input_seq_one
和\l_input_seq_two
。我在发布这个问题时只是很好奇;)说实话,我不喜欢在只需要一个时间变量时引入大量时间变量。
答案1
实际上并非处于代码级别,但请参见下文:我们确实有\ProvideDocumentCommand
。
总的来说,您几乎总是知道何时需要新变量:一般的 LaTeX3 方法是在模块/包中“尽早”定义这些变量。因此,如果两个命令使用相同的变量,我会期望
\seq_new:N \l_mypkg_seq
\cs_new_protected:Npn \mypkg_cmd_one:n #1
{
...
\seq_put_right:Nn \l_mypkg_seq { foo }
...
}
\cs_new_protected:Npn \mypkg_cmd_two:n #1
{
...
\seq_put_right:Nn \l_mypkg_seq { bar }
...
}
...
\NewDocumentCommand { \mypkgone } { m } { \mypkg_cmd_one:n {#1} }
\NewDocumentCommand { \mypkgtwo } { m } { \mypkg_cmd_two:n {#1} }
偶尔会出现无法确定变量是否已定义的情况,通常是根据用户输入“动态”创建的变量。对于这些情况,我们提供以下形式的函数\<var>_clear_new:N
,可用于确保变量存在且处于“初始”状态
\seq_clear_new:N \l_mypkg_seq
在实际情况下,我希望这些几乎总是以以下形式使用c
:几乎总是需要“即时”输入:
\cs_new_protected:Npn \mypkg_command:n #1
{
\seq_clear_new:c { l_mypkg_user_data_ #1 _ seq }
\seq_put_right:c { l_mypkg_user_data_ #1 _ seq } { First }
}