第6回です。
前回までで詰将棋の図面を印刷できるようになりました。
今回は柿木将棋の形式をつみき形式に変換するスクリプトを書く準備として使用する言語 awk を導入します。
得意な言語をお持ちの方は、その言語を用いていただければと思います。(そしていいのが出来たら、私にもください)
私が使うのはawk(gawk)です。
またスクリプトを書くのはメモ帳(notepad)でもよいのですが、エディタも導入しておくことをお薦めします。私が使っているエディタはサクラエディタです。
どちらも無料です。
gawkはvectorからgawk3.1.5をダウンロードできます。
gawk-mbcs-win32-20051223.zipを解凍するとgawk-mbcs-win32-20051223というフォルダができますので、その中にgawk.exeがみつかります。
サクラエディタはこちらから入手できます。インストールの方法などは他にも詳しい頁がありますので参考にしてください。
ここではgawkをどのように使うかを中心にして解説したいと思います。
適当なフォルダを用意し、そこに
- gawk.exe
- 命令.awk
- 実行.bat
- 図巧001.ki2
の4つのファイルを用意してください。
gawk.exe以外の3つはこちらからダウンロードできます。
それらを1つのフォルダに収めてください。
さらにそれらをエディタで開いて、窓を下の図のように並べます。
今、命令ファイル【命令.awk】には
{print}
とだけ書かれています。
実行ファイルの【実行.bat】の中身は次のようなものです。
gawk -f 命令.awk 図巧001.ki2 pause
これは【図巧001.ki2】を読み込んで【命令.awk】の命令に従って処理せよという意味です。
命令は{print}ですから、読み込んで各行を出力するだけ。
右の窓のをダブルクリックして実行してみてください。
このように出力されたはずです。(スペースキーを押して、窓を閉じてください)
命令ファイルを次のように変更して保存してください。
/作者:/{print}
今度、実行してみると
このようになったはずです。
今度は「作者:」とある行だけ出力されました。
awk のスクリプトファイルの書き方は下記の通りです。
/正規表現/ {実行内容}
つまりawkは指定されたファイルを1行ずつ読み込んで、/正規表現/にマッチする行にあたったら、{実行内容}を実行します。
それでは作意手順だけを出力するには、命令ファイルをどのように書き換えたらよいかわかりますね。
/▲/{print}
実行すると次のようになるはずです。
それでは図面部分のみを出力するにはどうしたらよいのでしょうか。
次のように【命令.awk】を書き直して、保存してください。
/後手/,/先手/ {print}
/はじまり/,/おわり/ {実行内容}
だいたいawkの動き方は理解できたでしょうか。
次回はこのawkを利用して、柿木ファイルからつみき形式へ変換するスクリプトを作成します。
ここからはオマケです。
1つめ、現在gawkの最新版はezwinportsから入手できます。ここでは単体で動くgawk315を使います。
2つめ、柿木ファイルはkifとki2の2種類があります。
今回はki2を使っています。
なぜかというとkifファイルは次のようになっています。
図面部分は同じですが、棋譜の部分が違います。
つみき書店は作意手順も柿木ファイルから流用するので、ki2を使います。
今回は棋譜部分は全角になっています。
これをつみき書店の本で使っている半角にするには、柿木将棋で開き、【各種設定】→【棋譜】→【棋譜(KI2)形式】を半角にします。
前回の駒を配置する部分のソース
\def\先手#1#2#3{ \makeatletter \newcount\横 \横=#1 \multiply \横 by -2 \advance \横 by 20 \newcount\縦 \縦=#2 \multiply \縦 by -2 \advance \縦 by 23 \put(\横,\縦){\makebox(0,0){\large#3}} \makeatother }
で\makeatletterと\makeatotherは不要に見えます。
私も最初入れなかったのですが、エラーになってしまうのです。
実はこの方法だとコンパイルする度に全ての駒の位置を計算することになるので非効率です。
そこで実際には柿木ファイルから変換する際に図面の中の位置を計算して\後手{51玉}{玉}{10}{21}という形にしています。
この連載の順番ではとりあえずAWKはなしでCloudTexだけで図面出力まで進めたかったのでTeXで座標を計算するようにしてみました。
すると昔は上手くいっていた計算やマクロが動かないことに気づきました。
スタイルファイルの関係かもしれません。使っているのは\(\TeX\)の命令なのに…。
そこで試しに\makeatletterと\makeatotherを入れたら動いてくれたという訳です。
jlreqだと\bf も使えないようで、今泣きながらあちこち修正しています。
Tweet