看完之后本文, 它指出:
经验丰富的 TeX 程序员可能会担心我说的是“函数”而不是“宏”。... LaTeX3 编程方法允许我们将许多宏视为函数,但有些地方我们需要考虑宏的扩展。在整个 LaTeX3 文档中,编程都是以函数的形式描述的,所以我将坚持这种方法。请记住,一切的底层都是一组宏,而且这会不时出现。
如果“宏”现在被称为“函数”,但在本质上一切仍然是宏,我想知道我们应该如何考虑何时创建宏,何时\NewDocumentCommand
创建功能例如\cs_new:Npn
。
答案1
TeX 是一种宏扩展语言,因此一切我们可以创建的一切都归结为宏。然而,这不是这里最重要的事情:我们谈论的是编程层。
LaTeX 文档是使用 、 等命令构建的\emph
。\begin
这些\section
命令文档命令可能在适当的情况下采用可选参数,并且可能根据文档类别产生不同的结果。后者的一个典型示例是\emph
:它通常表示“使之斜体”,但在演示文稿中可能为粗体、彩色或类似内容。同时,虽然 LaTeX2e 使用特定的“标准”语法,但人们可以在此级别定义具有不同约定的替代文档格式。
文档命令的实现需要代码级别:实现细节。在这个级别,我们需要明确定义的 API,其中参数的数量固定的并且不依赖于文档中的变量语法。例如,如果我决定更改实现的方式\section
,则我不必担心可选的星号和可选的方括号参数。
在 LaTeX2e 中,有些区域存在这种分离(\section
是其中之一),但这并不是完全系统化的。在 LaTeX3 工作中,情况更加明确。(类似 LaTeX2e)应使用xparse
(\NewDocumentCommand
、ETC。),并将其参数传递给使用expl3
( \cs_new_protected:Npn
、ETC。), IE
\NewDocumentCommand \foo { s O { } m }
{
\IfBooleanTF #1
{ \my_command_one:nn {#1} {#2} }
{ \my_command_two:nn {#1} {#2} }
}
...
\cs_new_protected:Npn \my_command_one:nn #1#2
{
% Implementation using private \__... functions
}