ドキュメント変換ツール Pandoc の LaTeX を使った PDF 出力。
この投稿では前回の HTML 変換に引き続いて、Pandoc を使って Markdown テキストを PDF へ変換する方法を書いています。
使用環境:Windows7 64bit, pandoc 1.13.2, TeXLive 2014
LuaLaTeX
Pandoc の PDF 出力の場合、標準では pdfLaTeX が使われます。本家の Web サイトでは pdfLaTeX をサポートした MiKTeX を薦めていますが、日本語テキストを扱う場合は LuaLaTeX がお薦めです。この LuaLaTeX では日本語組版に対応した LuaTeX-ja パッケージがサポートされています。
Windows 環境への LuaLaTeX のインストールは TeX Live を使います。専用のインストーラが用意されているので簡単にインストールできます。
TeX Liveとは
TeX Live は TeX のディストリビューションのひとつで TeX 環境がこのディストリビューションパッケージにまとめられています。現在では日本語組版に必要な要素のほとんどすべてがまるっと取り込まれているので、TeX Live をインストールするだけで日本語文書を扱うことができます。
TeX Live 2014をインストール
今回は TeX Live 2014 インストール用 DVD を作成してインストールしました。 出来上がった DVD の中の install-tl-windows.bat
を実行するとインストールを開始できます。インストールに要した時間は DVD インストールでは約 1 時間でした。また別件で DVD の内容全てを HDD 上にコピー後(ISO ファイルがマウントできるならコピー不要)インストールした場合では約 30 分でした。HDD 上でインストール作業が可能な場合は後者がお勧めです。
TeX Live の最新版 TeX Live 2014 の ISO イメージファイル
TeX Live をインストールすると TeX の総合環境 TeXworks が付いてきます。LaTeX ファイルの動作確認など便利に使えます。
参考: インストール後の TeXworks の日本語環境の設定等が分かりやすく書かれています。
PDF出力を試してみる
はじめに Markdown テキストを PDF ファイルに変換してみましょう。
- コマンドプロンプトから
pandoc -o hello.pdf
を入力 #Hello Pandoc
を入力Crtl + Z
キーを押してEOFを入力
>pandoc -o hello.pdf #Hello Pandoc ^Z
問題が無ければカレントフォルダにhello.pdf
が出力されているはずです。
このように TeX Live を使えば Pandoc から簡単に PDF 出力できるようになります。
日本語を含んだMarkdownファイルをPDFに変換する場合
日本語文章を PDF 出力する場合は、日本語に対応したLaTeX エンジンとドキュメントクラスを Pandoc に指定して変換します。
たとえば LaTeXエンジンに LuaLaTeX を指定、ドキュメントクラスに ltjarticle を指定する場合は、コマンドにこのオプションを追加します。
--latex-engine=lualatex -V documentclass=ltjarticle
Pandoc のデフォルトエンコーディングは UTF-8 になっています。そのため、コマンドプロンプトから入力した日本語テキストを標準入力から Pandoc に入力すると、内部エンコードの違いでうまくいきません。ここでは入力用の Markdown ファイルを作成して試すことにします。
はじめに任意の Markdown テキストを記述したファイルを作成して UTF-8 でファイルを保存します。 この例ではファイル名input.md
で保存します。
input.md
#こんにちはPandoc
次のコマンドを実行して PDF へ変換します。
pandoc -f markdown input.md -s -o output.pdf ^ --latex-engine=lualatex ^ -V documentclass=ltjarticle
カレントフォルダにoutput.pdf
が出力されているはずです。
この例で Pandoc は、入力されたファイルを LaTeX 形式に変換後 LuaLaTeX を経由して PDF を出力しています。このとき-s
オプションによって LaTeX 用のテンプレートが適用されています。
ここで、入力した Markdown 形式の内容が、どのように LaTeX 形式に変換されたのかを知るには、出力ファイルを LaTeX 形式に指定することで確認できます。
pandoc -f markdown input.md -s -o output.tex ^ --latex-engine=lualatex ^ -V documentclass=ltjarticle
出力されたファイルoutput.tex
を TeXworks で開き、LuaLaTeX でタイプセットすると PDF 出力と同じ内容のプレビューを TeXworks で確認することができます。
用紙サイズやマージンの指定は-V geometry:
を使うと便利です。
A4用紙に設定する
-V geometry:a4paper
マージンを1cmに設定する
-V geometry:margin=1cm
文書クラス(ドキュメントクラス)
文書クラスは LaTeX の文章の体裁や論理構造を決める情報ファイルです。LaTeX でよく使われる文書クラスは article, book, report などがあります。 (ファイルの拡張子は .cls )
日本語に対応した標準的な文書クラスはjsclassesです。接頭辞のjs
は(Japanese Standard)の意味を含んでいるそうです。このファイルは新しい標準的な文書クラスとして 2000 年に公開されました。
- jsarticle.cls (標準的な横書き論文・レポート)
- jsbook.cls (標準的な横書き書籍)
LuaLaTeX用の文書クラス
LuaLaTeX で使用する文書クラスは jsclasses を LuaTeX-ja 用に調整されたものがあります。 LuaLaTeX では接頭辞にlt
が付いた文書クラスltjsclasses
などを使用します。
インストールフォルダを調べると下記のクラスファイルが見つかりました。Pandoc での動作確認結果と合わせて一覧に示します。
デフォルトインストールではこのフォルダに入っています。
C:\texlive\2014\texmf-dist\tex\luatex\luatexja
クラスファイル名 | Pandocで使用の可否 |
---|---|
ltjarticle.cls | OK |
ltjreport.cls | OK |
ltjbook.cls | OK |
ltjltxdoc.cls | OK |
ltjsarticle.cls | OK (ただし要パッチ) |
ltjsbook.cls | NG (エラー発生) |
ltjskiyou.cls | NG (エラー発生) |
ltjspf.cls | NG (エラー発生) |
LuaLaTeX で ltjsarticle を指定するとエラーが発生しましたが、この情報を参考にパッチを当てると使えるようになりました。
PDFのコードブロックをきれいに表示する。
実際に Markdown を PDF 変換してみると分かるのですが、Pandoc で出力したコードブロックはシンプルすぎて本文とコードブロックの違いが分かり難かったり、コードブロックの行の折り返しが行われず行が長くなると右側にはみ出た部分が途切れてしまい良くありません。
この場合 Pandoc の--listings
オプションを使うと、コードブロックの表示を良い感じに設定できます。
Pandoc: --listings
オプション
--listings
オプションの有無の違いをコマンドラインで確認してみましょう。
Pandoc 標準のコードブロック
>pandoc -t latex ``` puts "Hello Pandoc" ``` ^Z \begin{verbatim} puts "Hello Pandoc" \end{verbatim}
標準の PDF 出力のコードブロックは LaTeX の verbatim 環境に変換されるようです。これは入力どおりの内容をそのまま出力するもので、改行以外の文字で折り返すことなくそのまま表示されます。
つぎは、Pandoc --listings
オプション付きのコードブロック
>pandoc -t latex --listings ``` puts "Hello Pandoc" ``` ^Z \begin{lstlisting} puts "Hello Pandoc" \end{lstlisting}
このように、--listings
オプションを付けるとコードブロックが verbatim 環境から lstlisting 環境に変わります。この例では文字が入れ替わっただけの違いしか有りませんが、lstlisting 環境では行の折り返しは勿論のこと、シンタックスハイライトや行番号表示などが可能になります。
lstlisting 環境の設定はコマンドラインで指定すると冗長になるので、あらかじめ別ファイルlistings-setup.tex
に設定を書いておきます。
コードの先頭 4 行は lstlisting 環境の設定とは関係ありません。ここではフォント埋め込みや用紙サイズ、数式のためのパッケージの設定等を合わせて設定しています。
listings-setup.tex
コードブロックに listings 設定ファイルを適用するには、-H xxx.tex
オプションで指定します。その場合次のコマンドを実行します。
pandoc -f markdown input.md ^ -V documentclass=ltjsarticle ^ --latex-engine=lualatex ^ --listings -H listings-setup.tex ^ -o output.pdf
GFM の場合
pandoc -f markdown_github+fenced_code_attributes ^ input.md ^ -V documentclass=ltjsarticle ^ --latex-engine=lualatex ^ --listings -H listings-setup.tex ^ -o output.pdf
コードブロックの書き方
LaTeX の lstlisting 属性の記述方法も可能のようです。
この例ではコードブロックの左に行番号を表示、開始番号を 10 に指定、コードブロックのキャプションを設定しています。
```{language=Ruby numbers=left startFrom=10 caption="\{This is caption of code block\}"} require 'sinatra' #こんにちはPandoc get '/' do 'Hello Pandoc!' end ```
PDF 出力の結果
Pandoc の属性記述方法の場合
この例では言語をRuby、行番号を表示、開始番号を 1 に指定しています。
```{ .ruby .numberLines startFrom="1"} require 'sinatra' #こんにちはPandoc get '/' do 'Hello Pandoc!' end ```
PDF 出力の結果
Pandoc の属性記述方法(言語名のみ)
```ruby require 'sinatra' #こんにちはPandoc get '/' do 'Hello Pandoc!' end ```
PDF 出力の結果
LaTeXコマンドを使う
Markdown の PDF 化では、HTML 出力したファイルをブラウザの PDF プリンタを経由して PDF ファイルに保存することができますが、改ページの位置を PDF プリンタに委ねなければなりません。Pandoc を使って Markdown から PDF を出力する場合は、テキスト内に LaTeX コマンドを記述して改ページをコントロールすることができます。あわせて、拡張書式tex_math_dollars
を有効にしておくと、数式にインライン数式の$...$
が使えるので便利です。
Markdown テキストの中に LaTeX コマンドを記述する場合、記述方法で注意することがあります。 というのも、HTML 出力で MathJax を使う場合では数式と LaTeX コマンドの両方を$...$
の中に記述できます。いっぽうで、PDF 出力の場合では LaTeX を経由するため$...$
は数式モードを表します。そのため数式モードで使えないコマンドを$...$
の中に記述するとエラーになる場合があります。
LaTeX コマンドを使って改ページする場合は、テキスト内の改ページしたい位置にnewpage
コマンドをそのまま記述します。
\newpage
コマンドラインでは、拡張書式raw_tex
とtex_math_dollars
を追加して実行します。 GFM の場合このようなコマンドになります
pandoc -f markdown_github-hard_line_breaks^ +raw_tex+tex_math_dollars^ +fenced_code_attributes ^ input.md ^ -V documentclass=ltjsarticle ^ --latex-engine=lualatex ^ --listings -H listings-setup.tex ^ -o output.pdf
まとめ
Markdown テキストから簡単に PDF 出力できる Pandoc の便利さを改めて感じました。また、これまでは MathJax の数式でしか LaTeX 環境に触れたことが無かったのですが、今回の TeX Live のインストールを期に、ほんの少しですが LaTeX の世界について知ることができました。もっと LaTeX コマンドを使いこなせるようになれば活用方法が広がりそうです。
参考:
Pandocの紹介記事
TeX Liveの解説
Pandocの--listings
オプション設定ファイルの使い方
- Pandoc: Markdown to PDF, without cutting off code block lines that are too long - TeX - LaTeX Stack Exchange
- listings.sty: LaTeX パッケージ
lstlisting 環境の詳細は The Listings Package listings.pdf
に書かれています。
Pandoc には他にも多くの機能があります、興味を持った方はユーザーズガイドを読んでみてください。
本家ユーザーズガイド
日本語ユーザーズガイド
0 件のコメント :
コメントを投稿