time.styとは\nowコマンドを提供するスタイルファイルである。\nowコマンドは時刻を出力するもので12:34amのような出力を得る。簡易なバージョン管理用にとても便利である。僕としては12:34amという出力よりも24時間表記のほうが好みであるのだが、改造するほどTeXマクロの知識が無い。そこでPythonTeXで\nowのようなものを作ってみることにした。
使い方などは以下の通り。
\documentclass[a4j,papersize]{jsarticle} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{otf} \usepackage{lmodern} \usepackage[makestderr]{pythontex} \restartpythontexsession{\thesection} \usepackage{time} \begin{pycode} import datetime def altNow(opt = None): date = datetime.datetime.today() if opt: return (str(date.year) + " 年 " + str(date.month) + " 月 " + str(date.day) + " 日 " + str(date.hour) + " 時 " + str(date.minute) + " 分") else: return "%02d" % date.hour + ":" + "%02d" % date.minute \end{pycode} \title{Python\TeX で\TeX マクロもどきを作る} \author{Xaro Cydeykn} \date{\today} \begin{document} \maketitle これが普通の \verb|\now| ですよ: \now これが今回作った\verb|\py{altNow()}| ですよ: \py{altNow()} オプションで \verb|\today \now|も出力できるよ: \py{altNow(1)} \end{document}
骨格となるPythonコードは以下の通り。
import datetime def altNow(opt = None): date = datetime.datetime.today() if opt: return (str(date.year) + " 年 " + str(date.month) + " 月 " + str(date.day) + " 日 " + str(date.hour) + " 時 " + str(date.minute) + " 分") else: return "%02d" % date.hour + ":" + "%02d" % date.minute
出力は以下のようになる:
これが普通の \now ですよ: 8:20am これが今回作った \py{altNow()} ですよ: 08:19 オプションで \today \now も出力できるよ: 2013 年 10 月 28 日 8 時 19 分
\py{altNow(1)}のように、PythonでTrue扱いになるようなもの(6. 式 (expression) — Python 3.3 documentationを参照)を入れると\today \now のような出力になり、Falseまたはデフォルトでは\now のような出力になる。Pythonなので好みに応じた改造も容易にできる。
一つ問題があって、使っていない(正確には名前空間にない)変数を使うとPythonTeXを適用したときのNameErrorの対処をしていない。例えば\py{altNow(hoge)}とやると、\pycode環境内でhogeを定義していない限りエラーとなる。どうすればかわせるだろうか。