我不明白第 6.1 节中的例子expl3-介绍.tex来自 LATEX3 文档。其中说:
以下是定义该函数的两种等效方法
\foo:nn
:\cs_set:Npn \foo:nn #1#2 {(#1)/(#2)} \cs_set:cpn {foo:nn} #1#2 {(#1)/(#2)}
这些宏分别相当于 \TeX 的
\long\def\foo:nn
, 和
\expandafter\long\expandafter\def\csname foo:nn\endcsname
。
注意
:nn
后缀表示 |\foo| 接受两个参数。
给出的等价物似乎减少了而不是完整了。有人能提供准确的等价物吗
\cs_set:Npn \foo:nn #1#2 {(#1)/(#2)}
和
\cs_set:cpn {foo:nn} #1#2 {(#1)/(#2)}
?
特别是,我对 感到疑惑\long\def\foo:nn
。在 Plain TeX 或 LaTeX 2e 中,命令名称中是否允许使用冒号?这里是否假设 的 catcode:
已更改?如果是这样,建议在上面的示例中明确添加相应的命令。定义的扩展部分(即{(#1)/(#2)}
)在哪里?
答案1
在 LaTeX3 代码块中,:
和_
都是“字母”。因此在演示中,控制序列是\foo:nn
,包括:
和nn
。正如文档所述
\cs_set:Npn \foo:nn #1#2 { (#1) / (#2) }
完全等同于
\long\def\foo:nn#1#2{(#1)/(#2)}
和
\cs_set:cpn { foo:nn } #1#2 { (#1) / (#2) }
完全等同于
\expandafter\long\expandafter\def\csname foo:nn\endcsname#1#2{(#1)/(#2)}
这里,我利用了 LaTeX3 代码块中空格被忽略的事实。在第一个例子中,我还假设它:
是一个“字母”。