Python
LaTeX
Ubuntu
PDF
Jupyter

日本語のJupyter NotebookをPDFとしてダウンロードする

目的

最近、機械学習等でJupyter Notebookを使うことが多いのですが、ドキュメントやテキストとして配布する際に、PDF化したいということがよくありました。
texliveをインストールすれば、英語のみのNotebookは”Download as PDF via LaTex" で問題なくPDFとしてダウンロードできるのですが、日本語のNotebookでの対応方法がなかなかわかりませんでした。
Jupyter PDF で検索すると下記のような記事が見つかりますが、いずれもjupyter nbconvertコマンドでテンプレートを指定して変換する方法や、texファイルとしてダウンロードしてから、一旦dvi形式に変換し、dvipdfmxコマンドでpdfする方法でした。

Jupyter nbconvert(ファイル変換)メモ ― はしくれエンジニアもどきのメモ
jupyter notebookをTex,PDFへと変換 ― 粗大メモ置き場

手元にJupyterとLatexをインストールしてあればこれでもいいのですが、今回はサーバーにJupyterをインストールして、ブラウザだけで使わせたいので、目的に合いませんでした。

Ubuntuの場合の手順

後述のページなどを参考に試行錯誤の結果、なんとかブラウザだけでPDFをダウンロードできる環境ができましたので、Ubuntuを例に取り設定方法を紹介します。

TexLive 関連モジュールのインストール

bash
sudo apt install texlive-lang-japanse
sudo apt install texlive-xetex
sudo apt install pandoc
sudo apt install fontconfig

Python/Jupyterのインストール

ここでは、Python3のvenvを使って仮想環境を作る前提で記述します。

bash
sudo apt install python3-venv
mkdir notebooks
cd notebooks
python3 -m venv venv

テンプレートファイル base.tplx の編集

fontspec編:すべてのフォントを日本語にする場合

nbconvert パッケージに含まれるテンプレートファイル base.tplxを下記のように編集します。

venv/lib/python3.5/site-packages/nbconvert/templates/latex/base.tplx
((= Latex base template (must inherit)
This template builds upon the abstract template, adding common latex output
functions.  Figures, data_text,
This template does not define a docclass, the inheriting class must define this.=))

((*- extends 'document_contents.tplx' -*))

%===============================================================================
% Abstract overrides
%===============================================================================

((* block header *))
    ((* block docclass *))((* endblock docclass *))

    ((* block packages *))
    \usepackage[T1]{fontenc}
    \usepackage{fontspec}

    % Nicer default font (+ math font) than Computer Modern for most use cases

...(中略)

((* block body *))
    \begin{document}

    \setmainfont[BoldFont=IPAexGothic]{IPAexMincho}
    \setsansfont{IPAexGothic}
    \setmonofont{IPAGothic}

    ((* block predoc *))

...(以下略)

xeCJK編;日本語フォントのみを指定する場合

venv/lib/python3.5/site-packages/nbconvert/templates/latex/base.tplx
((= Latex base template (must inherit)
This template builds upon the abstract template, adding common latex output
functions.  Figures, data_text,
This template does not define a docclass, the inheriting class must define this.=))

((*- extends 'document_contents.tplx' -*))

%===============================================================================
% Abstract overrides
%===============================================================================

((* block header *))
    ((* block docclass *))((* endblock docclass *))

    ((* block packages *))
    \usepackage[T1]{fontenc}
    \usepackage{xeCJK}
    \setCJKmainfont[BoldFont=IPAexGothic]{IPAexMincho}
    \setCJKsansfont{IPAexGothic}
    \setCJKmonofont{IPAGothic}

    % Nicer default font (+ math font) than Computer Modern for most use cases

...(以下略)

日本語の段落を右端で折り返す設定

上記の設定をすると日本語は表示できますが、日本語の段落が右端で折り返されず、見切れてしまいます。これを回避する設定です。
ホームディレクトリにtexmfフォルダを作成し、その下にtex/latex/localというディレクトリ構造を作ります。その中に下記のファイルを作成します。ファイル名はjalinebreak.styとしました。

~/texmf/tex/latex/local/jalinebreak.sty
\XeTeXlinebreaklocale "ja"
\XeTeXlinebreakskip=0pt plus 1pt
\XeTeXlinebreakpenalty=0

\def\<{\@ifstar{\zx@hwback\nobreak}{\zx@hwback\relax}}
\def\zx@hwback#1{\leavevmode#1\hskip-.5em\relax}

下記のコマンドでlatexから認識されていることを確認します。

bash
sudo texhash
kpsewhich jalinebreak.sty

きちんと認識していれば上記のパスが返ってきます。

base.tplxに\usepackge{jalinebreak}を記述し、上記のファイルを組み込みます。

venv/lib/python3.5/site-packages/nbconvert/templates/latex/base.tplx
((= Latex base template (must inherit)
This template builds upon the abstract template, adding common latex output
functions.  Figures, data_text,
This template does not define a docclass, the inheriting class must define this.=))

((*- extends 'document_contents.tplx' -*))

%===============================================================================
% Abstract overrides
%===============================================================================

((* block header *))
    ((* block docclass *))((* endblock docclass *))

    ((* block packages *))
    \usepackage[T1]{fontenc}
    \usepackage{jalinebreak}

...(以下略)

段落のインデントを解除する

既定では各段落の1行目は英語用のインデントが行われます。これを解除する設定です。
\setlength{\parindent}{0in} をbase.tplxに追加します。

venv/lib/python3.5/site-packages/nbconvert/templates/latex/base.tplx
((= Latex base template (must inherit)
This template builds upon the abstract template, adding common latex output
functions.  Figures, data_text,
This template does not define a docclass, the inheriting class must define this.=))

((*- extends 'document_contents.tplx' -*))

%===============================================================================
% Abstract overrides
%===============================================================================

((* block header *))
    ((* block docclass *))((* endblock docclass *))

    ((* block packages *))
    \usepackage[T1]{fontenc}
    \usepackage{jalinebreak}
    \setlength{\parindent}{0in}

...(以下略)

参考

xeCJK - TeX Wiki
XeLaTeX で日本語する件について [電脳世界の奥底にて]

この他にもいろんなサイトでヒントをいただきました。ありがとうございました。