マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

TeXで平成してみる話

普通にやればオッケー。

% upLaTeX文書; UTF-8
\documentclass[uplatex,a4paper]{jsarticle}
\和暦
\title{{\TeX}言語、ダメゼッタイ!}
\author{某ZR}
\begin{document}
\maketitle
% ダメゼッタイ
\end{document}

f:id:zrbabbler:20190430143858p:plain
平成できた

平成!

……なのであるが、日本語LaTeXの「和暦の日付」に関する機能について、もう少しキチンとまとめておく。

\today を和暦にする話

以下に挙げる和文文書クラスでは、当日日付(\today)を和暦で出力することができる。

  • pLaTeXの標準和文クラス: jarticle、jreport、jbook、tarticle、treport、tbook
  • upLaTeXの標準和文クラス: ujarticle、ujreport、ujbook、utarticle、utreport、utbook
  • jsclassesバンドルのクラス: jsarticle、jsreport、jsbook
  • LuaTeX-jaの和文クラス: ltjarticle、ltjreport、ltjbook、ltjtarticle、ltjtreport、ltjtbook、ltjsarticle、ltjsreport、ltjsbook
  • BXjsclsバンドルのクラス: bxjsarticle、bxjsreport、bxjsbook、bxjsslide
  • jlreqクラス

(恐らく、TeX Live収録の日本語用文書クラスはこれが全てである。)

これらのクラスでは、以下の命令を用いて\todayの和暦・西暦表示を切り替える。

  • \和暦\todayの年表示を和暦(元号)にする。
  • \西暦\todayの年表示を西暦にする。

既定値については注意が必要である。

  • pLaTeX/upLaTeXの標準和文クラス」および「LuaTeX-jaの“pLaTeX標準の互換クラス”1」については旧来は和暦が既定であったが、改元後に不適切な表示が出るのを防ぐため、2018年7月頃のリリースで既定が西暦に変更された。従って、これらのクラスにおいて\today命令を利用している(\dateを省略する場合も含む)場合は\和暦\西暦を明示的に宣言してほうがよいであろう。
  • それ以外のクラスについては、西暦表示が既定である。

それで結局令和できるのか

以前の記事の時点では一部のクラスは「令和」に未対応であった。しかし現在においては、和暦対応のクラスの全てが対応を済ませている。従って、最新のW32TeXでは明日の改元後に「令和」が出力される。

TeX Liveについては……、そう、ちょうど今朝(日本時間の午前7時頃)TeX Live 2019がリリースされた。従って、新しいTeX Live 2019をインストールすれば、和暦対応のクラスの全てで「令和」が出力される。ただし、国内のミラーへの反映に時間がかかるため、TeX Live 2019が一般に入手できるのは明日になるだろう。「令和」の時代の初日から「令和」が使えるようになる見込みである。

和暦なのか西暦なのか

実用上の必要はないだろうが、実は「現在\和暦\西暦のどちらが有効であるか」を判定することができる。

  • ifthenパッケージを読みこむ。和暦対応のクラスにおいては西暦という名の真偽値変数が定義された状態になるので、これを用いて判定ができる。

    \ifthenelse{\boolean{西暦}}{%
      % \西暦 が有効
    }{%
      % \和暦 が有効
    }
    
  • ただし、BXjsclsのクラスと欧文(pdf)LaTeXの組み合わせの場合は例外で、この場合は西暦の代わりにjsSeirekiという真偽値変数を用いる。(和文の変数名が使えないため。)

例えば次のようにできる。

% upLaTeX文書; UTF-8
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage{ifthen}
\和暦
\title{新しいテフライブがリリースされた件}
\author{非ZR}
\begin{document}
\maketitle
\begin{abstract}
{\TeX}~Live \ifthenelse{\boolean{西暦}}{2019}{平成31}% ええっ
における変更点(特にアレ性)について解説する。
\end{abstract}
\end{document}

f:id:zrbabbler:20190430144456p:plain
トッテモ実用的

Babelする場合は

Babelパッケージを利用する場合、\todayの表記はBabelの言語定義の内容に従うことになる。現在の版のBabelの日本語(japanese)用の定義では、和文クラスと同様に、\和暦\西暦命令がサポートされていて\todayの表記の切替ができる。

% upLaTeX文書; UTF-8
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[T2A,T1]{fontenc}
\usepackage{paratype}% PTフォント使用
\usepackage[prefercjkvar]{pxcjkcat}
% なぜか唐突にロシア語
\usepackage[main=japanese,russian]{babel}
\newcommand{\Ru}[1]{%
  \begin{otherlanguage}{russian}#1\end{otherlanguage}}
\和暦
\title{{\TeX}言語、ダメゼッタイ!\\
  \Ru{Никогда не делай {\TeX} язык!}}
\author{\Ru{не-ZR}}
\date{\today\quad(\Ru{\today})}
\begin{document}
\maketitle
% Ничего
\end{document}

f:id:zrbabbler:20190430145337p:plain
Babelしてみた

BXwarekiパッケージ

Beamerなどのスライド用の文書クラスでは、和文も欧文も共通のものが使われるのが一般的である。そういうクラスでは当然、\today命令は和暦表示どころが日本語での表示にも対応していない。

% upLaTeX文書; UTF-8
\documentclass[dvipdfmx,14pt]{beamer}
\usepackage{pxjahyper}% いつもの設定
\renewcommand{\kanjifamilydefault}{\gtdefault}
\usetheme{EastLansing}
\title{{\TeX}言語、ダメゼッタイ!}
\author{某ZR}
\date{\today}
\begin{document}
\begin{frame}
\titlepage
\end{frame}
\end{document}

f:id:zrbabbler:20190430151243p:plain
日本語ですらない

日付が英語表記の「April 30, 2019」になっている。

このような文書クラスで\todayを和暦で表示したい場合は、bxwarekiパッケージを使うのが手っ取り早い2。bxwarekiは次の命令を提供する。

  • \warekitoday: 今日の和暦の日付を算用数字(平成31年4月30日)で出力する。
  • \warekikanjitoday: 今日の和暦の日付を漢数字(平成三一年四月三〇日)で出力する。
  • \warekijkanjitoday: 今日の和暦の日付を漢数字(平成三十一年四月三十日)で出力する。
% upLaTeX文書; UTF-8
\documentclass[dvipdfmx,14pt]{beamer}
\usepackage{pxjahyper}
\renewcommand{\kanjifamilydefault}{\gtdefault}
\usepackage{bxwareki}% 和暦したい
\usetheme{EastLansing}
\title{{\TeX}言語、ダメゼッタイ!}
\author{某ZR}
\date{\warekitoday}% 和暦日付を明示指定する
\begin{document}
\begin{frame}
\titlepage
\end{frame}
\end{document}

f:id:zrbabbler:20190430152742p:plain
平成できた

さらに、\warekicustomdateという命令を使うと、日付3を様々な形式で出力することができる。だから実は「西暦の日本語の日付」を出力したい場合にも使える4

% upLaTeX文書; UTF-8
\documentclass[dvipdfmx,14pt]{beamer}
\usepackage{pxjahyper}
\renewcommand{\kanjifamilydefault}{\gtdefault}
\usepackage{bxwareki}
\usetheme{EastLansing}
\title{{\TeX}言語、ダメゼッタイ!}
\author{某ZR}
\date{\warekicustomdate{}}% 和暦じゃない
\begin{document}
\begin{frame}
\titlepage
\end{frame}
\end{document}

f:id:zrbabbler:20190430154226p:plain
西暦できた(えっ)

まとめ

というわけで、和暦したい人も、西暦したい人も、困った場合はbxwarekiパッケージを使おう!


  1. すなわち以下のクラス:ltjarticle、ltjreport、ltjbook、ltjtarticle、ltjtreport、ltjtbook

  2. 先述の通り、Babelを読み込んでメイン言語にjapaneseを指定すると\和暦が使えるので、こちらを利用する方法もあり、また(Babelの目的が多言語対応なので)その方がある意味で正攻法なのであるが、Babelは副作用も多いので、できるならば避けたいところである。

  3. \warekitoday等は必ず今日の日付を出力するが、\warekicustomdateは予め\warekisetdate命令で指定した日付を出力する。ただし、\warekisetdateの初期値は今日の日付であるので、\warekisetdateを使わない場合は\warekicustomdateの出力も今日の日付になる。

  4. \warekicustomdateの書式指定の文字列を引数にとる。引数が空の\warekicustomdate{}は西暦・算用数字で出力する。この他に、例えば\warekicustomdate{wk}だと和暦・漢数字(\warekikanjitodayと同じ書式)で出力する。