Emacs Org-mode の覚え書き

目次

1 はじめに

Emacs のOrg-modeで私的なHTML公開文書を書くようになったのですが、これどう 書くんだっけ?とか、バインドなんだっけ?と忘れる事があるので、その覚え書きと して作成しました。

2 Org-modeについて

2.1 公式サイト

Org-modeの公式サイトは以下です。

http://orgmode.org/ja/index.html

アウトラインプロセッサ、TODO管理、表計算など、さまざまな用途に使用できます。 更新頻度が高く、2014年10月時点のバージョンは8.2.10です。Emacs-24.4には Org-modeの8.2.10が標準で含まれています。

7.x.xから8.2.xのバージョンアップで、いくつかキーワード等の変更が行われました (俗に言う破壊的変更という奴です)。本文書では、8.2.10をベースに話を進めます。 もしかすると7.x.x以前のバージョンではうまく動かないかも知れません。

2019/4/20 時点で 9.2.3が最新版となっていますが、本ページのorg記述では裏技(バグとも言う) を利用したテーブルのexportコントロールを行っている都合で、8.2.10を使用して htmlエクスポートを行っています。

2.2 参考サイト

以下のサイトはいつも参考にしていました。

Org-mode による HTML 文書作成入門(2019/03/31でリンク切れ)

TANEが公開文書をOrg-mode化しようというきっかけになったサイトです。 大変よくまとめられていたのですが、2019/03/31をもってYahoo!ジオシティーズ終了に 伴い参照不可能となったようです。残念です。

本文書では、こちらのサイトに載っていなかった点について記してみようと思います。

3 外部プログラムによるインライン画像の生成

Org-modeでは、HTML変換時にLaTeXやgnuplotなどの外部プログラムを実行して インライン画像表示することができます。

元のデータをorgファイルに含めてグラフや式の画像を生成できる為、 一つのorgファイルに異なるソフトのデータを統合することができ、 文書のメンテナンス性が上がります。 また、コマンドライン入力が面倒臭いといった場合に、各種外部プログラムの フロントエンドとしてOrg-modeを利用するのも良いと思います。

本項はCygwinのEmacsおよび外部プログラムで確認しています。 LinuxなどのUNIX系OSでも同じように使えると思いますが、Windowsの MinGWでビルドされたEmacsでは、外部プログラムの実行が困難な場合、 うまく動作しない事があるかも知れません。

3.1 LaTeX式をインライン画像でHTMLに埋め込む

LaTeXで記述した式をインライン画像でHTMLに埋め込む事ができます。

  1. LaTeXを使える環境にしておきます。CygwinではTeX Liveパッケージを インストールすればOKだと思います。
  2. 「#+OPTIONS: tex:divpng」を.org文書の先頭の方に記述しておきます。これが無いと インライン画像が生成されません。
  3. .orgファイルの文中にLaTeX記述を行います。
  4. C-c,C-x,C-l で プリビュー表示できます。C-c,C-cで元の式表示にもどります。

例えば、次のようなコードブロックを書けば、

#+BEGIN_CENTER
\begin{eqnarray*}
  \mbox{\LARGE $ \displaystyle V = 2 \pi \int_0^r y^2 dx $ }
\end{eqnarray*}
#+END_CENTER

以下のような画像にExportされます。

\begin{eqnarray*}
  \mbox{\LARGE $ \displaystyle V = 2 \pi \int_0^r y^2 dx $ }
\end{eqnarray*}

3.2 gnuplotを使用してグラフをインライン画像でHTMLに埋め込む

Org-modeのテーブル編集は非常に強力です。しかし、値ではなくグラフで表示したい場合が 少なからずあります。そんな時にgnuplot を用いて ビジュアライズする方法です。

  1. gnuplotを使える環境にしておきます。Cygwinではgnuplotパッケージを インストールすればOKだと思います。
  2. .emacs(オールドスタイルですみません)に 「 (org-babel-do-load-languages 'org-babel-load-languages '((gnuplot . t))) 」 を追加しておきます。
  3. .orgファイルの文中にグラフの元となるテーブルを書きます。ポイントとなるのは テーブル自体をorgコードブロックとして定義するという点です。 orgコードブロックとして定義する事で、HTMLとしてexportするか否かをコントロール できます。 (注意点:org-mode 8.3~8.3.2(8.3.3以降は不明)ではこの方法を使ってテーブルのexportをコントロールできなくなっています。2015.10.04時点で代替方法はありません。)
  4. テーブルを参照してプロットする gnuplotコードブロックを続けて記述します。
  5. 「#+RESULTS:」キーワードで生成した結果画像を埋め込みます。

例えば、次のようなコードブロックを書けば、

#+BEGIN_SRC org :exports none
#+NAME: data-table
 |   x |      y1 |         y2 |
 |-----+---------+------------|
 | 0.1 |   0.425 |      0.375 |
 | 0.2 |  0.3125 |     0.3375 |
 | 0.3 | 0.24999 | 0.28333338 |
 | 0.4 |   0.275 |    0.28125 |
 | 0.5 |    0.26 |       0.27 |
 | 0.6 | 0.25833 | 0.24999993 |
 | 0.7 | 0.24642 | 0.23928553 |
 | 0.8 | 0.23125 |     0.2375 |
 | 0.9 | 0.23333 |  0.2333332 |
 |   1 |  0.2225 |       0.22 |
#+END_SRC

#+BEGIN_SRC gnuplot :var data=data-table :exports results :file gnuplot_sample1.png
set title "Putting it All Together"

set term png size 640,400

set xlabel "X"
set xrange [0:1]
set xtics 0,0.1,1

set ylabel "Y"
set yrange [0.2:0.5]
set ytics 0.2,0.05,0.5

plot data u 1:2 w  p lw 2 title 'x vs. y1', \
     data u 1:3 w lp lw 1 title 'x vx. y2'
#+END_SRC

#+RESULTS:
[[file:gnuplot_sample1.png]]

以下のようなグラフ画像が出力されます。

gnuplot_sample1.png

3.3 R言語を使用してグラフをインライン画像でHTMLに埋め込む

統計解析プログラミング言語 R を利用して グラフ画像を描く事ができます。 gnuplotの例と同じくorgのテーブルを参照してグラフにビジュアライズする方法です。

  1. Rを使える環境にしておきます。CygwinではRパッケージを インストールすればOKだと思います。
  2. .emacs(オールドスタイルですみません)に 「 (org-babel-do-load-languages 'org-babel-load-languages '((R . t))) 」 を追加しておきます。
  3. .orgファイルの文中にグラフの元となるテーブルを書きます。 (注意点:org-mode 8.3~8.3.2(8.3.3以降は不明)では例のような方法を使ってテーブルのexportをコントロールできなくなっています。2015.10.04時点で代替方法はありません。)
  4. テーブルを参照してプロットする Rコードブロックを続けて記述します。
  5. 「#+RESULTS:」キーワードで生成した結果画像を埋め込みます。

例えば、次のようなコードブロックを書けば、

#+BEGIN_SRC org :exports none
#+NAME: R_data
| 15283 | a |
|  6072 | b |
|   205 | c |
#+END_SRC

#+BEGIN_SRC R :var data=R_data :file r_sample1.png :width 640 :height 400 :results graphics :exports results :eval query-export
split.screen(c(1,2))
screen(1);pie(data[,1],labels=data[,2], clockwise=TRUE)
screen(2);barplot(data[,1],names.arg=data[,2])
#+END_SRC

#+RESULTS:
[[file:r_sample1.png]]

以下のような画像が生成されます。

r_sample1.png

3.4 Graphviz のdotを使用してグラフをインライン画像でHTMLに埋め込む

Graphviz(Graph Visualization Software) を利用して状態遷移図を 描く事ができます。

  1. dotコマンドを使える環境にしておきます。CygwinではGraphvizパッケージを インストールすればOKだと思います。
  2. .emacs(オールドスタイルですみません)に 「 (org-babel-do-load-languages 'org-babel-load-languages '((dot . t))) 」 を追加しておきます。
  3. .orgファイルの文中にdotコードブロックを記述します。
  4. 「#+RESULTS:」キーワードで生成した結果画像を埋め込みます。

(留意点:Cygwinでは生成した画像の文字が化ける場合があります。

ln -s /cygdrive/c/Windows/Fonts ~/.fonts

としてhomeディレクトリ直下に.fontsという名前でWindowsフォントディレクトリへのシンボリックリンクを 張ることで対応できるようです)

例えば、次のようなコードブロックを書けば、

#+BEGIN_SRC dot :file dot_sample1.png :cmdline -Kcirco -Tpng :eval query-export
digraph {
  graph [label="糸井ステートマシン" fontname="Meiryo UI" fontsize=20]
  node [fontsize=24 style=filled,color=cyan]
  edge [fontname="MS Gothic" fontsize=10]
  寝る->食う [taillabel="十分寝た"];
  遊ぶ->食う [taillabel="腹へった"];
  食う->遊ぶ [taillabel="腹いっぱい"];
  遊ぶ->寝る [taillabel="遊びつかれた"];
  食う->食う;
  寝る->寝る;
  遊ぶ->遊ぶ;
}
#+END_SRC

#+RESULTS:
[[file:dot_sample1.png]]

以下のような画像が生成されます。

dot_sample1.png

3.5 PlantUMLを使用してシーケンス図などをインライン画像でHTMLに埋め込む

PlantUML を利用してシーケンス図などを描く事ができます。

  1. ダウンロードページより「plantuml.jar」をダウンロードし、任意のディレクトリに置きます 。
  2. .emacs(オールドスタイルですみません)に 「 (org-babel-do-load-languages 'org-babel-load-languages '((plantuml . t))) 」と 「 (setq org-plantuml-jar-path "/usr/local/bin/plantuml.jar") ;/usr/local/binに置いた場合 」 を追加しておきます。
  3. .orgファイルの文中にplantumlコードブロックを記述します。
  4. 「#+RESULTS:」キーワードで生成した結果画像を埋め込みます。

(留意点: Cygwinではファイルパス表現の問題があり、org-modeへのパッチが必要です。

--- ob-plantuml.el.orig 2014-01-08 15:10:31.000000000 +0900
+++ ob-plantuml.el      2015-10-04 03:20:43.240456700 +0900
@@ -58,8 +58,10 @@
         (cmd (if (string= "" org-plantuml-jar-path)
                  (error "`org-plantuml-jar-path' is not set")
                (concat "java " java " -jar "
-                       (shell-quote-argument
-                        (expand-file-name org-plantuml-jar-path))
+                       (if (eq system-type 'cygwin)
+                           (replace-regexp-in-string "[\\]" "/" (replace-regexp-in-string "[\n]" "" (shell-command-to-string (concat "cygpath " "-w " org-plantuml-jar-path))))
+                         (shell-quote-argument
+                          (expand-file-name org-plantuml-jar-path)))
                        (if (string= (file-name-extension out-file) "svg")
                            " -tsvg" "")
                        (if (string= (file-name-extension out-file) "eps")

オリジナルでは javaコマンドへの引数をCygwinパス(例えば /usr/local/bin/plantuml.jar)で渡している為、 jarファイルが見つけられなくてエラーになります。cygpathコマンドを使用してWindows形式のパスに変換する コードを追加しています。)

例えば、次のようなコードブロックを書けば、

#+BEGIN_SRC plantuml :file plantuml_sample1.png :cmdline -charset UTF-8
actor Foo1
boundary Foo2
control Foo3
entity Foo4
database Foo5
Foo1 -> Foo2 : To boundary
Foo1 -> Foo3 : To control
Foo1 -> Foo4 : To entity
Foo1 -> Foo5 : To database
#+END_SRC

#+RESULTS:
[[file:plantuml_sample1.png]]

以下のような画像が生成されます。

plantuml_sample1.png

4 おわりに

本文書は自分用に忘れそうな分だけメモるつもりで作成しました。 そんな訳であまり参考にならないかも知れませんが、もし役に立つことがあれば幸いです。

本ページの元orgファイルを置いておきます(org_mode_memo.org.xz)

5 履歴

  2014/11/03 : 初版。
  2015/10/04 : org-mode 8.3~8.3.2のテーブルのexportコントロールについて注意点を追記。
               画像生成に必要な org-babel-do-load-languagesへの設定を追記。
               Graphviz dot での文字化け対策について追記。
               PlantUMLの利用について項目を追加。
  2019/04/20 : リンク切れになっている箇所にコメント追記。

TOP PREV

著者: TANE

Emacs 26.2 (Org mode 8.2.10)