@ifpackageloaded 如果 \RenewDocumentCommand 否则 \NewDocumentCommand

@ifpackageloaded 如果 \RenewDocumentCommand 否则 \NewDocumentCommand

您好(抱歉标题有点奇怪),我想知道\NewDocumentCommand如果包尚未加载,我该如何定义命令,如果已经加载,我想用 重新定义它\RenewDocumentCommand。有什么建议吗?(如果能简化的话,我不介意使用 expl3 命令。)顺便说一句。我不想要这样的解决方案:

\@ifpackageloaded{...}{
    \RenewDocumentCommand\whatever{...}{
        code A
    }
}{
    \NewDocumentCommand\whatever{...}{
        code A
    }
}

我正在寻找的东西是不需要两次编写“代码 A”部分的东西(参数也相同)。:D

答案1

您可以使用

\@ifpackageloaded{...}
  {\RenewDocumentCommand}
  {\NewDocumentCommand} \whatever {...}
    {
      code A
    }

然后\@ifpackageloaded将进行测试,并将\RenewDocumentCommand或留\NewDocumentCommand在输入流中,后面跟着通常的参数。

这是编写低级代码时常用的技巧。例如(随机选择),\tl_set_rescan:Nnn\tl_gset_rescan:Nnn定义如下:

\cs_new_protected:Npn \tl_set_rescan:Nnn
  { \__tl_set_rescan:NNnn \tl_set:No }
\cs_new_protected:Npn \tl_gset_rescan:Nnn
  { \__tl_set_rescan:NNnn \tl_gset:No }

它们使用相同的内部\__tl_set_rescan:NNnn,但第一个参数不同,即\tl_set:No\tl_gset:No,从而避免了大量的代码重复。

相关内容