【问题标题】:MathJax won't display MathML formula with a TeX annotationMathJax 不会显示带有 TeX 注释的 MathML 公式
【发布时间】:2021-10-12 23:12:03
【问题描述】:

我使用 MathJax 3.2.0 在网页上显示 MathML 公式:

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow data-mjx-texclass="INNER">
    <mo data-mjx-texclass="OPEN">{</mo>
    <mtable columnspacing="1em" rowspacing="4pt">
      <mtr>
        <mtd>
          <mi>x</mi>
        </mtd>
        <mtd>
          <mi>y</mi>
        </mtd>
      </mtr>
      <mtr>
        <mtd>
          <mi>z</mi>
        </mtd>
        <mtd>
          <mi>v</mi>
        </mtd>
      </mtr>
    </mtable>
    <mo data-mjx-texclass="CLOSE">}</mo>
  </mrow>
</math>

它由 MathJax 显示(不是浏览器本身),带有上下文菜单等。

此公式的 MathML 代码也是由 MathJax 作为服务器端 node.js 模块从 TeX 生成的。

但是,在我尝试将原始 TeX 代码注入(服务器端,通过编辑 HTML)作为语义注释(见下文)后,MathJax 在客户端失败:Math输出错误,带有此浮动工具提示:this.variant[t] is undefined。仅当&lt;annotation&gt; 标记不为空时才会发生这种情况。

我发现this.variant[t] 在函数getVariantgetChar 中未定义,t 在某些情况下是"",在其他情况下是undefined

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow data-mjx-texclass="INNER">
    <mo data-mjx-texclass="OPEN">{</mo>
    <mtable columnspacing="1em" rowspacing="4pt">
      <mtr>
        <mtd>
          <mi>x</mi>
        </mtd>
        <mtd>
          <mi>y</mi>
        </mtd>
      </mtr>
      <mtr>
        <mtd>
          <mi>z</mi>
        </mtd>
        <mtd>
          <mi>v</mi>
        </mtd>
      </mtr>
    </mtable>
    <mo data-mjx-texclass="CLOSE">}</mo>
  </mrow>
<semantics>
<annotation encoding="application/x-tex">\begin{Bmatrix} x &amp; y \\ z &amp; v \end{Bmatrix}</annotation>
</semantics>
</math>

MathJax 附加如下:

<script>
window.MathJax = {
    "loader":{"load":["ui\/safe"]},
    "options":{
        "skipHtmlTags":["script","noscript","style","textarea","pre","code","annotation","annotation-xml","tt","nowiki","kbd","syntaxhighlight"],
        "ignoreHtmlClass":["tex2jax_ignore","diff"],
        "menuOptions":{
            "settings":{
                "zoom":"DoubleClick",
                "semantics":true
            },
            "annotationTypes":{
                "TeX":["application\/x-tex"],
                "OpenMath":["OpenMath"]
            }
        },
        "enableEnrichment":true
    }
};
</script>
<script src="(skipped)/node_modules/mathjax-full/es5/mml-chtml.js?locale=ru"></script>

可能出了什么问题?

UPD:在&lt;math&gt; 之后移动打开&lt;semantics&gt;,即用&lt;semantics&gt; 包装MathML 代码解决了这个问题。

【问题讨论】:

  • 如果将 开始标签移到 上方会怎样?
  • @okzoomer,同样的。
  • 使用this 作为参考。我不确定您是如何“注入”的,但请确保您正在通过 node.js 进行注释,而不是手动将其添加到 html 中。还可以考虑在 mathjax github repo 上打开一个问题。
  • @okzoomer,我编辑 HTML 服务器端添加注释。
  • 是的,将 开始标记移到 之前,即 之后就是我所说的。我之前给出的链接也有一个例子来说明这一点。无论如何,很高兴你知道了!

标签: javascript mathjax mathml


【解决方案1】:

您的&lt;semantics&gt; 节点无效。 &lt;semantics&gt; 的第一个子节点应该是表示 MathML 节点,而不是 &lt;annotation&gt; 节点。即&lt;semantics&gt;的第一个孩子应该是被注释的数学,第二个和后续的节点应该是注释节点。有关详细信息,请参阅MathML specifcation。所以

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<semantics>
  <mrow data-mjx-texclass="INNER">
    <mo data-mjx-texclass="OPEN">{</mo>
    <mtable columnspacing="1em" rowspacing="4pt">
      <mtr>
        <mtd>
          <mi>x</mi>
        </mtd>
        <mtd>
          <mi>y</mi>
        </mtd>
      </mtr>
      <mtr>
        <mtd>
          <mi>z</mi>
        </mtd>
        <mtd>
          <mi>v</mi>
        </mtd>
      </mtr>
    </mtable>
    <mo data-mjx-texclass="CLOSE">}</mo>
  </mrow>
  <annotation encoding="application/x-tex">\begin{Bmatrix} x &amp; y \\ z &amp; v \end{Bmatrix}</annotation>
</semantics>
</math>

正如您在更新中指出的那样,这是注释此数学的正确方法。

您似乎正在使用 MathJax 来生成原始的 MathML。如果您使用 MathJax 上下文菜单在浏览器中执行此操作,请注意“显示为”菜单中有一个项目,您可以选择该项目以将原始 TeX 作为注释包含在内,因此您不必这样做这个你自己。如果您使用mathjax-node,您也可以配置mathjax-node 来设置该选项。

【讨论】:

  • 是的,我知道,并在我的回答中指出了这一点。我的回答告诉你为什么这是正确的答案,以及为什么你的原件不正确。
猜你喜欢
  • 2017-07-11
  • 2018-02-14
  • 1970-01-01
  • 2011-11-24
  • 2017-11-04
  • 2019-07-12
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
相关资源
最近更新 更多