本文目的是记录我在macOS下配置LaTeX中文环境的过程。
LaTeX文本编辑器我还是喜欢VSCode+Latex Workshop组合,私以为其优秀是有目共睹的,不然网络上也不会有这么多配置教程。
但是不同于大多数既有的博客文章,本文中我选择将TexLive放进Docker容器而非在macOS中安装MacTex/TexLive。因为我并非经常使用LaTeX来写作,不喜欢MacTex套件总是出现在我的启动台中。
如果你希望通过安装MacTex的方式在Mac上配置VSCode+Latex Workshop,那么本文对你的帮助有限,建议移步网上其他优秀的中文教程。
本文总体分为两大部分——
对于上述软件/插件的安装不予详述。
首先,我们需要一个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 update
或tlmgr install
等命令出错,缺失build-essential无法正常执行./install-tl
,希望对诸君有助。
我使用命令docker build -t yousiki/latex:full -f full.Dockerfile .
构建镜像,所以请自行替换yousiki/latex:full
等名称为你所使用的名称。
镜像构建大约需要30分钟,构建的镜像大约有13GB。小生不才,不太会压缩镜像大小,勿怪勿怪。
似乎大家都喜欢用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这方面我就不太懂了。
首先要在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/xelatex
,scripts/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 "$@"