何かを書き留める何か

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

1つのTeXファイルから2つのPDFファイルを作る -TeX & LaTeX Advent Calendar 2013-

TeX & LaTeX Advent Calendar 2013のために書かれた記事です。
<12月4日:senopen||12月6日:Xaro Cydeykn>

1つのTeXファイルからは普通1つのdviファイルまたはpdfファイルが作成される。今回はPythonTeXを駆使してその常識をぶち破ることを試みる。ファイル名をTeXAdvent.texとする。(2013年12月08日追記:コメントに従って一部修正しました。)

\documentclass{ltjsarticle}
\usepackage{amsmath}
\usepackage{lmodern}
\usepackage[ipaex]{luatexja-preset}
\usepackage{luatexja-otf}
\usepackage[makestderr]{pythontex}

\begin{pycode}
import os
TeXmas = r"""
\documentclass{ltjsarticle}
\usepackage{amsmath}
\usepackage{lmodern}
\usepackage[ipaex]{luatexja-preset}
\usepackage{luatexja-otf}
\begin{document}
日本で漱石が「吾輩は猫である」を発表したころ,
ドイツでは Albert Einstein が特殊相対論を発表した。

この理論によれば,エネルギー $E$ と質量 $m$\begin{equation}
  E = mc^{2}
\end{equation}
で関係づけられる。ここに $c$ は光速で,
\begin{equation}
  c = 299{,}792{,}458 \, \mathrm{m/s}
\end{equation}
である。

\end{document}
"""
# ディレクトリの作成
try:
    os.mkdir("./testdir")
except FileExistsError:
    pass

# TeXファイルの作成
os.chdir("./testdir")
with open("./MerryTeXmas.tex", 'w', buffering=1, encoding="UTF-8",) as f:
    f.write(TeXmas)
    #f.close() with文なので不要

# pdfTeXの実行
os.system(r"lualatex MerryTeXmas.tex")
\end{pycode}

\begin{document}
TeX \& LaTeX Advent Calendar 2013 !

\begin{equation}
  \frac{\pi}{2} =
  \left( \int_{0}^{\infty} \frac{\sin x}{\sqrt{x}} dx \right)^2 =
  \sum_{k=0}^{\infty} \frac{(2k)!}{2^{2k}(k!)^2} \frac{1}{2k+1} =
  \prod_{k=1}^{\infty} \frac{4k^2}{4k^2 - 1}
\end{equation}

\end{document}

後はいつも通り

$ platex TeXAdvent.tex
$ pythontex TeXAdvent.tex

のように実行すると不思議な*1ことに1つのファイルからpdfファイルが2つ生成される。ちなみに2つめのpdfファイルはTeXAdvent.texのあるディレクトリにあるはずのPythonTeXのフォルダ内にある。なんの役に立つのか、例えばテストを組版するときに解答ありとなしを同時に組版で出来る(しかも計算もSymPyにやらせることも可能!)というメリットが存在する可能性がある*2ので、きっといつか誰かの役に立つと思いたい。
この例から分かることとして

  • LuaLaTeXでもPythonTeXは動作する(pdfLaTeX、XeLaTeXでも動作するはず)
  • PythonTeXを使用した際のホームディレクトリはそのTeXファイルのあるディレクトリに作成される。
  • os.system("command") で任意のコマンドが実行できてしまうので考え無しに実行するのは危険

がある。
なお、上記の例ではLuaLaTeXを用いている。導入方法の例として手前味噌ではあるが電通大生のためのLuaLaTeX -UEC Advent Calendar 2013- - 何かを書き留める何かを参照して欲しい。

*1:わかってやっているので不思議でもなんでもない

*2:実際にテストの解答ありなしの組版を行う場合はcommentパッケージを使うことを薦めます