当前位置: 首页 > 知识库问答 >
问题:

检测要在MathJax中处理的Math的存在

阳修永
2023-03-14

我使用MathJax,我有以下场景:

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

考虑这个例子:

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

在这里,函数,或者我可以使用的任何东西,都会返回true。但是如果页面不包含要处理的TeX代码块(或者任何根据MathJax配置如何触发的代码),那么这个应用编程接口将返回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的启动序列,我的答案可能就在这里。然而,我看到当页面上没有数学时,触发器也会运行。

我已经尝试检测诸如MathJax_Previewmjx-chtml之类的类的存在,它们被添加到生成的元素中。但是这个代码不可靠,因为它需要在呈现过程后触发。这增加了计算时间。

我找不到我正在寻找的用于查询要呈现的math的存在的API,但MathJax没有公开这样的东西似乎很奇怪。

共有2个答案

澹台建华
2023-03-14

下面的代码将检查当前页面是否需要MathJax,只有在需要时才加载脚本:

<script>
document.addEventListener('DOMContentLoaded', () => {
  const skipHtmlTags = ['script', 'noscript', 'style', 'textarea', 'pre', 'code', 'annotation', 'annotation-xml'].map((v) => `:not(${v})`).join('')
  const ignoreHtmlClasses = ['mathjax_ignore'].map((v) => `:not(.${v})`).join('')
  const requiresMathjax = Array.from(document.body.querySelectorAll('*' + skipHtmlTags + ignoreHtmlClasses))
    .some((el) => el.textContent.match(/\\\(|\$\$|\\\[/))

  if (requiresMathjax) {
    const sc = document.createElement('script')
    sc.setAttribute('src', 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.0/es5/tex-mml-chtml.min.js')
    sc.setAttribute('integrity', 'sha512-9DkJEmXbL/Tdj8b1SxJ4H2p3RCAXKsu8RqbznEjhFYw0cFIWlII+PnGDU2FX3keyE9Ev6eFaDPyEAyAL2cEX0Q==')
    sc.setAttribute('crossorigin', 'anonymous')
    sc.setAttribute('referrerpolicy', 'no-referrer')
    document.head.appendChild(sc)
  }
})
</script>

缩小的:

document.addEventListener("DOMContentLoaded",()=>{var t=["script","noscript","style","textarea","pre","code","annotation","annotation-xml"].map(t=>`:not(${t})`).join(""),e=["mathjax_ignore"].map(t=>`:not(.${t})`).join("");if(Array.from(document.body.querySelectorAll("*"+t+e)).some(t=>t.textContent.match(/\\\(|\$\$|\\\[/))){const n=document.createElement("script");n.setAttribute("src","https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.0/es5/tex-mml-chtml.min.js"),n.setAttribute("integrity","sha512-9DkJEmXbL/Tdj8b1SxJ4H2p3RCAXKsu8RqbznEjhFYw0cFIWlII+PnGDU2FX3keyE9Ev6eFaDPyEAyAL2cEX0Q=="),n.setAttribute("crossorigin","anonymous"),n.setAttribute("referrerpolicy","no-referrer"),document.head.appendChild(n)}});

你有inlineMath:[['$','$'],[“\\(“,“\\)”],,但你可能想停止只使用一个美元符号——你会得到太多的误报。如果想继续使用单美元符号,可以在脚本中更新正则表达式。

如果您想要一个不同的脚本,请使用以下网址更新srcintegrity属性:https://cdnjs.com/libraries/mathjax(或您喜欢的CDN)

闻人德庸
2023-03-14

一种可能的解决方法是创建自己的类,然后测试这个类是否存在于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>
 类似资料:
  • 问题内容: 看来,当从multiprocessing.Pool进程引发异常时,没有堆栈跟踪或任何其他指示其已失败的迹象。例: 打印1并静默停止。有趣的是,引发BaseException可以工作。有什么方法可以使所有异常的行为与BaseException相同? 问题答案: 我有一个合理的解决方案,至少用于调试目的。我目前没有一个可以在主要流程中引发异常的解决方案。我的第一个想法是使用装饰器,但是您只

  • 我有一个盒子的图像。我试图检测角点并从圆圈中标记这些角点。我正在为此使用以下代码:

  • 问题内容: 如何检测Java中给定的SQL数据库中是否存在某个表? 问题答案: 您可以使用DatabaseMetaData.getTables()获取有关现有表的信息。 该方法透明地工作,并且独立于数据库引擎。我认为它查询后台的信息模式表。 编辑: 这是一个显示所有现有表名的示例。

  • 异常检测与处理 [MCE] mce=off 彻底禁用MCE(CONFIG_X86_MCE) [MCE] mce=dont_log_ce 不为已纠正错误(corrected error)记录日志。 [MCE] mce=容错级别[,超时] 容错级别(还可通过sysfs设置): 0 在出现未能纠正的错误时panic,记录所有已纠正的错误 1(默认值) 在出现未能纠正的错误时panic或SIGBUS,记录

  • 在 Spark 流式处理中,如何检测空批次? 让我们以有状态流式处理字数为例:https://github.com/apache/spark/blob/master/examples/src/main/java/org/apache/spark/examples/streaming/JavaStatefulNetworkWordCount.java。是否可以仅在将新单词添加到流中时才打印字数RDD

  • 问题内容: 运行测试时出现以下异常。我正在使用Mockito进行嘲笑。Mockito库提到的提示无济于事。 来自的测试代码。当我运行以下测试时,我看到了异常。 问题答案: 您是在嘲笑内部嵌套嘲笑。在完成对的模拟之前,您正在呼叫,它会进行一些模拟。执行此操作时,Mockito不喜欢它。 更换 与 要了解为什么这会导致问题,您需要稍微了解Mockito的工作方式,并且还需要知道Java中表达式和语句按