Latex2Word
从 LaTeX 到 Word:一个自动化转换工具
LaTeX 常用于学术和技术领域的文档排版,尤其适用于公式输入和交叉引用;并且,作为纯文本文件,tex 格式文件容易进行内容迁移和版本控制。然而,日常工作中,不熟悉 LaTeX 的上级或同事常会要求提供 Word 文件,以便共同审阅和修改。为此开发了一个从 LaTeX 转换到 Word 的工具,以自动化这一流程。
仓库地址:Mingzefei/latex2word (github.com)
初衷、挑战和解决方案
项目的初衷很简单:我需要一个能够将 LaTeX 文档转换为 Word 文件的工具,不需要对 Word 进行严格的格式排版,但是需要排版成易读的格式,以及正确的图片导入和交叉引用。Pandoc 工具可以实现将 tex 格式文件转换为 docx 格式文件,但转换结果十分粗糙,尤其无法正确处理公式编号、交叉引用和多子图等问题。这意味着在每次使用 Pandoc 进行转换后,都需要手动调整 Word 文件的格式和引用,十分不便。
公式和交叉引用的处理
Pandoc-Crossref 作为 Pandoc 的第三方过滤器,可以很好地处理交叉引用,但是无法处理公式的引用(Equation numbering in MS Word · Issue)。 解决这一问题的关键在于使用 Lua 过滤器,利用 Constantin Ahlmann-Eltze 提供的脚本,有效处理了公式的编号和交叉引用。
多子图的处理
Pandoc 对 tex 文件中多子图的处理并不理想,一般无法正常导入多子图。为此,我在项目中先将 LaTeX 文件中的多子图代码转换成单个大图的 png 文件(提取成多个只有图片的 tex文件,并利用 LaTeX 自带的 convert
和 pdftocairo
进行编译),再用这些大图替换原始的多子图。从而实现了多子图的正常导入。
案例
待转换的 LaTeX 文件编译结果如下:
转换生成的 Word 文件如下:
附录
核心的 pandoc 命令
pandoc texfile -o docxfile \
--lua-filter resolve_equation_labels.lua \
--filter pandoc-crossref \
--reference-doc=temp.docx \
--number-sections \
-M autoEqnLabels \
-M tableEqns \
-M reference-section-title=Reference \
--bibliography=ref.bib \
--citeproc --csl ieee.csl
其中,
--lua-filter resolve_equation_labels.lua
处理公式编号及公式交叉引用,受 Constantin Ahlmann-Eltze 的脚本启发;--filter pandoc-crossref
处理除公式以外的交叉引用;--reference-doc=my_temp.docx
依照my_temp.docx
中的样式生成 Word 文件。仓库 Mingzefei/latex2word 提供了两个模板文件TIE-temp.docx
和my_temp.docx
,前者是 TIE 期刊的投稿 Word 模板(双栏),后者是个人调整出的 Word 模板(单栏,且便于批注);--number-sections
在(子)章节标题前添加数字编号;-M autoEqnLabels
,-M tableEqns
设置公式、表格等的编号;-M reference-sction-title=Reference
在参考文献部分添加章节标题 Reference;--biblipgraphy=my_ref.bib
使用ref.bib
生成参考文献;--citeproc --csl ieee.csl
生成的参考文献格式为ieee
。
参考资料
后记
世界上有两种人,一种人会用 Latex,另一种人不会用 Latex。 后者常常向前者要 Word 版本文件。 因此有了如下一行命令。
pandoc input.tex -o output.docx\
--filter pandoc-crossref \
--reference-doc=my_temp.docx \
--number-sections \
-M autoEqnLabels -M tableEqns \
-M reference-section-title=Reference \
--bibliography=my_ref.bib \
--citeproc --csl ieee.csl