マクロツイーター

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

latexrelease が pTeX でアレな話(1)

latexrelase パッケージの概要

新しい LaTeX のメンテナンスポリシー(参照)において、厳密な互換性を確保するための機構が latexrelase パッケージである。

LaTeX ユーザ(文書作成者)がこの機構を利用するのは非常に簡単である。次のように、LaTeX 文書の先頭(\documentclass よりも前)に latexrelase を読み込む命令を追加するだけである。((\documentclass よりも前にパッケージを読み込む(稀な)場合は、\usepackage ではなく \RequirePackage という特別な命令を使用する。))

% LaTeX 文書
\RequirePackage[2015/01/01]{latexrelease}
\documentclass[a4paper]{article}
%...以下省略

パッケージオプション(上例の“2015/01/01”)には以下のものが指定できる。

  • 日付(YYYY/MM/DD 形式): LaTeX カーネルのコードを当該の日付に相当するものに書き換える。
  • current (既定): LaTeX カーネルの本来のリリース日付に合わせる ― つまり「何もしない」。
  • latestLaTeX カーネルの“最新”の状態にする。通常は current と同じだが、“未来版の latexrelease”を使っている場合は、そのリリース日付に合わせられる。(後述)

注意事項。

  • カーネルの更新リリースがある度にそのカーネルの状態が特定の「リリース日付」に結び付けられる。「特定の日付におけるカーネルの状態」はこのリリース日付を規準にして決められる。
    現状ではカーネルの状態は 2 通りしかなく、2014 年版の状態が「初期リリース」*1、2015 年版の状態が「リリース日付 2015/01/01」となっている。したがって、latexrelase 読込において、2015/01/01 以降の日付を指定すると 2015 年版、それより前の日付を指定すると 2014 年版に書き換えられる。
  • もちろん、(少なくとも今は)latexrelease で“バージョンを変えられる”のはカーネルだけである。LaTeX システムのインストール時期の違いによるトラブルが起こる場合、その原因はカーネルではなくパッケージにあることの方が圧倒的に多い。*2だから、カーネルだけ厳密にバージョンを制御できてもあまり有益ではないかも知れない。
  • パッケージ開発者が、latexrelaase の機構を自身の作製するパッケージに適用させることは可能である。従って、将来は、一部のパッケージが latexrelaase で“バージョンを変えられる”ようになるかも知れない。

なお、インストールされている LaTeX のリリース日付を調べるには、LaTeX を起動したときに表示されるバナーを見ればよい。((カーネルのリリース日付を表すマクロ \fmtversion も定義されている。latexrelease でカーネルを書き換えた場合は \fmtversion の値も指定の日付に書き換わる。))

This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/W32TeX) (preloaded
 format=latex)
 restricted \write18 enabled.
entering extended mode
(c:/usr/local/share/texmf-dist/tex/latex/base/small2e.tex
LaTeX2e <2015/01/01>
Babel <3.9l> and hyphenation patterns for 79 languages loaded.
簡単な例

例えば、次のような文書ソースを用意する。これは、カーネルで定義されている命令 \@ の定義を調べるものである。

[test.tex]
%\RequirePackage[2014/11/08]{latexrelease}% 2014年版にする
\show\@ % \@ の意味を調べる
% あとはどうでもよい
\documentclass{article}
\begin{document}
\end{document}

これを latexコンパイルすると、以下のように表示される。

> \@=macro:
->\spacefactor \@m {}.
l.2 \show\@

ここで、1 行目の % を外して latexrelease の読込を有効にすると、以下の表示に変わる。\@ の定義が古いものに戻っていることが判る。

> \@=macro:
->\spacefactor \@m .
l.2 \show\@
LaTeX を未来に進める

ある時にリリースされた LaTeX の配布は、当然ながら、そのリリース日付よりも未来における更新の情報を持っていない。このため、単にインストール済の latexrelease パッケージを利用するだけでは、“過去のバージョンに変える”ことしかできない。

しかし、カーネルよりも“未来にある”latexrelease パッケージを使った場合は話が違ってくる。現在の LaTeX のリリースポリシーでは、新しいカーネルがリリースされる際に、対応する(同じリリース日付をもつ)新しい latexrelease パッケージが公開される。かつ、インストール済の LaTeX について、“カーネルよりも新しい”latexrelease を読み込むことが可能であり、その場合は、カーネルよりも新しいリリース日付*3をオプションに指定することができる。

例えば、現在が 2017 年であり、2015/01/01 より後に、LaTeX について 2016/01/01 と 2017/01/01 の 2 回のリリースが行われていたとする。そして手許に 2015/01/01 の LaTeX がインストールされているとする。この時、CTAN から latexrelease パッケージ(これは 2017/01/01 のリリース日付をもつはずである((なお、一般にパッケージはそのバージョンを示す“リリース日付”を持っている(最新版(v1.0c)の latexrelease の場合は 2015/02/21)が、ここでいう“latexrelease のリリース日付”はそれではなく“対応するカーネルのリリース日付”のことを指すものとする。この値はパッケージ中でマクロ \latexreleaseversion として定義されている。)))を入手して、LaTeX 文書の先頭で次のように読み込む。

\RequirePackage[2016/01/01]{latexrelease}

すると、カーネルのコードはリリース日付 2016/01/01 のものに更新される。また、この場合、オプション latest は latexrelease のリリース日付である 2017/01/01 と同等になる。(それが可能な限りの“最新”なので。)((current を指定した場合は、やはり「何もしない」。つまり、カーネルは 2015/01/01 の状態のままである。))

(続く)

*1:これは“0000/00/00”というリリース日付をもっている。

*2:活発な開発が行われているパッケージは、カーネルに比べると改修の規模も頻度も遥かに大きい。

*3:もちろん、latexrelase のリリース日付が上限になる。