タブ区切りテキストをtabularに変換
こんなんあると便利かも、と思って作った自作ツールなのですが、実際に使用頻度も高いので試しに公開してみます。
- タブでコラムを区切っている形式の表が記述されているテキストファイルのパスを引数にこのスクリプトを呼ぶと、その表をtexの表に変換し、標準出力に出力します。
- ソースファイルの1行目に#から始まるテキストを書くとそれがキャプションになります。
- 表の最上段はデフォルトではヘッダという設定になってます。
- table環境、booktabsパッケージを使用を前提にしてます。勝手にセンタリングしたり、私好みになるように作ってます。
- ラベル名はソースとなった表のファイル名から拝借します。
- 複数列にまたがるセルとかややこしいのは全く考慮してません。それは手作業でどうぞ。
- タブ文字があると勝手に区切っちゃいます。エスケープできません。
#!/usr/bin/ruby -Ku $KCODE = 'utf8' require 'kconv' table = '' column = 0 fl = true comment = ARGF.gets.chomp.sub(/^#/,'').toutf8 label = 'tb:' + File.basename(ARGF.path,".*") ARGF.each do |l| unless l =~ /^#/ table += (x = l.chomp.split(/\t/,-1)).join(' & ') + " \\\\" if fl table += "\\midrule"; fl = false end column = x.size table += "\n" end end clm = 'c'*column if comment.empty? puts <<-ENE \\begin{center} \\begin{tabular}{#{clm}}\\toprule #{table}\\bottomrule \\end{tabular} \\end{center} ENE else puts <<-END \\begin{table} \\centering \\caption{#{comment}} \\label{#{label}} \\begin{tabular}{#{clm}}\\toprule #{table}\\bottomrule \\end{tabular} \\end{table} END end
ちっともRubyらしさを感じない汚いソースですね。
example
入力例(ファイル名をmouse.txtとします)
# マウス体重 識別子 体重(g) A 27.6 B 27.3 C 29.0 D 28.3 E 29.2 F 30.0
上記入力をしたときの出力
\begin{table} \centering \caption{マウス体重} \label{tb:mouse} \begin{tabular}{cc}\toprule 識別子 & 体重(g) \\\midrule A & 27.6 \\ B & 27.3 \\ C & 29.0 \\ D & 28.3 \\ E & 29.2 \\ F & 30.0 \\ \bottomrule \end{tabular} \end{table}
柔軟性の低いスクリプトだなぁ。まあ、もともと書き捨てなもので。それを公開するのはどうなのよという気もしますが。
(ではなぜ公開するのかと問われれば、前のエントリ(id:witchmakers:20080531)のような超単純なものでも、少しでも価値があるなら公開してもいいんじゃないかという気がしたからです。)