Emacs Org-mode の覚え書き
目次
1. はじめに
Emacs のOrg-modeで私的なHTML公開文書を書くようになったのですが、これどう 書くんだっけ?とか、バインドなんだっけ?と忘れる事があるので、その覚え書きと して作成しました。
2. Org-modeについて
2.1. 公式サイト
Org-modeの公式サイトは以下です。
http://orgmode.org/ja/index.html
アウトラインプロセッサ、TODO管理、表計算など、さまざまな用途に使用できます。 2026年1月時点で。Emacs-30.2には Org-modeの9.7.11が標準で含まれています。
かつて8.2.10の裏技(バグとも言う)を利用したテーブルの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に埋め込む事ができます。
- LaTeXを使える環境にしておきます。CygwinではTeX Liveパッケージを インストールすればOKだと思います。
- 「#+OPTIONS: tex:divpng」を.org文書の先頭の方に記述しておきます。これが無いと インライン画像が生成されません。
- .orgファイルの文中にLaTeX記述を行います。
- 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されます。
3.2. gnuplotを使用してグラフをインライン画像でHTMLに埋め込む
Org-modeのテーブル編集は非常に強力です。しかし、値ではなくグラフで表示したい場合が 少なからずあります。そんな時にgnuplot を用いて ビジュアライズする方法です。
- gnuplotを使える環境にしておきます。Cygwinではgnuplotパッケージを インストールすればOKだと思います。
- .emacs(オールドスタイルですみません)に
「
(org-babel-do-load-languages 'org-babel-load-languages '((gnuplot . t)))」 を追加しておきます。 - テーブルを参照してプロットする gnuplotコードブロックを記述します。
- 「#+RESULTS:」キーワードで生成される結果画像を埋め込みます。
- グラフの元となるテーブルを書きます。ポイントとなるのは テーブル自体を適当な見出しの中に記述するのですが、「:noexport:」を追加してHTMLにExportしないようにしています。
例えば、次のようなコードブロックとデータを書けば、
#+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:
[[./gnuplot_sample1.png]]
*** gnuplotデータ :noexport:
#+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 |
以下のようなグラフ画像のみが生成されます。
3.3. R言語を使用してグラフをインライン画像でHTMLに埋め込む
統計解析プログラミング言語 R を利用して グラフ画像を描く事ができます。 gnuplotの例と同じくorgのテーブルを参照してグラフにビジュアライズする方法です。
- Rを使える環境にしておきます。CygwinではRパッケージを インストールすればOKだと思います。
- .emacs(オールドスタイルですみません)に
「
(org-babel-do-load-languages 'org-babel-load-languages '((R . t)))」 を追加しておきます。 - テーブルを参照してプロットする Rコードブロックを記述します。
- 生成される結果画像ファイルへの参照を埋め込みます。
- グラフの元となるテーブルを書きます。ポイントとなるのは テーブル自体を適当な見出しの中に記述するのですが、「:noexport:」を追加してHTMLにexportしないようにしています。
例えば、次のようなコードブロックとデータを書けば、
#+BEGIN_SRC R :var data=R_data :file r_sample1.png :width 640 :height 400 :results graphics :exports results
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
[[./r_sample1.png]]
*** Rデータ :noexport:
#+NAME: R_data
| 15283 | a |
| 6072 | b |
| 205 | c |
以下のようなグラフ画像のみが生成されます。
3.4. Graphviz のdotを使用してグラフをインライン画像でHTMLに埋め込む
Graphviz(Graph Visualization Software) を利用して状態遷移図を 描く事ができます。
- dotコマンドを使える環境にしておきます。CygwinではGraphvizパッケージを インストールすればOKだと思います。
- .emacs(オールドスタイルですみません)に
「
(org-babel-do-load-languages 'org-babel-load-languages '((dot . t)))」 を追加しておきます。 - .orgファイルの文中にdotコードブロックを記述します。
- 「#+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:
[[./dot_sample1.png]]
以下のような画像が生成されます。
3.5. PlantUMLを使用してシーケンス図などをインライン画像でHTMLに埋め込む
PlantUML を利用してシーケンス図などを描く事ができます。
- ダウンロードページより「plantuml.jar」をダウンロードし、任意のディレクトリに置きます 。
- .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に置いた場合」 を追加しておきます。 - .orgファイルの文中にplantumlコードブロックを記述します。
- 「#+RESULTS:」キーワードで生成した結果画像を埋め込みます。
(留意点: Cygwinではファイルパス表現の問題があり、org-modeへのパッチが必要です。
--- orig/emacs-30.2/lisp/org/ob-plantuml.el 2025-01-04 20:05:29.000000000 +0900
+++ emacs-30.2/lisp/org/ob-plantuml.el 2025-08-15 00:23:32.737529300 +0900
@@ -130,8 +130,12 @@
(error "Could not find plantuml.jar at %s" org-plantuml-jar-path))
(t `(,java
"-jar"
- ,(shell-quote-argument (expand-file-name org-plantuml-jar-path))
- ,@org-plantuml-args))))
+ ,(if (eq system-type 'cygwin)
+ (replace-regexp-in-string
+ "[\\]" "/"
+ (cygwin-convert-file-name-to-windows org-plantuml-jar-path))
+ (shell-quote-argument (expand-file-name org-plantuml-jar-path)))
+ ,@org-plantuml-args))))
(full-body (org-babel-plantuml-make-body body params))
(cmd (mapconcat #'identity
(append
オリジナルでは javaコマンドへの引数をCygwinパス(例えば /usr/local/bin/plantuml.jar)で渡している為、 jarファイルが見つけられなくてエラーになります。cygwin-convert-file-name-to-windowsという関数を 使用して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:
[[./plantuml_sample1.png]]
以下のような画像が生成されます。
4. おわりに
本文書は自分用に忘れそうな分だけメモるつもりで作成しました。 そんな訳であまり参考にならないかも知れませんが、もし役に立つことがあれば幸いです。
本ページの元orgファイルを置いておきます(org_mode_memo.org.xz)