在伟大的http://math.stackoverflow.com上提问的时候,发现人们使用一种奇怪的语法来写数学符号和公式,比如这句:
对于我们来说,写那个“大于等于”和“属于”符号,是一件很困难的事。他们是怎么做的呢?看下源代码:
Relation $R$ is $xy\ge1$, and $x\in \mathbb{Z}$ and $y\in\mathbb{Z}$, is $R$ reflexive?
注意里面有很多以`$`包围起来的符号,以及用斜线开头的词,如`\in`。而显示的时候,它们就自动变成了美观的数学符号,这是怎么做的?
## MathJax和LaTeX
在[http://math.stackexchange.com/faq](http://math.stackexchange.com/faq)介绍了做法,原来使用了一个叫[MathJax](http://www.mathjax.org/)的js库来渲染,语法是一个类似于[LaTeX](http://www.onemathematicalcat.org/MathJaxDocumentation/TeXSyntax.htm)的语法:
MathJax: http://www.mathjax.org/* LaTeX-like syntax: http://www.onemathematicalcat.org/MathJaxDocumentation/TeXSyntax.htm
有了这两样,我们可以直接在文章中写公式,而不需要借助其它的工具。之前我用MathType,想把上面的公式弄到博客上,只能截图。又换了一种可以可以输入数学符号的输入法,但是要不断切换输入法,非常麻烦。Math.stackoverflow.com的这种方式非常好。
如何在自己的博客上安装MathJax呢?过程比较简单。首先在下面的网址下载需要的js库
http://www.mathjax.org/download/
大约为17.6M,有点大。它里面包含了很多东西,比如不同的语法,各种兼容什么的。解压后大得夸张,居然有133M,里面有3万多个文件!
虽然不知道哪些要用哪些不需要,但为了保险,我还是把它们整个都传上去了。传3万多个文件太慢,所以我把整个压缩包上传上去,在服务端端解压,这样快了一下。
这种方式对于很多人的博客不适用,毕竟133M太大了,可能博客空间也就两三百M。这时可使用由MathJax提供的另一种方式,直接使用它们的CDN,这样就不需要上传了,只在网页中增加一个js的引用即可,引用cdn中的文件。
具体详情可参见:http://docs.mathjax.org/en/latest/configuration.html
如果选择的是上传到博客的方式来安装,可以这么做。
首先把MathJax的zip上传到博客空间,通过服务端解压,把它们解压到自己的博客目录中,记下位置。
然后在博客源代码中,添加以下代码(可添加在body的最后):
注意,如果你想让它能解析以$
包起来的数学代码,则需要加上Config
那段。
不需要上传MathJax,只添加引用即可。
src=“http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML”>
在博客中写上下面的代码,它表示"q属于集合R”
$ q \in R $
如果一切正常,它会显示成:
上面这个是截的图片,再来一个真实版:
$ q \in R $
详细文档在这里:http://www.onemathematicalcat.org/MathJaxDocumentation/TeXSyntax.htm
我把常用的一些总结在这里
图片 | MathJax效果 | 代码 |
[](/user_images/1788-5.png) | $\emptyset$ | `\emptyset` |
[](/user_images/1788-7.png) | $q \in R$ | `q \in R` |
[](/user_images/1788-9.png) | $q \notin R$ | `q \notin R` |
[](/user_images/1788-11.png) | $A \subseteq B$ | `A \subseteq B` |
[](/user_images/1788-13.png) | $A \subset B$ | `A \subset B` |
[](/user_images/1788-15.png) | ||
[](/user_images/1788-17.png) | ||
[](/user_images/1788-19.png) | ||
[](/user_images/1788-21.png) | ||
[](/user_images/1788-23.png) | ||
[](/user_images/1788-25.png) | ||
[](/user_images/1788-27.png) | $\{x | x\in\Bbb Z\}$ | `\{x | x\in\Bbb Z\}` |
[](/user_images/1788-29.png) | $\forall x$ | `\forall x` |
[](/user_images/1788-31.png) | $\exists$ | `\exists` |
[](/user_images/1788-33.png) | $\gt$ | `\gt` |
$\ge$ | `\ge` | |
$\geq$ | `\geq` | |
$\geqq$ | `\geqq` | |
[](/user_images/1788-35.png) | $\lnot$ | `\lnot` |
[](/user_images/1788-37.png) | $\lor$ | `\lor` |
[](/user_images/1788-39.png) | $\land$ | `\land` |
经过多次使用后,发现MathJax对于某些公式的显示有问题,比如,会显示得乱七八糟。看了一下math.stackoverflow.com,发现它修改了MathJax的代码以解决这些问题。但我拿不到这些代码,自己也不知道怎么修正,所以只能暂时不再使用这种方式。
现在的做法是,使用最新的MathType 6.8,它支持把公式拖到Live writer,感觉还不错。唯一有点担心的是,它利用了google的chart api来产生图形,这个服务在国内不稳定(你懂的)。