背景

所见即所得(WYSIWYG)与结构化内容(structured content)是内容编辑的两个极端,前者强调了内容的实时预览,简单易用;后者要求所编辑的内容必须符合某种特定的格式,整齐但使用困难。在排版方面,实现两种思想的代表软件是MS Word与LaTeX。有时候,用户想同时利用两种思路的优势,这种需求的实现在两大阵营里都有探索,比如MS Word很早就支持样式,就是一种基于结构的写作方式。可惜,两大阵营都没有很好的解决这一问题。轻量级的标记语言(markup language),如markdown,属于结构化内容,而且简单易用,有可能成为解决问题的良方。

我一直同时使用MS Word和markdown,但一直有沟通两者的需求。pandoc可以把结构化语言转换为MS Word的docx格式或者OpenOffice的odt格式,部分解决了我的需求,但还是不够好。

需求

我的需求是,在Windows平台上实时转换markdown到相应的格式并复制到剪贴板,这样就可以直接粘贴到Word里了。

实现

实现的思路是,用pandoc把markdown转换为docx文件,用VBS脚本打开docx文件并复制内容到剪贴板。用VBS是因为Windows下实在也没有什么好的剪贴板操作方式。这种实现方法我已经用了几天了,感觉还不错。

因为是自己用,所以就硬编码了,Emacs lisp代码:

1
2
3
4
5
6
7
8
9
10
(defun md-to-clipboard ()
(interactive)
(when (string-equal system-type "windows-nt")
(shell-command-on-region
(if (use-region-p)
(region-beginning) (point-min))
(if (use-region-p)
(region-end) (point-max))
"pandoc -f markdown -o Z:/TEMP/tmp.docx --data-dir=C:/msys64/home/Kel/ --reference-docx=times.docx")
(w32-shell-execute "open" "~/.emacs.d/.bin/docx-to-clipboard.vbs")))

VBS代码:

1
2
3
4
5
6
7
Dim oWord
Set oWord = CreateObject("Word.Application")
oWord.Documents.Open("Z:\TEMP\tmp.docx")
oWord.Selection.WholeStory
oWord.Selection.Copy
oWord.Quit
Set oWord = Nothing

总结

如果有机会可以把它整理出来。代码好写,把这一套东西搭好挺难。