使用pandoc的降价撰写学术论文的详细指南

前言

我相信当你看到这个话题时,你会有一个问题。为什么不使用Microsoft Word?毕竟,在学术界或其他大多数领域写文章,首先要考虑的是开放word,除了一些领域外,大量涉及科学和工程的数学公式也将直接转化为专业排版软件,如latex。

其实理由很简单:

  • Word是一个强大的字处理工具,也就是说它强大的功能在于排版而非码字,由于Word面板上有大量的格式设置的按钮,会使得我精力分散,不再集中于输入内容,往往「码字10分钟,格式2小时」,不仅写作体验很差,更造成写作效率的降低;

  • Word有点「重」,打开Word之后看到一篇长长的论文总有一种无从下手的焦虑感。

介于这两个原因,再加上近年来越来越火的markdown轻量级标记语言的文艺复兴和大量「双向链接」、「卡片笔记」的出现,让我觉得用markdown来写学术论文也许是时候提上日程了,试想一下,一篇长长的学位论文拆成无数个小卡片,哪一天看到有用的文献了,当场就可以打开markdown来写下几个字。我本人也使用了markdown很长时间了,所有的笔记和生活记录,发布的文章都是通过markdown来写的,深深喜爱这种「纯文本」书写的简约,让用户能专注于内容,不在意格式。

但丑话说在前头,markdown本身是用来简单代替HTML的,用它来写学术论文肯定是免不了一番折腾,如果你确实有和我一样的痛点,并愿意花上一两个钟头来接触一点新鲜玩意儿的话,请您耐心看完,一定会有所收获。

准备工作

在使用前,需要准备的一些必备项保证能正常使用。

Markdown 编辑器:Typora|Obsidian

这里其实使用哪一个Markdown编辑器都可以,只要你觉得很符合你的使用习惯,我是习惯于在Typora中进行编辑,然后用Obsidian作为知识管理工具。就我个人来看,输入体验里Typora还是明显优于Obsidian的,有所见即所得的即时渲染,当然Ulysses的输入体验是最好的(穷)。另外,VS Code有可以和Zotero结合的插件,现在的Obsidian中也有,在某些场景中可以更好配合参考文献的插入。

因为所有的编辑器不同,我就不在这里放下载链接了。

文献管理工具:Zotero

这一个文献管理工具因为开源免费、多平台(Windows/macOS/Linux)、各种插件以及支持WebDAV同步让我毫不犹豫地使用了它,最近Zotero的iOS/iPadOS/Android测试版也已经上线了,目前来说同步还是只能使用其官方的云端储存来同步附件,WebDAV暂时还无法在移动端同步,不过开发者提到了后续会考虑加入WebDAV,所以这一文献管理工具还是非常香的。

其它辅助工具

使用Markdown和Zotero来撰写和管理的话, Better BibTeX 插件是必选项,如果官网在内地无法访问的话可以在这里下载,它为参考文献的引用和管理提供了一站式解决方案。

同时,把 Markdown 格式的文本用高度可定制的方法转换为 PDF 或者 Word 格式文档,绕不开 Pandoc 这个工具,Pandoc号称文本格式转换的瑞士军刀。我们熟悉的大量文本编辑器在生成其他格式文档时往往调用的都是 Pandoc。

在Mac平台下的额外功能会需要使用的Alfred的付费功能workflow,这是一个macOS下的效率软件,也被很多人认为装机必备的软件。

使用

接下来的使用环境需要把上述软件安装完毕才能正常使用,请知悉。

Better BibTeX

首先就是要在Zotero里安装Better BibTeX插件,通过Zotero菜单栏的「工具」→「插件」→点击弹框里齿轮一样的按钮→「Install Add-on From file」,选择下载的格式的文件,安装好之后会提示你重启Zotero。

完成之后发现偏好设置里多了一个「Better BibTeX」,初次使用需要对其设置一下,主要就是把「Citation keys」里的「Citation key format」设置为,这样cite key会显示成,当然你也可以改成你所喜欢的样式,具体可以网上搜索一下cite key样式。

然后是「Quick copy」里把「Quick copy format」设置为,并把勾选上。

现在,你可以在Zotero里看见多了一个字段「Citekey」了。

如何引用

什么是Cite key呢?这里引用一下sspai作者@思考问题的熊的话:

所谓 Citation Keys(Citekey),可以理解为 Better BibTeX 给文献生成的一个 ID,当我们在文档中需要插入文献的位置按照一定格式输入 Citekey 后就等于告诉 Zotero 要在这里引用对应的文献了。 由于 Citekey 是纯文本格式,不同编辑器对文章本身的影响可以降到最低。在 Endnote 中同样有类似的引用方式,这个概念被称作 Temporary citation。 通用的 Citekey 格式为 ,前半部分表示文章第一作者的小写姓氏,后半部分为文献年份,如果出现了重复,就会在后面添加 或者数字进行区分。

此时,如果我们想要在Markdown中插入参考文献,直接复制到markdown相应的位置中就可以引用了,这里注意一下cite key的引用规则:

  • 单条目引用方式:[@citekey],例如「昆虫是世界上最多的动物(xxx, 2021)」

  • 多条目引用方式:[@citekey1;@citekey2],例如「昆虫是世界上最多的动物(xxx, 2020;xx,2021)」

  • 略去作者的引用方式:[-@citekey],例如张三还发现(2020),昆虫是世界上最多的动物」

  • 句中引用方式:@citekey,不加括号,例如xxx(2020)认为,如果使用这种引用方式,@前面一定要记得有一个空格

特别地,著者-出版年制下,在句中引用时,引用同一作者不同年份的文献需要这样写:

这是我们看一下例子:

 昆虫是世界上最多的动物[@nielei2020];
 
 昆虫是世界上最多的动物[@jiangxiaolei2010; @wangqing2020];
 
 王庆等人认为[-@wangqing2020],昆虫是世界上最多的动物

这是我的markdown里的内容,分别进行了单条目引用、多条目引用和略去作者引用。如果你不想看其它如何高效复制cite key的内容的话,可以直接跳转到这里

使用编辑器的插件引用

如果就这样在markdown里插入参考文献,简单是简单,肯定不方便,毕竟要来回去Zotero中复制citekey,这样操作效率肯定不高,那能不能像word的Zotero插件一样可以调用插件来插入呢?答案是可以的。

如果你使用的是Atom、VS Code、Scrivener、Zettlr等编辑器来进行撰写的话,可以直接启用相应的插件,比较方便,这里面Zettlr的体验比较好,可以看到插入引文的各种信息等,毕竟是专为学术而生的软件。Windows平台用的人最多的可能就是VS Code了,可以All in One,非常推荐,但我还是愿意把VS Code当做是码代码的软件,就不使用它了。

这里通过Obsidian作为演示。首先需要在Obsidian中安装Citations插件,相信Obsidian中如何安装插件就不用多说了吧。安装完成之后开启插件,还需要进行一下设置。首先在Zotero里的「文件」选项里选择「导出文献库」,格式选择,并勾选,这样就会保证Zotero中的文献会和该bib文件保持同步,点击OK之后选择你要保存的路径,这里为了演示我就取名为

导出完成后,打开Obsidian的插件设置,找到Citations,把Citation database format设置为,把这个文件的绝对路径粘贴到Citation database path中,完整的设置如下:

接下来就可以在Obsidian中引用文献了,这里的引用没有快捷键,所以只能通过Obsidian的命令模式运行,通过打开命令模式,输入找到字样的命令。

回车即可看到文献库里全部的文献,找到一个并回车就会生成上述的的文本了。

其他的编辑器都分别有各自的插件可以使用,具体可以查看 官方说明,至此,通过编辑器的插件引用就到此结束。

自动操作

熟悉Mac平台之后,你可能会发现Mac里有一个非常类似于iOS中快捷指令的功能,叫做Automator(自动操作)。这里会用到一个Apple Script脚本文件,当然不需要我们自己编写代码,已经有人写好了。这是一个Apple Script脚本文件,因此只适用于Mac平台。首先下载这个脚本 zotpick-Applescript,如果没有科学环境进不去GitHub官网的话可以试试直接来到这个下载页面。这里我们只需要下载

这个脚本运行起来就像Zotero在word中的GUI一样,你输入文献的关键词,可以是作者,标题等等,但记得在关键词末尾敲一个空格,就出来结果。

回车就复制了cite key,这个脚本并没有帮我们输入markdown识别citekey所用到的,所以千万不要忘记了手动补上,当然你也可以借助一些宏工具来自动生成大括号,例如 TextExpander 和 Keyboard Maestro 等工具实现。

每次用的时候都需要点开这个脚本一次也显得过于麻烦,因此我们可以设置一个自动操作的 workflow,打开「自动操作」App,选择新建文稿,类型里选择「快速操作」,配置如下图所示。选择「没有输入」和位于「任何应用程序」,然后在左侧选择「运行 AppleScript」,在右侧弹出的编辑器中复制zotpick-pandoc.Applescript 的代码即可,如果无法查看该脚本的代码,可以右键该脚本,选择「显示包内容」,依次点击「Contents」→「Resources」→「Scripts」→「main.scpt」,双击会以文本文档的形式打开,然后再把代码粘贴到自动操作里,随后保存命名并保存该 workflow。

为了快速调用这个 workflow,我们还可以在快捷键的设置中为它指定一个快捷键。具体是在Mac系统设置的键盘里的快捷键里设置,选择「服务」。找到刚刚命名好的快速操作的名称,为它设置一个快捷键,这样以后在需要使用的时候按下快捷键就可以使用了。

Alfred WorkFlow

除此之外,如果你熟悉Mac平台,你或多或少会听过效率软件Alfred的大名,官网是这样介绍的:

Alfred is an award-winning App for macOS which boosts your efficiency with hotkeys, keywords, text expansion and more. Search your Mac and the web, and be more productive with custom actions to control your Mac.

免费的功能已足够好用,但是要是你付费购买了Powerpack,就可以解锁workflow等高级功能,本文接下来的功能也是必须拥有Powerpack用户才能使用的~~~

这里有两个WorkFlow支持引用Zotero中的文献:

  • ZotHero

  • Pandoc-Suite and BibTeX-Zotero-Citation-Picker for Academic Writing in Markdown

这两个Workflow都是非常好用的插件,两个都可以让我们方便地引用Zotero中的citekey,我们一个一个来介绍。

ZotHero

首先前往GitHub的Release页面下载该Workflow,下载完毕后,双击该workflow后点击import就可以导入到Alfred中了。

如果你目前后台正在运行Zotero记得先关掉它,然后激活Alfred的输入界面,输入,选择「Reload Zotero Data」。

然后再次激活Alfred,输入搜索文献,如下:

我输入了关键词,结果中就出现了符合该关键词的文献,注意这里会同时出现Zotero中的引文和附件(也就是PDF),我们一般会选择引文,怎么使用呢?我们可以看一下官网的教程,这里我只列出部分项,毕竟官方的README写得非常详细了:

— Search your Zotero database (common fields).

  • — Open the entry in Zotero. ( is an alternate)

  • — Copy citation to the pasteboard (see Configuration).

  • — Copy bibliography-style citation to the pasteboard (see Configuration).

也就是说,在选中的条目上就是在Zotero中打开,则是拷贝引文,而则是拷贝有格式的引文书目,但第一次使用的时候会提示我们没有设置参考文献的格式,因此我们还需要先使用配置一下,选择「Default Style: None」。

然后选择你想要的引文格式,这里我们就先用china 7714测试一下效果

再次通过Alfred激活后,通过,此时引文就进入了剪切板中,然后再你需要输入的地方粘贴就可以了,看看效果:

这种只是简单的复制引文,用于不需要修改的临时小文章,或者汇报中可以使用,但并不是我们想要的在Markdown中键入cite key的形式,这里我们可以前往Alfred的偏好设置里,在「Workflows」栏里找到ZotHero,并点击右上角的按钮。

然后在弹框里右侧的环境变量(Environment Variables)里的「COPY_CITEKEY_MOD」的里填入一个激活的修饰键,具体如何输入请看官网的介绍:

  • When the Better-Bibtex plugin for Zotero is installed and is set to any of (no modifier), , , , , , the “Copy citekey” functionality can be enabled to override above operations

这里我选择了填入,也就是用键激活,这里千万要注意一下「Don’t Export」这个字段,一定要记得把这个勾去掉,然后点击Save。

此时再试试用拷贝试试,此时Alfred中选中的文献已经会显示了,结果如下:

别忘了的使用。

ZotHero还有很多其它的一些设置,这些都可以去它GitHub页面详细查看README,肯定会有不少的收获。

Pandoc-Suite

全名叫Pandoc-Suite and BibTeX-Zotero-Citation-Picker for Academic Writing in Markdown,这个workflow网上教程比较少,但我非常推荐大家使用的一个扩展,因为你不仅可以帮助我们快速引用文献,甚至还可以和pandoc结合,让你通过简单设置之后就可以直接通过快捷键导出你想要输出的格式(如docx、pdf等),后面会再次提到。

同样,首先到GitHub的release进行下载,然后导入到Alfred中,和前面的ZotHero一样。导入完成之后在Alfred的偏好设置里找到这个workflow的设置界面,其中最核心的就是这两个快捷键,按钮的底部说明里写得比较详细了,双击该按钮设置快捷键,这里设置为你顺手的快捷键就可以了,另外尽量避免和系统其它快捷键冲突。

设置好快捷键之后就进行了主要的配置环节,依然点击右上角的按钮,这里就一个设置非常重要,就是字段,它的里依然填入我们之前导出的文件的绝对路径。

其它设置你可以暂时不管,因为该扩展的其它配置都可以通过Alfred的命令进行配置:

这里我们主要需要设置的有以下几个地方:

  • Citation Picker:采集器,可以选择classic和alternative;

  • BibTeX Library:文件所在的路径,上面已经设置好了,之所以要在Alfred里设置原因是这个路径可能并不会在workflow的环境变量中,因此需要设置;

  • Set Citation Style:设置引文的样式,主要为了后续的导出docx或者pdf使用;

  • Hotkey Output Format:热键导出的格式,默认为docx,如果修改为pdf,需要先设置PDF-Engine

  • PDF-Engine:导出格式如果为pdf的话需要选择引擎,但不管选择哪一个引擎都需要先安装

接下来我们重点来看一下两个参数,其它参数都比较好理解。

Citation Picker

这个workflow内置了两种采集器供我们选择,默认是classic,也就是Zotero的内置版,因此必须先安装好了Zotero,而且它默认认为Zotero的路径为路径所以才能识别。可以通过按上文设置好的快捷键来调用采集器

和word中使用Zotero的插件一样,输入关键词然后选取,这个比较好的是会自动帮我们把补上。

但调用Zotero的采集器速度上并不是很快,另外也需要Zotero在后台运行着,所以该workflow的作者还做了一个Alfred的显示方式,这种方式不依赖于Zotero,并使用了Alfred的GUI来渲染,速度方面远远高于classic的方式,并且不需要Zotero在后台运行。

在Alfred激活界面键入,选择Citation Picker,选择「BibTeX Citation Picker(alternative)」,如下:

接下来再使用激活引文采集器界面:

这下是不是快了非常多,并且效果也是一样的。

至于如何选择就看个人习惯了,classic依赖Zotero,速度慢,但界面直观,可以选择经典视图进行插入文献;而alternative则界面简洁,速度非常快。

Set Citation Style

会自动读取路径下的csl样式,也就是引文样式,如果没有你想要的样式的话可以打开Zotero,在Zotero里的引文的下载更多。下载完成之后在这里选择就OK了,默认样式也和Zotero的默认样式是一样的。

如何导出

前面我们花了相当多的时间在如何在markdown文件中插入引文了,但是最终我们需要的是导出为更常用的或者等格式。这里当然需要借助「Pandoc」这款神器。如何安装就不再这里详谈了,网上有非常多的教程讲这个工具。它是一个命令行工具,我们借助终端来演示一下如何使用。

docx导出

导出为docx格式非常简单,终端文件所在的目录下,这一条非常重要,输入以下命令:

 pandoc test.md -o result.docx
 # test.md为你输入的md的文件名
 # result.docx为你要导出的文件名

看一下效果:

很明显完全不符合我们的要求,引文并没有转换过来。现在我们修改一下代码:

 pandoc –citeproc –bibliography=test.bib test.md -o result.docx

这一次文章里的引文全部识别好了,并还在文末加好了引文书目。诶,虽然在文末把参考文献都列出来了,但我们在写文的过程中不会特意在文章末尾留一个「Reference」标题吧,Pandoc也可以帮我们一键生成参考文献的标题:

 pandoc –citeproc –bibliography=test.bib -M reference-section-title=”参考文献” test.md -o result.docx

重新看看新的文档,这一次,自动帮我们添加了参考文献表的标题。

这里解释一下这些参数:

  • –citeproc:处理文献引用,这样才能识别文中的的cite key,也可以使用代替;

  • –bibliography:文件的路径,这里因为已经到了文件所在的目录下,所以直接使用了文件名;

  • -o:output,导出命令;

  • -M reference-section-title=”参考文献”:设置参考文献表的标题为「参考文献」,不编号

PDF导出

有时候我们想直接导出为pdf文件,而pandoc默认是无法导出pdf的,需要先安装pdf-engine,如果你的电脑中安装了\LaTeX

环境,则会带上如pdflatex之类的引擎,我电脑上并没有安装\LaTeX,所以我采用了上文介绍的扩展的作者推荐的wkhtmltopdf引擎。

首先需要安装该引擎,由于我是Mac环境,我选择了用homebrew安装:

 brew install –cask wkhtmltopdf

安装完成之后运行以下命令:

 pandoc –citeproc –bibliography=test.bib –pdf-engine=wkhtmltopdf test.md -o result.pdf

终端会弹出一条警告,先不管它,看看效果:

现在回头来看那个警告:

 [WARNING] This document format requires a nonempty <title> element.
   Defaulting to ‘test’ as the title.
   To specify a title, use ‘title’ in metadata or –metadata title=”…”.

它的意思是我们没有设置文档的标题,所以默认使用了的标题,你也可以自行设置,可以自行尝试一下,一般用到的有title、author、date等等。

不愿意使用命令行?

对于没有接触过编程语言的同学来说,一看到使用命令行就本能地不愿意尝试了,其实上述的命令都非常容易理解,甚至你完全你可以把这些命令放在你的备忘录或者笔记当中保存下来,什么时候要想用了直接copy就能出结果了。当然实在不愿意使用命令行的朋友也有其他办法。那就是上文提到过的Alfred的workflow:Pandoc-Suite,所以Windows用户还是只能老老实实用命令行了,不过Typora官方表示后续可能会支持结合pandoc导出支持引文的格式,所以可以期待未来能使用Typora导出。

说回Pandoc-Suite,我们在前面介绍的时候设置了一个和一个我们已经知道了是引用在任何位置插入引文的,那么则是用来导出markdown为指定格式的,我们再回顾一下ALfred中的设置:

这里导出里涉及到的参数有:

  • BibTeX Library:文件的路径,经过前面的一堆操作,这里应该很熟悉了吧

  • Set Citation Style:文件的路径,其实本质就是pandoc中的参数

  • Hotkey Output Format:导出的格式,默认为docx,大部分情况下默认就好

  • Word Reference Document:导出docx时的模版文件,也就是pandoc中的参数

  • Further Arguments:额外参数,也就是你可以在这里设置等参数,这些参数会在下文的额外参数里提到

你可以分别在每一个参数里回车进行选择,没有办法进行选择的参数可以前往Alfred中的偏好设置进行设置,前面进行说过了,然后在finder中选择你要导出的文件,通过设置的快捷键进行导出,立马就会在当前路径下生成一个同名的文件,值得注意的是目前版本下,任何文件的名称都不能有中文,开发者表示会在下个版本中解决这个bug,这里就不演示结果了,只要你设置好了,效果和前面使用的Pandoc是一样的。

额外参数

pandoc通过上述一些方法能简单满足我们的需求了,但还需要进一步地定制,这里介绍一些常见的额外参数,使得你的论文细节更丰满。

设置模版

pandoc给我们导出的docx或者pdf默认情况下是能够使用的,但很明显学术论文往往有着自己的格式,各大高校也有着各自的样式,所以我们需要自定义自己的模版,你可以使用以下命令来查看默认的word模版:

 pandoc –print-default-data-file reference.docx > custom-reference.docx

将在当前目录下的生成一个 的模版文件,该文件就是pandoc的默认模版,你可以对各个文字样式、默认表格样式进行修改。Mac 的用户需要注意,使用 Pages 对模板文件进行修改会导致模板失效,需要使用 Office 进行编辑,并使用兼容模式进行保存。至于模版如何修改,就根据自身的需求自定义设置了。

模版修改完成之后,可以通过 参数来指定模板。例如这里我把导出的custom-reference.docx的字体设置为times new roman,然后通过命令生成一份新的docx文件:

pandoc –citeproc –bibliography=test.bib –reference-doc=custom-reference.docx test.md -o result.docx

然后你就会发现新生成的docx文件的英文字体全部变为了新字体,而其它部分的修改就不一一演示了,感兴趣的话你可以试试用你学校提供的模版试试效果。

至于pdf的生成依赖于\LaTeX环境,而我本人\LaTeX用得实在不多,就不献丑了,\LaTeX的大佬们也完全能用各种tex软件轻松解决论文的撰写与排版。所以这里我的采用的方法是通过pandoc生成docx文件,然后再把docx导出为pdf,这样虽然使用了docx作为一个折中办法,但好处是可以比较轻松的调整各种字体、标题的格式。

引文样式

不仅论文的排版有着格式要求,对参考文献也有严格要求,如果你不显式指定的话,默认的引文格式是。如果需要使用其他样式的话,就需要指定样式文件的路径:

pandoc –citeproc –bibliography=test.bib –csl=/Users/yandi/Zotero/styles/chinese-gb7714-2005-author-date.csl test.md -o testcn.docx

这里多加了一个参数,我指定的路径是Zotero中储存的中文样式,你也可以把格式的文件放在和等文件同一目录下,这样就可以直接用相对路径来指定,使得内容更加简洁。

左边是gb7714的样式,右边是默认的chicago样式,应该是看得出来区别的。

YAML头部信息

你可以理解为YAML是一个html文件的header信息,这个信息放在markdown文件的头部,通过包括起来:


title:  ‘This is the title: it contains a colon’
author:
– Author One
– Author Two
keywords: [nothing, nothingness]
abstract: |
 This is the abstract.

 It consists of two paragraphs.

我们把这个信息给添加到文件的头部,然后再导出看看:

pandoc –citeproc –bibliography=test.bib –csl=/Users/yandi/Zotero/styles/chinese-gb7714-2005-author-date.csl test.md -o testcn.docx

这里添加了title标题、author作者等元数据,具体的用法其实我也掌握得不熟。可能使用得上的key有:

  • title, author, date:元数据的基本元素,标题、作者和日期

  • subtitle:文档的副标题信息

  • abstarct:文档的摘要信息,如果摘要有多个自然段落需要用空行来表示换行

  • keywords:关键词信息

  • subject:文档主题

  • description:文档的描述信息,属于元信息

  • category:文档的类别,也属于元信息

  • lang:语言信息,用于设定文档的语言,对于引文中经常会出现多个作者之间的等词就可以通过语言来切换,例如英文,中文

另外这个yaml信息除了可以在markdown文件中添加外,还可以直接在pandoc中通过或者参数指定,两者的效果是一样的。

参数的使用

某种程度上来说,参数就是调用的上文所说的YAML头部信息,但markdown本身支持的并不是很全,这里我的建议是只在markdown中的YAML里添加标题、作者、日期、摘要等描述性信息,其他的对文档的格式设置都放到pandoc的参数中来。

可以支持添加几乎所有的YAML信息,这里我只放上一些我所了解的参数。

设置参考文献的标题

还记得上文中已经出现过的吧,这里的就是指定文末参考文献的书目的标题用的,这里不进行展示了。

让正文超链接到引文书目

意思就是让你可以在正文里点击引文然后跳转到最后的参考文献书目里,这里用到的是,默认是。当使用多个参数时,用空格隔开就好了(需要多次调用),为了简单演示我就把其他参数都去掉了,大家可以自行保留,对了,如果你觉得一行代码太长不好看的话可以在你想要换行的地方加上一个就可以换行输入了:

pandoc –citeproc –bibliography=test.bib \
-M reference-section-title=”参考文献”  -M link-citations=true \
test.md -o test.docx

能看出来,现在你正文里的这些引用全部变成了,超链接,点击就可以直接跳转到文末的参考文献书目处了。

生成目录

大型文档肯定都有着目录页,例如学位论文,可以通过pandoc指定参数来生成。

pandoc –citeproc –bibliography=test.bib –toc test.md -o test.docx

因为这里只有测试文档这一个一级标题,所以只显示了这一个目录字段,目前来说,还不支持修改目录的标题,只能是默认的「Table of Contents」,当然,你可以在的模版文件里修改。

在生成目录时还可以指定另外一个参数,用来使得目录里出现的最深标题层级,默认是3级

pandoc –citeproc –bibliography=test.bib –toc –toc-depth=2 test.md -o testcn.docx

上述命令会使得生成的文档的目录页中仅包含2级标题,当然一般学位论文中也通常是保留到3级标题,所以用默认的就可以了。

对各级标题进行编号

相信大家一定会遇到为各级标题进行编号的情况吧,比如等,Word我没用明白,总是调好了自动生成编号之后一会儿就乱了,所以我的硕士论文是用手动打的~~~,在pandoc里当然不会如此麻烦,你尽管在markdown里按照你的流程来写,不用理会什么标题编号,导出的时候加上一个参数就可以了。

这里我们把这个文档内容丰富丰富,我们往里面添加了二级标题,三级标题,四级标题和一个数学公式,并希望pandoc自动帮我添加上参考文献表,现在来看看导出的效果吧:

pandoc –citeproc –bibliography=test.bib -M reference-section-title=”Reference” –number-sections test.md -o test.docx

可以看出来,所有的标题都加上了编号,不仅如此,我们随意写了一个数学公式也都能正常显示,这里注意看我们通过添加的Reference是不计入编号的。

有些时候我们还有附录,这些附录也不计入编号,那怎么设置呢?很简单,在你不想计入编号的标题后加上一个就可以了。

## Introduction

## Method {-}

这里的两个二级标题里,我们把Method后面加上

此时Method已经不计入标题编号了,当然,后续也自动被归入了标题里了。

交叉引用

对于论文而言,图表的交叉引用肯定是少不了的,所谓交叉引用就是对其他位置的内容的引用,例如标题、脚注、图、表等等,我们用的最多的还是图表的交叉引用。

使用交叉引用的好处就是可以快速跳转到引用位置,同时就是引用源在文档中的位置发生了变化,也能自动把图表的编号进行更正。原来我就是手打的一个个图表的标题,突然要把某一张图删掉,后续所有图片都要重新编号,非常费时费力。

在Pandoc中要想使用交叉引用的话,需要先安装一下Pandoc-crossref这个fitler。macOS可以通过Homebrew安装:

brew install pandoc-crossref

使用的时候通过pandoc的参数就可以运行了。

当然在使用之前我们需要了解一下如何引用图表,我们知道,在markdown中对插入图片的语句是这样的:,方括号里是图片的名字,小括号里是图片的地址,也可以是网络链接。我们只需要在图片的小括号后面加上,然后在正文中引用的时候用上就可以完成引用了。

这里的是为该图片声明一个唯一的标识,不然系统也不知道你到底引用的哪里的图片了对吧。现在我们通过pandoc来导出包含图片的引用,这里注意如果图片引用和引文引用同时使用的话,需要把放在之前:

pandoc –filter pandoc-crossref –citeproc –bibliography=test.bib test.md -o test.docx

可以看到正文中显示了如,但是这里有个bug,图片标题里会重复出现两次,这个应该是pandoc-crossref和pandoc版本不匹配导致的,运行时也会弹出警告:

这里我也没有什么好的解决办法,只能期待后续更新了,当然我测试了导出PDF是不存在这个问题的。

同样的,如果是表的话可以用来标识表格,用来在正文里引用。

markdown中的表格可能比较难用,格式如下:

| a    | b    | c    |
| —- | —- | —- |
| 1    | 2    | 3    |
| 3    | 2    | 1    |
: 我是表格 {#tbl:123}

表头和表内容用分隔,在末尾处用来声明表的名字。现在我们再使用刚刚的命令:

pandoc –filter pandoc-crossref –citeproc –bibliography=test.bib test.md -o test.docx

表格也能正常地引用,同样也有重复出现的问题。至于表格位置是居左的,这也可以在模版中进行设置。

接下来就是一些可能会用到的细节,我们可能在引用图表的时候遇见这些问题:

  1. 图表能按章节显示吗?例如

  2. 图表的前缀可以修改吗?例如

  3. 正文里的引用前缀能修改吗?

答案是都可以,我们一一来看。

首先是按章节显示,我们通过指定参数就可以了。

pandoc –filter pandoc-crossref –citeproc –bibliography=test.bib \
-M chapters \
test.md -o test.docx

第二、三个问题,我们一起来看,同样通过指定来修改图片中的标题,默认是,而指定则是修改引文中的内容,默认是;至于表就改为相应的

经过我的测试,这些参数可以写在markdown前的YAML中,这里作为演示就放在pandoc参数中来演示:

pandoc –filter pandoc-crossref –citeproc –bibliography=test.bib \
-M chapters -M figureTitle=”图片” -M figPrefix=”图” -M tableTitle=”表格” \
-M tblPrefix=”表” \
test.md -o test.docx

很明显,bug还是会导致卡出这种问题出来。

以上就是我个人使用的一些总结,当然,pandoc还有很多很多的参数可供使用,很多我也没用过,大家有需要的话可以去官方手册查看,感谢大家的观看。

资源下载: