🐳

DevContainerで始めるLaTeX論文予稿執筆

2024/07/19に公開

TL;DR

DevContainer内で \LaTeX の執筆環境テンプレートを作りました
https://github.com/SoRA-X7/latex-devcontainer-termpaper

メリット

  • 構築が楽、TeX Live をローカルにインストールしなくて済む
  • パッケージ追加もDockerfileを編集するだけ
  • LaTeX Workshopが自動でconfig込みで入るので、コンパイルを気にする必要がない

LaTeXの実行環境

アカデミックな分野で論文を執筆する場合は、WordやPages、Google Docsよりも\LaTeXを利用することが多いです。私達の研究室でも、卒論や学会論文はもちろん予稿でも\LaTeXを使うことが前提となっています。

\LaTeXはマークアップ言語で、役割としてはHTMLやMarkdownと似ています。\LaTeX(もとい前身の \TeX)は当初より数学者・計算機科学者である Donald E. Knuth教授が論文執筆のために開発したもので、数式や図表をきれいに組版することに長けています。

\LaTeXの記法や図表の入れ方についてはインターネット上に記事が大量にありますので今回は説明を割愛します。

LaTeX のしんどいポイント

\LaTeXは便利なソフトウェアですが、ローカルで実行するための準備が結構大変です。

  • Wordのように単一のアプリケーションとして配布されているわけではない
  • 歴史の長いソフトウェアであるため、環境依存の問題が発生しがち
  • 実用上様々な拡張パッケージを入れる必要がある
  • PDFファイルを出力するために、幾つものコマンドを入力する必要がある

↑を簡素にした TeX Live のようなディストリビューションを利用する手やOverleafのようなクラウド実行環境を利用する手もありますが、今回はローカルで環境依存なく\LaTeXで執筆できるように、Visual Studio CodeのDevContainerを利用した執筆環境を作成します。

環境とは

ソフトウェアを実行するためには、その実行バイナリ(.exeなど)があるだけでなく、それを実行するための条件が揃っている必要があります。
例えば:

  • WindowsアプリはmacOSでは動作しない
  • Pythonでライブラリを使うときはあらかじめ pip install しないといけない

このような条件のことを総じて「環境」(Environment)と言い、ソフトウェアを動かすためには環境を整えてあげることが必要です。

環境の準備

以下の手順が既にお済みの方は適宜スキップしてください。
(Homebrew Caskなどでインストールしても構いません)

Docker Desktop のインストール

Dockerとは

以下ChatGPTの回答

Dockerは、ソフトウェアの開発や配布を効率化するためのプラットフォームです。初心者向けに簡単に説明すると、Dockerはアプリケーションを「コンテナ」と呼ばれる独立した環境にパッケージ化して実行する技術です。以下にDockerの基本的なポイントを紹介します。

  1. コンテナとは?
    軽量な仮想化技術: コンテナは、仮想マシン(VM)に似ていますが、より軽量です。ホストOSのカーネルを共有しながら、独立した環境を提供します。
    一貫した環境: 開発環境と本番環境で同じ環境を提供できるため、動作の一貫性を確保できます。
  2. Dockerの利点
    ポータビリティ: コンテナにパッケージ化されたアプリケーションは、どの環境でも同じように動作します。開発者のローカルマシンでも、テスト環境でも、本番サーバーでも同じです。
    効率性: コンテナは軽量で、リソースの消費が少ないため、多くのコンテナを一台のホスト上で実行できます。
    迅速なデプロイ: コンテナは迅速に起動でき、アプリケーションのデプロイが迅速かつ簡単になります。
  3. 基本的な用語
    イメージ (Image): コンテナの実行に必要なファイルや設定を含むテンプレートです。イメージはDocker Hubなどのリポジトリから取得できます。
    コンテナ (Container): イメージを実行した実体です。独立した環境でアプリケーションを実行します。
    Dockerfile: イメージを作成するための設定ファイルです。どのソフトウェアをインストールするか、どのコマンドを実行するかなどを記述します。

つまりDockerとはローカルOSの環境を汚染することなく、独立した環境を作成することができるソフトウェアです。

Dockerに関してはこちらの記事がわかりやすいと思います。
https://knowledge.sakura.ad.jp/13265/

インストール

https://www.docker.com/ja-jp/products/docker-desktop/ から自分のOSにあったDocker Desktopをインストールします。

Visual Studio Code のセットアップ

インストール

情報基礎の授業で Visual Studio Code (以下VSCode)はインストールされているかと思いますが、もししていない場合は下からダウンロードしてください。

https://code.visualstudio.com/

Dev Containers 拡張機能のインストール

Dev Containersとは、VSCodeがDockerコンテナの中で直接ファイルを編集したりコマンドを実行するような作業ができるようになる拡張機能です。

https://zenn.dev/conecone/articles/ab8d71d81e64bb

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

VSCodeの左サイドバーから「Extensions」を開き、Dev Containersを検索してインストールしてください。

使い方

リポジトリの作成

https://github.com/SoRA-X7/latex-devcontainer-termpaper

こちらのテンプレートをブラウザで開き、右上のUse this template から Create New Repositoryを選択します。

任意のリポジトリ名をつけて、自身のアカウントにリポジトリを作成します。

リポジトリが作成できたら、ローカルに作成したリポジトリをクローン(git clone)してください。

VSCodeでの開き方

作成したリポジトリをクローンしてVSCodeで開きます。

すると、右下に「Reopen in Container」と書かれた青色のボタンが表示されるのでクリックします。初回はイメージのダウンロードとビルドを行うため少し時間がかかります。

もし「Reopen in Container」のダイアログを閉じてしまった場合は、ウインドウ左下の「><」のような青色のボタンをクリックして出てきたリストから「Reopen in Container」を選択することでDockerコンテナ内でリポジトリを開くことができます。

書いてみる

VSCodeをDockerコンテナ内で開けたら、自動的に必要な LaTeX Workshop 拡張機能がインストールされます。

main.tex を編集して保存するたびに、自動で main.pdf が作成・更新されるようにセットアップ済です。

あとは通常通り BibTeX や図表を追加して、快適な執筆ライフを〜

\LaTeXの基本的な使い方についてはインターネットで検索したりGPTに聞いてみたりしてください。

パッケージの追加

TeXLiveのデフォルトパッケージに加えて、筆者がよく利用する algorithms algorithmicx algpseudocodexをイメージに同梱してあります。

もしそのほかのパッケージを追加したい場合も、.devcontainers/Dockerfile を編集することで簡単にできるようになっています。

.devcontainers/Dockerfile
FROM paperist/texlive-ja:latest
RUN wget -P "/sty" "https://raw.githubusercontent.com/h-kitagawa/plistings/master/plistings.sty"
RUN tlmgr update --self
# ↓に追記
RUN tlmgr install algorithms algorithmicx algpseudocodex
RUN apt update && apt install -y git
CMD [ "bin/bash" ]

あとがき

DockerでTeXLive環境を建てる記事はありましたが、DevContainerを利用する記事が見当たらなかったので執筆しました。
以前筆者はOverleafを使用していましたが、Git連携機能が完全有料化されたのを機にローカルに移転するために本テンプレートを作成しました。

DevContainers、Ruby・LaTeXのような環境が重い言語には相性抜群ですね。

Discussion