Jupyter Notebook をPDFで保存する方法(日本語対応)

jupyter notebook の出力は pdf 形式で保存できます

その方法は,画面左上の「メニュー」の「名前を付けてダウンロード」から「PDF via LaTeX (.pdf)」を選ぶだけ.

ただし,この機能が正常に動作するためには

  • LaTeX がインストールされていること
  • 日本語用に設定ファイルを編集していること

の二つの条件を満たしておく必要があります

以下,その具体的方法をまとめます.

LaTeX のインストール

debianとか ubuntu なら,ディストーション標準の パッケージを入れるだけです

$ sudo apt install texlive-lang-japanese texlive-xetex

macOS なら BasicTeX を入れる方法がオススメです
pyopyopyo.hatenablog.com

設定ファイルの準備

LaTeXをインストールすれば pdf は出力できますが,日本語の文字(ひらがな・漢字)が表示されません.

設定ファイルを編集する必要があります

pdf 出力は,内部的には nbconvert と言う python モジュールで処理されています.nbconvert は article.tplx と言うテンプレートファイルをベースにpdfを出力しています

まずはそのテンプレートファイル article.tplx を探します.このファイルは,python インストールされているディレクトリの下, site-packages/nbconvert/templates/latex/ と言うディレクトリに保存されています.

このディレクトリは,nbconvert の設定ファイル ~/.jupyter/jupyter_nbconvert_config.json でも指定できます.もし ~/.jupyter/jupyter_nbconvert_config.json と言うファイルがあれば,以下のような書式で template_path が設定されています

{
  "version": 1,
  "Exporter": {
    "template_path": [
      ".",
      "path/to/jupyter_contrib_nbextensions/templates"
    ],
  }
}

article.tplx を見つけたら次のように編集します

修正前

((*- block docclass -*))
\documentclass[11pt]{article}
((*- endblock docclass -*))

修正後

((*- block docclass -*))
\documentclass[xelatex,ja=standard]{bxjsarticle}
((*- endblock docclass -*))

これだけで 日本語を含む 綺麗なpdfが出力できるようになります.

トラブルシューティング

設定が上手く行かない場合は,以下の点を確認しましょう

古い nbconvert や テンプレートファイルが残っていませんか?

python 2.7や python3.6 の残骸がシステムに残っていると,システムには複数の article.tplx が存在してることになります.運が悪いとarticle.tplx を編集してもnbconvert は別の article.tplx を参照しているので,一向に設定が反映されない・・・と言う悲劇が起きます

デバッグ方法

以下のコマンドで,nbconvert を手動で起動できます.

$ jupyter nbconvert --to pdf    filename.ipynb

さらにコマンドラインオプションを追加することで,デバッグ情報を確認することもできます

$ jupyter nbconvert --to pdf    filename.ipynb --debug

デバッグ情報には,参照している jupyter_nbconvert_config.json のパス名なども含まれていますので,しっかり確認しましょう


pdf 出力は,内部では *.tex を一度生成して,それを *.pdfにコンパイルする,と言う処理です.上手く行かない場合は,nbconvert を手動で起動して,*.tex ファイルを見てみる,と言う方法もあります.

具体的には 

$ jupyter nbconvert --to latex    filename.ipynb

とします

出力されたtexファイルのコンパイルは xelatex を使います

$ xelatex   filename.tex

これで filename.pdf が生成されます.

またテンプレートファイルを指定することもできます.例えば article.tplx の代わりに hogehoge.tplx を使う場合は

$ jupyter nbconvert --to latex  --template hogehoge.tplx  filename.ipynb

とします

テンプレートファイルは,~/.jupyter/jupyter_nbconvert_config.json で指定されている template_path から検索されます.デフォルトでは "." つまりカレントディレクトリが含まれているので, カレントディレクトリに article.tplx を配置して,適宜カスタマイズする,と言う使い方もできます.

TeXコンパイルエラーが出る

texのパッケージが不足していると texコンパイラがエラーを出します

上記テンプレートはxelatexで日本語環境を作っているので,texlive の以下のパッケージが必要になります

  • bxjscls
  • xecjk
  • zxjafbfont

他にも以下のパッケージも必要です

詳細は

$ jupyter nbconvert --to latex  --template hogehoge.tplx  filename.ipynb

tex のコードを吐かせて確認しましょう