トップ 履歴 一覧 ソース 検索 ヘルプ RSS ログイン

Jupyter Labから日本語PDFを出力する2021


キーワード

最終更新時間:2021年05月09日 22時54分48秒
アフィリエイト・広告について
プライバシーポリシー

この記事は、Pythonデータサイエンス環境の定番[1]である、Jupyter Labで作成したノートブックを、フォントやレイアウトなどを考慮した (裏でLaTeXを使った) 高品質なPDFとして出力する方法を紹介しています。なお、この記事は https://mana.bi/jupyter_pdf でも (リダイレクトで) アクセスできます。他の方への共有などでご利用ください。

はじめに

Jupyter Labは、Pythonデータサイエンス (Pythonを使ったデータ分析作業) のための環境として、広く使われています。Jupyter Labの前身であるJupyter Notebook[2]と共通する、ノートブックという仕組みで、ドキュメントとプログラム、試行錯誤の経緯を一体として記述できます。


Jupyter Labの画面

Jupyter Labは、ひととおり実行した結果が1つのファイル (.ipynb) として独立しているので、それさえ配布すれば他者と分析結果を共有できて便利です。しかし、共有する相手がITに詳しくなかったり、ブラウザ (HTML) でドキュメントを読む「文化」がなかったりすると、何らかのレポートを求められることがあります。そのような場合も、Jupyter Labは標準[3]で、ノートブックをさまざまな形式でエクスポートできる機能を備えています。


Jupyter Labのエクスポート機能

この、"Export Notebook to PDF" メニューを選択すると、ノートブックがPDFに変換されます。ただ、この変換は、LaTeXという組版 (文書整形) システムを使用するため、コンピューターにLaTeX環境を導入する必要があります。また、日本語を含むノートブックの場合、Jupyter Labが呼び出すnbconvertのLaTeX変換用スクリプトが、日本語に対応していないため、日本語が全部抜けてしまいます。もう一つの、"Export Notebook to Webpdf" メニューは、Chromeブラウザ[4]を呼び出してPDF変換するもので、日本語の化け・抜けはありませんが、ノートブックがそのまま縦に長い1ページのPDFになってしまい、あまり実用的ではありません。


左: 日本語設定をしない場合、文字が抜ける / 右: Webpdfでエクスポートすると縦に長い1ページになる

このように、Jupyter Labで作成した、日本語を含むノートブックを、見栄えの良いレポートとして出力するには、いろいろな手間がかかります。そこで、この記事では、「データサイエンス初心者」[5]の典型的な環境として、Windows PCにAnacondaとLaTeX環境を導入したうえで、作成した日本語を含むノートブックをPDFに変換するための設定を紹介します。

Anacondaのインストール

Anacondaは、Python本体と、データサイエンスにおいて広く使われるライブラリをパッケージングしたディストリビューションです。Anacondaをインストールすれば、ひととおりデータサイエンスのための環境を整えることができます。


https://www.anaconda.com/

この記事では、インストール手順を細かくは紹介しませんが、"Individual Edition" のWindows版インストーラーをダウンロードし、実行すれば、Anacondaが導入できます。"All Users" を対象にインストールすると、Windowsのセキュリティ設定によって、Jupyterなどが起動しないようなので、"Just Me" でインストールしたほうが良いようです。


Windows版のインストーラーをダウンロードする

具体的なインストールの手順は、Anaconda のインストール: Python環境構築ガイド - python.jpなどを参考にしてください。


Anaconda のインストール: Python環境構築ガイド - python.jp

TeX Liveのインストール

次に、ノートブックをPDFに変換する際に使用される、LaTeX環境をインストールします。$ \LaTeX $[6]は、科学論文などを執筆する際に広く使われている、組版 (文書整形) システムです。LaTeXの書式のうち、特に、数式をコマンドとして記述する書式はスタンダードとなっており、JupyterのMarkdownセルや、Microsoft Wordでも、LaTeX記法で数式が記述できます。詳しくは、TeX Wikiなどを参照してください。


Jupyterでも、LaTeX記法で数式が書ける

最近では、OverleafCloud LaTeXなど、インストールせずにLaTeXを利用できるクラウドサービスも広く使われていますが、JupyterによるPDF変換では、Anacondaをインストールしたコンピューターに、LaTeX環境が存在する必要があります。インストールするタイプのLaTeXディストリビューションとしては、TeX Liveが最も一般的です。近年は、日本の開発者の貢献により、日本語環境も標準で導入されます。TeX Liveは、日本 (世界) 各地のFTPサーバー[7]で公開されています。

都度、必要なファイルをダウンロードするオンラインインストーラー (tlnet) もありますが、2021年5月現在、日本国内のサーバーを指定しても、ダウンロードにかなりの時間がかかるため、ISOイメージを丸ごとダウンロードし、その後ローカルでインストールしたほうが手早いでしょう。


texlive2021.iso をダウンロードする

Windows 10では、ISOファイルを仮想DVDドライブにマウントできます。ダウンロードしたファイルを右クリックし、「マウント」を選択します。そして、ISOファイルの内容が表示されたら、install-tl-windows.bat ファイルをダブルクリックし、インストーラーを起動します。その先は詳しくは取り上げませんが、特にカスタマイズすることもないので、そのままインストールすればよいでしょう。ただ、インストールされるデータはかなり大きく、7GB程度になりますので、ディスクの空き容量には注意してください。[8]


texlive2021.iso をマウントする

install-tl-windows.bat を実行する

これで、Python実行環境とLaTeX環境をインストールできました。

Inkscapeのインストール

次に、必須ではありませんが、より高品質なPDF出力を得るために、Inkscapeというグラフィックスエディターをインストールします。Jupyter Labで実行したノートブックでは、グラフィックス (グラフ) は標準でPNG形式で出力されます。PDF変換においては、このPNG画像がそのままLaTeX文書に取り込まれます。しかし、PNG画像はラスター (ビットマップ) 形式なので、PDFを拡大するとギザギザが目立ちます。また、大量の画像を含む場合、ファイルサイズも大きくなります。そこで、Jupyterのグラフィックス出力のフォーマットを、SVG (Scalable Vector Graphics) に変更すると、拡大しても品質が変わらない、ベクター形式で出力できます。Jupyterにおける設定変更については、以下で紹介します。


PDF変換後のグラフィックス。左: PNG形式 / 右: SVG形式

ただ、LaTeXは標準でSVG形式のグラフィックスに対応していないので、処理中に同じベクター形式であるPDFに変換して取り込む必要があります。そこで、Inkscapeを使用します。PDF変換を行う、nbconvertライブラリの中で、「グラフィックスがSVGであれば、Inkscapeを使ってPDF変換する」という処理がすでに定義されているので、ユーザーが何か設定を行うことはありませんが、Inkscapeをコンピューターにインストールする必要があります。


https://inkscape.org/ja/

Inkscapeの公式サイトから、"Download" - "Windows" と辿り、64bit版のインストーラーをダウンロードします。インストーラーを実行し、途中 "Add Inkscape to the system PATH for all users" にチェックを入れて、インストールします。なお、標準の "Program Files" フォルダーにインストールすると、後ほどJupyterから呼び出した際に、フォルダー名の空白のためにエラーが出るようなので、空白を含まないインストール場所を指定してください。



Inkscapeインストーラー

なお、今回はWindowsを例にしていますが、筆者が普段使っているLinux (WSL2) では、標準のリポジトリから apt コマンドでインストールされるInkscape (0.9.2) は、なぜかnbconvertから検出されなかったので、Inkscapeプロジェクトのリポジトリを追加して、そちらから最新版をインストールする必要がありました。

これで、ノートブックをPDFに変換するために必要なソフトウェアが整いました。

nbconvertテンプレートの改変

ここからは、Jupyterが呼び出して実行するPDF変換スクリプトを、日本語に対応させる方法を紹介します。上述のように、Jupyter Labではnbconvertという拡張機能を使い、ノートブックをさまざまな形式にエクスポートできます。nbconvertは、Anacondaの標準配布物に含まれますので、別途インストールは不要です。nbconvertの変換スクリプトの仕様は、変化が激しく、頻繁にファイル名や配置場所が変わりますが、2021年5月時点では、以下のパスに存在します。[9]ここでは、AnacondaをCドライブ直下にインストールしています。

C:\Anaconda3\share\jupyter\nbconvert\templates\latex

このフォルダの中の、index.tex.j2 が、最低限編集が必要なファイルです。

ノートブックは、内部で .ipynb.tex に変換されて処理されますが、日本語を含むLaTeXファイルを処理するには、いくつかの選択肢があります。数年前までは、日本語に特化したpLaTeXおよびその発展形であるe-upLaTeXが広く使われていましたが、現在では、多言語対応のLaTeXであるXeLaTeXやLuaLaTeXにおいても、日本語の組版ルールに沿った処理ができるようになっています。nbconvertでは、標準でXeLaTeXを使うようになっているため、今回は、XeLaTeXをベースに日本語設定を行います。index.tex.j2 ファイル自体、小さなファイルですが、書き換えるのは以下の1行だけです。

16c16
< \documentclass[11pt]{article}
---
> \documentclass[a4paper,xelatex,ja=standard]{bxjsarticle}

\documentclass から始まる、クラスファイルに関する記述を、日本語に対応したbxjsarticleを使うように書き換えます。これだけで、日本語対応と、日本語フォントの埋め込み (デフォルトの standard では、原ノ味フォント) ができるようになります。

その他、数式フォントを変更したい、などLaTeX文書に関する好みの設定も、このファイルや base.tex.j2 ファイルを編集して指定できます。

ここまでの設定を行ったうえで、Jupyter Labを起動し、ノートブックをPDF変換すると、XeLaTeXで処理された、日本語PDFが出力されます。

ノートブックのグラフィックス出力をSVGにする

先ほど、Inkscapeのインストールに関して述べたように、Jupyterは、標準ではPNG形式でグラフィックスを出力します。そのため、PDFに変換して拡大などすると、ビットマップのギザギザが目立ちます。また、論文や書籍など、印刷品質の文書にも向かないでしょう。[10]そこで、ノートブックにおけるグラフィックスの出力フォーマットを、SVGに変更します。これは、Jupyterの設定項目として公式にサポートされています。

設定は、ノートブックのセル内で行います。セルに、以下のように記述します。

%config InlineBackend.figure_format = 'svg'

このようにすることで、グラフィックスの出力がSVG形式になり、内部でSVG→PDFに変換されて処理されます。グラフィックスに日本語を含む場合も、SVG形式でも特に問題なく表示されます。ただし、グラフィックスの数が増えると、変換に猛烈に時間がかかるようになります。変換したPDFは、以下のようになります。


ということで、Jupyter Labから日本語を含むノートブックをPDFに変換するための方法を紹介しました。

参考: ノートブックのタイトル、著者名の設定

ノートブックをPDF変換すると、タイトルはデフォルトでノートブックのファイル名 (.ipynb の前) になります。一般的には、ドキュメントには日本語のタイトルを付けたいですが、ファイル名に日本語を使うと、文字コードやスペースを含むことで取り扱いが不便になります。

そのため、ファイル名とは別に、ノートブックのメタデータを編集することで、任意のタイトルと、著者名を出力できます。Jupyter Labでは、ノートブックを開いた時の右端に、メタデータなどの設定を行うための歯車アイコンがあります。これをクリックし、さらに "Advanced Tools" を選択すると、メタデータがJSON形式で表示されます。

ここに、title 要素と、authors (1人であっても) 要素、(画像では設定していませんが) date 要素を追加します。それらが、LaTeXの \title{}, \author{}, \date{} にそれぞれ相当します。画面では、2つの項目が離れて表示されていますが、これは保存した際に自動的に名前順に並べ変わった結果です。続けて書いて問題ありません。authors には [] で著者を列挙します。そして、ノートブックを保存すると、以降はこの情報が、PDF変換の際に使われます。

  • [1]今は、Google Colabが定番になったかもしれませんが。
  • [2]現在もリリースされていますが、Project Jupyterとしては、Labのほうを "Next-Generation Notebook Interface" として推奨しています。
  • [3]正確には、拡張機能であるnbconvertを使って変換しています。
  • [4]正確には、そのコミュニティ版であるChromiumブラウザを使います。
  • [5]深い意味、悪意はなくて、「Jupyter PDF 出力」などで検索してこの記事を参照するのはそういう方が多いでしょうし、詳しい方は英語のドキュメントなどを読んで自力で解決するでしょうから。
  • [6]なんか、"TEX" が斜めになるのはおかしい気もしますが、MathJaxの出力ではこうなります。
  • [7]現在では、実際にはHTTPによるアクセスが主ですが。
  • [8]ノートブックをPDF変換する、という目的では、その中のほとんどは使いませんが。
  • [9]2019年頃までは ''C:\Anaconda3\Lib\site-packages\nbconvert\templates'' にありましたが、nbconvert本体とテンプレートを切り分ける方針で、場所を変更したようです。
  • [10]最近は、とにかく拙速主義なのか、汚いグラフィックスの技術書も多いですが。

カテゴリ: [Python,データサイエンス,Windows]