Mathjax内的html标签

时间:2019-01-15 21:21:35

标签: html mathjax

我已经知道mathjax允许在数学区域内使用非常有限的html代码,但是,我有一个多页文档,每个文档都有许多方程式,因此为了使<input type="text" maxLength="40" onkeypress="return !!String.fromCharCode(event.which || event.charCode).match(/[\dext\[\]\-]/)" required name="phone" id="phonecontactselection" >正常工作,我将这些命令包装在一个可点击的\eqref{},在将页面滚动到该页面所在位置的某个位置之前,将其定向到包含所寻址方程式的页面。

首先,降价应用程序的相关部分是

<span>

然后

content=content
    .replace(/(\\ref\{[^\}]+\})/g, "<span class='eqCitationSpan'>$1</span>")
    .replace(/(\\eqref\{[^\}]+\})/g, "<span class='eqCitationSpan'>$1</span>")

除了我想从另一个方程式中引用一个方程式之外,其他所有方法都运行良好。在那种情况下,MathJax根本不编译方程式,而仅在方程式内部编译命令// to handle cross-referencing the equations in MathJax, due to the multipage nature of the document var perPageEqs=[]; MathJax.Hub.Queue( function () { for(pageNum=0; pageNum<totalPageNumber; pageNum++){ var jax = MathJax.Hub.getAllJax("resultPage-"+pageNum); var neWLabelsInPage=[]; for (var i=0, l=jax.length; i<l; i++) { jax[i].originalText.replace(/\\label\{([^\}]+)\}/g, function(x,y){ neWLabelsInPage.push(y); return false; }); } perPageEqs.push(neWLabelsInPage); } var eqCitationArray = document.getElementsByClassName("eqCitationSpan"); var eqsOnWhichPage; for(var i=0, l=eqCitationArray.length; i<l; i++) { var key=eqCitationArray[i].innerHTML .replace(/.*\\ref\{([^\}]+)\}.*/g,"$1").replace(/.*\\eqref\{([^\}]+)\}.*/g,"$1"); eqsOnWhichPage=perPageEqs.findIndex(function(x) { return x.indexOf(key) !== -1; }); eqCitationArray[i].outerHTML= "<span class='eqCitationSpan' onclick='currentPage="+eqsOnWhichPage+"; changePage();'>" +eqCitationArray[i].innerHTML +"</span>"; } } ); 我知道是这样但是接下来有什么办法解决此类问题吗?

1 个答案:

答案 0 :(得分:1)

MathJax不会处理包含HTML标记(除了少数几个)的数学运算,因此您将无法像在此处尝试的那样在表达式内进行这种替换。

但是,您可以使用MathJax本身来处理我认为您要完成的跨页面衬里。这是一种方法:

<script type="text/x-mathjax-config">
(function () {
  //
  // The values from MathJax.Extensions["TeX/AMSmath"].labels
  //   on all the linked pages.
  //
  var labels = {
    xyz2: {tag: "2", id: "mjx-eqn-xyz2"}
  };
  //
  //  Maps tag IDs to pages on which they occur.
  //
  var urls = {
    "mjx-eqn-xyz2": "link-cross-page2.html"
  };

  //
  //  Add the labels for the other pages when AMSmath is loaded.
  //
  MathJax.Hub.Register.StartupHook("TeX AMSmath Ready", function () {
    var keys = Object.keys(labels);
    for (var i = 0, m = keys.length; i < m; i++) {
      MathJax.Extension["TeX/AMSmath"].labels[keys[i]] = labels[keys[i]];
    }
  });

  //
  //  Configure TeX to use the external page url rather than the base url
  //    if the id is on a different page.
  //
  MathJax.Hub.Config({
    TeX: {
      equationNumbers: {
        formatURL(id, base) {
          return (urls[id] || base) + '#' + id;
        }
      }
    }
  });
})();
</script>

将此放在之前,该脚本会自己加载MathJax.js。您需要从要链接到的所有页面的MathJax.Extension["TeX/AMSmath"].labels中收集数据,并将其放在上面的var labels中(将所有页面中的数据合并到一个对象中),然后创建映射从ID到上面var urls中的页面网址。在此示例中,文件\label{xyz2}\tag{2}中有link-cross-page2.html,并且包含此代码的页面上的任何\ref{xyz2}都将链接到link-cross-page2.html#mjx-eqn-2

其余的代码仅在加载时将标签复制到AMSmath标签列表中,并配置TeX的formatURL()函数在列表中查找并使用该文件(如果存在),否则使用页面的基本URL。

请注意,这确实要求页面上的方程式编号不同,但是我认为情况就是这样,否则您将无法确定链接到哪个页面。