HTML теги внутри mathjax - PullRequest
       8

HTML теги внутри mathjax

0 голосов
/ 16 января 2019

Я уже знаю, что 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{} внутри уравнения. Я знаю, что так и должно быть , , но есть ли способ обойти такие проблемы?

1 Ответ

0 голосов
/ 17 января 2019

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 при его загрузке и настраивает функцию formatURL() TeX для поиска файла в вашем списке и использования его, если он существует, в противном случае он использует базовый URL страницы.

Обратите внимание, что для этого требуется, чтобы номера уравнений были разными на разных страницах, но я предполагаю, что это так, иначе вы не могли бы указать, на какую страницу ссылаться.

...