« ^ »

Emacsのorg-modeのINCLUDEを使って外部のファイルの内容を差し込む

所要時間: 約 4分

org-modeは #+INCLUDE: を使うことで外部のファイルの内容を取り込む事ができる。今回はこの機能の色々な指定方法を試す。展開される

基本的な使い方

先頭の引数には取り組むファイルへのパスを指定する。

#+INCLUDE: "hello.txt"

これは org-ascii-export-as-ascii では、ファイルの中身がそのまま挿入される。このブロックは Emacsorg-ascii-export-as-ascii では出力できるが Hugo が利用している go-org では出力できない。

ブロック種別を指定する

2番目の引数にはブロックの種別を指定する。具体的には example export src などを指定する。

example

ブロック種別がexampleの例

#+INCLUDE: "./hello.txt" example

ブロック種別がexampleの出力

このブロックは Emacsorg-ascii-export-as-ascii では出力できるが Hugo が利用している go-org では出力できない。

export

ブロック種別がexportの例

#+INCLUDE: "./hello.txt" export

ブロック種別がexportの出力

src

ブロック種別がsrcの例

#+INCLUDE: "./hello.txt" src

ブロック種別がsrcの出力

それ以外

それら以外の値が設定された場合には未指定と同じように出力される。

ブロック種別がfooの例

#+INCLUDE: "./hello.txt" foo

ブロック種別がfooの出力

これはexporterによってどのように出力されるかが変わる。例えばHTMLであればclass属性にブロック種別を指定する形で出力される。

<div class="foo">
<p>
Hello World!
</p>

コンテンツフォーマットを指定する

3番目の引数にはコンテンツフォーマットを指定する。

ブロック種別がsrcの例

#+INCLUDE: "./hello.txt" src csv

ブロック種別がsrcの出力

Hello World!

一部分をインクルード

例として次のようなOrgファイルの一部を取り込みます。

paper.org

行番号指定

:lines にファイルの行番号を指定して取り込む。

#+INCLUDE: "./paper.org" :lines "3-6"

結果

名前を指定

要素につけられた名前を指定して取り込む。

#+INCLUDE: ./paper.org::mytable

結果

見出しを指定

見出しを指定して取り込む。

#+INCLUDE: "./paper.org#conclusion"

結果 _#+INCLUDE: "./paper.org#conclusion"

見出しの中身を指定

見出しを指定して取り込むが、見出し自身は取り込まない。つまり中のコンテンツだけ取り込む。

#+INCLUDE: ./paper.org#conclusion :only-contents t

結果:: _#+INCLUDE: "./paper.org#conclusion" :only-contents t

org-modeとINCLUDEとorg-export

マークアップ言語としての org-mode を他の形式に変換を実装しているツールは実は幾つかある。 org.el に付随している org-export-* のような機能は Org Mode 自身が提供している出力機能で本家の機能といえる。他にも Pandocgo-org といった機能がマークアップ言語 org-mode の解析と他の形式の文書として変換する機能をサポートしている。このブログは Hugo という静的サイトジェネレータを使用しているが Hugo は内部で go-org を利用する事で org-mode の解析と変換を実現している。

ただし、これらのツールが提供している機能が完全に同じかというと、そうではない。一部の機能はサポートされていなかったり、出力結果が微妙に異なったりする。別のツールを使っているのだから当然といえば当然だけれど、それらそこそこ違ったりする。

org.el はEmacs Lispで実装されていて、当然だけれど処理系としてはEmacsを想定している。Emacs自体は最高だけれど、外部のツールからEmacsを利用するとなると、とたんに絶対そんな事をしたくなくなる。CLIツールがサブプロセスとしてEmacsを起動して、それと通信するなんて事は絶対にしたくない。それを考えると org-mode のパーサー等はEmacs Lispで記述するのではなく他の言語で記述し、外部ツールから利用可能な状態にした方が良いようにも思える。時間があれば、こういった事にも取り組んでみたい。

まとめ

Org-modeの #+INCLUDE: を使って外部ファイルを取り込む方法を確認した。第一引数にファイルパス、第二引数にブロック種別、第三引数にコンテンツフォーマッターを指定することで、取り込み後の見え方を変更できる。また行番号や名前や見出しを指定して一部分を取り込めることを確認した。