mathjax v3.0的新特性

mathjax版本3是一个从头开始的完整重写,其目标是使mathjax的内部基础设施现代化,使其更灵活地用于现代web技术,使其更易于与nodejs一起用于预处理和服务器端支持,并使其更快呈现你的数学。

提高了速度

版本3重写有许多设计目标。一个主要的目标是提高mathjax的渲染速度,我们认为我们已经完成了这项工作。由于这两个版本的操作如此不同,很难进行精确的比较,但是在呈现包含数百个表达式的完整页面的测试中,我们看到呈现时间减少了60%到80%,这取决于浏览器和计算机类型。

更灵活

另一个目标是使mathjax 3对于使用mathjax作为更大框架的一部分的web开发人员来说更加灵活,同时保持它在简单设置中的易用性。为此,我们将mathjax采取的操作分解为比版本2中更小的单元,并使单独调用它们成为可能,或者用您自己的替代版本替换它们成为可能。例如,排版过程被分成若干部分,包括在页面中查找数学、将其编译为内部格式(mathml)、获取数学位置的度量数据、将数学转换为输出格式、将其插入页面、添加菜单事件处理程序等。您可以控制要执行的操作,并可以修改或删除现有操作,或添加自己的新操作。见 renderActions 有关详细信息的文档。

同步转换

我们希望在版本3中包含的一个关键特性是能够同步运行mathjax,特别是提供一个函数,该函数可以将输入字符串(比如tex表达式)转换为输出dom树(比如svg图像)。这在版本2中是不可能的,因为它的操作在基本级别上本质上是异步的。对于mathjax版本3,这是直接的,因为我们提供了一个同步的排版路径,无论是在页面内,还是对于单独的表达式,只要您提前加载所需的所有组件。见 排版与数学转换 有关详细信息。

没有队列、信号、回调

使用mathjax版本2的一个更困难的方面是必须将您的操作与mathjax的操作同步。这涉及到使用 queues, callbacks, and signals to mediate the asynchronous actions of MathJax. Since these were not standard javascript paradigms, they caused confusion (and headaches) for many developers trying to use MathJax. With version 3, MathJax has the option of working synchronously (as described above), but it still allows for asynchronous operation (e.g., to allow TeX's \require command to load extensions dynamically) if you wish. This no longer relies on queues, callbacks, and signals, however. Instead, these actions are managed through the ES6 promise ,这是一个javascript标准,应该使将mathjax集成到您自己的应用程序中更加直接。

包管理器支持

由于mathjax版本2使用自己的加载机制来访问其组件,并且由于没有方法将mathjax所需的所有部分组合到一个文件中,因此mathjax在javascript打包系统(如 webpack . 版本3解决了这个问题,因此它应该能够更好地与现代web工作流进行互操作。您可以自定义mathjax的单个文件构建(请参见 定制mathjax构建 )或者可以将其作为较大资产文件的一个组件。

mathjax组件

但是,mathjax 3仍然提供了一种类似于版本2的加载机制,因此您仍然可以自定义所加载的扩展,以便只加载所需的扩展(尽管这确实要求您在异步模式下使用mathjax)。mathjax的各个部分已经打包成“组件”,可以根据需要进行混合和匹配,并且可以通过全局 MathJax 变量(见 浏览器中的示例 )这就是mathjax是如何通过托管它的各种cdn进行分发的。以这种方式加载时,mathjax将自动设置所有需要使用已加载组件的对象和函数,使您可以轻松访问所选输入和输出格式的排版和转换函数。请参阅 mathjax组件 更多信息。您还可以创建自己的自定义组件来补充或替换cdn上提供的组件(请参见 自定义扩展 更多)。

启动操作

如果你使用 combined component 在启动过程中,mathjax将执行许多操作。特别是,它将创建输入和输出jax、数学文档、dom适配器和在文档中执行排版所需的其他对象。你可以通过 MathJax.startup 对象,如果需要的话。mathjax还将为您设置执行排版的函数,以及加载的各种输入和输出格式之间的转换。这将使执行mathjax中最重要的操作变得容易。见 排版与数学转换 了解更多详细信息。

服务器端mathjax

虽然mathjax 2是为在web浏览器中使用而设计的,但这还没有解决的一个重要用例是在服务器上预处理数学。对于版本2,我们提供了 mathjax-node 以填补这一空白,但它并不像许多人所希望的那样灵活或易于使用。mathjax 3通过与 node 应用程序与浏览器中的应用程序基本相同。也就是说,您可以加载mathjax组件,通过 MathJax 全局变量,并调用与在浏览器中相同的排版和转换函数。这使得浏览器和服务器的并行开发更加容易。

此外,节点应用程序可以直接访问mathjax模块(无需打包mathjax组件)。这使您能够最直接地访问mathjax的特性,并在修改mathjax的操作时具有最大的灵活性。见 节点中的mathjax示例 例如如何做到这一点。

es6和typescript

mathjax 3使用es6模块编写,并且 Typescript 语言。这意味着源代码包含类型信息(这提高了代码的可靠性),并允许mathjax在利用现代javascript编程技术的同时,针对较旧的浏览器向下编译到es5。这也意味着,如果您愿意,您可以生成纯ES6版本的MathJax(而不是ES5);这些版本应该比它们的ES5等效版本更小更快,尽管它们只能在支持ES6的现代浏览器中运行,因此限制了您的读者。我们将来可能会在CDN上同时提供ES6和ES5版本。


现有组件的新功能

除了上面描述的mathjax的新结构之外,还向mathjax的现有部分添加了一些新特性。

tex输入扩展

有两个新的tex输入扩展: 制动器物理学 . 另外,在版本2的tex input jax中内置的一些功能已经转移到版本3的扩展中。这包括 macros 配置选项 tag formatting 配置选项,以及 require 宏。新的 自动装填 扩展替换旧的 autoload-all 扩展,更可配置,默认情况下包含在tex输入组件中。有几个扩展尚未移植到版本3,包括 autoboldmediawiki-texvc ,以及第三方扩展。

SVG输出

带有标签的公式的svg输出得到了改进,使得标签的位置现在可以对容器宽度的变化做出反应(就像在html输出格式中一样)。

改进的表达式资源管理器

交互式表达式资源管理器已在多个方面进行了改进。它现在包括更好的启发式方法,用于为您探索的表达式创建语音文本,在您的探索过程中提供对播放功能的更多键盘控制,添加对布莱叶盲文输出的支持,添加对子表达式缩放的支持,等等。请参阅 辅助功能 有关更多详细信息,请参见第页。