【问题标题】:MathJax: Can't render \begin{cases}…\end{cases} using JekyllMathJax:无法使用 Jekyll 渲染 \begin{cases}...\end{cases}
【发布时间】:2021-04-29 22:34:23
【问题描述】:

我们在 our course website 上使用 MathJax,它在 Jekyll 中实现并托管在 GitHub 页面上。对于小的、简单的方程,MathJax 效果很好,但我从来没有能够得到更复杂的方程来工作。我花了很多时间进行调查和实验,所以我想我终于可以在这里问了。

例如,下面的渲染失败:

$$
S_{i} =
\begin{cases}
    X_{1} & \text{if i = 1}\\
    \alpha \cdot X_{i} + (1 - \alpha) \cdot S_{i-1} & \text{if i $>$ 1}
\end{cases}
$$ 

Web 浏览器中呈现的输出实际上是空白的。

当我查看呈现的 html 时,我看到:

<p>
<span class="MathJax_Preview" style="color: inherit; display: none;"></span>
<span id="MathJax-Element-5-Frame" class="mjx-chtml MathJax_CHTML" tabindex="0" data-mathml="
    <math
        xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; />" role="presentation" style="font-size: 113%; position: relative;">
        <span id="MJXc-Node-149" class="mjx-math" aria-hidden="true">
            <span id="MJXc-Node-150" class="mjx-mrow"></span>
        </span>
        <span class="MJX_Assistive_MathML" role="presentation">
            <math
                xmlns="http://www.w3.org/1998/Math/MathML">
            </math>
        </span>
    </span>
    <script type="math/tex" id="MathJax-Element-5">% 
        <![CDATA[ S_{i} = \begin{cases} X_{1} & \text{if i = 1}\\ \alpha \cdot X_{i} + (1 - \alpha) \cdot S_{i-1} & \text{if i $>$ 1} \end{cases} %]]>
    </script>
</p>

我不是 LaTeX 专家,所以我经常在 https://www.codecogs.com/latex/eqneditor.php 或 OverLeaf 等在线编辑器中编写方程(或至少检查它们)。它们在那里渲染得很好。

我首先在 tex StackExchange 上问过这个问题 (link),但他们说这是题外话。


更新:我最终在 MathJax 用户组 (link) 上提出了这个问题,并收到了一个可行的解决方案,详细描述了 on GitHub。感谢大家的回复!

【问题讨论】:

  • 听起来你也应该在github.com/mathjax/MathJax/issues 上搜索/询问,因为这是最权威的询问地点。鉴于支持the docs say 和cases,您可能遇到了错误。如果是这样,那么询问 SO 不会为每个人解决问题 =)
  • (同样在 LaTeX 注释中,块应以 \[ 打开并以 \] 关闭。双美元符号是纯 TeX 表示法,从技术上讲,LaTeX 不支持,因此使用正确的语法,这是一件小事,通常仍然是好的做法)

标签: javascript html markdown jekyll mathjax


【解决方案1】:

看起来 Jekyll 将数学作为 MathJax &lt;script&gt; 标签 (&lt;script type="math/tex"&gt;) 插入,并且该标签的内容是 TeX 表达式。不幸的是,插件插入了一些额外的文本来将内容标记为CDATA。这在 HTML 中不是必需的,但对于 XHTML 可能是必需的。你的页面是 XHTML(我不知道 Jekyll 产生了什么)?

无论如何,插件很可能是最初插入的

<script type="math/tex">
% <![CDATA[
... your expression...
% ]]>
</script>

这会起作用(即使没有必要),因为 TeX 中的 % 标记了注释,所以 &lt;![CDATA[ 将被忽略,而结束的 ]]&gt; 也将被忽略。

除了 GitHub 页面删除了换行符,所以你得到了

<script type="math/tex">% <![CDATA[... your expression...% ]]></script>

全部在一条线上。这意味着第一个 % 将表达式的整个其余部分变成了注释,并且数学被有效地注释掉了。这意味着您没有得到任何输出,因为数学表达式实际上是空的。

这个以前出现过,我提供了a work-around 对于版本 2:

<script type="text/x-mathjax-config">
MathJax.Hub.Register.StartupHook('TeX Jax Ready', function () {
  MathJax.InputJax.TeX.prefilterHooks.Add(function (data) {
    data.math = data.math.replace(/^% <!\[CDATA\[/, '').replace(/%\]\]>$/, '');
  });
});
</script>

还有版本 3:

<script>
MathJax = {
  startup: {
    ready: function() {
      var HTMLDomStrings = MathJax._.handlers.html.HTMLDomStrings.HTMLDomStrings;
      var handleTag = HTMLDomStrings.prototype.handleTag;
      HTMLDomStrings.prototype.handleTag = function (node, ignore) {
        if (this.adaptor.kind(node) === '#comment') {
          var text = this.adaptor.textContent(node);
          if (text.match(/^\[CDATA\[(?:\n|.)*\]\]$/)) {
            this.string += '<!'
            this.extendString(node, text);
            this.string += '>';
            return this.adaptor.next(node);
          }
        }
        return handleTag.call(this, node, ignore);
      }
      MathJax.startup.defaultReady();
      MathJax.startup.document.inputJax[0].preFilters.add(function (data) {
        data.math.math = data.math.math.replace(/^% <!\[CDATA\[/, '').replace(/%\]\]>$/, '');
      });
    }
  }
};
</script>

在任何情况下,导致问题的是(可能不必要的)CDATA“cmets”以及换行符的删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-14
    • 2021-12-07
    • 2021-10-08
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2016-12-09
    相关资源
    最近更新 更多