在 Latex3 中定义函数

在 Latex3 中定义函数

我能解释一下吗?例如,这些是什么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 页开始。

基本上,函数名称后面的位:是函数的签名. 它由零个或多个参数说明符.Nn都代表“无操作”。也就是说,参数按原样传递给函数。N表示单个标记;n表示括号(花括号)中的零个或多个标记。因此,\c_empty_tl可以在函数具有 的地方传递N,因为它是单个标记。{ \c_empty_tl }或者{ a 8 \c_empty_tl something-else }可以在有 的地方给出n

Nn是基础。如果你想将扩展的 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...用于创建围绕编程层函数的包装器。

但是,如果不知道包函数要做什么,就很难提出不同的方法。(我假设您不只是创建二十个具有不同默认颜色的不同名称的环境。)

相关内容