2012/11/07

LaTeXで "千反田える" してみた(3)

(前:LaTeXで "千反田える" してみた(2))

~とりあえず解説(動作編)~

LaTeXで千反田えるしてみたの記事も3個目になりました。

ソースコードを見たい人は
LaTeXで "千反田える" してみた(1)

使われている命令の大雑把な解説を見たい人は
LaTeXで "千反田える" してみた(2)
をそれぞれ見てください。

今回は千反田えるマクロの処理の流れについて実際に処理している順番通りに説明したいと思います。


1. \defでマクロ定義
そのまんまです。マクロを定義します。

2. \newcountで新しくカウンタを定義,数値の代入
カウンタとして\@a,\@loop,\@limitを定義しました。
\@aは数字を漢数字に直す部分と,それに対応するアルファベット(ひらがな)を出力する部分で使います。
\@loopはループ回数を数えるカウンタです。
\@limitはループ回数の終了条件用のカウンタです。
こいつには引数を代入した後,1を足します。
何でそんな事をするかと言うと,ループでの判定条件は \@loop < \@limit なので \@loop = \@limit になったらループから出ます。
つまりは1足しておかないと千反田が欲しくて1000を与えたけど,九百九十九反田で終わってしまうからです。

元々与える引数の数字を1大きくすればいいという話でもあります。

3. \@loop < \@limit を満たす間はループ
それだけです。このループの中に今回のマクロのキモがあります。

3-1. 各桁の値を取り出す。
まず,漢数字に変換するためには各桁の数字がいくつなのかを判定する必要があります。
残念ながら,TeX / LaTeXには剰余を求めると言うチート演算はないので割り算で取り出したい桁を1の位にする → それ以上の桁がなくなるまで10で引く
という処理をやっています。
前者は対応するやつで割ればいいだけです。1000とか100とか10とか。
後者の部分はマクロでいえば
\@a = \@loop \relax
\@whilenum \@a > 9 \do{%
    \advance\@a by -10 \relax
}
というところです。
剰余というのは言いかえれば割る数字より小さくなるまで減算するという処理です。
そのためひたすら10で引いてます。これが10の剰余にあたります。

さて,これで求めたい桁の数字が取り出せます。
そしたら次は対応する漢数字にしてやりましょう。

3-2. \ifcase で条件分岐(ループ回数(数字) -> 漢数字)
\ifcase でカウンタ\@aの値を判定しています。
\ifcase ならば,<\@a = 0> \or <\@a=1> \or ...
といった風に,0ならばこの処理,1ならばこの処理といった具合にカウンタの数値と処理の順番が対応しています。
これを利用して "カウンタが0ならば何もしない","カウンタが1~9ならば対応する漢数字をマクロ \@list に追加する" という処理にしています。
\@list はカウンタと同じように @ つきのものですが,マクロです。
こいつは \@list と書かれた部分があると,定義された処理で置換します。
つまりは,\@list には文字列を入れてあるので,そいつを表示するだけです。

3-3. \ifcase で条件分岐(ループ回数(数字) -> あるふぁべっと)
さて,今度はループ回数からあるふぁべっとに変換します。
Alphabetは26個しかないので当然,\ifcase で判定する数値も1~26の範囲で想定しましょう。
26個の分岐処理を作るのが面倒臭い?頑張ってください。
その気になれば,似たようなもので "ひらがなとカタカナの相互変換" マクロだって作れますよ。
(LaTeXで "千反田える" してみた(1) 参考webページ [3] 参照)

さて,ここでも各桁の数字を取り出すときと同じような処理をしています。
ループカウンタが "26より大きいならば" 26より小さくなるまで26で引き続けるという処理です。
ここが大事な処理でして,プログラミングで言うならば "26で剰余を取った後,演算結果に1を加える" に相当します。
この処理は各桁の数値を取り出す部分の10を26に変えればいいだけです。

3-4. 変換結果を表示する
さて,頑張ってループ回数からループで各桁の数字を取り出して漢数字に変換し,再びループ回数からループで今度はあるふぁべっとに変換し,ついに \@list の中身は "xxx反田 ..." になりました!
よくぞ頑張りました。あとはその変換結果を表示するだけです。
表示処理はこちら!
\@list
なんだかあっけないものですね。この一行だけで終わりです。
あとはループ回数のカウンタ \@loop に1を加えて再びループ判定に戻りましょう。

さて,マクロの流れの解説はこれで終わりです。
お疲れさまでした。

皆様もよきLaTeX Life をお送りください。

(次:LaTeXで "千反田える" してみた(4))

○追記(2012/11/10)
見出しを太字にし、リンクを追加しました。

0 件のコメント:

コメントを投稿