1

使用 AsciiMath 的 MathJax 将表达式呈现1,000/5为 1, 000/5,其中分数的分子仅显示为 000 而不是 1,000。

JSFiddle:https ://jsfiddle.net/kai100/wLhbqkru/

MathJax 文档对数千个分隔符保持沉默。

下面的 Stack Overflow 答案为 TeX 输入回答了这个问题,但我需要它以 AsciiMath 格式输入,并且无法通过在配置文件中将“Tex”更改为“AsciiMath”来使其工作: mathjax commas in digits

任何帮助将非常感激。谢谢你。

4

2 回答 2

2

环境

decimal: ','

告诉 AsciiMath 使用欧洲数字格式,它使用逗号作为小数位分隔符而不是句点。这就是为什么您不再将“0.12”视为数字的原因。AsciiMath 没有每三位解析逗号的机制。

我可以建议的最好的方法是使用 AsciiMath 预过滤器来预处理 AsciiMath 以在 AsciiMath 解析表达式之前删除逗号。添加类似的东西

<script type="text/x-mathjax-config">
MathJax.Hub.Register.StartupHook("AsciiMath Jax Ready", function () {
  function removeCommas(n) {return n.replace(/,/g,'')}
  MathJax.InputJax.AsciiMath.prefilterHooks.Add(function (data) {
    data.math = data.math.replace(/\d{1,3}(?:\,\d\d\d)+/g,removeCommas);
  });
});
</script>

到加载 MathJax.js 的脚本之前的页面应该可以解决问题。请注意,这意味着逗号也不会出现在输出中;没有自然的方法可以做到这一点,除非您想将逗号添加到所有具有 4 个或更多数字的数字(即使它们没有逗号开头)。这将需要一个后过滤器来返回生成的 MathML 并将数字转换为逗号。就像是:

MathJax.Hub.Register.StartupHook("AsciiMath Jax Ready", function () {
  function removeCommas(n) {
    return n.replace(/,/g,'');
  }
  function addCommas(n){
    return n.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  }
  function recursiveAddCommas(node) {
    if (node.isToken) {
      if (node.type === 'mn') {
        node.data[0].data[0] = addCommas(node.data[0].data[0]);
       }
    } else {
      for (var i = 0, m = node.data.length; i < m; i++) {
        recursiveAddCommas(node.data[i]);
      }
    }
  }
  MathJax.InputJax.AsciiMath.prefilterHooks.Add(function (data) {
    data.math = data.math.replace(/\d{1,3}(?:\,\d{3})+/g, removeCommas);
  });
  MathJax.InputJax.AsciiMath.postfilterHooks.Add(function (data) {
    recursiveAddCommas(data.math.root);
  });
});

应该管用。

于 2017-09-23T19:19:04.397 回答
2

遗憾的是,AsciiMath 配置选项没有正确记录。

您可以通过以下方式指定

//...
   AsciiMath: {
         decimal: ","
   },
//...

在您的 MathJax 配置块中。

请注意,这会导致 (例如 (1,2) ) 的各种解析复杂化。

为了完成,文档位于http://docs.mathjax.org/en/latest/options/input-processors/AsciiMath.html

于 2017-09-21T08:51:19.780 回答