texlive[63518] Master/texmf-dist: pxcjkcat (8jun22)

commits+karl at tug.org commits+karl at tug.org
Wed Jun 8 22:45:58 CEST 2022


Revision: 63518
          http://tug.org/svn/texlive?view=revision&revision=63518
Author:   karl
Date:     2022-06-08 22:45:58 +0200 (Wed, 08 Jun 2022)
Log Message:
-----------
pxcjkcat (8jun22)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/pxcjkcat/README-ja.md
    trunk/Master/texmf-dist/doc/latex/pxcjkcat/README.md
    trunk/Master/texmf-dist/doc/latex/pxcjkcat/pxcjkcat.pdf
    trunk/Master/texmf-dist/doc/latex/pxcjkcat/pxcjkcat.tex
    trunk/Master/texmf-dist/tex/latex/pxcjkcat/pxcjkcat.sty

Modified: trunk/Master/texmf-dist/doc/latex/pxcjkcat/README-ja.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/pxcjkcat/README-ja.md	2022-06-08 20:45:43 UTC (rev 63517)
+++ trunk/Master/texmf-dist/doc/latex/pxcjkcat/README-ja.md	2022-06-08 20:45:58 UTC (rev 63518)
@@ -30,6 +30,13 @@
 更新履歴
 --------
 
+  * Version 1.4 〈2022/06/06〉
+      - `\cjkcategory` 命令でブロックを符号値で指定可能にした。
+
+  * Version 1.3 〈2022/05/28〉
+      - upTeX 1.25 版以降のブロック定義を新たに CCV 4 と規定する。
+      - (試験的) key-value オプションのサポート。
+
   * Version 1.2 〈2022/05/25〉
       - 最新の upTeX に対応させる。
       - `nomode` オプションを追加。

Modified: trunk/Master/texmf-dist/doc/latex/pxcjkcat/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/pxcjkcat/README.md	2022-06-08 20:45:43 UTC (rev 63517)
+++ trunk/Master/texmf-dist/doc/latex/pxcjkcat/README.md	2022-06-08 20:45:58 UTC (rev 63518)
@@ -65,10 +65,10 @@
 If your document is mainly in Japanese, then put the following lines
 in the preamble:
 
-  \usepackage[prefercjkvar]{pxcjkcat}
+  \usepackage[ccv3,japanesevar]{pxcjkcat}
   \usepackage[utf8]{inputenc}
 
-The former setting treats the "CJK-ambiguous" punctuation symbols as
+The former setting treats the “CJK-ambiguous” punctuation symbols as
 non-CJK letters, while the latter as CJK letters. Of course, your
 document must in encoded in UTF-8.
 
@@ -90,6 +90,8 @@
 Revision History
 ----------------
 
+  * Version 1.4 〈2022/06/06〉
+  * Version 1.3 〈2022/05/28〉
   * Version 1.2 〈2022/05/25〉
   * Version 1.1 〈2018/04/01〉
   * Version 1.0 〈2012/09/22〉

Modified: trunk/Master/texmf-dist/doc/latex/pxcjkcat/pxcjkcat.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pxcjkcat/pxcjkcat.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/pxcjkcat/pxcjkcat.tex	2022-06-08 20:45:43 UTC (rev 63517)
+++ trunk/Master/texmf-dist/doc/latex/pxcjkcat/pxcjkcat.tex	2022-06-08 20:45:58 UTC (rev 63518)
@@ -11,7 +11,7 @@
   pdftitle={pxcjkcatパッケージ},
   pdfauthor={八登崇之}}
 \usepackage{bxtexlogo}
-\bxtexlogoimport{*}
+\bxtexlogoimport{*,LaTeXTeX}
 \usepackage[verb]{bxghost}
 \usepackage{shortvrb}
 \MakeShortVerb{\|}
@@ -19,12 +19,13 @@
 \newenvironment{myverbatim}
   {\quote\small\verbatim}
   {\endverbatim\endquote}
-\newcommand{\PkgVersion}{1.2}
-\newcommand{\PkgDate}{2022/05/25}
+\newcommand{\PkgVersion}{1.4}
+\newcommand{\PkgDate}{2022/06/06}
 \newcommand{\Pkg}[1]{\textsf{#1}}
-\newcommand{\Meta}[1]{$\langle$\mbox{}#1\mbox{}$\rangle$}
+\newcommand{\Meta}[1]{%
+  $\langle$\mbox{}\nolinebreak#1\nolinebreak\mbox{}$\rangle$}
 \newcommand{\Note}{\par\noindent ※}
-\newcommand{\Means}{:\quad}
+\newcommand{\Means}{:~}
 \newcommand{\strong}{\textsf}
 \newcommand{\wbr}{\linebreak[0]}
 \newcommand{\Code}[1]{{\usefont{T1}{lmtt}{l}{n}#1}}
@@ -36,14 +37,182 @@
 \maketitle
 
 \begin{abstract}
-本パッケージは、
-{\upTeX}の和文文字カテゴリ(kcatcode)を扱う{\LaTeX}上の
-インタフェースを提供する。
+{\upTeX}エンジンには
+「ソース中の非ASCII文字の扱い」
+(和文・欧文の何れとして扱うか、等)
+を制御するための「和文カテゴリ(kcatcode)」
+という設定がある。
+本パッケージは、{\upTeX}の和文カテゴリを扱うための
+{\LaTeX}の文書作成者向けのインタフェースを提供する。
 \end{abstract}
 
 \tableofcontents
 
 %===========================================================
+\section{前提知識}
+\label{sec:Introduction}
+
+%-------------------
+\subsection{和文カテゴリ}
+\label{ssec:cjkcategory}
+
+{\upTeX}エンジンの「\strong{和文カテゴリ}(kcatcode)」の設定は
+「ソース中の非ASCII文字の振舞」を制御するためのものである。
+例えば「ア」(U+30A2)という文字は普通は(既定値では)
+仮名として扱われるが、U+30A2の和文カテゴリを変更することで、
+これを「和文記号扱い」「欧文扱い」などに変えることができる。
+
+{\upTeX}の仕様では和文カテゴリの値は15~19の範囲の整数
+(\strong{和文カテゴリコード})
+として表される。
+本パッケージでは操作を直感的にするため和文カテゴリの値に名前
+(\strong{カテゴリID})を付けて扱う。
+和文カテゴリの値の一覧は以下の通りである。
+
+\begin{center}\small\begin{tabular}{ccl}
+  \hline
+  コード & カテゴリID & 意味 \\
+  \hline
+  15 & |noncjk| & 欧文扱い \\
+  16 & |kanji|  & 漢字扱い \\
+  17 & |kana|   & 仮名扱い \\
+  18 & |cjk|    & 「その他の和文」扱い \\
+  19 & |hangul| & ハングル扱い \\
+  \hline
+\end{tabular}\end{center}
+和文カテゴリの設定による実際の「振舞」の違いには
+以下のようなものがある
+\footnote{なお、現在の{\upTeX}の仕様では|kanji|(16)と|kana|(17)
+  の間には「振舞」の違いは存在しないようである。}。
+\begin{itemize}
+\item 和文カテゴリが|noncjk|(15)である文字は欧文として扱われる。
+  対して、|noncjk|以外の文字は和文扱いとなる。
+  \Note なお、欧文扱いとなる文字は欧文{\LaTeX}({\pdfLaTeX})と
+  同じ機構で処理される。
+  すなわち、{\TeX}のレベルではUTF-8のバイト列として扱われ、
+  これを\Pkg{inputenc}パッケージが適切に処理することで
+  初めて「文字」として認識される。
+\item (u){\pLaTeX}には「行末にある文字が和文文字の場合には当該の改行は
+  空白にならずに無視される」という独自の入力規則があるが、
+  和文カテゴリが|hangul|(19)である和文文字が行末にある場合は
+  欧文と同様に改行は空白を発生させる。
+\item {\LaTeX}の|\|から始まる命令名(制御綴)の構成について
+  「複数文字の名前を作れるのは英字のみ」という規則がある。
+  命令名構成の規則について、和文カテゴリが
+  |kanji|(16)・|kana|(17)・|hangul|(19)
+  の和文文字は「英字」と同じ扱いになり、
+  |cjk|(18)の和文文字は「英字以外の欧文文字」と同じ扱いになる。
+\end{itemize}
+
+ただし、{\upTeX}の仕様では、和文文字カテゴリの設定は“文字単位”ではなく
+“Unicodeブロック単位”で行うようになっている(一部例外あり)。
+従って、例えば「ア」(U+30A2)の和文カテゴリを変更したいという場合には、
+U+30A2が属する“Katakana”(U+30A0~30FF)のブロックについて
+和文カテゴリの設定を行うことになる。
+
+本パッケージが提供する命令を利用すると
+「“Katakana”の和文カテゴリを|cjk|(18)に変更する」
+という設定は
+\begin{quote}\small
+\begin{verbatim}
+\cjkcategory{kana}{cjk}
+\end{verbatim}
+\end{quote}
+で実現できる。
+
+%-------------------
+\subsection{和文カテゴリモード}
+\label{ssec:cjkcategory-mode}
+
+\strong{和文カテゴリモード}は
+全てのブロックに対する和文カテゴリの一括設定
+(プリセット設定)のことである
+(TODO:ちゃんと説明する)。
+
+モード設定には以下のものがある。
+何れのモードも、「CJK中核セット」(後述)のブロック群の
+設定は共通で、
+その他のブロックが欧文扱い(|noncjk|)であるか
+和文扱い(|cjk|%
+\footnote{全てのモード設定において、「CJK中核セット」\strong{以外}の
+  ブロックのカテゴリは必ず|noncjk|か|cjk|の何れかになる。}%
+)であるかが異なる。
+\begin{itemize}
+\item |forcecjk|\Means
+  全てのブロックを和文扱い
+  (|noncjk|以外)とする。
+  和文フォントの中のUnicode値の割当がある全ての文字を
+  和文文字として直接用いることができる。
+\item |default|\Means
+  現在のモードCCVに対応する{\upTeX}の版
+  (例えばモードCCVが3ならばv1.23)
+  における既定設定と一致させる。
+  \Note モードCCVが2以下の場合は|forcecjk|と同一の設定になる。
+\item |prefercjk|\Means
+  和文扱いのブロックとして「CJK中核セット」の他に
+  「Adobeの定めるCJK文字集合
+  \footnote{Adobe-Japan1、Adobe-GB1、Adobe-CNS1、Adobe-Korea1の4つ。}%
+  の何れかと共通部分をもつ文字ブロック」を加えて、
+  残りを欧文扱いに設定する。
+\item |prefercjkvar|\Means\hspace{-.25em}%
+  |prefercjk|からギリシャ・キリル文字の
+  ブロックを欧文扱いに変更したもの。
+\item |japanese|\Means
+  和文扱いのブロックとして「CJK中核セット」の他に
+  「Adobe-Japan1の全角幅のグリフ
+  の何れかと共通部分をもつ文字ブロック」を加えて、
+  残りを欧文扱いに設定する。
+\item |japanesevar|\Means
+  |japanese|からギリシャ・キリル文字の
+  ブロックを欧文扱いに変更したもの。
+\item |prefernoncjk|\Means
+  「CJK中核セット」のブロックのみを和文扱いとし、
+  残りを欧文扱いにする。
+\end{itemize}
+
+\Note 各モードでの具体的な設定値については\ref{sec:Values}節を参照。
+
+\paragraph{CJK中核セット}
+「CJK中核セット」は以下の文字種が属するブロックのセットを指す。
+(括弧内は、モード設定において当該のブロックに設定される
+和文カテゴリの値。)
+  \begin{itemize}
+  \item 漢字・部首・注音字母(|kanji|)
+  \item ひらがな・カタカナ(|kana|)
+   \item CJK記号の一部・全角半角互換形・彝文字
+    ・西夏文字・女書文字・契丹文字(|cjk|)
+    \Note モードCCVが2以上の場合、|cjk12|の再分割の|cjk1b|、
+      |cjk1c|は|kana|に設定される。
+  \item ハングル完成形・ハングル字母(|hangul|)
+\end{itemize}
+
+%-------------------
+\subsection{和文トークン状態}
+\label{ssec:cjktoken}
+
+{\upTeX}には、和文カテゴリ(kcatcode)とは別に、
+非ASCII文字全体の和文・欧文扱いの設定を一斉に切り替えるための
+命令が存在する
+\footnote{これらの命令は本パッケージが提供するものではなく
+  {\upTeX}に元から存在するものであることに注意。}。
+\begin{itemize}
+\item |\enablecjktoken|\Means
+  和文・欧文扱いの設定を和文カテゴリの設定に従わせる。
+\item |\disablecjktoken|\Means
+  和文カテゴリ設定に関わらず非ASCII文字全体を欧文扱いにする。
+  \Note あたかも全ブロックの和文カテゴリを|noncjk|(15)に設定したのと
+  同じ状態になる。
+\item |\forcecjktoken|\Means
+  和文カテゴリ設定に関わらず非ASCII文字全体を和文扱いにする。
+  \Note 和文カテゴリが|noncjk|(15)であるブロックは
+  あたかもそれが|cjk|(18)であるように動作する。
+\end{itemize}
+
+これらの命令群により変更されるパラメタのことを本パッケージでは
+「\strong{和文トークン状態}」と呼ぶことにする
+\footnote{「和文トークン状態」を指す公式の用語は存在しないと思われる。}。
+
+%===========================================================
 \section{パッケージ読込}
 \label{sec:Loading}
 
@@ -68,16 +237,20 @@
   \item |ccv2|\Means
     モードCCVを2({\upTeX} v0.29~1.22と互換)とする。
   \item |ccv3|\Means
-    モードCCVを3({\upTeX} v1.23以降と互換)とする。
+    モードCCVを3({\upTeX} v1.23と互換)とする。
+  \item |ccv4|\Means
+    モードCCVを4({\upTeX} v1.25以降と互換)とする。
   \item |real|または|ccv+|\Means
-    モードCCVをエンジンの実のCCVと一致させる。
+    モードCCVを{\upTeX}の実際のCCVと一致させる。
   \end{itemize}
-\item |\cjkcategorymode|\strong{命令で有効なモード値}\Means
-  和文カテゴリがモードに従って設定される。
-  \Note モード値オプションが非指定の場合は、パッケージ読込時に
-  和文カテゴリが変更されることはない。
+\item \strong{和文カテゴリモード値}\Means
+  |\cjkcategorymode|命令で有効なモード値(|prefernoncjk|等)
+  をオプションとして指定可能で、
+  この場合、和文カテゴリがモードに従って設定される。
+  \Note 和文カテゴリモード値オプションが指定されていない場合は、
+  パッケージ読込時に和文カテゴリが変更されることはない。
 \item |nomode|\Means
-  モード値オプションの効果を打ち消す。
+  和文カテゴリモード値オプションの効果を打ち消す。
 \end{itemize}
 
 %===========================================================
@@ -84,26 +257,45 @@
 \section{機能}
 \label{sec:Function}
 
+%-------------------
+\subsection{和文カテゴリ設定に関連する機能}
+\label{ssec:cjkcategory-function}
+
 \begin{itemize}
 \item |\cjkcategory{|\Meta{ブロック}|,...}{|\Meta{カテゴリ}|}|\Means
-  \Meta{ブロック}で表される文字ブロック(複数指定が可能)の
+  \Meta{ブロック}で指定される文字ブロック(複数指定が可能)の
   和文カテゴリを\Meta{カテゴリ}に変更する。
 
   \Meta{ブロック}は以下の何れかの形式で指定する:
   \begin{itemize}
-  \item ブロックID(後述)
-  %\item ブロック名
+  \item ブロックID(\ref{sec:Blocks}節参照)%
+    \footnote{ブロックIDによる指定は{\upTeX}の版の影響を受けない。
+      例えば、{\upTeX}の版(およびモードCCV指定)が何であっても、
+      |latn1|は常に“Latin-1 Supplement”の範囲(U+0080~00FF)を指す。
+      実CCVが3以上の場合に|latn1|のカテゴリ設定を行った場合は、
+      実際には|latnx|と|latny|の2つのブロックに対して設定が行われる。}
   \item 非ASCII文字1つ\Means
-    その文字の属するブロックを指す。
-    \Note 文字による指定は「{\upTeX}の版によるブロック分割の差異」に
-      影響されることに注意。
-  %\item 整数値\Means
-  %  その符号位置の属するブロックを指す。
+    当該の文字が属するブロックを指す。
+    \Note 「文字の属するブロック」は、モードCCV設定とは無関係であり
+    常に{\upTeX}の実際のブロック定義に従う。
+    従ってその動作は{\upTeX}の版に依存することに注意。
+  \item 符号値(整数値)\Means
+    当該の符号値の文字が属するブロックを指す。
+    符号値は以下の形式で指定できる\Means
+    \begin{itemize}
+    \item \Meta{16進表記}\Means 例えば|1F600|。
+    \item |"|\Meta{16進表記}\Means 例えば|"1F600|。
+      \Note 16進数字の|A|~|F|は大文字で書く。
+    \item |+|\Meta{整数}\Means 例えば|+128512|は10進表記で128512、
+      すなわちU+1F600を表す。
+      \Note \Meta{整数}の部分には一般に任意の
+      「{\LaTeXTeX}で整数を表すテキスト」が記述できる。
+      例えば|+\value{mycode}|のように書くとカウンタ値を指定できる。
+    \end{itemize}
+    \Note 前項と同様、動作が{\upTeX}の版に依存することに注意を要する。
   \end{itemize}
-  \Meta{カテゴリ}は以下に示す「カテゴリID」で指定する
-    \footnote{括弧内の整数値は{\upTeX}が内部で用いている
-      「カテゴリコード値」であり、「カテゴリID」の代わりに
-      この値を指定することもできる。}:
+  \Meta{カテゴリ}は「カテゴリID」または
+  「カテゴリコード」(括弧内の整数値)で指定する。
   \begin{itemize}
   \item |noncjk|(15)\Means 欧文扱い
   \item |kanji|または|han|(16)\Means 漢字扱い
@@ -113,62 +305,71 @@
   \end{itemize}
 
   和文カテゴリの変更は局所的(グルーピングに従う)である。
+
   \Note モードCCVの指定は|\cjkcategory|の動作には影響を与えない。
 
+  \Note “Basic Latin”ブロック(|latn|)のカテゴリは常に|noncjk|で
+    なければならず、|noncjk|以外に変更しようとするとエラーになる。
+
 \item |\cjkcategorymode{|\Meta{モード}|}|\Means
   全てのブロックの和文カテゴリの一括設定(モード設定)を行う。
-  モードには以下のものがある。
-  何れのセットも、後述する「CJK中核セット」の設定は共通であり、
-  それ以外のブロックが欧文扱い(|noncjk|)であるか
-  和文扱い(|cjk|)であるかが異なる。
+  有効なモード設定の値は以下の通りである。
+  \Note モード設定の詳細については
+  \ref{ssec:cjkcategory-mode}節を参照。
   \begin{itemize}
-  \item |forcecjk|\Means
-    ASCII文字のみ欧文扱いで他のブロックは全て和文扱い
-    (|noncjk|以外)とする。
-    和文フォントの中のUnicode値の割当がある全ての文字を
-    和文文字として直接用いることができる。
-  \item |default|\Means
-    指定のモードCCVにおける既定の設定と一致させる。
-    \Note モードCCVが2以下の場合は|forcecjk|と同一の設定になる。
-    %\Note モードCCVがエンジンの実のCCVと一致する場合は、
-    %  エンジンの既定の設定と一致する。
-    \Note モードCCVが3の場合の\strong{仕様は未確定}である。
-      現状の動作は「v1.23の既定設定と一致させる」となっているが、
-      この動作は\strong{将来変更される可能性がある}。
-  \item |prefercjk|\Means
-    和文扱いのブロックとして、「CJK中核セット」のものに加えて、
-    「Adobeの定めるCJK文字集合
-    \footnote{Adobe-Japan1、Adobe-GB1、Adobe-CNS1、Adobe-Korea1。}%
-    の何れかと共通部分をもつ文字ブロック」を加えて、
-    残りを欧文扱いに設定する。
-  \item |prefercjkvar|\Means
-    |prefercjk|において、ギリシャ・キリル文字の
-    ブロックを欧文扱いに変更したもの。
-  \item |japanese|\Means
-    和文扱いのブロックとして、「CJK中核セット」のものに加えて、
-    「Adobe-Japan1の全角幅のグリフ
-    の何れかと共通部分をもつ文字ブロック」を加えて、
-    残りを欧文扱いに設定する。
-  \item |japanesevar|\Means
-    |japanese|において、ギリシャ・キリル文字の
-    ブロックを欧文扱いに変更したもの。
-  \item |prefernoncjk|\Means
-    「CJK中核セット」のブロックのみを和文扱いとし、
-    残りを欧文扱いにする。
+  \item |forcecjk|
+  \item |default|
+  \item |prefercjk|
+  \item |prefercjkvar|
+  \item |japanese|
+  \item |japanesevar|
+  \item |prefernoncjk|
   \end{itemize}
 
-  ここで「CJK中核セット」の内容は以下のとおりである。
-    \begin{itemize}
-    \item 漢字・部首・注音字母\Means |kanji|に設定。
-    \item ひらがな・カタカナ\Means |kana|に設定。
-    \item CJK記号の一部・全角半角互換形・彝文字
-      ・西夏文字・女書文字・契丹文字\Means |cjk|に設定。
-      \Note モードCCVが2以上の場合、|cjk12|の再分割の|cjk1b|、
-        |cjk1c|は|kana|に設定される。
-    \item ハングル完成形・ハングル字母\Means |hangul|に設定。
+\end{itemize}
+
+%-------------------
+\subsection{和文トークン状態に関する機能}
+\label{ssec:cjktoken-function}
+
+\Note 「和文トークン状態」については\ref{ssec:cjktoken}節を参照。
+
+\begin{itemize}
+
+\item |\getcjktokenmode|\Means
+  現在の和文トークン状態の取得して、
+  それを表す整数値を|\thecjktokenmode|に設定する。
+  \begin{itemize}
+  \item 0\Means |\disablecjktoken|の状態。
+  \item 1\Means |\enablecjktoken|の状態。
+  \item 2\Means |\forcecjktoken|の状態。
+  \item 255\Means 状態取得に失敗した%
+  \footnote{{\TeX} Live 2022以降で{\eTeX}拡張無しの{\upTeX}エンジンの
+    場合は取得ができない。
+    しかし、2014年以降の{\LaTeX}カーネルは{\eTeX}拡張を必須としている
+    ので、そのようなエンジンの上で{\LaTeX}が動作している可能性は
+    ほぼ考えられない。
+    従って、現実的には255が返ることはないと思ってよい。}。
   \end{itemize}
-  \Note 各モードでの具体的な設定値については\ref{sec:Values}節を参照。
 
+\item |\setcjktokenmode{|\Meta{整数値}|}|\Means
+  |\getcjktokenmode|の規則の整数値を用いて和文トークン状態を設定する。
+
+\item |\withcjktokendisabled{|\Meta{コード}|}|\Means
+  一時的に|\disablecjktoken|に変更した状態で、
+  \Meta{コード}を実行する。
+\item |\withcjktokenenabled{|\Meta{コード}|}|\Means
+  一時的に|\enablecjktoken|に変更した状態で、
+  \Meta{コード}を実行する。
+\item |\withcjktokenforced{|\Meta{コード}|}|\Means
+  一時的に|\forcecjktoken|に変更した状態で、
+  \Meta{コード}を実行する。
+\Note 以上3つの命令はどれも、
+「和文トークン状態を設定して\Meta{コード}を実行した後
+和文トークン状態を再設定する」
+という動作を行う。
+そのため新たに局所化グループに入ることはない。
+
 \end{itemize}
 
 %===========================================================
@@ -176,9 +377,11 @@
 \label{sec:CCV}
 
 \noindent \strong{注意}\Means
-この節に述べられている説明は現状の仕様と食い違っている部分があり、
+\ref{sec:CCV}節および\ref{sec:Blocks}に述べられている
+説明は現状の仕様と食い違っている部分があり、
 大幅な改訂が必要な状態である。
-現状の仕様では、モードCCVの影響を受けるのはモード設定の定義のみであり、
+少なくとも1.1版以降の仕様では、
+モードCCVの影響を受けるのはモード設定の定義のみであり、
 ブロック分割は常に実際のエンジンのものに一致させている。
 
 \bigskip
@@ -197,11 +400,16 @@
 \item 文字ブロックの分割の違いを
   「\strong{文字分類バージョン}(CCV;Character Category Version)」
   と呼ぶことにする。
-  現状では次のものが存在する。
+  現状では次のものが存在する
+  \footnote{{\upTeX}のv1.24には文字ブロック分割に関してバグが存在するので、
+    CCVの定義からは除外する。
+    なお、実際にv1.24の{\upTeX}で本パッケージが読み込まれた場合は、
+    実CCVは1と見なされる(はずである)。}。
   \begin{itemize}
   \item バージョン1: {\upTeX} v0.11~0.28と互換
   \item バージョン2: {\upTeX} v0.29~1.22と互換
-  \item バージョン3: {\upTeX} v1.23以降と互換
+  \item バージョン3: {\upTeX} v1.23と互換
+  \item バージョン4: {\upTeX} v1.25以降と互換
   \end{itemize}
 
 \item \Pkg{pxcjkcat}の読込時に、そのオプションにおいて
@@ -351,7 +559,7 @@
 \xI{lepc}  \xV{2} \xR  {1C00}  {1C4F} \xN{Lepcha}\par
 \xI{olck}  \xV{2} \xR  {1C50}  {1C7F} \xN{Ol Chiki}\par
 \xI{cyrlC} \xV{2} \xR  {1C80}  {1C8F} \xN{Cyrillic Extended-C}\par
-\xI{geor2} \xV{3} \xR  {1C90}  {1CBF} \xN{Georgian Extended}\par
+\xI{geor2} \xV{4} \xR  {1C90}  {1CBF} \xN{Georgian Extended}\par
 \xI{sund1} \xV{2} \xR  {1CC0}  {1CCF} \xN{Sundanese Supplement}\par
 \xI{sym38} \xV{2} \xR  {1CD0}  {1CFF} \xN{Vedic Extensions}\par
 \xI{latn4} \xV{1} \xR  {1D00}  {1D7F} \xN{Phonetic Extensions}\par
@@ -491,13 +699,13 @@
 \xI{phlp}  \xV{2} \xR {10B80} {10BAF} \xN{Psalter Pahlavi}\par
 \xI{orkh}  \xV{2} \xR {10C00} {10C4F} \xN{Old Turkic}\par
 \xI{hung}  \xV{2} \xR {10C80} {10CFF} \xN{Old Hungarian}\par
-\xI{rohg}  \xV{3} \xR {10D00} {10D3F} \xN{Hanifi Rohingya}\par
+\xI{rohg}  \xV{4} \xR {10D00} {10D3F} \xN{Hanifi Rohingya}\par
 \xI{sym42} \xV{2} \xR {10E60} {10E7F} \xN{Rumi Numeral Symbols}\par
-\xI{yezi}  \xV{3} \xR {10E80} {10EBF} \xN{Yezidi}\par
-\xI{sogo}  \xV{3} \xR {10F00} {10F2F} \xN{Old Sogdian}\par
-\xI{sogd}  \xV{3} \xR {10F30} {10F6F} \xN{Sogdian}\par
-\xI{chrs}  \xV{3} \xR {10FB0} {10FDF} \xN{Chorasmian}\par
-\xI{elym}  \xV{3} \xR {10FE0} {10FFF} \xN{Elymaic}\par
+\xI{yezi}  \xV{4} \xR {10E80} {10EBF} \xN{Yezidi}\par
+\xI{sogo}  \xV{4} \xR {10F00} {10F2F} \xN{Old Sogdian}\par
+\xI{sogd}  \xV{4} \xR {10F30} {10F6F} \xN{Sogdian}\par
+\xI{chrs}  \xV{4} \xR {10FB0} {10FDF} \xN{Chorasmian}\par
+\xI{elym}  \xV{4} \xR {10FE0} {10FFF} \xN{Elymaic}\par
 \xI{brah}  \xV{2} \xR {11000} {1107F} \xN{Brahmi}\par
 \xI{kthi}  \xV{2} \xR {11080} {110CF} \xN{Kaithi}\par
 \xI{sora}  \xV{2} \xR {110D0} {110FF} \xN{Sora Sompeng}\par
@@ -516,10 +724,10 @@
 \xI{mong1} \xV{2} \xR {11660} {1167F} \xN{Mongolian Supplement}\par
 \xI{takr}  \xV{2} \xR {11680} {116CF} \xN{Takri}\par
 \xI{ahom}  \xV{2} \xR {11700} {1174F} \xN{Ahom}\par
-\xI{dogr}  \xV{3} \xR {11800} {1184F} \xN{Dogra}\par
+\xI{dogr}  \xV{4} \xR {11800} {1184F} \xN{Dogra}\par
 \xI{wara}  \xV{2} \xR {118A0} {118FF} \xN{Warang Citi}\par
-\xI{diak}  \xV{3} \xR {11900} {1195F} \xN{Dives Akuru}\par
-\xI{nand}  \xV{3} \xR {119A0} {119FF} \xN{Nandinagari}\par
+\xI{diak}  \xV{4} \xR {11900} {1195F} \xN{Dives Akuru}\par
+\xI{nand}  \xV{4} \xR {119A0} {119FF} \xN{Nandinagari}\par
 \xI{zanb}  \xV{3} \xR {11A00} {11A4F} \xN{Zanabazar Square}\par
 \xI{soyo}  \xV{3} \xR {11A50} {11AAF} \xN{Soyombo}\par
 \xI{pauc}  \xV{2} \xR {11AC0} {11AFF} \xN{Pau Cin Hau}\par
@@ -526,30 +734,30 @@
 \xI{bhks}  \xV{2} \xR {11C00} {11C6F} \xN{Bhaiksuki}\par
 \xI{marc}  \xV{2} \xR {11C70} {11CBF} \xN{Marchen}\par
 \xI{gonm}  \xV{3} \xR {11D00} {11D5F} \xN{Masaram Gondi}\par
-\xI{gong}  \xV{3} \xR {11D60} {11DAF} \xN{Gunjala Gondi}\par
-\xI{maka}  \xV{3} \xR {11EE0} {11EFF} \xN{Makasar}\par
-\xI{lisu1} \xV{3} \xR {11FB0} {11FBF} \xN{Lisu Supplement}\par
-\xI{taml1} \xV{3} \xR {11FC0} {11FFF} \xN{Tamil Supplement}\par
+\xI{gong}  \xV{4} \xR {11D60} {11DAF} \xN{Gunjala Gondi}\par
+\xI{maka}  \xV{4} \xR {11EE0} {11EFF} \xN{Makasar}\par
+\xI{lisu1} \xV{4} \xR {11FB0} {11FBF} \xN{Lisu Supplement}\par
+\xI{taml1} \xV{4} \xR {11FC0} {11FFF} \xN{Tamil Supplement}\par
 \xI{xsux}  \xV{1} \xR {12000} {123FF} \xN{Cuneiform}\par
 \xI{xsux1} \xV{1} \xR {12400} {1247F} \xN{Cuneiform Numbers and Punctuation}\par
 \xI{xsux2} \xV{2} \xR {12480} {1254F} \xN{Early Dynastic Cuneiform}\par
 \xI{egyp}  \xV{2} \xR {13000} {1342F} \xN{Egyptian Hieroglyphs}\par
-\xI{egyp1} \xV{3} \xR {13430} {1343F} \xN{Egyptian Hieroglyph Format Controls}\par
+\xI{egyp1} \xV{4} \xR {13430} {1343F} \xN{Egyptian Hieroglyph Format Controls}\par
 \xI{hluw}  \xV{2} \xR {14400} {1467F} \xN{Anatolian Hieroglyphs}\par
 \xI{bamu1} \xV{2} \xR {16800} {16A3F} \xN{Bamum Supplement}\par
 \xI{mroo}  \xV{2} \xR {16A40} {16A6F} \xN{Mro}\par
 \xI{bass}  \xV{2} \xR {16AD0} {16AFF} \xN{Bassa Vah}\par
 \xI{hmng}  \xV{2} \xR {16B00} {16B8F} \xN{Pahawh Hmong}\par
-\xI{medf}  \xV{3} \xR {16E40} {16E9F} \xN{Medefaidrin}\par
+\xI{medf}  \xV{4} \xR {16E40} {16E9F} \xN{Medefaidrin}\par
 \xI{plrd}  \xV{2} \xR {16F00} {16F9F} \xN{Miao}\par
 \xI{cjk14} \xV{2} \xR {16FE0} {16FFF} \xN{Ideographic Symbols and Punctuation}\par
 \xI{tang}  \xV{2} \xR {17000} {187FF} \xN{Tangut}\par
 \xI{tang1} \xV{2} \xR {18800} {18AFF} \xN{Tangut Components}\par
-\xI{kits}  \xV{3} \xR {18B00} {18CFF} \xN{Khitan Small Script}\par
-\xI{tang2} \xV{3} \xR {18D00} {18D7F} \xN{Tangut Supplement}\par
+\xI{kits}  \xV{4} \xR {18B00} {18CFF} \xN{Khitan Small Script}\par
+\xI{tang2} \xV{4} \xR {18D00} {18D7F} \xN{Tangut Supplement}\par
 \xI{kana2} \xV{2} \xR {1B000} {1B0FF} \xN{Kana Supplement}\par
 \xI{kanaA} \xV{3} \xR {1B100} {1B12F} \xN{Kana Extended-A}\par
-\xI{kana3} \xV{3} \xR {1B130} {1B16F} \xN{Small Kana Extension}\par
+\xI{kana3} \xV{4} \xR {1B130} {1B16F} \xN{Small Kana Extension}\par
 \xI{nshu}  \xV{3} \xR {1B170} {1B2FF} \xN{Nushu}\par
 \xI{dupl}  \xV{2} \xR {1BC00} {1BC9F} \xN{Duployan}\par
 \xI{sym53} \xV{2} \xR {1BCA0} {1BCAF} \xN{Shorthand Format Controls}\par
@@ -556,18 +764,18 @@
 \xI{sym32} \xV{1} \xR {1D000} {1D0FF} \xN{Byzantine Musical Symbols}\par
 \xI{sym33} \xV{1} \xR {1D100} {1D1FF} \xN{Musical Symbols}\par
 \xI{sym34} \xV{1} \xR {1D200} {1D24F} \xN{Ancient Greek Musical Notation}\par
-\xI{sym58} \xV{3} \xR {1D2E0} {1D2FF} \xN{Mayan Numerals}\par
+\xI{sym58} \xV{4} \xR {1D2E0} {1D2FF} \xN{Mayan Numerals}\par
 \xI{sym35} \xV{1} \xR {1D300} {1D35F} \xN{Tai Xuan Jing Symbols}\par
 \xI{sym36} \xV{1} \xR {1D360} {1D37F} \xN{Counting Rod Numerals}\par
 \xI{sym37} \xV{1} \xR {1D400} {1D7FF} \xN{Mathematical Alphanumeric Symbols}\par
 \xI{sgnw}  \xV{2} \xR {1D800} {1DAAF} \xN{Sutton SignWriting}\par
 \xI{glag1} \xV{2} \xR {1E000} {1E02F} \xN{Glagolitic Supplement}\par
-\xI{hmnp}  \xV{3} \xR {1E100} {1E14F} \xN{Nyiakeng Puachue Hmong}\par
-\xI{wcho}  \xV{3} \xR {1E2C0} {1E2FF} \xN{Wancho}\par
+\xI{hmnp}  \xV{4} \xR {1E100} {1E14F} \xN{Nyiakeng Puachue Hmong}\par
+\xI{wcho}  \xV{4} \xR {1E2C0} {1E2FF} \xN{Wancho}\par
 \xI{mend}  \xV{2} \xR {1E800} {1E8DF} \xN{Mende Kikakui}\par
 \xI{adlm}  \xV{2} \xR {1E900} {1E95F} \xN{Adlam}\par
-\xI{sym59} \xV{3} \xR {1EC70} {1ECBF} \xN{Indic Siyaq Numbers}\par
-\xI{sym61} \xV{3} \xR {1ED00} {1ED4F} \xN{Ottoman Siyaq Numbers}\par
+\xI{sym59} \xV{4} \xR {1EC70} {1ECBF} \xN{Indic Siyaq Numbers}\par
+\xI{sym61} \xV{4} \xR {1ED00} {1ED4F} \xN{Ottoman Siyaq Numbers}\par
 \xI{sym51} \xV{2} \xR {1EE00} {1EEFF} \xN{Arabic Mathematical Alphabetic Symbols}\par
 \xI{sym43} \xV{2} \xR {1F000} {1F02F} \xN{Mahjong Tiles}\par
 \xI{sym44} \xV{2} \xR {1F030} {1F09F} \xN{Domino Tiles}\par
@@ -582,9 +790,9 @@
 \xI{sym55} \xV{2} \xR {1F780} {1F7FF} \xN{Geometric Shapes Extended}\par
 \xI{sym56} \xV{2} \xR {1F800} {1F8FF} \xN{Supplemental Arrows-C}\par
 \xI{sym57} \xV{2} \xR {1F900} {1F9FF} \xN{Supplemental Symbols and Pictographs}\par
-\xI{sym60} \xV{3} \xR {1FA00} {1FA6F} \xN{Chess Symbols}\par
-\xI{sym62} \xV{3} \xR {1FA70} {1FAFF} \xN{Symbols and Pictographs Extended-A}\par
-\xI{sym63} \xV{3} \xR {1FB00} {1FBFF} \xN{Symbols for Legacy Computing}\par
+\xI{sym60} \xV{4} \xR {1FA00} {1FA6F} \xN{Chess Symbols}\par
+\xI{sym62} \xV{4} \xR {1FA70} {1FAFF} \xN{Symbols and Pictographs Extended-A}\par
+\xI{sym63} \xV{4} \xR {1FB00} {1FBFF} \xN{Symbols for Legacy Computing}\par
 \xI{haniB} \xV{1} \xR {20000} {2A6DF} \xN{CJK Unified Ideographs Extension B}\par
 \xI{haniC} \xV{2} \xR {2A700} {2B73F} \xN{CJK Unified Ideographs Extension C}\par
 \xI{haniD} \xV{2} \xR {2B740} {2B81F} \xN{CJK Unified Ideographs Extension D}\par
@@ -591,7 +799,7 @@
 \xI{haniE} \xV{2} \xR {2B820} {2CEAF} \xN{CJK Unified Ideographs Extension E}\par
 \xI{haniF} \xV{3} \xR {2CEB0} {2EBEF} \xN{CJK Unified Ideographs Extension F}\par
 \xI{hani2} \xV{1} \xR {2F800} {2FA1F} \xN{CJK Compatibility Ideographs Supplement}\par
-\xI{haniG} \xV{3} \xR {30000} {3134F} \xN{CJK Unified Ideographs Extension G}\par
+\xI{haniG} \xV{4} \xR {30000} {3134F} \xN{CJK Unified Ideographs Extension G}\par
 \xI{spc07} \xV{1} \xR {E0000} {E007F} \xN{Tags}\par
 \xI{spc08} \xV{1} \xR {E0100} {E01EF} \xN{Variation Selectors Supplement}\par
 \xI{spc09} \xV{1} \xR {F0000} {FFFFF} \xN{Supplementary Private Use Area-A}\par

Modified: trunk/Master/texmf-dist/tex/latex/pxcjkcat/pxcjkcat.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pxcjkcat/pxcjkcat.sty	2022-06-08 20:45:43 UTC (rev 63517)
+++ trunk/Master/texmf-dist/tex/latex/pxcjkcat/pxcjkcat.sty	2022-06-08 20:45:58 UTC (rev 63518)
@@ -10,9 +10,45 @@
 
 %% package declaration
 \NeedsTeXFormat{pLaTeX2e}
-\ProvidesPackage{pxcjkcat}[2022/05/25 v1.2 PX cjk-category mode]
+\ProvidesPackage{pxcjkcat}[2022/06/06 v1.4 PX cjk-category mode]
 \def\pxkc at pkgname{pxcjkcat}
 
+%% code guards
+\edef\pxkc at restore@codes{%
+\catcode33=\the\catcode33%
+\catcode34=\the\catcode34%
+\catcode39=\the\catcode39%
+\catcode43=\the\catcode43%
+\catcode45=\the\catcode45%
+\catcode46=\the\catcode46%
+\catcode47=\the\catcode47%
+\catcode58=\the\catcode58%
+\catcode60=\the\catcode60%
+\catcode62=\the\catcode62%
+\catcode63=\the\catcode63%
+\catcode94=\the\catcode94%
+\catcode96=\the\catcode96%
+\catcode239=\the\catcode239%
+\endlinechar=\the\endlinechar%
+\relax}%
+\catcode33=12 % <!>
+\catcode34=12 % <">
+\catcode39=12 % <'>
+\catcode43=12 % <+>
+\catcode45=12 % <->
+\catcode46=12 % <.>
+\catcode47=12 % </>
+\catcode58=12 % <:>
+\catcode60=12 % <<>
+\catcode62=12 % <>>
+\catcode63=12 % <?>
+\catcode94=7 % <^>
+\catcode96=12 % <`>
+\catcode239=13 %
+\AtEndOfPackage{%
+\pxkc at restore@codes
+\let\pxkc at restore@codes\relax}
+
 %--------------------------------------- general
 
 %% error messages
@@ -30,10 +66,20 @@
   \PackageError\pxkc at pkgname
    {Invalid name (#1) for cjk-category mode}%
    {\@eha}}
+\def\pxkc at err@naltn{%
+  \PackageError\pxkc at pkgname
+   {Change to cjk-category of 'latn' is forbidden}%
+   {\@eha}}
 \def\pxkc at warn@dfblk#1{%
   \PackageWarning\pxkc at pkgname
-   {Defunct Unicode block '#1' is\MessageBreak
+   {Unsupported Unicode block '#1' is\MessageBreak
     specified}}
+\def\pxkc at err@ivfmt#1{%
+  \PackageError\pxkc at pkgname
+   {Block specs are given in bad format%
+    \ifx\detokenize\@undefined\else
+      :\MessageBreak \space'\detokenize{#1}'\fi}%
+   {\@eha}}
 
 %% \pxkc at debug{<message>}
 \ifx\bxUseDebug\@undefined
@@ -42,13 +88,17 @@
 \def\pxkc at debug#1{\typeout{**[\pxkc at pkgname] #1}}
 \fi
 
+%% packages
+\RequirePackage{keyval}\relax
+
 %% unique tokens
 \def\pxkc at end{\pxkc at end@}
+\def\pxkc at mt{\pxkc at mt@}
 \let\pxkc at mk\indent
 
 %% variables
 \newif\ifpxkc at ok
-\newif\ifpxkc at warn@defunct \pxkc at warn@defuncttrue
+\newif\ifpxkc at warn@bad \pxkc at warn@badtrue
 \let\pxkc at good@mccv\relax
 \let\pxkc at mccv\relax
 \let\pxkc at ccmode@opt\relax
@@ -64,6 +114,22 @@
 \def\pxkc at expanded#1{%
   \edef\pxkc at next{#1}\pxkc at next}
 
+%% \pxkc at setup{<key>=<value>,...}
+\def\pxkc at setup#1{%
+  \let\pxkc at KV@errx\KV at errx \def\KV at errx##1{\@unknownoptionerror}%
+  \setkeys{\pxkc at pkgname}{#1}
+  \let\KV at errx\pxkc at KV@errx}
+
+%% \pxkc at handle@key{<key>}{<value>}{<name>}
+\def\pxkc at handle@key#1#2#3{%
+  \expandafter\let\expandafter\pxkc at tmpa\csname pxkc@#3\endcsname
+  \ifx\pxkc at tmpa\relax
+    \PackageError\pxkc at pkgname
+     {Invalid value for key '#1':\MessageBreak\@spaces#2}%
+     {\@eha}%
+  \else \pxkc at tmpa
+  \fi}
+
 %--------------------------------------- package options
 
 %% mode CCV options
@@ -70,6 +136,7 @@
 \DeclareOption{ccv1}{\chardef\pxkc at mccv=1 }
 \DeclareOption{ccv2}{\chardef\pxkc at mccv=2 }
 \DeclareOption{ccv3}{\chardef\pxkc at mccv=3 }
+\DeclareOption{ccv4}{\chardef\pxkc at mccv=4 }
 \DeclareOption{ccv+}{\chardef\pxkc at mccv=0 }
 \DeclareOption{real}{\chardef\pxkc at mccv=0 }
 %% mode options
@@ -83,11 +150,21 @@
 \def\pxkc at M@@default      {1}
 \def\pxkc at M@@nomode       {0}% special
 \chardef\pxkc at good@mccv=0
+%% key-value options
+\define at key{\pxkc at pkgname}{ccv}{%
+  \pxkc at handle@key{ccv}{#1}{kv at ccv@@#1}}
+\@namedef{pxkc at kv@ccv@@1}{\chardef\pxkc at mccv=1 }
+\@namedef{pxkc at kv@ccv@@2}{\chardef\pxkc at mccv=2 }
+\@namedef{pxkc at kv@ccv@@3}{\chardef\pxkc at mccv=3 }
+\@namedef{pxkc at kv@ccv@@4}{\chardef\pxkc at mccv=4 }
+\@namedef{pxkc at kv@ccv@@real}{\chardef\pxkc at mccv=0 }
+%% dispatch
 \DeclareOption*{%
-  \@ifundefined{pxkc at M@@\CurrentOption}{\@unknownoptionerror}{%
+  \@ifundefined{pxkc at M@@\CurrentOption}{% key option
+    \expandafter\pxkc at setup\expandafter{\CurrentOption}%
+  }{%else; mode option
     \chardef\pxkc at good@mccv=\@nameuse{pxkc at M@@\CurrentOption}\relax
     \edef\pxkc at ccmode@opt{\CurrentOption}}}
-%% dispatch
 \ProcessOptions\relax
 
 %% clear up
@@ -120,6 +197,16 @@
     \@ehc}
 \expandafter\endinput\fi\relax
 
+%% engine version
+\chardef\pxkc at uptex@version=0
+\def\pxkc at next#1.#2#3#4\pxkc at end{%
+  \ifx\pxkc at mk#1\pxkc at mk \ifnum99<1#2#3
+    \chardef\pxkc at uptex@version=\the\uptexversion#2#3\relax
+  \fi\fi}
+\ifx\uptexversion\@undefined\else \ifx\uptexrevision\@undefined\else
+  \expandafter\pxkc at next\uptexrevision...\pxkc at end
+\fi\fi
+
 %%-------- classification version check
 
 %% \pxkc at is@same at block
@@ -136,15 +223,26 @@
 \else
   \pxkc at is@same at block{"A0}{"C0}\ifpxkc at ok
     \chardef\pxkc at ccv=2   % v0.29+
+  \else\ifnum\pxkc at uptex@version<125
+    \chardef\pxkc at ccv=3   % v1.23+
   \else
-    \chardef\pxkc at ccv=3   % v1.23+
-  \fi
+    \chardef\pxkc at ccv=4   % v1.25+
+  \fi\fi
 \fi
 \ifx\bxDebugCcv\@undefined\else % override
   \chardef\pxkc at ccv=\bxDebugCcv\relax
 \fi
+\pxkc at debug{upTeX version \number\pxkc at uptex@version}
 \pxkc at debug{CJK category version \number\pxkc at ccv}
 
+%% Here show warning about the buggy engine version (v1.24)
+\ifnum\pxkc at ccv=1 \ifnum\pxkc at uptex@version=124
+  \PackageWarningNoLine\pxkc at pkgname
+   {The upTeX engine of version 1.24 is used!\MessageBreak
+    This version has a bug on CJK category,\MessageBreak
+    and here real CCV is regard as 1}
+\fi\fi
+
 %% Here show warning for mode CCV recommendation.
 %% (No warning if the good mode CCV is unavailable.)
 \ifnum\pxkc at good@mccv>\pxkc at mccv \ifnum\pxkc at good@mccv>\pxkc at ccv\else
@@ -172,7 +270,24 @@
   \let\pxkc at mccv\pxkc at ccv
 \fi
 
-%% \pxkc at kcatcode
+%--------------------------------------- helpers
+
+%% constants
+\chardef\pxkc at ascii@max="7F
+
+%% \pxkc at cond\ifXXX...\fi{<true>}{<false>}
+\def\pxkc at cond#1\fi{%
+  #1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
+
+%% \pxkc at get@jchar{<charcode>}
+\def\pxkc at get@jchar#1{%
+  \begingroup
+    \forcecjktoken
+    \kansujichar\@ne=#1\relax
+    \xdef\pxkc at jchar{\kansuji\@ne}%
+  \endgroup}
+
+%% \pxkc at kcatcode{<charcode>}{<kcatcode>}
 \ifx\bxUseDebug\@undefined
 \def\pxkc at kcatcode#1#2{\kcatcode#1=#2\relax}
 \else
@@ -187,15 +302,17 @@
 %--------------------------------------- data tables
 
 %% variables
-%\[pxkc at B@@<block>] : start codepoint of the block
+%\[pxkc at B@@<block>] : start charcode of the block
 %\[pxkc at G@@<block>] : members of the group block
 %\[pxkc at C@@<category>] : kcatcode value of the category
 
 %% \pxkc at bslst
 \def\pxkc at bslst{\@gobble}
-%% \pxkc at bval{<min_ccv>}{<block>}{<ucs>}{<full_name>}
+\def\pxkc at bbslst{}
+%% \pxkc at bval{<min_ccv>}{<block>}{<charcode>}{<full_name>}
 \def\pxkc at bval#1#2#3#4{% #4 is unused for now
-  \ifnum#1>\pxkc at ccv\else
+  \ifnum#1<\z@\else
+    % check if min_ccv >= 2 (now min_ccv has no other role)
     \ifnum#1<\tw@ \pxkc at okfalse
     \else
       \@tempcnta=#3\relax
@@ -202,17 +319,20 @@
       \@tempcntb\@tempcnta \advance\@tempcntb\m at ne
       \pxkc at is@same at block\@tempcnta\@tempcntb
     \fi
-    \ifpxkc at ok \pxkc at debug{defunct: #2}%
-      \@namedef{pxkc at B@@#2}{-1}% defunct
+    \ifpxkc at ok % bad
+      \@namedef{pxkc at B@@#2}{-1}%
+      \edef\pxkc at bbslst{\pxkc at bbslst\space#2}%
+    \else\ifnum#3=\z@ % 'latn'
+      \@namedef{pxkc at B@@#2}{0}%
     \else
       \@namedef{pxkc at B@@#2}{#3}%
       \edef\pxkc at bslst{\pxkc at bslst,#2}%
-    \fi
+    \fi\fi
   \fi}
 %% \pxkc at gval{<gblock>}{<block>,...}{<full_name>}
 \def\pxkc at gval#1#2#3{\@namedef{pxkc at G@@#1}{#2}}
 
-%% \pxkc at cval{<category>}{<value>}
+%% \pxkc at cval{<category>}{<kcatcode>}
 \def\pxkc at cval#1#2{\@namedef{pxkc at C@@#1}{#2}}
 \pxkc at cval{noncjk}{15}
 \pxkc at cval{kanji}{16}
@@ -286,7 +406,7 @@
 \pxkc at bval{2}{lepc}{"1C00}      {Lepcha}
 \pxkc at bval{2}{olck}{"1C50}      {Ol Chiki}
 \pxkc at bval{2}{cyrlC}{"1C80}     {Cyrillic Extended-C}
-\pxkc at bval{3}{geor2}{"1C90}     {Georgian Extended}
+\pxkc at bval{4}{geor2}{"1C90}     {Georgian Extended}
 \pxkc at bval{2}{sund1}{"1CC0}     {Sundanese Supplement}
 \pxkc at bval{2}{sym38}{"1CD0}     {Vedic Extensions}
 \pxkc at bval{1}{latn4}{"1D00}     {Phonetic Extensions}
@@ -426,13 +546,13 @@
 \pxkc at bval{2}{phlp}{"10B80}     {Psalter Pahlavi}
 \pxkc at bval{2}{orkh}{"10C00}     {Old Turkic}
 \pxkc at bval{2}{hung}{"10C80}     {Old Hungarian}
-\pxkc at bval{3}{rohg}{"10D00}     {Hanifi Rohingya}
+\pxkc at bval{4}{rohg}{"10D00}     {Hanifi Rohingya}
 \pxkc at bval{2}{sym42}{"10E60}    {Rumi Numeral Symbols}
-\pxkc at bval{3}{yezi}{"10E80}     {Yezidi}
-\pxkc at bval{3}{sogo}{"10F00}     {Old Sogdian}
-\pxkc at bval{3}{sogd}{"10F30}     {Sogdian}
-\pxkc at bval{3}{chrs}{"10FB0}     {Chorasmian}
-\pxkc at bval{3}{elym}{"10FE0}     {Elymaic}
+\pxkc at bval{4}{yezi}{"10E80}     {Yezidi}
+\pxkc at bval{4}{sogo}{"10F00}     {Old Sogdian}
+\pxkc at bval{4}{sogd}{"10F30}     {Sogdian}
+\pxkc at bval{4}{chrs}{"10FB0}     {Chorasmian}
+\pxkc at bval{4}{elym}{"10FE0}     {Elymaic}
 \pxkc at bval{2}{brah}{"11000}     {Brahmi}
 \pxkc at bval{2}{kthi}{"11080}     {Kaithi}
 \pxkc at bval{2}{sora}{"110D0}     {Sora Sompeng}
@@ -451,10 +571,10 @@
 \pxkc at bval{2}{mong1}{"11660}    {Mongolian Supplement}
 \pxkc at bval{2}{takr}{"11680}     {Takri}
 \pxkc at bval{2}{ahom}{"11700}     {Ahom}
-\pxkc at bval{3}{dogr}{"11800}     {Dogra}
+\pxkc at bval{4}{dogr}{"11800}     {Dogra}
 \pxkc at bval{2}{wara}{"118A0}     {Warang Citi}
-\pxkc at bval{3}{diak}{"11900}     {Dives Akuru}
-\pxkc at bval{3}{nand}{"119A0}     {Nandinagari}
+\pxkc at bval{4}{diak}{"11900}     {Dives Akuru}
+\pxkc at bval{4}{nand}{"119A0}     {Nandinagari}
 \pxkc at bval{3}{zanb}{"11A00}     {Zanabazar Square}
 \pxkc at bval{3}{soyo}{"11A50}     {Soyombo}
 \pxkc at bval{2}{pauc}{"11AC0}     {Pau Cin Hau}
@@ -461,30 +581,30 @@
 \pxkc at bval{2}{bhks}{"11C00}     {Bhaiksuki}
 \pxkc at bval{2}{marc}{"11C70}     {Marchen}
 \pxkc at bval{3}{gonm}{"11D00}     {Masaram Gondi}
-\pxkc at bval{3}{gong}{"11D60}     {Gunjala Gondi}
-\pxkc at bval{3}{maka}{"11EE0}     {Makasar}
-\pxkc at bval{3}{lisu1}{"11FB0}    {Lisu Supplement}
-\pxkc at bval{3}{taml1}{"11FC0}    {Tamil Supplement}
+\pxkc at bval{4}{gong}{"11D60}     {Gunjala Gondi}
+\pxkc at bval{4}{maka}{"11EE0}     {Makasar}
+\pxkc at bval{4}{lisu1}{"11FB0}    {Lisu Supplement}
+\pxkc at bval{4}{taml1}{"11FC0}    {Tamil Supplement}
 \pxkc at bval{1}{xsux}{"12000}     {Cuneiform}
 \pxkc at bval{1}{xsux1}{"12400}    {Cuneiform Numbers and Punctuation}
 \pxkc at bval{2}{xsux2}{"12480}    {Early Dynastic Cuneiform}
 \pxkc at bval{2}{egyp}{"13000}     {Egyptian Hieroglyphs}
-\pxkc at bval{3}{egyp1}{"13430}    {Egyptian Hieroglyph Format Controls}
+\pxkc at bval{4}{egyp1}{"13430}    {Egyptian Hieroglyph Format Controls}
 \pxkc at bval{2}{hluw}{"14400}     {Anatolian Hieroglyphs}
 \pxkc at bval{2}{bamu1}{"16800}    {Bamum Supplement}
 \pxkc at bval{2}{mroo}{"16A40}     {Mro}
 \pxkc at bval{2}{bass}{"16AD0}     {Bassa Vah}
 \pxkc at bval{2}{hmng}{"16B00}     {Pahawh Hmong}
-\pxkc at bval{3}{medf}{"16E40}     {Medefaidrin}
+\pxkc at bval{4}{medf}{"16E40}     {Medefaidrin}
 \pxkc at bval{2}{plrd}{"16F00}     {Miao}
 \pxkc at bval{2}{cjk14}{"16FE0}    {Ideographic Symbols and Punctuation}
 \pxkc at bval{2}{tang}{"17000}     {Tangut}
 \pxkc at bval{2}{tang1}{"18800}    {Tangut Components}
-\pxkc at bval{3}{kits}{"18B00}     {Khitan Small Script}
-\pxkc at bval{3}{tang2}{"18D00}    {Tangut Supplement}
+\pxkc at bval{4}{kits}{"18B00}     {Khitan Small Script}
+\pxkc at bval{4}{tang2}{"18D00}    {Tangut Supplement}
 \pxkc at bval{2}{kana2}{"1B000}    {Kana Supplement}
 \pxkc at bval{3}{kanaA}{"1B100}    {Kana Extended-A}
-\pxkc at bval{3}{kana3}{"1B130}    {Small Kana Extension}
+\pxkc at bval{4}{kana3}{"1B130}    {Small Kana Extension}
 \pxkc at bval{3}{nshu}{"1B170}     {Nushu}
 \pxkc at bval{2}{dupl}{"1BC00}     {Duployan}
 \pxkc at bval{2}{sym53}{"1BCA0}    {Shorthand Format Controls}
@@ -491,18 +611,18 @@
 \pxkc at bval{1}{sym32}{"1D000}    {Byzantine Musical Symbols}
 \pxkc at bval{1}{sym33}{"1D100}    {Musical Symbols}
 \pxkc at bval{1}{sym34}{"1D200}    {Ancient Greek Musical Notation}
-\pxkc at bval{3}{sym58}{"1D2E0}    {Mayan Numerals}
+\pxkc at bval{4}{sym58}{"1D2E0}    {Mayan Numerals}
 \pxkc at bval{1}{sym35}{"1D300}    {Tai Xuan Jing Symbols}
 \pxkc at bval{1}{sym36}{"1D360}    {Counting Rod Numerals}
 \pxkc at bval{1}{sym37}{"1D400}    {Mathematical Alphanumeric Symbols}
 \pxkc at bval{2}{sgnw}{"1D800}     {Sutton SignWriting}
 \pxkc at bval{2}{glag1}{"1E000}    {Glagolitic Supplement}
-\pxkc at bval{3}{hmnp}{"1E100}     {Nyiakeng Puachue Hmong}
-\pxkc at bval{3}{wcho}{"1E2C0}     {Wancho}
+\pxkc at bval{4}{hmnp}{"1E100}     {Nyiakeng Puachue Hmong}
+\pxkc at bval{4}{wcho}{"1E2C0}     {Wancho}
 \pxkc at bval{2}{mend}{"1E800}     {Mende Kikakui}
 \pxkc at bval{2}{adlm}{"1E900}     {Adlam}
-\pxkc at bval{3}{sym59}{"1EC70}    {Indic Siyaq Numbers}
-\pxkc at bval{3}{sym61}{"1ED00}    {Ottoman Siyaq Numbers}
+\pxkc at bval{4}{sym59}{"1EC70}    {Indic Siyaq Numbers}
+\pxkc at bval{4}{sym61}{"1ED00}    {Ottoman Siyaq Numbers}
 \pxkc at bval{2}{sym51}{"1EE00}    {Arabic Mathematical Alphabetic Symbols}
 \pxkc at bval{2}{sym43}{"1F000}    {Mahjong Tiles}
 \pxkc at bval{2}{sym44}{"1F030}    {Domino Tiles}
@@ -517,9 +637,9 @@
 \pxkc at bval{2}{sym55}{"1F780}    {Geometric Shapes Extended}
 \pxkc at bval{2}{sym56}{"1F800}    {Supplemental Arrows-C}
 \pxkc at bval{2}{sym57}{"1F900}    {Supplemental Symbols and Pictographs}
-\pxkc at bval{3}{sym60}{"1FA00}    {Chess Symbols}
-\pxkc at bval{3}{sym62}{"1FA70}    {Symbols and Pictographs Extended-A}
-\pxkc at bval{3}{sym63}{"1FB00}    {Symbols for Legacy Computing}
+\pxkc at bval{4}{sym60}{"1FA00}    {Chess Symbols}
+\pxkc at bval{4}{sym62}{"1FA70}    {Symbols and Pictographs Extended-A}
+\pxkc at bval{4}{sym63}{"1FB00}    {Symbols for Legacy Computing}
 \pxkc at bval{1}{haniB}{"20000}    {CJK Unified Ideographs Extension B}
 \pxkc at bval{2}{haniC}{"2A700}    {CJK Unified Ideographs Extension C}
 \pxkc at bval{2}{haniD}{"2B740}    {CJK Unified Ideographs Extension D}
@@ -526,7 +646,7 @@
 \pxkc at bval{2}{haniE}{"2B820}    {CJK Unified Ideographs Extension E}
 \pxkc at bval{3}{haniF}{"2CEB0}    {CJK Unified Ideographs Extension F}
 \pxkc at bval{1}{hani2}{"2F800}    {CJK Compatibility Ideographs Supplement}
-\pxkc at bval{3}{haniG}{"30000}    {CJK Unified Ideographs Extension G}
+\pxkc at bval{4}{haniG}{"30000}    {CJK Unified Ideographs Extension G}
 \pxkc at bval{1}{spc07}{"E0000}    {Tags}
 \pxkc at bval{1}{spc08}{"E0100}    {Variation Selectors Supplement}
 \pxkc at bval{1}{spc09}{"F0000}    {Supplementary Private Use Area-A}
@@ -544,6 +664,9 @@
 \pxkc at bval{0}{latnx}{"00A0}{Latin-1 Supplement/Other}
 \pxkc at bval{0}{latny}{"00C0}{Latin-1 Supplement/Latin}
 \fi
+\ifx\pxkc at bbslst\@empty\else
+  \pxkc at debug{Unsupported blocks:\pxkc at bbslst}
+\fi
 
 %% \pxkc at foreach@blocks
 \edef\pxkc at foreach@blocks{%
@@ -554,6 +677,7 @@
 \let\pxkc at cval\relax
 \let\pxkc at gval\relax
 \let\pxkc at bslst\relax
+\let\pxkc at bbslst\relax
 
 %--------------------------------------- public interfaces
 
@@ -560,16 +684,15 @@
 %%<*> \cjkcategory{<block>}{<category>}
 % Sets the kcatcode of block <block> to <category>.
 % Here <block> is given as a block name or a single character in the
-% block to be specified; <category> is given as a category name or
-% a number ranged in 15--19.
+% block (groups are not considered) to be specified;
+% <category> is given as a category name or a kcatcode value (15--19).
 \newcommand*\cjkcategory{%
   \begingroup
     \forcecjktoken
   \expandafter\endgroup\pxkc at cjkcategory@}% read args
 \def\pxkc at cjkcategory@#1#2{%
-  \ifnum2<1#2 % <category> is a number
-    \edef\pxkc at arg{#2}%
-  \else
+  \edef\pxkc at arg{#2}%
+  \ifnum2<1\pxkc at arg\relax \else % <category> is a number
     \@ifundefined{pxkc at C@@#2}{%
       \pxkc at err@ivcsy{#2}\def\pxkc at arg{18}%
     }{%else
@@ -578,18 +701,27 @@
   \fi
   \pxkc at cjkcategory@a{#1}}
 \def\pxkc at cjkcategory@a#1{%{<block>}
-  \@for\pxkc at blk:={#1}\do{%
-    \expandafter\pxkc at cjkcategory@b\expandafter{\pxkc at blk}}}
+  \pxkc at expand@text\pxkc at tmpa{#1}%
+  \ifx\pxkc at tmpa\relax
+    \pxkc at err@ivfmt{#1}%
+  \else
+    \@for\pxkc at blk:=\pxkc at tmpa\do{%
+      \expandafter\pxkc at cjkcategory@b\expandafter{\pxkc at blk}}%
+  \fi}
 \def\pxkc at cjkcategory@b#1{%
-  \pxkc at get@cp{#1}\ifnum\pxkc at cp>"7F
-    \pxkc at kcatcode{\pxkc at cp}{\pxkc at arg}% FIXME: consider group
+  \pxkc at get@cp{#1}\ifpxkc at ok % charcode
+    \pxkc at kcatcode{\pxkc at cp}{\pxkc at arg}%
   \else
-    \edef\pxkc at blk{#1}%
-    \pxkc at set@cjkcategory
+    \ifcase\pxkc at cp % no-op
+    \or % name
+      \edef\pxkc at blk{#1}%
+      \pxkc at set@cjkcategory
+    \else \pxkc at err@ivfmt{#1}% error
+    \fi
   \fi}
 
 %% \pxkc at set@cjkcategory
-% Sees \pxkc at blk and \pxkc at arg.
+% Sees \pxkc at blk (block name) and \pxkc at arg (kcatcode).
 \def\pxkc at set@cjkcategory{%
   \pxkc at letcs\pxkc at tmpa{pxkc at G@@\pxkc at blk}%
   \ifx\pxkc at tmpa\relax
@@ -596,17 +728,21 @@
     \pxkc at letcs\pxkc at cp{pxkc at B@@\pxkc at blk}%
     \ifx\pxkc at cp\relax
       \pxkc at err@ivbsy{\pxkc at blk}%
-    \else\ifnum\pxkc at cp<\z@ % defunct
-      \ifpxkc at warn@defunct \pxkc at warn@dfblk{\pxkc at blk}\fi
+    \else\ifnum\pxkc at cp<\z@ % bad
+      \ifpxkc at warn@bad \pxkc at warn@dfblk{\pxkc at blk}\fi
+    \else\ifnum\pxkc at cp=\z@
+      \ifnum\pxkc at arg=15 \else
+        \pxkc at err@naltn
+      \fi
     \else
       \pxkc at kcatcode{\pxkc at cp}{\pxkc at arg}%
-    \fi\fi
+    \fi\fi\fi
   \else
     \pxkc at expanded{\noexpand\pxkc at cjkcategory@a{\pxkc at tmpa}}%
   \fi}
 
-%%<*> \pxkc at cjkcategory{<block>}{<kcatcode>}
-%%<*> \pxkc at cjkcategory@mccv{<minmccv>}{<maxmccv>}{<block>}{<kcatcode>}
+%% \pxkc at cjkcategory{<block>}{<kcatcode>}
+%% \pxkc at cjkcategory@mccv{<minmccv>}{<maxmccv>}{<block>}{<kcatcode>}
 % Other entry points for internal use.
 \def\pxkc at cjkcategory#1#2{%
   \def\pxkc at blk{#1}\edef\pxkc at arg{#2}%
@@ -617,9 +753,40 @@
   \fi\fi}
 
 %% \pxkc at get@cp{<arg>}
+% ok / 0=nop / 1=name / 2=err
 \def\pxkc at get@cp#1{%
-  \afterassignment\pxkc at get@cp at a\chardef\pxkc at cp=`#1?\pxkc at mk}
-\def\pxkc at get@cp at a#1\pxkc at mk{}
+  \pxkc at okfalse \chardef\pxkc at cp\z@
+  \pxkc at get@cp at a#1\pxkc at mk\pxkc at end}
+\def\pxkc at get@cp at a#1{%
+  \pxkc at cond\ifx#1\pxkc at mk\fi{%
+    \pxkc at get@cp at fin\pxkc at mk
+  }{\pxkc at cond\ifnum\pxkc at get@cp at b#1>\z@\fi{%
+    \pxkc at get@cp at c#1%
+  }{\pxkc at cond\ifnum2<"1#1 \fi{%
+    \pxkc at get@cp at c"#1%
+  }{%else
+    \chardef\pxkc at cp`#1 %
+    \pxkc at cond\ifnum\pxkc at cp>\pxkc at ascii@max\fi{%
+      \pxkc at oktrue \pxkc at get@cp at fin
+    }{%
+      \pxkc at okfalse \chardef\pxkc at cp\@ne \pxkc at get@cp at e
+    }%
+  }}}}
+\def\pxkc at get@cp at b#1{0\if#1"1\fi\if#1'1\fi\if#1+1\fi}
+\def\pxkc at get@cp at c{%
+  \afterassignment\pxkc at get@cp at d\count@=}
+\def\pxkc at get@cp at d{%
+  \chardef\pxkc at cp\count@
+  \ifnum\pxkc at cp=\count@ \pxkc at oktrue
+  \else \chardef\pxkc at cp\z@
+  \fi
+  \pxkc at get@cp at fin}
+\def\pxkc at get@cp at e#1\pxkc at mk{%
+  \pxkc at get@cp at fin\pxkc at mk}
+\def\pxkc at get@cp at fin#1\pxkc at mk\pxkc at end{%
+  \ifx\pxkc at mt#1\pxkc at mt\else
+    \pxkc at okfalse \chardef\pxkc at cp\tw@
+  \fi}
 
 %%<*> \cjkcategorymode{<mode>}
 % Invokes the cjk-category mode <mode>.
@@ -628,9 +795,10 @@
   \ifx\pxkc at next\relax
     \pxkc at err@ivmsy{#1}%
   \else
-    \pxkc at warn@defunctfalse
+    \pxkc at warn@badfalse
     \pxkc at next
-    \pxkc at warn@defuncttrue
+    \pxkc at warn@badtrue
+    \kcatcode0=15 % 'latn' is fixed
   \fi}
 
 %--------------------------------------- CJK category modes
@@ -639,10 +807,9 @@
 \let\pxkc at cat\relax
 \let\pxkc at base@cat\relax
 
-%% \[pxkc at K@@<block>] : Invariant blocks
+%% \[pxkc at K@@<block>] : the kcatcode of CJK core blocks
 \def\do#1#2{\expandafter\chardef\csname pxkc at K@@#1\endcsname=#2 }
 %C======================================
-\do{latn}  {15} % Basic Latin
 \do{hang1} {19} % Hangul Jamo
 \do{sym15} {18} % Enclosed Alphanumerics
 \do{cjk01} {16} % CJK Radicals Supplement
@@ -693,6 +860,10 @@
 \do{hani2} {16} % CJK Compatibility Ideographs Supplement
 \do{haniG} {16} % CJK Unified Ideographs Extension G
 %=======================================
+\ifnum\pxkc at mccv<2
+  \do{cjk1b} {18}
+  \do{cjk1c} {18}
+\fi
 
 %% \pxkc at reset@all{<kcatcode>}
 \def\pxkc at reset@all#1{%
@@ -700,11 +871,9 @@
   \pxkc at foreach@blocks\do{%
     \pxkc at letcs\pxkc at cat{pxkc at K@@\pxkc at blk}%
     \ifx\pxkc at cat\relax \let\pxkc at cat\pxkc at base@cat \fi
-    \pxkc at kcatcode{\@nameuse{pxkc at B@@\pxkc at blk}}{\pxkc at cat}}%
-  \ifnum\pxkc at mccv<2
-    \pxkc at cjkcategory{cjk12}{18}%
-  \fi}
+    \pxkc at kcatcode{\@nameuse{pxkc at B@@\pxkc at blk}}{\pxkc at cat}}}
 
+%% \[pxkc at M@@<mode>] : the implementation of a mode
 %P======================================
 %% 'forcecjk'
 \def\pxkc at M@@forcecjk{%
@@ -720,7 +889,7 @@
 %% 'prefercjkvar'
 \def\pxkc at M@@prefercjkvar{%
   \pxkc at M@@japanesevar
-  \pxkc at cjkcategory@mccv{3}{3}{latny}{18}%
+  \pxkc at cjkcategory@mccv{3}{4}{latny}{18}%
   \pxkc at cjkcategory{latnA}{18}%
   \pxkc at cjkcategory{latnB}{18}%
   \pxkc at cjkcategory{latn2}{18}%
@@ -741,7 +910,7 @@
 \def\pxkc at M@@japanesevar{%
   \pxkc at M@@prefernoncjk
   \pxkc at cjkcategory@mccv{1}{2}{latn1}{18}%
-  \pxkc at cjkcategory@mccv{3}{3}{latnx}{18}%
+  \pxkc at cjkcategory@mccv{3}{4}{latnx}{18}%
   \pxkc at cjkcategory{sym04}{18}%
   \pxkc at cjkcategory{sym07}{18}%
   \pxkc at cjkcategory{sym08}{18}%
@@ -768,10 +937,90 @@
 %% 'default'
 \def\pxkc at M@@default{%
   \pxkc at M@@forcecjk
-  \pxkc at cjkcategory@mccv{3}{3}{latny}{15}%
-  \pxkc at cjkcategory@mccv{3}{3}{latnA}{15}%
+  \pxkc at cjkcategory@mccv{3}{4}{latny}{15}%
+  \pxkc at cjkcategory@mccv{3}{4}{latnA}{15}%
+  \pxkc at cjkcategory@mccv{4}{4}{latnB}{15}%
 }
 
+%--------------------------------------- safe text expansion
+
+%% variables
+\let\pxkc at expd\relax
+
+%% \pxkc at expand@text\CS{<text>}
+\def\pxkc at expand@text#1#2{%
+  \begingroup
+    \let\UTFviii at invalid@err \noexpand
+    \let\UTFviii at two@octets  \pxkc at lead@byte at NB
+    \let\UTFviii at three@octets\pxkc at lead@byte at NC
+    \let\UTFviii at four@octets \pxkc at lead@byte at ND
+    \edef\pxkc at tmpa{#2}%
+    \let\UTFviii at invalid@err \pxkc at expand@text at err
+    \let\UTFviii at two@octets  \pxkc at lead@byte at PB
+    \let\UTFviii at three@octets\pxkc at lead@byte at PC
+    \let\UTFviii at four@octets \pxkc at lead@byte at PD
+    \let\pxkc at expd\@empty
+    \expandafter\pxkc at expand@text at a\pxkc at tmpa\pxkc at mk\pxkc at end
+    \global\let\pxkc at g@tmpa\pxkc at expd
+  \endgroup
+  \let#1\pxkc at g@tmpa}
+\def\pxkc at expand@text at a{%
+  \futurelet\pxkc at tok\pxkc at expand@text at b}
+\def\pxkc at expand@text at b{%
+  \ifcat\noexpand\pxkc at tok0% other
+    \let\pxkc at next\pxkc at expand@text at d
+  \else\ifcat\noexpand\pxkc at tok\@sptoken
+    \let\pxkc at next\pxkc at expand@text at f
+  \else\ifx\pxkc at tok\pxkc at mk % end
+    \let\pxkc at next\pxkc at expand@text at fin
+  \else\ifx\pxkc at tok\bgroup
+    \let\pxkc at next\pxkc at expand@text at err
+  \else\expandafter\ifx\noexpand\pxkc at tok\pxkc at tok % unexpandable
+    \let\pxkc at next\pxkc at expand@text at c
+  \else \let\pxkc at next\pxkc at expand@text at e
+  \fi\fi\fi\fi\fi
+  \pxkc at next}
+\def\pxkc at expand@text at c#1{%
+  \edef\pxkc at expd{\pxkc at expd#1}%
+  \pxkc at expand@text at a}
+\def\pxkc at expand@text at d#1{%
+  \ifnum`#1>\pxkc at ascii@max % high byte
+    \let\pxkc at next\pxkc at expand@text at ret
+    \lccode"EF=`#1\relax\lowercase{\expandafter^^ef}% reactivate
+  \else \expandafter\pxkc at expand@text at c\expandafter#1%
+  \fi}
+\def\pxkc at expand@text at e#1{%
+  \ifcat\noexpand#1\noexpand^^ef% active-char
+    \let\pxkc at next\pxkc at expand@text at ret
+    \expandafter#1%
+  \else \expandafter\pxkc at expand@text at err
+  \fi}
+\expandafter\def\expandafter\pxkc at expand@text at f\space{%
+  \pxkc at expand@text at c\space}
+\def\pxkc at expand@text at fin#1#2\pxkc at end{%
+  \ifx\pxkc at mt#2\pxkc at mt \else \let\pxkc at expd\relax \fi}
+\def\pxkc at expand@text at err{%
+  \pxkc at expand@text at fin\pxkc at mk}
+\def\pxkc at expand@text at ret{% UTF-8 bytes are read
+  \pxkc at get@jchar\count@
+  \pxkc at expand@text at c\pxkc at jchar}
+
+%% processors
+\def\pxkc at lead@byte at NB#1{\noexpand#1\noexpand}
+\def\pxkc at lead@byte at NC#1#2{\noexpand#1\noexpand#2\noexpand}
+\def\pxkc at lead@byte at ND#1#2#3{\noexpand#1\noexpand#2\noexpand#3\noexpand}
+\def\pxkc at lead@byte at PB#1#2{%
+  \count@`#1 \advance\count at -"C0
+  \pxkc at trail@byte{#2}\pxkc at next}
+\def\pxkc at lead@byte at PC#1#2#3{%
+  \count@`#1 \advance\count at -"E0
+  \pxkc at trail@byte{#2}\pxkc at trail@byte{#3}\pxkc at next}
+\def\pxkc at lead@byte at PD#1#2#3#4{%
+  \count@`#1 \advance\count at -"F0
+  \pxkc at trail@byte{#2}\pxkc at trail@byte{#3}\pxkc at trail@byte{#4}\pxkc at next}
+\def\pxkc at trail@byte#1{%
+  \multiply\count@"40 \advance\count@`#1 \advance\count at -"80 }
+
 %--------------------------------------- miscellaneous accessories
 
 %%<*> \showcjkcategory



More information about the tex-live-commits mailing list.