使用 LaTeX2e 或 LaTeX3 编写新包

使用 LaTeX2e 或 LaTeX3 编写新包

我正计划创建一个包,我想知道使用 LaTeX3 语法还是使用我所知道的“旧” LaTeX2e 来执行此操作更好。

LaTeX3 是否支持 LaTeX2e 软件包?

如果有必要,我可以提供更多信息……

答案1

目前,LaTeX3 正在开发中,部分部分已经完成(编程层),其他部分至少已编写一些代码(例如样稿),其他部分则处于“构思”阶段。这意味着,根据您正在编写的内容,您需要不同数量的 LaTeX2e 代码来编写“LaTeX2e 中的 LaTeX3”包。例如,如果您要执行的大部分操作本质上是编程性的,那么您将需要很少的 LaTeX2e 代码,但如果您想解决某些设计领域,那么您将需要更多代码。

几乎可以肯定的是,即使代码完全是用 LaTeX3 语法编写的,也不可能直接使用 LaTeX2e 包加载它。至少可以预料到,开头

\RequirePackage{expl3}
\ProvidesExplPackage ...

行需要更改。使用此.dtx格式,如果您的代码主要是“纯”LaTeX3,那么这应该不会有太大问题,并且相同的源文件应该可以用于 LaTeX2e 和 LaTeX3。

还有一个问题,即您要编写的内容是否与 LaTeX3 内核所需的内容重叠。这不应阻止您现在用 LaTeX3 语法编写代码,但可能意味着对于 LaTeX3 内核,该功能已“原生”涵盖。在这里,我希望如果人们编写了有用的东西,那么就有可能简单地获取代码、对其进行调整并将其添加到内核中。(虽然有一个“LaTeX3 团队”,但现实情况是我们必须充当更大努力的“推动者”,因此其他人的贡献将受到热烈欢迎。)同样,根据您瞄准的确切领域,可能会有或多或少的重叠。

以我自己的软件包为例siunitx,代码主要用 LaTeX3 语法编写,但确实依赖于 LaTeX2e。例如,它依赖于 LaTeX2e 字体机制和表格构造。我预计会采用原生 LaTeX3 版本的大部分代码逻辑,但也需要调整某些部分。对于siunitx,我认为拆分也是必要的:也许某些部分可能会进入内核,而其他部分则作为可选模块。

因此,总的来说,我认为现在在软件包中使用 LaTeX3 语法,一方面是为了利用它提供的结构,另一方面是为了将来可以使用代码。但是,我不会认为这是一种让所有东西“100% 准备好”用于独立内核的方法。

答案2

仅是意见,不是答案:

稳定:

LaTeX3 对 LaTeX2e 的扩展仍处于试验阶段。这意味着命令接口的细节可能仍会发生变化。LaTeX2e 本身将来不会发生很大变化。接口几乎已冻结。只有内部宏可能会更改。

因此,使用 LaTeX3 扩展提供软件包可能需要更多更快的支持,例如,针对每个新版本的 LaTeX 进行测试并修改软件包以适应最新更改。每个新版本的 LaTeX3 扩展都可能破坏您的软件包。因此,如果您时间紧迫或只是想发布软件包但不想花时间进行支持,请不要使用 LaTeX3 扩展。

特征:

LaTeX3 扩展对 LaTeX2e 提供了许多功能和非常好的实现接口。阅读完所有文档后,您会喜欢它。如果您想利用 LaTeX3 扩展对 LaTeX2e 的任何优势,您应该使用它们来设计您的软件包!

答案3

最近我写道functional基于 LaTeX3 编程层 ( expl3) 的软件包,为其提供了用户友好的 LaTeX2 接口。此软件包还模拟了其他编程语言(如Lua或 )中的函数式编程JavaScript。以下是示例:

\documentclass{article}
\usepackage{functional}
\begin{document}

% Functional code for comparison

\IgnoreSpacesOn
\PrgNewFunction \MathSquare { m } {
  \IntSet \lTmpaInt { \IntEval {#1 * #1} }
  \Result { \Value \lTmpaInt }
}
\IgnoreSpacesOff
\MathSquare{5}
\MathSquare{\MathSquare{5}}

\end{document}
-- Lua code for comparison

-- define a function --
function MathSquare (arg)
  local lTmpaInt = arg * arg
  return lTmpaInt
end
-- use the function --
print(MathSquare(5))
print(MathSquare(MathSquare(5)))

有了这个包,函数的求值是从内到外的,这使得编写编程代码变得更加容易。

目前,此软件包仅包含 、 、 、 、 和模块。在即将发布的版本Bool中将Tl添加Str更多Int模块FpDimClist

我建议尝试一下functional如果您打算编写一个不太复杂的新包。

相关内容