为什么不是xparse
expl3 的一部分?
为什么xparse
存在? expl3 还不够好吗?
是否存在需要同时使用两者的情况?
我什么时候应该选择其中一个?
答案1
LaTeX 项目的工作目标之一是将使用 TeX 创建文档的各个不同方面分离为定义的层,每个层都有适当的 API。例如编程我们有expl3
:它是所有其他工作的“基础层”,并提供了一种无需使用“原始”TeX 原语的方法。
该xparse
软件包位于不同的层,即为代码级功能创建文档接口。人们可以想象出许多文档命令语法,并xparse
提供了其中一种:类似 LaTeX2e 的语法。人们可以想象使用相同的代码级材料和不同的界面系统,例如直接从 Markdown、XML 等进行排版……今天,任何未来的格式都可能坚持使用“原生”类似 LaTeX2e 的界面,并使用脚本进行转换,但这并不总是那么明确。
使用 LaTeX2e 的经验告诉我们,直接创建文档命令和实现是很不方便的:在改变实现时,必须担心界面,并且反之亦然通过使用,程序员可以分离出两个方面: ' '语法xparse
中的接口,记录函数中的实现(或其他)。xparse
s o m
expl3
因此,不存在竞赛两部分之间:以与 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
接受参数
- 大纲级别
- 全文
- “简短”的文字
- TOC 标志
或者我们可以改变它,使可选参数\section
成为 keyval,从而改变实现但不改变接口
\DeclareDocumentCommand \section { s O{#3} m }
{
\group_begin:
\keys_set:nn { sectioning } {#2}
\sectioning_create:nnN { 1 } {#3} #1
\group_end:
}
具有相同的文档级接口,但不同的实现。