Org文書の書き方を説明するためにOrg文書の中にorg言語のコードブロックを書くことは良くあります(まさにこの文書がそのようにして作られています)。
例えば太字、表、コードブロックの書き方を例示するために次のように書いたとします。
太字、表、コードブロックは次のように書きます。
#+BEGIN_SRC org
太字の例:
*bold*
表の例:
|a|0|
|b|0|
コードブロック例:
,#+BEGIN_SRC emacs-lisp
(concat "hello" "world")
,#+END_SRC
#+END_SRC
これをエクスポートすると次のように表示されます。
太字、表、コードブロックは次のように書きます。
太字の例:
*bold*
表の例:
|a|0|
|b|0|
コードブロック例:
#+BEGIN_SRC emacs-lisp
(concat "hello" "world")
#+END_SRC
これを読めば「太字は*で囲むのか」「表は|で区切るのか」といったことが分かることでしょう。
このように書き方を例示した場合、そのすぐ後に実際にどう表示されるかも一緒に掲載したくなる物です。まさに上でそうしているように。これはorg-modeの書き方に限らず他のマークアップ言語でもそうですし、ひいては普通のプログラミング言語でも結果を一緒に掲載するのは良くあることです。これはどのように実現したら良いのでしょうか。手動でマークアップをコピーしてペーストし少し手直ししても良いのですが、もっと良い方法があります。
他の言語と同じようにorg言語のコードブロックの評価結果をエクスポートさせれば良いのです。
Org文書は本来プログラムではないので「org言語のコードブロックの評価結果」というのは何を言っているのか分からないかもしれません。しかしorg言語の評価方法は org-babel-execute:org 関数で定義されています。見てみると基本的にコードブロックの中身をそのまま返すだけとなっています。つまり、org言語のコードブロックを評価するとその結果として書かれているorg言語のコードがそのまま結果としてバッファに挿入されたり、エクスポートされたりするようにできるわけです。
まず :exports
には both
を指定してコードと評価結果の両方を出力します。 :results
のデフォルトは raw silent
なのでそのままでは結果は何も出力されません。 :results raw replace
としてもいいのですが、実際にやれば分かりますが少し面倒なことになります。 :results raw discard
として評価結果をバッファに挿入せず、エクスポートさせるようにしてみましょう。
太字、表、コードブロックは次のように書きます。
#+NAME: org-bold-example
#+BEGIN_SRC org :exports both :results raw discard
太字の例:
*bold*
表の例:
|a|0|
|b|0|
コードブロック例:
,#+BEGIN_SRC emacs-lisp
(concat "hello" "world")
,#+END_SRC
#+END_SRC
これをエクスポートすると次のように表示されます。
#+RESULTS: org-bold-example
これをエクスポートすると次のようにコードと結果が両方(both)表示されます。
太字、表、コードブロックは次のように書きます。
太字の例:
*bold*
表の例:
|a|0|
|b|0|
コードブロック例:
,#+BEGIN_SRC emacs-lisp
(concat "hello" "world")
,#+END_SRC
これをエクスポートすると次のように表示されます。
太字の例: bold
表の例:
コードブロック例:
デフォルトの :results
(変数 org-babel-default-header-args:org
) が :results silent
なため、そのままでは結果が出力されません。明示的に :results discard
と指定するとエクスポート時に評価されて出力されます。 :results replace
とすると太字の例からコードブロックの例までがそのまま #+RESULTS:
の後に挿入されます。しかしこれだとどこからどこまでが結果か後から判別できなくなるため、次回の評価時に正しく結果をreplaceしてくれなくなってしまいます。なので今回は discard
を使いました。
HTMLやJavaScriptのところで紹介するように #+CALL
を使う方法もあります。
太字、表、コードブロックは次のように書きます。
#+NAME: org-example
#+BEGIN_SRC org :exports code
太字の例:
*bold*
表の例:
|a|0|
|b|0|
コードブロック例:
,#+BEGIN_SRC emacs-lisp
(concat "hello" "world")
,#+END_SRC
#+END_SRC
これをエクスポートすると次のように表示されます。
#+NAME: ref-org
#+BEGIN_SRC emacs-lisp :exports none :results raw :var ref=""
(cadr (org-babel-lob--src-info ref))
#+END_SRC
#+CALL: ref-org("org-example")
noweb参照を活用する方法もあることでしょう。