JupyterLabで日本語を含むPDFを出力できるようにする

JupyterLabでPDFを出力する際に日本語が表示できずに困っていました。なんとか解決できたので、忘れないように備忘録を残しておきます。

JupyterLabとは

公式ページの言葉を借りると、JupyterLab は、ノートブック、コード、データのための最新の Web ベースのインタラクティブな開発環境です。

JupyterLab is the latest web-based interactive development environment for notebooks, code, and data.

百聞は一見に如かずで、ブラウザ版のデモを使ってみると雰囲気が掴めるかもしれません。 jupyter.org

Docker版JupyterLabの選定

インストール方法を調べたりしている中で、Docker版が公開されていることがわかりました。
Selecting an Image — Docker Stacks documentation
Docker環境を構築済みの場合は非常に楽に実行できるため、今回はDocker版を利用することにしました。

No 名称 特徴
1 jupyter/docker-stacks-foundation ・最も小さい
・JupyterLabなどは含まない
2 jupyter/base-notebook ・jupyter/docker-stacks-foundationの全内容を含む
・JupyterLabなどを含む
LaTeXを含まない(PDF出力不可)
3 jupyter/minimal-notebook ・jupyter/base-notebookの全内容を含む
LaTeXを含む
4 jupyter/r-notebook ・jupyter/minimal-notebookの全内容を含む
・Rの環境を含む
5 jupyter/julia-notebook ・jupyter/minimal-notebookの全内容を含む
・Juliaの環境を含む
6 jupyter/scipy-notebook ・jupyter/minimal-notebookの全内容を含む
Pythonの環境を含む

この他にもいくつかイメージがあるようでした。私はPythonの一部のライブラリを使いたい程度でしたので、jupyter/minimal-notebookをベースに、必要なライブラリを手動で追加することにしました。

環境構築

簡単のためにバージョンの固定などはせず、最新版を取得する構成としました。あくまで2023年12月時点に動作しただけということにご注意ください。

■フォルダ構成

% ls -1F
Dockerfile
docker-compose.yml
requirements.txt
work/

■Dockerfile

% cat Dockerfile 
# jupyter/minimal-notebookイメージをベースにする
FROM jupyter/minimal-notebook:latest

# LaTeXをインストールする
USER root
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    texlive-lang-japanese \
    texlive-lang-chinese \
    texlive-xetex \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# nbconvertのテンプレートファイルを編集する
RUN sed -i 's/\\documentclass\[11pt\]{article}/\\documentclass\[xelatex,ja=standard\]{bxjsarticle}/g' /opt/conda/share/jupyter/nbconvert/templates/latex/index.tex.j2

# 外部ライブラリをインストールする
COPY requirements.txt .
RUN pip install -r requirements.txt

# ユーザーをjovyanに戻す
USER jovyan

# 作業用ディレクトリを指定する
WORKDIR /work

■docker-compose.yml

% cat docker-compose.yml 
version: '3'
services:
  jupyterlab:
    # Dockerfileで作成したイメージをビルドする
    build:
      context: .
      dockerfile: Dockerfile
    # ポートを開放する
    ports:
      - "8888:8888"
    # コンテナ名称を設定する
    container_name: jupyterlab
    # ローカルのworkディレクトリをマウントする
    volumes:
      - "./work:/home/jovyan/work"
    # 環境変数を指定する
    environment:
      - JUPYTER_ENABLE_LAB=yes
    # 作業用ディレクトリを指定する
    working_dir: /home/jovyan/work
    # 起動コマンドを指定する
    command: start.sh jupyter lab --NotebookApp.token=''

■requirements.txt

% cat requirements.txt 
numpy
pandas

# JupytetLab拡張機能
jupyterlab_code_formatter
isort
black

■ビルド・起動

% docker compose build
% docker compose up

苦労したポイント

さまざまなサイトを調べていると、日本語PDF出力のために2つのポイントがあると分かりました。

  1. 日本語出力のためにパッケージを追加でインストールする
  2. JupyterLabで使用しているテンプレートが日本語環境向けでないので修正する

2.の修正はサイトによって対処方がまちまちで、私の環境ではどうするかが不明でした。
JupyterのPDF出力の日本語対応法(2020年12月版) #Python - Qiita こちらの記事を参考に、私の環境での当該テンプレートファイルの保存場所を調査していきました。 以下は、JupyterLab内のTerminalにて確認しています。

(base) jovyan@107e7788214c:~/work$ jupyter --path
config:
    /home/jovyan/.jupyter
    /home/jovyan/.local/etc/jupyter
    /opt/conda/etc/jupyter
    /usr/local/etc/jupyter
    /etc/jupyter
data:
    /home/jovyan/.local/share/jupyter
    /opt/conda/share/jupyter
    /usr/local/share/jupyter
    /usr/share/jupyter
runtime:
    /home/jovyan/.local/share/jupyter/runtime
(base) jovyan@107e7788214c:~/work$ ls /opt/conda/share/jupyter/nbconvert/templates/latex
base.tex.j2  display_priority.j2       index.tex.j2  report.tex.j2            style_bw_python.tex.j2  style_jupyter.tex.j2
conf.json    document_contents.tex.j2  null.j2       style_bw_ipython.tex.j2  style_ipython.tex.j2    style_python.tex.j2
(base) jovyan@107e7788214c:~/work$ 

data:の各パスを順次見ていくと、/opt/conda/share/jupyter/nbconvert/templates/latexに当該のindex.tex.j2が保存されていました。 こちらの修正も手作業は面倒なため、Dockerfileにてsedで置換しております。