- はじめに
- nbextensionsのインストール
- TeX Liveのインストール
- nbconvert base.tplx ファイルの改変
- 日本語PDF用テンプレート jsarticle.tplx の編集
- ptex2pdfの設定
- nbconvertの設定ファイルの作成
- Printview拡張の有効化・設定
- PDFを出力する
- こまごましたこと
- 注
■はじめに
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に、2020年10月時点のAnaconda 3をインストールした環境を想定しています。[2]
■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] などを押していけば、簡単に導入できます。
なお、LaTeXと組み合わせて使うことが多い (多かった) GhostScriptについては、NotebookをPDF化するという今回の目的においては、不要です。
■nbconvert base.tplx ファイルの改変
printview拡張を有効にする前に、nbconvertのLaTeX出力を制御するテンプレートを一部改変します。[4]
LinuxのAnaconda環境では、base.tex.j2 というファイルを編集する必要がありました。
以下では、使用するTeXエンジンがPDFTeX[5]であるかどうかを判定し、読み込むパッケージを変えていますが、PDFTeXではない場合に読み込まれるfontspecパッケージは、(u) pLaTeXに対応していないため、エラーになります。そのため、さらにLuaTeX[6]であるかどうかの判定を追加し、PDFTeXでもLuaTeXでもない場合は、何も読み込まないようにします。具体的には、$ANACONDA_PATH/Lib/site-packages/nbconvert/templates/latex/base.tplx を以下のように改変します。$ANACONDA_PATH はAnacondaをインストールしたパスに読み替えてください。
--- base.tplx.org 2020-10-22 08:43:10.435757000 +0900 +++ base.tplx 2020-10-22 08:44:10.357729200 +0900 @@ -19,7 +19,9 @@ \usepackage[T1]{fontenc} \usepackage{mathpazo} \else - \usepackage{fontspec} + \ifLuaTeX + \usepackage{fontspec} + \fi \fi % Basic figure setup, for now with no caption control since it's done
フォント関連の設定については、別途 jsarticle.tplx ファイルまたは、index.tex.j2 ファイルで設定してください。
■日本語PDF用テンプレート jsarticle.tplx の編集
次に、日本語に対応したLaTeXテンプレートを作成します。近年[7]の日本語LaTeX環境では、(u) pLaTeXという、UTF-8にネイティブ対応したエンジンが存在し、TeX Liveでも標準で使用できます。そのため、Jupyter Notebookからエクスポートした、UTF-8のLaTeX文書も問題なく処理できます。(u) pLaTeXは、以前から広く使われている jsarticle などの新ドキュメントクラスにも対応しています。今回は、jsarticle を使ったテンプレートの例を示します。$ANACONDA_PATH/Lib/site-packages/nbconvert/templates/latex/ ディレクトリに、jsarticle.tplx ファイルを作成します。$ANACONDA_PATH はAnacondaをインストールしたパスに読み替えてください (C:\Anaconda3 など)。
なお、LinuxのAnaconda環境では、index.tex.j2 というファイルがあり、そちらの設定が優先される? ようなので、index.tex.j2 ファイルを編集する必要があります。
((=- Default to the notebook output style -=)) ((*- if not cell_style is defined -*)) ((* set cell_style = 'style_jupyter.tex.j2' *)) ((*- endif -*)) ((=- Inherit from the specified cell style. -=)) ((* extends cell_style *)) %=============================================================================== % Latex Article %=============================================================================== ((*- block docclass -*)) \documentclass[uplatex,dvipdfmx,11pt,a4j,ja=standard]{bxjsarticle} \usepackage{graphicx} \usepackage{hyperref} \usepackage{pxjahyper} ((*- endblock docclass -*))
デフォルトで使用される article.tplx から、ほんの一部改変しただけです。(u) pLaTeXにおいて jsarticle を使用する際は、オプション ([ ] 内) に uplatex オプションを指定する必要があります。また、見出し (Markdownの # → \section{}) から自動的にしおりが作られますが、日本語文書では文字化けが発生します。これを避けるためのパッケージとして、pxjahyper を読み込みます[8]。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に与える様々なオプションを指定できない[9]ので、コマンドと必要なオプションを列挙したバッチファイルを作り、それを経由して処理を行うようにします。
適当な (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の制約ですが、ファイル名にスペースを含めることができません。[10]そのため、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]本当は、インストールディレクトリのファイルを直接いじるのではなく、別ファイルをホームディレクトリ下に作成して、そちらを参照するようにできればよいのですが、方法がわかりません。
- [5]TeXソースから直接PDFを出力できるTeX。現在では日本語にも対応していますが、今回は使用しません。
- [6]Lua言語で実装されたTeX。PDFTeXの後継にあたり、こちらもPDFを直接出力できますが、使用しません。
- [7]といっても、ここ10年近くは。
- [8]昔はプリアンブルに \special{...} などとして設定したものです。
- [9]そのように思います。詳しくはわかりません。
- [10]正確には、OSやバージョンによってできる場合もあるのですが、スペースはないほうが確実に動作します。