2012/01/06

orgで書き捨て その2

前回のwkhtmltopdf版は便利に使っているんだけど、いまいち出来上がるpdfが綺麗くない。ちゃんとスタイルシートを書けばいいんだろうけど、どうせ書き捨てなんでそこまでやる気もない。orgにはLaTeXの他にもdocbookからpdfにexportできるので、今度はこれを使ってみようかと。なんとなくハマリそうだったので、今までdocbookは避けてたんだけど…取り敢えず動くようになったんでメモ。

準備

外部のモロモロを事前に準備する必要がある。これはorg-export-docbookをcustomize-groupするとあらかた見当がつく。

  1. org-export-docbook-xslt-proc-command
  2. org-export-docbook-xsl-fo-command
  3. org-export-docbook-xslt-stylesheet

こんな感じ。まず、org-export-docbook-xslt-proc-commandはcygwinのxsltprocを使うことにした。あ、cygwinとgnupackさんのNTEmacsユーザーです、ワシは。cygwinでlibxml2とlibxsltをインストール。

次にorg-export-docbook-xsl-fo-commandだが、コイツはApache FOPを使うことに。ダウンロードして適当なところに置いておく(FOP_DIRとする)。

さらにorg-export-docbook-xslt-stylesheetですが、これもここから最新のdocbook-xsl-1.76.1というのをダウンロードして、適当なところに置いておく(DOCBOOK_XSL_DIRとする)。

テスト


ここで手動でpdfを生成してみる。まずhoge.orgをorg-export-as-docbookしてhoge.xmlを生成しておいて、

$ xsltproc --output hoge.fo $(DOCBOOK_XSL_DIR)/fo/docbook.xsl hoge.xml

$ $(FOP_DIR)/fop hoge.fo hoge.pdf

とやってみる。一応pdfができたのだけれど、日本語の文字がががががが…ぐぐるとfopに日本語フォントをしらせてやらんといかんみたい。

FOPに日本語フォントを

で、このあたりを参考に、MSゴシックとMS明朝のフォントメトリクスを抽出して、fopのuserconf.xmlを書く。ちなみに現在の版(fop-1.0)だと、特に指定しない場合はconfは読まないみたいなので、confフォルダにあるfop.xconfをuserconf.xmlにコピーして、フォントメトリクス部分を先のリンクのように変更。ただし、metrics-file、embed-fileはそれぞれmetrics-url、embed-urlに変更する必要があった。

これで再度手動でPDFを生成してみる。

$ $(FOP_DIR)/fop -c $(FOP_DIR)/conf/userconf.xml hoge.fo hoge.pdf

おー、でけたでた。日本語もちゃんと見えるじゃまいか。

全部まとめてemacsに設定

ここまでくるとあとは楽。先ほどのcustomize-groupで
  1. org-export-docbook-xslt-proc-command ⇒ $(CYGWIN_BIN)/xsltproc.exe --output %o %s %i
  2. org-export-docbook-xsl-fo-command ⇒ $(FOP_DIR)/fop.bat -c $(FOP_DIR)/conf/userconfig.xml %i %o
  3. org-export-docbook-xslt-stylesheet ⇒ $(DOCBOOK_XSL_DIR)/fo/docbook.xsl
と設定してやってM-x org-export-as-docbook-pdfっと。

あれ、エラーになる…

例によってパスに日本語が入ってるんで、うまく外部コマンドが動いてないっぽいんだけど、edebugで見てたらなんかちょっと変。パスに入っている日本語文字が、ご丁寧に一文字づつ\\でエスケープされてる。うーん……

org-export-as-docbook-pdfのソースを見たら、shell-commandに渡すパスをshell-quote-argumentでエスケープするようになってる。ちょっと悩んだけど、まあ悩んでいても仕方ないんで、org-export-as-docbook-pdfからよばれたらshell-quote-argumentは引数をそのまま返すようにdefadviceを2ケ書いてみた。これでワンストップでpdf生成までできるようになった。

で、感想

うーん綺麗なpdfだ。目次までついて。

えっ? orgのオプションでtoc:nilにしてあるんだけど? あれ? 

というわけで、ちゃんとしたドキュメント用には凄く良さげなんだけど、書き捨て用には使えないなぁ。
p.s.文字化けするのなんで?

2012/02/01追記

xsltprocに--stringparam generate.toc 0を追加したら、目次が生成されなくなりました。書き捨て用に使えるようになってしまったよ(笑)

0 コメント: