【概要】
hiki2latexのtable処理部
【仕様】
- hiki記法の表をtabularへ変換
- 連結作用素に対応
- 行連結では中心に表示を移動
- 縦罫は基本使わない
- 横罫はheader内枠と上下外枠のみ
【hiki】
||>A11||>A12||
||^^A21||A22||>A23||
||A11||^A22||A12||
||A21||A23||
| A11 | |
|---|---|
| A21 | A22 |
| A11 | |
| A21 | A23 |
【latex】
¥begin{center}¥begin{table}[htbp]¥begin{tabular}{ccccc}
¥hline
¥multicolumn{2}{c}{A11 } &¥multicolumn{2}{c}{A12 } & ¥¥ ¥hline
&A22 &¥multicolumn{2}{c}{A23 } & ¥¥
A21 &A11 &A22 &A12 & ¥¥
&A21 & &A23 & ¥¥
¥hline
¥end{tabular}¥end{table}¥end{center}
%横罫を入れる場合は, ¥hline, ¥cline{2-3}などで.
【コード解説】
元のHTMLOutputではそれぞれの要素で対応していたが,LatexOutputではtable_closeにて
def table_close
@f << make_table
end
としている.make_tableは下請けにmake_matrixを読んでおり,ここでほぼ全ての作業をしている.作業内容は
- matrixを作る
- 縦連結を処理
- 縦連結の数(rs)だけ下行に追加
- 連結の中心(c_rs)に内容を表記
- 横連結をmulticolumnで処理
- ついでに最大列数(max_col)を記録
bob% cat table.rb
cont = File.readlines("table")
cont.each{|line|
p tmp=line.split('||')
}
t_matrix=[]
cont.each{|line|
tmp=line.split('||')
tmp.slice!(0)
tmp.slice!(-1) if tmp.slice(-1)=="\n"
tmp.each_with_index{|ele,i| tmp[i] = ele.match(/\s*(.+)/)[1]}
t_matrix << tmp
}
t_matrix.each_with_index{|line,i|
line.each_with_index{|ele,j|
if ele=~/\^+/ then
t_matrix[i][j]=""
rs=$&.size
c_rs=rs/2
rs.times{|k| t_matrix[i+k+1].insert(j,"")}
t_matrix[i+c_rs][j]=$'
end
}
}
p t_matrix
max_col=0
t_matrix.each_with_index{|line,i|
n_col=line.size
line.each_with_index{|ele,j|
if ele=~/>+/ then
cs=$&.size
t_matrix[i][j]= "\\multicolumn{#{cs+1}}{c}{#{$'}} "
n_col+=cs
end
}
max_col = n_col if n_col>max_col
}
p t_matrix
p max_col