近期出于刚性需求,需要在团队内部部署一个论文编辑的共享平台,以合作解决论文撰写的问题。同时在线的Overleaf由于对XeLaTeX的支持问题、编译效率问题和数据安全性问题,不太符合需求,故自部署ShareLaTeX服务。
基础环境
- 内部网络环境
- CentOS7虚拟机
- 自部署的MongoDB
- 自部署LDAP服务
ShareLaTeX服务使用Redis服务仅仅作为缓存,不涉及数据存储问题,因此没有连接外部的Redis服务
Docker部署
在合适的文件夹中创建docker-compose.yml
完整的配置文件参考:下载链接
version: '2.2'
services:
sharelatex:
# 基本配置
restart: always
image: sharelatex/sharelatex
container_name: sharelatex
depends_on:
redis:
condition: service_started
ports:
- 25681:80
links:
- redis
# 数据持久化(包括字体当不包括apt安装的内容)
volumes:
- ~/sharelatex/data:/var/lib/sharelatex
- ~/sharelatex/texlive:/usr/local/texlive
- ~/sharelatex/fonts:/usr/share/fonts/zh-cn
environment:
# 连接到外部MongoDB
SHARELATEX_APP_NAME: Overleaf @Tinoy
SHARELATEX_MONGO_URL: mongodb://xeon.csu.icu:12345/sharelatex_data
# 连接到内置Redis
SHARELATEX_REDIS_HOST: redis
REDIS_HOST: redis
# 以下是默认配置
ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file'
ENABLE_CONVERSIONS: 'true'
EMAIL_CONFIRMATION_DISABLED: 'true'
TEXMFVAR: /var/lib/sharelatex/tmp/texmf-var
# 配置分享链接的网址前缀
SHARELATEX_SITE_URL: https://latex.csu.icu
# 一些自定义的细节
SHARELATEX_LEFT_FOOTER: '[{"text": "Powered by <a href=\"https://www.sharelatex.com\">ShareLaTeX</a> 2016"} ]'
SHARELATEX_RIGHT_FOOTER: '[{"text": "Pages maintained by <a href=\"https://wolfbolin.com\">WolfBolin</a>"} ]'
# E-Mail服务器(已删除部分细节)
SHARELATEX_EMAIL_FROM_ADDRESS: ""
# SHARELATEX_EMAIL_AWS_SES_ACCESS_KEY_ID:
# SHARELATEX_EMAIL_AWS_SES_SECRET_KEY:
SHARELATEX_EMAIL_SMTP_HOST: smtp.csu.icu
SHARELATEX_EMAIL_SMTP_PORT: 587
SHARELATEX_EMAIL_SMTP_SECURE: false
SHARELATEX_EMAIL_SMTP_USER:
SHARELATEX_EMAIL_SMTP_PASS:
# SHARELATEX_EMAIL_SMTP_TLS_REJECT_UNAUTH: true
# SHARELATEX_EMAIL_SMTP_IGNORE_TLS: false
# SHARELATEX_EMAIL_SMTP_NAME: '127.0.0.1'
# SHARELATEX_EMAIL_SMTP_LOGGER: true
# SHARELATEX_CUSTOM_EMAIL_FOOTER: "This system is run by department x"
# 保留原味Redis
redis:
restart: always
image: redis:5
container_name: redis
# expose:
# - 6379
volumes:
- ~/sharelatex/redis:/data
修改完成后就可以启动容器了(docker-compose up -d
),容器启动的时候会自动下载最新版本的ShareLaTeX。但是请注意,如果你的Docker使用了镜像源,那么即使你删除镜像(docker rmi
)并重新拉取镜像(docker-compose pull
)也依然可能会获取到旧版本的镜像数据。
装修ShareLatex
首先需要完成的是基本功能的补全,这部分网上的教程有很多细节,这里不再赘述,核心思想是:1获取更新脚本,2修改更新源,3等待下载。
需要补充的是,在文件夹/usr/local/texlive
中的现有文件,不要删除,否则可能会导致服务无法启动。
# 进入Docker容器
$ docker exec -it sharelatex bash
# 进入texlive安装目录
$ cd /usr/local/texlive
# 下载更新脚本(也可以自己先下载再上传到服务器)
$ wget http://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.sh
$ sh update-tlmgr-latest.sh -- --upgrade
# 更换texlive下载源
$ tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/
# 升级tlmgr(漫长的等待)
$ tlmgr update --self --all
# (可选)安装完整版texlive
$ tlmgr install scheme-full
完成上述步骤后,容器是可以重启的,不会造成现有的安装丢失。基础的编译服务也是可以用的,比如PDFLaTex或者其他简单的编译。
中文编译环境
如果中文模板编译报错,十有八九是中文字体的锅。首先要找到模板里需要的字体是什么名字,然后自行在网站上找对应的字体。如何再进行如下操作。
英文字体
安装微软字库,能解决一部分英文常见字体缺失的问题。如“Times New Roman”,“Courier New”, “Arial”
# 进入Docker容器后执行
$ apt update
# 安装微软英文字体库
$ echo "yes" | apt install -y --reinstall ttf-mscorefonts-installer
中文字体
中文字体一般需要CJK提供支持,另外需要将收集到的字体文件ttf放入宿主机~/sharelatex/fonts
,即绑定的容器内文件夹/usr/share/fonts/zh-cn
,此处的文件夹zh-cn是可以随便取名字的,但是不要覆盖父文件夹fonts。fonts中存储了各个来源的字体文件,当字体缓存发生更新时,系统会遍历fonts文件夹下的所有文件与文件夹并尝试导入字体。
# 进入Docker容器后执行
$ apt update
# 安装CJK字符编码库
$ apt install -y latex-cjk-all texlive-lang-chinese texlive-lang-english
# 上传中文字体到服务器
$ cp fonts/* /usr/share/fonts/zh-cn/
# 进入系统字体文件夹
$ cd /usr/share/fonts
# 更新字体缓存
$ fc-cache -fv
检查缓存
上述步骤执行完成后,暂时不能重启docker,否则会导致安装的东西消失。那么如何检查字体是否已经完成了安装呢。可以使用fc相关指令在docker内查询。
# 进入Docker容器后执行
# 查询所有中文字体
$ fc-list :lang=zh-cn
/usr/share/fonts/zh-cn/simkai.ttf: KaiTi,楷体:style=Regular
,...
/usr/share/fonts/zh-cn/simfang.ttf: FangSong,仿宋:style=Regular
,...
/usr/share/fonts/zh-cn/simhei.ttf: SimHei,黑体:style=Regular
/usr/share/fonts/truetype/arphic-gkai00mp/gkai00mp.ttf: AR PL KaitiM GB,文鼎PL简中楷:style=Regular
/usr/share/fonts/truetype/arphic-gbsn00lp/gbsn00lp.ttf: AR PL SungtiL GB,文鼎PL简报宋:style=Regular
/usr/share/fonts/zh-cn/simsun.ttf: SimSun,宋体:style=Regular
/usr/share/fonts/zh-cn/stxinwei.ttf: STXinwei,华文新魏:style=Regular
# 检查字体匹配
$ fc-match Arial
Arial.ttf: "Arial" "Regular"
在latex模板的定义中,经常使用newCJKfontfamily
定义字体匹配,此时使用的名字能在docker中成功匹配,就说明编译时也能使用。
针对Docker用户,请在完成环境更新后,先进行docker commit
操作再重启容器,否则做出的修改将会丢失。
XeLaTeX编译
部分论文模板使用了XeLaTeX,通常定义了RequireXeTeX
相关指令,并且有些使用了Makefile文件。
在ShareLaTeX和Overleaf平台中,默认使用latexmk -xelatex
指令编译XeLaTeX,但是往往不成功。
提示
This compile didn’t produce a PDF. This can happen if:
There is an unrecoverable LaTeX error. If there are LaTeX errors shown below or in the raw logs, please try to fix them and compile again.
The document environment contains no content. If it’s empty, please add some content and compile again.
This project contains a file called output.pdf. If that file exists, please rename it and compile again.
查询日志有报错
Rc files read:
NONE
Latexmk: This is Latexmk, John Collins, 7 Jan. 2023. Version 4.79.
Latexmk: Changing directory to '/var/lib/sharelatex/data/compiles/...'
Latexmk: applying rule 'xelatex'...
Rule 'xelatex': Reasons for rerun
Changed files or newly in use/created:
xxx.tex
output.aux
Category 'changed_user':
xxx.tex
------------
Run number 1 of rule 'xelatex'
------------
------------
Running 'xelatex -no-pdf -synctex=1 -interaction=batchmode -recorder --jobname="output" "xxx.tex"'
------------
手动编译报错
# latexmk -pvc -xelatex -gg -silent xxx Rc files read:
NONE
======= Need to update make_preview_continuous for target files
Viewing pdf
Latexmk: Run number 1 of rule 'xelatex'
sh: 1: xelatex: not found
Latexmk: fls file doesn't appear to have been made.
Latexmk: Getting log file 'csuthesis_main.log'
Latexmk: Couldn't read log file 'csuthesis_main.log':
No such file or directory
在下才疏学浅,只看出来xelatex: not found
,找了一圈办法,最终只能自己补全这个环境
# 进入Docker容器后执行
# 更新软件列表
$ apt update
# 安装xetex基础环境
$ apt install -y texlive texlive-xetex texlive-latex-base texlive-latex-recommended
# 安装模板相关扩展
$ apt install -y texlive-latex-extra texlive-science texlive-pictures texlive-bibtex-extra
这样才能让docker内的环境中有xelatex程序可用。这个问题同样存在Overleaf的Github的Issue中。
详见:XeLaTeX not available on Clean Install # 837
完成安装后记得commit容器保存修改。
————
以上为Latex折腾记录,如有不对还请指正
remark。好思路,已test。完全OK