何かを書き留める何か

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

PythonTeX で \now のようなものを作る

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を定義していない限りエラーとなる。どうすればかわせるだろうか。