1 前言
学术论文写作,是科研工作的核心环节。写好一篇学术论文,不仅需要有大量的文献阅读、扎实的实证研究,还需要有清晰的逻辑思维、精准的表达能力。除此之外,「用什么工具写」也是一个非常重要的问题。在绝大多数情况下,学术论文的写作工具是 Microsoft Word,无论是学术期刊、学位论文、还是科研项目报告,Word 似乎都是不假思索的首选项。然而,作为一款文字处理软件,Word 却并不是最适合学术论文写作的工具。尤其是在参考文献管理、公式编辑、版本控制等方面。在理工科领域,LaTeX 是一种非常流行的学术论文写作工具。与 Word 不同,LaTeX 是一种排版系统,而不是所见即所得的文字处理软件,尽管它的排版效果非常出色,但学习曲线也相对陡峭。
在学术论文写作方面,Word 使用体验较差,LaTeX 学习曲线陡峭且只能生成 PDF,这两者似乎都不是完美的选择。有没有一种既易于上手,又能够满足学术论文写作需求的工具呢?答案是肯定的,这个工具就是 Markdown。作为一种轻量级标记语言,Markdown 的语法简单、易读易写。使用 Markdown 写作,不需要关心排版样式,只需要关注写作内容本身,在 Pandoc (MacFarlane et al., 2024) 的加持下,Markdown 可以输出多种格式的文档,例如 Word、HTML、LaTeX、PDF、EPUB 等。基于 Pandoc 开发的 Quarto (Allaire et al., 2024),不仅能够直接在论文中运行 Python、R 等代码,还增加了很多学术写作的实用功能,例如交叉引用、参考文献预览、可视化编辑等,是学术写作的理想工具 (Tenen et al., 2014)。
不论是 LaTeX、Markdown、Pandoc 还是 Quarto,都是基于英语写作的写作工具,对于中文写作者来说,这些工具的中文支持并不是很好,比如中文自由换行、中西文引号、中英文空格、中文按拼音排序等问题,都需要额外的配置和处理。
本项目的目的,就是基于 Quarto 提供一套完整的 Markdown 学术写作方案,解决中文写作者在使用 Markdown 写作时遇到的各种问题,包括中文引号处理、中西文自动添加空格、参考文献列表按拼音排序(包括多音字)、中文参考文献本地化等,最终输出为格式完美的 Word、HTML、PDF 等格式。
2 参考文献本地化
Pandoc 使用 CSL(Citation Style Language)来格式化参考文献信息,然而 CSL 不支持多语言的参考文献格式化,例如在 Pandoc 中将语言设置为 en-US
时,所有文献的本地化字符都会被转换为英文,例如 et al.
、vol.
、ed.
等。
本项目使用 Lua filter localiz-cnbib.lua
来解决这个问题。
2.1 “et al.” 替换为「等」
在 author-date 样式中,正文中超过一个作者时,只显示第一作者,英文文献后用 et al.
表示 (Acemoglu et al., 2019; Gao et al., 2023; Pang et al., 2004; Krewinkel et al., 2017; Flint et al., 2018)。对于中文文献,et al.
则应该替换为 等
(秦晖 等, 2019; 伊莎白 等, 2018; 賈禎 等, 1979; 赵继之 等, 2024)。
对于参考文献表来说,超过 3 个作者时,也应该使用 et al.
或 等
来表示 (卢少微 等, 2015; Yang et al., 2023),以及更多例子 (Acemoglu et al., 2019; 葛延风 等, 2020; 曹晶晶 等, 2020; Amarante et al., 2022; Daviet et al., 2022)。
2.2 “vol.” 替换为「第 X 卷」
在中文文献中,vol.
应该替换为 第 X 卷
(葛兆光, 2000; 中国人民大学清史研究所 等, 1983)。但英文文献中 vol.
仍然需要保留 (Fletcher, 1978b, 1978a, 1978c; Fairbank, 1968)。
2.3 “ed.” 和 “eds.” 替换为「编」
在中文文献中,eds.
和 ed.
应该替换为 编
(李鸿章, 2007; 梁启超, 2018; 伊莎白 等, 2018; 费孝通, 1989; 左宗棠, 1986),不过 ed.
既可以表示 编
,也可以表示 版
,相对比较复杂,请参考下面的例子。
2.4 “ed.” 替换为「编」或「版」
ed.
既可以表示 编
(费孝通, 1989; 左宗棠, 1986),也可以表示 版
(秦晖 等, 2019; 陶希圣, 2016),虽然非常灵活,但也给替换带来了一定的困难,不过好在判断条件比较明确。
2.5 “tran.” 和 “trans.” 替换为「译」
在中文文献中,tran.
和 trans.
应该替换为 译
(韩起澜, 2004; 伊莎白 等, 2018; 迈克尔·赫克特, 2012; 陆德芙 等, 2019)。
值得一提的是,Lua filter localiz-cnbib.lua
同时支持 author-date 和 numeric 两种引用格式,并且在 link-citation
开启或关闭时都能正常工作。当然,上述替换只考虑了常见中文文献字符本地化的情况,如果有其他字符需要本地化,请自行修改 localiz-cnbib.lua
文件,或者提交 issue 给我。
需要注意,本项目中 gb-author-date.csl
和 gb-numeric.csl
是我根据 Zotero Styles 网站下载的 CSL 样式文件修改而来。与原始样式文件相比,我修改之后的样式文件更加符合 GB/T 7714-2015 的标准,localiz-cnbib.lua
也是根据这两个样式文件的格式来编写的,因此 localiz-cnbib.lua
可能无法正常工作在其他 CSL 样式文件上。
3 中文参考文献按照拼音排序
在著者年份制的参考文献表中,中文参考文献一般需要按照拼音排序。基于 GB/T 7714-2015 的 BibLaTeX 样式包 biblatex-gb7714-2015 支持使用 biber
对中文文献按照排序,但对于 Pandoc 使用的 Citeproc 来说,并不支持这个功能。因此,中文参考文献的排序问题一直是一个头疼的问题。
本项目使用 Python filter sort-cnbib.py
来解决这个问题,借助 Python 的 pypinyin
库获取中文文献的著者拼音,然后通过 Panflute (Correia, 2024) 修改 Pandoc AST,根据拼音对中文文献进行排序,并且对姓氏读音的多音字进行了特殊处理:
def special_pinyin(text):
# 多音字的姓氏拼音
= {
surname_map '葛': 'ge3',
'阚': 'kan4',
'任': 'ren2',
'单': 'shan4',
'解': 'xie4',
'燕': 'yan1',
'尉': 'yu4',
'乐': 'yue4',
'曾': 'zeng1',
'查': 'zha1',
}
if contains_chinese(text):
= text.split(",")[0] if "," in text else text
name = name[0]
surname return surname_map.get(surname, "".join([i[0] for i in pinyin(name, style=Style.TONE3)]))
else:
return None
对于参考文献中中文和英文文献哪个在前的问题,各个学校和期刊的要求不一样,有的要求中文在前,有的要求非中文(英文)在前。sort-cnbib.py
默认是英文在前,如果你需要在中文在前,可以将对应代码修改为:
for elem in doc.content:
if isinstance(elem, pf.Div) and "references" in elem.classes:
= doc.chinese_entries + doc.non_chinese_entries
elem.content break
需要注意的是,sort-cnbib.py
只需用于 author-date 引用格式,numeric 引用格式不需要排序,因为数字本身就是有序的。
4 中文引号的处理
中文排版之难,引号为首。引号的处理,是中文排版非常 tricky 的问题,「万恶之源」在于是简体中文和英文的引号相同,但却要求呈现出不同的效果。具体来说,简体中文使用的引号 “
、”
、‘
、’
和英语使用的蝌蚪引号是完全一样的,但由于中文字符较宽,所以在排版时需要让包裹中文的引号看上去更宽一些,而包裹英文的引号看上去更窄一些,特别是在 Word 中。
正是由于这个原因,不少网友会使用繁体中文的直角引号 「
、」
、『
、』
来替代简体中文的引号,然而中华人民共和国的国家标准规定了使用简体中文的引号,在正式的学术论文中,不推荐使用这种写法。
为了解决这个问题,本项目提供了一套完整的引号处理方案,具体来说,在 Markdown 中使用直角引号 「
、」
、『
、』
,借助以下这几个 Lua filters,可以实现引号的自动转换:
docx-quotes.lua
:处理 Word 正文中的引号,使包裹中文的引号看上去更宽。cnbib-quotes.lua
:处理 Word 和 HTML 参考文献中的引号,使 Word 包裹中文的引号看上去更宽,HTML 将蝌蚪引号转换为直角引号。latex-quotes.lua
:处理 LaTeX 中的引号,将中文直角引号转换为德语引号(其他东欧语系也有类似的引号),然后通过 newunicodechar 宏包将其转换为蝌蚪引号,并对标题中的中文引号进行特别处理。
这样,无论是在 Word 中还是在 LaTeX 中,都可以得到符合规范的引号效果,而对于 HTML 来说,则做「反向处理」,将包裹中文的蝌蚪引号转换为直角引号。
5 中西文盘古之白
pangu.js 中提到:
有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。
尽管手动在中英文、数字之间加一个空格是一个好 习惯,然而在实际写作中,我们往往会忘记这个细节,因此在排版时,我们可以借助工具来自动完成这个工作。
本项目提供了一个 Python filter auto-correct.py
来解决这个问题,借助 AutoCorrect (Lee, 2024) 的 Python 库,「自动纠正」或「检查并建议」文案,给 CJK(中文、日语、韩语)与英文混写的场景,补充正确的空格,纠正单词,同时尝试以安全的方式自动纠正标点符号等。
通过 auto-correct.py
filter,可以实现修改 Pandoc AST,在 Pandoc 转换过程中自动纠正中英文、数字之间的空格问题,无需在得到目标格式后再进行修改,特别是对于某些格式(如 EPUB)来说,无法在转换完成后再进行修改,因此这个 filter 的优势就体现出来了。
需要注意的是,LaTeX 和 Word 会自动处理中英文之间的空格,因此无需使用这个 Python filter,只有在转换为其他格式时才需要使用,例如 HTML、EPUB 等格式。