(前回の続き)
PythonTeX(pythontex パッケージ)
(参照:アレ)
PythonTeX は LaTeX 上で Ruby のコードを動作させるためのパッケージである*1。詳しくはリンク先の記事を参照のこと。
\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:まだ言うか。