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

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

Без примера того, что вы пробовали, сложно дать какой-либо практический совет. Обратитесь к stackoverflow.com/help/how-to-ask за советом.

Peter Krautzberger 16.01.2019 09:30

Похоже, вы просто хотите добавить класс к частям входного фрагмента TeX. Для этого docs.mathjax.org/en/latest/tex.html#html есть \class{name}{math} - вы пробовали это?

Peter Krautzberger 17.01.2019 11:52

@PeterKrautzberger, нет, я не делал, так как на самом деле я не добавляю просто имя класса к математическим ссылкам, чтобы придать им стиль, вместо этого я пытался добавить прослушиватель событий onclick в \ ref {} и \ eqref {}, а имя класса было средством собрать все \ ref и \ eqref, но не всю математику.

owari 17.01.2019 15:14

Верно, и эта часть должна работать после того, как вы добавили классы таким образом, чтобы не нарушить MathJax. Единственное дополнительное предостережение - вам нужно дождаться рендеринга MathJax, но для этого должен работать наблюдатель мутаций.

Peter Krautzberger 17.01.2019 20:59

@PeterKrautzberger, ваша идея сработала, только была одна проблема: если я использую replace (/ (\\ eqref \ {[^ \}] + \}) / g, "\\ class {eqCitationSpan} {$ 1}") он работает внутри уравнений, но не в основном тексте, который показывает, например, \ class {eqCitationSpan} {(10)}, и если я использую replace (/ (\\ eqref \ {[^ \}] + \}) / g, "$ \\ class {eqCitationSpan} {$ 1} $") , то он отлично работает внутри основного скрипта, но показывает $ (10) $ внутри уравнений, что неприятно. Я решил проблему, правда, не естественным путем. Кстати, если вы добавите свой комментарий выше в качестве ответа, я буду рад отметить его как принятый :)

owari 13.02.2019 20:20
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
3
5
809
1

Ответы 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 выше (объединить данные со всех страниц в один объект) и создать сопоставление из идентификаторов в 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. Я добавил более важные детали кода к своему вопросу и прошу прощения за неоднозначность вопроса относительно того, что я имел в виду под словом «страница».

owari 17.01.2019 15:54

См. Этот MathJax проблема, чтобы узнать, как использовать MathJax версии 3 для обработки обеих многостраничных ссылок (как описано здесь) вместе с запросом одностраничного подхода с несколькими блоками от @owari.

Davide Cervone 13.02.2021 01:42

Другие вопросы по теме