Nix flakes ではじめる理数系 LaTeX 環境構築

#latex#nix#技術
目次

TL;DR

リポジトリはこちら: https://github.com/mimifuwacc/nix-latex-sci

# VSCode (+ direnv) で使用する場合
nix flake init -t github:mimifuwacc/nix-latex-sci#vscode
direnv allow
# エディタに依存したくない場合
nix flake init -t github:mimifuwacc/nix-latex-sci

対象読者

この記事は,

  • 授業・レポートなどで LaTeX を使う
  • 再現性にこだわって LaTeX の環境を構築したい
  • macOS / Linux など Unix 系 OS を使用している人 (Windows でも WSL を使えば可能ですが,嬉しさがあるかはわかりません)

を対象にしています.

主に理数系学生が読むことを想定して書いています (筆者は電通大生).

とりあえず動けば良い,という人は以下の記事なんかを参考にすると良いかと思います.

(友人その1の記事)

zenn.devzenn.dev

グローバルインストールしたくない

上記の記事の手法は便利ですが,グローバルインストールするためあまり綺麗とは言えません.

そこで Dev Container を使用する手法も紹介されています.

(友人その2の記事)

zenn.devzenn.dev

この手法だと,プロジェクトごとに Docker コンテナの中で LaTeX 環境を構築するため,グローバル環境が汚染されることもなく,

さらに,Dockerfile に必要なパッケージ・設定ファイルを記述することもできるため,何を入れて何を入れないといった環境のカスタマイズなどもやりやすくなります.

しかし,Dev Container は Docker を使用しているため,(特に macOS を利用している人は) メモリやバッテリーなどのリソースを食ってしまって嬉しくありません.

そこでこの記事では,Nix flakes を使って LaTeX 環境を構築する方法を提案します.

Nix の特徴

Nix の公式サイトでは,Nix によって "reproducible, declarative and reliable systems" (再現可能・宣言的・信頼性の高いシステム) を構築できると説明されています.

nixos.orgnixos.org

必要なパッケージや設定をファイルに宣言することで,グローバル環境を汚さず,プロジェクトごとに独立した開発環境を用意できます.

また,Nix flakes を利用し,flake.nix 及び flake.lock で依存関係を管理することで,再現性の高い LaTeX 環境を構築できるようになります.

flake.nix の中身

flake.nixの仕組みについてはこの記事では説明しません.

この辺を参考にするとわかりやすいかと思います.

zenn.devzenn.dev
texEnv = pkgs.texliveSmall.withPackages (ps: with ps; [
  collection-langjapanese # uplatex/platex, jsclasses, Japanese fonts, langcjk
  collection-latexextra # beamer, jvlisting, tcolorbox, recommended, pictures, ...
  collection-mathscience # amsmath stack, siunitx, bussproofs, science fonts, ...
  latexmk # build driver
  latexindent # formatter (default settings)
]);

先程の Dev Container の記事の構成を参考にし,TeX Live の小さな構成である scheme-small をベースに,日本語・理数系文書でよく使われるパッケージを入れています.

また,ビルドツールとして latexmk,フォーマッタとして latexindent を入れています.

使い方

Nixがインストールされ,Nix flakesが利用できることを前提とします.Nixの導入方法については,本記事では扱いません (LaTeX 環境を Nix で管理したいと思ってこの記事を読んでいる人は,自力でできると信じています).

リポジトリはこちら: https://github.com/mimifuwacc/nix-latex-sci

以下のコマンドを実行するだけで,LaTeX 環境を構築できます.便利ですね.

nix flake initは現在のディレクトリへテンプレートを展開します.既存のファイルは上書きされません.

# VS Code (+ direnv) で使用する場合
nix flake init -t github:mimifuwacc/nix-latex-sci#vscode
direnv allow
# エディタに依存したくない場合
nix flake init -t github:mimifuwacc/nix-latex-sci

パッケージを追加したいときは,flake.nix を以下のように修正します.

devShells.default = pkgs.mkShell {
  inputsFrom = [ nix-latex-sci.devShells.${system}.default ];
  packages = [ pkgs.gnuplot pkgs.imagemagick ];
};

gnuplottex などを使用して LaTeX のビルド中にグラフを生成する場合にとても便利なので,gnuplot なんかは入れておいて良いかもしれません.

通常の LaTeX のレポートでは必須ではないため,必要なプロジェクトで追加する方針にしています.

(友人その3の記事)

zenn.devzenn.dev

デメリット

  • Nix を使っていない人にはあまり刺さらない
  • Nix の特性上,どうしてもストレージを消費する

がデメリットです.

ストレージを消費する問題についてはこの記事がかなり良かったのでおすすめです.

zenn.devzenn.dev

おしまい

また一つ,LaTeX の環境構築の記事が増えてしまいました.

とはいえ,ざっと調べてみた限りでは,Nix を使った LaTeX 環境構築の記事はほとんどなかったので,有益な情報になればよいなと思っています.

それでは,良い LaTeX ライフを!