1
0

feat: add support for english thesis

This commit is contained in:
2026-06-23 15:10:11 +08:00
parent 89f9ce9e50
commit fd4b24153f
5 changed files with 510 additions and 18 deletions

View File

@@ -22,7 +22,8 @@ uv run pandoc <thesis.tex> \
-s \ -s \
-f latex -t docx \ -f latex -t docx \
--citeproc \ --citeproc \
--metadata-file=meta.yaml \ --metadata-file=shared-meta.yaml \
--metadata-file=chinese-meta.yaml \
-F pandoc-tex-numbering \ -F pandoc-tex-numbering \
--resource-path <path-to-tex-dir> \ --resource-path <path-to-tex-dir> \
--reference-doc=my-thesis.docx \ --reference-doc=my-thesis.docx \
@@ -36,7 +37,8 @@ uv run pandoc <thesis.tex> \
- `-s`表示Standalone模式用于表示生成一个独立的文档而不仅仅是文档片段。 - `-s`表示Standalone模式用于表示生成一个独立的文档而不仅仅是文档片段。
- `-f latex -t docx`用于显式指定输入输出格式。 - `-f latex -t docx`用于显式指定输入输出格式。
- `--citeproc`用于启用引用解析功能,不启用就没有引用标识。 - `--citeproc`用于启用引用解析功能,不启用就没有引用标识。
- `--metadata-file=meta.yaml`指定了元数据,包括:引用文献样式和`pandoc-tex-numbering`过滤器等相关配置。 - `--metadata-file=shared-meta.yaml`指定了中英文共享的元数据,包括:开启要求将文内引用连接到文末参考列表文献等。以及`pandoc-tex-numbering`过滤器的基础共享配置
- `--metadata-file=chinese-meta.yaml`指定了中文论文需要的元数据,如果你正在处理纯英文论文,请切换到`english-meta.yaml`。这部分元数据包括:参考文献样式,以及`pandoc-tex-numbering`过滤器的引用文本配置等。
- `-F pandoc-tex-numbering`显式指定使用`pandoc-tex-numbering`过滤器。 - `-F pandoc-tex-numbering`显式指定使用`pandoc-tex-numbering`过滤器。
- `--resource-path <path-to-tex-dir>`用于设置LaTeX资源文件夹。Pandoc会在你指定的`<path-to-tex-dir>`文件夹中查找文档中引用的图片和子文档等内容。一般来说需要设置为你待转换的LaTeX文件所在的文件夹的路径。 - `--resource-path <path-to-tex-dir>`用于设置LaTeX资源文件夹。Pandoc会在你指定的`<path-to-tex-dir>`文件夹中查找文档中引用的图片和子文档等内容。一般来说需要设置为你待转换的LaTeX文件所在的文件夹的路径。
- `--reference-doc=my-thesis.docx`设置了转换到DOCX格式时使用的模板。你也可以把`my-thesis.docx`换成你想要的模板,至于如何编辑属于你的模板,请参考后文。 - `--reference-doc=my-thesis.docx`设置了转换到DOCX格式时使用的模板。你也可以把`my-thesis.docx`换成你想要的模板,至于如何编辑属于你的模板,请参考后文。
@@ -122,7 +124,7 @@ git apply -R --directory pandoc/.venv/Lib/site-packages/pandoc_tex_numbering num
目前该环境存在以下缺点: 目前该环境存在以下缺点:
- 不能够按照原生Word编写的方式使用交叉引用来进行文献和图表的引用。我不打算在这个环境中通过Pandoc Filter来解决这个问题我打算直接通过编写专门的转换器来解决详见XThesis分支 - 不能够按照原生Word编写的方式使用交叉引用来进行文献和图表的引用。我不打算在这个环境中通过Pandoc Filter来解决这个问题我打算直接通过未来规划中的专门的转换器来解决。
- 不能够将LaTeX的`\clearpage``\newpage`换页指令翻译成换页符。我写了一个Lua Filter来完成这个工作现存的也有官方的过滤器可以完成这一工作但它必须启用`latex+raw_tex`扩展后才能正常使用。但是这个`raw_tex`扩展带来的副作用远大于启用其的好处。首先是我各种图片的大小设置全部失效了,另外,面对不认识的环境名,它也不输出环境中的内容了。 - 不能够将LaTeX的`\clearpage``\newpage`换页指令翻译成换页符。我写了一个Lua Filter来完成这个工作现存的也有官方的过滤器可以完成这一工作但它必须启用`latex+raw_tex`扩展后才能正常使用。然而这个`raw_tex`扩展带来的副作用远大于启用其的好处。首先是我各种图片的大小设置全部失效了,另外,面对不认识的环境名,它也不输出环境中的内容了。
- 不能够处理不认识的命令。我的LaTeX文档中用了一些自定义的命令这些命令它不识别就算了它连其参数都不愿意以字面量输出出来。比如`\my_style{Keywords}`,它直接什么都不输出,但我期望他能够至少把`Keywords`输出出来,即使在不认识`\my_style`的情况下。 - 不能够处理不认识的命令。我的LaTeX文档中用了一些自定义的命令这些命令它不识别就算了它连其参数都不愿意以字面量输出出来。比如`\my_style{Keywords}`,它直接什么都不输出,但我期望他能够至少把`Keywords`输出出来,即使在不认识`\my_style`的情况下。

View File

@@ -1,40 +1,31 @@
# ===== Pandoc ===== # ===== Pandoc =====
# 引用文献设置 # 引用文献设置
csl: chinese-thesis.csl # 设置引用文献样式 csl: chinese-thesis.csl # 设置引用文献样式。该样式基于GB/T 7714-2005。
link-citations: true # 正文中引用的文献需要交叉引用到文献列表
link-bibliography: false # 文献中的链接不要引出
# ===== pandoc-tex-numbering Filter ===== # ===== pandoc-tex-numbering Filter =====
# 杂项设置 # 图表标题格式控制
number-theorems: false numbering-caption-delimiter: "\\ " # 不要删除`\\`字符它是空白的Escape控制符。
numbering-caption-delimiter: "\\ " # Do NOT delete \\. It is the escape for space. prefix-space: false
prefix-space: true
section-max-levels: 3
number-reset-level: 0 # 编号不需要按章节重置因此设置为0表示在最顶层的层级的父级才重置编号即不重置编号
# 章节编号设置 # 章节编号设置
number-sections: true
section-numstyle: "arabic" section-numstyle: "arabic"
section-src-format-1: "{num}" section-src-format-1: "{num}"
section-src-format-2: "{num}" section-src-format-2: "{num}"
section-src-format-3: "{num}" section-src-format-3: "{num}"
# 公式编号设置 # 公式编号设置
number-equations: true
equation-numstyle: "arabic" equation-numstyle: "arabic"
equation-prefix: "公式" equation-prefix: "公式"
equation-src-format: "\\qquad ({this_num})" equation-src-format: "\\qquad ({this_num})"
equation-cref-format: "{prefix}{this_num}" equation-cref-format: "{prefix}{this_num}"
equation-ref-format: "{this_num}" equation-ref-format: "{this_num}"
# 图片编号设置 # 图片编号设置
number-figures: true
figure-numstyle: "arabic" figure-numstyle: "arabic"
figure-prefix: "图" figure-prefix: "图"
figure-src-format: "{prefix}{this_num}" figure-src-format: "{prefix}{this_num}"
figure-cref-format: "{prefix}{this_num}" figure-cref-format: "{prefix}{this_num}"
figure-ref-format: "{this_num}" figure-ref-format: "{this_num}"
# 表格编号设置 # 表格编号设置
number-tables: true
table-prefix: "表"
table-numstyle: "arabic" table-numstyle: "arabic"
table-prefix: "表"
table-src-format: "{prefix}{this_num}" table-src-format: "{prefix}{this_num}"
table-cref-format: "{prefix}{this_num}" table-cref-format: "{prefix}{this_num}"
table-ref-format: "{this_num}" table-ref-format: "{this_num}"

32
pandoc/english-meta.yaml Normal file
View File

@@ -0,0 +1,32 @@
# ===== Pandoc =====
# 引用文献设置
csl: english-thesis.csl # 设置引用文献样式。该样式基于IEEE Transaction。
# ===== pandoc-tex-numbering Filter =====
# 图表标题格式控制
# TODO: 等版本更新后,删除该内容,然后将下文格式中的冒号删除
# numbering-caption-delimiter: ":"
prefix-space: true
# 章节编号设置
section-numstyle: "arabic"
section-src-format-1: "{num}"
section-src-format-2: "{num}"
section-src-format-3: "{num}"
# 公式编号设置
equation-numstyle: "arabic"
equation-prefix: "Equation"
equation-src-format: "\\qquad ({this_num})"
equation-cref-format: "{Prefix}{this_num}"
equation-ref-format: "{this_num}"
# 图片编号设置
figure-numstyle: "arabic"
figure-prefix: "Figure"
figure-src-format: "{Prefix}{this_num}:"
figure-cref-format: "{Prefix}{this_num}"
figure-ref-format: "{this_num}"
# 表格编号设置
table-numstyle: "arabic"
table-prefix: "Table"
table-src-format: "{Prefix}{this_num}:"
table-cref-format: "{Prefix}{this_num}"
table-ref-format: "{this_num}"

453
pandoc/english-thesis.csl Normal file
View File

@@ -0,0 +1,453 @@
<?xml version="1.0" encoding="utf-8"?>
<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="sort-only">
<info>
<title>IEEE</title>
<id>http://www.zotero.org/styles/ieee</id>
<link href="http://www.zotero.org/styles/ieee" rel="self"/>
<!-- <link href="https://ieeeauthorcenter.ieee.org/wp-content/uploads/IEEE-Reference-Guide.pdf" rel="documentation"/> - 2018 guidelines -->
<link href="http://journals.ieeeauthorcenter.ieee.org/wp-content/uploads/sites/7/IEEE_Reference_Guide.pdf" rel="documentation"/>
<link href="https://journals.ieeeauthorcenter.ieee.org/your-role-in-article-production/ieee-editorial-style-manual/" rel="documentation"/>
<author>
<name>Michael Berkowitz</name>
<email>mberkowi@gmu.edu</email>
</author>
<contributor>
<name>Julian Onions</name>
<email>julian.onions@gmail.com</email>
</contributor>
<contributor>
<name>Rintze Zelle</name>
<uri>http://twitter.com/rintzezelle</uri>
</contributor>
<contributor>
<name>Stephen Frank</name>
<uri>http://www.zotero.org/sfrank</uri>
</contributor>
<contributor>
<name>Sebastian Karcher</name>
</contributor>
<contributor>
<name>Giuseppe Silano</name>
<email>g.silano89@gmail.com</email>
<uri>http://giuseppesilano.net</uri>
</contributor>
<contributor>
<name>Patrick O'Brien</name>
</contributor>
<contributor>
<name>Brenton M. Wiernik</name>
</contributor>
<contributor>
<name>Oliver Couch</name>
<email>oliver.couch@gmail.com</email>
</contributor>
<category citation-format="numeric"/>
<category field="engineering"/>
<category field="generic-base"/>
<summary>IEEE style as per the 2021 guidelines, V 01.29.2021.</summary>
<updated>2021-05-07T00:52:46+10:00</updated>
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
</info>
<locale xml:lang="en">
<date form="text">
<date-part name="month" form="short" suffix=" "/>
<date-part name="day" form="numeric-leading-zeros" suffix=", "/>
<date-part name="year"/>
</date>
<terms>
<term name="chapter" form="short">ch.</term>
<term name="presented at">presented at the</term>
<term name="available at">available</term>
</terms>
</locale>
<!-- Macros -->
<macro name="status">
<choose>
<if variable="page issue volume" match="none">
<text variable="status" text-case="capitalize-first" suffix="" font-weight="bold"/>
</if>
</choose>
</macro>
<macro name="edition">
<choose>
<if type="bill book chapter graphic legal_case legislation motion_picture paper-conference report song" match="any">
<choose>
<if is-numeric="edition">
<group delimiter=" ">
<number variable="edition" form="ordinal"/>
<text term="edition" form="short"/>
</group>
</if>
<else>
<text variable="edition" text-case="capitalize-first" suffix="."/>
</else>
</choose>
</if>
</choose>
</macro>
<macro name="issued">
<choose>
<if type="article-journal report" match="any">
<date variable="issued">
<date-part name="month" form="short" suffix=" "/>
<date-part name="year" form="long"/>
</date>
</if>
<else-if type="bill book chapter graphic legal_case legislation song thesis" match="any">
<date variable="issued">
<date-part name="year" form="long"/>
</date>
</else-if>
<else-if type="paper-conference" match="any">
<date variable="issued">
<date-part name="month" form="short"/>
<date-part name="year" prefix=" "/>
</date>
</else-if>
<else-if type="motion_picture" match="any">
<date variable="issued" form="text" prefix="(" suffix=")"/>
</else-if>
<else>
<date variable="issued" form="text"/>
</else>
</choose>
</macro>
<macro name="author">
<names variable="author">
<name and="text" et-al-min="7" et-al-use-first="1" initialize-with=". "/>
<label form="short" prefix=", " text-case="capitalize-first"/>
<et-al font-style="italic"/>
<substitute>
<names variable="editor"/>
<names variable="translator"/>
</substitute>
</names>
</macro>
<macro name="editor">
<names variable="editor">
<name initialize-with=". " delimiter=", " and="text"/>
<label form="short" prefix=", " text-case="capitalize-first"/>
</names>
</macro>
<macro name="locators">
<group delimiter=", ">
<text macro="edition"/>
<group delimiter=" ">
<text term="volume" form="short"/>
<number variable="volume" form="numeric"/>
</group>
<group delimiter=" ">
<number variable="number-of-volumes" form="numeric"/>
<text term="volume" form="short" plural="true"/>
</group>
<group delimiter=" ">
<text term="issue" form="short"/>
<number variable="issue" form="numeric"/>
</group>
</group>
</macro>
<macro name="title">
<choose>
<if type="bill book graphic legal_case legislation motion_picture song" match="any">
<text variable="title" font-style="italic"/>
</if>
<else>
<text variable="title" quotes="true"/>
</else>
</choose>
</macro>
<macro name="publisher">
<choose>
<if type="bill book chapter graphic legal_case legislation motion_picture paper-conference song" match="any">
<group delimiter=": ">
<text variable="publisher-place"/>
<text variable="publisher"/>
</group>
</if>
<else>
<group delimiter=", ">
<text variable="publisher"/>
<text variable="publisher-place"/>
</group>
</else>
</choose>
</macro>
<macro name="event">
<choose>
<if type="paper-conference speech" match="any">
<choose>
<!-- Published Conference Paper -->
<if variable="collection-editor editor editorial-director issue page volume" match="any">
<group delimiter=", ">
<group delimiter=" ">
<text term="in"/>
<text variable="container-title" font-style="italic"/>
</group>
<text variable="event-place"/>
</group>
</if>
<!-- Unpublished Conference Paper -->
<else>
<group delimiter=", ">
<group delimiter=" ">
<text term="presented at"/>
<text variable="event"/>
</group>
<text variable="event-place"/>
</group>
</else>
</choose>
</if>
</choose>
</macro>
<macro name="access">
<choose>
<if type="webpage post post-weblog" match="any">
<!-- https://url.com/ (accessed Mon. DD, YYYY). -->
<choose>
<if variable="URL">
<group prefix=" " delimiter=" ">
<text variable="URL"/>
<group delimiter=" " prefix="(" suffix=").">
<text term="accessed"/>
<date variable="accessed" form="text"/>
</group>
</group>
</if>
</choose>
</if>
<else-if match="any" variable="DOI">
<!-- doi: 10.1000/xyz123. -->
<text variable="DOI" prefix=" doi: " suffix="."/>
</else-if>
<else-if variable="URL">
<!-- Accessed: Mon. DD, YYYY. [Medium]. Available: https://URL.com/ -->
<group delimiter=". " prefix=" " suffix=". ">
<!-- Accessed: Mon. DD, YYYY. -->
<group delimiter=": ">
<text term="accessed" text-case="capitalize-first"/>
<date variable="accessed" form="text"/>
</group>
<!-- [Online Video]. -->
<group prefix="[" suffix="]" delimiter=" ">
<choose>
<if variable="medium" match="any">
<text variable="medium" text-case="capitalize-first"/>
</if>
<else>
<text term="online" text-case="capitalize-first"/>
<choose>
<if type="motion_picture">
<text term="video" text-case="capitalize-first"/>
</if>
</choose>
</else>
</choose>
</group>
</group>
<!-- Available: https://URL.com/ -->
<group delimiter=": " prefix=" ">
<text term="available at" text-case="capitalize-first"/>
<text variable="URL"/>
</group>
</else-if>
</choose>
</macro>
<macro name="page">
<choose>
<if type="article-journal" variable="number" match="all">
<group delimiter=" ">
<text value="Art."/>
<text term="issue" form="short"/>
<text variable="number"/>
</group>
</if>
<else>
<group delimiter=" ">
<label variable="page" form="short"/>
<text variable="page"/>
</group>
</else>
</choose>
</macro>
<macro name="citation-locator">
<group delimiter=" ">
<choose>
<if locator="page">
<label variable="locator" form="short"/>
</if>
<else>
<label variable="locator" form="short" text-case="capitalize-first"/>
</else>
</choose>
<text variable="locator"/>
</group>
</macro>
<macro name="geographic-location">
<group delimiter=", " suffix=".">
<choose>
<if variable="publisher-place">
<text variable="publisher-place" text-case="title"/>
</if>
<else-if variable="event-place">
<text variable="event-place" text-case="title"/>
</else-if>
</choose>
</group>
</macro>
<!-- Citation -->
<citation collapse="citation-number">
<sort>
<key variable="citation-number"/>
</sort>
<layout delimiter=", ">
<group prefix="[" suffix="]" delimiter=", ">
<text variable="citation-number"/>
<text macro="citation-locator"/>
</group>
</layout>
</citation>
<!-- Bibliography -->
<bibliography entry-spacing="0" second-field-align="flush">
<layout>
<!-- Citation Number -->
<text variable="citation-number" prefix="[" suffix="]"/>
<!-- Author(s) -->
<text macro="author" suffix=", "/>
<!-- Rest of Citation -->
<choose>
<!-- Specific Formats -->
<if type="article-journal">
<group delimiter=", ">
<text macro="title"/>
<text variable="container-title" font-style="italic" form="short"/>
<text macro="locators"/>
<text macro="page"/>
<text macro="issued"/>
<text macro="status"/>
</group>
<choose>
<if variable="URL DOI" match="none">
<text value="."/>
</if>
<else>
<text value=","/>
</else>
</choose>
<text macro="access"/>
</if>
<else-if type="paper-conference speech" match="any">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text macro="event"/>
<text macro="issued"/>
<text macro="locators"/>
<text macro="page"/>
<text macro="status"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="report">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text macro="publisher"/>
<group delimiter=" ">
<text variable="genre"/>
<text variable="number"/>
</group>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="thesis">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text variable="genre"/>
<text macro="publisher"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="webpage post-weblog post" match="any">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text variable="container-title" font-style="italic"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="patent">
<group delimiter=", ">
<text macro="title"/>
<text variable="number"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<!-- Online Video -->
<else-if type="motion_picture">
<text macro="geographic-location" suffix=". "/>
<group delimiter=", " suffix=".">
<text macro="title"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<!-- Generic/Fallback Formats -->
<else-if type="bill book graphic legal_case legislation report song" match="any">
<group delimiter=", " suffix=". ">
<text macro="title"/>
<text macro="locators"/>
</group>
<group delimiter=", " suffix=".">
<text macro="publisher"/>
<text macro="issued"/>
<text macro="page"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="article-magazine article-newspaper broadcast interview manuscript map patent personal_communication song speech thesis webpage" match="any">
<group delimiter=", " suffix=".">
<text macro="title"/>
<text variable="container-title" font-style="italic"/>
<text macro="locators"/>
<text macro="publisher"/>
<text macro="page"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else-if>
<else-if type="chapter paper-conference" match="any">
<group delimiter=", " suffix=", ">
<text macro="title"/>
<group delimiter=" ">
<text term="in"/>
<text variable="container-title" font-style="italic"/>
</group>
<text macro="locators"/>
</group>
<text macro="editor" suffix=" "/>
<group delimiter=", " suffix=".">
<text macro="publisher"/>
<text macro="issued"/>
<text macro="page"/>
</group>
<text macro="access"/>
</else-if>
<else>
<group delimiter=", " suffix=". ">
<text macro="title"/>
<text variable="container-title" font-style="italic"/>
<text macro="locators"/>
</group>
<group delimiter=", " suffix=".">
<text macro="publisher"/>
<text macro="page"/>
<text macro="issued"/>
</group>
<text macro="access"/>
</else>
</choose>
</layout>
</bibliography>
</style>

14
pandoc/shared-meta.yaml Normal file
View File

@@ -0,0 +1,14 @@
# ===== Pandoc =====
# 引用文献设置
link-citations: true # 正文中引用的文献需要交叉引用到文献列表
link-bibliography: false # 文献中的链接不要引出
# ===== pandoc-tex-numbering Filter =====
# 杂项设置
section-max-levels: 3 # 标题最大三级深度
number-reset-level: 0 # 编号不需要按章节重置因此设置为0表示在最顶层的层级的父级才重置编号即不重置编号
number-theorems: false # 不对定理进行编码
number-sections: true # 对章节编号
number-equations: true # 对公式编号
number-figures: true # 对图片编号
number-tables: true # 对表格编号