org-modeで,コードハイライトされたHTMLを出力する方法のメモです.

とりあえず,package.elかなにかを使って

  • org
  • htmlize

をインストールします.package.elを使うときは,MELPAリポジトリを追加しておきましょう.

(when (require 'package nil t)
  ;; パッケージリポジトリにMelpaを追加
  (add-to-list 'package-archives
               '("melpa" . "http://melpa.milkbox.net/packages/") t))

つづいて,init.elかどこかに以下を記述します.

(when (require 'org-install nil t)
  ;; HTML出力したときコードハイライトcssを分離する
  ;; デフォルト(inline-css)だとcssがインラインに埋め込まれる
  (setq org-export-htmlize-output-type 'css))

これで,キーワードがclass付けされたHTMLが出力されるはずです.class付けされただけでは色が付かないので,適当なCSSを用意する必要があります.

自分で書くのは大変なので,Emacsで M-x org-export-htmlize-generate-css を実行すると,そのとき定義されているfaceを反映したcssを自動で生成してくれます. M-x customize-themes でいい感じのテーマを選んでから,cssを生成するといいと思います.

ちなみに,この方法でCSSファイルを作るときに, Invalid face: font-lock-comment みたいなエラーに苦しめられました.この場合だと,font-lock-commentというfaceが定義されてないみたいで,font-lock-commentが使われているところを探し出して適当に修正してあげれば解決しました.

実際にやってみると,たとえばorg-modeで

#+BEGIN_SRC perl
  #!/usr/bin/env perl
  use strict;
  use warnings;

  while (<>) {
      unless (/^\p{InBasicLatin}*$/) {
          print "$.: $_";
      }
  }
#+END_SRC

と書いて,HTMLに出力すると以下のようになります.生成したcssをくっつけるのを忘れずに.

#!/usr/bin/env perl
use strict;
use warnings;

while (<>) {
    unless (/^\p{InBasicLatin}*$/) {
        print "$.: $_";
    }
}

このHTMLを org2blog.el でそのままWordPressに送ってやれば, SyntaxHighlighter などのプラグインを導入しなくても,色のついたソースコードを投稿できます.(cssはどこかに書いておく必要があります.)

追記(2013.10.2.)

Org-modeのバージョン8.xでは,CSSの設定変数の名前が変わっています.CSSを分離するためには,以下のようにする必要があります.

(setq org-html-htmlize-output-type 'css)