如何配置MathJax(AsciiMath)以允许数千个分隔符

时间:2017-09-21 00:52:14

标签: mathjax asciimath

带有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

非常感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

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

您可以通过

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

在MathJax配置块中。

请注意,这会导致各种解析并发症(例如,(1,2))。

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

答案 1 :(得分:1)

设置

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);
  });
});

应该有用。