LaTeX3 是否有与 \providecommand 类似的功能?

LaTeX3 是否有与 \providecommand 类似的功能?

假设有两个定义

\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 }
  }

相关内容