Markdown+Pandoc: 轻量级科学论文写作方案

周末了,早上起来外边还在下小雨,站在阳台上看了会雨。阳台前边就是一个很大的公园,
早起的鸟儿已经开始忙碌了,我竟然在窗口那棵树上看到了一只彩色的小鹦鹉,非常漂亮。

中午吃过饭做城铁来到办公室,手边一杯咖啡,开始想要把这几天困扰我的一个问题解
决掉。

一直在用LaTeX写论文,很好很强大,对数学公式的支持几乎可以用完美来形容。但
是只有一个问题,每次当我写好东西想要发给导师或者同事开始协同写作的时候,LaTeX
到PDF然后到Word文档的转换成了一个比较麻烦的事情。当我从PDF中拷贝粘贴文本
到Word的时候,格式全乱掉,数学公式一团糟。之后手动调整格式的过程让使用LaTeX
写作的优势看起来似乎抵消掉。

我不打算也知道很难劝说导师和周围的人都使用LaTeX,实话说,LaTeX的好处用过的
都知道。但是,当科学写作更多的需要协作的时候,除非周围的人都使用LaTeX,否则
每次转换格式都会浪费许多时间,而且也容易出错。

于是想要寻找一个LaTeX的替代解决方案,并非完全要放弃LaTeX。因为科技论文写作
不可避免要有许多数学符号和公式。而且许多期刊都提供了LaTeX模板,因此如果这种
替代方案需要让我完全放弃LaTeX,我也会有些犹豫的。

好在发现了Markdown,更确切的说,是发现了Markdown+Pandoc的组合。

什么是Markdown?
————————-
简单一句话就是:用纯文本写作,同时用直观的轻量级标记来格式化文档。

为什么要使用纯文本创作?
————————————-
我的哲学是,任何基于字符的创作都应该是内容至上(除了书法)。这包括写小说,写
论文,或者是写代码。在创作过程中,尤其是前期创作中,任何格式都是一种多余。这
一点大家可以想像一下作家用纸笔写小说,纸上总不能高亮或者加粗吧?用内容说话才
是王道。

什么是Pandoc?
———————-
Markdown本身是为了方便输出到HTML格式的。可是后来大家不局限于只是生成HTML
网页,而Pandoc就是为了解决这种需要。通过Pandoc,原始的Markdown文本可以顺利
的转换成Word文档(.docx),OpenOffice文档(.odt),或者是TeX文档(.tex)。

为什么Markdown+Pandoc的组合让我动心?
————————————————————–
1. 轻量、简单易学、上手容易。实话说学LaTeX已经花了不少功夫,我不想再学习另一种
复杂的语言,只是为了写作文章。Markdown符合需求。
2. 能够顺利转换成Word文档。毕竟周围的人用Word还是不少,能够顺利和他们分享文档
也是我的基本需求之一。这点Pandoc可以解决。
3. 能够转成TeX文档。这个对我来说也是必须的,目前为止Markdown对数学和表格的支持
还是有些弱。Pandoc可以将Markdown转到TeX文件,这一点对我来说吸引力非常大。

如何配置Mardown+Pandoc?
—————————————-
几乎不需要配置。下载Pandoc安装就行(这里)。五分钟就可以搞定上手。
MD的介绍可以看这里:[维基百科中的Markdown]
Pandoc的介绍可以看这里:[Pandoc用户指南]

我现在的写作流程
————————–
1. Vim中写作MD原始文本
2. 需要分享时通过Pandoc转换为.docx
3. 需要发表到学术期刊时,通过pandoc转为TeX,然后调用期刊的LaTeX模板,生成PDF。

这样,既避免了转到另一种更复杂的解决方案,同时能够保证和同事之间的分享。而且最重要
的是没有放弃LaTeX,保留了后期转到LaTeX的灵活性。

有哪些问题?
——————————
当然,这种解决方案并非完美,目前来看问题主要有:
1. 数学公式。Pandoc虽然可以把LaTeX math渲染成很漂亮的HTML公式,但是目前来看
似乎无法很好的渲染到.docx文档中。也有可能是因为我电脑上没有装Office,而是用苹果
的Pages,所以不支持MOMML(Microsoft’s Office Math Markup Language)语言?好吧,
看来又是一个编辑器专用的东西。那么数学公式怎么办呢?我现在的办法是,依然用TeX
Math直接在Markdown中写数学公式,转好DOCX文件之后,\begin{equation}和\end{equation}
之间的部分不会输出,我再用LaTeX it!(一个小工具,转LaTeX数学公式到PDF或者图片,
非常简单,拷贝粘贴就行)插入到DOCX文档中。我不是搞数学或者物理的,文章中公式并
不是很多,因此,这并不是太大的问题。

2. 参考文献。用Markdown+Pandoc的话,当然可以直接使用Pandoc的文献插入格式。但是
这里有一个问题,因为我需要后期转到TeX文档,现在看来Pandoc在把MD转到TeX之后,
仍然保留的Pandoc的cite key{author:year},而不是LaTeX的cite key (\cite{author:year})。
但是,这个世界总是有很多办法的。我的办法就是,直接插入Papers2(文献管理软件)的
cite key,对于上边那篇文献,Papers2的cite key长这个样子:{author:year}。当我生成DOCX
之后,{author:year}依然保留在DOCX文件中,然后我只需要很简单的用Papers2格式化一下
文档就行(超级简单)。那么转到TeX中呢,{author:year}依然保留,不过变成这个样子了:
\{author:year\}。大家可以看到,这里和LaTeX的cite key唯一不同的地方就是,\{author:year\}
之间少了个cite,然后第二个大括号的前边多了一个“\”。哈哈,有办法了。直接用Vim的查找
替换。首先,替换前边的”\{“为”\cite{“:在Vim中输入:

:%s/\\{/\\cite{/g

。然后替换后边的”\}”
为”}”:

:%s/\\}/}/g

。经过这两步,本来还是\{author:year\}的cite key就变成了LaTeX的cite
key \cite{author:year}了。

搞定!Perfect!

好了,现在可以放心的用Markdown+Pandoc的组合来写论文了,插数学公式或者参考文献
都没有问题。同时既保留了Markdown的轻量,同时可以无缝转换到其它文档格式,最关键
的是,和LaTeX也有非常完美的结合。

下一步,就是怎么想办法诱惑周围的人(包括导师和同事)也开始放弃Word,来使用Markdown
写论文了。更大的理想是,通过使用纯文本写作,再结合GitHub进行协作,实行版本控制,
commit, push, pull。。。你懂的。。。。

Advertisements

3 thoughts on “Markdown+Pandoc: 轻量级科学论文写作方案

  1. 我从两年前开始采用 Markdown + Pandoc 方案撰写论文(包括我的博士后出站报告),自己写了 Vim 插件来辅助编译和调整参数(以及自己重写了 pandoc syntax 和 ftplugin),而且一直在使用 git 进行版本控制。在“小型应用情境”中,这种方式很可靠,过程也令人愉悦。但我不得不说,由于 MD 的先天缺憾(没有 extension 和 attribute 功能),想要生成格式完备的中大型 word 文档还是很困难的,或者说不可能。最近的例子就是,我使用这个方案来进行一本17万字的译著写作(中文),发现了一堆问题:脚注编号;中文引号的全角/半角;可引用的图注(题注);图片嵌入与对齐;列表符号;等等。这意味着需要在 postprocess 阶段引入高强度的工作(使用 vb 写 word 脚本?),违背了“轻量”的初衷。

    有空可以交流。

    • 嗯,个人小型创作的话,MD应该是足够了。但是像你说的这种大型
      的工作(译著),MD的功能应该会比较欠缺,毕竟一开始就是为了
      方便生成HTML的。

      我现在只是用来写论文,而且我并不打算完全放弃LaTeX,前期用
      MD写,后期定稿之后转到LaTeX套个模板就行。

      现在只有一个问题,就是如何track changes。周围的人几乎都
      用Word,虽然我可以把我的MD文本很顺利的转成.doc。但是如何
      把他们(主要是导师)的修订顺利的合并到我的原始文本中,似乎
      还没有找到很好的解决方案,现在只能手动合并,稍麻烦了点。

      不过好在这样也强迫我多读几遍自己的论文,呵呵。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s