1373 語
7 分
論文を書くひとはローカルでOverleaf動かせるようにしておくと心がラク

論文を書くひとはローカルでOverleaf動かせるようにしておくと心がラク#

オンラインでLaTeX書けるのは便利だけど落ちたときのことも考えておこう。

とくに年末年始は Overleaf がしばしば落ちるので、卒論とかを Overleaf で書いていると冷や汗ものです。

そんなときにローカルで Overleaf 環境を再現できる Overleaf Toolkit を紹介します。

overleaf
/
toolkit
Waiting for api.github.com...
00K
0K
0K
Waiting...

必要な環境#

  • Windows / Mac / Linux
  • Docker
  • Docker Compose
    • それぞれ簡単にインストールできるのでここでは割愛
  • オンライン版の Overleaf 上で作成したプロジェクトの Zip ファイル
    • プロジェクトを開いて File > Download as source (.zip) で落とせます。 alt text
    • Overleaf 有料版なら GitHub 連携ができるので適宜 Push しておくと GitHub から同じものが落とせます。無料版なら普段から .zip ファイルをローカルに保存しておくクセをつけておきましょう。
  • かんたんなコマンドがつかえること
    • Windows なら PowerShell とか、Mac ならターミナルとか

手順#

公式の Quick-Start Guide を主になぞっていきます。

リポジトリをクローン#

git clone https://github.com/overleaf/toolkit.git ./overleaf-toolkit
cd ./overleaf-toolkit

以後 Overleaf Toolkit を OLTK と略称します。

起動する#

OLTK ディレクトリ内で bin/init を実行すると設定ファイルが作成されます。

./overleaf-toolkit % ls config
> overleaf.rc variables.env version

続けて bin/up でコンテナを起動します。docker compose up を内部的に実行しているみたい?

初回起動時はブラウザで http://localhost/launchpad を開くと管理者アカウントの登録画面に入れます。

alt text

管理用アカウントを作成しますが、メアド/パスワードはローカル環境でつかうものなので適当に。とくにオンラインで認証が入るわけじゃないです。

次回以降は http://localhost/login からログインできます。また http://localhost/project でプロジェクト一覧を開けます。

(なんか出たら Start Using Our Overleaf Instance で進んでよさそう) alt text

Creat a new project を押して Upload project を選択するとオンライン版 Overleaf のプロジェクトを読み込めます。

ただし今のままだとエラーが出ると思うので日本語環境の設定が必要。 alt text

日本語環境に設定する#

現在の状態だと日本語環境が全く無いので,新しくターミナルなどを開いてから bin/shell を実行します。(bin/up をしたウィンドウは入力できない状態のはずなので新規ウィンドウ)

コンテナの中のシェルに入れるので,以下のコマンドで TeX Live を更新します。

  • tlmgr update --self
  • tlmgr install collection-langjapanese here float comment booktabs titlesec wrapfig siunitx
    • このコマンドは必要なパッケージがあれば適宜増やしてください

TeX Live の更新が終わったら exit もしくは Ctrl+D でシェルを抜けられます。

シェルを抜けたあとのターミナルなどで以下のコマンドを実行するとこのコンテナイメージを保存しておけるので,次回以降の起動で設定が不要になります。

docker commit sharelatex sharelatex/sharelatex:with-texlive-full

いったん Overleaf サーバーを落とすために bin/stop を実行します。bin/up がうごいているターミナルで Ctrl+C でも可。

普段のつかいかた#

Docker Desktop を利用しているなら Overleaf コンテナの再生マークをクリックして起動できます。起動したら alt text

コマンドで起動したいなら bin/start で起動すればバックグラウンドで動かせる (ターミナルにログが出ない) のでおすすめです。同じく bin/stop で止められます。

いずれにせよ、起動したら http://localhost/login でオンライン版と同じようにつかうことができます。

つまづきポイント#

なにかとエラーが多かったので備忘録として置いておきます。

Mac で bin/up すると MONGO_VERSION エラーが出る#

./overleaf-toolkit % bin/up
--------------------- ERROR -----------------------
Invalid MONGO_VERSION: MONGO_VERSION=8.0
MONGO_VERSION must start with the actual major version of mongo, followed by a dot.
Example: MONGO_IMAGE=my.dockerhub.com/custom-mongo
MONGO_VERSION=6.0-custom
--------------------- ERROR -----------------------

lib/shared-functions.sh の正規表現に誤りがあるみたいなので修正します。(参考)

  • 修正前
function read_variable() {
local name=$1
grep -E "^$name=" "$TOOLKIT_ROOT/config/variables.env" \
| sed -r "s/^$name=([\"']?)(.+)\1\$/\2/"
}
function read_configuration() {
local name=$1
grep -E "^$name=" "$TOOLKIT_ROOT/config/overleaf.rc" \
| sed -r "s/^$name=([\"']?)(.+)\1\$/\2/"
}
  • 修正後
function read_variable() {
local name=$1
grep -E "^$name=" "$TOOLKIT_ROOT/config/variables.env" \
| sed -r "s/^$name=[\"']?([^\"']+)[\"']?\$/\1/"
}
function read_configuration() {
local name=$1
grep -E "^$name=" "$TOOLKIT_ROOT/config/overleaf.rc" \
| sed -r "s/^$name=[\"']?([^\"']+)[\"']?\$/\1/"
}

Mac で bin/up すると no matching manifest for linux/arm64/v8 in the manifest list entries エラーが出る#

内部でうごいている sharelatex の Apple Silicon 向けのビルドが無いせいなので、M1 チップ以降の Mac で動かすときにはいくつか手順が必要です。

bin/init した後に lib/docker-compose.base.yml を編集します。

services:
sharelatex:
restart: always
platform: linux/amd64 # これを追記する
image: "${IMAGE}"

また config/overleaf.rc ファイルを開いて、14行目あたりにある以下を false にします。

SIBLING_CONTAINERS_ENABLED=false

ARM 向けの Docker Image を落とします。

docker pull --platform linux/amd64 sharelatex/sharelatex:6.0.1

これで bin/up できるはず。

参考

こういうところで ARM アーキテクチャが牙を剥いてくる。

Windows で bin/up すると Error response from daemon: mount denied エラーが出る#

lib/docker-compose.base.yml をエディターで開いて9行目を以下のように変更します。(参考)

"${OVERLEAF_DATA_PATH}:/var/lib/overleaf"
シェア

この記事が役に立った場合は、ぜひシェアしてください!