macOS下配置VSCode+Latex Workshop+Docker中文LaTeX环境

简述

本文目的是记录我在macOS下配置LaTeX中文环境的过程。

LaTeX文本编辑器我还是喜欢VSCode+Latex Workshop组合,私以为其优秀是有目共睹的,不然网络上也不会有这么多配置教程。

但是不同于大多数既有的博客文章,本文中我选择将TexLive放进Docker容器而非在macOS中安装MacTex/TexLive。因为我并非经常使用LaTeX来写作,不喜欢MacTex套件总是出现在我的启动台中。

如果你希望通过安装MacTex的方式在Mac上配置VSCode+Latex Workshop,那么本文对你的帮助有限,建议移步网上其他优秀的中文教程。

本文总体分为两大部分——

  1. Docker镜像的构建
  2. VSCode+Latex Workshop的配置

基础环境

  1. macOS Catalina 10.15.2 Beta
  2. Docker Desktop 2.1.0.4 (39773) stable
  3. Visual Studio Code 1.40.1 stable
  4. LaTeX Workshop by James Yu v8.4.1

对于上述软件/插件的安装不予详述。

Docker镜像的构建

首先,我们需要一个TexLive的Docker镜像。

当然,在Docker Hub上搜索texlive或latex等关键词就可以找到一些相关的镜像,比如mirisbowring/texlive_ctan_full这个似乎就不错。但我本着爱折腾的原则选择自己构建镜像。

我的Dockerfile如下,可供参考

FROM yousiki/ubuntu:tuna-build

LABEL maintainer="yousiki"

RUN apt update && \
    apt install -y \
        wget \
        libfontconfig1 \
        build-essential && \
    apt autoremove -y && \
    apt clean && \
    rm -rf /var/lib/apt/lists/*

ADD texlive2019-20190410 /install-texlive

WORKDIR /install-texlive

RUN chmod +x install-tl && \
    echo "selected_scheme scheme-full" >> texlive.profile && \
    ./install-tl -profile texlive.profile && \
    rm -rf /install-texlive

ENV PATH="/usr/local/texlive/2019/bin/x86_64-linux:${PATH}"
ENV MANPATH="/usr/local/texlive/2019/texmf-dist/doc/man:${MANPATH}"
ENV INFOPATH="/usr/local/texlive/2019/texmf-dist/doc/info:${INFOPATH}"

RUN tlmgr option repository \
        https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet && \
    tlmgr update --self --all

VOLUME [ "/workspace" ]

WORKDIR /workspace

其中,texlive2019-20190410就是TexLive2019安装镜像解压后的目录,附上清华TUNA镜像。

这里有一些我曾经踩过的坑,比如缺失wget软件会使tlmgr updatetlmgr install等命令出错,缺失build-essential无法正常执行./install-tl,希望对诸君有助。

我使用命令docker build -t yousiki/latex:full -f full.Dockerfile .构建镜像,所以请自行替换yousiki/latex:full等名称为你所使用的名称。

镜像构建大约需要30分钟,构建的镜像大约有13GB。小生不才,不太会压缩镜像大小,勿怪勿怪。

VSCode + Latex Workshop 配置

配置编译工具链

似乎大家都喜欢用Xelatex来编译中文LaTeX文件,所以需要稍微配置一下settings.json实现Xelatex等工具链,这一步在其他中文博文里也有介绍,大概就是加入下面这样一段代码

"latex-workshop.latex.tools": [
    {
        "name": "xelatex",
        "command": "xelatex",
        "args": [
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "-pdf",
            "%DOCFILE%"
        ]
    },
    {
        "name": "pdflatex",
        "command": "pdflatex",
        "args": [
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "%DOCFILE%"
        ]
    },
    {
        "name": "bibtex",
        "command": "bibtex",
        "args": [
            "%DOCFILE%"
        ]
    }
],
"latex-workshop.latex.recipes": [
    {
        "name": "xelatex",
        "tools": [
            "xelatex"
        ]
    },
    {
        "name": "xe->bib->xe->xe",
        "tools": [
            "xelatex",
            "bibtex",
            "xelatex",
            "xelatex"
        ]
    }
],

当然你可以按照自己的需要来定义自己的编译过程,LaTeX这方面我就不太懂了。

配置Docker相关

首先要在settings.json中启用Latex Workshop的docker模式,加入下面两行代码

"latex-workshop.docker.enabled": true,
"latex-workshop.docker.image.latex": "yousiki/latex:full",

当然,请替换其中的yousiki/latex:full为你想使用Docker镜像。

按照官网的说法,本来到这里就应该完成了。但事实上你可以尝试用编译一个Tex文件,除非使用latexmk编译,否则都会失败。查看插件的源码发现了这样一段令人哭笑不得的代码Github链接。虽然我不懂JS但也可以看明白为什么会出现上述的错误了。

于是我尝试自己修复这个问题。找到插件所在的目录~/.vscode/extensions/james-yu.latex-workshop-8.4.1/,大概需要做的就是在out/src/componentsbuild.js这里增加我们需要用的工具的判断分支,如下

if (docker) {
    switch (step.command) {
        case 'latexmk':
            step.command = path.resolve(this.extension.extensionRoot, './scripts/latexmk');
            fs.chmodSync(step.command, 0o755);
            break;
        case 'xelatex':
            step.command = path.resolve(this.extension.extensionRoot, './scripts/xelatex');
            fs.chmodSync(step.command, 0o755);
            break;
        case 'pdflatex':
            step.command = path.resolve(this.extension.extensionRoot, './scripts/pdflatex');
            fs.chmodSync(step.command, 0o755);
            break;
        case 'bibtex':
            step.command = path.resolve(this.extension.extensionRoot, './scripts/bibtex');
            fs.chmodSync(step.command, 0o755);
            break;
        default:
            break;
    }
}

因为是macOS下,就省去了对win32的支持。我并不会JS/TS,只是对源代码复制粘贴了即便。

然后还需要补充scripts/xelatexscripts/pdflatex等脚本文件,如下

#!/bin/sh
docker run -i --rm -w "$(pwd)" -v "$(pwd):$(pwd)" $LATEXWORKSHOP_DOCKER_LATEX xelatex "$@"
#!/bin/sh
docker run -i --rm -w "$(pwd)" -v "$(pwd):$(pwd)" $LATEXWORKSHOP_DOCKER_LATEX pdflatex "$@"

最后重启VSCode就可以使用Docker中的TexLive编译中文LaTeX文件了。
macOS下配置VSCode+Latex Workshop+Docker中文LaTeX环境_第1张图片

你可能感兴趣的:(macOS下配置VSCode+Latex Workshop+Docker中文LaTeX环境)