JupyerのnotebookをnbconvertでPDFに変換する

## notebookを共有するなら、やっぱりPDF

### 導入に際して

Jupyter環境の有無にかかわらず、notebookを他者と共有したい。そんな時にnotebookを別形式のファイルに変換できるパッケージ**nbconvert**は超便利です。

Githubにアップロードするという手もありますが、アカウントが必要ですし、部外者も閲覧OKかどうかといったことも、配慮が必要になってきます。

LaTeXやMarkdownという選択肢もありますが、デバイスを問わず閲覧可能な形式と言ったら、やはりPDFが一番に挙げられます。

今回も例によって、以前CloudShellで構築した環境を利用します。

https://qiita.com/Q-Lazy/items/ef61ce36b3f47ade91fd

通常は既にインストールされているはずです。

```shell
~/miniconda3/bin/pip list | grep nbconvert
nbconvert              6.4.2
```

万が一未インストールであっても、すぐに出来ます。

```shell
~/miniconda3/bin/pip install nbconvert
```

### Pandocのインストール

始めにドキュメント・コンバータ[Pandoc](https://pandoc.org/)のインストールです。Minicondaにパッケージが用意されていますのでインストールもアップデートも容易です。

```shell
~/miniconda3/bin/conda install -c conda-forge pandoc
```

### LaTeXのインストール

問題は組版処理システム[LaTeX](https://www.latex-project.org/)の導入に関わる部分です。こちらもMinicondaにtexlive-coreというパッケージが用意されていますが、このパッケージでは、今回の目的にのための要件を満たすことが出来ないため、使用しません。

一から導入するには通常[公式サイト](https://www.tug.org/texlive/)にて任意の[公式ミラーサイト](https://ctan.org/mirrors)を選んでインストーラーを入手するところからとなりますが、操作手順も多くダウンロードにもかなり時間がかかります。

自身により手作業でセットアップしてみたいという方は、まずは下記のコマンドでインストーラーをダウンロードして展開して実行します。

```shell
curl -L https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/systems/texlive/tlnet/install-tl-unx.tar.gz | tar xzv

./install-tl-20220611/install-tl
```

インストーラーを展開するディレクトリ名の数字の部分はリリース年月日をベースにしているため、アップデートのたびに変わりますので、確認の上、適宜修正をお願いします。

texliveのインストーラー`install-tl`およびパッケージマネージャ`tlmgr`はperlのスクリプトで実装されていますが、無圧縮のファイルを1つずつ地道にダウンロードしていく仕様になっています。

インストーラーが起動したら、インストールオプションを設定します。入力の際の大文字・小文字は厳密に区別されますので、ご注意ください。

**【インストールするコレクションの選択】**
1. メインメニューの`Enter command:`プロンプトで`C`を実行→サブメニューとなりプロンプトが`Enter letter(s) to (de)select collection(s):`となる。

2. プロンプトで`-`を実行し、コレクションを未選択の状態に初期化する。

3. プロンプトで`abO`を実行し、3つのコレクションを選択する。

4. プロンプトで`R`を実行し、メインメニューに戻る。

**【インストールディレクトリの設定】**

1. メインメニューの`Enter command:`プロンプトで`D`を実行→サブメニューへ移行。

2. プロンプトで`1`を実行→`New value for TEXDIR [/usr/local/texlive/2022]:`というプロンプトが出現。

3. プロンプトにインストールディレクトリを入力。ホームディレクトリ以下であれば任意で指定できるが、一例として`~/.local/texlive/2022`とする。

4. `Enter command:`プロンプトに戻るので`R`を実行し、メインメニューに戻る。

**【オプションの設定】**

1. メインメニューの`Enter command:`プロンプトで`O`を実行→サブメニューへ移行。

2. プロンプトで'D'を実行。

3. プロンプトで'S'を実行。

4. プロンプトで`R`を実行し、メインメニューに戻る。

**【インストールを実行】**
メインメニューの`Enter command:`プロンプトで`I`を実行すると、インストールが開始される。インストールされるパッケージ数は300以上あり時間がかかるので、他の作業をしながら完了するのを待っていてもよい。

**【パッケージマネージャでの追加作業】**

`TeX Live へようこそ！`といったメッセージが表示されていれば、インストーラーによる作業は完了しています。
さらにTeX LiveのランタイムにをPATHに追加した上で、**nbconvert**に必要なパッケージを`tlmgr`コマンドでインストールします。

```shell
export PATH=${PATH}:${HOME}/.local/texlive/2022/bin/x86_64-linux

tlmgr install tcolorbox pgf environ etoolbox parskip caption float upquote eurosym fontspec unicode-math fancyvrb adjustbox xkeyval collectbox titling booktabs enumitem ulem jknapltx rsfs gettitlestring ucs
```

約30ほどのパッケージがインストールされ、最低限の準備が完了します。

**【事前準備と起動】**
インストール作業がやっと終わったら、起動方法を確認して、すぐに初回起動と動作確認ができます。
またこれは必須ではありませんが、念のためformatファイルを更新しておきます。

```shell
fmtutil-user --all
```

PDFに変換するためには、MinicondaとTeX LiveのランタイムがPATHに追加されていなければなりません。一時的にPATHを設定してJupyter Labを起動する例を下記に示します。

```shell
PATH=${HOME}/miniconda3/bin:${PATH}:${HOME}/.local/texlive/2022/bin/x86_64-linux jupyter lab &
```

起動したらPDF形式への変換テストを実施してみます。
notebookを開いた状態から、下図のようにファイルメニューを開き、エクスポートする際のファイル形式としてPDFを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/8e209ce8-0233-fec5-0f59-8dc8bf1857bc.png)

変換にかかる時間は、notebookのサイズにより変わってきます。しばらく待っていると、生成されたPDFファイルのダウンロードが始まるはずです。
下図はブラウザで直接表示した例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/30697592-df1d-083d-29a8-6f807fe28a88.png)


**【日本語フォントへの対応】**

セル内で日本語を使ったnotebookの場合このままでは表示できず、下図のように空白の状態で表示されてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/6a9b6a5b-55e8-10a8-58b9-1262859c0ceb.png)

この問題を解決するために、まずnbconvertに関わる設定ファイルを1つ変更します。
`~/.local/share/jupyter/nbconvert/templates/latex`ディレクトリか、それが無ければ`~/miniconda3/share/jupyter/nbconvert/templates/latex`ディレクトリの`index.tex.j2`というファイルです。

```tex:index.tex.j2
((*- block docclass -*))
%\documentclass[11pt]{article}
\documentclass[xelatex,ja=standard]{bxjsarticle}
((*- endblock docclass -*))
```

ファイルの末尾のほうにある上記の項目で、元の設定を`%`でコメントアウトした上で、次の行に新しい値を挿入しました。
この設定変更に伴い、新たに追加のパッケージが必要になります。

```shell
tlmgr install bxjscls zxjatype xecjk haranoaji
```

ここまでの作業により、日本語のフォントも正常に表示できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/0e1161bc-b00f-ad0f-5385-a69d8ff085d8.png)

## 終わりに

用紙サイズやヘッダー・フッターなどを見映え良くカスタマイズするにはテンプレート・ファイルを作成しなければならないようですが、ある程度の知識が必要になってきます。
今回の作業を済ませ、せっかく作ったnotebookですから、ぜひ他の人に評価してもらうことを提案させていただいて、締めくくりにさせていただきます。