Я уже знаю, что mathjax допускает очень ограниченные html-коды внутри математических областей, однако у меня есть многостраничный документ, каждый из которых имеет ряд уравнений, поэтому для правильной работы \eqref{} я заключил эти команды в интерактивный <span>, который направляет на страница, содержащая адресованное уравнение, до того, как страница будет прокручена до уравнения где-нибудь на этой странице.
Соответствующая часть заявки на уценку - это, во-первых,
content=content
.replace(/(\\ref\{[^\}]+\})/g, "<span class='eqCitationSpan'>$1</span>")
.replace(/(\\eqref\{[^\}]+\})/g, "<span class='eqCitationSpan'>$1</span>")
а потом,
// 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>";
}
}
);
Все работает хорошо, за исключением случаев, когда я хочу обратиться к уравнению из другого уравнения. В этом случае MathJax вообще не компилирует уравнение, а только команду \eqref{} внутри уравнения. Я знаю, что так задумано, но тогда какой способ решения таких проблем?
Похоже, вы просто хотите добавить класс к частям входного фрагмента TeX. Для этого docs.mathjax.org/en/latest/tex.html#html есть \class{name}{math} - вы пробовали это?
@PeterKrautzberger, нет, я не делал, так как на самом деле я не добавляю просто имя класса к математическим ссылкам, чтобы придать им стиль, вместо этого я пытался добавить прослушиватель событий onclick в \ ref {} и \ eqref {}, а имя класса было средством собрать все \ ref и \ eqref, но не всю математику.
Верно, и эта часть должна работать после того, как вы добавили классы таким образом, чтобы не нарушить MathJax. Единственное дополнительное предостережение - вам нужно дождаться рендеринга MathJax, но для этого должен работать наблюдатель мутаций.
@PeterKrautzberger, ваша идея сработала, только была одна проблема: если я использую replace (/ (\\ eqref \ {[^ \}] + \}) / g, "\\ class {eqCitationSpan} {$ 1}") он работает внутри уравнений, но не в основном тексте, который показывает, например, \ class {eqCitationSpan} {(10)}, и если я использую replace (/ (\\ eqref \ {[^ \}] + \}) / g, "$ \\ class {eqCitationSpan} {$ 1} $") , то он отлично работает внутри основного скрипта, но показывает $ (10) $ внутри уравнений, что неприятно. Я решил проблему, правда, не естественным путем. Кстати, если вы добавите свой комментарий выше в качестве ответа, я буду рад отметить его как принятый :)






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 выше (объединить данные со всех страниц в один объект) и создать сопоставление из идентификаторов в URL-адреса страниц в var urls выше. . В этом примере \label{xyz2}\tag{2} находится в файле link-cross-page2.html, и любой \ref{xyz2} на странице, содержащей этот код, будет ссылаться на link-cross-page2.html#mjx-eqn-2.
Остальная часть кода просто копирует ваши метки в список меток AMSmath, когда он загружен, и настраивает функцию TeX formatURL() для поиска файла в вашем списке и использования его, если он существует, в противном случае он использует базовый URL-адрес страницы.
Обратите внимание, что для этого требуется, чтобы номера уравнений на разных страницах были разными, но я предполагаю, что это так и для вас, иначе вы не могли бы сказать, на какую страницу ссылаться.
интересно, как вы применили изменение URL вместо чисел в уравнениях. Однако у меня нет действительно разных HTML-страниц, каждая из которых имеет собственный URL-адрес, вместо этого у меня есть разные div, только один отображается за раз, а другие скрыты, например, как несколько вкладок используются на одной странице. Функция, которая должна контролировать, какая страница должна отображаться, - это changePage(), и она работает на основе текущего значения глобальной переменной currentPage. Я добавил более важные детали кода к своему вопросу и прошу прощения за неоднозначность вопроса относительно того, что я имел в виду под словом «страница».
См. Этот MathJax проблема, чтобы узнать, как использовать MathJax версии 3 для обработки обеих многостраничных ссылок (как описано здесь) вместе с запросом одностраничного подхода с несколькими блоками от @owari.
Без примера того, что вы пробовали, сложно дать какой-либо практический совет. Обратитесь к stackoverflow.com/help/how-to-ask за советом.