org-modeは #+INCLUDE:
を使うことで外部のファイルの内容を取り込む事ができる。今回はこの機能の色々な指定方法を試す。展開される
基本的な使い方
先頭の引数には取り組むファイルへのパスを指定する。
#+INCLUDE: "hello.txt"
これは org-ascii-export-as-ascii
では、ファイルの中身がそのまま挿入される。このブロックは Emacs
の org-ascii-export-as-ascii
では出力できるが Hugo
が利用している go-org
では出力できない。
ブロック種別を指定する
2番目の引数にはブロックの種別を指定する。具体的には example
export
src
などを指定する。
example
ブロック種別がexampleの例
#+INCLUDE: "./hello.txt" example
ブロック種別がexampleの出力
このブロックは Emacs
の org-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
自身が提供している出力機能で本家の機能といえる。他にも Pandoc
や go-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:
を使って外部ファイルを取り込む方法を確認した。第一引数にファイルパス、第二引数にブロック種別、第三引数にコンテンツフォーマッターを指定することで、取り込み後の見え方を変更できる。また行番号や名前や見出しを指定して一部分を取り込めることを確認した。