オンラインLaTeXエディタのShareLaTeXとOverleafは、Overleaf v2として2017年に統合され、OverleafはShareLaTeXのエディタを使うようになった。

Overleaf(ShareLaTeX)は、overleaf.comで提供されているクラウド版と、セルフホスト可能なオープンソース版(Community Edition)が公開されている。

この記事では、Overleaf Community Editionの公式Dockerイメージ(イメージ名はsharelatex/sharelatex)を使って、セルフホストする。

クラウド版とCommunity Editionの機能の違いは、以下を参照。

使用できない機能

Git管理

Git管理やGitHub連携については、Community Editionには実装されていない(クラウド版のみ)。クラウド版のGit管理はクローズドソースなファイル履歴APIを利用して実装されており、これが技術的な課題になっているらしい。

Overleafに管理させないでよいのなら、ファイルは/var/lib/sharelatex/data/compiles/{project_id}-{user_id}に保存されるので、ここを監視して自動コミットするようなプログラムを使ってもいいかもしれない。

# 後者のIDがユーザIDであることの確認
docker-compose exec mongo mongo sharelatex --eval "db.users.find()"

テンプレート

クラウド版・Pro版限定機能。

docker-compose.yml

version: '3.9'
services:
  sharelatex:
    image: sharelatex/sharelatex:3
    restart: always
    depends_on:
      mongo:
        condition: service_healthy
      redis:
        condition: service_started
    ports:
      - "${SERVER_PORT}:80"
    volumes:
      - "${DATA_ROOT}:/var/lib/sharelatex"
      - "${TEXLIVE_ROOT}:/usr/local/texlive"
    environment:
      # https://github.com/overleaf/overleaf/wiki/Configuring-Overleaf
      SHARELATEX_APP_NAME: Overleaf Community Edition
      SHARELATEX_MONGO_URL: mongodb://mongo/sharelatex
      SHARELATEX_REDIS_HOST: redis
      REDIS_HOST: redis

      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: http://sharelatex.mydomain.com
      # SHARELATEX_NAV_TITLE: Our ShareLaTeX Instance
      # SHARELATEX_HEADER_IMAGE_URL: http://somewhere.com/mylogo.png
      # SHARELATEX_ADMIN_EMAIL: [email protected]

      # SHARELATEX_LEFT_FOOTER: '[{"text": "Powered by <a href=\"https://www.sharelatex.com\">ShareLaTeX</a> 2016"},{"text": "Another page I want to link to can be found <a href=\"here\">here</a>"} ]'
      # SHARELATEX_RIGHT_FOOTER: '[{"text": "Hello I am on the Right"} ]'

      # SHARELATEX_EMAIL_FROM_ADDRESS: "[email protected]"

      # SHARELATEX_EMAIL_AWS_SES_ACCESS_KEY_ID:
      # SHARELATEX_EMAIL_AWS_SES_SECRET_KEY:

      # SHARELATEX_EMAIL_SMTP_HOST: smtp.mydomain.com
      # 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"

  mongo:
    image: mongo:4.0
    restart: always
    volumes:
      - "${MONGO_ROOT}:/data/db"
    healthcheck:
      test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
      interval: 10s
      timeout: 10s
      retries: 5

  redis:
    image: redis:5
    restart: always
    volumes:
      - "${REDIS_ROOT}:/data"

.env

SERVER_PORT=127.0.0.1:8000
DATA_ROOT=./data/sharelatex
TEXLIVE_ROOT=./data/texlive
MONGO_ROOT=./data/mongo
REDIS_ROOT=./data/redis

設定

TeXLiveのフルインストール

TeXLiveのフルバージョンは巨大なため、Dockerイメージには最小構成のみが含まれている。 フルバージョンを使うには、インストールコマンドを実行する必要がある。

また、コンテナが削除されるとインストールしたTeXLiveが消え、再インストールが必要になるため、マウントして永続化する。 マウントすると、もともとイメージにあったディレクトリが上書きされるので、あらかじめイメージ内のTeXLiveをマウントするディレクトリにコピーしておく。

docker pull sharelatex/sharelatex:3
docker run -d --name sharelatex sharelatex/sharelatex:3
docker cp sharelatex:/usr/local/texlive ./data/
docker rm -f sharelatex

docker-compose pull
docker-compose up -d

docker-compose exec sharelatex tlmgr option repository https://mirror.ctan.org/systems/texlive/tlnet
docker-compose exec sharelatex tlmgr update --self
docker-compose exec sharelatex tlmgr install scheme-full

docker-compose up -d --force-recreate

なお、公式Wikiでは、ローカル用のDockerイメージを作る方法が案内されている。

ユーザの登録

初期状態では、/launchpadにアクセスすることで管理ユーザを作成できる(コマンドで作成も可)。

一般ユーザの登録には、/admin/registerにアクセスする。

フォント(Noto Sans CJK JP)の追加

コンテナ内のシステム(/usr/share/fontsもしくは/usr/local/share/fonts)にフォントを追加すれば認識する。

Noto Sans CJK JP Dockerfile

# syntax=docker/dockerfile:1.3-labs
FROM sharelatex/sharelatex:3

RUN <<EOF
    apt-get update
    apt-get install -y \
        fonts-noto-cjk
    fc-cache
EOF

Noto Sans CJK JP docker-compose.yml

# ...
services:
  sharelatex:
    # image: sharelatex/sharelatex:3
    build: .
    restart: always
# ...

.dockerignore

/data

.gitignore

/data
.env*

実行

DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose build
docker-compose up -d

日本語組版(uplatex、jsarticle)

※ Noto Sans CJK JPではない

Menu > Settings > CompilerLaTeXに設定する。

latexmkrc

# https://doratex.hatenablog.jp/entry/20180503/1525338512
$latex = 'uplatex';
$bibtex = 'upbibtex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex -U %O -o %D %S';
$pdf_mode = 3;
$ENV{TZ} = 'Asia/Tokyo';
$ENV{OPENTYPEFONTS} = '/usr/share/fonts//:';
$ENV{TTFONTS} = '/usr/share/fonts//:';

main.tex

\documentclass[uplatex,10pt,a4paper,twocolumn]{jsarticle}

% https://medemanabu.net/latex/vector/
\usepackage{bm}

% http://www.latex-cmd.com/equation/max_min.html
\newcommand{\argmax}{\mathop{\rm argmax}\limits}
\newcommand{\argmin}{\mathop{\rm argmin}\limits}

\usepackage[dvipdfmx]{graphicx}
\usepackage{hyperref}
\usepackage{url}

\usepackage[
    %backend=biber,
    natbib=true,
    style=numeric,
    sorting=none,
    giveninits=true,
    maxbibnames=99,
    doi=false,isbn=false,url=false,eprint=false, % 表示圧縮
]{biblatex}
\addbibresource{main.bib}

\title{First}
\author{aoirint}
\date{2021-11-05}

\begin{document}

\maketitle

\section{背景}
こんにちは

\begin{equation}
    f(x) = a^2 x + b x + c
\end{equation}

\begin{equation}
    \argmin_{\bm w}\ ({\bm w}^{\rm T} {\bm x} - y)
\end{equation}

\section{手法}
こんにちは

% \begin{figure}
%   \centering
%   \includegraphics[width=\linewidth]{figures/sample.pdf}
%   \label{fig:sample}
%   \caption{サンプル}
% \end{figure}

\section{実験}
こんにちは

\section{実験結果}
こんにちは

\section{考察}
こんにちは

\section{まとめ}
こんにちは

\printbibliography

\end{document}