我能解释一下吗?例如,这些是什么Nn
以及nn
关于什么。语法非常隐秘。
\cs_new_protected:Nn \piston_newteorema_define:nn
{
\NewDocumentEnvironment { #1 } {D(){#2}}
{
\tl_set:Nn \piston_teorema_setcolor_tl { ##1 }
\use:c { #1_inner }
}
{
\use:c { end#1_inner }
}
}
上面是呈现功能的方式吗,还是下面更清楚?
\cs_new_protected:Nn
\piston_newteorema_define:nn
{
\NewDocumentEnvironment { #1 } {D(){#2}}
{
\tl_set:Nn \piston_teorema_setcolor_tl { ##1 }
\use:c { #1_inner }
}
{
\use:c { end#1_inner }
}
}
答案1
我发现文档非常好。问题是弄清楚在哪里可以找到它。
有关语法的解释,请参阅文档l3内核.expl3.pdf
两者interface3.pdf
都讨论了基本语法。后者是一份庞大的文档,但您想要的解释从第 2 页开始。
基本上,函数名称后面的位:
是函数的签名. 它由零个或多个参数说明符.N
和n
都代表“无操作”。也就是说,参数按原样传递给函数。N
表示单个标记;n
表示括号(花括号)中的零个或多个标记。因此,\c_empty_tl
可以在函数具有 的地方传递N
,因为它是单个标记。{ \c_empty_tl }
或者{ a 8 \c_empty_tl something-else }
可以在有 的地方给出n
。
N
和n
是基础。如果你想将扩展的 token 或 token 传递给函数,你可以使用变体. 可根据需要生成变体。
例如,
\cs_new_protected_nopar:Nn \__mymodule_hello:n
{
\group_begin:
Say ~ `Hello!' ~ to ~ #1!
\group_end:
}
\cs_generate_variant:Nn \__mymodule_hello:n { V }
\tl_new:N \l__mymodule_greeted_tl
\tl_set:Nn \l__mymodule_greeted_tl { The ~ Pied ~ Piper }
\__mymodule_hello:n { The ~ Pied ~ Piper } ~
\__mymodule_hello:V \l__mymodule_greeted_tl
V
告诉 LaTeX 将变量的值传递给函数,因此函数在两种情况下都会接收相同的标记流。
从表面上看,您提出的两个定义都不符合 l3 方法。诸如 之类的命令\NewDocumentEnvironment
用于处理用户输入。诸如 之类的控制序列\piston_newteorema_define:nn
用于编程使用。 的目的之一expl3
是更清晰地分离这些层,因此通常\NewDocument...
用于创建围绕编程层函数的包装器。
但是,如果不知道包函数要做什么,就很难提出不同的方法。(我假设您不只是创建二十个具有不同默认颜色的不同名称的环境。)