マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

TeX なんかやめて expl3 を使えば!?

あべのりさんとっても楽しそうなことをやっておられるのを見て、対抗したくなって、取りあえず \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 であると。