教程:扩展编写γ

金宝搏188Mathjax的设计方式使得编写扩展非常容易。金宝搏188Mathjax第三方扩展储存库;也见第三方扩展.

在本教程中,我们将看到如何编写您自己的MathjaxExtension。金宝搏188假设没有特定的先决条件,除了你已经有了一个本地的安装当然,还有一些对如何使用Mathjax的熟悉。金宝搏188

大局γ

我们认为你在金宝搏188金宝搏188马特贾克斯导演和网址http://localhost/金宝搏188mathjax/指向该目录。我们还假定您的本地Web服务器运行在http://localhost/;这不是强制性的,但可以避免与跨源安全策略的问题。

第一,请注意,Mathjax的源代码是“打包的”,因此JavaS金宝搏188cript文件较小,下载所需的时间也较短。这些文件不容易读取和编辑,因此,为了开发的目的,我们将与金宝搏188Mathjax/未包装/目录。因此,你应该装上未包装的金宝搏188玛莎在你的页面上运金宝搏188行Mathjax。例如,如果你写一个文件

金宝搏188mathjax/unpacked/test0.html
<HTML>
  <>
    <标题>测试用例
              标题>
    < 字符集=“UTF-8”>
    <脚本 类型=“文本/javascript”
            SRC=“http://localhost/金宝搏188mathjax/unpacked/mathjax.js?配置=tex-mml-am_chtml“>
    
               脚本>
  
                >
  <身体>
    <>tex:(\frac a b\)
                 >
    <>MathML:<数学>MQRT>惯性矩>X
                  惯性矩>
                   MQRT>
                    数学>
                     > <>asciimash:`A^2+B^2=C^2`
                      > 
                       身体> 
                        HTML> 

然后页面http://localhost/金宝搏188mathjax/unpacked/test0.html应该包含对应于tex的格式化公式,Mathml和Sciimath来源。

金宝搏188玛莎是主文件,初始化Mathjax并加载其所有组件金宝搏188。最重要的是在下面的图表中。输入模式(蓝色)位于解包/JAX/输入/并将相应的给定输入文本转换为位于金宝搏188未包装/JAX/元件(目前只有一种格式,基本上是“mathml”)。然后,这个内部结构由位于解包/JAX/输出.Math金宝搏188jaxExtensions位于拆包/扩展/并且可以修改或扩展Mathjax组件。金宝搏188

金宝搏188Mathjax组件

Mathjax的一个特性是,只金宝搏188有在必要时才加载其他的javascript文件。扩展通常使用其他组件,因此在运行扩展之前必须确保它们已经加载。同样地,扩展可能需要指示它的准备时间,以便其他组件可以使用它。将代码与Mathjax同步金宝搏188我在Mathjax文档中解释过,但我们金宝搏188将在必要时审阅规则。

一个简单的MeasureTime扩展γ

在本节中,我们愿意写一个小的扩展名,在页面底部指出Mathjax花了多少时间来输入页面。金宝搏188首先,我们创建以下javascript文件:

//解包/extensions/measureTime.js

金宝搏188.HTML.附录文件.身体 “div” {风格 {颜色 “红色”}, [“你好,世界!”
金宝搏188.阿贾克斯.加载完成“[金宝搏188mathjax]/extensions/measureTime.js”中的

第一行就是用方便金宝搏188HTML创造一个 风格=“颜色: 红色;“你好” 世界!

元素。第二行会告诉Mathjax金宝搏188 测量时间已成功加载。再一次,我们指的是 将代码与Mathjax同步金宝搏188细节。现在修改test0.html并插入 文本/x-ma金宝搏188thjax-config在加载mathjax之前编写脚本。金宝搏188使用此添加 测量时间要加载的扩展名列表:


             <脚本 类型=“文本/x-ma金宝搏188thjax-config”>
       金宝搏188.枢纽.配置.扩展.“测量时间.js”
    
             脚本>
    <脚本 类型=“文本/javascript”
            SRC=“http://localhost/金宝搏188mathjax/unpacked/mathjax.js?配置=tex-mml-am_chtml“>

页面http://localhost/金宝搏188mathjax/unpacked/test1.html现在应该呈现相同的Test0.HTML,除了那个红色的“你好,世界!”消息附加在页面的末尾!

我们的目标是用类似于“2秒钟内由Mathjax设置的类型”的内容替换该消息。金宝搏188快速查看金宝搏188Mathjax启动序列显示在排版通过之前加载了扩展。也,排字从“开始排字”信号开始,以“结束排字”信号结束。启动顺序以最后一个“结束”信号结束。为了增加这些信号的侦听器,我们使用金宝搏188mathjax.hub.register.startuphook.

现在写扩展已经很困难了。我们将特定的数据保存到MeasureTime扩展金宝搏188mathjax.extension.measureTime对象。当我们听到开始和结束的排字信号时,我们设置相应的开始时间结束时间成员到当前时间。最后当我们听到最后的结束信号时,我们附加了所需的DIV(注意前一个版本立即附加了它):

//解包/extensions/measureTime.js

金宝搏188.延伸.测量时间 = {};

金宝搏188.枢纽.寄存器.星光管“开始排版” 功能 () {
  金宝搏188.延伸.测量时间.开始时间 = 新的 日期())获得时间();
(});

金宝搏188.枢纽.寄存器.星光管“结束排版” 功能 () {
  金宝搏188.延伸.测量时间.结束时间 = 新的 日期())获得时间();
(});

金宝搏188.枢纽.寄存器.星光管“结束” 功能 () {
  var 三角洲 = 金宝搏188.延伸.测量时间.结束时间 - 金宝搏188.延伸.测量时间.开始时间 / 1000。
  金宝搏188.HTML.附录文件.身体 “div” 无效的
                          [“Mathjax在中设置金宝搏188的类型” + 三角洲 + “第二”
(});

金宝搏188.阿贾克斯.加载完成“[金宝搏188mathjax]/extensions/measureTime.js”中的

现在负载Test1.HTML再次(必要时清除浏览器缓存)并验证是否看到所需的“typeset by mathjax in…seconds”消息。金宝搏188

请注意,这是演示扩展机制的基本扩展,但它显然有一些限制;例如只测量类型设置时间(而不是整个Mathjax执行时间)。金宝搏188当您通过菜单切换渲染模式时,消息不会更新,消息不可本地化,等。

定义tex宏的扩展γ

Tex已经有了一个宏机制来定义可用的thoSealReady中的新命令。这种机制存在于Mathjax中,金宝搏188同样,并且可以依赖它来创建定义TexMacros集合的Mathjax扩展。金宝搏188请考虑以下示例:

//解包/extensions/tex/taylor.js

金宝搏188.枢纽.寄存器.星光管“特克斯JAX准备好了” 功能 () {
  金宝搏188.输入输出.特克斯.定义.添加({
    宏指令 {
      扩大 [“宏” “\\sum n=0+infty \ frac x^n n!}
      泰勒 [“宏”“\\sum n=0+infty \ frac 1(n)\ left(2 \ right)n!\左(3-2 \右)^n” 
      泰罗 [“宏”“\\sum n=1+infty(-1)n+1 \ frac 1 n” 
      泰勒辛 [“宏”“\\sum n=0+infty \ frac(-1)^n(2n+1)!{{ 1 } ^ {2n+1 }” ]
    }
  (});
(});

金宝搏188.阿贾克斯.加载完成“[金宝搏188mathjax]/extensions/tex/taylor.js(扩展名/tex/taylor.js)”

该结构类似于MeasureTime扩展:我们通过监听适当的信号等待直到tex输入就绪。然后我们用一些定义扩展了TEX宏集。例如

扩大 [“宏” “\\sum n=0+infty \ frac x^n n!}]

将为指数系列定义一个tex命令。注:这些定义以javascript字符串形式给出,所以您需要转义一些特殊的字符:例如,使用了双反斜杠。如果你的宏有参数,必须指定所需的数字,因此数组末尾的3

泰勒 [“宏”“\\sum n=0+infty \ frac 1(n)\ left(2 \ right)n!\左(3-2 \右)^n” 

最后,您可以在测试页中使用Taylor扩展名:


             <脚本 类型=“文本/x-ma金宝搏188thjax-config”>
  金宝搏188.枢纽.配置({ 特克斯 { 扩展 [“泰勒·JS”] });

             脚本><身体>\[\exp x(x)=\exp expexpansion \]\[f(x)=\Taylor 125\123; 125 \ \ \ \ \ \Log(1+h)=\TaylorLog H 125\123; \ \ \ \exp expexpansion \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \123 \ epsilon 3 \右)\]
              身体>

处理依赖关系γ

假设我们想要创建另一个扩展名taylor2.js,它使用来自taylor.js的some命令。因此泰勒2依赖泰勒,而韦斯应该做一些同步。我们已经看到泰勒克斯张力在定义acros之前等待“tex-jax-ready”信号。准备好后通知泰勒2号分机,泰勒扩展本身必须发送一个“特克斯泰勒就绪”信号。在定义宏之后,当然要为其指定适当的位置:

//解包/extensions/tex/taylor.js

金宝搏188.枢纽.寄存器.星光管“特克斯JAX准备好了” 功能 () {
  金宝搏188.输入输出.特克斯.定义.添加({
    
  (});
  金宝搏188.枢纽.启动.信号.“Tex Taylor准备好了”
(});

金宝搏188.阿贾克斯.加载完成“[金宝搏188mathjax]/extensions/tex/taylor.js(扩展名/tex/taylor.js)”

现在定义taylor2.js如下:

//解包/extensions/tex/taylor2.js

金宝搏188.枢纽.寄存器.星光管“特克斯JAX准备好了” 功能 () {
  金宝搏188.输入输出.特克斯.定义.添加({
    宏指令 {
      正弦膨胀 [“延期” “泰勒”]
    }
  (});
(});

金宝搏188.枢纽.寄存器.星光管“Tex Taylor准备好了” 功能 () {
  金宝搏188.枢纽.插入金宝搏188.输入输出.特克斯.定义 {
    宏指令 {
      正弦膨胀 [“宏” “泰勒菌素x”]
    }
  (});
(});

金宝搏188.阿贾克斯.加载完成“[金宝搏188mathjax]/extensions/tex/taylor2.js(扩展名/tex/taylor2.js)”

当输入JAX准备就绪时,正弦膨胀将定义为加载Taylor扩展并在前进后重新启动进程的函数。泰勒分机准备好后,正弦膨胀成为通缉犯\TayrRux{x}定义。现在,您可以在test3页面中使用此命令。请注意,只有要加载的扩展列表中指定了Taylor2扩展(当正弦膨胀首先使用宏)。


             <脚本 类型=“文本/x-ma金宝搏188thjax-config”>
  金宝搏188.枢纽.配置({ 特克斯 { 扩展 [“泰勒2·JS”] });

             脚本><身体>\[\sin(x)=\sinExpansion\]..

我们不会在本教程中给出详细信息,但请注意,其他MathjaxCompon金宝搏188ents也有类似的停止方法,等待分机,重新开始执行。

更高级的扩展γ

一般来说,编写更复杂的扩展需要很好地理解Mathjax代码库。金宝搏188虽然公共Mathj金宝搏188axapi在文档中提供,内部代码并不总是这样。因此,拇指规则是阅读相关的JAX.JS文件在打开/包装(如有必要,可以加载javascript文件,也可以使扩展重新定义或扩展代码。

下面是一个例子。我们修改了压裂所以最外面的分数通常是画出来的,但是那些压裂祖先被画成斜角。我们还定义了一个新的命令BBRAF默认情况下绘制斜角分数。它有一个可选参数来指示我们是否需要一个斜角分数,并且可以取值“auto”(如压裂)“真”或“假”。必须仔细阅读tex解析器才能理解这个扩展是如何工作的。

//解包/extensions/bevelledfraction.js

金宝搏188.枢纽.寄存器.星光管“特克斯JAX准备好了” 功能 () {
  金宝搏188.输入输出.特克斯.定义.添加({
    宏指令 {
      压裂 “压裂”
      BFRAC “BFRAC”
    }
  } 无效的 
  金宝搏188.输入输出.特克斯.解析.加强({
    压裂 功能 名称 {

      var 古老的 = .堆栈.埃恩.斜切的 .堆栈.埃恩.斜切的 = 
      var 号码 = .帕尔斯格名称
      var 兽穴 = .帕尔斯格名称
      .堆栈.埃恩.斜切的 = 古老的

      var 压裂 = 金宝搏188.元素Jax.MML.MFRAC号码 兽穴
      压裂.斜切的 = .堆栈.埃恩.斜切的
      .压裂
    }
    BFRAC 功能 名称 {

      var 斜切的 = .获取括号名称
      如果 斜切的 = = “自动”
        斜切的 = .堆栈.埃恩.斜切的
      其他的
        斜切的 = 斜切的 != “假”

      var 古老的 = .堆栈.埃恩.斜切的 .堆栈.埃恩.斜切的 = 
      var 号码 = .帕尔斯格名称
      var 兽穴 = .帕尔斯格名称
      .堆栈.埃恩.斜切的 = 古老的

      var 压裂 = 金宝搏188.元素Jax.MML.MFRAC号码 兽穴
      压裂.斜切的 = 斜切的
      .压裂
    }
  (});

(});

金宝搏188.阿贾克斯.加载完成“[金宝搏188mathjax]/extensions/tex/mfracbevelled.js(扩展名/tex/mfracbevelled.js)”

同样,您可以在测试4页。


             <脚本 类型=“文本/x-ma金宝搏188thjax-config”>
  金宝搏188.枢纽.配置({ 特克斯 { 扩展 [“mfracbevelled.js”] });

             脚本>描述A B \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \123; \b frac[自动]A B \]。