Kurtの部屋

Follow me on GitHub

<2025-03-13 Thu>

emacs calc への誘い

悲しいことがありまして

libreoffice のスプレッドシートで3年くらい計算していたものが、先日 開けなくなった。最近替えた古いPC でハードディスクが壊れたときに そのデータも壊れたのかわからないが、とにかくファイルが壊れてしまったのだ。 計算し直すしかないな、と思ったが、もうこんな思いはしたくないとどうしたものか と考えていたときに、 calc を知った。

calc の特徴

数式に値を代入するといった計算をするときに便利なツールで emacs 上で 動作します。

僕の場合は今まで電子回路の計算をスプレッドシートにやっていたのを emacsorg-mode + calc を使ってやることができました。 文書を書く+計算 ができるのがいいです。それにファイルは text データとなるため、 git で版管理したときに差分が見えるのも良いです。

使い方

org-mode + calc で計算と文書を書くことを両方行えます。 org-mode でバッファ内に文章と式を書いて、計算させたいときに calc のコマンドを実行して式を計算させます。式を calc に認識させるには、 式の前後に空行を入れたり、区切り文字を入力する必要があります。

式内で := は代入、 => は左辺を評価したものが右辺に出力されます。例えば

foo := 1

bar := foo * 4 =>

bar =>

は、評価後は、以下のようになります。

foo := 1

bar := foo 4 => 4

bar => 4

上で (Space) は * と同じ意味です(スカラーとベクトルの掛け算だと が意図通りに 動かなかったこともあるので稀に使い分けが必要です)。 calc が評価後に * に置き換えることがあります。

上記のような文書内に式を埋め込んで計算させるような使い方の場合、主要なコマンドは、

  • C-x * a: バッファ上の := or => を含む数式をactivate (embeded mode で登録)し、 => の右辺が適切にアップデートされるようにします
  • C-x * u: カーソル下の数式とそれが依存する数式を更新(評価)します
  • C-u n C-x * u (n は数値): バッファ内の active な => を含む数式を更新(評価)します

くらいでした。3つくらいならきっと記憶に留められると思います。

上が僕の使い方の概要ですが、実際に使うときは、うまく動かないなどのトラブルがよく起こるので、 calc のinfo を読んで学習したほうが良いです。

  • RPN (Reverse Polish notation) での計算、stack
  • 代数(algebra)形式の計算
  • embedded mode
  • Assignments in Embedded Mode (embedded mode での代入)

あたりをざっくり理解すればきっと使えます。RPN 形式での計算は基礎なので あまり使わなくても知っていたほうがいいと思います。 また、上の3つのコマンドは Assignments in Embedded mode の章で詳しく説明されています。

その他

式を計算してくれることにかなり感動したのですが、出した式をグラフにプロットさせたい と思うことがありました。 calc は、 gnuplot を使ってグラフ出力もできます。 ただ、その場合 embedded mode に入って stack を使ってグラフ出力させることになり、 使う機能と扱うコマンドが増えてきます。 また、出力するグラフのグリッドやX軸、Y軸のラベル設定、色など gnuplot 周りの設定 も普段 gnuplot を使わないのでなかなか面倒そうです。ということで、グラフの作成は calc で行わず、 libreoffice で行うことにしました。35才になると、一貫性とか、 整っていることよりも、学習コストとか、覚えやすいかとかを考慮してしまいます。

[Home]