Org-modeで表計算
Emacsが表計算ソフトに変身する魔法のlisp、 org-table
を紹介します。
org-modeの一部ですが、マイナーモードが用意されているため、org限定ではありません。
表で情報を整理したり、メモ的な表計算をしてみたり、手軽さが魅力です。さらに関数を使って複雑な計算を自動化できるポテンシャルの高さも素晴しい。
操作も簡単なので、Emacsユーザーであれば、覚えておいて損はありません。
org-table の hello,world!
まずは、超シンプルな表を作成してみましょう。
orgモードのバッファを開いて、 |
(縦線、パイプ)で始めて
と入力して、 return
を押すと・・・
ぴょんと幅が広くなって、表の断片に変化します。
つづけて、 world!
と入力して
return
を押せば、
文字の長さに応じて、幅も自動的に変更されました。
さらに適当に |
を追加して
return
や tab
を押せば、
大きな表に更新されました。
Emacsのいつもの要領で、 |
を追加・削除したり、テキスト編集しつつ、時々 return
や tab
などを押していれば、表は自動で整形されていきます。まるで粘土をこねるように表をつくる感覚です。
return
や tab
でカーソルは表内を移動させることができるし、行末にくれば、新しい行が追加されるという気軽さ。不要な行は、テキストとしてkillすればいいだけ。
Emacsに慣れた人なら、すぐに表が作成できそうです。
簡単な集計
ここで簡単な計算をしてみましょう。
まずは次のような適当に数字を入力します。
2列目内の適当な位置へカーソルを移動させて、 C-c +
と押せば、エコーエリアに合計の 384 と表示されるはずです。
そのままYank C-y
すれば、合計の 384
を貼り付けることもできます。
ちょっとした計算にちょうどいいです。
ただし、この方法では、金額が変っても自動で再計算してくれませんが・・・。(自動化は後半で説明します)
これを知っているだけでもorg-tableの使い道が広がります。
もちろん、便利なショートカットもたくさん用意されていて、例えば、
M-↑
M-↓
行を移動M-←
M-→
列を移動M-S-←
列を削除M-S-→
列を挿入M-S-↑
行を削除M-S-↓
行を挿入
表をぐりぐり自由にいじることができます。
もっと表計算らしくする
それではもっと表計算らしくいきましょう。
例えば、こんな表を作成してみます。
一行目にカーソルを移動させて、 C-c -
を押下します。
横罫線が挿入されました。横線だからマイナス記号。
では、表を埋めてみましょう。
実際に操作してもらえば、わかると思いますが、カーソルが移動すると自動的にフォーマットされて 数値は右寄せ、テキストは左寄になります。
この表では、あえて金額欄を空けておきましたので、次に自動で計算するようにします。
表を参照する記法
・・・と、その前に。
Excelのような表計算ソフトでは、 列をABCDE..、行を12345..、セルをA1、という記法で関数などから参照することができますよね。
それと似たような仕組みがorg-tableにもあるんです。
org-tableでは、列は$1,$2,$3..、 行は@1,@2,@3..、セルは@1$1 として表記します。
ちなみにorg-tableではセルのことをフィールドと呼びますので、以降はフィールドと表記します。
ここで、org-table の親切機能を紹介します。
表にカーソルを移動させて、 C-c }
を押してみてください。
列や行の番号が表示されました。わかりにくいときは、この機能を使ってみてください。
C-c }
を押すたびに表示・非表示が切り替わります。
列の関数を使う
それでは、単価と数量を掛け合せて、金額を計算してみましょう。
カーソルを2行目、金額の列へ移動させて、 C-c =
と押してください。
エコーエリアが次のように入力待ちになり、関数を入力できます。 #+BEリアGIN_QUOTE Column formula $4=
ここで
Column formula $4= $2*$3
$2*$3
と入力します。 単価の列を表す $2
と 数量を表わす $3
を掛け合せています。 シンプルですね。
return
を押下で 金額が挿入されました!
同時に表の下に #+TBLFM:
が追記されています。 ご覧の通り、さきほど入力した式が、ここに関数として記録されていますね。(直接この行を編集してもOK。)
さて、一行目は金額が入力されましたが、残りの行はまだでした。
そこで、 C-u C-c C-c
と押してください。
すると、 全ての行が計算されました。
単価や数値を変更したら、その都度、 C-u C-c C-c
です。
フィールドの関数を使う
さらに、金額の合計を自動で計算してみましょう。
まずは次のような合計の行を追加します。
次にカーソルを合計金額のフィールドへ移動させて、 C-u C-c =
と押下すると、次のようなプロンプトが表示されます。
Field formula @5$4=
金額の関数のときは、列が対象だったのに対して、フィールドを対象とした関数です。
ここでは次のように入力します。
Field formula @5$4=vsum(@<<..@>>)
return
を押すと、
合計金額が入力されました。
ここで入力した vsum(@<<..@>>)
について簡単に説明しておきます。
vsum
EmacsのCalcパッケージの関数のひとつです。合計。@<<
先頭行から2番目を表わす参照 (先頭は@<
)@>>
末尾から2番目を表わす参照 (末尾は@>
)..
は 範囲指定
つまり、2行目から4行目の値をvsum関数に渡しています。
org-tableは、Calcパッケージと連携しています。 フィールドや関数には、vmax,vmin,round,floor,ceilなどCalcの関数や 2*3/4
のような計算式を書くことができます。
あとは品目を増やしたり、金額なとを修正する度に、 C-u C-c C-c
を押下すれば、再計算されます。
マイナーモードとして使う
最初に書きましたが、org-tableはorgモード以外でも利用できます。
バッファ内で次を実行するか
M-x orgtbl-mode
ファイルの先頭に
-*- mode: orgtbl; -*-
を追加しておけば、OK
あとは普通にorg-tableが使えるようになります。 (微妙に挙動が違うところがありますが)
さいごに
以上、基本的な使いかたを説明してみました。
計算の機能については、基本的にCalcパッケージが担っていますので、さらに使いこなすためには、Calcも知る必要があります。条件式やLispコードさえ書けるので、表計算ソフトとしての可能性は限りないですが、とてもじゃないが私には使いこなせない予感・・。
説明していない機能がありますので、それはまた次の機会に。
ではまたねー。
動作確認の環境
- Org-mode version 8.3.6
- GNU Emacs 25.1.50.1
- OS X 10.11.6