程设课的大作业是「图书管理系统」,似乎要我们完成一个「实验报告」。看看发下来的这个范例 pdf 总觉得用 Word 来写会惨不忍睹。「天下苦 Microsoft 久矣!」于是决定尝试一下大名鼎鼎的 $\LaTeX$。

心血来潮去学了 LaTeX 语法,本来打算在本地 vscode 里写,结果发现这个 LaTeX 的编译器五花八门琳琅满目,配置也极其复杂和不统一。于是想去看看有没有在线的 all-in-one 协作平台,发现了 Overleaf 这个网站,这个程序是开源的,可以部署到自己的服务器上。终于可以愉快地写 LaTeX 啦!

Overleaf 在 Github 上的项目地址在这里
由于直接提供了 Docker,所以安装过程非常简单。(新买的腾讯云服务器打算完全采用容器化部署。我简直爱上 Docker 了!!)

使用 Toolkit?

官方提供了一个叫做 Toolkit 的东西,可以直接参照这个文档部署。
默认可以帮你装好 MongoDB 和 Redis 的 Docker。启动和停止的脚本也都写好了。

git clone https://github.com/overleaf/toolkit.git ./overleaf
cd overleaf
bin/init
nano config/overleaf.rc
bin/up
bin/start

然而我的服务器上已经装好了 MongoDB 和 Redis 的 Docker 要给其他很多程序用,虽然说这个 Toolkit 的配置里可以选择不安装这俩镜像,但是总感觉这样还用这个 Toolkit 有些多此一举了……

于是直接去安装 sharelatex 的镜像。官方的教程在这里

配置环境变量

可以参考 Toolkit 里的 config/vaiables.env 文件来配置。主要就是 MongoDB 和 Redis 的连接,以及 SMTP 的配置。详细的环境变量的配置在这里

最终配置文件是这样的:

SHARELATEX_MONGO_URL=mongodb://yourUserName:yourPassWord@mongo/sharelatex
MONGO_URL=mongodb://yourUserName:yourPassWord@mongo/sharelatex
SHARELATEX_REDIS_HOST=redis
REDIS_HOST=redis
SHARELATEX_REDIS_PORT=6379
REDIS_PORT=6379

SHARELATEX_SECURE_COOKIE=true
SHARELATEX_BEHIND_PROXY=true

SHARELATEX_APP_NAME=SkyLatex

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file

# Enables Thumbnail generation using ImageMagick
ENABLE_CONVERSIONS=true

# Disables email confirmation requirement
EMAIL_CONFIRMATION_DISABLED=true

# temporary fix for LuaLaTex compiles
# see https://github.com/overleaf/overleaf/issues/695
TEXMFVAR=/var/lib/sharelatex/tmp/texmf-var

SHARELATEX_SITE_URL=https://latex.skywt.cn
SHARELATEX_NAV_TITLE=SkyLatex
# SHARELATEX_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
SHARELATEX_ADMIN_EMAIL=me@skywt.cn

SHARELATEX_LEFT_FOOTER=[{"text":"Powered by <a href=\"https://overleaf.com/\">Overleaf</a>"}, {"text":"Hosted on <a href=\"https://skywt.cn/\">SkyWT.cn</a>"}]
SHARELATEX_RIGHT_FOOTER=[{"text":"<a href=\"https://www.overleaf.com/learn\">Help</a>"}]

SHARELATEX_EMAIL_FROM_ADDRESS=notice@skywt.cn

SHARELATEX_EMAIL_SMTP_HOST=smtp.exmail.qq.com
SHARELATEX_EMAIL_SMTP_PORT=465
SHARELATEX_EMAIL_SMTP_SECURE=true
SHARELATEX_EMAIL_SMTP_USER=notice@skywt.cn
SHARELATEX_EMAIL_SMTP_PASS=EFg3svYe6Pff24Yr
# SHARELATEX_EMAIL_SMTP_NAME=
SHARELATEX_EMAIL_SMTP_LOGGER=false
SHARELATEX_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
SHARELATEX_EMAIL_SMTP_IGNORE_TLS=false
SHARELATEX_CUSTOM_EMAIL_FOOTER="<a href='https://latex.skywt.cn/'>SkyLatex</a> hosted on <a href='https://skywt.cn/'>SkyWT.cn</a>."

TEX_LIVE_DOCKER_IMAGE=quay.io/sharelatex/texlive-full:2020.1
ALL_TEX_LIVE_DOCKER_IMAGES=quay.io/sharelatex/texlive-full:2020.1,quay.io/sharelatex/texlive-full:2019.1

启动容器

创建一个 Docker 网络 sharelatex,把 Redis 和 MongoDB 的容器都提前加进来,然后启动容器,指定加入 sharelatex 网络,开放端口,文档资源挂载到外部,并且引入环境变量文件 variables.env。

docker run -d \
  --name sharelatex \
  --network sharelatex \
  -p 28080:80 \
  -v /data/sharelatex:/var/lib/sharelatex \
  --env-file ~/overleaf/variables.env \
  sharelatex/sharelatex:latest

完整安装 TeX Live

默认自带的 TeX Live 是精简版本,实测比如 XeLaTeX 就是用不了的。需要自行安装完整版。进入容器,使用国内的源升级 tlmgr 并完整安装 TeX Live:

docker exec -it sharelatex /bin/bash
tlmgr option repository https://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet/
tlmgr update --self
tlmgr install scheme-full

这里我用的是中科大的源,也可以用清华源 https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/。不过就这个下载而言,中科大源比清华源快很多。可能是因为服务器地域问题。

一共有四千多个包……要装挺久的。

代码高亮 minted 包

Overleaf 的官方这个文档里有个说明:

Note: For minted to work with your local LaTeX distribution, an additional program called Pygments must be installed. Overleaf can save you the trouble of installing it and having to run special commands to compile your document—on Overleaf, documents that use minted will work "out of the box".

进入容器里安装 pygments 就好了。

docker exec -it sharelatex /bin/bash
apt-get update
apt-get install pygments

minted 包还需要启用 shell_escape。编辑 /usr/local/texlive/2021/texmf.cnf,加上一行:

shell_escape = t

重启容器就可以使用 minted 包了。

安装字体

这个容器里默认是没有 Times New Roman 之类的字体的,如果 LaTeX 模板用了某个不存在的字体就会报错(然而我这里是会一直显示正在编译而没有任何错误提示……十分玄学)。
先换 apt 的源,然后在容器里安装字体并刷新缓存:

apt-get install ttf-mscorefonts-installer
fc-cache

这个 mscorefonts 包包含了 Arial、Georgia、Times Roman 等热门的 Microsoft’s Truetype fonts。

使用中文

Menu 里编译器选择 XeLaTeX,并且

\usepackage{ctex}

其他编译器都不支持中文。

使用效果

pic1

pic2

嗯,有内味了。