2017-10-26

org-modeのコードブロック(Babel)の使い方

基本構文

(公式マニュアル: Structure of code blocks – The Org Manual)

コードブロックは #+BEGIN_SRC で始まり #+END_SRC で終わる。 #+BEGIN_SRC の前に #+NAME:#+HEADER: が付く場合もある。

#+NAME: <name>
#+HEADER: <header>...
#+HEADER: <header>...
#+BEGIN_SRC <language> <switch>... <header>...
<body>
#+END_SRC

次の例ではmulという名前のemacs-lispのコードブロックを作成している。ヘッダー引数が二つ指定されている。

#+NAME: mul
#+BEGIN_SRC emacs-lisp :var x=2 :var y=3
(* x y)
#+END_SRC

名前が付いたコードブロックは他から参照できる。

関数のように呼び出すの例。C-c C-cしたりエクスポートしたりすると結果だけが出力される。
#+CALL: mul(x=5, y=6)

#+RESULTS:
: 30

↑CALLの上でC-c C-cするとRESULTSが生成される。

noweb参照の例。<<mul>>と書いた部分が置き換わる。
#+BEGIN_SRC emacs-lisp :noweb yes
(defun mul (x y)
  <<mul>>
)
#+END_SRC

CALLについてはコードブロックの呼び出し、noweb参照についてはnoweb参照を参照のこと。

行内でもコードブロックが書ける。

src_<language>{<body>}
src_<language>[<header>...]{<body>}

例:

2 * 3 の答えは src_emacs-lisp[:var x=2 :var y=3]{(* x y)}

2 * 3 の答えは 6

より具体的な例は言語毎の書き方を参照のこと。

コードブロックに関連するキー操作

(場所)キー操作 関数 動作
(コードブロック上で) C-c ‘ org-edit-src-code コードの編集。編集バッファから出るには再度C-c ‘を押す。 (公式マニュアル: Editing source code – The Org Manual)
(コードブロック上で) C-c C-c org-babel-execute-src-block コードを実行する。 (公式マニュアル: Evaluating code blocks – The Org Manual)
(orgファイル内で) C-c C-e org-export-dispatch エクスポートメニューを表示する。htmlでエクスポートしてブラウザで開くには続けてh oと打つ。エクスポート時に各コードブロックは評価される。

ヘッダー引数

(公式マニュアル: Header arguments – The Org Manual)

#+BEGIN_SRC <言語ID> の後には : で始まる引数が書け、様々なオプションが指定できる。

最も重要なのは :exports:results (最初のコロンと最後のsが抜けないように注意すること)。

:exports はコードブロックをエクスポートするときに何を出力するかを指定する。次のいずれかを指定できる。(公式マニュアル: exports – The Org Manual)

  • コードブロックのみを出力する(code)
  • 実行結果のみを出力する(results)
  • 両方を出力する(both)
  • 何も出力しない(none)

:exports の例:

#+NAME none-exports-example
#+BEGIN_SRC emacs-lisp :exports none :var x=0
(* x x) ;;このコードはエクスポートされない。他から名前で参照されるためのもの。
#+END_SRC

:results は実行結果をどのように扱うかを指定する(公式マニュアル: results – The Org Manual)。大きく分けて四種類の値を指定する。

  • どこから結果を得るか
    • 標準出力(output)
    • 言語が返した値(value)
  • 結果の種類(使用例は結果の受け取り方を参照のこと)
    • 表(table)
    • リスト(list)
    • 単一の値(scalar)
    • ファイルへのリンク(file)
  • 結果の出力形式
    • そのままOrg文書として出力(raw)
    • orgのコードブロック(#+BEGIN_SRC org)として出力(org)
    • htmlのエクスポートブロック(#+BEGIN_EXPORT html)として出力(html)
    • latexのエクスポートブロック(#+BEGIN_EXPORT latex)として出力(latex)
    • 同じ言語のエクスポートブロック(#+BEGIN_EXPORT 同じ言語)として出力(code)
    • pretty-printしたものを出力(一部の言語のみ対応)(pp)
    • :RESULTS::END: に挟まれた形で出力(drawer)
  • 結果をどう文書中に挿入するか(#+RESULTS:として)
    • 挿入しない(silent)
    • 置き換える(replace)
    • 最後に付け加える(append)
    • 最初に付け加える(prepend)

:results の例:

#+BEGIN_SRC emacs-lisp :results value raw drawer
"Hello\n\n| table | table |\n| table | table |\n"
#+END_SRC

#+RESULTS:
:RESULTS:
Hello

| table | table |
| table | table |
:END:

:results は言語毎にデフォルト値が異なるので注意を要する。デフォルト値や実際にどのヘッダー引数が使えるかは ob-<言語ID>.el の変数(org-babel-default-header-args:<言語ID>)や関数(org-babel-execute:<言語ID>)を見るのが手っ取り早いかもしれない。

その他にも様々なヘッダー引数がある。全ヘッダー引数のリストと説明はマニュアル(Specific header arguments – The Org Manual)を参照のこと。

noweb参照

(公式マニュアル: Noweb reference syntax – The Org Manual)

nowebとは文芸的プログラミング(Literate programming – Wikipedia)のツールなのだそうだ(noweb – Wikipedia)。

何はともあれ名前付きブロックを参照する書き方ができる。

まず名前付きのブロックを作る。

#+NAME: js-hello-example
#+BEGIN_SRC js :var suffix="world"
return "hello_" + suffix;
#+END_SRC

それを << 名前 >> という形式で参照する。

#+BEGIN_SRC js :noweb yes
function sayHello(){
    <<js-hello-example>>
}
return sayHello();
#+END_SRC

これは次のように展開される。

#+BEGIN_SRC js :noweb yes
function sayHello(){
    return "hello_" + suffix;
}
sayHello();
#+END_SRC

カッコで引数を与えると実行結果を受け取ることが出来るらしい。

#+BEGIN_SRC text :noweb yes
<<js-hello-example(suffix="moon")>>
#+END_SRC
hello_moon

公式マニュアルの関連箇所:

結果のキャッシュ

(公式マニュアル: cache – The Org Manual)

:cache yes を指定してあらかじめ実行しておくとエクスポートするたびにコードブロックを実行しなくて済む。

コードブロック内にコードブロックを書く方法

#+BEGIN_SRC#+END_SRC はネストできない。

#+BEGIN_SRC org
aaa
#+BEGIN_SRC org
bbb
#+END_SRC
ccc
#+END_SRC

これをエクスポートすると次のようになってしまう。

aaa
#+BEGIN_SRC org
bbb

ccc #+END_SRC

行頭にカンマを打つと良いらしい。

#+BEGIN_SRC org
,#+BEGIN_SRC org
*bold*
,#+END_SRC
#+END_SRC

上のように行頭にカンマを一つ表示させるために私は行頭にカンマを二つ打っている。

カンマを三つ打つとなぜかそのまま三つ表示される。

,,#+BEGIN_SRC org
*bold*
,,#+END_SRC

四つ打ってもそのまま四つ表示される。

,,,#+BEGIN_SRC org
*bold*
,,,#+END_SRC

行頭に二つ表示させたい場合はどうしたら良いんだろう。

言語毎の書き方

Emacs Lisp

Emacs LispはEmacsに組み込まれているため最も安定して使える。

Emacs LispのコードブロックはOrg文書中で次のように書ける。

Emacsのバージョンを表示するコードと結果は次の通り。

#+BEGIN_SRC emacs-lisp :exports both
(emacs-version)
#+END_SRC

#+RESULTS:
: GNU Emacs 25.3.50.1 (x86_64-w64-mingw32)
:  of 2017-09-20

#+BEGIN_SRC emacs-lisp#+END_SRC の間にカーソルを置いて C-c C-c を押すことで #+RESULTS: 以下が生成される。

ヘッダー引数 :exports には none code results both が指定でき、コード(リスティング)と結果をそれぞれエクスポートするかどうか指定できる。今回は both を指定しているためコードと結果の両方がエクスポートされる。実際にエクスポートすると次のようになる。

Emacsのバージョンを表示するコードと結果は次の通り。

(emacs-version)
GNU Emacs 25.3.50.1 (x86_64-w64-mingw32)
 of 2017-09-20

org-mode

orgの書き方を説明するためにorg文書の中にorgのコードブロックを書くことは良くある(まさにこの文書)。

例えば太字、表、コードブロックの書き方を例示したいときは次のように書く。

#+BEGIN_SRC org
*bold*
|a|0|
|b|0|
,#+BEGIN_SRC emacs-lisp
(concat "hello" "world")
,#+END_SRC
#+END_SRC

これをエクスポートすると今上でご覧のようにorgのソースコードが表示される。

このソースコードを実際にエクスポートしたときの見た目を併記したい時はどうするか。

:exports result:exports both を指定してorgコードブロックの実行結果も一緒に出力させれば良い。 org文書は本来プログラムではないので「orgコードブロックの実行」というのは何やら不思議な気もする。orgの実行方法は org-babel-execute:org 関数で定義されている。見てみると基本的にコードブロックの中身をそのまま返すだけとなっている。デフォルトは :results raw で返すので、結果はそのまま(生で)org文書の中に埋め込まれる。

#+BEGIN_SRC org :exports both :results raw replace
*bold*
|a|0|
|b|0|
,#+BEGIN_SRC emacs-lisp
(concat "hello" "world")
,#+END_SRC
#+END_SRC

これをエクスポートすると次のようにコードと結果が両方(both)表示される。

*bold*
|a|0|
|b|0|
,#+BEGIN_SRC emacs-lisp
(concat "hello" "world")
,#+END_SRC

bold

a 0
b 0
(concat "hello" "world")

デフォルトの :results (変数 org-babel-default-header-args:org) が :results silent なため、そのままでは結果が出力されない。明示的に :results replace と指定する必要がある。 (注意: :replace を指定しても再実行時に #+RESULTS: の部分を置き換えてくれず、以前の結果の上に新しい結果を追加してしまう場合がある。結果がどこまでか判別するすべがない場合にこの現象が起きる。結果が単一要素の場合は正しく置き換えてくれる)

HTMLやJavaScriptのところで紹介するように #+CALL を使う方法もある。

#+NAME: org-example
#+BEGIN_SRC org :exports both :results raw replace
*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")

HTML

準備:

  • 使っているモード(web-mode等)に合わせて org-src-lang-mode の書き換えが必要。

    (add-to-list 'org-src-lang-modes '("html" . web))
    

org文書でHTMLの書き方を説明したい場合、org文書の中にHTMLのコードブロックを書くことになる。

例えば次のコードブロックは、HTMLでcanvas要素とscript要素を使って絵を書く例を示している。

#+BEGIN_SRC html :exports both
<div>
<canvas width="320" height="240" />
<script>
//<![CDATA[
  var canvases = document.getElementsByTagName("canvas");
  var canvas = canvases[canvases.length - 1]; //last canvas element
  var ctx = canvas.getContext("2d");
  var angle = 0;
  function draw(){
    ctx.fillStyle = "rgb(128, 128, 255)";
    ctx.fillRect(0, 0, 320, 240);

    ctx.fillStyle = "rgb(64, 64, 128)";
    ctx.beginPath();
    ctx.arc(160, 120, 110, 0, 2*Math.PI, false);
    ctx.fill();

    ctx.strokeStyle = "rgb(255, 255, 255)";
    ctx.lineWidth = 2;
    ctx.beginPath();
    ctx.moveTo(160, 120);
    ctx.lineTo(160+100*Math.sin(angle*Math.PI/180), 120-100*Math.cos(angle*Math.PI/180));
    ctx.stroke();
  }
  draw();
  setInterval(function(){ angle += 6; draw();}, 1000);
//]]>
</script>
</div>
#+END_SRC

当然「これをブラウザで見るとこうなりますよ」というようにHTMLの表示結果を併記したいのだが、素直にexportsにbothを指定しても結果はエクスポートされない。試しにC-c C-cでHTMLコードブロックを実行しようとすると失敗する。

org-babel-execute-src-block: No org-babel-execute function for html!

org-babel-execute:html が定義されていないのでそのままでは実行できない。

元々HTMLはプログラミング言語ではなくマークアップ言語なので、実行して結果が出るようなものではない。 しかしHTMLの解説をする場合に書き方とブラウザでの表示結果を併記したいことは良くあるし、そのために例として書いたマークアップをそのままエクスポートしたHTML文書に埋め込められれば便利だ。

解決方法は色々ある。

  1. noweb参照でコードの重複を避ける方法

    まず名前付きhtmlコードブロックを作成し、それを後からorgコードブロックから参照する。

    canvasを使う例:
    #+NAME: html-example
    #+BEGIN_SRC html :exports code
    <div>
    <canvas width="320" height="240" />
    <script>
    //<![CDATA[
      var canvases = document.getElementsByTagName("canvas");
      var canvas = canvases[canvases.length - 1]; //last canvas element
      var ctx = canvas.getContext("2d");
      var angle = 0;
      function draw(){
        ctx.fillStyle = "rgb(128, 128, 255)";
        ctx.fillRect(0, 0, 320, 240);
    
        ctx.fillStyle = "rgb(64, 64, 128)";
        ctx.beginPath();
        ctx.arc(160, 120, 110, 0, 2*Math.PI, false);
        ctx.fill();
    
        ctx.strokeStyle = "rgb(255, 255, 255)";
        ctx.lineWidth = 2;
        ctx.beginPath();
        ctx.moveTo(160, 120);
        ctx.lineTo(160+100*Math.sin(angle*Math.PI/180), 120-100*Math.cos(angle*Math.PI/180));
        ctx.stroke();
      }
      draw();
      setInterval(function(){ angle += 6; draw();}, 1000);
    //]]>
    </script>
    </div>
    #+END_SRC
    
    結果:
    #+BEGIN_SRC org :noweb yes :exports results :results raw replace
    #+BEGIN_EXPORT html
    <<html-example>>
    #+END_EXPORT
    #+END_SRC
    

    :results raw を使うのがミソ。rawはOrg形式としてそのまま文書に埋め込まれる。 :results org としてしまうと結果が #+BEGIN_SRC org#+END_SRC で囲われてしまうので注意。 #+BEGIN_EXPORT html :noweb yes と書ければ簡単なのだけど書けない。

  2. noweb参照とhereドキュメントで対処する方法

    1とほぼ同様だが、何かhereドキュメントが使える言語でコードブロックをそのままエクスポートする。 :results html は結果を #+BEGIN_EXPORT html で囲ってくれるので。

    #+BEGIN_SRC perl :noweb yes :results output html :exports results
    print<<EOF;
    <<html-example>>
    EOF
    #+END_SRC
    
  3. 実行関数を定義する方法

    org-babel-execute:html が定義されていないのが原因なので、素直に定義してしまえば良いという話。

       (defun org-babel-execute:html (body params) body)
    
    #+BEGIN_SRC html :results html :exports both :noweb yes
    <<html-example>>
    #+END_SRC
    
  4. #+CALL を使用する方法

    (参考: org mode – Export Javascript source block to script tag in HTML when exporting Org file to HTML – Emacs Stack Exchange)

    #+NAME: ref-html
    #+BEGIN_SRC emacs-lisp :exports none :results html :var ref=""
    (concat "<div>" (cadr (org-babel-lob--src-info ref)) "</div>")
    #+END_SRC
    
    #+CALL: ref-html("html-example")
    
  5. ob-browserを使用する方法

    ob-browser を使用するとPhantomJS経由でスクリーンショットを撮って画像化してくれる。

結果:


参考:

JavaScript

準備:

  • node.jsをインストールしてnodeコマンドへパスを通す。
  • 変数 org-babel-js-cmd を設定(確認)する。
  • 別のモード(js2-mode等)を使っている場合は org-src-lang-mode の書き換えが必要。

    (add-to-list 'org-src-lang-modes '("js" . js2))
    
  • org-babel-load-languages に '(js . t) を追加

例1(コンソールに出力した結果を併記する):

#+BEGIN_SRC js :results output :exports both :cache yes
class Person{
    constructor(name, age){
        this.age = age;
        this.name = name;
    }
    greet(){
        return "my name is " + this.name + " " + this.age;
    }
}
var hanako = new Person("Kikuko", 17);
console.log(hanako.greet());
#+END_SRC

コードブロック内のJavaScriptではconsole.logを使って結果を出力している。:resultsにoutputを指定することで標準出力に出力されたものを結果として扱う。

結果:

my name is Kikuko 17

例2(コードブロックに変数で値を引き渡し、結果をreturnで返す例):

#+BEGIN_SRC js :results value :exports both :cache yes :var count=3
return Array.from(Array(count).keys());
#+END_SRC

ヘッダー引数 :var count=3 でJavaScriptへ値を引き渡している。JavaScriptのコードは配列 [0,1,2] をreturnで返している。結果はtableの形で表示される。

結果:

0 1 2

例3(HTML文書に埋め込む例):

コードブロック内のJavaScriptを、エクスポート後のHTML文書内に埋め込みたい場合もある。

最後の要素の親の親(最後のscript要素の親)へdiv要素を追加する例:

#+NAME: js-example
#+BEGIN_SRC js :exports code
(function(){
    var lastNode = document.body;
    while(lastNode.lastChild){ lastNode = lastNode.lastChild;}
    var div = document.createElement("div");
    div.innerHTML = "Hello World from JavaScript Code";
    div.style = "border: 1px solid;";
    lastNode.parentNode.parentNode.appendChild(div);
})();
#+END_SRC

実際にやってみる:

#+NAME: ref-js
#+BEGIN_SRC emacs-lisp :exports none :results html :var ref=""
(concat "<script>" (cadr (org-babel-lob--src-info ref)) "</script>")
#+END_SRC

#+CALL: ref-js("js-example")

↑ここに見える?

(参考: org mode – Export Javascript source block to script tag in HTML when exporting Org file to HTML – Emacs Stack Exchange)

Java

準備:

  • JDKをインストールする。
  • 変数を設定するかパスを通す。
    • org-babel-java-compiler (default: javac) (%JAVA_HOME%/bin/javac)
    • org-babel-java-command (default: java)
  • org-babel-load-languages に '(java . t) を追加

Javaのコードを実行するにはメインのクラス名を :classname で指定する必要がある。

#+BEGIN_SRC java :results output :exports both :classname HelloWorld :cmdline -Dorgmode.arg=test1234 :cache yes
public class HelloWorld {
    public static void main(String[] args){
        System.out.println("Hello");
        System.out.format("orgmode.arg=%s", System.getProperty("orgmode.arg"));
    }
}
#+END_SRC
Hello
orgmode.arg=test1234

変数(:var)や引数を渡す仕組みはない(Org9.1時点。org-babel-execute:javaを参照)。無理矢理やるならcmdlineとシステムプロパティを使うくらいか?

C/C++/D

準備:

  • 変数を設定する。
    • org-babel-C-compiler (default:gcc)
    • org-babel-C++-compiler (default:g++)
    • org-babel-D-compiler (default:rdmd)
  • org-babel-load-languages に '(C . t) を追加

例1:

#+HEADER: :includes <iostream> <cmath>
#+HEADER: :var x=1.0 :var y=2.0
#+BEGIN_SRC C++ :exports results :results output :cache yes
std::cout << "hello " << M_PI << std::endl;
std::cout << "x=" << x << " y=" << y << std::endl;
#+END_SRC
hello 3.14159
x=1 y=2

例2:

#+BEGIN_SRC C++ :exports results :results output table :cache yes
#include <iostream>

int main(int argc, char *argv[]){
    std::cout << 123 << " " << 456 << '\n'
              << 789 << " " << 012 << std::endl;
}
#+END_SRC
123 456
789 10

例3:

#+HEADER: :includes <iostream> <vector> <utility>
#+BEGIN_SRC C++ :exports both :cache yes
std::vector<std::pair<int, int>> v{{0,1}, {2,3}, {4,5}};
for(const auto &e : v){
    std::cout << e.first << ',' << e.second << '\n';
}
#+END_SRC
0 1
2 3
4 5

ditaa

準備:

  • ditaa.jarをどこかに配置する。(http://ditaa.sourceforge.net/#download)
  • 変数を設定する。
    • org-ditaa-jar-path
    • org-ditaa-jar-option
    • org-ditaa-eps-jar-path
  • org-babel-load-languages に '(ditaa . t) を追加
#+BEGIN_SRC ditaa :file ditaa-example.png :exports both :cache yes
+--------+   +-----------+   +-------------+
| Source +-->+ Processor +-->+ Destination |
+--------+   +-----------+   +-------------+
#+END_SRC
2017-10-26-ditaa-example.png

書き方等についてはditaaを参照のこと。

PlantUML

準備:

  • plantuml.jar をどこかに置いて org-plantuml-jar-path を設定すること。
  • plantumlの動作にはgraphvizのインストールと環境変数 GRAPHVIZ_DOT の設定が必要。
  • graphvizはCygwinのパッケージになっている。
  • org-babel-load-languages に '(plantuml . t) を追加

クラス図を描く例:

#+BEGIN_SRC plantuml :file plantuml-example.png :exports results :cache yes
World "1" *-right- "0..*" Animal : contains
Animal <|-- Dog
Animal <|-- Cat

World : void moveAllAnimals(double dt)
Animal : double age
Animal : double getAge()
Animal : void move(double dt)
Dog : void move(double dt)
Cat : void move(double dt)

note top of Animal
  Base class of all animals.
end note
#+END_SRC
2017-10-26-plantuml-example1.png

PlantUML自体については公式サイトを参照のこと。

dot

準備:

  • dotコマンドへパスを通しておく(一応:cmdヘッダーでも指定できるがおすすめはしない。ちなみに:cmdlineヘッダーも有効)
  • graphvizはCygwinのパッケージになっている。

適当な有向グラフを描く例:

#+BEGIN_SRC dot :file dot-example.png :exports results :cache yes
digraph {
  a -> b
  b -> c
  a -> c
}
#+END_SRC
2017-10-26-dot-example.png

dot自体の書き方については Graphviz | Graphviz – Graph Visualization Software を参照のこと。

R

準備:

  • インストールはインストーラで簡単
  • 変数 org-babel-R-command にRコマンドへのパスとコマンドライン引数を設定する
  • org-babel-load-languages に '(R . t) を追加

データを用意:

#+NAME: age-score-table
| Age | Score |
|-----+-------|
|  10 |    82 |
|  15 |   100 |
|   8 |    52 |
|  13 |    75 |
|  12 |    38 |
|   9 |    80 |
|  13 |    92 |
|  11 |    65 |
|  15 |    85 |
|  18 |    98 |
|   3 |    20 |
|  15 |    92 |
|  14 |    78 |
|  12 |    53 |
Age Score
10 82
15 100
8 52
13 75
12 38
9 80
13 92
11 65
15 85
18 98
3 20
15 92
14 78
12 53

org-mode表から散布図を描く:

#+BEGIN_SRC R :var table=age-score-table :results output graphics :file r-plot.png :width 320 :height 320 :cache yes
plot(table)
abline(lm(table$Score ~ table$Age), col="red")
#+END_SRC
2017-10-26-r-plot.png

org-mode表からヒストグラムを描く:

#+BEGIN_SRC R :var table=age-score-table :results output graphics :file r-hist.png :width 320 :height 320 :cache yes
hist(table$Age)
#+END_SRC
2017-10-26-r-hist.png

org-mode表から年齢別スコアを集計(結果を表で表示する例):

#+BEGIN_SRC R :var table=age-score-table :results value :colnames yes :exports results
aggregate(x=list(Score=table$Score),by=list(Age=table$Age),FUN=function(x)c(Mean=mean(x), Count=length(x), Max=max(x), Min=min(x)))
#+END_SRC
Age Score.Mean Score.Count Score.Max Score.Min
3 20 1 20 20
8 52 1 52 52
9 80 1 80 80
10 82 1 82 82
11 65 1 65 65
12 45.5 2 53 38
13 83.5 2 92 75
14 78 1 78 78
15 92.3333333333333 3 100 85
18 98 1 98 98

:colnames yes:rownames yes を付けないと列名や行名を取りこぼす。

R Source Code Blocks in Org Modeに書いてあるようにasciiパッケージを使用してOrg形式で出力し、 :result output で受ける方法もある。

好きな関数をプロットする例:

#+BEGIN_SRC R :results output graphics :file r-function.png :width 320 :height 320 :cache yes
y <- function(x){return (sqrt(x))}
plot(y, 0, 1)
#+END_SRC
2017-10-26-r-function.png

R自体については R: The R Project for Statistical Computing を参照のこと。

結果の受け取り方

:results table

Emacs Lisp

#+BEGIN_SRC emacs-lisp :results table :exports results
'((1) (1 2) (3 4 5))
#+END_SRC
1    
1 2  
3 4 5

Java

#+BEGIN_SRC java :classname HelloWorld :results table :cache yes
class HelloWorld {
    public static void main(String[] args){
        final String[] hand = {"Guu", "Choki", "Paa"};
        System.out.println("\t" + hand[0] + "\t" + hand[1] + "\t" + hand[2]);
        for(int i = 0; i < 3; ++i){
            System.out.printf(hand[i]);
            for(int j = 0; j < 3; ++j){
                System.out.printf("\t%d", (4+j-i)%3-1);
            }
            System.out.printf("\n");
        }
    }
}
#+END_SRC
  Guu Choki Paa
Guu 0 1 -1
Choki -1 0 1
Paa 1 -1 0

:results list

#+BEGIN_SRC emacs-lisp :results list :exports results
'("orange" "apple" "banana")
#+END_SRC
  • orange
  • apple
  • banana

:results scalar

#+BEGIN_SRC emacs-lisp :results scalar :exports results
'("orange" "apple" "banana" ("tenpura" "sukiyaki"))
#+END_SRC
("orange" "apple" "banana" ("tenpura" "sukiyaki"))

:results pp

#+BEGIN_SRC emacs-lisp :results pp :exports results
'("orange" "apple" "banana" ("tenpura" "sukiyaki"))
#+END_SRC
("orange" "apple" "banana"
 ("tenypura" "sukiyaki"))

:results file

#+BEGIN_SRC emacs-lisp :results file :exports results :cache yes
(let ((filename "2017-10-26-file-result-example.txt"))
  (with-temp-buffer (insert "orange apple banana") (write-region (point-min) (point-max) filename))
  filename)
#+END_SRC

2017-10-26-file-result-example.txt

コードブロックの呼び出し

まず名前付きのブロックを用意する。 次のコードは、標準出力へは”<b>hello world</b>”を出力し、値は123を返す。

#+NAME: call-ex1
#+BEGIN_SRC perl :var suffix=" world" :results value :cache yes :exports both
printf "<b>hello,$suffix</b>";
123
#+END_SRC
123

この名前付きブロックを呼び出す。

#+CALL: call-ex1[:results output](suffix=" moon") :results html

inline calling result: call_call-ex1[:results output](suffix=" moon")[:results html]

結果は次。

hello, moon

inline calling result: hello, moon

引数の前に指定するヘッダーは、呼び出し先ブロックに対して使われる。引数の後に指定するヘッダーは、得られた結果に対して使われる。

コードブロックから表を参照する方法

表に名前 #+NAME でを付けると :var 変数名 = 表名 で表の中身を参照できる。

#+NAME: payment-table
| 科目   | 金額 |
|--------+------|
| 交通費 |  320 |
| 食費   |  500 |
| 交通費 |  120 |
| 食費   |  140 |
| 交通費 |  300 |
| 食費   |  550 |

#+BEGIN_SRC emacs-lisp :var payments=payment-table :colnames yes
(let (alist)
  (loop for line in payments do
        (let* ((class (nth 0 line))
               (amount (nth 1 line))
               (cell (or (assoc class alist)
                         (car (push (list class 0) alist)))))
          (setcar (cdr cell) (+ (cadr cell) amount))))
  alist)
#+END_SRC

#+RESULTS:
| 科目   | 金額 |
|--------+------|
| 食費   | 1190 |
| 交通費 |  740 |

Pingback / Trackback