我已经知道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>";
}
}
);
。 我知道是这样,但是接下来有什么办法解决此类问题吗?
答案 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。
请注意,这确实要求页面上的方程式编号不同,但是我认为情况就是这样,否则您将无法确定链接到哪个页面。