% \iffalse meta-comment
%% File: platexrelease.dtx
%
%  Copyright (c) 2016-2023 Japanese TeX Development Community
%
%  This file is part of the pLaTeX2e system (community edition).
%  -------------------------------------------------------------
%
% \fi
%
%
% \iffalse
% \changes{v1.0}{2016/02/01}{first edition}
% \changes{v1.0a}{2016/02/03}{latexreleaseをもとにplatexreleaseとして拡張}
% \changes{v1.0b}{2016/02/16}{latexreleaseのバージョン確認を導入}
% \changes{v1.0c}{2016/04/12}{ドキュメントを更新}
% \changes{v1.0d}{2016/06/08}{p\LaTeX\ \texttt{!<2016/04/17!>}版と
%      p\LaTeX\ \texttt{!<2016/05/07!>}版に警告}
% \changes{v1.0e}{2016/06/30}{p\LaTeX\ \texttt{!<2016/06/10!>}版に警告}
% \changes{v1.0f}{2016/07/05}{古いplatexreleaseの警告に\cs{pfmtversion}で
%      なく\cs{platexreleaseversion}を使用(\LaTeXe\ r1207)}
% \changes{v1.0g}{2016/09/08}{p\LaTeX\ \texttt{!<2016/09/03!>}版に警告}
% \changes{v1.0h}{2017/09/26}{p\LaTeX\ \texttt{!<2017/07/29!>}版に警告}
% \changes{v1.0i}{2017/12/06}{タイポ修正}
% \changes{v1.0j}{2018/01/27}{p\LaTeX\ \texttt{!<2017/09/26!>}版に警告}
% \changes{v1.0k}{2018/01/27}{Add \cs{platexreleaseversion} info
%      to \cs{ProvidesPackage} output
%      (sync with latexrelease.dtx 2017/12/17 v1.0i)}
% \changes{v1.0l}{2018/04/06}{Drop an extra period in warning message
%      (sync with latexrelease.dtx 2018/02/18 v1.0j)}
% \changes{v1.0m}{2018/05/22}{reset \cs{requestedpLaTeXdate} for
%      current and latest options
%      (sync with latexrelease.dtx 2018/05/08 v1.0k)}
% \changes{v1.0n}{2020/03/28}{先にlatexreleaseが読み込まれていたら警告}
% \changes{v1.0o}{2021/02/13}{\cs{sourcepLaTeXdate} added
%      (sync with latexrelease.dtx 2021/01/23 v1.0l)}
% \changes{v1.0p}{2023/01/08}{latexreleaseが新しい場合は常に上書き}
% \fi
%
% \iffalse
\NeedsTeXFormat{pLaTeX2e}
%<*driver>
\def\platexreleaseversion{<date only known in .sty file>}
\ProvidesFile{platexrelease.dtx}
%</driver>
%<platexrelease>\ProvidesPackage{platexrelease}
          [2023/01/08 v1.0p latexrelease support for pLaTeX Kernel
              (including releases up to \platexreleaseversion)]
%<*driver>
\RequirePackage{plautopatch}
\documentclass[dvipdfmx,a4paper]{jltxdoc}
\GetFileInfo{platexrelease.dtx}
\author{Japanese \TeX\ Development Community}
\title{The \textsf{platexrelease} package}
\date{作成日：\filedate}
\begin{document}
  \newcommand\Lpack[1]{\textsf{#1}}
  \maketitle
  \DocInput{\filename}
\end{document}
%</driver>
% \fi
%
% \changes{v1.0}{2016/02/01}{p\LaTeXe 用に\file{latexrelease.dtx}を修正}
% \changes{v1.0a}{2016/02/03}{latexreleaseをもとにplatexreleaseとして拡張}
%
% p\LaTeXe{}がベースにしている\LaTeXe{}は、2015年より前まではカーネルの
% 互換性を失わせる大きな変更は加えられず、修正は\Lpack{fixltx2e}パッケージ
% で提供されていました。しかし、2015年以降は\Lpack{fixltx2e}の変更点が
% すべて\LaTeXe{}のカーネルに取り込まれ、代わりに過去のバージョンの
% \LaTeXe{}をエミュレートするための\Lpack{latexrelease}パッケージが提供
% されるようになりました。
%
% この\Lpack{platexrelease}パッケージは、p\LaTeXe{}で\Lpack{latexrelease}に
% 相当する機能を提供するためのパッケージです。
% 基本的な使い方は
%\begin{verbatim}
% \RequirePackage[2015/01/01]{platexrelease}
% \documentclass{jarticle}
% ....
%\end{verbatim}
% です。\Lpack{latexrelease}の代わりに\Lpack{platexrelease}を読み込まな
% いと、p\LaTeXe{}で日本語用に加えた\LaTeXe{}へのパッチがキャンセルされ
% てしまう場合がありますので注意してください。このことをユーザに知らせる
% ため、p\LaTeX{}のカーネルは、「\Lpack{latexrelease}パッケージが読み込
% まれたのに\Lpack{platexrelease}パッケージが読み込まれなかった場合」に
% 警告を出し、\Lpack{platexrelease}パッケージの利用を推奨します。また、
% 「読み込まれた\Lpack{latexrelease}について\Lpack{platexrelease}が
% 未知である」場合も、\Lpack{platexrelease}が万全ではありませんので警告
% を出します。\Lpack{latexrelease}の使いかたについては、
% \Lpack{latexrelease}のドキュメントを参照してください。
%
% \section{パッケージオプション}
%
% \Lpack{latexrelease}パッケージと同様です。\Lpack{platexrelease}に
% 指定されたオプションは、内部で読み込まれる\Lpack{latexrelease}にも
% そのまま渡ります。\Lpack{platexrelease}と\Lpack{latexrelease}
% の間の関係もここで具体的に説明します。
% \begin{itemize}
% \item |\RequirePackage[|\emph{yyyy/mm/dd}|]{platexrelease}| \par
% p\LaTeXe{}のフォーマットの日付を指定します。任意の日付を指定できます
% が、パッケージよりも未来の日付が指定された場合は警告します。このオプ
% ションが指定されると、「\emph{yyyy/mm/dd}時点の\LaTeX{}カーネルを読み
% 込んだ後に、同じく\emph{yyyy/mm/dd}時点のp\LaTeX{}カーネルを読み込ん
% だもの」をエミュレートします。
% \item |\RequirePackage[current]{platexrelease}| \par
% これはデフォルトの挙動です。フォーマットの日付は実効的に変更しません
% が、|\plIncludeInRelease|コマンドが定義されることを保証します。
% 具体的には\LaTeX{}のフォーマットは |\fmtversion| に、% p\LaTeX{}の
% フォーマットは |\pfmtversion| になります。
% \item |\RequirePackage[latest]{platexrelease}| \par
% p\LaTeX{}のフォーマットの日付を、このファイルのリリース日に設定します。
% したがって、古いフォーマットを使っている場合は現在利用可能なすべての
% パッチが適用されます。具体的には、「\Lpack{latexrelease}が知っている
% 最新の\LaTeX{}カーネルを読み込んだ後に、\Lpack{platexrelease}が知って
% いる最新のp\LaTeX{}カーネルを読み込んだもの」をエミュレートします。
% \end{itemize}
%
% \section{p\LaTeX{}カーネルやパッケージ開発者向け}
%
% \subsection{フォーマット作成にかかわるファイルを変更する場合}
%
% p\LaTeX{}のフォーマットplatex.fmtのソースを変更する場合は、大まかに
% 以下のようにガードを付けます。
% \begin{enumerate}
% \item 古いコードを \par
% |\plIncludeInRelease{日付}{ラベル}{メッセージ}| …
% |\plEndIncludeInRelease| \par
% に挟み、全体を |<platexrelease>| ガードの下に置きます。新しいコードと
% 区別がつくように、すべての行にガードを付けます。
% \item 新しいコードは \par
% |\plIncludeInRelease{日付}{ラベル}{メッセージ}| …
% |\plEndIncludeInRelease| \par
% に挟みます。コード部分は \verb+<*plナントカ|platexrelease>+ ガードの中、
% |\plIncludeInRelease| と |\plEndIncludeInRelease| には |<platexrelease>|
% ガードを付けます。
% \item すべてのコードはもともと |<*plナントカ>| ガードの中にあるはずです
% ので、|\begin{macrocode}| 直後にいったん |<*plナントカ>| ガードを終了し、
% |\end{macrocode}| 直前にもう一度 |<*plナントカ>| ガードを開始します。
% \end{enumerate}
% 日付は2006/11/10時点のアスキー版のコードなら「0000/00/00」とし、
% その後なら「次回リリース（予定）日」とします。すべての日付ブロックは
% 降順に並べるとよいようです。
%
% 典型例を示します。
%\begin{verbatim}
% % \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}
%\end{verbatim}
%
% あとは、|\ProvidesFile|のバージョン番号、|\CheckSum|、|\changes|と
% いった従来と同じ変更を行います。
%
% \subsection{パッケージ作成にかかわるファイルを変更する場合}
%
% フォーマットにかかわる場合と異なる点は、|<platexrelease>| ガードが
% 不要であるという点です。
% \begin{enumerate}
% \item 古いコードを \par
% |\plIncludeInRelease{日付}[フォーマットの日付]{ラベル}{メッセージ}|
% … |\plEndIncludeInRelease| \par
% に挟みます。
% \item 新しいコードを \par
% |\plIncludeInRelease{日付}[フォーマットの日付]{ラベル}{メッセージ}|
% … |\plEndIncludeInRelease| \par
% に挟みます。
% \end{enumerate}
% 日付は2006/11/10時点のアスキー版のコードなら「0000/00/00」とし、
% その後なら「次回リリース（予定）日」とします。すべての日付ブロックは
% 降順に並べるとよいようです。
%
% \setcounter{StandardModuleDepth}{1}
% \StopEventually{}
%
% \section{コード}
%
% \Lpack{platexrelease}パッケージが読み込まれましたので、
% 効率化のため|\begin{document}|での確認コードを無効化します。
% （\file{plvers.dtx}の2020/03/28 v1.1u以降）。
%    \begin{macrocode}
%<*platexrelease>
\ifx\p@warn@latexrelease\@undefined\else
\let\p@warn@latexrelease\relax
\fi
%    \end{macrocode}
%
% 最初に\Lpack{latexrelease}パッケージを読み込みます。
% これより前にすでに読み込まれている場合は警告します。
% \changes{v1.0n}{2020/03/28}{先にlatexreleaseが読み込まれていたら警告}
%    \begin{macrocode}
\ifx\latexreleaseversion\@undefined\else
  \PackageWarningNoLine{platexrelease}{%
    Package `latexrelease' is already loaded;\MessageBreak
    load `platexrelease' earlier}
\fi
\RequirePackageWithOptions{latexrelease}
%    \end{macrocode}
%
% 読み込んだ\Lpack{latexrelease}パッケージのバージョンを確認し、
% \Lpack{platexrelease}が未対応の新しいものであった場合に警告します。
% この場合は、\Lpack{latexrelease}によってp\LaTeX{}が上書きされて
% 壊れるのを防ぐため、問答無用でp\LaTeX{}で再度上書きします。
% \changes{v1.0b}{2016/02/16}{latexreleaseのバージョン確認を導入}
% \changes{v1.0p}{2023/01/08}{latexreleaseが新しい場合は常に上書き}
%    \begin{macrocode}
\ifnum\expandafter\@parse@version\latexreleaseversion//00\@nil
  >\expandafter\@parse@version\p@known@latexreleaseversion//00\@nil
  \PackageWarningNoLine{platexrelease}{%
    Version of `latexrelease' is newer than\MessageBreak
    what `platexrelease' knows}
  \let\pltx@maybe@gobble\@gobble
\else
  \let\pltx@maybe@gobble\@firstofone
\fi
%    \end{macrocode}
%
% \begin{macro}{\sourcepLaTeXdate}
% 元々のフォーマットの日付を保存します。
% \changes{v1.0o}{2021/02/13}{\cs{sourcepLaTeXdate} added
%      (sync with latexrelease.dtx 2021/01/23 v1.0l)}
%    \begin{macrocode}
\edef\sourcepLaTeXdate{%
  \expandafter\@parse@version\pfmtversion//00\@nil}
%    \end{macrocode}
% \end{macro}
%
% \Lpack{platexrelease}パッケージのオプションを定義します。コードは
% \Lpack{latexrelease}のものをp\LaTeXe{}用に書き換えたものです。
% \changes{v1.0m}{2018/05/22}{reset \cs{requestedpLaTeXdate} for
%      current and latest options
%      (sync with latexrelease.dtx 2018/05/08 v1.0k)}
%    \begin{macrocode}
\DeclareOption*{%
  \def\@plIncludeInRelease#1[#2]{\@plIncludeInRele@se{#1}}%
  \let\requestedplpatchdate\CurrentOption}
\DeclareOption{latest}{%
  \let\requestedplpatchdate\platexreleaseversion
  \AtEndOfPackage{\def\requestedpLaTeXdate{0}}}
\DeclareOption{current}{%
  \let\requestedplpatchdate\pfmtversion
  \AtEndOfPackage{\def\requestedpLaTeXdate{0}}}
%    \end{macrocode}
%
%    \begin{macrocode}
\let\requestedplpatchdate\pfmtversion
\ProcessOptions\relax
%    \end{macrocode}
%
%    \begin{macrocode}
\def\reserved@a{%
\edef\requestedpLaTeXdate{\the\count@}%
\reserved@b}
\def\reserved@b#1\\{%
\def\reserved@b{#1}%
\ifx\reserved@b\@empty\else
\PackageError{platexrelease}%
             {Unexpected option \requestedplpatchdate}%
             {The option must be of the form yyyy/mm/dd or yyyy-mm-dd}%
\fi}
\afterassignment\reserved@a
\count@\expandafter
  \@parse@version\expandafter0\requestedplpatchdate//00\@nil\\
%    \end{macrocode}
%
%    \begin{macrocode}
\edef\currentpLaTeXdate{%
   \expandafter\@parse@version\pfmtversion//00\@nil}
%    \end{macrocode}
%
%    \begin{macrocode}
\ifnum\requestedpLaTeXdate=\currentpLaTeXdate
\PackageWarningNoLine{platexrelease}{%
  Current format date selected, no patches applied}
\pltx@maybe@gobble{\expandafter\endinput}
\fi
%    \end{macrocode}
%
% より新しいフォーマットに対しては、より新しいバージョンの
% \Lpack{platexrelease}が提供されているはずです。
% \changes{v1.0f}{2016/07/05}{古いplatexreleaseの警告に\cs{pfmtversion}で
%      なく\cs{platexreleaseversion}を使用(\LaTeXe\ r1207)}
%    \begin{macrocode}
\ifnum\currentpLaTeXdate
  >\expandafter\@parse@version\platexreleaseversion//00\@nil
\PackageWarningNoLine{platexrelease}{%
The current package is for an older pLaTeX format:\MessageBreak
pLaTeX \platexreleaseversion\space\MessageBreak
Obtain a newer version of this package!}
\pltx@maybe@gobble{\expandafter\endinput}
\fi
%    \end{macrocode}
%
% 将来のp\LaTeXe{}をつくりだすパッチはありませんが、オプションは
% 現時点では受け入れます。
%    \begin{macrocode}
\ifnum\requestedpLaTeXdate
  >\expandafter\@parse@version\platexreleaseversion//00\@nil
\PackageWarningNoLine{platexrelease}{%
The current package is for pLaTeX \platexreleaseversion:\MessageBreak
It has no patches beyond that date\MessageBreak
There may be an updated version\MessageBreak
of this package available from CTAN}
\pltx@maybe@gobble{\expandafter\endinput}
\fi
%    \end{macrocode}
%
% フォーマットのバージョンを要求されている日付に更新します。
%    \begin{macrocode}
\let\pfmtversion\requestedplpatchdate
\let\currentpLaTeXdate\requestedpLaTeXdate
%    \end{macrocode}
%
% このあとは、p\LaTeXe{}のカーネルの変更点を示すコードが入ります。
%
% \section{注意：p\LaTeXe{}のバグ情報}
%
% 過去のp\LaTeXe{}には何度かcriticalなバグがあったため、
% そのバージョンをエミュレートした場合に警告が出るようにします。
% \changes{v1.0d}{2016/06/08}{p\LaTeX\ \texttt{!<2016/04/17!>}版と
%      p\LaTeX\ \texttt{!<2016/05/07!>}版に警告}
% \changes{v1.0e}{2016/06/30}{p\LaTeX\ \texttt{!<2016/06/10!>}版に警告}
% \changes{v1.0g}{2016/09/08}{p\LaTeX\ \texttt{!<2016/09/03!>}版に警告}
% \changes{v1.0h}{2017/09/26}{p\LaTeX\ \texttt{!<2017/07/29!>}版に警告}
% \changes{v1.0i}{2017/12/06}{タイポ修正}
% \changes{v1.0j}{2018/01/27}{p\LaTeX\ \texttt{!<2017/09/26!>}版に警告}
%    \begin{macrocode}
\def\pliirpkg@ver@warn{%
      You selected pLaTeX2e <\pfmtversion>, but\MessageBreak
      this version of pLaTeX2e is known to have\MessageBreak
      some critical bugs. We advise you to\MessageBreak
      select another format date}
\plIncludeInRelease{2017/10/28}{\PackageWarning}{pLaTeX Info}%
  % * <2023-02-14>+1
  % * <2023-02-14>
  % * <2021-11-15>+1
  % * <2021-11-15>
  % * <2021-06-01>+2
  % * <2021-06-01>+1
  % * <2021-06-01>
  % * <2020-10-01>+2
  % * <2020-10-01>+1
  % * <2020-10-01>
  % * <2020-04-12>
  % * <2020-02-02>+3
  % * <2020-02-02>+2
  % * <2020-02-02>+1
  % * <2020-02-02>
  % * <2019-10-01>+1
  % * <2019-10-01>
  % * <2019-04-06>
  % * <2018-12-01>
  % * <2018-07-28>+1
  % * <2018-07-28>
  % * <2018-05-20>
  % * <2018-04-01>+2
  % * <2018-04-01>+1
  % * <2018-04-01>
  % * <2018/03/09>+1
  % * <2018/03/09>
  % * <2017/10/28>+4
\plEndIncludeInRelease
\plIncludeInRelease{2017/07/29}{\PackageWarning}{pLaTeX Info}%
  % * <2017/10/28>+3
  % * <2017/10/28>+2
  % * <2017/10/28>+1
  % * <2017/10/28>
  % * <2017/09/26>
  % * <2017/07/29>+1
  %   - Enabling \linebreak before prebreakpenalty caused
  %     ineffective \nolinebreak (fixed in <2017/10/28>+4)
  % * <2017/07/29>
  %   - Inhibit JFM glue in tabular cells resulted in
  %     misplaced right alignment (fixed in <2017/09/26>)
  \PackageWarningNoLine{platexrelease}{\pliirpkg@ver@warn}
\plEndIncludeInRelease
\plIncludeInRelease{2016/09/08}{\PackageWarning}{pLaTeX Info}%
  % * <2017/05/05>
  % * <2017/04/08>
  % * <2016/11/29>
  % * <2016/09/08>
\plEndIncludeInRelease
\plIncludeInRelease{2016/09/03}{\PackageWarning}{pLaTeX Info}%
  % * <2016/09/03>
  %   - \footnotetext in vertical mode resulted in extra
  %     vertical space (fixed in <2016/09/08>)
  \PackageWarningNoLine{platexrelease}{\pliirpkg@ver@warn}
\plEndIncludeInRelease
\plIncludeInRelease{2016/07/01}{\PackageWarning}{pLaTeX Info}%
  % * <2016/07/01>
\plEndIncludeInRelease
\plIncludeInRelease{2016/04/17}{\PackageWarning}{pLaTeX Info}%
  % * <2016/06/10>+1
  % * <2016/06/10>
  % * <2016/05/07>
  % * <2016/04/17>
  %   - Fix for non-zero baselineshift in accent composition
  %     was problematic (fixed in <2016/07/01>)
  \PackageWarningNoLine{platexrelease}{\pliirpkg@ver@warn}
\plEndIncludeInRelease
\plIncludeInRelease{0000/00/00}{\PackageWarning}{pLaTeX Info}%
  % * <2006/11/10>
\plEndIncludeInRelease
%</platexrelease>
%    \end{macrocode}
%
% \Finale
%
\endinput
