有关pt, px及DPI的知识
使用ConTeXt绘制程序流程图

基于MoinMoin+ConTeXt实现包含数学内容的Wiki网站

LiYanrui posted @ 2008年1月29日 08:15 in ConTeXt之旅 with tags moinmoin tex ConTeXt , 26745 阅读

为什么选择 MoinMoin

去年,我想使用 Wiki 来组织实验室一个课题的各类文档,于是在服务器上安装了 MediaWiki。用了一段时间,感觉 MediaWiki 虽然是一个非常优秀的 Wiki 引擎,但对我来说,它有些复杂,也许是因为我对 MediaWiki 的实现基础——PHP 与 MySQL 一向心存畏惧,这让我觉的除非我熟悉 PHP 和 MySQL,否则很难驾驭 MediaWiki。

后来当我看到 MoinMoin 的时候,感觉这就是我需要的。MoinMoin 的优点在于:

  1. 采用 Python 语言开发,而我对 Python 一向颇存好感;
  2. 使用文件系统来管理页面,而非数据库,这样可能在页面存储与读取效率要低一些,但是让页面作为磁盘上一份又一份的文件,这让我这样不熟悉数据库操作的人有能力控制每一个页面的细节,同时也能够轻易地对页面进行备份、恢复;
  3. 容易创建多份 Wiki 实例,基于此可以很轻易地实现 Wiki Farm;
  4. 界面样式容易定制。

于是,我将实验室服务器上的 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 语法解析功能同样的缺点:

  1. 不支持像 PDFTeX 这样更为现代的 TeX 引擎;
  2. 只支持 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 插件,不过前提是你的系统须满足以下条件:

  1. 操作系统是 Linux,虽然在 Windows 下也可以实现,但我觉得那是戴着枷锁跳舞;
  2. 已安装较新的 TeX 发行套件,譬如 TeX Live 2007,要求是该 TeX 发行套件必须包含 ConTeXt 环境;
  3. 已安装 ImageMagick 软件包,这是类 Unix 系统中非常强大的图像处理工具,但真正令很多人害怕的不是它的功能强大,而是因为它的用户交互界面是命令行;
  4. 已安装 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 的其他文章中讲述。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter