关于何时在 LaTeX3 中创建新函数与命令的最佳实践

关于何时在 LaTeX3 中创建新函数与命令的最佳实践

看完之后本文, 它指出:

经验丰富的 TeX 程序员可能会担心我说的是“函数”而不是“宏”。... LaTeX3 编程方法允许我们将许多宏视为函数,但有些地方我们需要考虑宏的扩展。在整个 LaTeX3 文档中,编程都是以函数的形式描述的,所以我将坚持这种方法。请记住,一切的底层都是一组宏,而且这会不时出现。

如果“宏”现在被称为“函数”,但在本质上一切仍然是宏,我想知道我们应该如何考虑何时创建宏,何时\NewDocumentCommand创建功能例如\cs_new:Npn

答案1

TeX 是一种宏扩展语言,因此一切我们可以创建的一切都归结为宏。然而,这不是这里最重要的事情:我们谈论的是编程层

LaTeX 文档是使用 、 等命令构建的\emph\begin这些\section命令文档命令可能在适当的情况下采用可选参数,并且可能根据文档类别产生不同的结果。后者的一个典型示例是\emph:它通常表示“使之斜体”,但在演示文稿中可能为粗体、彩色或类似内容。同时,虽然 LaTeX2e 使用特定的“标准”语法,但人们可以在此级别定义具有不同约定的替代文档格式。

文档命令的实现需要代码级别:实现细节。在这个级别,我们需要明确定义的 API,其中参数的数量固定的并且不依赖于文档中的变量语法。例如,如果我决定更改实现的方式\section,则我不必担心可选的星号和可选的方括号参数。

在 LaTeX2e 中,有些区域存在这种分离(\section是其中之一),但这并不是完全系统化的。在 LaTeX3 工作中,情况更加明确。(类似 LaTeX2e)应使用xparse\NewDocumentCommandETC。),并将其参数传递给使用expl3( \cs_new_protected:NpnETC。), 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
  }

相关内容