在旨在兼容多种格式的包中是否应该使用 expl3 代码?

在旨在兼容多种格式的包中是否应该使用 expl3 代码?

也许这个问题总体上不是一个好主意,但我很好奇。这可能会让未来的某些软件包开发变得更简单。(当然,这不会强加给任何软件包开发人员,但他/她可以选择使用这种方法或传统方法。)我想真正的关键是它可以为那些希望使用它们的人提供额外的选择。


许多软件包1,包括两个我经常使用的(pgfpgfplots) 以通用方式实现,使其可用于多种格式。对于pgf/ pgfplots,这些“包”在 Plain TeX、LaTeX 和 ConTeXt 文档中同样有效。

为了实现这一目标(确保与多种格式兼容),代码使用 TeX 基元作为“共同点”。因此,代码中充满了\expandafters、行尾%s 以及语法旨在从程序员那里抽象出来的各种其他 TeX 编程构造expl3。(与 LaTeX 最初的目标是从典型的文档作者那里抽象出这些构造不同。)

沿着miniltxeplain,我设想expl3可能会提供全部或部分子集供格式无关的软件包开发人员使用。在研究这个问题时,我发现这种可能性似乎已经以 的形式提供,即expl3-generic.tex以格式中立的方式提供\input核心expl3代码( )。expl3-code.tex

  • 在做出这种设计选择时是否考虑到了这些类型的用途,或者还有其他原因要以这种方式构建代码?(例如,易于进行低级测试。)
  • 是否有任何当前或正在开发的格式中性宏集(“包”)使用这种方法?
  • 最后,按照标题的意思:这是一种推荐的做法吗?格式中立的软件包(当然由其作者决定)是否应该expl3在内部使用语法/约定?

1检查您的 TDS 树texmf-dist/tex/generic以获取一些示例。

答案1

的核心目的expl3是形成一个编程层,以便更广泛地开发新的 LaTeX 工具。目前,这项工作是在 LaTeX2e 格式之上进行的,因此expl3被认为是一个 LaTeX2e 包。然而,expl3它相当独立,将所有 TeX 基元放入一个专用命名空间,并使用它们来构建代码环境。因此,提供一个可以通过 LaTeX2e 以外的格式加载的版本的想法在expl3不久前首次被提出,但直到最近才得以实现。

的实现expl3使得它可以以不同的格式加载,正是为了让代码能够以多种格式使用。这是根据用户社区的要求而实现的。因此,的跨格式特性expl3旨在让开发人员使用代码库来支持他们的工作。重要的是,expl3目前只有设置为以这种方式加载:相同的是不是对于任何附加的基于 的代码都正确expl3例如 l3regex)。

至于是否希望使用此功能,则取决于所涉及的开发人员。对于一些通用代码的开发人员来说,应避免依赖关系,实际上在“裸机”原始级别上工作可能被视为一个积极因素。另一方面,如果您发现expl3一个有用的开发环境,那么这是您的选择,您可以自由使用它来支持您的工作。例如,团队正在使用通用加载功能来expl3编写脚本,这些脚本以纯文本形式执行,但在使用编码环境时可以使用更丰富的工具集。

重要的是要记住,expl3仅提供一个代码层,因此任何“更高级别”的内容仍然必须根据格式进行处理。


如果要expl3在通用模式下使用,则使用以下方式调用通用加载器

\input expl3-generic\relax

如果与 LaTeX2e 一起使用,这将切换到标准包,而对于纯 TeX 和 ConTeXt,它将按原样加载。目前,通用加载尚未在其他格式上进行测试。

请注意,通用模式下的图形驱动程序选择始终与自动驱动程序选择一致。这意味着(当前)dvipdfmx无法使用特殊驱动程序。如果有很大需求,可能会重新审查。

答案2

这些都是凡人的回忆和观点。

在做出这种设计选择时是否考虑到了这些类型的用途,或者还有其他原因要以这种方式构建代码?(例如,易于进行低级测试。)

正如 David 在评论中指出的那样,Frank 在聊天中指出的那样,这种选择是经过深思熟虑的。我怀疑这在很大程度上是为了进一步区分逻辑、界面、演示和内容的概念。话虽如此,该语言显然也被设计得非常结构化:它的设计和实现似乎经过了大量的思考,以保留 TeX 编程的优点,抽象出不好的部分,并解决真实的现代排版问题,同时提供相对健全的编程环境。

expl3 的刚性结构有助于每个人

是否有任何当前或正在开发的格式中性宏集(“包”)使用这种方法?

事实上,是的 :-)termmenu(目前正在积极开发中;我发誓我不是只是为了这个问题才写它的)仅使用 expl3 来实现终端驱动的菜单系统。

lt3graph也可以容易地可以做到与格式无关,但遗憾的是,事实并非如此。请注意,这也主要是 expl3 编程语言的扩展。

我认为扩展(用 expl3 的话来说,就是“模块”)这一想法将推动 expl3 在社区中的发展。使用 expl3 的 LaTeX3 将推动 LaTeX 的发展。

最后,按照标题的意思:这是一种推荐的做法吗?格式中立的包(当然由其作者决定)是否应该在内部使用 expl3 语法/约定?

我建议在有意义的情况下使用它。如果你正在创建纯粹是编程问题的东西,那么绝对地用 expl3 来实现。但是,如果它有一个 presentation 元素,保持各层分离。要么将其完全变成 LaTeX 包,要么将纯逻辑剥离到 expl3 模块中。

无论如何,不​​要忘记你的前缀:)

相关内容