org-mode→HTML変換をする3つの方法

org-modeはHTMLを生成するツールになる

久々に、みんな大好きorg-modeのお話です。 orgファイルからHTMLに変換する方法を紹介します。

org-modeは、いろいろな機能を持っています。 事実上Emacsの多機能ワープロという位置付けです。 拙著『Emacsテクニックバイブル 〜作業効率をカイゼンする200の技〜』 でも1章をまるごとorg-modeに費やすほどです。

org-modeテキストは、読み書きしやすいという特徴があります。 なんといっても、アウトラインから文章を作成することができます。 見出しやリストが簡単に記述できるのが嬉しいです。

アウトラインを考えて文章を書くと、よい文章が書けるようになります。 アウトラインの重要性は 『文章術』という本 でも言われています。 そして、アウトラインから直接文章作成できるのがorg-modeです。 よって、org-modeはよい文章を書くためのギプスと言えることでしょう。

org-modeは、いろいろなフォーマットに変換できます。 最も変換するであろうフォーマットはおそらくHTMLです。 ここではorgファイルからHTMLに変換する3つの方法を紹介します。

Emacsの中でorg→HTML変換する

Emacsの中でorgファイルからHTMLに変換するのは簡単です。 C-c C-e (org-export)で、以下のように変換メニューが出てくるので、選択すれば対応するフォーマットに出力してくれます。


[t] insert the export option template
[v] limit export to visible part of outline tree
[1] only export the current subtree
[SPC] publish enclosing subtree (with LaTeX_CLASS or EXPORT_FILE_NAME prop)

[a/n/u] export as ASCII/Latin-1/UTF-8 [A/N/U] to temporary buffer

[h] export as HTML [H] to temporary buffer [R] export region
[b] export as HTML and open in browser

[l] export as LaTeX [L] to temporary buffer
[p] export as LaTeX and process to PDF [d] ... and open PDF file

[D] export as DocBook [V] export as DocBook, process to PDF, and open

[j] export as TaskJuggler [J] ... and open

[m] export as Freemind mind map
[x] export as XOXO
[g] export using Wes Hardaker's generic exporter

[i] export current file as iCalendar file
[I] export all agenda files as iCalendar files [c] ...as one combined file

[F] publish current file [P] publish current project
[X] publish a project... [E] publish every projects

HTMLに変換するには[h]または[b]を選びます。 つまり、C-c C-e hでHTMLに変換できます。 C-c C-e bは変換後、結果をブラウザで見ることができます。

transient-mark-modeでリージョンが指定してある場合は、その部分のみ変換します。 全体を変換したいのではなく、特定の部位の変換結果のみを見たい場合に便利です。

しかし、変換処理はとても遅く、変換中は待たされる欠点があります。 大きい文章の変換にはかなり待たされます。 そこで、Emacsの中でもバックグラウンドで変換できるようにする設定があります。 デフォルトでは無効なので、以下の行を.emacsに加えます。


(setq org-export-run-in-background t)

一方、これを有効にすれば、C-c C-e bでブラウザを呼び出してくれなくなる欠点があります。 変換対象が小さいorgファイル中心ならば、上の設定はおすすめできません。 大きいorgファイルに対してのみファイルローカル変数で有効にするべきです。 それには、orgファイルの先頭に上の行を加えます。


# -*- org-export-run-in-background: t -*-

実際、『Emacsテクニックバイブル 〜作業効率をカイゼンする200の技〜』の原稿は1つのorgファイルでした。 上記の方法でHTMLに変換して編集者に提出しました。

コマンドラインでorg→HTML変換する

Emacsの中で変換して、ブラウザで見るのはほとんどのケースで便利です。 しかし、それでは不十分なケースもあります。 たとえば、複数のファイルを変換するなら一括でやりたいものです。 変換したHTMLに対してさらになんらかの処理する場合もあります。

そこで、コマンドラインからorg→HTML変換したくなります。 これには、バッチモードでorg-export-as-html-batchを呼び出します。 バッチモードとは、Emacsの画面を表示せず、Emacs Lispで処理し終わるとすぐにEmacsを終了させるモードです。

バッチモードはコマンドラインがとても長くなるのでシェルスクリプトを作成しました。 ダウンロードしたら、場合に応じてスクリプトを修正します。 もちろんPATHの通ったディレクトリに置いて実行許可を付けておいてください。

org2html-batchスクリプト

org2html-batchの引数に1つ以上のorgファイルを指定します。 orgファイルと同じディレクトリにHTMLが生成されます。

デフォルトでは~/.org2html-batch.elでカスタマイズできるようにしています。 処理直前に読み込むので適当にオプション変数を指定しておけばよいです。


$ org2html-batch /tmp/a.org
OVERVIEW
Exporting...
org-babel-exp processing...
Position saved to mark ring, go back with C-c &.
Fontifying *temp*...
Fontifying *temp*... (syntactically...)
Fontifying *temp*... (regexps...)
Fontifying *temp*... (regexps....)
Fontifying *temp*... (regexps.....)
Fontifying *temp*... (regexps......)
Fontifying *temp*... (regexps.......)
Fontifying *temp*... (regexps........)
Fontifying *temp*... (regexps.........)
Fontifying *temp*... (regexps..........)
Fontifying *temp*... (regexps...........)
Fontifying *temp*... (regexps............)
Fontifying *temp*... (regexps.............)
Fontifying *temp*... (regexps..............)
Fontifying *temp*... (regexps...............)
Exporting...
Saving file /tmp/a.html...
Wrote /tmp/a.html
HTML export done, pushed to kill ring and clipboard

org-rubyを使う

Emacsを使わないでorgファイルからHTMLに変換するorg-rubyというRubyスクリプトがあります。 Rubyをインストールしている環境ならば「gem install org-ruby」でorg-rubyをインストールします。 これも、orgファイルを引数に指定すれば変換してくれます。

ただ、中身を書き出すだけなので、ヘッダやフッタは各自指定する必要があります。

$ cat /tmp/b.org
* [emacs]たいとる
本文
** 0
*** あ
- 1
- 2
  - 2-1
  - 2-2
- 3

**** い
***** う
***** え
****** お
http://www.rubyist.net/~rubikitch/

[[http://www.rubyist.net/~rubikitch/]]

[[http://www.rubyist.net/~rubikitch/][my site]]
****** か
***** き
$ org-ruby /tmp/b.org
<h1 class="title">[emacs]たいとる</h1>
<p>本文</p>
<h2>0</h2>
<h3>あ</h3>
<ul>
  <li>1</li>
  <li>2</li>
  <ul>
    <li>2-1</li>
    <li>2-2</li>
  </ul>
  <li>3</li>
</ul>
<h4>い</h4>
<h5>う</h5>
<h5>え</h5>
<h6>お</h6>
<p>http://www.rubyist.net/~rubikitch/</p>
<p><a href="http://www.rubyist.net/~rubikitch/">http://www.rubyist.net/~rubikitch/</a></p>
<p><a href="http://www.rubyist.net/~rubikitch/">my site</a></p>
<h6>か</h6>
<h5>き</h5>