编辑:

编辑:

可以将命令放在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,则可以有效地将两者联系在一起。(请注意,做到这一点很棘手,例如,我自己的代码的某些部分需要修改才能正确。这是一项正在进行的工作。)

相关内容