[TinyTex & LaTex Workshop] 最轻量LaTex的正确打开方式

发布于 2020-08-02  1,420 次阅读


之前的一篇文章中, 我提到了可以利用 Rmarkdown 来完成很多对排版要求不那么高的文档编辑工作. 当时就深刻体会到了 LaTex 这一(垃圾)语言的安装配置有多么麻烦. 但有时你不得不用 LaTex, 这就意味着你必须受折磨. 不过还好有 TinyTex. TinyTex 是一个基于 TexLive 精简而来的 LaTex 发行版, 它包含了一些常见的 LaTex 包, 并且可以在编译文档的过程中自动安装缺失的包. TinyTex 最大的优点就是: 小! 在 Windows 上的安装后体积约为 220 MB, 在 Linux 上安装后体积约为 150MB. 对比隔壁 TexLive, 高下立判.

TinyTex 安装

在最开始之前一定要提醒一句: 不要让自己的环境变量中存在两个不同的 LaTex 系统, 否则会相互冲突.

TinyTex 支持用两种方式安装: 作为 R 语言的一个包(这要求你首先需要 R), 作为独立的一个系统.

对于 R 用户而言, 只需要进入 R 的交互式命令行, 执行这样两句简单的命令即可

install.packages('tinytex')
tinytex::install_tinytex()

你也可以独立安装, 详情参阅 https://yihui.org/tinytex/ .

换用国内 CTAN 镜像

国内一般访问 CTAN 都特别慢, 而 tinytex 的 R 版本支持 on the fly, 也就是在编译过程中自动下载缺失的包. 虽说下载只需要一次, 以后就都能用了, 但是太慢的话还是很难以忍受. 使用如下的命令切换 CTAN 到清华大学的镜像.

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

针对 LaTex Workshop 的调教

调用

只有作为 R 语言的包安装 TinyTex 时才会需要这一步, 因为此时 LaTex 编译程序不能作为二进制程序在环境变量中被找到. 首先你需要定义一个 tool, 在 vsc 的设置文件中插入这样一项:

"latex-workshop.latex.tools": [
  {
    "name": "tinytex_xelatex",
    "command": "rscript",
        "args": [
          "-e",
          "tinytex::xelatex(commandArgs(trailingOnly=TRUE)[1],clean=FALSE,engine_args=\"-synctex=1\")",
          "%DOC_EXT%"
        ]
  }
]

如果有原本已经定义的 tools, 则该项目应当被并列地插入 "latex-workshop.latex.tools" 中. 此外, 最好利用 vsc 的补全功能把该配置项的默认值全部写入, 这样也可以避免手动配置错误之后难以恢复. 默认的 TinyTex 会把临时文件全部删除, 我们需要关闭 clean 选项. 同时为了方便编辑, 要把编译引擎的 synctex 选项打开.

接下来添加一个 recipe:

"latex-workshop.latex.recipes": [
  {
    "name": "xelatex (tinytex)",
    "tools": [
      "tinytex_xelatex"
    ]
  }
]

同样的, 如果原本有 recipe, 就应当并列地插入.

格式化 latexindent

进入 R 交互式命令行(独立安装的话可以直接从命令行启动 tlmgr), 执行以下命令

library(tinytex)
tlmgr_search('latexindent')
tlmgr_install('latexindent')

上述代码通过 tlmgr 搜索并安装了 latexindent, 之后在 vsc 中就可以直接对 tex 源文件进行格式化.

文档-源文件同步 synctex

LaTex Workshop 本身通过 js 支持了 synctex, 而且默认就开启, 不需要额外安装任何内容. 只需要确保编译引擎开启了 synctex(中间文件中有一个名字形如 xxx.synctex.gz 的东西).

依照默认设置, 在 pdf 文件中 ctrl+click 会跳转至对应的源文件位置. 从源文件到 pdf 的 sync 跳转需要在设置中开启.


终有一日, 仰望星空