Category Archives: 未分類

2026-03-15 ,

org-modeの中でEmacs Calcを使う(主にインラインで)

Calcの埋め込みモード(Embedded Mode)の基礎

org-modeはLaTeXの表記がある程度そのまま使えますしCalcの埋め込みモードはLaTeXをサポートしているので何も設定しなくてもorg-modeからCalcの埋め込みモードはある程度使えます。

一番簡単なのは $ で囲むことでしょう。(もちろん他にも $$~$$\[~\]\(~\)\begin{equation}~\end{equation} 等の表記が使えます(参考: Embedded LaTeX)。空行も数式の区切りとして使えます)

例えば次のように書きます。

1~4を足すと $1+2+3+4$ になります。

$ の中で C-x * u (update)を押すと 1+2+3+4 が計算されて 10 に置き換わります。

1~4を足すと $10$ になります。

数式の部分は C-x * f (new formula)の後に 1+2+3+4 と入れても良いですし、その場合はその後RPN電卓のように 2 * で2倍にしたりといった操作ができます。 q でquit。式をバッファに入力してから C-x * e を押す方法もあります。ただこのあたりの専用モードに移る使い方はCalcの操作に慣れていないと難しいですね。幸い移らなくても C-x * u (update)は使えます。

これだけだったら埋め込みモードを使う必要性は少ないです。 C-x * q でQuick Calcを呼び出して計算して結果をyankすれば済む話です。

今度は次のように => を加えてから C-x * u (update)を押します。

$1+2+3+4=>$

すると今度は次のように計算結果が => の後に挿入されました。

$1 + 2 + 3 + 4 => 10$

変数を使うこともできます。次のように打ってから C-x * u (update)を押すと変数xに256が記録されます。

$x:=256$

そして同じバッファの別の場所で次のように入力して……

$x^2=>$

C-x * u (update)を押すと次のように変化します。

$x^2 => 65536$

この時、バッファ内の二つの数式 $ x:= 256$$x^2 => 65536$ はアクティブ(活性)なものとして、その位置が記録されています。

なので $x := 256$$x := 65536$ に変更して C-x * u (update)すると、 $x^2 => 65536$ の方も更新されて $x^2 => 4294967296$ に自動的に変化します!

バッファを閉じてしまうとこのアクティブ状態は失われてしまいますが、再度ファイルを開いて C-x * a (activate) を押すとバッファの中にある :==> が検索されてその周囲が有効な数式であればアクティブ化されます。

このように作られた数式部分をエクスポートするとどうなるでしょうか。 $ で囲まれた部分はorg-modeではLaTeX fragmentと呼ばれています(参考: LaTeX fragments)。なので数式のフォーマットで出力されることになります(例: x 2 = > 65536 )。他のLaTeX表記($$~$$\[~\]\(~\)\begin{equation}~\end{equation})でも同様です。唯一、空行で区切られた数式だけは通常の段落として出力されます。また、当然ですが数式がコメント(#)の後に書かれていれば出力されませんし、その他状況によっては特殊な出力になることもあるかもしれません。

数式のフォーマットで出力されるのは大仰だと感じることも多いでしょう。また、出力されるときは数式全体が出力されるので => より左を省いて結果だけを出力するようなこともできません。

そういった問題はorg-modeのマクロを使うとある程度解決できます。

設定

ここではマクロの定義の他により気軽に使えるように区切りのパターンもいくつか余分に追加しています。

  • {{{calc(x := 123)}}}{{{calc(2 x => 246)}}} のようなマクロを追加
  • 式の区切りパターンを追加
    • インラインコードブロック src_???{ ... }
    • マクロ {{{???( ... )}}}
    • ブロック #+begin ... #+end
    • 非ASCII文字(日本語が出てきたら数式ではないものとする)
;; マクロ {{{calc(式)}}} を定義する
;;   {{{calc(左辺=>結果)}}}       => 結果のみエクスポート
;;   {{{calc(変数:=右辺=>結果)}}} => 結果のみエクスポート
;;   {{{calc(変数:=右辺)}}}       => 右辺のみ (空にして => を必須にしても良いが)
;;   {{{calc(式)}}}               => 式のみ (評価結果にしても良いが)
(defun my-org-macro-calc (expr)
  (cond
   ((string-match "=> *" expr) ;; Include x := y + 3 => 20
    (substring expr (match-end 0)))
   ((string-match ":= *" expr)
    (substring expr (match-end 0)))
   (t expr)))

(setf (alist-get "calc" org-export-global-macros nil nil #'equal)
      "(eval (my-org-macro-calc $1))")

;; org-modeでのCalc式の区切りパターンを追加。
;; 新しいマクロ表記({{{calc()}}})の他に$や\[等の従来のものも一応残す。
(setf (alist-get 'org-mode calc-embedded-open-close-formula-alist)
      (list (concat
             "\\`\\|^\n\\|\\$\\$?\\|\\\\\\[\\|^\\\\begin[^{].*\n\\|^\\\\begin{.*[^x]}.*\n\\|\\\\("
             "\\|{{{[a-zA-Z][-a-zA-Z0-9_]*(" ;;マクロ
             "\\|\\<src_[^ \t\n[{]+\\(\\[[^]]*\\]\\)?{" ;;インラインソース
             "\\|^#\\+begin[_:][^\n]*\n" ;;ブロック
             "\\|[[:nonascii:]]:? ?" ;;ASCII以外(お好みで)
             )
            (concat
             "\\'\\|\n$\\|\\$\\$?\\|\\\\]\\|^\\\\end[^{].*\n\\|^\\\\end{.*[^x]}.*\n\\|\\\\)"
             "\\|)}}}" ;;マクロ
             "\\|}" ;;インラインソース
             "\\|^#\\+end[_:][^\n]*\n" ;;ブロック
             "\\| ?[[:nonascii:]]"
             )))
;; C-x * a (`calc-embedded-activate')で検索するパターンを追加
;; 設定しなくても := や => は検索するので必要なのかどうか分からないが一応
(setf (alist-get 'org-mode calc-embedded-announce-formula-alist)
      (concat
       "# Embed\n\\(# .*\n\\)*\\|"
       "{{{calc(.*?)}}}"))
;; d p (`calc-show-plain')を使ったときに出力されるコメントの構文
;; 一応他のメジャーモードの時と同じように設定しておく
(setf (alist-get 'org-mode calc-embedded-open-close-plain-alist)
      '("# %% " " %%\n"))
;; C-x * f (`calc-embedded-new-formula') で数式を作るときに挿入する区切り
;; 設定しない方がいい? 余計かも
(setf (alist-get 'org-mode calc-embedded-open-close-new-formula-alist)
      '("{{{calc(" ")}}}"))

独自のcalcマクロの使用例

上の設定の後、org-modeのバッファに例えば次のように書きます。

# 杯数: $ servings := 3 $

# [calc-mode: float-format: (fix 3)]
{{{calc(servings => 3)}}}杯分を作るには、水を{{{calc(water := 250 servings => 750 )}}}ml、レモン果汁を{{{calc(lemon := 125 servings => 375)}}}ml使います。合わせると{{{calc(water + lemon => 1125)}}}mlとなり、果汁{{{calc(100 lemon / (lemon + water) => 33.333)}}}%のレモン水になります。

その後 C-x * a (activate)を押すと :==> を含む全ての式が「アクティブ」になります。

C-x * n (next)や C-x * p (previous)を押すとポイントを次のアクティブな数式や前のアクティブな数式へ移動できます(アクティブになっていることを確認できます)。

この状態で $ servings := 3 $34 に変更して C-x * u (update)を押すと、他の全てのアクティブな数式も更新されます。

もちろんエクスポートすれば次のようにシンプルな文章になります。

4杯分を作るには、水を1000ml、レモン果汁を500ml使います。合わせると1500mlとなり、果汁33.333%のレモン水になります。

非ASCII文字を区切りにする

上の設定では非ASCII文字も区切りとして追加しているので、より気軽に文章の中で数式を書くことができます。例えば次のように:

2025年10月1日の為替レートはrate_before := 148.170円/ドルだった。10月10日はrate_after := 153.090円/ドル。実に100 (rate_after / rate_before - 1) => 3.320パーセント上がったことになる。

文の中に三つの数式があるのが分かるでしょうか。区切りとして非ASCII文字を追加したため、 が区切りになってその間をCalcは数式と認識してくれるわけです。

もちろんエクスポートすると余分な式も出力されてしまいますが、自分だけが見るのであれば困ることも無いと思います。いちいち {{{calc()}}} で囲むのが面倒であればこういった方法もあります。

ただ、数式の中に非ASCII文字を書きたい人はこの設定は使えません。

$ で区切ることを許容できるならそちらを使う方が良いかもしれません。ただ、 $ は数式のフォーマットでエクスポートされてしまうとかエクスポート対象を結果や代入値に限定できないといった問題があるので独自のマクロを作ったわけです。でも $ の一文字区切りは魅力的です。 $ のエクスポートを今回のマクロと同じようにしてしまうという手はあるかもしれません。

ソースコードブロックを使う

似たようなことはソースコードブロックを使ってもできます。特にインライン版のソースコードブロックが有用です。

次のように書くと先ほどと同じことができます(式の部分でC-c C-cを押すと結果部分が生成される)。

1~4を足すと src_calc[:eval no-export]{1+2+3+4} {{{results(=10=)}}} になります。

= が付くのが気に入らなければ次のようにヘッダー引数 :wrap を指定すれば良いみたいです。(t で良いのかはイマイチよく分かりません。 :results wrap でもいけるみたいです)

1~4を足すと src_calc[:eval no-export :wrap t]{1+2+3+4} {{{results(10)}}}になります。

ちなみに数式部分だけ出力したければ :exports code を指定します。これは今回のテーマである計算するというところから少々はみ出していますが。

1~4を足す式は src_calc[:exports code]{1+2+3+4} と書きます。

変数を使うには……どうしたらいいんでしょうね。

#+CONSTANTS: は参照できないみたいなんですよね。他のソースコードブロックの結果かテーブルかリストか……。とりあえずテーブルを参照してみましょうか。

#+NAME: drink-params
| servings |   3 |
| water    | 750 |
| lemon    | 375 |
#+TBLFM: @2$2=250*@1$2::@3$2=125*@1$2

src_calc[:eval no-export :wrap t :var params=drink-params]{params_1_2} {{{results(3)}}}杯分を作るには、水を src_calc[:eval no-export :wrap t :var params=drink-params]{params_2_2} {{{results(750)}}}ml、レモン果汁を src_calc[:eval no-export :wrap t :var params=drink-params]{params_3_2} {{{results(375)}}}ml使います。合わせると src_calc[:eval no-export :wrap t :var params=drink-params]{params_2_2+params_3_2} {{{results(1125)}}}mlとなり、果汁src_calc[:eval no-export :wrap t :var params=drink-params]{100 params_3_2/(params_2_2+params_3_2)} {{{results(33.333)}}}%のレモン水になります。

だめだ、やってられん!

(2026-03-16追記)header-argsプロパティを使えばもっと簡単になる事に気がつきました。

* プロパティを使う方法
:PROPERTIES:
:header-args:calc: :eval no-export :wrap t :var servings=3 :var water=250 :var lemon=125
:END:

src_calc{servings} {{{results(3)}}}杯分を作るには、水を src_calc{servings water} {{{results(750)}}}ml、レモン果汁を src_calc{servings lemon} {{{results(375)}}}ml使います。合わせると src_calc{servings*(water + lemon)} {{{results(1125)}}}mlとなり、果汁 src_calc{100 lemon/(water+lemon)} {{{results(33.3333333333)}}}%のレモン水になります。

課題

埋め込みモードはorg-modeが提供する変数、つまり、ソースコードブロックの :var で参照できるものにアクセスできないのは残念なところです。

とはいえ、Calcの関数を作ってしまえばアクセスできるのではないでしょうか。

そのあたりはまた今度。

(2026-03-16追記) => のペアがverbatimとして認識されてしまうことが多々あるようです。 {{{calc()}}} で囲っている分には(=> は出力されないので少なくともエクスポート時には)問題にはならないのですが、 $ で囲ったり、nonascii区切りを使うとおきがち。何とかしたいところ。

2026-03-14 ,

org-modeでエクスポート時にソースコードブロックを評価しないようにする

org-modeのソースコードブロック( #+BEGIN_SRC ~ #+END_SRC )は非常に便利で特に評価結果を生成してくれるところが素晴らしいですが、エクスポートするたびにソースコードを再評価するか聞かれるのは煩わしいところです。 もちろんエクスポートのたびに毎回評価した方が良いこともあるでしょうが、私の利用状況ではほとんどの場合エクスポート時の評価は必要ありません。

エクスポート時の評価を抑制する方法はいくつかありますが、最も普通なのはヘッダー引数 :eval を指定することではないでしょうか。 ヘッダー引数 :evalno-export または never-export を指定することでエクスポート時に評価しないようにできます。(参考: Evaluating Code Blocks)

例えば次のように :eval no-export を付けるとエクスポート時に評価されずに今 #+RESULTS: のところに生成されている結果がそのままエクスポートされます。

Emacs Lispで1+2+3を計算するには次のようにします。
#+name: example1
#+begin_src elisp :exports both :eval no-export
(+ 1 2 3)
#+end_src
結果:
#+RESULTS: example1
: 6

他にもキャッシュ機能を使えばソースコードの内容(ハッシュ値)が変わったときだけ評価するようにもできます。

Emacs Lispで1+2+3を計算するには次のようにします。
#+name: example1
#+begin_src elisp :exports both :cache yes
(+ 1 2 3)
#+end_src
結果:
#+RESULTS[8bb6d9b0bd19e634ef0ab976273b825967dfdc03]: example1
: 6

ただ、正直キャッシュまでは必要ない場合がほとんどです。大抵は書いている途中に手動で評価して確認し、それをそのままエクスポート時に出力してくれれば十分です。

他にもorg-confirm-babel-evaluateをnilにするという方法もありますが、これは確認せずに全て評価するという意味なのでセキュリティ的な懸念があります。

というわけで私は結果を出力するソースコードブロックにはいつも :eval no-export を付けていたのですが、インラインソースコードブロックを書くときにはウンザリしていました。例えば次のようにいちいち [:eval no-export] と書かなければなりません。

2750円から3000円へ値上がり(src_calc[:eval no-export]{100*(3000/2750-1)} {{{results(=9.090909091=)}}} %増)

打つのが面倒というのもありますが、見返したときにゴチャゴチャしていて読みづらいのが一番の問題です。

そもそもほとんどのソースコードブロックに :eval no-export を指定するのであれば、デフォルト値がそうなっていれば済む話ではないでしょうか。

調べてみると、次の書き方でorgファイル全体のデフォルトを設定できるようです。(参考: Using Header Arguments)

#+PROPERTY: header-args :eval no-export

これは良いものだと思いますが(こんなの前からあった?)、でもほとんどのファイルにこれを書くのも面倒です。

もう少し調べてみるとob-core.el内で定義されている変数org-babel-default-header-argsorg-babel-default-inline-header-argsを修正すればデフォルト値を変えられるようでした。

通常のソースコードブロックとインラインソースコードブロックとで変数が違います。

;; ob-core.elより
(defvar org-babel-default-header-args
  '((:session . "none") (:results . "replace") (:exports . "code")
    (:cache . "no") (:noweb . "no") (:hlines . "no") (:tangle . "no"))
  "Default arguments to use when evaluating a source block.
...略...")
(put 'org-babel-default-header-args 'safe-local-variable
     (org-babel-header-args-safe-fn org-babel-safe-header-args))

(defvar org-babel-default-inline-header-args
  '((:session . "none") (:results . "replace")
    (:exports . "results") (:hlines . "yes"))
  "Default arguments to use when evaluating an inline source block.")
(put 'org-babel-default-inline-header-args 'safe-local-variable
     (org-babel-header-args-safe-fn org-babel-safe-header-args))

(余談ですが、 :exports が通常では code で、インラインでは results になっているのが興味深いところです)

なのでこれを次のようにして書き替えてしまえば良さそうです(init.el等で)。

;; ソースブロックのヘッダー引数で :eval no-export をデフォルトにする。
(with-eval-after-load "ob-core"
  (push '(:eval . "no-export") org-babel-default-inline-header-args)
  (push '(:eval . "no-export") org-babel-default-header-args))
;; (setf (alist-get :eval org-babel-default-header-args) "no-export")でも良いのかもしれないけど……非破壊的なalist設定関数って無いんだよね。いや、破壊してもいいのかもしれないけど……copyしてsetする? マニュアルにはassq-delete-allしてconsする設定例が載っているなぁ

ちなみに変数に safe-local-variable プロパティの設定があるのでファイルローカル変数で指定できるのかなと思ってやってみたのですが (:eval . "no-export") の指定は安全だと見なされないようです。何が安全かは定数org-babel-safe-header-argsで決まっているので、そこを修正すれば通るようにはなります。どのみち指定しづらいですし、ファイル全体で指定したければ #+PROPERTY: header-args :eval no-export で設定した方が良いでしょう。

2750円から3000円へ値上がり(src_calc{100*(3000/2750-1)} {{{results(=9.090909091=)}}} %増)

# Local Variables:
# org-babel-default-inline-header-args: ((:eval . "never-export") (:session . "none") (:results . "replace") (:exports . "results") (:hlines . "yes"))
# End:

というわけでデフォルトを :eval no-export にしたのでインラインソースコードブロックが書きやすくなりました。

2750円から3000円へ値上がり(src_calc{100*(3000/2750-1)} {{{results(=9.090909091=)}}} %増)

……まぁ、比較的。それでも見づらさは残りますけどね。

ここからは余談ですが、式が出力されても良いならCalcのEmbedded Modeを利用する手もあります。例えば次のように書いて$と$の間で C-x * u と押すと結果が => の右に挿入されます。

2750円から3000円へ値上がり($100 (3000/2750 - 1) =>$ %増)

マクロを使えば => の右側だけ取り出すことも一応できます。

#+MACRO: calc-result (eval (string-trim $1 ".*=> " "\\$"))
2750円から3000円へ値上がり({{{calc-result($100 (3000/2750 - 1) => 9.090909091$)}}}%増)

区切りの $ は必要ですが、calc-embedded-open-formulaあたりで区切りを変更すれば無くせるかもしれません。

うーん、でもインラインソースコードブロックと大差ないような気もしますね。

ところで #+BEGIN_SRC~#+END_SRC のブロックを何と呼ぶかいつも困っています。ここでは「ソースコードブロック」と書いてみましたが、これまで私は「ソースブロック」と書くことが多かったような気がします。マニュアルでは「source code block」「code block」「source block」が混在しています。「src block」と書いてあるのもどこかで見たような気もします。

2026-02-22 ,

org-mode 9.8とインライン画像

org-modeの9.8がリリースされたようです。

Org mode 9.8 is out : r/orgmode

変更点:

Release notes | Org mode

早速更新しましたが、Emacsを再起動すると古いバージョンと混ざっているというような警告が出たので M-x package-recompile-all したら解消しました。

まだ詳細な変更点には目を通していないのですが、インライン画像まわりの構造が変わったようです。

従来「インライン画像表示」と呼ばれていたものが「リンクプレビュー」に変わりました。つまり、これまで画像へのfileリンク(またはattachmentリンク)を画像化するだけの機能だったものが、任意のリンクタイプにオーバーレイを適用する機能に一般化されました。

これに伴い私のインライン画像に対する拡張も修正しました。

misohena/org-inline-image-fix: A collection of fixes related to the image display feature in org-mode

edrawも通常fileリンクを編集するコマンドに若干影響があったので(バイトコンパイル時に警告が出ていたので)修正しました。

misohena/el-easydraw: Embedded drawing tool for Emacs