本文主要讲在Markdown中使用Mathjax的经验 。

一些说明: 文中提到的Markdown,在某些语境下指Markdown渲染器,而所有的渲染器,都指GITHUB PAGES上的默认渲染器。

之所以要提及Markdown中写Mathjax这么一回事,是因为二者共用一些特殊符号,对这些特殊符号会做相应的处理。我们的原始文本,首先经过Markdown渲染器,原始内容中的一些特殊符号会出现一些变化;显示到浏览器端后,MathJax通过JavaScript来处理内容中包含公式的地方,通过改变DOM内容来渲染公式。由于Markdown中使用的特殊符号,一般都是数学公式的子集,所以当内容包含大量数学公式时,往往一些难以想象的问题就出现了。

以下结合最近的经历写一些总结。

轻度使用Markdown + MathJax时,倒不觉得二者间强烈的冲突,仅仅在部分符号上有些处理问题,加上转义字符就ok了。不过最近一直在写算法和模式识别的笔记,涉及较多的数学公式,大篇幅写下来,发现了很多问题,大致总结一下:

  1. 多重转义

    比如最终要输出一个集合{1 , 2 , 3 } , 一般能够反应过来给{}加上转义\\ ,然而却忘记了经过Markdown之后,{}也是Markdown的关键字,转义字符对Markdown也是有效的。经过Markdown处理后,转义字符在输出到浏览器的文本中是不存在的。所以最后的公式显示时还是没有大括号。需要转义两次,这个体验并不好。

  2. 莫名其妙的表格

    由于涉及大量的概率公式,常常一个段落里好多P(w | x)的情况,结果输出时发现页面完全乱了。原来Markdown把这些竖线|全部当做表格触发条件了。

    而且,对于$$ $$的行间公式,这个是不会触发的;对于$ $行内公式就会触发,所以加转义字符也时刻需要保持清醒。

  3. 莫名其妙的公式渲染失败

    当一个公式中包含大量下划线时,公式渲染失败。

    其实我觉得这个可能是MathJax已经对公式做了兼容性处理了。下划线在Markdown中其实是被当做斜体的关键字的,但是轻度使用时MathJax依然能够渲染。然而,当遇到超过两级的下标时,我发现渲染就会失败。而加转义字符是不现实的。

其实,比较规范的在Markdown中插入MathJax公式的方法,一般是创造一个禁止Markdown渲染的区域。

我们知道,当我们在Markdown中上下空行隔开,使用HTML标记时,标记内部的文档是不会被Markdown渲染的。

所以当一个段落内包含大量行内公式时,非常推荐使用<p>标签来包含整个段落(因为Markdown最基本的就是为一个隔开的空行渲染一个p标签)。在标记内可以正常使用$ $ .

如果使用$$ $$行间公式,Markdown只会添加p标签,所以这种情况下不需要处理。

测试发现<span>标签是没有用的,Markdown会渲染单独的一个未被其他标签包含的<span>标签内的内容。如果确实需要在Markdown渲染的情况下使用,可以自己创建一个css定义(如p下的div),构建一个inline的块。(PS,这种方法还 有待测试)

最后,轻度使用时,通常使用即可。