您好(抱歉标题有点奇怪),我想知道\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
,从而避免了大量的代码重复。