expl3 和 xparse 有什么关系?

expl3 和 xparse 有什么关系?

为什么不是xparseexpl3 的一部分?

为什么xparse存在? expl3 还不够好吗?

是否存在需要同时使用两者的情况?

我什么时候应该选择其中一个?

答案1

LaTeX 项目的工作目标之一是将使用 TeX 创建文档的各个不同方面分离为定义的层,每个层都有适当的 API。例如编程我们有expl3:它是所有其他工作的“基础层”,并提供了一种无需使用“原始”TeX 原语的方法。

xparse软件包位于不同的层,即为代码级功能创建文档接口。人们可以想象出许多文档命令语法,并xparse提供了其中一种:类似 LaTeX2e 的语法。人们可以想象使用相同的代码级材料和不同的界面系统,例如直接从 Markdown、XML 等进行排版……今天,任何未来的格式都可能坚持使用“原生”类似 LaTeX2e 的界面,并使用脚本进行转换,但这并不总是那么明确。

使用 LaTeX2e 的经验告诉我们,直接创建文档命令和实现是很不方便的:在改变实现时,必须担心界面,并且反之亦然通过使用,程序员可以分离出两个方面: ' '语法xparse中的接口,记录函数中的实现(或其他)。xparses o mexpl3

因此,不存在竞赛两部分之间:以与 TeX 在 Pascal(WEB)中实现相同的方式xparse实现。expl3


要清楚的是,文档接口例如\section采用可选星号、方括号中的可选参数和强制参数:它定义了“类似 LaTeX(2e) 的文档”的外观。代码级实现是(或将)采用这三个概念(“目录条目”、“简称”、“全名”)并实现排版。后者不必遵循任何特定的文档语法,因此我们可以想象

\DeclareDocumentCommand \section { s O{#3} m }
  {
     \sectioning_create:nnnN { 1 } {#3} {#2} #1 
  }

where\sectioning_create:nnnN接受参数

  1. 大纲级别
  2. 全文
  3. “简短”的文字
  4. TOC 标志

或者我们可以改变它,使可选参数\section成为 keyval,从而改变实现但不改变接口

\DeclareDocumentCommand \section { s O{#3} m }
  {
     \group_begin:
       \keys_set:nn { sectioning } {#2}
       \sectioning_create:nnN { 1 } {#3} #1
     \group_end: 
  }

具有相同的文档级接口,但不同的实现。

相关内容