可以将命令放在xparse
由 创建的函数中\cs_new:Npn
而不是中吗\NewDocumentCommand
?这会造成编程水平的混乱吗?
下面的例子有效,但我想知道它是否符合 LaTeX3 约定。
它测试#1
;-NoValue-
但是它是 public 的可选参数,而不是 private 的#1
可选参数。\create
\__mypkg_create
mypkg.sty:
\RequirePackage{expl3}
\ProvidesExplPackage{mypkg}{2013/01/20}{0.01}{My Package}
\RequirePackage{xparse}
\NewDocumentCommand \foo {om}
{
\__mypkg_foo:nn {#1} {#2}
}
\cs_new:Npn \__mypkg_foo:nn #1#2
{
\IfNoValueTF {#1} {true} {false}
}
\endinput
样本.tex:
\documentclass{article}
\usepackage{mypkg}
\begin{document}
\foo{bar}
\end{document}
编辑:
mypkg.sty:
\RequirePackage{expl3}
\ProvidesExplPackage{mypkg}{2013/01/20}{0.01}{My Package}
\RequirePackage{xparse}
\NewDocumentCommand \foo {om}
{
\mypkg_foo:nn {#1} {#2}
}
\cs_new:Npn \mypkg_foo:nn #1#2
{
\IfNoValueTF {#1} {true} {false}
}
\endinput
答案1
目前,您犯了一个错误,即在文档命令中使用了内部命令:这不是团队想要的方法。LaTeX2e 的一个问题是,许多文档命令直接使用内部命令,这使得更改界面、内部命令变得非常困难,ETC。安全地。因此,LaTeX3 的方法是,每个文档命令都应该是一个简单的“翻译”层,采用用户语法并将其转换为文档化代码级界面的输入
\NewDocumentCommand \foo {om}
{ \mypkg_foo:nn {#1} {#2} }
如果需要测试\NoValue
,目前这通常会作为此接口转换的一部分进行。
\NewDocumentCommand { \foo } {om}
{
\IfNoValueTF {#1}
{ \mypkg_foo:nn { } {#2} }
{ \mypkg_foo:nn {#1} {#2} }
}
(处理这个‘特殊’标记的具体细节可能仍需要一些工作。)
另一种表述方式是
\NewDocumentCommand { \foo } { O { } m }
{ \mypkg_foo:nn {#1} {#2} }
因为我们不关心是否#1
存在,所以我们只是设置一个空的默认值。
采用这种方法的原因是,这样就可以重新定义,\foo
同时保留对功能的访问权\mypkg_foo:nn
(如文档所述)。如果您在内部使用内部函数\foo
,则可以有效地将两者联系在一起。(请注意,做到这一点很棘手,例如,我自己的代码的某些部分需要修改才能正确。这是一项正在进行的工作。)