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

# Deprecated
このページの内容は古くなっています。
新しい記事を書きましたのでこちらを参照ください。
[JupyterのPDF出力の日本語対応法（2020年12月版）](https://qiita.com/masa-ita/items/fb61263cd49cf949b1bc)
# 目的
最近、機械学習等でJupyter Notebookを使うことが多いのですが、ドキュメントやテキストとして配布する際に、PDF化したいということがよくありました。
texliveをインストールすれば、英語のみのNotebookは”Download as PDF via LaTex" で問題なくPDFとしてダウンロードできるのですが、日本語のNotebookでの対応方法がなかなかわかりませんでした。
Jupyter PDF で検索すると下記のような記事が見つかりますが、いずれもjupyter nbconvertコマンドでテンプレートを指定して変換する方法や、texファイルとしてダウンロードしてから、一旦dvi形式に変換し、dvipdfmxコマンドでpdfする方法でした。

[Jupyter nbconvert（ファイル変換）メモ ― はしくれエンジニアもどきのメモ](http://cartman0.hatenablog.com/entry/2016/03/29/131903)
[jupyter notebookをTex，PDFへと変換 ― 粗大メモ置き場](http://ossyaritoori.hatenablog.com/entry/2017/10/25/jupyter_notebookをTex，PDFへと変換)

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

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

## TexLive 関連モジュールのインストール
```bash:bash
sudo apt install texlive-lang-japanese
sudo apt install texlive-xetex
sudo apt install pandoc
sudo apt install fontconfig
```
## Python/Jupyterのインストール
ここでは、Python3のvenvを使って仮想環境を作る前提で記述します。

```bash:bash
sudo apt install python3-venv
mkdir notebooks
cd notebooks
python3 -m venv venv
```
## テンプレートファイル base.tplx の編集
### fontspec編：すべてのフォントを日本語にする場合
nbconvert パッケージに含まれるテンプレートファイル base.tplxを下記のように編集します。

```tex: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編；日本語フォントのみを指定する場合

```tex: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としました。

```tex:~/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:bash
sudo texhash
kpsewhich jalinebreak.sty
```
きちんと認識していれば上記のパスが返ってきます。

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

```tex: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に追加します。

```tex: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](https://texwiki.texjp.org/?xeCJK)
[XeLaTeX で日本語する件について [電脳世界の奥底にて]](http://zrbabbler.sp.land.to/xelatex.html)

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