2012/11/06

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

~概略~

1. すべての始まり
一体どういう流れで見つけたのかすらも忘れてしまったのですが,LaTeXで計算をやってしまおうというブログ記事を見つました[1]
最初,それを見た私はLaTeXで計算をやらせると言うよりはそのために使われてる命令が気になったので調べようと思いました。
ループ構文の方は苦戦しましたが[2]

んで,いろいろ調べていたらひらがなをカタカナに変換するというマクロを見つけました[3]

そこで私はひらめいたのです。
以前C言語でつくったけど挫折したあれ,できるんじゃないかと。

2. 必要な知識
LaTeXでマクロを作りました。
必要なコマンドの知識は次の通りです。
  • 自作マクロが定義できる
  • \newcount でカウンタが作れる
  • 作ったカウンタに数値の代入,四則演算ができる
  • \@whilenum でループが作れる
  • \ifcaseを使って条件分岐ができる
こんなことは既に知っている,という人はソースコードを見てみればいいと思います。
分からないから解説が欲しい,という人はこれから解説記事を書くので,そちらを見ればいいと思います。

3. 出来上がったもの
さて,私がつくって出来上がったソースコードが以下です。
\documentclass{jsarticle}
\makeatletter
% えるたそマクロ
\def\eltaso#1{%
% カウンタの定義
\newcount\@a % ループ回数からの算出用
\newcount\@loop % ループ回数カウント
\newcount\@limit % ループ回数上限(引数+1を代入)
% カウンタへの数値設定
\@loop = 1 \relax % 1を代入
\@limit = #1 \relax % 引数を代入
\advance\@limit by 1 \relax % 1を足す
% 引数の回数だけループ
\@whilenum \@loop<\@limit \do{%
    % マクロ定義({}内の文字を展開)
    \edef\@list{反田}
    % 各桁の数字を抽出
    \@a = \@loop \relax
    % 9より大きいなら10で引く
    % これを9より大きいという条件が満たされている間続ける
    \@whilenum \@a > 9 \do{%
        \advance\@a by -10 \relax
    }
    % \@aの数値で処理を分岐
    \ifcase\@a \or
        \edef\@list{一\@list} \or
        \edef\@list{二\@list} \or
        \edef\@list{三\@list} \or
        \edef\@list{四\@list} \or
        \edef\@list{五\@list} \or
        \edef\@list{六\@list} \or
        \edef\@list{七\@list} \or
        \edef\@list{八\@list} \or
        \edef\@list{九\@list}
    \fi
    \@a = \@loop \relax
    \divide\@a by 10 \relax
    \@whilenum \@a > 9 \do{%
        \advance\@a by -10 \relax
    }
    \ifcase\@a \or
        \edef\@list{十\@list} \or
        \edef\@list{二十\@list} \or
        \edef\@list{三十\@list} \or
        \edef\@list{四十\@list} \or
        \edef\@list{五十\@list} \or
        \edef\@list{六十\@list} \or
        \edef\@list{七十\@list} \or
        \edef\@list{八十\@list} \or
        \edef\@list{九十\@list}
    \fi
    \@a = \@loop \relax
    \divide\@a by 100 \relax
    \@whilenum \@a > 9 \do{%
        \advance\@a by -10 \relax
    }
    \ifcase\@a \or
        \edef\@list{百\@list} \or
        \edef\@list{二百\@list} \or
        \edef\@list{三百\@list} \or
        \edef\@list{四百\@list} \or
        \edef\@list{五百\@list} \or
        \edef\@list{六百\@list} \or
        \edef\@list{七百\@list} \or
        \edef\@list{八百\@list} \or
        \edef\@list{九百\@list}
    \fi
    \@a = \@loop \relax
    \divide\@a by 1000 \relax
    \ifcase\@a \or
        \edef\@list{千\@list} \or
        \edef\@list{二千\@list} \or
        \edef\@list{三千\@list} \or
        \edef\@list{四千\@list} \or
        \edef\@list{五千\@list} \or
        \edef\@list{六千\@list} \or
        \edef\@list{七千\@list} \or
        \edef\@list{八千\@list} \or
        \edef\@list{九千\@list}
    \fi
    \@a = \@loop \relax
    \@whilenum \@a > 26 \do{%
        \advance\@a by -26 \relax
    }
    \ifcase\@a \or
        \edef\@list{\@list えー } \or
        \edef\@list{\@list びー } \or
        \edef\@list{\@list しー } \or
        \edef\@list{\@list でー } \or
        \edef\@list{\@list いー } \or
        \edef\@list{\@list えふ } \or
        \edef\@list{\@list じー } \or
        \edef\@list{\@list えいち } \or
        \edef\@list{\@list あい } \or
        \edef\@list{\@list じぇー } \or
        \edef\@list{\@list けー } \or
        \edef\@list{\@list える } \or
        \edef\@list{\@list えむ } \or
        \edef\@list{\@list えぬ } \or
        \edef\@list{\@list おー } \or
        \edef\@list{\@list ぴー } \or
        \edef\@list{\@list きゅー } \or
        \edef\@list{\@list あーる } \or
        \edef\@list{\@list えす } \or
        \edef\@list{\@list てぃー } \or
        \edef\@list{\@list ゆー } \or
        \edef\@list{\@list ぶい } \or
        \edef\@list{\@list だぶりゅー} \or
        \edef\@list{\@list えっくす } \or
        \edef\@list{\@list わい } \or
        \edef\@list{\@list ぜっと }
    \fi
    \@list
    \advance\@loop by 1 \relax
    }
}
\makeatother
\begin{document}
\eltaso{1000}
\end{document}
こいつをコンパイルして得た結果(dviファイル)がこちらです。

25ページを費やしました。
二段組みにはしてないので,割ともったいない感じです。
一反田えー からはじまって 千反田える まで25ページです。

○参考にしたwebページ一覧
[1] プログラマーのためプログラミングLaTeX - プログラムモグモグ
http://d.hatena.ne.jp/itchyny/20121027/1351299600
これを見たのが始まり,かな。

[2] TeX のループ構文 - マクロツイーター
http://d.hatena.ne.jp/zrbabbler/20110828/1314537300
ループ構文で調べてみてみたものの,眺めた程度ですすいません

[3] メモ帳/TeXマクロ2 - MyTeXpert
http://mytexpert.sourceforge.jp/index.php?%A5%E1%A5%E2%C4%A2%2FTeX%A5%DE%A5%AF%A5%ED2
ここにあるひらがなをカタカナに変換するマクロを見て千反田えるしようと思いました。

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

○追記(2012/11/10)
大した修正はやっていませんが,文を少しと節見出しを○と太字にしました。
それと追記に書いていたソースコードを本文中に移動しました。

ところで,TeXの場合はソースコードと言う呼び方でいいんだろうか?

1 件のコメント: