読者です 読者をやめる 読者になる 読者になる

LISP on TeX で千反田えるな話(3)

元ネタ:"LaTeXで "千反田える" してみた(1):概略"

さて,LISP on TeX の時間である.
といっても,プログラム的には簡単なので,今回はpTeX限定な命令を使ってやってみたがメイン.漢数字にするマクロ部分に,pTeXプリミティブ\kansujiを使ってみた.

\kansujiは

 \kansuji 1234

のようにして使う.結果は「一二三四」に展開される.TeXでいうところの\romannumeralとか\numberと同じ用法.
0,1,...,9に使う文字は設定可能で,デフォルトは〇,一,…,九.この出力に「千」や「百」,「十」を入れるようなマクロを書いた.

結果はこちら

\documentclass{jsarticle}
\pagestyle{empty}
\usepackage{lisp}
\lispinterpl{%
(\define \alphlist
  (\quote ( 'ぜっと' 'えー' 'びー' 'しー' 'でぃー' 'いー' 'えふ' 'じー' 'えいち' 'あい'
 'じぇー' 'けー' 'える' 'えむ' 'えぬ' 'おー' 'ぴー' 'きゅー' 'あーる' 'えす' 
  'てぃー' 'ゆー' 'ぶい' 'だぶりゅー' 'えっくす' 'わい')))
(\define \strofkananum (\lambda (\n) (\ith \n \alphlist)))
(\define \ith (\lambda (\n \lst) 
  (\lispif (\= \n :0)
    (\car \lst) (\ith (\- \n :1) (\cdr \lst)))))
(\define \erutaso (\lambda () (\erutasobody :1)))
(\define \erutasobody (\lambda (\n)
(\lispif (\= \n :1001) ()
    (\begin
      (\texprint '\tanda')
      (\texprint (\group (\strOfInt \n)))
      (\texprint (\strofkananum (\modulo \n :26)))
      (\lispif (\= \n :1000) () (\texprint '\\'))
      (\immediatewrite)
      (\erutasobody (\+ \n :1))))))
(\define \modulo (\lambda (\n \m) (\- \n (\* \m (\/ \n \m)))))
}
\newcount\cnttanda
\def\tanda#1{%
  \cnttanda#1\relax \advance\cnttanda10000\relax
  \expandafter\tandawrite\the\cnttanda}
\def\tandawrite#1#2#3#4#5{%
  \if0#2\else\if1#2\else\kansuji#2\fi\fi
  \if0#3\else\if1#3\else\kansuji#3\fi\fi
  \if0#4\else\if1#4\else\kansuji#4\fi\fi
  \if0#5\else\kansuji#5\fi
  反田}
\begin{document}
\noindent\lispinterpl{(\erutaso)}
\end{document}

ほぼLISP(またか).出力は元ネタと同じ.

なお,このコードはいつもどおりリポジトリにおいておいた.