タブ区切りテキストを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)のような超単純なものでも、少しでも価値があるなら公開してもいいんじゃないかという気がしたからです。)

Future Plan

  • table環境の有無とか、1行目をヘッダとして扱うかどうか、あるいは区切り文字の変更とかオプションでもう少し柔軟性を持たせるなどする。
  • コードを美しくする。
  • それらをGaucheスクリプトとして実現する(ぉ