(前回の続き)
字形がランダムに決まるフォント!
何かアレな予感がしたのでちょっとソースを覗いてみた。
def nearly(expr x,dx) = mg*(x - dx + uniformdeviate 2*dx) enddef;
うむ。uniformdeviate
演算子……、要するに、乱数である。((ちなみに pdfTeX の拡張プリミティブに \uniformdeviate
というのがあるが、これの名前を真似ているのだと思う。))
% As the characters are meant to be hand-drawn, a degree of randomness % has been incorporated.
まあそういうことのようだ。そんなこんなで、全部解読するのに 30 分くらいかかった。*1ずっと画像を見つめ続けて疲れた……。
本当に踊るフォント!
dancers.mf が変態なフォントであることが判ったので、何かもっと変態なことができないか、と考えた。*2そして思いついたのが例のネタである。
踊る画像を作るためのスクリプトを公開しておく。
- tcdancers.pl (Gists/zr-tex8r)
原理は非常に単純。
- dancers フォントを用いた「PDF 画像出力用の」LaTeX 文書を作る。
- dancers.mf を TeX から見える場所に置く。
- 以下を適当な回数繰り返す:
- dancers の PK フォントファイルが存在しない状態にする。
- LaTeX 文書を pdflatex で組版する。この時に PK ファイルが無いので METAFONT が起動して自動生成される。
- 出力 PDF ファイルを ImageMagick で PNG 画像に変換する。フォントがランダムなので、毎回“少しずつ違った字形”の画像ができる。
- 再び ImageMagick で複数 PNG 画像をアニメ GIF 画像に変換する。
蛇足事項:
- 最初は dvipng を試していたのだが、これはフォントのアンチエイリアスのため指定値よりも大きな解像度で PK フォントを作るようである。当然、dancers.mf では正しい出力にならない。
- PK ファイル dancers.300pk が既に TeX ツリーの中に存在していると厄介なので、予め dancers.mf を別名でコピーしている。
- METAFONT の乱数の種は現在日時の値を元に設定されるようである。ところが、この日時が“分”までしか見ていない((METAFONT も TeX と全く同じ名前(
yaer
、time
等)の現在日時変数がある。つまり、分までしか取得できない。))ため、バッチ処理を行うと「前回と同じもの」が大量に出現してしまう。これを回避するために、各ループで Perl で乱数*3を発生させた上で、dancers.mf を別名でコピーする際に「randomseed := (値);
」の行を先頭に追加して、毎回異なる乱数種が使われるようにした。
おまけ:ランダムでない dancers
dancers.mf の先頭に次の行を追加するとランダムでなくなる。*4
vardef uniformdeviate primary x = x / 2 enddef;
というわけで、踊る人形たちの“標準的な姿”を以下に示しておく。
なお注意であるが、f、j、k、q、u、w、x、z の文字(上図で灰色のもの)は“元ネタ”には登場しない。これらはフォントの作者が勝手に創り出したものである。