检测要在MathJax中处理的数学运算

时间:2019-05-11 21:43:27

标签: javascript html mathjax

我正在使用MathJax,并且遇到以下情况:

  

当页面包含MathJax将正确处理和呈现的一些Math时,我想运行一些代码

考虑以下示例:

<p>
This is a page containing an equation: $b^2 - 4ac$.
</p>

此处的函数或我可以使用的任何函数都将返回true。但是,如果该页面不包含要处理的TeX代码块(或任何与配置MathJax触发方式有关的代码),则该API将返回false

更多细节

这与修改渲染管道无关。 MathJax最终会完成工作,我对此表示满意。我只需要一种可靠的方法(希望由库的API提供)来检测该页面具有一些需要处理的数学。

MathJax是否具有可用于获取此信息的功能?另外,为了完整起见,我添加了配置MathJax的方式(内联):

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX", "output/CommonHTML"],
    tex2jax: {
      inlineMath: [ ['$','$'], ["\\(","\\)"] ],
      displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
      processEscapes: true
    },
    "CommonHTML": { linebreaks: { automatic: true } }
  });
</script>
<script src="//mathjax.rstudio.com/latest/MathJax.js?config=TeX-MML-AM_CHTML"></script>

或者...

如果我要问的内容实际上不可行,那怎么办?

  

我可以在渲染管道中附加一个事件,以便在MathJax完成渲染数学运算后执行回调函数吗?

我看到了MathJax startup sequence,而答案可能就在那里。但是,当页面上没有数学运算时,我也看到触发器也在运行。


问题排查

我尝试检测是否存在添加到所生成元素中的类,例如MathJax_Previewmjx-chtml。但是此代码不可靠,因为它需要在渲染过程之后触发。这会增加计算时间。

我找不到用于查询要渲染的数学运算的API,但似乎很奇怪,MathJax没有公开这样的东西。

1 个答案:

答案 0 :(得分:1)

可能的解决方法是创建自己的类,然后测试DOM中是否存在该类,然后根据需要动态嵌入mathjax

带有数学代码段:

var test  = document.querySelectorAll('.math2Process');

if(test.length>0){
  var mathJax_config = document.createElement('script');
  mathJax_config.setAttribute('type','text/x-mathjax-config');
  mathJax_config.text = `MathJax.Hub.Config({
      extensions: ["tex2jax.js"],
      jax: ["input/TeX", "output/CommonHTML"],
      tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"] ],
        displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
        processEscapes: true
      },
      "CommonHTML": { linebreaks: { automatic: true } }
    });`
  var mathJax_script = document.createElement('script');

  mathJax_script.setAttribute('src','//mathjax.rstudio.com/latest/MathJax.js?config=TeX-MML-AM_CHTML');

  document.head.appendChild(mathJax_config);
  document.head.appendChild(mathJax_script);
}
<p class="math2Process">
This is a page containing an equation: $b^2 - 4ac$.
</p>

相同但没有数学:

var test  = document.querySelectorAll('.math2Process');

if(test.length>0){
  var mathJax_config = document.createElement('script');
  mathJax_config.setAttribute('type','text/x-mathjax-config');
  mathJax_config.text = `MathJax.Hub.Config({
      extensions: ["tex2jax.js"],
      jax: ["input/TeX", "output/CommonHTML"],
      tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"] ],
        displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
        processEscapes: true
      },
      "CommonHTML": { linebreaks: { automatic: true } }
    });`
  var mathJax_script = document.createElement('script');

  mathJax_script.setAttribute('src','//mathjax.rstudio.com/latest/MathJax.js?config=TeX-MML-AM_CHTML');

  document.head.appendChild(mathJax_config);
  document.head.appendChild(mathJax_script);
}
<p>
This is a page containing an equation: $b^2 - 4ac$.
</p>