あべのりさんがとっても楽しそうなことをやっておられるのを見て、対抗したくなって、取りあえず \NabeAzzX (X、つまり完全展開可能な方)を作ってみた。
\documentclass{article} \usepackage{type1cm} \usepackage{xparse,l3str} \ExplSyntaxOn %------------------------ %% \zrxxnz_x_main:n {<整数>} % \NabeAzzX のメイン. \cs_new:Nn \zrxxnz_x_main:n { \prg_stepwise_function:nnnN { 1 } { 1 } {#1} \zrxxnz_process_step:n } %% \zrxxnz_process_step:n {<整数>} % <整数> に対する出力. \cs_new:Nn \zrxxnz_process_step:n { \bool_if:nTF { \zrxxnz_int_is_aho_p:n {#1} } { % アホな数の場合 {\AhoFont <数>} を出力する { \AhoFont \int_to_arabic:n {#1} } } { % それ以外は数字のみを出力する { \int_to_arabic:n {#1} } } \c_space_tl % 空白文字 } %% \zrxxnz_int_is_aho_p:n {<整数>} % <整数> がアホな数であるか. \cs_new:Nn \zrxxnz_int_is_aho_p:n { \bool_if_p:n { % 真理値の式 % 3 で割った余りが 0 \int_compare_p:nNn { \int_mod:nn {#1} { 3 } } = { 0 } || % または十進表記に文字「3」を含む \str_if_contains_char:nNTF { \int_to_arabic:n {#1} } 3 { \c_true_bool } % true / false を返すことで { \c_false_bool } % "p" 形式と同じになる } } %%<*> \NabeAzzX {<整数>} \cs_new_eq:NN \NabeAzzX \zrxxnz_x_main:n \ExplSyntaxOff %------------------------ %% \AhoFont の定義を与える. \NewDocumentCommand \AhoFont {} {% \usefont{OT1}{cmfr}{m}{it}\LARGE } % ※ xparse の命令で定義される命令は常に protected であり, % 従って \edef で展開されない. \begin{document} % 一旦完全展開してから実行する \edef\result{\NabeAzzX{40}} %\show\result \result \end{document}
\show
を有効にして \result
の中身を表示してみる。
> \result=macro: ->1 2 {\AhoFont 3} 4 5 {\AhoFont 6} 7 8 {\AhoFont 9} 10 11 {\AhoFont 12} {\AhoF ont 13} 14 {\AhoFont 15} 16 17 {\AhoFont 18} 19 20 {\AhoFont 21} 22 {\AhoFont 2 3} {\AhoFont 24} 25 26 {\AhoFont 27} 28 29 {\AhoFont 30} {\AhoFont 31} {\AhoFon t 32} {\AhoFont 33} {\AhoFont 34} {\AhoFont 35} {\AhoFont 36} {\AhoFont 37} {\A hoFont 38} {\AhoFont 39} 40 .
(注意) expl3 は e-TeX 拡張を前提とする。なので、(展開可能な)算術演算は単に \numexpr
を用いて行っている。別に常軌を逸したことを中でやっているのではない。
それにしても、「難解な TeX 言語を用いて、新たに奇怪な容貌のプログラム言語を作る」というのは、いかにもアレやらコレやらと同じネタの匂いが漂う。しかしそれでも私は信じたい。LaTeX3 Team が作ろうとしているのは壮大なネタではなく LaTeX であると。