table.el の使い方と org-mode 連携

Emacs には自由に表を書くための機能が標準で付いています。それが table.el です。

org-mode にも表を作成する機能が付いていますが、これはあくまでも単純な表作成を行うためのものなので、表計算が行えても、セルが結合した表などは記述することはできません。 (ちなみに org-mode の表作成機能はマイナーモードとして org ファイル以外でも使えたりします。興味がある人は orgtbl-mode で調べてみてください)

ここでは、多機能ゆえに少々とっつきにくい table.el の使い方について詳しく説明していきます。また、 org-mode には table.el の表を出力する機能もあるので、 org-mode と連携した使い方についても説明します。前回 org-mode による論文作成入門 という記事を書きましたが、 table.el を使えば卒論で書きたい複雑な表も LaTeX で書かなくてすみます。

table.el の使い方

表の作成

表の作成方法は (org-mode との連携も含めて) 以下の 3 つ。

  1. 大きさを決めて表を新規作成 (table-insert)
  2. 表の形をしたテキストを table.el の形式に変換 (table-capture)
  3. org-mode の表形式を table.el の表形式に変換 (org-table-convert)

1 の新規作成は Emacs の適当なテキストファイルで M-x table-insert を実行してみてもらえばわかると思います。 3 は後ろの org-mode との連携のところでまた説明します。

2 については例を示した方がわかりやすいと思うので EmacsWiki の例を挙げてみましょう。 Emacs の適当なテキストファイルに以下を入力してみてください。

Name  cmd calls  Percentage
rgb  93 534       46%
Xah  82 090          40%
   total    203 118   100%

スペースの数がそろってなくて雑ですが表っぽい形のテキストができました。このテキストの表を選択 (表の先頭で C-SPC を入力後、表の末尾までカーソル移動) した状態で M-x table-capture を実行します。すると、どういう基準で表の行・列を分割するかたずねられます。

それでは、"Column delimiter regexp" では SPC SPC を、"Row delimiter regexp" では C-o (改行コードの意味です) を入力して決定、 Justify では何も入力せずに決定、最後に "Minimum cell width" では 10 を入力して決定してください。すると以下のような表ができます。

+----------+----------+----------+
|Name      |cmd calls |Percentage|
+----------+----------+----------+
|rgb       |93 534    |46%       |
+----------+----------+----------+
|Xah       |82 090    |40%       |
+----------+----------+----------+
|total     |203 118   |100%      |
+----------+----------+----------+

はじめのテキストから、 2 つ以上のスペースを列の区切りに、改行を行の区切りにした、セルの幅が 10 の表に変換されました。このように、形式的に書かれた表のテキストは M-x table-capture で table.el の形式に変換できます。

本来、この表の筆者はおそらく cmd と cells も別の列にしたかったのでしょう。その表を作るには "Column delimiter regexp" で SPC を 1 つだけ入力すれば OK です。

表の編集

table.el 形式の表では、それぞれのセルが 1 つの Emacs バッファのように動作すると考えてください。セルの中で C-a/C-e を入力するとそのセルの行頭/行末に、 C-< /C-> を入力するとセルの先頭/末尾に移動します。

また、行末で文字入力や改行を行うと、その状況に合わせてセルの行や列が広がるため、 table.el の形式を崩さずにセルを記入することができます。 C-w/C-y でコピペしても表は崩れません。

最後に、表編集中に使用できるコマンド一覧をのせておきます。

キー 機能
TAB セルの移動
C-> セルの幅を広げる
C-< セルの幅を縮める
C-} セルの高さを広げる
C-{ セルの高さを縮める
C-- 現在のセルを上下に分割する
C-| 現在のセルを左右に分割する
C-* 現在のセルを隣のセルと連結する
C-+ 行 (列) を挿入する
C-^ HTML や LaTeX の形式に出力
C-: セルの文字位置の調整

表の認識

table.el 形式の表を作成した直後はテーブル編集モードで編集が行われるため、上記のコマンドを使用したりセル編集中に自動でセルの大きさが拡張されます。代わりに、そのテキスト形式の表を自由に編集できません。

テーブル編集モードを解除するにはテーブル上で M-x table-unrecognize-table を実行します。これで他のテキストと同じように編集できます。

再びテーブル編集モードで編集を行うには M-x table-recognize-table を実行します。

table.el と org-mode の連携

org-mode で使用できる table.el 関連のコマンド

org-mode では以下のコマンドが使用できます。ここでの「表」は table.el 形式の表のことです。

キー 機能
(表がないところで) C-c ~ 表を新規作成 (table-insert)
(表の上で) C-c ~ 表を変換 (Org-mode <-> table.el)
(表の上で) C-c ' テーブル編集モードで編集

表の編集はソースコードの編集などと同じコマンドです。表がテーブル編集モードなのかどうかを考えなくていいのでわかりやすいですね。

別形式への変換

table.el 形式の表が記述された org ファイルを LaTeX などに変換するとき、 org-mode はそれを自動で認識し適切な表に変換してくれます。

例えば、 org ファイルに以下の表を記述します。

+-----+-----+-----+
|1          |2    |
+-----+-----+     |
|4    |5    |     |
|     +-----+-----+
|     |3          |
+-----+-----------+

このファイルを LaTeX に変換すると、以下のように出力されます。

\begin{center}
\begin{tabular}{|l|l|l|}
\hline
\multicolumn{2}{|l|}{1} & 2 \\
\cline{1-2}
4 & 5 & \\
\cline{2-3}
 & \multicolumn{2}{l|}{3} \\
\hline
\end{tabular}
\end{center}

まとめ

table.el は org-mode の表編集に慣れていると使いづらかったり、一行ごとに区切りを記述する必要があるため無駄に行数が増えるということで、セルを結合した表を org-mode の表形式で記述できないかという話題がネット上でいくつか上がっています。しかし現状では、 org-mode でセルを結合した表を書きたい場合 table.el を使うしかないようです。

まあ LaTeX の multicolumn と cline を多用した表よりは書きやすいと思うのでその辺は我慢しましょう。 table.el による長時間の編集を避けるために、先に org-mode で全セルを区切った表を作っておき、それを table.el 形式に変換して C-* で連結だけ行うというのもありかもしれませんね。