From c1fbde559d9a6e44d4d4c971d2c5a3cb959a0636 Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Sat, 13 Jun 2026 14:25:50 +0800 Subject: [PATCH] feat: add general docx template --- README.md | 60 ++++---------------------------- pandoc/.gitattributes | 2 ++ pandoc/README.md | 79 +++++++++++++++++++++++++++++++++++++----- pandoc/my-thesis.docx | Bin 0 -> 17362 bytes pandoc/pyproject.toml | 2 +- pandoc/uv.lock | 2 +- winword/README.md | 0 7 files changed, 81 insertions(+), 64 deletions(-) create mode 100644 pandoc/.gitattributes create mode 100644 pandoc/my-thesis.docx create mode 100644 winword/README.md diff --git a/README.md b/README.md index 2aa2fca..9236b06 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # BaGu Thesis -BaGu Thesis是一个专精于将LaTeX论文转换到DOCX格式转换的工具。它通过中间格式XThesis(基于XML)实现高质量的格式转换,特别适用于必须需要提交DOCX格式论文的场景。 +BaGu Thesis是一个专精于将LaTeX论文转换到DOCX格式转换的工具。它凭借Pandoc的文档转换能力,以及一系列附加脚本,来实现高质量的格式转换,特别适用于必须需要提交DOCX格式论文的场景。 ## 简介和项目创建缘由 @@ -10,65 +10,19 @@ BaGu Thesis是一个专精于将LaTeX论文转换到DOCX格式转换的工具。 本项目的存在,就是为了让你能够用LaTeX专注于内容创作,然后用最短的时间生成一个符合格式要求的DOCX文件,把时间浪费在更有意义的事情上:比如思考论文是否真的有意义,或者干脆出去玩一会儿。 -## 与其他方案的比较 - -你可能听说过pandoc,它是一个强大的通用文档转换工具,理论上可以实现LaTeX到DOCX的转换。我也尝试过 pandoc,包括使用了[pandoc-tex-numbering](https://github.com/fncokg/pandoc-tex-numbering)等过滤器来完成相似的任务,但效果均不尽人意。主要问题在于: - -1. **交叉引用问题**:pandoc 生成的DOCX在交叉引用上存在诸多问题,如图片编号、表格编号、公式编号、参考文献引用等,这些在pandoc转换后往往不符合纯粹使用DOCX格式制作论文的规范。例如参考文献的引用,通常是通过交叉引用列表项来实现的,而pandoc并不能做到这一点。 -1. **学习曲线陡峭**:为了达到我想要的交叉引用效果,我不得不需要去使用Lua语言写很多pandoc过滤器。我不熟悉Lua语言,不熟悉pandoc的Lua模块,也不知道这些任务到底能不能在pandoc里完成。 - -因此,我选择单开了一个项目,在AI的辅助下完成这一目标。本项目专精于论文的LaTeX到DOCX格式的转换,而非通用的文档转换器,能够更好地处理学术论文中的各种特殊需求。 - ## 使用方法 -本项目使用 `uv` 作为包管理工具,确保你已经安装了 `uv`,并初始化了项目。 +本项目由两部分组成,它们分别位于`pandoc`和`winword`文件夹中。 -整个项目分为两部分,首先将LaTeX转为XThesis格式,再将XThesis格式转为DOCX格式。 +一般来说,使用`pandoc`中的内容就足以将你的LaTeX文档转换成较为标准的DOCX文档了。但有时候,你的上级会给你发所谓的DOCX模板,这时候你就需要使用`winword`文件夹中提供的方法来将生成的DOCX文档套用到你的DOCX模板之上了。 -### LaTeX转XThesis格式 +有关如何使用这两部分,请分别查看`pandoc`和`winword`的README文件。 -使用以下命令将LaTeX格式转换为XThesis格式: +## 未来规划 -```bash -uv run latex2xthesis.py --in example.tex --out example.xml --config latex2xthesis.toml --resource-dir /path/to/your/example -``` +该项目未来计划编写专用的格式转换器,该转换器通过中间格式XThesis(基于XML)实现高质量的格式转换,而非依赖于Pandoc。这主要是因为Pandoc生成的DOCX在交叉引用上存在诸多问题,如图片编号、表格编号、公式编号、参考文献引用等。这些在Pandoc转换后往往不符合**纯粹**使用DOCX格式制作论文的规范。例如参考文献的引用,通常是通过交叉引用列表项来实现的,而Pandoc并不能做到这一点,尽管Pandoc生成的引用仍然可以被点击并转到正确引用源。如果一定要做到这一点,则需要编写大量的Pandoc Filter来实现,而我不熟悉Pandoc的API,也不知道这些任务能不能使用Pandoc Filter完成。 -**参数说明**: - -- `--in` 或 `-i`:指定输入的 LaTeX 文件路径(必选) -- `--out` 或 `-o`:指定输出的 XThesis XML 文件路径(必选) -- `--config` 或 `-c`:指定配置文件路径,用于控制转换过程中的各种选项(必选) -- `--resource-dir` 或 `-r`:指定资源文件路径,用于查找图片、参考文献等在你LaTeX文件中引用的外部资源。通常是你LaTeX文件所在的文件夹(必选) - -### XThesis转DOCX格式 - -使用以下命令将XThesis格式转换为DOCX格式: - -```bash -uv run xthesis2docx.py --in example.xml --out example.docx --config xthesis2docx.toml -``` - -**参数说明**: - -- `--in` 或 `-i`:指定输入的 XThesis XML 文件路径(必选) -- `--out` 或 `-o`:指定输出的 DOCX 文件路径(必选) -- `--config` 或 `-c`:指定配置文件路径,用于控制 DOCX 格式的各种样式和排版选项(必选) - -### 一站式转换 - -如果你不需要中间文件,可以直接使用以下命令将LaTeX格式转换为DOCX格式: - -```bash -uv run baguthesis.py --in example.tex --out example.docx --frontend-config latex2xthesis.toml --backend-config xthesis2docx.toml --resource-dir /path/to/your/example -``` - -**参数说明**: - -- `--in` 或 `-i`:指定输入的 LaTeX 文件路径(必选) -- `--out` 或 `-o`:指定输出的 DOCX 文件路径(必选) -- `--frontend-config`:指定前端配置文件路径(即LaTeX转XThesis的配置文件)(必选) -- `--backend-config`:指定后端配置文件路径(即XThesis转DOCX的配置文件)(必选) -- `--resource-dir` 或 `-r`:指定资源文件路径,用于查找图片、参考文献等在你LaTeX文件中引用的外部资源。通常是你LaTeX文件所在的文件夹(必选) +该计划的进度可在`xthesis`分支中进行浏览,但其远远达不到可供使用的地步。 ## 许可证 diff --git a/pandoc/.gitattributes b/pandoc/.gitattributes new file mode 100644 index 0000000..d050677 --- /dev/null +++ b/pandoc/.gitattributes @@ -0,0 +1,2 @@ +# See all DOCX file as binary +*.docx binary diff --git a/pandoc/README.md b/pandoc/README.md index 756f08c..8669dc1 100644 --- a/pandoc/README.md +++ b/pandoc/README.md @@ -1,12 +1,23 @@ # Pandoc Thesis Environment -适用于Pandoc,将LaTeX论文转换为DOCX格式论文的环境。 +适用于Pandoc的将LaTeX论文转换为DOCX格式论文的环境。 -这是我一开始尝试的,使用Pandoc配合pandoc filter来实现论文转换的环境。后来我觉得不太好,就放弃,转而开发本项目,但这个环境还是留着。 +# 必要条件 + +你需要一些必要条件来使用本环境: + +- Pandoc 3.9.0.2 + * 我强烈建议安装完全一致的版本,因为我曾看过一些Pandoc Filter需要与Pandoc版本完全一致才能使用,比如`pandoc-crossref`,而我不太清楚我现在用的Pandoc Filter是否有相似的要求,除非你完全确信你选择的版本可以运行(多试试也没坏处,如果你不是急着要转换文档的话)。 + * 安装完成后需要确保Pandoc在你的环境变量中。使用`pandoc --version`指令检查Pandoc版本并测试是否能成功找到Pandoc。 +- Python 3.11和Astral UV + * Python和UV的版本实际上限制不是那么大,没必要完全一致,确定能用即可。 + * Astral UV安装完后在本目录下运行`uv sync`来初始化环境。 # 用法 -```bash +在本目录下执行以下指令进行文档转换: + +```bat uv run pandoc \ -s \ -f latex -t docx \ @@ -14,14 +25,64 @@ uv run pandoc \ --metadata-file=meta.yaml \ -F pandoc-tex-numbering \ --resource-path \ + --reference-doc=my-thesis.docx \ -o ``` 参数解释: -- `-s`:Standalone模式 -- `-f latex -t docx`:显式指定输入输出格式 -- `--citeproc`:启用引用解析功能,不启用就没有引用标识 -- `--metadata-file=meta.yaml`:指定元数据,包括:引用文献样式,以及pandoc-tex-numbering过滤器的相关配置 -- `-F pandoc-tex-numbering`:使用pandoc-tex-numbering过滤器 -- `--resource-path`:设置LaTeX资源文件夹,要找的图片等内容,都会在这个文件夹里找,一般来说,就是你LaTeX文件所在的文件夹 +- `uv run pandoc`要求在UV的虚拟环境中执行Pandoc命令,让Pandoc能够找到在虚拟环境中安装的使用Python编写的Pandoc Filter。 +- ``在执行的时候替换为指向你待转换的LaTeX文档的路径。 +- `-s`表示Standalone模式,用于表示生成一个独立的文档,而不仅仅是文档片段。 +- `-f latex -t docx`用于显式指定输入输出格式。 +- `--citeproc`用于启用引用解析功能,不启用就没有引用标识。 +- `--metadata-file=meta.yaml`指定了元数据,包括:引用文献样式和`pandoc-tex-numbering`过滤器等相关配置。 +- `-F pandoc-tex-numbering`显式指定使用`pandoc-tex-numbering`过滤器。 +- `--resource-path `用于设置LaTeX资源文件夹。Pandoc会在你指定的``文件夹中查找文档中引用的图片和子文档等内容。一般来说,需要设置为你待转换的LaTeX文件所在的文件夹的路径。 +- `--reference-doc=my-thesis.docx`设置了转换到DOCX格式时使用的模板。你也可以把`my-thesis.docx`换成你想要的模板,至于如何编辑属于你的模板,请参考后文。 +- `-o `:在执行的时候将``替换为指向你存储转换后的DOCX文档的路径。 + +# DOCX模板 + +该目录下的`my-thesis.docx`文件是我已经编辑好的模板。该模板可以满足我的大部分的需求,输出也足够的美观。 + +## 创建模板 + +通常而言你无需重新创建该模板,但如果你更换了Pandoc的版本,或者你的格式需求与我不一致,你就需要重新创建属于你自己的DOCX模板。以下内容将讲述如何创建属于你自己的DOCX模板,这也是我创建我自己模板时的步骤。 + +### 导出默认模板 + +使用`pandoc -o --print-default-data-file reference.docx`来导出模板。其中: + +- ``是导出的DOCX模板的存放路径。 +- `--print-default-data-file`用于指示Pandoc导出内部模板。 +- `reference.docx`是固定文本,不得改变。 + +### 修改模板 + +使用Word,而非WPS,LibreOffice,macOS Word等软件,来修改此模板。打开模板后,你会发现其中包含一系列文本。这些文本是方便你预览效果用的,我们需要修改的是样式,修改样式后这些文本也会变化。 + +在Ribbon栏的“开始”选项卡下,找到“样式”部分,点击右下角的小箭头,展开“样式”对话框。可选的,你可以点击最下方的“选项...”按钮,将列表的排序方式选择为“按类型”以获得更好的浏览体验。 + +- 找到“正文”样式,它是几乎所有样式的基础,我们要在这里修改全局的字体设置。点击其右边的小箭头,选择“修改”,打开对话框。 + * 字体的中文改为宋体,西文改为Times New Roman,字号设置为小四。 + * 段落的间距改为段后0.5行。 +- 找到“正文文本”样式,它是所有正文文字的样式。其段落为首行缩进2字符。 +- 找到“标题1”至“标题9”样式,依次修改。将颜色设置为自动。中文改为黑体,西文保持Times New Roman。字号依次为:三号,四号,小四(后面全是小四)。并删除所有倾斜和加粗。 +- 找到“标题”样式,它是除了正文标题以外的其它标题的基础格式。将字体中文改为黑体,西文改为Times New Roman。 +- 找到“题注”样式,它是“Image Caption”和“Table Caption”这两个样式的基础。对其进行修改。 + * 字体设置为黑体,字号为五号,并删除斜体样式。 + * 段落设置为居中。 +- 找到“Figure”样式,它决定了插入的图的样式。将其段落设置为居中,以让插入的图居中。 +- 找到“超链接”样式,删除其颜色。 +- 找到“书目”样式,它是参考文献列表所用的样式。 + * 字体设置为宋体,字号为五号。 + * 段落设置为悬挂缩进2字符。 +- 找到“脚注文本”样式。它是脚注文本的样式。 + * 字体的字号改为五号。 +- 点击文档中的表格,转到Ribbon栏的“表设计”选项卡下,点击表格样式右边的下拉箭头,选择“修改表格样式”。打开对话框。 + * 进入“边框和底纹”对话框,把上下框线加上,这样就实现了三线表。 + * 进入“表格属性”对话框设置 + - 把“表格”选项卡里的“对齐方式”设置为“居中”,让表格在段落中居中。 + - 把“行”选项卡里的“允许跨页断行选项”关掉,以保证表格美观。 + diff --git a/pandoc/my-thesis.docx b/pandoc/my-thesis.docx new file mode 100644 index 0000000000000000000000000000000000000000..4fba83027c5683b366da5cdeee955ff78cfb84ce GIT binary patch literal 17362 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 literal 0 HcmV?d00001 diff --git a/pandoc/pyproject.toml b/pandoc/pyproject.toml index 5adfb7e..0a2e8ec 100644 --- a/pandoc/pyproject.toml +++ b/pandoc/pyproject.toml @@ -5,5 +5,5 @@ description = "The environment used for converting LaTeX thesis into DOCX format readme = "README.md" requires-python = ">=3.11" dependencies = [ - "pandoc-tex-numbering>=1.3.3", + "pandoc-tex-numbering==1.3.3", ] diff --git a/pandoc/uv.lock b/pandoc/uv.lock index 6f452f4..c0d346b 100644 --- a/pandoc/uv.lock +++ b/pandoc/uv.lock @@ -45,7 +45,7 @@ dependencies = [ ] [package.metadata] -requires-dist = [{ name = "pandoc-tex-numbering", specifier = ">=1.3.3" }] +requires-dist = [{ name = "pandoc-tex-numbering", specifier = "==1.3.3" }] [[package]] name = "panflute" diff --git a/winword/README.md b/winword/README.md new file mode 100644 index 0000000..e69de29