2012/11/07

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

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

~一人反省会,あるいは大反省会~

1. あらすじ
できたので意気揚々とソースコードを公開したものの,動作に支障が出ないけどミスを発見した。
そういうわけで,あわててソースコードを修正,その後反省会へと移行したのであった。

2. 詳細
千反田えるマクロをつくってコンパイルした時「\ifcaseで用意された分岐が足りないんだけど」というエラーが出たので,とりあえず分岐を1個増やして対応(この時点でバグがあったことを放置してたわけだが)。
無事コンパイルできたし,所望の出力が得られたのでよしとした。

ところが,改めて眺めてみると,エラーの原因が各桁の数値を取り出す処理にあったことが判明
\@whilenum \@a > 10 \do{%
    \advance\@a by -10 \relax
さて,この処理のループ条件に問題があったわけだ。
ループ条件は "\@a > 10" つまりカウンタ\@aの値が10より大きいならループを続けるというもの。
今になって思えば,\@aが0~9のときにループを抜けてほしいのだが,\@a=10でもループを抜けるのである。
これがエラーの原因だったわけで,0~9までしか分岐を想定してないのに,
10を与えているから\ifcaseの分岐の数が足りないと言われたのである。
修正したら無意味な分岐は不要になったのでこれで一安心

3. なぜ正常?な動作をしていたか
\@a=0の処理が常時\@a=10の時に処理されたからである。
そういうわけで,\@a=0のときは何もしないという処理はずっと実行されないままだったのだ。

4. 終わりに
ソースコードは修正しました。
無着色,無添加なので(?)安心して使ってください。

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

○追記(2012/11/08)
どうやら私のようなひよっこが遊んでいたのを私よりもずっとハイレベルな方の目に留まってしまったようです(いわゆる "TeXnician" という人だと思います。決して "TeXpert" ではありません!)。
ブログ記事の題材として取り上げてもらい,どうしてこうなった!としか言えませぬ。
それでも TeX でプログラミングしたい人のための何か (2) - マクロツイーター

ちなみに,これの前の記事
それでも TeX でプログラミングしたい人のための何か (1) - マクロツイーター
では特に用心すべきこととして
  • TeX はフリーフォーマットじゃない
  • ローカル変数なんてものはない
  • 関数に相当するものは(普通は)ない
  • 引数パラメタ(#1 等)は実際に渡されたものの別名である
と書かれており,「これ(2個目以降)はきっと私のことだな」と思いながら,自分の書いた文を見返しております。
ソースにも "カウンタ(変数)" というあやしい表記をしており,理解を深めるべきであるとのお告げが聞こえます。

(氏がこのような記事を書いたのは,タイミングを考えると,私のようなひよっこが手を出したからではなかろうかと思っており,軽率であったと反省の意を示したく…)

LaTeXで "千反田える" してみた(1):概略 でも参考webページとして紹介したブログ記事の追記でも取り上げて頂きました。
プログラマーのためプログラミングLaTeX - プログラムモグモグ

あ,はい。よくもわるくも,全ての元凶はあなたの記事です(

○追記(2012/11/10)
時間を見つけて記事は随時修正していきます。
修正したら、こうして追記として最後に加えておきます。

0 件のコメント:

コメントを投稿