如何配置 MathJax (AsciiMath) 以允许使用千位分隔符
How to configure MathJax (AsciiMath) to permit thousands separators
带有 AsciiMath 的 MathJax 将表达式 1,000/5
呈现为 1, 000/5,其中分数的分子仅显示为 000 而不是 1,000。
JSFiddle:https://jsfiddle.net/kai100/wLhbqkru/
MathJax 文档没有提及千位分隔符。
下面的 Stack Overflow 回答回答了这个关于 TeX 输入的问题,但我需要它以 AsciiMath 格式输入,并且无法通过将 "Tex" 更改为 "AsciiMath" 来使其工作配置文件:
如有任何帮助,我们将不胜感激。谢谢。
很遗憾,AsciiMath 配置选项没有正确记录。
您可以通过
指定
//...
AsciiMath: {
decimal: ","
},
//...
在您的 MathJax 配置块中。
请注意,这会导致(例如 (1,2) )的各种解析复杂化。
为了完成,文档位于 http://docs.mathjax.org/en/latest/options/input-processors/AsciiMath.html
设置
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 个或更多数字的所有数字(即使它们没有以逗号开头)。这将需要一个 post-filter 返回生成的 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);
});
});
应该可以。
带有 AsciiMath 的 MathJax 将表达式 1,000/5
呈现为 1, 000/5,其中分数的分子仅显示为 000 而不是 1,000。
JSFiddle:https://jsfiddle.net/kai100/wLhbqkru/
MathJax 文档没有提及千位分隔符。
下面的 Stack Overflow 回答回答了这个关于 TeX 输入的问题,但我需要它以 AsciiMath 格式输入,并且无法通过将 "Tex" 更改为 "AsciiMath" 来使其工作配置文件:
如有任何帮助,我们将不胜感激。谢谢。
很遗憾,AsciiMath 配置选项没有正确记录。
您可以通过
指定//...
AsciiMath: {
decimal: ","
},
//...
在您的 MathJax 配置块中。
请注意,这会导致(例如 (1,2) )的各种解析复杂化。
为了完成,文档位于 http://docs.mathjax.org/en/latest/options/input-processors/AsciiMath.html
设置
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 个或更多数字的所有数字(即使它们没有以逗号开头)。这将需要一个 post-filter 返回生成的 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);
});
});
应该可以。