论文写作过程中,通过涉及投稿、修改、改投等各种环节,正好tex文件是文本格式的,那么git就成为了不二之选的版本控制工具。对于一般的latex文档写作,vscode结合LaTeX Workshop插件,足以应付。但是,如果我们需要生成当前版本和上一个commit之间的,包含修改内容、位置信息的PDF文件,就需要进行额外的设置了。这里我们以vscode为载体,讲解如何实现这一过程。

软件准备

工欲善其事必先利其器,vscode结合以下插件,非常有帮助。

  • LaTeX Workshop (插件)
  • LaTeX language support (插件)
  • LaTeX Utilities (插件)
  • LTex - English support (插件)
  • Template Generator
  • LaTeX Snippets

其中LaTeX Workshop是基本。LaTeX Utilities可以提供字数统计的功能。Template Generator可以提供模板的功能。写作过程中,如果有模板功能,那么一些重复的、繁琐的设置就可以统一解决了。LaTeX Snippets可以在模板的基础上,为一些代码较多的环境提供帮助,比如figuretable等等。

软件设置

软件设置部分就是最耗时耗力的地方了。好在,设置一次之后,就不用再次设置。默认你使用的git进行版本控制。假设当前文件的相对路径为${relativeFile},全名为${fileBaseName},不包含后缀的为${fileBaseNameWithoutExtension},其父路径为${relativeDir}。一般来说,得到校对格式的PDF需要经过以下步骤:

  • 获得上一个commit的文件的tex代码,在git里边可以使用^head代表上一个commit(另外一种表示head~x代表倒数第x次commit)。可以使用如下代码实现该功能:
git show ^head:${relativeFile} > tmp.tex

然而,由于${relativeFile}在windows中使用的路径分割符号为\,但是git是无法识别这个的。解决的办法为,将路径传导一个自定义的bat文件中,在其中将路径的分隔符进行替换,然后再执行操作。一个示例的文件如下:

@echo off

@REM modify source path
set source=%1
set uSource=%source:\=/%

@REM modify dest path
set dest=%2
set uDest=%dest:\=/%

git show ^head:%uSource% > %uDest%
  • 将上一个版本的tex文件和当前版本的tex进行校对,使用latexdiff工具。
latexdiff tmp.tex ${relativeFile} > tmpdiff.tex
  • 编译校对后的tex文件,生成pdf文件。这里我们使用latexmk工具。
latexmk --xelatex -interaction=nonstopmode ${relativeDir}\\tmpdiff.tex
xdvipdfmx ${relativeDir}\\tmpdiff
  • 清理残余的文件,如果是在windows下,直接使用del命令
del /s *.aux *.bbl...

将这四个命令,分别使用vscode的task功能变成4个task,然后再新建一个task,依次运行即可。

"dependsOrder": "sequence",
"dependsOn": [
    "Export Previous LaTeX Version",
    "Create LaTeX Diff File",
    "Compfile Diff File with LatexMK",
    "Clean Compiled Files"
],

需要额外注意dependsOrder项,这个必须设置,否则依赖项的执行变成并行和随机的了,将产生错误。

文件预览

文件预览可以使用系统默认的软件打开,使用如下命令:

explorer `${relativeFile}`

也可以使用vscode进行打开,例如:

code `${relativeFile}`

但是这些打开方式均有一个缺点,就是如果我更新了PDF文件,无法自动更新。其实,如果我们将PDF文件使用右侧打开的功能之后,只要不关闭,那么下次重新编译tex文件,PDF的内容会自动更新到tab中,这样还解决了反复开关PDF软件的繁琐问题。

额外的经验

如何安装bst文件。如果我们自定义了一些bst文件,需要按照并全局使用,可以先搜索其他bst文件所在的文件,我的在C:\texlive\2019\texmf-dist\bibtex\bst。那么创建一个自定义的文件夹,然后将bst文件拷贝到这个自定义的文件夹中,最后使用mktexlsr命令安装。

latexmk结合xelatex选项,默认可以识别是否需要增加编译次数,产生文献引用的内容。然而,如果tex的文件名是中文的时候,将导致无法找到bbl文件的错误,使得引用部分无法变成成功。