Back
Featured image of post 在Mac上用VScode超顺滑写作LaTex|从安装到写作

在Mac上用VScode超顺滑写作LaTex|从安装到写作

Latex和VScode绝配!美观舒服的学术写作,嗯啊~

学术写作需要,Word 太🌶️ 🐔,转战 LaTex,Overleaf 上的渲染速度慢,autocompile 多来几次就 suspend 了(熄火太多次,发动机黄灯)。简略记录一下 LaTex 在本地(macOS)的安装过程。

平常撸代码都在用 VScode,索性就使用 VScode 来写 LaTex,工作流为 VScode(Writing + Preview) + BasicTex

0. 安装 BasicTex

在 macOS 上有MacTex,但是这玩意有 3G 多,转了一圈 Google 发现还有一个只有 700 多 M 的 BasicTex(也可以在 MacTex 的 homepage 发现它) 下载地址

A Smaller Distribution, Basic TeX

TUG recommends the full MacTeX (管他个屁,3G 多老子才不下), even for beginners. It contains all files most users ever need. Beginners using it don’t face the daunting task of searching for missing components and figuring out how to install them in the TeX distribution.

推荐使用 Homebrew 一键省心安装

$ brew update // 记得先要update一下避免出现问题
$ brew cask install basictex

一般情况,basictex 会被安装到/usr/local/texlive/2020basic/2020basic代表版本号。

1. 安装第一个依赖

等会会需要用到自动编译七七八八的,我这缺省无 latexmk,用 tlmgr 安装一下。

安装之前先按需修改CTAN 镜像到清华大学

永久修改

$ sudo tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet

临时切换

$ tlmgr update --all --repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet

tlmgr 是 basictex 自带的宏包管理(TexLive Manager,BasicTex 和 MacTex 其实都是 TexLive 的发行版)

要用上 sudo,有 permission required

$ sudo tlmgr update --self // 先自我更新一下
$ sudo tlmgr install latexmk

在之后的编译过程中如果有缺失的宏包,就可以使用sudo tlmgr install 宏包名称来安装,有时候需要自己 Google 一下*.sty对应的宏包名称是什么,十分麻烦,后文会介绍一个自动寻找并安装缺失依赖的办法。

2. 配置 VScode

打开 VScode,搜索安装(快捷键Cmd+Shift+X)插件 LaTex Workshop

LaTex Workshop
LaTex Workshop

装完后侧边栏会出现 TEX 字样,每当保存.tex 文件的时候就会自动编译。当前窗口是.tex 文件时 tabbar 也会出现 PDF view 的小图标。

PDF 的 preview 采用的是pdf.js,所以实际上是个 webview

漂亮极了
漂亮极了

这个 webview 在每次 save 文档的时候都会自动刷新,前提是要 successfully built(会在 log 中发现),可能会有莫名其妙的编译问题(编译的 recipe 很重要,后文会提到),比如 pdf 有被写入完成,但是 webview 没有自动刷新,因为没有 successfully built(refresh 是发生在 successfully built 之后,但是 pdf written 可以发生在这之前)

当然还要做一点微小的工作。

2.1. 配置 LaTex Workshop

按下你的Cmd+Shift+P,输入 settings.json 打开设置,加入以下配置并保存(注意 json 内容语法)

json 是不支持 comment 的,但 vscode 的 settings.json 支持 comment (jsonc)

{
  ...
//latex begin
  "latex-workshop.latex.recipes": [
    {
      "name": "xelatex",
      "tools": ["xelatex"]
    },
    {
      "name": "latexmk",
      "tools": ["latexmk"]
    },

    {
      "name": "pdflatex -> bibtex -> pdflatex*2",
      "tools": ["pdflatex", "bibtex", "pdflatex", "pdflatex"]
    },
    {
      "name": "xelatex -> bibtex -> xelatex*2",
      "tools": ["xelatex", "bibtex", "xelatex", "xelatex"]
    }
  ],
  "latex-workshop.latex.tools": [
    {
      "name": "latexmk",
      "command": "latexmk",
      "args": ["-synctex=1", "-interaction=nonstopmode", "-file-line-error", "-pdf", "%DOCFILE%"]
    },
    {
      "name": "xelatex",
      "command": "xelatex",
      "args": ["-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOCFILE%"]
    },
    {
      "name": "pdflatex",
      "command": "pdflatex",
      "args": ["-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOCFILE%"]
    },
    {
      "name": "bibtex",
      "command": "bibtex",
      "args": ["%DOCFILE%"]
    }
  ],
  "latex-workshop.view.pdf.viewer": "tab",
  "latex-workshop.latex.clean.fileTypes": [
    "*.aux",
    "*.bbl",
    "*.blg",
    "*.idx",
    "*.ind",
    "*.lof",
    "*.lot",
    "*.out",
    "*.toc",
    "*.acn",
    "*.acr",
    "*.alg",
    "*.glg",
    "*.glo",
    "*.gls",
    "*.ist",
    "*.fls",
    "*.log",
    "*.fdb_latexmk"
  ]
  //latex end
  ...
}

这个 json 还是蛮重要的,workshop 默认的 recipe 导致我的一些 latex 无法被正常编译,目前这个配置和我的文档相处的很好。

3. 开始写作

save 之前的 settings.json 后重新开一个新的窗口,latex-workshop 的 tab 应该如图所示:

 

自此,你就能开始用 VScode 在本地快乐写作 Latex 了,不过…

需要注意的是单纯使用 xelatex 是无法编译.bib文件(参考引用)的,需要来一个多重编译,选择编译的 recipe 如上图所示的 xelatex->bibtex->xelatex*2

考虑到你有可能把文档分成 part1.tex, part2.tex…,可以在你的主文档(假设叫做 main.tex)的第一行加上

% !TEX root = main.tex

我也不懂这叫啥 (Magic header?),总之 complier 会从 main.tex 开始 complie

写作时候每次 save,vscode 插件都会自动完成从 complie 到 pdf view 的 refresh 操作(如果一切正常)

小朋友,当你开始用中文写作的时候,你是否有很多问号?不要着急,我们继续往下看。

4. 使用写作模板

自己搞好累, 你可以在很多地方找到模板,Overleaf上的模板就很不错,下载完后的模板请确保目录完整/一致性。

4.1. 自动安装缺失的依赖

宏包缺失是一个常见的编译失败问题。下载的模板往往带有很多宏包,如果在编译后多次出现依赖缺失,可以使用 textliveonfly 来一次性检查补装缺失的依赖并编译。同样的,使用 tlmgr 来安装。

sudo tlmgr install texliveonfly

安装后使用如下命令来编译123.tex并检查依赖缺失

sudo texliveonfly 123.tex

这个小工具不是每次都很好用,有时候还是需要自己手动安装。

遇到错误就再一次使用 texliveonfly 命令,还是出错的话就手动 tlmgr install 一下。我在安装过程中有几个包没有自动帮我装上(dk why..)宏包缺失是在编译过程中逐行检查的,所以一个没搞定就会一直卡在那一个。

5. 用中文写作

用中文写作 Latex 需要考虑到文档编码和引擎支持。tex 文件可以被很多引擎编译,其中 latexmk 和 xetex 对中文支持还行(UTF-8)。另外还需要装一下中文支持宏包

如果没有 latexmk 可以参照前文所述的方法sudo tlmgr install latexmk

我用的是 xetex(逃

5.1 安装中文宏包

决定因素是你的文章主要语言是中文还是英文。

两者的差别在于,注意文章头部的日期

 

整体为中文,使用 ctex

整体为英文,使用xeCJK
整体为英文,使用xeCJK

这个日期用的是\today渲染出来的

\date{HEHEHEHEHE --- \today} % University, school and/or department name(s) and a date

另外还可以发现用 ctex 的 Introduction 后面第一行的中文被采取了缩进措施,间距也略有改变。

ctex

如果全文基本构成是中文,可以使用ctex宏包

估计你没有自带这个包,先安装一下

sudo tlmgr install ctex

然后在文章中引入

\usepackage[UTF8]{ctex}

参考:ctex 作者在 stackexchange 上的回答

xeCJK

如果整体为英文,部分中文字体需要被正常渲染,则采取xeCJK

\usepackage{fontspec} % 字体包
\usepackage[slantfont, boldfont]{xeCJK} % 引入
\setCJKmonofont{Songti SC} % 设置中文字体

xeCJK 的详细用法有很多,能力有限恕不介绍 (平常用不到)

更多用法请参考阅读