(前回の続き)
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:まだ言うか。