22
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-06-21

Deprecated

このページの内容は古くなっています。
新しい記事を書きましたのでこちらを参照ください。
JupyterのPDF出力の日本語対応法(2020年12月版)

目的

最近、機械学習等で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-japanese
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 で日本語する件について [電脳世界の奥底にて]

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

22
29
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?