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

新 LaTeX カーネル対応の案(というかまだ試験段階)。この Gist に置いてあるのは source/platex/base へのパッチ形式(しかも読みやすいように UTF-8 で公開中;ptex-texmf リポジトリは ISO-2022-JP)。ptex-texmf-20160203.patch は exp_2ekernel branch の 3b92701 相当なので,GitHub の当該 revision をダウンロードした方が早いかも。

新しい tex/platex/base のファイルをローカルの TEXMF ツリーに入れて platex.fmt を作成する(コマンドは fmtutil --byfmt platex)。platexrelease.sty のつかいかたや参考になるかもしれない情報は platexrelease.dtx から得られる platexrelease.pdf またはブログを参照。

@aminophen
Copy link
Author

いま思っている問題点 (ptex-texmf-20160203.patch) :

  • 「asciimw オプション」という案を提案してはみたが,実装は未着手。多分実装は可能だと思う。
    • pLaTeX のほうは 2006/11/10 の ASCII MEDIA WORKS 版を emulate したうえで,LaTeX のほうだけ同時に指定されたオプションに応じた日付に emulate するつもり(これは言い換えると「仮に community edition でない元の pLaTeX だったら,特定の日付の LaTeX との組み合わせでどう動くだろうか」という検証にもなるかもしれない)。
    • pLaTeX の最新版+LaTeX のエミュレートは…と思ったが,これは結局 platexrelease を使わずに latexrelease するのと同じになると思ったので却下。
  • 「current オプション」は今の実装では latexrelease パッケージを読み込まないが,よいのだろうか?
    • たとえば latexrelease.pdf によると「current オプションを付けて latexrelease.sty を読み込むと,実効的な日付を変更しないが \IncludeInRelease の定義を保証する」はず。これをまねて platexrelease.pdf にも「current オプションは \plIncludeInRelease の定義を保証」と書いたのだが,そもそも \IncludeInRelease は ltvers.dtx によって 2ekernel にも書き込まれているし,\plIncludeInRelease は plvers.dtx によって plcore に書き込まれている。ということは,わざわざドキュメントにそう書かれている理由がわからない…
  • 「yyyy/mm/dd オプション」と「latest オプション」の説明文は改善が必要。
    • これらはそのまま latexrelease に渡るとは限らず,pLaTeX が知らない新しい LaTeX を呼ばないように制御している。したがって,この制御に関する説明を書き加えなければならない。
    • さらに,この「新しい LaTeX を呼ばないように latexrelease に渡すオプションを古い日付に書き換える」ときに警告を出したほうがよいだろう。
  • 実際にこの機構を採用する場合は,platexrelease.ins に含める dtx の範囲はどこまでか?
    • platexrelease で emulate すべきなのは「フォーマット作成時に読まれるファイル」だと思うので,バージョン定義のため最初に必要な plvers.dtx,パッケージ本体を定義する platexrelease.dtx に続いて,ltx ファイルの元になっている plfonts.dtx,plcore.dtx を参照する必要があるのは容易にわかる。(kinsoku.dtx も同じだが,さすがに今後変更しないと思うので外してもよかろう…?)
    • しかし,plext.dtx はフォーマット作成時には参照しないとはいえ,挙動を変える場合に過去の plext.sty を emulate する方法を用意した方がよいだろうか? 仮に用意するとすれば,そのコードを platexrelease.sty に含めるのは変(\documentclass より前に読まれても駄目だし,pleat.sty を使わないときに読まれても駄目)なので別のパッケージを作るのだろうか?

あと,変更しようと思って忘れている点:

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

@aminophen
Copy link
Author

ちなみに,「\IncludeInRelease を使って完全に latexrelease の機構の上に載せる」ではなく「\plIncludeInRelease を新たに定義して独自に platexrelease の機構をつくる」とした理由は,pLaTeX2e kernel の変更は LaTeX2e kernel への追随に限らず,pLaTeX2e 特有の定義変更も想定しているから。

  • 「latexrelease より新しい日付の platexrelease」はいくらでも生じうるのに,latexrelease の機構の上では「latexrelease が知らない新しい日付」に対して latexrelease がいちいち警告を出してしまう。
  • 逆に「platexrelease より新しい日付の latexrelease」が出た場合に,platexrelease を読み込んでも対応できない LaTeX2e kernel の変更が適用されてしまうのも気持ち悪い。
  • ただ,わざわざ新しいコマンドを作らなくても同じ目的が実現できるかもしれない?(latexrelease のドキュメントにある「パッケージ側で LaTeX の日付に応じて,あるいはパッケージの日付に応じて挙動を変える」という内容で,\IncludeInRelease のオプション引数が解説されていて,これは「LaTeX は更新されていないが,パッケージの挙動を変えたい」という場合に使えるらしい。)

もう一点,\plIncludeInRelease(または \IncludeInRelease)の日付を「LaTeX2e が変更された日付」に合わせてしまうと,あたかも「pLaTeX2e が即日 LaTeX2e の変更をサポートした」かのようになってしまう。それは事実ではないため,LaTeX2e をサポートできていなかったという状況そのものをエミュレートするために「plcore.ltx に修正を入れた日付」としてみた。

@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