横書き縦書き変換

- awk で縦書き! -を見て、少し簡単ではありますが、同じような縦書きの骨子だけ作ってみます。

プログラムとしては AWK Users JP :: 転置行列を作るで行った操作と同じです。 文字列に分解し、配列に格納し、それを転置行列のように回転させています。

#! /usr/local/bin/gawk -f
# tategaki.awk
# 縦書きをします
# usage: gawk -f tategaki.awk file[s]

{
    num_str = split($0, arr_str, "");
    for (i = 1; i <= num_str; i++) {
        val[i, NR] = arr_str[i];
    }

    if (max_str < num_str) {
        max_str = num_str;
    }
}

END {
    for (i = 1; i <= max_str; i++) {
        for (j = NR; j >= 1; j--) {
            if (val[i, j] == "") {
                val[i, j] = " ";
            }
            printf("%s  ", val[i, j]);
        }
        print "";
    }
}

あくまで骨子ということなので、非常に簡単に作ってみました。 また、実行するにあたり、「羅生門」の冒頭を使ってみます。

$ cat sample.txt
或日の暮方の事である。一人の下人が、羅生門の下で雨やみを待つてゐた。
 廣い門の下には、この男の外に誰もゐない。唯、所々丹塗の剥げた、大きな圓
柱に、蟋蟀が一匹とまつてゐる。羅生門が、朱雀大路にある以上は、この男の外
にも、雨やみをする市女笠や揉烏帽子が、もう二三人はありさうなものである。
それが、この男の外には誰もゐない。

$ gawk -f tategaki.awk sample.txt
そ  に  柱     或  
れ  も  に  廣  日  
が  、  、  い  の  
、  雨  蟋  門  暮  
こ  や  蟀  の  方  
の  み  が  下  の  
男  を  一  に  事  
の  す  匹  は  で  
外  る  と  、  あ  
に  市  ま  こ  る  
は  女  つ  の  。  
誰  笠  て  男  一  
も  や  ゐ  の  人  
ゐ  揉  る  外  の  
な  烏  。  に  下  
い  帽  羅  誰  人  
。  子  生  も  が  
   が  門  ゐ  、  
   、  が  な  羅  
   も  、  い  生  
   う  朱  。  門  
   二  雀  唯  の  
   三  大  、  下  
   人  路  所  で  
   は  に  々  雨  
   あ  あ  丹  や  
   り  る  塗  み  
   さ  以  の  を  
   う  上  剥  待  
   な  は  げ  つ  
   も  、  た  て  
   の  こ  、  ゐ  
   で  の  大  た  
   あ  男  き  。  
   る  の  な     
   。  外  圓     

実際には半角文字をどうするとか、フォントをどうするといった問題があると思いますが、簡単な操作で縦書きに変換することができました。

なお、日本語を文字単位で扱う関係上、gawk のみの対応です。

tag_gawk.pngtag_gawk.png