【淀みなく宣伝】
2012/12/01 〜 2012/12/25TeX & LaTeX Advent Calendar
こちらはいたって平常運行。
* * *
(前回の続き)
\tcln@zeropad の実装
基本的に、「関数のようなものを(1)」で紹介されているロジック(「それでも(14)」でも利用した)をここでも利用する。ただし今回は 12 桁で表すので単純に考えると 14 個の引数が必要になってしまい、TeX で可能な上限の 9 個を超えてしまう。
% ((num.."/00000000000"):sub(1,13):gsub("^(.*)/(.*)$","%2%1"))
\def\tcln@zeropad#1\relax{% #1 は10進表記
\tcln@zeropad@A#1/00000000000\relax
}
% ↓引数が14個(実際には無理)
\def\tcln@zeropad@A#1#2#3#4#5#6#7#8#9#A#B#C#D#E\relax{%
\tcln@zeropad@B#1#2#3#4#5#6#7#8#9#A#B#C#D\relax % 最初の13文字を残したい
}
\def\tcln@zeropad@B#1/#2\relax{%
#2#1%
}そこで、「最初の 9 個の引数」を一旦グループにして後で再びバラすというトリックを用いることにする。
\def\tcln@zeropad#1{%
\tcln@zeropad@a#1/00000000000\relax
}
\def\tcln@zeropad@a#1#2#3#4#5#6#7#8#9{%
\tcln@zeropad@b{#1#2#3#4#5#6#7#8#9}% 最初の9個をグループにする
}
% #1が最初の9文字、#2は10文字目、#5は13文字目、#6は14文字目以降
\def\tcln@zeropad@b#1#2#3#4#5#6\relax{%
\tcln@zeropad@c#1#2#3#4#5\relax % これで最初の13文字を並べたことになる
}
\def\tcln@zeropad@c#1/#2\relax{%
#2#1%
}\tcln@kanji の実装
まずは 4 桁のブロックの処理を書こう。規則*1さえきちんと理解していれば簡単である。なお、4 桁が「0000」である場合はブロック全体を無出力とすべきだが、数字列が「0000」であるかの判定は、「数値と見做して値が 0 と等しいか」とすればよい。((代入が禁止されているので \ifx でやろうとしても上手くいかない。))
%% \tcln@onepos3{十} → 三十 ; \tcln@onepos0{百} →(空)
\def\tcln@onepos#1#2{%
\ifcase#1 \or #2\else \csname tcln@digit/#1\endcsname#2\fi
}
%% \tcln@block{0103}{万} → 百三万 ; \tcln@block{0000}{億} →(空)
\def\tcln@block#1#2{%
% #1が0000なら無出力
\ifnum#1>0 \tcln@block@a#1#2\fi % #2はそのまま出力
}
\def\tcln@block@a#1#2#3#4{%
\tcln@onepos#1{千}\tcln@onepos#2{百}%
\tcln@onepos#3{十}\csname tcln@digit/#4\endcsname
}% tcln@digit/0 は空であることに注意\tcln@block ができてしまうと \tcln@kanji の実装も容易である。
%% 丁度12桁の数字列を漢数字に変換する
\def\tcln@kanji#1#2#3#4#5#6#7#8#9#A#B#C{%
\tcln@block{#1#2#3#4}{億}%
\tcln@block{#5#6#7#8}{万}%
\tcln@block{#9#A#B#C}{}%
}おっと、また引数が 9 個を超えてしまった。なので処理を途中で分ける。
%% \tcln@kanji{000100000009} → 一億九
\def\tcln@kanji#1#2#3#4{%
\tcln@block{#1#2#3#4}{億}\tcln@kanji@a
}
\def\tcln@kanji@a#1#2#3#4#5#6#7#8{%
\tcln@block{#1#2#3#4}{万}\tcln@block{#5#6#7#8}{}%
}*1:百の位が 2 なら「二百」、1 なら「百」、0 なら出力無しにする、等。