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 関連モジュールのインストール
sudo apt install texlive-lang-japanese
sudo apt install texlive-xetex
sudo apt install pandoc
sudo apt install fontconfig
Python/Jupyterのインストール
ここでは、Python3のvenvを使って仮想環境を作る前提で記述します。
sudo apt install python3-venv
mkdir notebooks
cd notebooks
python3 -m venv venv
テンプレートファイル base.tplx の編集
fontspec編:すべてのフォントを日本語にする場合
nbconvert パッケージに含まれるテンプレートファイル 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編;日本語フォントのみを指定する場合
((= 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としました。
\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から認識されていることを確認します。
sudo texhash
kpsewhich jalinebreak.sty
きちんと認識していれば上記のパスが返ってきます。
base.tplxに\usepackge{jalinebreak}を記述し、上記のファイルを組み込みます。
((= 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に追加します。
((= 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 で日本語する件について [電脳世界の奥底にて]
この他にもいろんなサイトでヒントをいただきました。ありがとうございました。