Compile Latex in Docker
前言
開始菸酒生的論文時刻,不想要陷入 Office 排版地獄,找到了幾個不錯 Latex 的排版。比較多都是成大模板,也有找到比較早年的台科模板。嘗試後,儘管第一個的模板已經將設定與內容拆的非常乾淨,但是我選擇了第二個,果然還是適合 Makefile
來編譯呀~
為什麼不用原生 Texlive
在 Linux 環境上,可以直接透過套件管理來安裝 Texlive 相關來源:
// Ubuntu/Debian
sudo apt install texlive-full
但是於 macOS 上需要安裝 MacTeX,但是不像 Linux 環境上,相關 TeX 相關套件會自動幫你安裝好,需要逐一安裝。
因此使用 docker 便可以自己選擇套件,也可以跨平台編譯檔案。
動手做
本來想要自己來寫一個 Dockerfile,不過 GitHub 上面也有人寫好的 latex-docker。
作者也整理好了三個 tag,分別是
- blang/latex:ubuntu (:latest) - Dockerfile.ubuntu Ubuntu TexLive distribution: Old but stable, most needed package: texlive-full (3.9GB)
- blang/latex:ctanbasic - Dockerfile.basic CTAN TexLive Scheme-basic: Up-to-date, only basic packages, base for custom builds (500MB)
- blang/latex:ctanfull - Dockerfile.full CTAN TexLive Scheme-full: Up-to-date, all packages (5.6GB)
以下先以 ctanfull
也就是 TexLive 完整套件的來進行示範:
下載編譯指令
wget https://raw.githubusercontent.com/blang/latex-docker/master/latexdockercmd.sh
chmod +x latexdockercmd.sh
並修改 latexdockercmd.sh
tag 為 ctanfull
,如下
#!/bin/sh
IMAGE=blang/latex:ctanfull
exec docker run --rm -i --user="$(id -u):$(id -g)" --net=none -v "$PWD":/data "$IMAGE" "$@"
因此我們可直接編譯
./latexdockercmd.sh /bin/sh -c "make"
問題
由於論文會使用中文字體,如標楷體,但是問題是在 container 裡面沒有該字體。而我所解決方式就是,將字體檔案也放置於專案目錄底下,再透過 \fontspec
設定讀取目錄字體檔案。
.
├── Makefile
├── README.md
├── backpages // 處理參考文獻、附錄、封底
│ ├── appendices
│ ├── my_appendix.tex
│ ├── my_vita.tex
│ └── ntust_backpages.tex
├── chinese_trans.tex
├── code
│ └── logstash.conf
├── common_env.tex
├── example // 原作者範例
│ ├── example_body.tex
│ ├── example_fig.bb
│ ├── example_fig.png
│ └── example_prog_list.m
├── figures // 附圖
│ ├── dyna_rm.eps
│ ├── infra-picture.png
│ ├── infra.png
│ ├── seq-admin-get-dashboard.png
│ ├── seq-store-data.png
│ ├── syslog.png
│ ├── system-arch.png
│ └── system-phase.png
├── fonts // 使用到的字體
│ ├── BiauKai.ttf
│ ├── Times-Bold.ttf
│ ├── Times-BoldItalic.ttf
│ ├── Times-Italic.ttf
│ └── Times.ttf
├── frontpages // 封面、摘要、誌謝及圖表目錄等
│ ├── my_ackn.tex
│ ├── my_cabstract.tex
│ ├── my_eabstract.tex
│ ├── my_names.tex
│ ├── my_symbols.tex
│ ├── ntust_frontpages.tex
│ └── ntust_logo.pdf
├── latexdockercmd.sh // Docker 指令腳本
├── ntust_report.cls
├── reference.bib
├── sections // 內文
│ ├── 01.introduction.tex
│ ├── 02.related_work_background.tex
│ ├── 03.system_architecture.tex
│ ├── 04.system_implementation.tex
│ └── conclusion.tex
├── slashbox.sty
├── thesis.tex // 主設定及使用套件
└── watermark
├── ntust_logo.pdf
└── ntust_watermark.tex