何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

PythonTeX で王様の夢を紡ぐ

昔者荘周夢に胡蝶と為る。栩栩然として胡蝶なり。
自ら喩しみて志に適えるかな。周たるを知らざるなり。 俄然として覚むれば、則ちまぎれもなく周なり。
知らず、周の夢に胡蝶と為れるか、胡蝶の夢に周と為れるかを。
周と胡蝶とは、則ち必ず分有らん。此を之れ物化と謂う。


それは胡蝶の夢だろ、というツッコミを期待しつつ、PythonTeXでフラクタルの一種である王様の夢を書いてみる。正確にはPythonとPILで王様の夢を書き、それをLaTeXの文章に埋め込むという流れを一発で行う。

細かいことはともかく次のLaTeXファイルをPythonTeXで処理すればよい。

\documentclass[a4j]{jsarticle}
\usepackage{amsmath,amssymb}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[dvipdfmx]{graphicx}

\usepackage[makestderr]{pythontex}
\restartpythontexsession{\thesection}

\usepackage[framemethod=TikZ]{mdframed}

\begin{document}
\title{PythonTeX で王様の夢を紡ぐ}
\author{Xaro}
\date{\today}
\maketitle
\begin{equation*}
\begin{split}
&f: \mathbb{R}^{2} \ni (x, y) \mapsto (\sin(by) + c\sin(bx), \sin(ax) + d\sin(ay)) \in \mathbb{R}^{2}, \\
&\text{where}\;a = -0.966918, b = 2.879879, c = 0.765145\; \text{and}\; d = 0.744728.
\end{split}
\end{equation*}
\begin{pycode}
# -*- coding: UTF-8 -*-
from math import sin
from PIL import Image
from PIL import ImageDraw

def drawing(img):
    xsize,ysize = img.size
    a = -0.966918
    b = 2.879879
    c = 0.765145
    d = 0.744728
    oldx = 0.1
    oldy = 0.1
    draw = ImageDraw.Draw(img)
    for i in range(pow(10,5)):
        newx = sin(oldy*b) + c*sin(oldx*b)
        newy = sin(oldx*a) + d*sin(oldy*a)
        oldx = newx
        oldy = newy
        draw.point(
            (oldx * 180 + xsize // 2, oldy * 200  + ysize // 2),
            (0xff,0xff,0xff)
                   )

    return img

def make_image(screen, bgcolor, filename):

    img = Image.new('RGB', screen, bgcolor)

    img = drawing(img)
    img.save(filename)

if __name__ == '__main__':
    # 画像のサイズ
    screen = (800,600)

    # 画像の背景色(RGB)
    bgcolor=(0x00,0x00,0x00)

    # 保存するファイル名(ファイル形式は、拡張子から自動的に判別する)
    filename = "kings3.pdf"

    make_image(screen, bgcolor, filename)

\end{pycode}
\begin{figure}[h]
\centering
\includegraphics[width=12cm, clip]{kings3.pdf}
\caption{King's Dream}
\end{figure}
\end{document}

なお処理方法は

$ platex -kanji=utf8 -interaction=nonstopmode kingsdream.tex
$ pythontex kingsdream.tex
$ platex -kanji=utf8 kingsdream.tex
$ dvipdfmx kingsdream.dvi

である。
なお -interaction=nonstopmode はエラーを無視するオプションなので気をつけること。

上手くいけばこのようなPDFファイルが作成できるはずである。
f:id:XaroCydeykn:20131009001110j:plain


様々なところから引用したのを自分の記事にするのは気が引けるが引用元を提示することで免じてもらいたい。
王様の夢自体はAmazon.co.jp: Chaos in Wonderland: Visual Adventures in a Fractal World: Clifford A. Pickover: 洋書
王様の夢のプログラムはMike Hewner's Homepage » Blog Archive » Making Simple Fractals in R
PILの部分はPIL(Python Imaging Library)で、点を描画するサンプル。 - Qiita [キータ]
胡蝶の夢Amazon.co.jp: 荘子 内篇 (講談社学術文庫): 福永 光司: 本
オリジナリティがあるとすればPythonTeXでマンデルブロ集合やジュリア集合以外のフラクタルを書こうと思い立ったことぐらいである。