跳转至

撰写指南

我们建议您做好 demo 目录下所有文件的备份,最好一开始就复制一份出来。如果您没有足够的耐心阅读文档,我们更建议运用脚手架开始写作,且时常运行生成命令以检查错误,而不是从一份空白的 Markdown 文档开始。

Markdown

Markdown 的基础语法,我相信凭借自己实力找到这个项目的人已经有所了解。

但如果您还不会 Markdown,我建议您花费一些时间学习它。您可以参考这个教程,或是这个知乎问题

单纯的 Markdown 并不足以支持我们完成毕业论文的生成。因此,请继续向下看。

Pandoc Markdown

由于 Markdown 到 docx 转换采用的是 Pandoc[@Pandoc],这里就不得不提 Pandoc Markdown 语法了。您可以在撰写时使用 Pandoc Markdown 语法实现一些 Pandoc 特性,不过这可能需要您对 Pandoc 有着熟练掌握,并按需修改 filter.py。具体细节,请查阅官方文档,或是这份(可能有些过时的)中文翻译

请放心,不会 Pandoc Markdown 语法并不会影响您对本项目的使用。

自定义类 \(\LaTeX\) 命令

Info

这一节中包含封面、原创性声明、中英文摘要、目录等的生成。

您可以使用我们自定义的一些类 \(\LaTeX\) 命令辅助 docx 的排版。相信您应该已经在本文件的开头部分见过它们了:

\cover - 封面
\statementOfOriginality - 原创性声明
\abstract - 生成中文摘要
\abstractEn - 生成英文摘要
\toc - 目录
\newSectionInNewPage - 分节符(下一页)
\newSection - 分节符
\pageBreak - 分页符

比如,依照撰写规范[@ShaMenDa],引言及正文之间是需要另起一页的。所以,您应该在引言与第一章之间,插入一个 \pageBreak

Tip

如若您的学院要求“每个章节以新一页作为开始”,则也需在正文的每个章节标题前插入一个 \pageBreak

Warning

必须在文档开头插入一个 \newSectionInNewPage

Pandoc 在生成时,会自动在文档开头生成元数据中的标题、作者等信息,这对我们来说是多余的。因此,在后处理流程中,我们会删除第一个 \newSectionInNewPage 及其之前的所有内容。

部分 Markdown 编辑器支持 [TOC] 目录。您也可以在适当位置插入 [TOC],我们的过滤器会将 [TOC] 视为 \toc。这些命令的转换过程发生在项目根目录的 filter.py 中,您可以自行前往,查看具体的转换与实现。

封面、原创性声明均取自学校提供的模板文件,唯进行了排版的优化,如将“回车换页”优化为了更科学的分页符换页,此改动不会影响您的使用。

元数据

Info

这一节中包含封面中的标题、作者、院系、专业、学号、指导教师、职称等信息的配置,以及中英文摘要和关键词的配置。

demo/metadata.yaml 文件以及脚手架中的 metadata.yaml 均是我们的元数据文件。在该文件中,您可以修改封面中的标题、作者等信息,撰写您的摘要,也可以进行一些诸如图片自动编号、表格自动编号、公式自动编号的配置。

您可以用代码或文本编辑器打开 YAML 文件进行编辑。如果您并不熟悉 YAML 语法,请在完成编辑后将全部内容复制到 YAML 校验工具进行校验,通过后再进行保存。

Tip

YAML 的注释用 #

Tip

元数据中的 abstractabstractEn 字段,我们强烈建议您在一行内完成撰写。如果您觉得一行不够“优雅”、希望分段呈现,则您必须在每段之间空一行(实际上便是在每段后加入两个换行符、按两下回车)。如果您仅使用一个回车、不在段落中空一行,您的中文摘要可能出现意想不到的情况,例如句间的空格。

封底

默认会在文档末尾生成空白页作为封底。如您不需要,请参阅命令行参数一章中的不在文档末尾生成空白页作为封底一节,在生成命令后加上参数 --no-blank-back-cover

段落

自由地按照 Markdown 语法撰写段落即可。要创建段落,请使用空白行将一行或多行文本进行分隔。不要用空格或制表符缩进段落。

Tip

如您需保留一个空段落——或者更通常意义上的“换行”;例如,您的指导老师要求您在“结论”后空一行;那您应该在结论后空出一段,并在那一段落中输入四个空格。由于 Markdown 靠两个换行符进行段落的划分,因此,实际的 Markdown 应该表现为:结论与结论第一段之间空出三行,在其中的第二行输入四个空格。

章节标题及自动编号

不同于 Markdown 文件中通常只出现一个一级标题,在我们的 Markdown 中,第几级标题便是几级标题。这意味着,您的一级标题“绪论”,应该使用 Markdown 的一级标题语法:# 绪论

引言、结论、致谢、参考文献、附录也采用一级标题。为了正确生成对应的样式,您的引言、结论、致谢、参考文献、附录,能且只能取值为:引言、总结、结论、致谢、致谢语、参考文献、附录。具体细节,请参阅模板文件样式说明一节。如果您变换了这些标题,它们将无法得到正确处理。

我们默认配置了章节标题自动编号——包括每章开头自动转变为“第 x 章”,您仅需在 Markdown 中行云流水地创作即可。如果您选择了章节标题自动编号,正如 demo/readme.md 与脚手架所展示的那样,您还需要在引言、结论、致谢、参考文献、附录的后面加上 {.unnumbered},这会让 Pandoc 意识到这几节是无需自动编号的。

当然,您也可以选择手动编号——这将给您标题编号的更多自由度,比如结构为:

  • 第一章
    • (一)
      • 1.
        • (1)

等,这需要您在撰写标题时就手动加入。您需要手动撰写标题如 # 第一章 绪论而不像自动编号这样的 # 绪论。此外,您还需要在根目录的 processer.py 中找到 pandoc_process 函数,在其中注释以下内容:

--- processer.py
                      + '--csl "%s" ' % os.path.join(WHERE_SCRIPT, 'assets/chinese-gb7714-2005-numeric.csl')
-                     + '--number-sections '  # 章节自动编号
+                  #  + '--number-sections '  # 章节自动编号
                      + source)

图片、表格、公式的引用及自动编号

Info

自动编号是可选的。您完全可以按照 Markdown 语法手动进行编号。

Warning

该项目采用的是我们修改过的 pandoc-xnos 部分组件,但官方文档仍是适用的。

该功能采用 pandoc-xnos 过滤器套件实现[@Duck2022pandoc-xnos]。您可以在元数据文件中修改它的配置:

***-plus-name:  # 行内引用
***-star-name:  # 行首引用(汉字理论上是和行内没区别的,主要面向西文用户,大小写需求)
***-caption-name:  # 说明文字(题目)名称,如 图、Fig、Figure 等
***-caption-separator: space # 说明文字(题目)编号与说明文字(题目)分隔符,可取值为 none, colon, period, space, quad, newline
***-number-by-section: false # 是否按章节编号

有关我们自定义的配置项:

***-section-separator: '-' # 章节编号分隔符,如 1-1,若注释或删除则默认为 1.1

图片及自动编号

Warning

该项目采用的是我们修改过的 pandoc-fignos。但官方文档仍是适用的。

该功能采用 pandoc-fignos[Duck2022pandoc-fignos] 实现。

在 Word 中的显示效果则类似:

图片说明文字(题目):图 1.1 这是图片描述

图片引用:图 1.1

您可以像这样插入一张图片:

![Photo by Baim Hanif on Unsplash, Free to use under the Unsplash License](readme.assets/baim-hanif-pYWuOMhtc6k-unsplash.jpg){#fig:graduation}

其中,中括号内写图片的说明文字(题目),括号内是文件的路径,最后的大括号中 #fig: 来自 pandoc-fignos,冒号后需要是一个全文唯一的字符串或是数字。您可以通过 +@fig:graduation{nolink=True} 这样的语法去引用并实现自动编号,一般来说,行内引用以 + 开头,行首引用以 * 开头。nolink=True 表示不为引用生成超链接。当您引用时,如果选择添加超链接,您可能需要在引用命令外包裹以大括号:{+@fig:graduation}。具体配置均存放于元数据文件中,有关配置的具体细节,请参阅 pandoc-fignos 文档

Tip

我们建议您使用 Markdown 编辑器生成相对 Markdown 文件的相对路径,因为我们会默认 Markdown 文件所在目录为资源所在目录。

Info

若需修改自动编号格式,可在元数据文件中修改它的配置。

Tip

如果你需要修改章节分隔符,如从 图 1.1 变成 图 1-1,则应该在元数据中设置 fignos-section-separator: '-'

如果您想手动为图片编号,仅需按 Markdown 标准语法撰写:

![图 1.1 Photo by Baim Hanif on Unsplash, Free to use under the Unsplash License](readme.assets/baim-hanif-pYWuOMhtc6k-unsplash.jpg)

样例

Warning

样例部分唯有在生成的 docx 中才能看到最终效果。在 Markdown 编辑器或渲染结果中,您可以参考学习语法。

上述语法插入的图片来自 Unsplash 网站的 Baim Hanif,采用 Unsplash License 授权免费使用,如下+@fig:graduation{nolink=True}所示:

Photo by Baim Hanif on Unsplash,  Free to use under the Unsplash License{#fig:graduation}

另一张来自 Unsplash 网站 Joan Kwamboka 的图片,采用 Unsplash License 授权免费使用,如下{+@fig:graduation2}所示:

Photo by Joan Kwamboka on Unsplash, Free to use under the Unsplash License{#fig:graduation2}

表格及自动编号

Warning

该项目采用的是我们修改过的 pandoc-tablenos,但官方文档仍是适用的。

该功能采用 pandoc-tablenos[@Duck2022pandoc-tablenos] 实现。

在 Word 中的显示效果则类似:

表格说明文字(题目):表 1.1 这是表格描述

表格引用:表 1.1

表格的插入建议采用编辑器。目前,Markdown 中的表格并不支持合并单元格;HTML 表格也暂时不被支持。我们建议您留空所需的单元格,在生成 Word 文档后手动合并。我们的表格样式采用三线表,有关表格样式的详细情况,请参阅项目实现一章中的Table 一节。

您可以在表格前后这样这样插入表格的说明文字(题目):

: 知识共享许可协议的四项基本权利 {#tbl:CC_four_rights}

最后的大括号中 #tbl: 来自 pandoc-tablenos,冒号后需要是一个全文唯一的字符串或是数字。您可以通过 +@tbl:CC_four_rights{nolink=True} 这样的语法去引用并实现自动编号,一般来说,行内引用以 + 开头,行首引用以 * 开头。nolink=True 表示不为引用生成超链接。当您引用时,如果选择添加超链接,您可能需要在引用命令外包裹以大括号:{+@tbl:CC_four_rights}。具体配置均存放于元数据文件中,有关配置的具体细节,请参阅 pandoc-tablenos 文档

Info

若需修改自动编号格式,可在元数据文件中修改它的配置。

Tip

如果你需要修改章节分隔符,如从 表 1.1 变成 表 1-1,则应该在元数据中设置 tablenos-section-separator: '-'

如果您想手动为表格编号,仅需按如下语法撰写:

: 表 1.1 知识共享许可协议的四项基本权利 {#tbl:CC_four_rights}

样例

Warning

样例部分唯有在生成的 docx 中才能看到最终效果。在 Markdown 编辑器或渲染结果中,您可以参考学习语法。

下+@tbl:CC_four_rights{nolink=True}引用自知识共享许可协议 - 维基百科,自由的百科全书

: 知识共享许可协议的四项基本权利 {#tbl:CC_four_rights}

权利 备注
署名(英语:Attribution,by 您(用户)可以复制、发行、展览、表演、放映、广播或通过信息网络传播本作品;您必须按照作者或者许可人指定的方式对作品进行署名。
相同方式共享(英语:ShareAlike,sa 您可以自由复制、散布、展示及演出本作品;若您改变、转变或更改本作品,仅在遵守与本作品相同的授权条款下,您才能散布由本作品产生的派生作品。(参见 copyleft)。
非商业性使用(英语:Noncommercial,nc 您可以自由复制、散布、展示及演出本作品;您不得为商业目的而使用本作品。
禁止演绎(英语:No Derivative Works,nd) 您可以自由复制、散布、展示及演出本作品;您不得改变、转变或更改本作品。

下{+@tbl:open_source_licenses_comparison}引用自自由及开放原始码软体许可证比较 - 维基百科,自由的百科全书

: 自由及开放原始码软体许可证比较 {#tbl:open_source_licenses_comparison}

许可证 版本 包含许可证 包含原始码 连结 状态变化 商业使用 散布 修改 专利授权 私人使用 授权转售 无担保责任 没有商标
Apache 许可证 2.0
3 句版 BSD 许可证
2 句版 BSD 许可证
GNU 通用公共许可证 2.0
GNU 通用公共许可证 3.0
GNU 宽通用公共许可证 2.1
GNU 宽通用公共许可证 3.0

公式及自动编号

Warning

该项目采用的是我们修改过的 pandoc-eqnos,但官方文档仍是适用的。

该功能采用 pandoc-eqnos[@Duck2022pandoc-eqnos] 实现。

在 Word 中的显示效果则类似:

公式显示:pi = 3.14159265 (1.1)

公式引用:开启美国数学协会风格:式 (1.1)、关闭美国数学协会风格:式 1.1

美国数学协会风格默认关闭。您可以在 metadata.yaml 中修改它的配置,去除注释并设定为 true

eqnos-eqref: true # 开启美国数学协会(AMS)风格引用

您可以以下列语法输入公式:单行公式使用双美元符 $$ 包裹,行内公式使用单美元符 $ 包裹,公式需遵循 \(\TeX\) 语法,您可以使用LaTeX 公式编辑器辅助生成。

$$ \pi = 3.141592653589793238462643 \ldots $$ {#eq:pi}
$$ S = \pi \times r^{2} $$ {#eq:area_of_circle}

最后的大括号中 #eq: 来自 pandoc-eqnos,冒号后需要是一个全文唯一的字符串或是数字。您可以通过 +@eq:area_of_circle{nolink=True} 这样的语法去引用并实现自动编号,一般来说,行内引用以 + 开头,行首引用以 * 开头。nolink=True 表示不为引用生成超链接。当您引用时,如果选择添加超链接,您可能需要在引用命令外包裹以大括号:{+@eq:area_of_circle}。具体配置均存放于元数据文件中,有关配置的具体细节,请参阅 pandoc-eqnos 文档

Info

若需修改自动编号格式,可在元数据文件中修改它的配置。

Tip

如果你需要修改章节分隔符,如从 式 1.1 变成 式 1-1,则应该在元数据中设置 eqnos-section-separator: '-'

如果您想手动为公式编号,仅需按如下语法撰写:

$$ S = \pi \times r^{2} $$ (1.1)

样例

Warning

样例部分唯有在生成的 docx 中才能看到最终效果。在 Markdown 编辑器或渲染结果中,您可以参考学习语法。

$$ \pi = 3.141592653589793238462643 \ldots $$ {#eq:pi}

$$ S = \pi \times r^{2} $$ {#eq:area_of_circle}

*@eq:pi{nolink=True} 展现了圆周率 π,它是一个无理数。计算圆的面积,一般会用{+@eq:area_of_circle}。

行内公式,可以使用语法 $\pi = 3.141592653589793238462643 \ldots$ 。结果是这样的:\(\pi = 3.141592653589793238462643 \ldots\)

Warning

由于本文档中出现了部分的 \(\LaTeX\) 语法,在转换时可能出现 Warning,诸如 [WARNING] Could not convert TeX math \LaTeX, rendering as TeX: 。在撰写时,请尽量保证公式采用 \(\TeX\) 语法。

代码与代码高亮

Warning

代码块会采用 Consolas 字体,这可能无法符合部分指导老师对正文部分的要求。请谨慎使用。

代码请使用 Markdown 代码块。代码高亮风格,参阅Pandoc 文档 Syntax highlighting 一节。考虑到打印需求,我们采用了一个灰度风格monochrome。高亮风格的样例,可以在这里查看。如需修改,请在根目录的 processer.py 中找到 pandoc_process 函数中修改:

--- processer.py
                      # 资源文件路径,默认与输入文件一致
                      + '--resource-path="%s" ' % os.path.dirname(source)
-                     + '--highlight-style monochrome '  # 考虑到最后需要打印,选了个灰度的高亮风格
+                     + '--highlight-style pygments '  # 换成了 pygments 风格
                      + '--filter pandoc-fignos '  # 图片自动编号

参考文献及自动生成引文

参考文献放置

根据 Pandoc 文档 Placement of the bibliography,您需要在放置参考文献列表的地方放置以下文本:

::: {#refs}
:::

如不放置,将会在文末最后生成参考文献列表。

引文文件与引文自动生成

引文依靠 Pandoc 自动生成,需要提供一个 BibTeX 格式[@BibTeX]引文文件。您可以在 /demo/ref.bib 中找到本文使用的引文文件。具体教程,请参阅附录中的 Zotero 简明教程

您可以通过以下语法插入引文:[@BibTeX]。在希望插入引文的地方,插入方括号,@ 后跟 Zotero 内的 Citation Key 即可。

样例

Warning

样例部分唯有在生成的 docx 中才能看到最终效果。在 Markdown 编辑器或渲染结果中,您可以参考学习语法。

比如,我又引用了一遍 BibTeX 官网[@BibTeX]。