Markdown 和 MathJax 共存有什么比较好的办法?

2015-12-01 18:05:48 +08:00
 phoenixlzx

最近折腾了下对 mathjax 的支持,用 mathjax-node 库。

由于 markdown 会直接处理一些公式里的符号所以先用 mathjax 处理一遍 markdown 的文本,然后再交给 marked 处理。

然后发现 mathjax 会把一些代码块里的东西当作公式处理,于是整个代码块没法看了...
(特别是 nginx 配置或者 perl 语法里会出现此类情况)

尝试过对一些字符进行 escape 之后丢给 mathjax ,处理完再替换回来交给 marked ,不过明显 coverage 不够,还是会在很多格式下被绕过。

还有一个思路但是尚未尝试,就是用什么方法可以检测到 mathjax 公式用特殊符号替换掉, marked 处理完之后再替换回来把 html 交给 mathjax 处理。

各位有什么比较好的方案可以在不损失功能的情况下让二者并存么?

5717 次点击
所在节点    Markdown
11 条回复
sengxian
2015-12-01 18:26:33 +08:00
虽然我也没搞过,但我觉得 farbox.com 处理的还行,不过 \( \( 的行内公式 要变成 \\( \\(
kingcos
2015-12-01 18:36:32 +08:00
同问。。。之前 Hexo 用的这个插件
http://catx.me/2014/03/09/hexo-mathjax-plugin/
seqs
2015-12-01 18:39:30 +08:00
说下我的方案吧, mathjax 公式外层增加识别串,例如:

^^^mathjax

f(x) = \int_{-\infty}^\infty
\hat f(\xi)\,e^{2 \pi i \xi x}
\,d\xi

^^^

marked 处理前先匹配出该串,将该串哈希 ID 替换原字符串,并存放到变量中, marked 解析完毕,再将哈希 ID 替换回原内容并做解析。

可以参考这里: https://github.com/seqs/tractor/blob/master/app/helpers/markdown.js#L81
我这里用的 KaTeX
chengzhoukun
2015-12-01 19:39:59 +08:00
IPython notebook 处理挺好的,不知原理
dtysky
2015-12-01 19:42:57 +08:00
我都是直接写 html 然后引用 js 解析。。
phoenixlzx
2015-12-01 19:49:59 +08:00
@seqs 赞,这样用 regex 就方便识别了。

等搞完论文开题报告就去试试看...
dqh3000
2015-12-01 20:00:54 +08:00
@seqs

我也是这么做的

```

converted = converted.replace(/\$\$((?!\$\$)[^\0]){0,1024}\$\$|\$((?!\$)[^\0\r\n]){0,128}\$/g, function (match) {
var possibleMath = match;
while (possibleMath[0] == "$") possibleMath = possibleMath.substr(1);
while (possibleMath[possibleMath.length - 1] == "$") possibleMath = possibleMath.substr(0, possibleMath.length - 1);
var math = null;
try {
math = katex.renderToString(possibleMath);
} catch (e) {}
if (math) {
mathArray.push(math);
return "[MATH-" + (mathArray.length - 1).toString() + "]";
}
return match;
});

converted = marked(converted);

};

```

这种感觉的
halmstad
2015-12-01 20:47:31 +08:00
凤凰君, mathjax-node 对中文支持有问题
phoenixlzx
2015-12-01 20:54:20 +08:00
.... 公式里会有中文嘛?
phoenixlzx
2015-12-12 21:50:07 +08:00
于是这问题暂时算是解决了,放在变量里略麻烦,直接替换掉了。

http://phoenixlzx.github.io/MinoriWiki/page/Test-Page/
Andnot
2016-06-15 11:26:40 +08:00
@sengxian 我也发现了, Farbox 这么处理的原因是什么呢?
貌似其他支持 Mathjax 的网站都可以用“\(”和“\[”数学环境。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/240363

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX