我可以为智能匹配配置 MathJax 吗?

Can I configure MathJax for smart matching?

我可以指示 MathJax 接受多个基本分隔符对吗?

背景

我使用美元符号内联定界符在浏览器上呈现数学。

这会导致诸如 500$ + 200$ 之类的文本出现问题,它与 MathJax 语法匹配并呈现为数学。避免将非数学内容呈现为数学内容的常用推荐方法是启用 processEscapes.

MathJax = {
  tex: {
    inlineMath: [ ["$", "$"] ],
    processEscapes: true,
  },
};

问题

转义方法需要重写所有非数学语法的内容。之前的 500$ + 200$ 变为 500$ + 200$。这不是一个理想的解决方案,因为大多数内容都不是数学题。当内容代码繁多时情况更糟。

这是一个编码问题,我不想传递给内容作者。

一个简单的改进是期望所有内联数学内容都是 $tidy like this$,其中表达式周围没有白色-space。 Obsidian 和可能的其他降价编辑器似乎都在遵循这种模式,尽管它仍然存在缺陷。

// This doesn't work, is there a similar approach that works?
inlineMath: [ [/$(?=[^\s])/, /(?<=[^\s])$/] ]

这确实是我用于 enable/disable 基于页面的数学渲染的分隔符表达式,如 MathJax 的 recommended。问题发生在 MathJax 解析整个页面的混合内容上。

我尝试过/考虑过的

1。使用分隔符集 [" $", "$ "], [" $", "$"], ["$", "$ "]
2。自己解析内容,将每个匹配的表达式分别发送给MathJax
3。即时添加转义斜杠

这是一个允许您为您提供的分隔符指定模式的配置(同时仍然处理您不提供模式的分隔符)。模式必须与数组前两个条目中给出的定界符相匹配,但这是您的情况,因此对您来说应该不是问题。 (更通用的解决方案是可能的,但需要做更多您不需要的工作。)

MathJax = {
  tex: {
    inlineMath: [
      ['$', '$', /$(?=[^\s])/, /(?<=[^\s])$/],  // adds two extra parameters for pattern to use
      ['\(', '\)']
    ]
  },
  startup: {
    ready() {
      const {FindTeX} = MathJax._.input.tex.FindTeX;
      const {selectOptionsFromKeys} = MathJax._.util.Options;

      //
      //  Subclass the FindTeX class to handle the delimiter patterns 
      //
      class myFindTeX extends FindTeX {
        addPattern(starts, delims, display) {
          let [open, close, start, end] = delims;
          //
          //  If the extra patterns are given...
          //
          if (start && end) {
            //
            //  The patterns are expected as strings, so convert RegExp to strings without surrounding /
            //
            starts.push(start.toString().slice(1).replace(/\/$/, ''));
            this.end[open] = [close, display, this.endPattern(null, end.toString().slice(1).replace(/\/$/, ''))];
          } else {
            //
            //  Otherwise do the usual delimiter handling
            //
            super.addPattern(starts, delims, display);
          }
        }
      }

      //
      //  Make an instance of our FindTeX subclass (with the configured options)
      //    and tell the TeX input jax to use our subclass
      //
      const options = selectOptionsFromKeys(MathJax.config.tex, myFindTeX.OPTIONS);
      MathJax.config.tex.FindTeX = new myFindTeX(options);

      MathJax.startup.defaultReady();
    }
  }
};

这里,我们subclass FindTeX class 并重写保存分隔符匹配数据的方法。它检查是否给出了模式,如果是,则使用这些模式进行模式匹配而不是原始字符串(尽管为了让开始定界符能够找到 closing-delimiter 信息,仍然需要这些模式,并且进行适当的 close-delimiter 处理)。

我认为这会满足您的需求。它可以做成更正式的扩展,但由于它相对较短,您可以相当轻松地使用它。