Skip to content

Instantly share code, notes, and snippets.

@aminophen
Last active May 17, 2016 11:44
Show Gist options
  • Save aminophen/fbec702413b17ee6405a to your computer and use it in GitHub Desktop.
Save aminophen/fbec702413b17ee6405a to your computer and use it in GitHub Desktop.
pLaTeX2e で latexrelease してみる実験

platexrelease の仕様(pLaTeX 2016/04/17 に導入済みのもの)

pLaTeX kernel 本体は「latexrelease が使われたのに platexrelease が使われていない」場合に警告を出す。また、仮に「読み込まれた latexrelease について pLaTeX が未知である」なら、platexrelease が万全ではないため警告を出す。

  • \RequirePackage[yyyy/mm/dd]{platexrelease} とすると「yyyy/mm/dd 時点の LaTeX kernel を読み込んだ後に、同じく yyyy/mm/dd 時点の pLaTeX kernel を読み込んだもの」をエミュレートする。
  • オプション current と latest は、latexrelease の仕様を踏襲する。
    • current ならば「何もしない」、すなわち今ある \pfmtversion そのままの挙動。
    • latest ならば「latexrelease が知っている最新の LaTeX kernel を読み込んだ後に、platexrelease が知っている最新の pLaTeX kernel を読み込んだもの」をエミュレートする。

以下、開発者向け。今後 ptex-texmf のカーネルやパッケージを改変する方法:

フォーマット platex.fmt 作成にかかわるファイルを変更する場合

  1. 古いコードを \plIncludeInRelease{日付}{ラベル}{メッセージ} … \plEndIncludeInRelease に挟み、全体を <platexrelease> ガードの下に置く。新しいコードと区別がつくように、すべての行にガードを付ける。
  2. 新しいコードも \plIncludeInRelease{日付}{ラベル}{メッセージ} … \plEndIncludeInRelease に挟む。コード部分は <*plナントカ|platexrelease> ガードの中、\plIncludeInRelease と \plEndIncludeInRelease には <platexrelease> ガードを付ける。
  3. すべてのコードは <*plナントカ> ガードの中にあるはずなので、\begin{macrocode} 直後にいったん <*plナントカ> ガードを終了し \end{macrocode} 直前にもう一度 <*plナントカ> ガードを開始する。

日付は 2006/11/10 時点のアスキー版のコードなら「0000/00/00」とし、その後なら「次回リリース予定日」とする。日付ブロックは降順に並べるとよい。

典型例:commit 3b92701

% \begin{macro}{\em}
% \begin{macro}{\emph}
% \begin{macro}{\eminnershape}
% \changes{v1.3d}{1997/06/25}{\cs{em},\cs{emph}で和文を強調書体に}
% \changes{v1.6}{2016/02/01}{\LaTeX\ \texttt{!<2015/01/01!>}での\cs{em}の
%    定義変更に対応。\cs{eminnershape}を追加。}
% 従来は|\em|, |\emph|で和文フォントの切り替えは行っていませんでしたが、
% 和文フォントも|\gtfamily|に切り替えるようにしました。
% \LaTeX\ \texttt{<2015/01/01>}で追加された|\eminnershape|も取り入れ、
% 強調コマンドを入れ子にする場合の書体を自由に再定義できるようになりました。
%    \begin{macrocode}
%</pldefs>
%<platexrelease>\plIncludeInRelease{2016/04/17}{\eminnershape}{\eminnershape}%
%<*pldefs|platexrelease>
\DeclareRobustCommand\em
        {\@nomath\em \ifdim \fontdimen\@ne\font >\z@
                       \eminnershape \else \gtfamily \itshape \fi}%
\def\eminnershape{\mcfamily \upshape}%
%</pldefs|platexrelease>
%<platexrelease>\plEndIncludeInRelease
%<platexrelease>\plIncludeInRelease{0000/00/00}{\eminnershape}{\eminnershape}%
%<platexrelease>\DeclareRobustCommand\em
%<platexrelease>        {\@nomath\em \ifdim \fontdimen\@ne\font >\z@ 
%<platexrelease>                       \mcfamily \upshape \else \gtfamily \itshape \fi}
%<platexrelease>\let\eminnershape\@undefined
%<platexrelease>\plEndIncludeInRelease
%<*pldefs>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}

あとは、\ProvidesFile のバージョン番号とか \CheckSum とか \changes といった従来と同じ変更を行う。

パッケージ作成にかかわるファイルを変更する場合

フォーマットにかかわる場合と異なる点は、<platexrelease> ガードが不要であるという点である。

  1. 古いコードを \plIncludeInRelease{日付}[フォーマットの日付]{ラベル}{メッセージ} … \plEndIncludeInRelease に挟む。
  2. 新しいコードは \plIncludeInRelease{日付}[フォーマットの日付]{ラベル}{メッセージ} … \plEndIncludeInRelease に挟む。

日付は 2006/11/10 時点のアスキー版のコードなら「0000/00/00」とし、その後なら「次回リリース予定日」とする。[フォーマットの日付] というオプション引数はなくてもよい。日付ブロックは降順に並べるとよい。

@aminophen
Copy link
Author

再考してみて思ったこと:

  • 根本的に emulate 目標を変更:「オプションで指定された時点の LaTeX カーネルを読んだあとに,同じ時点の pLaTeX カーネルを読み込んだもの」とする。
    • つまり「どんな場合でも platexrelease は最初に latexrelease パッケージを読み込む」。渡すオプションは platexrelease に与えられたものをそのまま引き継ぐ。ただし,読み込んだ latexrelease が platexrelease にとって未知だった場合に警告を出す(新たに増えた latexrelease ブロックと pLaTeX カーネルのパッチのバッティング対策)。
    • 「asciimw オプション」は廃案。もし仮に今後アスキーが pLaTeX を更新すると,意味がわかりにくくなるので。
    • オプションの説明文も上記に合わせて改善。
  • platexrelease.ins に含める dtx の範囲は「フォーマット作成時に読まれるファイル」とする(ただし,kinsoku.dtx はさすがに今後変更しないと思うので外してもよかろう…?)。
    • plext.dtx の過去の挙動を emulate するには,単に \plIncludeInRelease を plext.sty の中に羅列するだけで十分。

以上の変更が exp_2ekernel の 58420ec 相当。さらに

  • plvers.dtx の「latexrelease パッケージへの対応」のコードは \subsection に入れる。
  • platex.dtx にも「latexrelease パッケージとの共存」の解説を最低限入れて platexrelease.dtx を参照させる。

は続く de4baba で完了。ここまでの検討結果を platexrelease-doc.md にまとめた。

@aminophen
Copy link
Author

残っている課題:

  • upLaTeX kernel も同様にエミュレートするか。するとすれば実装はどうするか。(uplatexrelease.sty を使う?)

@aminophen
Copy link
Author

最終的に pLaTeX 2016/04/17 に導入した platexrelease の仕様を掲載。なお、この platexrelease が導入された「新 pLaTeX」は

  • W32TeX 2016/05/02 以降
  • TeX Live (pretest) 2016/05/10 以降

で利用可能である。なお、上で検討しようとしていた upLaTeX については

  • 現時点で「upLaTeX 特有のコード」は platexrelease の対象外である
  • 今後も upLaTeX 特有のコードについてはエミュレートが必要になるとは考えにくい

ことから、uplatexrelease という形での導入は見送った。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment