TeX-support

没 TeX 心里痒痒的,用的真心不方便。其实用 TeX 的一大理由就是它的公式。显示的很漂亮。偏偏干这一行的公式比较多,特别是在复杂度那一块,没哪些题是不需要涉及到复杂度的。于是痛下决心看能不能支持 TeX 呢?首先可以用 MathJax 。但是 MathJax 太慢了,而且占网速,总之我不喜欢……

于是搜索一堆东西,首先对 Pandoc 有期望,然后发现不会用。后来在本地看到一个叫做 Marutex 的东西。 Maruku 是 jekyll 用的 markdown 渲染器。Marutex 会不会支持 TeX 呢?让我们拭目以待。

事实证明,在 blahtex 的帮助下,Maruku 是可以支持 TeX 公式的。 Blahtex 是一个转换器,调用了系统的 TeX 解析器,利用 dvips 转成 png。初看起来效果确实是不错。由于 png 支持透明,公式就像是普通文字,这点尤其舒服。

但是,很囧的一点,blahtex 生成的图片背景透明,文字是黑色的,而我 blog 背景默认也是暗色调的,因此公式看不太清,这点特别囧。于是我们有两种解决方案: 1. 换一个 blog 主题 2. 改动 png

由于这个主题是我比较满意的,特别是背景我特别喜欢(我个人比较喜欢这个风格的画),所以决定使用第二种方案,改动 png 。

由于最终免不了调用 TeX 的解析器,所以我们可以直接在 TeX 源文件上做文章。我的第一想法是用 color 函数,直接把字体颜色改成白色。看了 help 后发现可以直接用命令行参数来设置。由于我不知道 Maruku 在哪里设置 blahtex 的参数,于是我决定自己写个程序来实现。这就不免涉及到外部程序的调用。

据我所知,一个程序调用了外部程序,则被调用的程序的 stdin、stdout、stderr 均会继承父程序的。可是我写了程序后发现明明 stdin 被继承了,可是仍然输入不进。一个不到 1K 只有 20- 行的程序我看了好久硬是没看到哪里有问题。最后发现, execve 的第二个参数这个数组的第一个元素必须和第一个参数一样……浪费了好多时间囧……

中间有个插曲,某一次我在生成 png 的过程中,只生成了一个 hash 用的 txt ,png 没有生成。结果下次启动 jekyll 的时候总是报错,我一个一个包的排查最后发现把某个临时文件夹清空就好了。

好的,现在可以调用外部程序了。可是字体颜色怎么还是黑色呢?经过不断努力地尝试,我发现了原因: blahtex 会使用一个叫做 preview 的包。这个包会覆盖 color 函数所设置的颜色。于是我干脆就不使用 preview 这个包了。发现 jekyll 不断报错,实在没办法了我就只好去看 Maruku 调用 blahtex 的实现。又参考了一堆的 help ,原因是: blahtex 需要 preview 这个包才能提供生成的 png 文件的尺寸,而 Maruku 需要 blahtex 提供尺寸来进行 png 的缩放。

然后我又蛋疼的去查如何获取一个 png 的尺寸。又准备写程序了 = =||

最后实在无聊,我把直接修改 html ,把 html 代码中和 png 大小相关的东西全部删掉,发现 png 能够正常显示。那就这样吧。于是最后我决定直接把 Maruku 中所有和 png 大小相关的代码直接删掉。似乎终于可以了?看一下效果。

效果

这是传说中的行内公式: \(O(n \log n + n \sqrt{n})\) ……应该没大 bug 吧。再看看所谓的行间公式:

\[1 + 2 + \dots + n = \frac{1}{2} n(n + 1)\]

好吧就这样吧。

eggache

蛋疼是没有上限的。我又遇到了一个问题,github 仓库显然没有 blahtex ,如何在访问 github 的时候能看到这些图片呢?

于是最蛋疼的事是:我不得不新建一个 repo ,用来保存 blog 的源代码,然后原来的 repo 只存放生成的 html 以及图片。也就是说原来是 github 渲染 html ,现在是我上传 html 及其相关文档上去,github 只负责显示了。所以每次更新文章很蛋疼的:

git add *
git commit -m "xx"
git push origin master
jekyll --no-auto ../roosephu.github.com
cd ../roosephu.github.com
git add *
git commit -m "xx"
git push origin master

不过有了 TeX 的支持还是很不错的。