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

Jupyter Notebookでボタン1つで日本語PDFを作成する


キーワード

最終更新時間:2020年06月08日 18時35分52秒
アフィリエイト・広告について
プライバシーポリシー

はじめに

Jupyter Notebookで作成したドキュメント (コード+文書) を印刷したり、紙媒体の形状 (A4縦、とか) で出力したいことがあります。Jupyter Notebookでは、[File] - [Download as] メニューから、Notebookを、MarkdownやHTMLなど様々な形式にエクスポートできます。印刷に適したLaTeXなどの形式でもエクスポートできます。しかし、印刷するためにはエクスポートしたファイルを、さらに別のソフトウェアで変換するなど、ひと手間がかかります。この記事では、Jupyter Notebookの nbextensions/printview 拡張機能と、LaTeXソースファイルのコンパイルとdvipdfmxによるPDF変換をまとめて実行できる ptex2pdf スクリプトを組み合わせ、Jupyter Notebookのブラウザ画面から、印刷ボタンを押すだけで (日本語に対応した) PDFが出力できるようにする方法を紹介します。[1]

なお、ここではWindows 10にAnacondaをインストールした前提で説明しています。[2]また、以下で紹介している、新たに作成する各種テンプレートなどは、GitHubレポジトリで公開しています。ご参考にどうぞ。

nbextensionsのインストール

はじめに、Printview拡張を含め、Jupyter Notebookを便利に使うための様々な拡張機能がセットになったnbextensionsをインストールします。

スタートメニューから "Anaconda Prompt" を開き、以下のように入力します。

conda install -c conda-forge jupyter_contrib_nbextensions

TeX Liveのインストール

今回の記事では、Jupyter Notebookから出力したLaTeX形式のソースファイルを処理してPDFを作成するため、LaTeXディストリビューションであるTeX Liveをインストールします。以前 (学生時代など) LaTeXを使っていた場合、W32TeXをインストールしていたかもしれませんが、現在[3]はTeX Liveに日本語関連の設定などもすべて取り込まれており、TeX Liveで日本語LaTeX環境を構築できます。

TeX Liveの詳細なインストール手順は、TeX Wikiの記事などを参照してください。現在は、GUIのインストーラで [OK][Next] などを押していけば、簡単に導入できます。

https://texwiki.texjp.org/?plugin=attach&refer=TeX%20Live%2FWindows&openfile=2015_inst1.png https://texwiki.texjp.org/?plugin=attach&refer=TeX%20Live%2FWindows&openfile=2015_inst2.png https://texwiki.texjp.org/?plugin=attach&refer=TeX%20Live%2FWindows&openfile=2015_inst3.png
TeX Liveインストーラ

なお、LaTeXと組み合わせて使うことが多い (多かった) GhostScriptについては、NotebookをPDF化するという今回の目的においては、不要です。

nbconvert "base" テンプレートの改変

ここに記述していた内容は、最新のテンプレートでは解決しているようです (理由は定かではありませんが)。そのため、記述をコメントアウトしました。

日本語PDF用テンプレートの作成

次に、日本語に対応したLaTeXテンプレートを作成します。近年[4]の日本語LaTeX環境では、(u) pLaTeXという、UTF-8にネイティブ対応したエンジンが存在し、TeX Liveでも標準で使用できます。そのため、Jupyter Notebookからエクスポートした、UTF-8のLaTeX文書も問題なく処理できます。(u) pLaTeXは、以前から広く使われている jsarticle などの新ドキュメントクラスにも対応しています。今回は、jsarticle を使ったテンプレートの例を示します。$ANACONDA_PATH/lib/python3.7/site-packages/nbconvert/templates/latex/ ディレクトリに、jsarticle.tplx などとしてファイルを作成します。$ANACONDA_PATH はAnacondaをインストールしたパスに読み替えてください (C:\Anaconda3 など)。

% Default to the notebook output style
((* if not cell_style is defined *))
    ((* set cell_style = 'style_ipython.tplx' *))
((* endif *))

% Inherit from the specified cell style.
((* extends cell_style *))


%===============================================================================
% Latex Article
%===============================================================================

((* block docclass *))
\documentclass[uplatex,dvipdfmx,11pt,a4j]{jsarticle}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{pxjahyper}
((* endblock docclass *))

デフォルトで使用される article.tplx から、ほんの一部改変しただけです。(u) pLaTeXにおいて jsarticle を使用する際は、オプション ([ ] 内) に uplatex オプションを指定する必要があります。また、見出し (Markdownの #\section{}) から自動的にしおりが作られますが、日本語文書では文字化けが発生します。これを避けるためのパッケージとして、pxjahyper を読み込みます[5]pxjahyper パッケージは hyperref パッケージを必要とするため、合わせて読み込みます。

もし、フォントサイズや用紙サイズなどを複数使い分けることがあれば、\documentclass{} のオプションを変えたテンプレートを、複数用意しておくとよいでしょう。

ptex2pdfの設定

上記のように設定することで、日本語環境に対応したLaTeXソースファイルが生成されます。今度は、そのソースファイルを処理するためのptex2pdfの設定です。ptex2pdfは標準でTeX Liveに含まれる、"(u) pLaTeX でコンパイル → dvipdfmx でPDF化" をいちどに行ってくれるラッパープログラムです。nbconvertでは、$ANACONDA_PATH/lib/site-packages/nbconvert/exporters/pdf.py でPDF化の処理を行うのですが、ptex2pdfに与える様々なオプションを指定できない[6]ので、コマンドと必要なオプションを列挙したバッチファイルを作り、それを経由して処理を行うようにします。

適当な (PATHの通った) ディレクトリに、以下のような内容のファイルを作成します。名前は何でもよいですが、ここでは ptex2pdf2.bat としました。

ptex2pdf -u -l -ot "-shell-escape" %1

たった1行だけです。オプションは、「(u) pLaTeXを使う」「グラフなどの画像を表示するための "枠" を作成する extractbb コマンドを呼び出せるようにする」ということを設定しています。

nbconvertの設定ファイルの作成

Notebookの画面上からボタン1つでPDF化するために、上記したようなテンプレート、コマンドがデフォルトで呼び出されるように、 nbconvert コマンドの設定ファイルを作成し、設定を変更します。スタートメニューから "Anaconda Prompt" を開き、以下のように入力します。

jupyter nbconvert --generate-config

すると、ホームディレクトリ (Windowsでは "C:\Users\ユーザー名\Documents") に .jupyter/jupyter_nbconvert_config.py が生成されます。ファイルをテキストエディタで開き、以下のように修正します。

--- jupyter_nbconvert_config.py.org     2019-07-13 15:17:18.981022500 +0900
+++ jupyter_nbconvert_config.py 2019-07-13 13:50:24.331150900 +0900
@@ -232,9 +232,11 @@

 ## Shell command used to run bibtex.
 #c.PDFExporter.bib_command = ['bibtex', '{filename}']
+c.PDFExporter.bib_command = ['upbibtex', '{filename}']

 ## Shell command used to compile latex.
 #c.PDFExporter.latex_command = ['xelatex', '{filename}']
+c.PDFExporter.latex_command = ['ptex2pdf2', '{filename}']

 ## How many times latex will be called.
 #c.PDFExporter.latex_count = 3

Printview拡張の有効化・設定

ここまでの作業で、Notebookから "印刷" ボタンを押した際に裏で行われる処理の設定ができました。Printview拡張を有効化し、PDF出力する設定を行います。Jupyter Notebookを起動し、ファイル一覧から [nbextensions] を選択します。そして、Printview にチェックを入れて有効化します。

そして、画面を下にスクロールすると、Printview拡張の設定項目が表示されています。

ここで、オプションを以下のように指定します。

--to pdf --template jsarticle.tplx

これで、Printview拡張のボタンを押せば、PDFが出力されるようになります。

PDFを出力する

実際に、試してみましょう。まず、適当なNotebookを作ります。そして、Notebookのツールバーにプリンターを模したボタンがあるので、それを押します。

すると、Printview拡張から nbconvert が呼び出され、PDFが作成されます。

こまごましたこと


 タイトルにスペースが使えない

裏で呼び出す (u) pLaTeXの制約ですが、ファイル名にスペースを含めることができません。[7]そのため、Notebookのファイル名 (Notebook左上で設定するタイトル) にはスペースを使わないようにしてください。

 タイトル、作者名などのメタデータを設定し、PDFに反映させたい

上記と関連しますが、スペースを含む文字列をPDFのタイトル (LaTeXの \title{} 要素) に使いたい、作者 (\author{} 要素) を表示したい場合、Notebookのメタデータ (管理情報) にその情報を追記します。Notebookのツールバーから [Edit] - [Edit Notebook Metadata] を選択します。

NotebookのメタデータはJSON形式で記述します。タイトルと作者を設定したい場合、以下のように追記します。

これで、変換時にはメタデータが優先されて、スペースのあるタイトルや作者名がLaTeXソースファイルに取り込まれます。

カテゴリ: [Python]


  • [1]Printview拡張のデフォルトがXeLaTeXで、そちらでも日本語処理はできます。
  • [2]Ubuntu 18.04 (WSL) でも検証して、所望の機能が実現できたので、環境は問いません。
  • [3]といっても、ここ10年近くは。
  • [4]といっても、ここ10年近くは。
  • [5]昔はプリアンブルに \special{...} などとして設定したものです。
  • [6]そのように思います。詳しくはわかりません。
  • [7]正確には、OSやバージョンによってできる場合もあるのですが、スペースはないほうが確実に動作します。