基于MoinMoin+ConTeXt实现包含数学内容的Wiki网站
为什么选择 MoinMoin
去年,我想使用 Wiki 来组织实验室一个课题的各类文档,于是在服务器上安装了 MediaWiki。用了一段时间,感觉 MediaWiki 虽然是一个非常优秀的 Wiki 引擎,但对我来说,它有些复杂,也许是因为我对 MediaWiki 的实现基础——PHP 与 MySQL 一向心存畏惧,这让我觉的除非我熟悉 PHP 和 MySQL,否则很难驾驭 MediaWiki。
后来当我看到 MoinMoin 的时候,感觉这就是我需要的。MoinMoin 的优点在于:
- 采用 Python 语言开发,而我对 Python 一向颇存好感;
- 使用文件系统来管理页面,而非数据库,这样可能在页面存储与读取效率要低一些,但是让页面作为磁盘上一份又一份的文件,这让我这样不熟悉数据库操作的人有能力控制每一个页面的细节,同时也能够轻易地对页面进行备份、恢复;
- 容易创建多份 Wiki 实例,基于此可以很轻易地实现 Wiki Farm;
- 界面样式容易定制。
于是,我将实验室服务器上的 MediaWiki 卸掉,因为也没有积攒多少有价值的知识条目;然后毫不犹豫地装上了 MoinMoin,具体的安装过程可以参考我的一篇日志 《MoinMoin 安装简明指南》以及 MoinMoin 官方的安装说明文档。
MoinMoin 对 TeX 的支持
装上 MoinMoin 之后,随之而来的问题就是该如何支持数学公式,因为课题的文档中需要输入大量的数学公式。谈到在网页中浏览与编辑数学公式,这是让很多人都头疼的一个问题,要对这一问题有深刻的理解,请阅读 Michael Juntao Yuan 的《构建含有数学内容的动态网站》。总之,目前的现状是在 Blog 或 Wiki 的服务器端充分利用数学排版的事实标准——TeX 系统及其排版标记语言是解决数学内容的 Web 发布最为经济的解决方案。
在使用 MediaWiki 期间,曾经按照其安装说明文档添加了 TeX 数学公式语法解析功能,虽然不尽人意,但也勉强够用。查了一些资料,发现 MoinMoin 也支持 TeX 语法解析,需要安装 Johannes 写的 Latex Parser 插件。MoinMoin 的 LaTeX Parser 固然也很好用,但是它存在着 MediaWiki 的 TeX 语法解析功能同样的缺点:
- 不支持像 PDFTeX 这样更为现代的 TeX 引擎;
- 只支持 LaTeX 语法,而我更喜欢 ConTeXt,因为后者除了便于输入数学公式,也方便在 Wiki 页面上使用 MetaPost 绘制精确矢量图形;
上述的两个缺点可以很容易基于 Johannes 的 Latex Parser 插件来解决,而且这也是本文重点讲述的内容。
另外附带打个广告,现在我所使用的这个 Is-Programmer Blog 也是支持 TeX 语法解析的,可以试用一下。
对 Johannes 的 Latex Parser 插件进行 quick & dirty 的 hack
下面的脚本是我对 Johannes 的 LaTeX Parser 进行 hack 的结果。tex-parser.py 脚本可以调用 texexec 编译 Wiki 中出现的 ConTeXt 语法,生成临时的 PDF 文档,然后调用 ImageMagick 软件包中的 convert 工具将 PDF 文档转换为背景透明的 png 图片,最后将 png 图片嵌入到 MoinMoin 生成的 HTML 页面。tex-macro.py 脚本为 MoinMoin 提供了行内 ConTeXt 语法解析的宏。
将所下载的 tex-parser.py 文件复制到 Wiki 实例目录下的 data/plugin/parser 目录下,改名为 tex.py;将所下载的 tex-macro.py 文件复制到 Wiki 实例目录下的 data/plugin/macro 目录下,改名为 tex.py;将这两份 tex.py 文件的用户及用户组设为 apache,并将访问权限设为 660。这些步骤完毕后,重启 apache 即可启用 tex parser 与 tex macro 插件,不过前提是你的系统须满足以下条件:
- 操作系统是 Linux,虽然在 Windows 下也可以实现,但我觉得那是戴着枷锁跳舞;
- 已安装较新的 TeX 发行套件,譬如 TeX Live 2007,要求是该 TeX 发行套件必须包含 ConTeXt 环境;
- 已安装 ImageMagick 软件包,这是类 Unix 系统中非常强大的图像处理工具,但真正令很多人害怕的不是它的功能强大,而是因为它的用户交互界面是命令行;
- 已安装 ghostscript,因为要用它将 ConTeXt 生成的一些 eps 文档转换为 pdf 文档。
上述的 TeX Live、ImageMagick、ghostscript 软件包,都可以从对应 Linux 发行版的软件仓库中安装。
如何在 MoinMoin Wiki 中使用 ConTeXt 语法解析器
在安装了 TeX Parser 与 TeX Macro 插件的 MoinMoin Wiki 中,TeX 语法的形式可以分为:行内语法与行间语法。行内语法是利用 TeX Macro 调用 TeX Parser 将 ConTeXt 语法解析结果(即 png 图片)显示在当前行内,而行间语法是直接调用 TeX Parser 将 TeX 语法解析结果独立为一个段落显示。
行内语法:
TeX 行内语法的解析示例:<<tex(\sum_{p\rm\;prime}f(p) = \int_{t>1}f(t)\,d\pi(t))>>
MoinMoin 对其进行处理的结果如下图所示:
行间语法:
{{{#!tex $$ \sum_{p\rm\;prime}f(p) = \int_{t>1}f(t)\,d\pi(t) $$ }}}
行间语法的解析结果如下图所示:
由于 ConTeXt 通过 MetaFun 完美地将 MetaPost 融入到 ConTeXt 文档中,因此 MoinMoin 在支持 ConTeXt 语法解析的前提下,对 MetaPost 的支持也就是自然而然的了。ConTeXt 的 MetaFun 代码在 MoinMoin Wiki 的 TeX 语法标记中应当置于 \startMPcode ... \stopMPcode 标记中,格式如下:
{{{#!tex \startMPcode path p ; p := fullsquare scaled 2cm randomized .5cm ; drawpath p ; drawpoints p ; p := (p shifted (5cm,0)) squeezed .5cm ; drawpath p ; drawpoints p ; \stopMPcode }}}
解析结果如下图:
在 MetaPost 图形中也可以使用中文,因为 ConTeXt 自 1999 年开始对中文的支持就非常友好。如下例:
{{{#!tex \startMPcode drawarrow origin--(0,100); drawarrow origin--(100,0); drawdot origin withpen pencircle scaled 2pt withcolor red; label.bot(btex 原点 etex, origin) withcolor red; label.lft(btex $y$ etex, (0,100)); label.lrt(btex $x$ etex, (100,0)); \stopMPcode }}}
解析效果:
结论
MoinMoin 是功能强大的 Wiki 引擎,TeX 作为数学论文排版的事实标准,在数学内容的 Web 发布困难的现状下,在 MoinMoin Wiki 系统中融入 ConTeXt 语法解析是很有意义的事,因为无论是数学公式的输入,还是矢量图形的绘制,ConTeXt 都能取得精美的效果。本文对 MoinMoin 的 ConTeXt 语法解析器的实现是基于 Johannes 的 LaTeX Parser 插件实现的,插件代码没有进行合理、规范的组织,下一步打算将 ConTeXt 语法解析单独抽离出来,然后在 MoinMoin 的 ConTeXt Parser 插件中调用它,许多实现的细节将在本 Blog 的其他文章中讲述。
2008年1月31日 22:03 很好很强大!
2008年1月31日 22:30 :)
2008年7月05日 22:00
很好很强大
2008年10月14日 06:20
帅!
2021年9月08日 16:38
Regardless of the reason, you cannot find any doubt the fact that maid costume can be popular when ever. Certainly everyone appeal to your costume hails from the gentlemen who wish to see unique wear it rather then from gals themselves wishing to portray your maid. It's been a primary fantasy with men everywhere for years.