Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2011-12-31

展開可能なナベアツ(\NabeAzzX)の回答例

「完全展開可能なナベアツ」の plain TeX での実装の例。もちろん e-TeX 拡張は不要である。

\catcode`@=11 %-------------------------
\newcount\nax@n
\def\nax@esc@if#1\fi#2\nax@end@if{\fi#1}
%
\def\nax@t{}\let\nax@x=\relax
\nax@n=0 \loop 
  \expandafter\let\csname nax@tly/\the\nax@n\endcsname\nax@t
  \edef\nax@pre{\the\nax@n}%
  \advance\nax@n1 \edef\nax@t{\nax@t\nax@x}%
  \expandafter\edef\csname nax@suc/\nax@pre\endcsname{\the\nax@n}%
\ifnum\nax@n<10 \repeat
\expandafter\def\csname nax@tly/3\endcsname{\nax@blow}
\expandafter\def\csname nax@suc/9\endcsname{0}
%
\def\nax@step#1;{%
  \nax@step@a1#1;;;;}
\def\nax@step@a#1#2{% <nine><digit>
  \expandafter\expandafter\expandafter
   \nax@step@b\csname nax@suc/#2\endcsname#1#2}
\def\nax@step@b#1#2#3{% <succ><nine><digit>
  \expandafter\expandafter\expandafter
   \nax@step@c\csname nax@tly/#3\endcsname;#1#2#3}
\def\nax@step@c#1;#2#3#4{% <tally><succ><nine><digit>
  \ifnum#3#4=19 \nax@esc@if \nax@step@d#1;01#4\fi
  \ifnum#3=1 \nax@esc@if \nax@step@d#1;#20#4\fi
  \iftrue \nax@esc@if \nax@step@d#1;#40#4\fi
  \nax@end@if}
\def\nax@step@d#1;#2#3#4#5;#6;#7;#8;{%
  \nax@step@e#3#5;#6#1;#7#2;#4#8;}
\def\nax@step@e#1#2;{%
  \if @#2@\nax@esc@if \nax@step@f#10;\fi
  \iftrue \nax@esc@if \nax@step@a#1#2;\fi
  \nax@end@if}
\def\nax@step@f#10#2;#3;#4;#5;{%
  \nax@process#3;#5;#4#1;}
%
\def\nax@process#1;#2;#3;#4;{%
  \nax@print#1;#2;\space
  \ifnum#2=#4 \nax@esc@if \fi
  \iftrue \nax@esc@if \nax@step#3;#4;\fi
  \nax@end@if}
%
\def\nax@print#1;#2;{%
  \ifnum \nax@resolve#1\nax@blow;>0 {\AhoFont#2}%
  \else #2%
  \fi}
\def\nax@resolve#1\nax@blow#2;{%
  \ifx @#2@\nax@esc@if #1100\fi
  \iftrue \nax@esc@if 1\fi
  \nax@end@if}
\def\nax@x#1#2{}
%
\def\NabeAzzX#1{%
  \nax@step1;#1;}
\catcode`@=12 %-------------------------

\font\AhoFont=cmfi10 scaled \magstep2
\edef\result{\NabeAzzX{40}}
%\show\result
\result
\bye
f:id:zrbabbler:20111231234142p:image

展開可能であることを示すために、一旦 \edef で展開させてから実行している。さらに、\edef の直後の \show を実行して結果が正しいか確認する。

> \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 .
l.60 \show\result

? x

というわけで、今年の TeX ネタはこれでお終い。来年も楽しい TeX ネタがいっぱい現れるように…。そういえば、確か TeX組版もできたはずなので、こちらの方面での話題にも期待。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証