マクロツイーター

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

LaTeX 上で色々と実装してみる話(ナベアツ編-4)

前回の続き)
PythonTeX(pythontex パッケージ)
(参照:アレ

PythonTeXLaTeX 上で Ruby のコードを動作させるためのパッケージである*1。詳しくはリンク先の記事を参照のこと。

[nabeazz-pythontex-ruby.tex]
\documentclass[a4paper]{article}
\usepackage[usefamily=ruby]{pythontex}
\usepackage{type1cm}
\newcommand*{\AhoFont}[1]{{\usefont{OT1}{cmfr}{m}{it}\LARGE #1}}
\newcommand{\NabeAzz}[1]{\rubyc{nabeazz(#1)}}
\begin{rubycode}
def nabeazz(n)
    1.upto(n).each do |i|
        puts((i % 3 == 0 || i.to_s =~ /3/) ? "\\AhoFont{#{i}}" : i)
    end
end
\end{rubycode}
\begin{document}
\NabeAzz{40}
\end{document}

コンパイルの手順は以下の通り。LaTeX コマンド → pythontex コマンド → LaTeX コマンドの順に実行する。(エンジンは pdflatex 以外も可能。)

pdflatex nabeazz-pythontex-ruby
pythontex nabeazz-pythontex-ruby
pdflatex nabeazz-pythontex-ruby

この手順から想像できるように、PythonTeX では基本的に外部ファイルを用いて Ruby(とか)処理系と TeX 処理系の連携を実現している。

PythonTeX で Ruby じゃなくて Python

いい加減にしないと Python 屋に怒られそうなので、Python してみる。

[nabeazz-pythontex.tex]
\documentclass[a4paper]{article}
\usepackage{pythontex}
\usepackage{type1cm}
\newcommand*{\AhoFont}[1]{{\usefont{OT1}{cmfr}{m}{it}\LARGE #1}}
\newcommand{\NabeAzz}[1]{\pyc{nabeazz(#1)}}
\begin{pycode}
def nabeazz(n):
    for i in range(1, n + 1):
        if i % 3 == 0 or '3' in str(i):
            print(r"\AhoFont{%d}" % i)
        else:
            print(i)
\end{pycode}
\begin{document}
\NabeAzz{40}
\end{document}

コンパイル手順は先の Ruby の場合と全く同じである。なお、PythonTeX は Python の 2 系(2.7 版)と 3 系(3.2 版以降)の両方をサポートする。Python 2.7 版で実行する場合でも Python 3 の print() 関数が利用できるので、((既定では、__future__ モジュールから unicode_literals 以外のものがインポートされる。パッケージの pyfuture オプションで __future__ のインポートを制御できる。))上のソースは 2.7 版でも 3.x 版でも通用する。

*1:まだ言うか。