LaTeXはExcel方眼紙の夢を見るか

はじめに

近年,Excel方眼紙が注目されている(要出典).Excel方眼紙とは,自由に罫線を引くためにあらかじめセルを正方形状に設定しておいたExcelファイル,およびそれによって作成された帳票を指す.そのサンプルや問題点については,参考文献を読むとよい.

Excel方眼紙は,書類としてのデザインに重きを置かれて作成されているため,データ入力や抽出・再利用に余計な労力が必要になる.しかし,これを捨てるのは容易ではない.参考文献の言葉を借りれば『「紙」文化圏の大人にとって,「データ」文化への切り替えは容易ではない』*1

この状況を改善するには,「データ」文化側が,

  1. Excel方眼紙の存在を許容し,データ入力や抽出・再利用の方法を工夫する
  2. 「紙」文化側でもそれなりに扱えるような軽量かつグラフィカルにできる文書作成方法を提供する

といった対策が考えられる.

1については,OOXMLを直に操作したりPowerShellからExcelのCOMを叩く*2といった方法が考えられる.しかし,手動でExcel方眼紙を扱う際に発生する余計な労力と,これらの学習コストが釣り合うかどうかという問題がある.

2について考える.現状でも,LaTeXなどは表形式に対するマークアップ記法を用意している.しかし,これらの形式は単純な表に対して最適化されており,Excel方眼紙のターゲットとなる自由に罫線を引いた文書には向いていない*3.しかし,マークアップ記法さえ確立してしまえば問題は解決できる.

本記事では,2の手法について自由に罫線を引いた文書に対するマークアップ記法を提案し,そのLaTeXでの実装を示す.

マークアップ記法

今回作成した試作品は,Githubで公開している.

サンプルは,Excel方眼紙公開討論会を参考にして作成した*4

作成したスタイルファイル,hogan.styでは,次の形式で自由に罫線を引いた文書に対するマークアップ記法を提供する.

% <<x>>は横方向のセル数,<<y>>は縦方向のセル数
% <<w>>は1セルの幅,<<h>>は1セルの高さ
\begin{hogan}[cells=<<x>>*<<y>>, size=<<w>>*<<h>>]
    \begin{lines}
        <<罫線部分へのマークアップ>>
    \end{lines}
    <<各セルへのテキストの配置>>
\end{hogan}

いくつか例を示そう.まずは,3行3列の各セルに実線の罫線を引き,それぞれにテキストを入れる場合,次のようにする.

\begin{hogan}[cells=3*3, size=2.5cm*1cm]
    \begin{lines}
        +-----+-----+-----+
        |     |     |     |
        +-----+-----+-----+
        |     |     |     |
        +-----+-----+-----+
        |     |     |     |
        +-----+-----+-----+
    \end{lines}
        \ctextbox[at={(0,0)}]{\textbf{左上}}
        \ctextbox[at={(1,0)}]{}
        \ctextbox[at={(2,0)}]{\hbox{\tate 右上}}
        \ctextbox[at={(0,1)}, align=left]{左側\\左寄せ}
        \ctextbox[at={(1,1)}]{}
        \ctextbox[at={(2,1)}, align=right]{右側\\右寄せ}
        \ltextbox[at={(0,2)}, align=left]{左側\\セルも左寄せ}
        \ctextbox[at={(1,2)}, align=center]{中央\\中央寄せ}
        \rtextbox[at={(2,2)}, align=right]{右側\\セルも右寄せ}
\end{hogan}

この記述により,次の出力を得る.

f:id:hak7a3:20170819233334p:plain

上記のように,hogan.styでは罫線をlines環境配下にアスキーアートで与える.各行の高さは1行であることを求めるが,各列の幅は何文字あってもよい.実線の罫線を引く場合,横方向なら-,縦方向なら|を用いる.

描画時の幅および高さはhogan環境のオプションのみで決定される.Excelと違い,ある行の高さもしくは列の幅のみを操作はできない*5

セルへ文字列を印字するには,\ltextbox\ctextbox,もしくは\rtextboxのいずれかの命令を用いる.atオプションでセルの座標を与える.命令はそれぞれ,セル内の配置が左寄せ,中央寄せ,右寄せのテキストを生成する.これらの命令にはalignオプションを与えることができる.このオプションは引数のテキストが複数行のときに,そのテキストの整列法を指定する.なお,現状の実装ではセル内の折り返しを実装していないので,改行は手動で与える必要がある*6

hogan.styでは,実線以外にもいくつかの罫線を提供している.横・縦方向ともに*で太線が引かれる.また,横方向で",縦方向で:を用いると点線が引かれる.サンプルを示しておこう.

\begin{hogan}[cells=3*2, size=2.5cm*1cm]
    \begin{lines}
        +-----+-----+-----+
        |     :     *     |
        +"""""+-----+*****+
        |     :     *     |
        +-----+-----+-----+
    \end{lines}
        \ctextbox[at={(0,0)}]{↓→点線}
        \ctextbox[at={(2,1)}]{↑←太線}
\end{hogan}

f:id:hak7a3:20170819233345p:plain

セル結合は,セル間の罫線を引かない機能と,テキストを複数セル間にまたがって配置する機能を組み合わせて実現する.サンプルを以って示しておこう.

\begin{hogan}[cells=3*2, size=2.5cm*1cm]
    \begin{lines}
        +-----+-----+-----+
        |     .     |     |
        +     +     +-----+
        |     .     |     |
        +-----+-----+-----+
    \end{lines}
        \ctextbox[at={(0,0)}, box=2*2]{セル結合}
\end{hogan}

f:id:hak7a3:20170819233359p:plain

実装

hogan.styの描画は,単純にTikZを利用して実装している.工夫したことといえば座標の計算のみである.hogan環境内部はtikzpicture環境となっているので,TikZの力を借りて吹き出しを入れるといったことも可能である*7

lines環境のパースも特筆すべきことはない*8.現状はカテゴリーコードの変更をかけていないが,変更すれば縦方向の罫線なしの記法をにすることも可能な見込みなので,この辺りは再考の余地がある.

考察

hogan.styによって,アスキーアートを利用したある程度グラフィカルな文書作成環境を提供できる.しかし,現状のhogan.styだけでは大規模な文書の作成が難しい.Githubに載せているサンプルを作成してわかったのだが,セル数が増えれば増えるほど,lines環境に与えるアスキーアートを描くコストが増大する.その点を考えると,Excelは罫線を引くUIとして使いやすい*9.データだけではなく,罫線も入力しやすくする方法を模索していきたい.

まとめ

Excel方眼紙は悪い文明だが,駆逐するのは難しい.

*1:さらに,筆者の経験談でいえば,多少のプログラミング経験も改善には役に立たない.集計機能が付くことはあるが,データ入力のしやすさが改善されるような改良は観測したことがない.

*2:実際,お仕事では後者を使っている.処理が非常に遅いのでお勧めはしない.

*3:そもそも,Excel方眼紙のターゲットを「表」とみるのが誤りか

*4:なお,筆者は参加申し込みを忘れていた模様

*5:実装上の都合が大きな要因.私はそのようなExcel方眼紙が特に嫌いなので,実装する予定もない.

*6:こちらについては,時間があれば実装する見込み.

*7:ただし,現状は座標系の違いにより配置が面倒

*8:LISP on TeXより数段楽

*9:もっとも,印刷まで考慮するとExcelWYSIWYGとは言い難いが……