Emacs の org-mode は表計算もできてしまう


# この記事で得られること

-   org-mode のテーブル (以後 org-table) から和を計算し、行や列に自動記入する方法
-   org-table から和を計算するために必要な最小限の記号・キーバインド
-   org-table で特定の field の位置を示す記号を覚えられない人に送る便利 elisp


## この記事を基本として今後学べばできるようになること

-   org-table を作成・集計する上でより便利なコマンドやキーバインド
-   平均、最大最小、分散、標準偏差といった統計的な集計
-   SQL の group by のような集計を org-table に対して行う方法
-   ASCII 文字を利用したグラフ化
-   Gnuplot 連携によるグラフ化


# はじめに

2014 と 2015 の Emacs Advent Calendar で org-mode について書きました。

-   [TODO リストとメモ書きにだけ Emacs を使ってみませんか？](http://qiita.com/akisute3@github/items/8e45d97abc2d4fce8780)
-   [Emacs の org-mode でスケジュール管理をしよう！](http://qiita.com/akisute3@github/items/821ea2b1e20f575c222f)

読んでくださった人はいるでしょうか？org-mode 大好きな私が、org-mode という偉大で変態なツールを少しでも多くの人に知ってもらいたくて書いている、私の Emacs Advent Calendar の org-mode シリーズも今年で 3 回目です。過去の記事には、私の記事が Emacs 使用のきっかけになったというコメントも頂けていて本当に嬉しいです。

今回は一昨年の宣言どおり org-mode の表計算について紹介したいと思います。


## 動作環境

スクリーンショットでは [gnupack](https://ja.osdn.net/projects/gnupack/) の Emacs を使用しています。ダウンロードしたら exe ファイルを実行して解凍し、フォルダ直下の `startup_emacs.exe` を実行してください。

-   gnupack_basic-13.06-2015.11.08
    -   Emacs 24.5.1
    -   org-mode 8.2.10


# org-mode で簡単な表計算

とにもかくにも、org-mode で表計算をするためには、計算元となるテーブルが必要になります。

見出しと数値で適当に表を作ります。

```org
| 商品         | 9 月 | 10月 | 11 月 | 12 月 | 合計 |
|--------------+------+------+-------+-------+------|
| ボールペン   |  213 |  341 |   195 |    80 |      |
| シャープペン |  181 |  247 |   119 |    63 |      |
| えんぴつ     |   32 |   78 |   121 |    30 |      |
| 消しゴム     |   87 |  130 |   117 |    73 |      |
| コンパス     |   16 |   13 |    28 |    10 |      |
|--------------+------+------+-------+-------+------|
| 合計         |      |      |       |       |      |
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/1637/903dcbc5-95d6-4008-fae0-c4ce6eac2e91.png)

## フィールドの指定方法

表計算を行うためには、行や列を指定できる必要があります。

org-table では行や列を指定する方法がいくつかありますが、まずは最低限以下のものだけ覚えればいいです。

| 場所            | 記法     | 例                                       |
|-----------------|----------|------------------------------------------|
| 行              | @n       | @2 (2 行目)                              |
| 列              | $n       | $3 (3 列目)                              |
| セル            | @m$n     | @2$3 (2 行目の 3 列目)                   |

### フィールドをミニバッファに常に表示

org-table 上で `C-c C-}` とすれば行と列の数字を見ることができます。

が、「行の記号わからねえ！」「行と列どっち先書くの？」「そもそも行と列の数字見るキーどれだっけ…」となります (私が)。

そこで、いつでも意識しなくても行と列の表記方法がわかる方法を導入してみましょう。

それには `org-eldoc` を使用します。インストールの詳しい方法は以下を参考にしてください。

<http://emacs.rubikitch.com/org-eldoc/>

.emacs に以下を記述すれば準備は OK です。

```elisp
(require 'org-eldoc)

(defadvice org-eldoc-documentation-function (around add-field-info activate)
  (or
   (ignore-errors (and (not (org-at-table-hline-p)) (org-table-field-info nil)))
   ad-do-it))

(add-hook 'org-mode-hook 'eldoc-mode)

(eldoc-add-command-completions
 "org-table-next-" "org-table-previous" "org-cycle")
```

org-table にカーソルを合わせると、エコーエリアにセルの指定方法が表示されます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/1637/3f8c21ac-fbd8-4b5e-f057-bfbcc1714fec.png)

これでもう忘れる心配はありませんね。


## 集計

最初の段階では、集計のために覚えることは以下の 3 点です。

-   `C-c =` で行の計算式を記述する
-   複数の計算式は `::` で繋げる
-   `C-c C-c` で記述した計算式を表全体に適用する

では、最初に作った表の合計の部分を埋めていきましょう。

表の一番右の列で `C-c =` を入力すると `Column formulas $6=` のように、6 列目を計算する計算式の入力画面がミニバッファに表示されます。

ここでは、6 列目に 2～5 列目の合計値を計算したいので、ミニバッファには `$2+$3+$4+$5` と入力します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/1637/12a22008-7b62-5334-b5e9-99a64073cfcb.png)

すると、現在のカーソル位置に、その行の 2～5 列目の合計値が出力されます。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/1637/03251966-b993-6d0c-8dcb-3b025fe9293f.png)

これで 2～5 列目の和の計算は完了です。計算式の入力直後はカーソルがあった部分しか出力されませんが、計算式では別に行を指定しているわけではなく単に「2 列目 + 3 列目 + 4 列目 + 5 列目」と記述しているだけなので、この式だけで全列が計算できます。

計算式入力後、テーブルの下に `#+TBLFM: $6=$2+$3+$4+$5` という行が追記されたのがわかると思います。この式が表に関連付いている計算式です。表全体にこの計算式を適用する場合は、計算式の上で `C-c C-c` を入力してください。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/1637/66da82bb-c5b0-54c8-8a7a-86b878275bcf.png)

これで表の列合計が完成しました。

続いて行の合計です。行の合計には `C-c =` のようなコマンドが用意されていないため、`#+TBLFM:` の内容を手作業で編集しましょう。

行は `@` で表現するので、7 行目に 2～6 行目の和を出力するための計算式は `@7=@2+@3+@4+@5+@6` ですね。複数の計算式は `::` で接続してください。

記述し終わったら再度 `C-c C-c` を入力しましょう。これで表全体が完成しました！ (実は一番左の列が `#ERROR` となってしまうんですが、そこは気にしないで手書きで修正しちゃって下さい)

![6.png](https://qiita-image-store.s3.amazonaws.com/0/1637/0fa74be4-65f6-a72a-cc7c-99c6fd9fdfee.png)

org-mode には表計算のための便利な記法や関数が大量にありますが、ここに書いたことさえできれば結構応用がききます。 `$6=($2+$3)\*($4-$5)` のように四則演算が自由にできますし、 `$6=($2+$3+$4+$5)/4` とすれば平均も計算できます。

巨大な表の全列を計算する必要があったり、表の大きさが頻繁に変更されるような場合には、手作業で全行/全列を順番に足す計算式を書くのが大変なので、そういうときがきたら org-mode の表計算の便利機能を調べてみるといいでしょう。


# まとめ

org-mode で表計算を行う方法について紹介しました。今回は本当に基本的なことしか説明しませんでしたが、他にも機能は山ほどあります。

-   vcount, vsum, vmax, vgmean, vvar, vmedian といった統計的な集計を行う関数
-   SQL のようなグループ化を行う [orgtbl-aggregate](https://github.com/tbanel/orgaggregate)
-   グラフ化を行う [org-plot](http://orgmode.org/worg/org-tutorials/org-plot.html)

とはいえ、org-mode が持つありとあらゆる機能を覚えて使いこなすのはかなり大変です。まずは自分にとって優先度が高い最低限の機能から使い始めて、徐々に便利な機能に手を出していくのがオススメです。