summaryrefslogtreecommitdiff
path: root/language/japanese/pxbase
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /language/japanese/pxbase
Initial commit
Diffstat (limited to 'language/japanese/pxbase')
-rw-r--r--language/japanese/pxbase/LICENSE21
-rw-r--r--language/japanese/pxbase/README-ja.md227
-rw-r--r--language/japanese/pxbase/README.md85
-rw-r--r--language/japanese/pxbase/pxbabel.pdfbin0 -> 151727 bytes
-rw-r--r--language/japanese/pxbase/pxbabel.sty434
-rw-r--r--language/japanese/pxbase/pxbabel.tex332
-rw-r--r--language/japanese/pxbase/pxbase.def7
-rw-r--r--language/japanese/pxbase/pxbase.sty15
-rw-r--r--language/japanese/pxbase/pxbasenc.def516
-rw-r--r--language/japanese/pxbase/pxbsjc.def6
-rw-r--r--language/japanese/pxbase/pxbsjc1.def7
-rw-r--r--language/japanese/pxbase/pxjsfenc.def212
-rw-r--r--language/japanese/pxbase/upkcat.sty79
13 files changed, 1941 insertions, 0 deletions
diff --git a/language/japanese/pxbase/LICENSE b/language/japanese/pxbase/LICENSE
new file mode 100644
index 0000000000..8ada757fbc
--- /dev/null
+++ b/language/japanese/pxbase/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2017 Takayuki YATO (aka. "ZR")
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/language/japanese/pxbase/README-ja.md b/language/japanese/pxbase/README-ja.md
new file mode 100644
index 0000000000..fd3eaf9ad0
--- /dev/null
+++ b/language/japanese/pxbase/README-ja.md
@@ -0,0 +1,227 @@
+PXbase パッケージバンドル
+=========================
+
+LaTeX: 他の PX パッケージのためのサポートライブラリ
+
+本バンドルの主な目的は、作者(ZR)の制作する他の pTeX 用パッケージ(名前
+が“PX”で始まる)が依拠するライブラリ機能の提供である。
+
+その他に、本バンドルには以下のユーザ・開発者用パッケージが含まれる。
+
+ * pxbabel パッケージ: Babel の機構に基づく CJK 間のフォント切替
+ * upkcat パッケージ: 文字指定による kcatcode 操作
+
+### 前提環境
+
+ * TeX フォーマット: LaTeX
+ * TeX エンジン: pTeX、upTeX(派生を含む)
+ * DVI ウェア(DVI 出力時): 不問
+
+※upkcat パッケージについては当該の節を参照。
+
+### 構成物
+
+ * `pxbase.sty`: pxbase パッケージ
+ * `pxbase.def`: サブモジュール(の残骸)
+ * `pxbabel.sty`: pxbabel パッケージ
+ * `pxbasenc.def`: サブモジュール
+ * `pxjsfenc.def`: サブモジュール
+ * `pxbsjc.def`: pxbase 用の補助ファイル
+ * `pxbsjc1.def`: pxbase 用の補助ファイル
+ * `upkcat.sty`: upkcat パッケージ
+
+※種々の事情により複雑になっている(例えば、`pxbsjc.def` は実際には bxbase
+パッケージから読まれている、`pxjsfenc.def` は BXbase/PXbase 内のどの
+パッケージからも参照されない、など)が、他のパッケージの動作を確保する
+ため敢えて 0.5 版のファイル構成を保っている。
+
+### インストール
+
+TDS 1.1 に準拠するシステムの場合、以下のようにファイルを移動する:
+
+ - `*.sty`, `*.def` → $TEXMF/tex/platex/PXbase
+
+この後必要に応じて mktexlsr を実行する。
+
+### ライセンス
+
+本パッケージは MIT ライセンスの下で配布される。
+
+
+pxbase パッケージ ― pTeX 用(旧)基礎ライブラリ
+------------------------------------------------
+
+他の PX シリーズのパッケージの下請けの役割も果たしていたが、0.9 版において
+[bxbase パッケージ]に統合された。今では、単に bxbase を読むだけである。
+
+[bxbase パッケージ]: https://www.ctan.org/pkg/bxbase
+
+### ユーザ向け機能
+
+※bxbase の方で述べていないものを挙げる。(FIXME:bxbase に移すべき。)
+
+※旧版のドキュメントに載っていたのに、ここにも bxbase の方にも載って
+いない機能は、非推奨の扱いになったということ。
+
+ * `\infojenc`: 漢字コードの情報を次の形で端末とログに出力する。
+
+ Kanji encoding: source=UTF8 internal=SJIS;
+
+ * `\safecaret`: 一部の箇所で TeX エスケープ形式(`^^ab`)の解釈が
+ 失敗するのを回避する。詳細は「TeX エスケープ形式(`^^ab`)の処理」
+ の節を参照。
+
+#### utf8x 入力エンコーディングの fasterror 設定
+
+ucs パッケージ(バンドル)が提供する「utf8x 入力エンコーディング」では、
+パッケージで未定義の Unicode 文字が入力された場合エラーになる。その時の
+エラーメッセージ中に該当の文字の Unicode 名を出力するが、この際に高位
+バイトを含むファイル(テキスト情報をハフマン符号で圧縮したものと思われる)
+を用いるので、pTeX では処理に失敗してしまう。そこで本パッケージでは、ucs
+パッケージが読み込まれた場合(utf8x が指定された時も含む)に上記の機能を
+抑止するオプション `fasterror` を常に有効にする。
+
+### TeX エスケープ形式(`^^ab`)の処理
+
+現在の pTeX では入力漢字コードが UTF-8 の時に JIS X 0208 に含まれない
+文字をエスケープ形式(`^^ab`)の UTF-8 バイト列に変換する。通常はこの
+形式は該当のバイト列と等価の解釈をされる。ところがここで `^` の catcode
+が本来の値 7 から変更されているとこの処理が失敗してしまう。具体的には
+次のような場合が該当する。
+
+ * Babel の一部の言語(esperanto 等)を使用した場合。
+ * verbatim や類似の環境の中。
+
+`\safecaret` 命令をプレアンブルで実行した場合、これらの場合でエスケープ
+形式の連続する出現をバイト列と解釈するようにする。
+
+### 開発者向け機能
+
+(使用中の漢字コード系の情報表示)
+
+ * `\bxInternalJaEncoding`:[暗黙文字トークン] 内部漢字コードを表す。
+ - `s`: シフトJIS
+ - `e`: EUC
+ - `u`: Unicode (upTeX)
+
+ * `\bxInputJaEncoding`:[暗黙文字トークン] 入力 TeX ソースの漢字
+ コードを表す。
+ - `s`: シフトJIS
+ - `e`: EUC
+ - `u`: UTF-8
+ - `a`: 自動判定が有効
+
+ * `\pxUpScale`:[マクロ] 和文の標準フォントに対する和文スケール。
+ `\Cjascale` が設定済の場合はその値、それ以外で文書クラスが和文標準
+ または jsclasses のものの場合は、当該クラスの既定のスケール値。
+
+
+pxbabel パッケージ ― Babel の機構に基づく CJK 間のフォント切替
+---------------------------------------------------------------
+
+詳細についてはマニュアル `pxbabel.pdf` を参照されたい。
+
+upkcat パッケージ ― 文字指定による kcatcode 操作
+-------------------------------------------------
+
+※ 本パッケージはパッケージ開発者向けのものである。
+
+文字を指定して(それが属するブロックの)kcatcode を操作する場合
+
+ \kcatcode`<文字>
+
+の形式を使うことになるが、その際にもしその文字の現在の kcatcode が 15
+である場合は文字がバイト列とみなされるので、この形式が使えない。この
+パッケージはそのような場合でも使用可能な、kcatcode の参照・変更の命令
+を提供する。なお、文書作成者はこちらではなく [pxcjkcat パッケージ]を
+用いるべきである。
+
+[pxcjkcat パッケージ]: https://www.ctan.org/pkg/pxcjkcat
+
+### 前提環境
+
+ * TeX フォーマット: plain、LaTeX
+ * TeX エンジン: upTeX(派生を含む)
+ * DVI ウェア(DVI 出力時): 不問
+
+### パッケージ読込
+
+plain upTeX の場合:
+
+ \input upkcat.sty
+
+upLaTeX の場合:
+
+ \usepackage{upkcat}
+
+### 機能
+
+ * `\getkcatcode{<文字>}`: `<文字>` の現在の kcatcode の値(15~19)
+ をマクロ `\thekcatcode` に文字列として返す。
+ * `\setkcatcode{<文字>}{<値>}`: `<文字>` の kcatcode の値を `<値>`
+ に設定する。
+
+
+更新履歴
+--------
+
+ * Version 1.1b 〈2017/07/03〉
+ - upLaTeX で japanese-otf と併用した場合に対応。
+ - バグ修正。
+
+ * Version 1.1a 〈2017/06/19〉
+ - バグ修正。
+
+ * Version 1.1 〈2017/05/29〉
+ - 内容の整理。
+ ※バージョンの値は BXbase と合致させて 1.1 版とした。
+ - 一部の機能を非推奨にした。
+
+ * Version 0.5i 〈2017/05/04〉 ― CTAN 公開版
+ - 0.5 版から ifuptex と pxcjkcat を削除したもの。
+ ※ifptex パッケージバンドルを CTAN に登録するための経過措置。
+
+ * Version 0.9b 〈2012/08/19〉
+ - ifuptex パッケージは「ifptex バンドル」に移動したため削除。
+ - pxcjkcat パッケージは専用のバンドルに移動したため削除。
+
+ * Version 0.5 〈2010/06/15〉
+ - pxbase: `\JI`/`\KI` を追加。
+ - pxbase: `\dvipdfmxmapline`/`\dvipdfmxmapfont` を追加。
+
+ * Version 0.4a 〈2010/02/07〉
+ - pxcjkcat: upTeX v0.29 における kcatcode のブロック分割の変更に
+ 対応。それに伴い `ccv1`, `ccv2` オプションを新設。
+ - pxcjkcat: `\cjkcategory` の第 1 引数に文字そのものを指定できる
+ ようにした。
+ - pxcjkcat: なぜかモード設定時の「Enclosed CJK Letters and Months」
+ (`cjk07`)の kcatcode の設定値が 16 になっていた。upTeX 既定値に
+ 合わせて 18 に修正した。
+
+ * Version 0.4 〈2009/07/05〉
+ - safe caret 機構のコード(`\safecaret` の実装の核心)を pxbase.def
+ に移動(BXbase と共通に)。
+ - Babel に加えて verbatim でも safe caret 機構が働くようにする。
+ ただし「pxbase は単に読み込むだけでは他人のコードを書き換えない」
+ という指針があるので、`\safecaret` を実行しないと有効にならない。
+ - pxbabel は中で `\safecaret` を呼ぶので、pxbabel を読み込むと safe
+ caret は自動的に有効になる。
+ - pxbabel でエンコーディングを `J20` 等に変えた場合に OTF パッケージ
+ の `\CID` が動かなくなるのを修正。
+
+ * Version 0.3 〈2008/04/06〉
+ - pxbabel に safe caret 機構を追加。
+
+ * Version 0.2b 〈2008/03/28〉
+ pxbabel に `\UTF` の切替を追加。
+
+ * Version 0.2a 〈2008/03/18〉
+ pxbabel, pxbase のバグ取り。
+ pxbabel の説明書をまだ書いていないことに気づいた ;-) 慌てて作成。
+
+ * Version 0.2 〈2008/03/14〉
+ 最初の公開版。
+
+-------------------------------------------
+Takayuki YATO (aka. "ZR")
+https://github.com/zr-tex8r
diff --git a/language/japanese/pxbase/README.md b/language/japanese/pxbase/README.md
new file mode 100644
index 0000000000..6128d2223a
--- /dev/null
+++ b/language/japanese/pxbase/README.md
@@ -0,0 +1,85 @@
+PXbase Package Bundle
+=====================
+
+LaTeX: Tools for use with (u)pLaTeX
+
+The main purpose of this package is to provide auxiliary functions which
+are utilized by packages created by the same author. This package also
+provides a few user commands to assist in creating Japanese document on
+(u)pLaTeX.
+
+### System Requirements
+
+ * TeX format: LaTeX.
+ * TeX engine: pTeX and upTeX.
+ * DVI-ware (in DVI output): Anything.
+
+### Package content
+
+ * `pxbase.sty`: the pxbase package
+ * `pxbase.def`: a submodule (no longer used)
+ * `pxbabel.sty`: the pxbabel package
+ * `pxbasenc.def`: a submodule
+ * `pxjsfenc.def`: a submodule
+ * `pxbsjc.def`: a helper file for pxbase
+ * `pxbsjc1.def`: a helper file for pxbase
+ * `upkcat.sty`: the upkcat package
+
+Some files are kept present for compatibility with other packages.
+
+### Installation
+
+In a system compliant to TDS 1.1, move the files as follows:
+
+ - `*.sty` → $TEXMF/tex/platex/pxbase
+
+And rehash your TEXMF trees if necessary.
+
+### License
+
+This package is distributed under the MIT License.
+
+
+pxbase package ― the (quondam) base library for pTeX
+-----------------------------------------------------
+
+The package used to provide pTeX-specific features required by other
+packages. However, it has been merged with the [bxbase] package since
+v0.9, and currently it simply loads bxbase internally.
+
+[bxbase]: https://www.ctan.org/pkg/bxbase
+
+
+pxbabel package ― To help use Babel with Japanese document
+-----------------------------------------------------------
+
+Currently the documentation is available only in Japanese (see
+pxbabel.pdf).
+
+
+upkcat package ― To safely operate with kcatcode
+-------------------------------------------------
+
+Currently the documentation is available only in Japanese (see
+README-ja.md).
+
+
+Revision History
+----------------
+
+ * Version 1.1b 〈2017/07/03〉
+ * Version 1.1a 〈2017/06/19〉
+ * Version 1.1 〈2017/05/29〉
+ * Version 0.5i 〈2017/05/04〉 ― for CTAN
+ * Version 0.9b 〈2012/08/19〉
+ * Version 0.5 〈2010/06/15〉
+ * Version 0.4a 〈2010/02/07〉
+ * Version 0.4 〈2009/07/05〉
+ * Version 0.3 〈2008/04/06〉
+ * Version 0.2b 〈2008/03/28〉
+ * Version 0.2a 〈2008/03/18〉
+ * Version 0.2 〈2008/03/14〉
+
+--------------------
+Takayuki YATO (aka. "ZR")
+https://github.com/zr-tex8r
diff --git a/language/japanese/pxbase/pxbabel.pdf b/language/japanese/pxbase/pxbabel.pdf
new file mode 100644
index 0000000000..615e612777
--- /dev/null
+++ b/language/japanese/pxbase/pxbabel.pdf
Binary files differ
diff --git a/language/japanese/pxbase/pxbabel.sty b/language/japanese/pxbase/pxbabel.sty
new file mode 100644
index 0000000000..3f0ab85d30
--- /dev/null
+++ b/language/japanese/pxbase/pxbabel.sty
@@ -0,0 +1,434 @@
+%%
+%% This is file 'pxbabel.sty'.
+%%
+%% Copyright (c) 2017 Takayuki YATO (aka. "ZR")
+%% GitHub: https://github.com/zr-tex8r
+%% Twitter: @zr_tex8r
+%%
+%% This package is distributed under the MIT License.
+%%
+
+%% package declaration
+\NeedsTeXFormat{pLaTeX2e}
+\ProvidesPackage{pxbabel}[2017/07/03 v1.1b PX Babel interface for CJK]
+\def\pxbb@pkgname{pxbabel}
+
+%--------------------------------------- general
+
+%% packages
+\RequirePackage{pxbase}
+\RequirePackage{ifptex}
+\safecaret
+\bxPrepareSetKeysSafe
+
+%% error messages
+\bxSetModuleName\pxbb@pkgname
+\bxPreamble\def\pxbb@warn@nocjk{%
+ \PackageWarningNoLine\pxbb@pkgname
+ {No multi-CJK support found, font switch disabled\MessageBreak
+ (I need upTeX-extension or otf package with `multi')}}
+\bxPreamble\def\pxbb@err@noldf#1{%
+ \PackageError\pxbb@pkgname
+ {Language definition file #1.ldf not found}%
+ {Maybe you misspelled the language option?\MessageBreak\@ehc}}
+\bxPreamble\def\pxbb@err@nomnl{%
+ \PackageError\pxbb@pkgname
+ {Main language is not specified}%
+ {Here 'japanese' is assumed.\MessageBreak\@ehc}}
+\bxPreamble\def\pxbb@warn@jafam#1{%
+ \PackageWarningNoLine\pxbb@pkgname
+ {!!!!!!!!!!!!!!! IMPORTANT NOTICE !!!!!!!!!!!!!!!\MessageBreak
+ Default Japanese family names have been changed\MessageBreak
+ after this package was loaded. The functionality\MessageBreak
+ of the package may be corrupted!\MessageBreak
+ \if t#1%
+ (You must load 'otf' package before this package.)\MessageBreak
+ \fi
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}}
+
+%--------------------------------------- Processing package options
+
+%% \pxbb@cjk@langid@list
+% The list of all CJK language ids.
+\bxPreamble\def\pxbb@cjk@langid@list{%
+ japanese,korean,schinese,tchinese%
+}
+
+%% \pxbb@lang@load@list
+% The list of language options to be loaded.
+\bxPreamble\let\pxbb@lang@load@list\@empty
+
+%% \pxbb@set@lang@spec{<lang_id>}{[+]<lang_name>}
+\bxPreamble\def\pxbb@set@lang@spec#1#2{%
+ \edef\pxbb@args{#2}%
+ \expandafter\pxbb@set@lang@spec@a\pxbb@args\@nil{#1}}
+\bxPreamble\def\pxbb@set@lang@spec@a#1#2\@nil#3{%
+ \bxIf{+#1}%
+ {\csdef{pxbb@langname/#3}{#2}%
+ \appto\pxbb@lang@load@list{,#2}}%
+ {\csdef{pxbb@langname/#3}{#1#2}}}
+
+%% keyval settings
+% (<lang_id>=[+]<lang_name>)
+\bxForEachIn\pxbb@cjk@langid@list\do{%
+ \define@key{pxbabel}{#1}{\pxbb@set@lang@spec{#1}{##1}}%
+ \pxbb@set@lang@spec{#1}{#1}}
+% (main=<lang_name>)
+\bxPreamble\let\pxbb@main@lang\relax
+\define@key{pxbabel}{main}{\def\pxbb@main@lang{#1}}
+% (caption=<lang_name>)
+\bxPreamble\def\pxbb@caption@lang{default}
+\define@key{pxbabel}{caption}{\def\pxbb@caption@lang{#1}}
+
+%% option handling
+\DeclareOption{switchcaption}{%
+ \def\pxbb@caption@lang{switch}}
+\DeclareOption{noswitchcaption}{%
+ \def\pxbb@caption@lang{default}}
+\newbool{pxbb@switchfont}\pxbb@switchfonttrue
+\DeclareOption{switchfont}{\pxbb@switchfonttrue}
+\DeclareOption{noswitchfont}{\pxbb@switchfontfalse}
+\newbool{pxbb@prefermmivjis}
+\DeclareOption{prefer2004jis}{\pxbb@prefermmivjistrue}
+\DeclareOption{noprefer2004jis}{\pxbb@prefermmivjisfalse}
+\DeclareOption{jis2004}{\pxbb@prefermmivjistrue}
+\DeclareOption{nojis2004}{\pxbb@prefermmivjisfalse}
+\newbool{pxbb@stdjaencoding}
+\bxIfExpToEqualX{\mcdefault}{mc}{}{\pxbb@stdjaencodingtrue}% default
+\DeclareOption{stdjaencoding}{\pxbb@stdjaencodingtrue}
+\DeclareOption{nostdjaencoding}{\pxbb@stdjaencodingfalse}
+% (<lang_id>, +<lang_id>)
+\bxPreamble\let\pxbb@last@lang\relax
+\bxForEachIn\pxbb@cjk@langid@list\do{%
+ \DeclareOption{#1}{%
+ \pxbb@set@lang@spec{#1}{#1}%
+ \def\pxbb@last@lang{#1}}%
+ \DeclareOption{+#1}{%
+ \pxbb@set@lang@spec{#1}{+#1}%
+ \def\pxbb@last@lang{#1}}}
+% (options processed by keyval)
+\DeclareOption*{%
+ \bxWithArgExpd{\CurrentOption}\do{%
+ \bxSetKeysSafe{pxbabel}{#1}%
+ \bxIfx{\bxRestKeys\@empty}{}%
+ {\appto\pxbb@lang@load@list{,#1}%
+ \def\pxbb@last@lang{#1}}}}
+\ProcessOptions*
+\bxChompComma\pxbb@lang@load@list
+
+%% 'triv' language check table
+\bxForEachIn\pxbb@cjk@langid@list\do{%
+ \cslet{pxbb@triv/\@nameuse{pxbb@langname/#1}}{t}}
+\bxForEachIn\pxbb@lang@load@list\do{%
+ \csundef{pxbb@triv/#1}}
+
+%--------------------------------------- Resolving settings
+
+%% \ifpxbb@otfmulti
+%% \ifpxbb@pxotf
+\newbool{pxbb@otfmulti}
+\newbool{pxbb@pxotf}
+\@ifpackageloaded{mlutf}{\pxbb@otfmultitrue}{}
+\@ifpackageloaded{pxotf}{\pxbb@otfmultitrue\pxbb@pxotftrue}{}
+
+%% \ifpxbb@babel
+\newbool{pxbb@babel}
+\@ifpackageloaded{babel}{\pxbb@babeltrue}{}
+
+%% environment check
+% The feature 'switchfont' requires multi-CJK support.
+\ifpxbb@switchfont
+ \ifpxbb@otfmulti\else
+ \ifupTeX\else
+ \pxbb@warn@nocjk
+\fi\fi\fi
+
+%% resolve the expected main language
+\ifundef\pxbb@main@lang{%then
+ % if 'main' is not specified
+ \ifbool{pxbb@babel}%
+ % in separate loading, main is unchanged
+ {\let\pxbb@main@lang\bbl@main@language}%
+ % in lumped loading, main is the one specified last
+ {\let\pxbb@main@lang\pxbb@last@lang}%
+}{}
+% if main is unknown, complain
+\ifx\pxbb@main@lang\relax
+ \pxbb@err@nomnl
+ \letcs\pxbb@main@lang{pxbb@langname/japanese}
+\fi
+
+%% resolve the caption language setting
+\bxIfExpToEqual{\pxbb@caption@lang}{auto}{%then
+ % if 'caption=auto' is given
+ \bxIfcsundef{pxbb@triv/\pxbb@main@lang}
+ % if main is not triv then caption=switch
+ {\def\pxbb@caption@lang{switch}}%
+ % if main is triv then caption=default
+ {\def\pxbb@caption@lang{default}}%
+}{}
+
+\ifx t\bxUseDebug
+\def\pxbb@bool#1{\ifbool{#1}{yes}{no}}
+\bxForEachIn\pxbb@cjk@langid@list\do{%
+\bxDebug{#1 = \@nameuse{pxbb@langname/#1}}}
+\bxDebug{main = \pxbb@main@lang}
+\bxDebug{caption = \pxbb@caption@lang}
+\bxDebug{switchfont = \pxbb@bool{pxbb@switchfont}}
+\bxDebug{load-list = \pxbb@lang@load@list}
+\bxDebug{last = \pxbb@last@lang}
+\bxDebug{babel = \pxbb@bool{pxbb@babel}}
+\bxDebug{otfmulti = \pxbb@bool{pxbb@otfmulti}}
+\fi
+
+%--------------------------------------- lumped loading
+\ifpxbb@babel\else
+
+%% load Babel
+\let\pxbb@tmpa\pxbb@lang@load@list
+\ifx\pxbb@tmpa\@empty \def\pxbb@tmpa{english}\fi
+\edef\pxbb@tmpa{%
+ \noexpand\RequirePackage[\pxbb@tmpa]{babel}%
+}\pxbb@tmpa
+
+\fi
+%--------------------------------------- separate loading
+\ifpxbb@babel
+
+%% \pxbb@g@add@lang@proc
+\bxPreamble\let\pxbb@g@add@lang@proc\@empty
+\begingroup
+
+%% remove languages that are already loaded
+\let\pxbb@tmpa\@empty
+\bxForEachIn\pxbb@lang@load@list\do{%
+ \bxIfcsundef{date#1}{\appto\pxbb@tmpa{,#1}}{}}
+\bxChompComma\pxbb@tmpa
+\let\pxbb@lang@load@list\pxbb@tmpa
+\bxDebug{\pxbb@lang@load@list}
+
+%% if some language should be added...
+\ifx\pxbb@lang@load@list\@empty\else
+ \ifdef\bbl@load@language{%
+ \PackageWarning\pxbb@pkgname
+ {Some languages need to be added. Note that the\MessageBreak
+ process of addition is unreliable}%
+ }{%else
+ \PackageError\pxbb@pkgname
+ {Some languages need to be added, but the addition\MessageBreak
+ is not supported because Babel in use is too old}%
+ {The languages to be added will be ignored.\MessageBreak
+ \@ehc}}
+\fi
+
+%% build \pxbb@g@add@lang@proc
+\bxForEachIn\pxbb@lang@load@list\do{%
+ \csdef{pxbb@use/#1}{t}}
+\def\pxbb@babel@alias#1#2{%
+ \bxIfcsundef{pxbb@use/#1}{}{%else
+ % if the real name is available, then ok
+ \IfFileExists{#1.ldf}{}{%else
+ \csdef{pxbb@bbl@opt/#1}{\bbl@load@language{#2}}}}}
+\def\pxbb@babel@load@proc#1{%
+ \bxIfcsundef{pxbb@use/#1}{\@gobble}{%else
+ \csdef{pxbb@bbl@opt/#1}}}
+% the alias list
+\pxbb@babel@alias{acadian}{frenchb}
+\pxbb@babel@alias{afrikaans}{dutch}
+\pxbb@babel@alias{american}{english}
+\pxbb@babel@alias{australian}{english}
+\pxbb@babel@alias{austrian}{germanb}
+\pxbb@babel@alias{bahasa}{bahasai}
+\pxbb@babel@alias{bahasai}{bahasai}
+\pxbb@babel@alias{bahasam}{bahasam}
+\pxbb@babel@alias{brazil}{portuges}
+\pxbb@babel@alias{brazilian}{portuges}
+\pxbb@babel@alias{british}{english}
+\pxbb@babel@alias{canadian}{english}
+\pxbb@babel@alias{canadien}{frenchb}
+\pxbb@babel@alias{francais}{frenchb}
+\pxbb@babel@alias{french}{frenchb}
+\pxbb@babel@alias{german}{germanb}
+\pxbb@babel@alias{hungarian}{magyar}
+\pxbb@babel@alias{indon}{bahasai}
+\pxbb@babel@alias{indonesian}{bahasai}
+\pxbb@babel@alias{lowersorbian}{lsorbian}
+\pxbb@babel@alias{malay}{bahasam}
+\pxbb@babel@alias{melayu}{bahasam}
+\pxbb@babel@alias{meyalu}{bahasam}
+\pxbb@babel@alias{naustrian}{ngermanb}
+\pxbb@babel@alias{newzealand}{english}
+\pxbb@babel@alias{ngerman}{ngermanb}
+\pxbb@babel@alias{nynorsk}{norsk}
+\pxbb@babel@alias{portuguese}{portuges}
+\pxbb@babel@alias{russian}{russianb}
+\pxbb@babel@alias{UKenglish}{english}
+\pxbb@babel@alias{ukrainian}{ukraineb}
+\pxbb@babel@alias{uppersorbian}{usorbian}
+\pxbb@babel@alias{USenglish}{english}
+\pxbb@babel@load@proc{hebrew}{%
+ \input{rlbabel.def}\bbl@load@language{hebrew}}
+\pxbb@babel@load@proc{polutonikogreek}{%
+ \bbl@load@language{greek}\languageattribute{greek}{polutoniko}}
+
+%% load addtional languages
+\bxForEachIn\pxbb@lang@load@list\do{%
+ \gappto\pxbb@g@add@lang@proc{\def\CurrentOption{#1}}%
+ \bxIfcsundef{pxbb@bbl@opt/#1}%
+ {\gappto\pxbb@g@add@lang@proc{\bbl@load@language{#1}}}%
+ {\letcs\pxbb@tmpa{pxbb@bbl@opt/#1}%
+ \xappto\pxbb@g@add@lang@proc{\expandonce{\pxbb@tmpa}}}}
+\gappto\pxbb@g@add@lang@proc{\let\CurrentOption\@empty}
+
+\endgroup
+% dispatch
+\pxbb@g@add@lang@proc
+
+\fi
+%--------------------------------------- post-load process
+
+%% declare 'triv' languages
+\bxForEachIn\pxbb@cjk@langid@list\do{%
+ \bxWithArgFullExpd{\@nameuse{pxbb@langname/#1}}\do{%
+ \bxIfcsundefX{date##1}{\bxTrivLangDef{##1}}{}}}
+\ifundef\datecjkmulti{\bxTrivLangDef{cjkmulti}}{}
+
+%% set main language
+\setmainlanguage{\pxbb@main@lang}
+
+%% set caption language
+\bxIfExpToEqual{\pxbb@caption@lang}{switch}{}%else
+ {\bxProvideCaptionLanguage{\pxbb@caption@lang}}
+
+%--------------------------------------- Adding font switch to 'extra's
+
+\ifpxbb@otfmulti %----<*otfmulti>
+
+%% add \UTF switch to Babel \extras
+\ifpxbb@switchfont
+\bxPreamble\def\pxbb@addtoextras@otf#1{%
+ \pxbb@addtoextras@otf@a{\bxCsuseX{pxbb@langname/#1}}}
+\bxPreamble\def\pxbb@addtoextras@otf@a#1#2{%
+ \csappto{extras#1}{\babel@save\UTF \let\UTF#2}}
+\pxbb@addtoextras@otf{korean}{\UTFK}
+\pxbb@addtoextras@otf{schinese}{\UTFC}
+\pxbb@addtoextras@otf{tchinese}{\UTFT}
+\pxbb@addtoextras@otf@a{cjkmulti}{\UTFM}
+\fi % pxbb@switchfont
+
+%%<*> \pxUTFJ/\UTFJ
+\let\pxUTFJ\UTF
+\AtBeginDocument{%
+ \providecommand*\UTFJ{\pxUTFJ}}
+
+\fi %----</otfmulti>
+
+\ifupTeX %----<*upTeX>
+
+%% preparations
+\bxRequireDefinition{pxbasenc}
+\pxBDHookEncSwitchOTF
+
+%% declarations for upTeX standatd CJK fonts
+\ifpxbb@pxotf\else
+\pxDeclareBasicCJKEncoding{J20}{J30}% UniJIS
+\pxDeclareBasicCJKFamily{J20}{!upjpnrm-h}{!upjpngt-h}{*gt}{*gt}
+\pxDeclareBasicCJKFamily{J30}{!upjpnrm-v}{!upjpngt-v}{*gt}{*gt}
+\pxDeclareBasicCJKEncoding{J21}{J31}% UniKS
+\pxDeclareBasicCJKFamily{J21}{!upkorrm-h}{!upkorgt-h}{*gt}{*gt}
+\pxDeclareBasicCJKFamily{J31}{!upkorrm-v}{!upkorgt-v}{*gt}{*gt}
+\pxDeclareBasicCJKEncoding{J22}{J32}% UniGB
+\pxDeclareBasicCJKFamily{J22}{!upschrm-h}{!upschgt-h}{*gt}{*gt}
+\pxDeclareBasicCJKFamily{J32}{!upschrm-v}{!upschgt-v}{*gt}{*gt}
+\pxDeclareBasicCJKEncoding{J23}{J33}% UniCNS
+\pxDeclareBasicCJKFamily{J23}{!uptchrm-h}{!uptchgt-h}{*gt}{*gt}
+\pxDeclareBasicCJKFamily{J33}{!uptchrm-v}{!uptchgt-v}{*gt}{*gt}
+\pxDeclareBasicCJKEncoding{J24}{J34}% UniJIS2004
+\pxDeclareBasicCJKFamily{J24}{!upjpnrm-h}{!upjpngt-h}{*gt}{*gt}
+\pxDeclareBasicCJKFamily{J34}{!upjpnrm-v}{!upjpngt-v}{*gt}{*gt}
+\begingroup \let\pxForceFontDeclaration=f
+\bxForEachIn{J20,J30,J21,J31,J22,J32,J23,J33,J24,J34}\do{%
+ \pxDeclareExtraCJKFamily{#1}{\mcdefault}{*mc}{*mc}%
+ \pxDeclareExtraCJKFamily{#1}{\gtdefault}{*gt}{*gt}}
+\endgroup
+\fi
+
+%--------------------------------------- add font switch to Babel \extras
+\ifpxbb@switchfont
+
+%% \pxbb@set@full@ja@enc
+% Sets to \pxbb@ful@ja@enc the destination encoding.
+\bxForEachIn{J20,J24}\do{% all full japanese encodings
+ \csdef{pxbb@is@fje/#1}{t}}
+\edef\pxbb@dflt@ja@enc{% default full japanese encoding
+ \ifbool{pxbb@stdjaencoding}{\cy@encoding}{%else
+ \ifbool{pxbb@prefermmivjis}{J24}{J20}}}
+\def\pxbb@set@full@ja@enc{%
+ \edef\pxbb@full@ja@enc{%
+ \bxIfcsundefX{pxbb@is@fje/\cy@encoding}%
+ {\pxbb@dflt@ja@enc}{\cy@encoding}}}
+
+%% \pxbb@addtoextras
+\bxPreamble\def\pxbb@addtoextras#1#2#3{%
+ \edef\pxbb@arg{{\@nameuse{pxbb@langname/#1}}%
+ \if t#2{\noexpand\pxbb@full@ja@enc}{\noexpand\@undefined}%
+ \else{#3}{t}\fi}%
+ \expandafter\pxbb@addtoextras@a\pxbb@arg}
+\bxPreamble\def\pxbb@addtoextras@a#1#2#3{%
+ \csappto{extras#1}{%
+ \pxbb@set@full@ja@enc
+ \let\pxInNonJaLanguage=#3%
+ \let\pxbb@org@encoding\cy@encoding
+ \long\def\kanjiencodingdefault{#2}%
+ \kanjiencoding{#2}\selectfont}%
+ \csappto{noextras#1}{%
+ \let\pxInNonJaLanguage\@undefined
+ \long\def\kanjiencodingdefault{\pxbb@org@encoding}%
+ \kanjiencoding{\pxbb@org@encoding}\selectfont}}
+\pxbb@addtoextras{japanese}{t}{}
+\pxbb@addtoextras{korean}{f}{J21}
+\pxbb@addtoextras{schinese}{f}{J22}
+\pxbb@addtoextras{tchinese}{f}{J23}
+
+\fi % pxbb@switchfont
+
+\fi %----</upTeX>
+
+%--------------------------------------- Other user commands
+
+%%<*> \cjklanguagename{<lang_id>}
+% Expands to the babel language name for <lang_id>.
+\newcommand*\cjklanguagename[1]{%
+ \@nameuse{pxbb@langname/#1}}
+
+%--------------------------------------- integrity check
+
+%% check if \mcdefault is not changed
+\let\pxbb@tunc@mcdefault\mcdefault
+\AtBeginDocument{%
+ \bxIfExpToEqualX\pxbb@tunc@mcdefault\mcdefault{}{%else
+ \bxIfExpToEqualX\mcdefault{hmc}%
+ {\pxbb@warn@jafam{t}}%
+ {\pxbb@warn@jafam{f}}}}
+
+%--------------------------------------- all done
+\endinput
+%
+% Roman, H Gothic, H Roman, V Gothic, H : metric encod.
+% ------------ ------------ ------------ ------------ : ------ --------
+% umin10 ugoth10 utmin10 utgoth10 : min10 JIS-old
+% ujis ujisg ujis-v ujisg-v : jis JIS-old
+% ujisn ujisng ujisn-v ujisng-v : jisn JIS-old
+% * urml ugbm urmlv ugbmv : RAW JIS-old
+% upjisr-h upjisg-h upjisr-v upjisg-v : upjpn JIS-bmp
+% upjisr-hq upjisg-hq : upjpn JIS-old
+% upjpnrm-h upjpngt-h upjpnrm-v upjpngt-v : upjpn JIS-full
+% * uprml upgbm uprmlv upgmbv : RAW JIS-bmp
+% * uprmlq upgbmq : RAW JIS-old
+% upkorrm-h upkorgt-h upkorrm-v upkorgt-v : upkor KS
+% * uphysmjm-h uphygt-h uphysmjm-v uphygt-v : RAW KS
+% upschrm-h upschgt-h upschrm-v upschgt-v : upsch GB
+% * upstsl-h upstht-h upstsl-v upstht-v : RAW GB
+% uptchrm-h uptchgt-h uptchrm-v uptchgt-v : uptch CNS
+% * upmsl-h upmhm-h upmsl-v upmhm-v : RAW CNS
+%% EOF
diff --git a/language/japanese/pxbase/pxbabel.tex b/language/japanese/pxbase/pxbabel.tex
new file mode 100644
index 0000000000..c619d0dcbb
--- /dev/null
+++ b/language/japanese/pxbase/pxbabel.tex
@@ -0,0 +1,332 @@
+% 文字コードは UTF-8
+% uplatex で組版する
+\documentclass[a4paper,uplatex]{jsarticle}
+\usepackage{shortvrb}
+\MakeShortVerb{\|}
+\newcommand{\PkgVersion}{1.1b}
+\newcommand{\PkgDate}{2017/07/03}
+\newcommand{\Pkg}[1]{\textsf{#1}}
+\newcommand{\Meta}[1]{$\langle$\mbox{}#1\mbox{}$\rangle$}
+\newcommand{\Note}{\par\noindent ※}
+\newcommand{\Means}{:\quad\inhibitglue}
+\providecommand{\upTeX}{u\pTeX}
+\providecommand{\upLaTeX}{u\pLaTeX}
+%-----------------------------------------------------------
+\DeclareFontShape{JY2}{mc}{m}{ko}{<->s*[.924871]upkorrm-h}{}
+\DeclareFontShape{JT2}{mc}{m}{ko}{<->s*[.924871]upkorrm-v}{}
+\DeclareFontShape{JY2}{gt}{m}{ko}{<->s*[.924871]upkorgt-h}{}
+\DeclareFontShape{JT2}{gt}{m}{ko}{<->s*[.924871]upkorgt-h}{}
+\newcommand{\Kor}[1]{{\kanjishape{ko}\selectfont #1}}
+%-----------------------------------------------------------
+\begin{document}
+\title{\Pkg{pxbabel} パッケージ}
+\author{八登崇之\ (Takayuki YATO; aka.~``ZR'')}
+\date{v\PkgVersion \quad [\PkgDate]}
+\maketitle
+
+%===========================================================
+\section{概要}
+
+{(u)\pLaTeX}における日本語・簡体字中国語・繁体字中国語・
+韓国語(以下この 4 つを「CJK言語」と総称する)の間の
+「和文(CJK)フォント」の切り替えをBabelのインタフェースを
+用いて行えるようにする。
+
+\paragraph{前提環境}
+
+\begin{itemize}
+\item {\TeX}フォーマット: {\pLaTeX}/{\upLaTeX}
+ (拡張エンジンを含む)
+\end{itemize}
+
+\paragraph{依存パッケージ}
+
+\begin{itemize}
+\item \Pkg{babel}パッケージ
+\item \Pkg{japanese-otf}パッケージ({\pLaTeX}の場合)
+\end{itemize}
+
+%===========================================================
+\section{読込}
+
+v0.9より\Pkg{babel}パッケージと一緒に読み込む方式
+(一括読込モード)をサポートした。
+従来通り、別個に読み込む方式(分離読込モード)も可能である。
+どちらであるかは、\Pkg{pxbabel}読込時に\Pkg{babel}が読込済か
+どうかで判別する。
+
+\begin{quote}
+〈一括読込モードの場合〉\\
+|\usepackage[|\Meta{オプション}|]{pxbabel}|
+\par\bigskip
+〈分離読込モードの場合〉\\
+|\usepackage[|\Meta{Babelのオプション}|]{babel}|\\
+|\usepackage[|\Meta{オプション}|]{pxbabel}|
+\end{quote}
+
+オプションは以下の通り。
+なお「CJK 言語識別子」は次のいずれかの値のことを指す:
+\begin{itemize}
+\item |japanese|: 日本語
+\item |korean|: 韓国語
+\item |schinese|: 簡体字中国語
+\item |tchinese|: 繁体字中国語
+\end{itemize}
+「言語名」はBabelで指定する(|\foreignlanguage| 等の引数にする)
+言語を表す文字列のことである。
+
+\begin{itemize}
+\item \Meta{CJK言語識別子}|=|\Meta{言語名}\Means
+各々のCJK言語に対して実際に使用するBabelの言語名を指定する。
+詳しくは「機能」の節を参照。
+\Note 言語名の既定値はCJK言語識別子と同一名。
+(例えば |japanese|(日本語)の言語名は |japanese|。)
+
+\item \Meta{CJK言語識別子}\Means
+「\Meta{CJK言語識別子}|=|\Meta{CJK言語識別子}」と同じ。
+\Note これは既定値なので通常は指定する必要がないが、
+一括読込モードで「最後の言語(基底言語になる)」を
+指定するのに有用である。
+
+\item \Meta{CJK言語識別子}|=+|\Meta{言語名}\Means
+各々のCJK言語に対して実際に使用するBabelの言語名を指定し、
+かつその言語オプションの定義ファイル(|*.ldf|)を読み込む。
+
+\item |+|\Meta{CJK言語識別子}\Means
+「\Meta{CJK言語識別子}|=+|\Meta{CJK言語識別子}」と同じ。
+
+\item 有効なBabel言語の名前\Means
+その言語の定義ファイルを読み込む。
+\Note 分離読込モードでもこの機能は有効である。
+
+\item |main=|\Meta{言語名}\Means
+文書開始時に有効となる基底言語を、
+言語名(CJK言語識別子でない)で指定する。
+\Note このオプションが未指定の場合、
+分離読込モードでは\Pkg{babel}で最後に読まれた言語が基底言語になる。
+一括読込モードでは\Pkg{pxbabel}で最後に読まれた言語が基底言語になる。
+
+\item |caption=|\Meta{値}\Means
+キャプション言語(キャプションや日付の文字列で使われる言語)の
+固定に関する設定を行う。
+有効な値は次の通り:
+ \begin{itemize}
+ \item 有効なBabel言語名\Means その言語に固定する。
+ \item |main|\Means 文書開始時の基底言語に固定する。
+ \item |default|\Means キャプション文字列を文書クラスで
+ 指定されたものから変更しない。
+ \item |switch|\Means キャプション言語の固定を行わない。
+ (Babelの既定動作。)
+ \item |auto|(既定値)\Means
+ 文書開始時の基底言語が
+ 「言語オプション定義ファイルの読込を伴わないCJK言語」
+ (仮に「仮想言語設定」と呼ぶ)の場合は |default|、
+ それ以外は |switch|。
+ \end{itemize}
+\Note Babelでは言語の切替に関して、入力言語のみを切り替えるもの
+(|\foreignlanguage| 命令、|otherlanguage*| 環境)
+と基底言語を切り替えるもの
+(|\selectlanguage| 命令、|otherlanguage| 環境)
+があり、既定の動作では
+キャプション言語は基底言語に常に追随する
+(|switch| 指定時と同じ)。
+ところが、「仮想言語設定」においては、キャプション文字列の
+設定が働かないので、基底言語を「仮想言語設定」の言語に切り替えた場合に
+キャプション言語が正しくない事態が生じる。\<\footnote{%
+ ただし「文書開始時以外に基底言語を仮想言語設定に切り替える」ことを
+ しなければ問題は起こらない。
+ 特に、「日本語の文書クラスを用いて、かつBabelにおいて
+ 仮想言語設定とした日本語を文書全体で基底言語にする」
+ 場合は、キャプションは文書クラスで定めたものに固定される。}
+これによる混乱を避けるためにキャプション言語の固定が
+有用である場合がある。
+特に、「Babelによるキャプション文字列の変更を抑止して文書クラスで
+定めた文字列がいつでも有効であるようにしたい」という場合は、
+|default| を指定すればよい。
+文書開始時の基底言語が仮想言語設定である場合はこちらの使い方が
+多いと考えられるので、この場合には既定を |default| としている。
+\Note \Pkg{bxbase}パッケージの |\fixcaptiopnlanguage| によるキャプション
+言語固定の設定は、常に本パッケージでの設定より優先される。
+この使用は |main| オプションのものと一貫していないが、
+互換性のためそのままにしている。
+
+\item |noswitchcaption|\Means
+|caption=default| と同じ。
+\Note v0.9 より前はこれが既定値であった。
+ゆえに、(|no|)|switchcaption| も |caption| もなく基底言語が
+仮想言語設定でない場合の |caption| 設定は、
+v0.9 より前は |default|、以降は |switch| と異なることになる。
+仮想言語設定でない場合は |default| にする必然性が少ないので、
+Babelの既定動作に合わせる目的で変更された。
+
+\item |switchcaption|\Means
+|caption=switch| と同じ。
+
+\item |switchfont|(既定で有効)\Means
+このパッケージが提供する、
+CJK言語でフォントを切り替える機能を有効にする。
+
+\item |noswitchfont|\Means
+このパッケージが提供する、
+CJK言語でフォントを切り替える機能を無効にする。
+|switchfont| の否定。
+\end{itemize}
+
+%===========================================================
+\section{ユーザ命令}
+
+このパッケージが提供する主要な機能であるCJKフォント切替に
+ついてはBabelの機能を用いて行うことになるため、
+パッケージ特有の命令は存在しない。
+
+例えば、次のようなパッケージ読込(一括読込モード)
+の場合:
+\begin{quote}\begin{verbatim}
+\usepackage[korean,japanese]{pxbabel}
+\end{verbatim}\end{quote}
+本文中で
+\footnote{{\upLaTeX}フォーマット使用または
+{\pLaTeX}で\Pkg{bxutf8}入力エンコーディングを用いているとする。}
+\begin{quote}
+|日本語文書中に\foregnlanguage{korean}{|%
+\textgt{\Kor{한글}}|}がある。|
+\end{quote}
+と入力すれば次の出力が得られる。
+\begin{quote}
+日本語文書中に\Kor{한글}がある。
+\end{quote}
+
+本パッケージが提供する命令には次のものがある。
+
+\begin{itemize}
+\item |\cjklanguagename{|\Meta{CJK言語識別子}|}|\Means
+そのCJK言語に対する言語名。
+\Note 例えば読込時に |schinese=chinesesimp| と指定した場合、
+|\cjklanguagename{schinese}| は |chinesesimp| に展開される。
+\end{itemize}
+
+%===========================================================
+\section{CJKフォント切替機能の原理}
+
+\subsection{{\upLaTeX}において}
+
+{\upTeX}は標準で、CJK言語の{\TeX}フォント(和文TFM)を用意している。
+本パッケージはBabelにおいてCJK言語の切替処理(|\extras...|)
+の中に、フォントの切替を追加し、
+言語の選択に応じて適切なフォントが選ばれるようにする。
+言語に対するBabelの言語オプションの名前は変わりうるので、
+その名前をパッケージ読込時に指定できるようにした。
+また、あるCJK言語の為のオプションが読み込まれていない時は、
+フォントの切替のみをする簡易の言語オプション(仮想言語設定)
+をその場で生成する。
+
+\subsection{{\pLaTeX}において}
+
+\Pkg{japanese-otf}パッケージの |multi| オプションは{\pLaTeX}において
+韓国語・中国語を扱うためのもので、
+これを使うと |\UTFK|/|\UTFC|/|\UTFT| で
+韓国語/中国語(簡体)/中国語(繁体)のフォントを用いて
+文字が出力される
+(これらの命令の引数は |\UTF| と同じでUnicode値16進)。
+
+{\pLaTeX}における本パッケージの動作は次のようである。
+まず、{\upLaTeX}の場合と同じようにCJK言語のための
+Babel言語オプションを生成する。
+その上で、CJK言語に切り替わった場合には、
+|\UTF| の動作を「本来の |\UTF|」/|\UTFK|/|\UTFC|/|\UTFT|
+に切り替える。
+この機能は単独ではあまり有用とはいえないが、
+\Pkg{bxutf8}入力エンコーディング
+と併用してCJK言語のUTF-8直接入力を行う時に有用となる。
+すなわち直接入力されたCJK文字は |\UTF| に帰着するので、
+結果的に{\upLaTeX}の時と同じように、Babelで切り替えた言語用の
+フォントで出力することが可能となる。
+
+\Note ただし、この機構には、
+「JIS X~0208にある文字はそもそも |\UTF| に変換されずに
+直接日本語フォントで出力される」
+という欠点をもつ。
+これを解決するには\Pkg{pxfltsrc}パッケージ等の機能を用いて
+文書にテキスト変換フィルタを適用されるという処理が必要になる。
+
+%===========================================================
+\section{Babel一括読込モード}
+
+v0.9より前では、Babel本体(\Pkg{babel}パッケージ)
+とは別個に読み込む方式のみを採用していた。
+ところがこの場合、
+「Babelの本来の機能は不要で\Pkg{pxbabel}の
+フォント切替だけを用いたい」
+という場合、かなり不自然な指定をする必要があった。
+例えば、日本語(|japanese|)と韓国語(|korean|)を
+切り替えたい(メインは日本語)という場合は次のようになる。
+
+\begin{quote}\begin{verbatim}
+\usepackage[english]{babel}
+\usepackage[main=japanese]{pxbabel}
+\end{verbatim}\end{quote}
+\Note \Pkg{pxbabel}を読んで基底言語を |japanese|
+にする必要があるのだが、
+そうするとまず \Pkg{babel} を読む必要があり
+ここで何かダミーの言語(|english| を用いた)を指定する必要がある。
+このままでは基底が |english| になるので、
+|japanese| を基底にするのに |main| オプションが必要。
+
+そこで、v0.9において、\Pkg{babel}と一括で読み込むことで、
+\Pkg{babel}の使用言語オプション指定の方法を踏襲できるようにした。
+\Pkg{babel}の読込前に\Pkg{pxbabel}を読み込むとこの動作になり、
+\Pkg{babel}も一緒に読み込まれる。
+
+\begin{quote}\begin{verbatim}
+\usepackage[korean,japanese]{pxbabel}
+\end{verbatim}\end{quote}
+\Note オプションは\Pkg{babel}のものと同じ理屈で書く。
+|korean| と |japanese| を用い、
+基底が |japanese| なのでこの順番になる。
+
+目的が「{\upTeX}のSIP対応の日本語フォントが使いたい」
+だけの場合は以下のようになる。
+
+\begin{quote}\begin{verbatim}
+\usepackage[japanese]{pxbabel}
+\end{verbatim}\end{quote}
+\Note |japanese| のみ指定して、当然これが基底。
+
+実際には、4つのCJK言語のオプションは「常に」出現するので、
+上の2つの指定は等価であるが、
+一括読込の場合は\Pkg{babel}の習慣に合わせて記述するのが
+解りやすいと思われる。
+
+少し複雑な例を挙げておく。
+ドイツ語(|ngerman|)、日本語(|japanese|)、
+簡体字中国語(|simpchinese|)、繁体字中国語(|tradchinese|)
+を使用し、かつ前の3つには言語オプション定義(|*.ldf|)があり、
+基底は日本語で、キャプション言語の固定は行わないとする。
+
+\paragraph{分離読込モード}
+
+\begin{quote}\begin{verbatim}
+\usepackage[ngerman,simpchinese,japanese]{babel}
+\usepackage[schinese=simpchinese,tchinese=tradchinese,
+ caption=switch]{pxbabel}
+\end{verbatim}\end{quote}
+
+\Note 分離読込の場合は\Pkg{babel}で最後に指定したものが基底言語。
+
+\paragraph{一括読込モード}
+\begin{quote}\begin{verbatim}
+\usepackage[ngerman,schinese=+simpchinese,tchinese=tradchinese,
+ +japanese]{pxbabel}
+\end{verbatim}\end{quote}
+
+\Note ldfの読込を伴う言語(|japanese|)が基底なので、
+|caption| は |switch| が既定値になる。
+なお、非CJK言語(|ngerman|)には決して |+| を付けないことに注意。
+
+%===========================================================
+\section{更新履歴}
+
+|README-ja.md| ファイルを参照。
+
+%===========================================================
+\end{document}
diff --git a/language/japanese/pxbase/pxbase.def b/language/japanese/pxbase/pxbase.def
new file mode 100644
index 0000000000..214e278e54
--- /dev/null
+++ b/language/japanese/pxbase/pxbase.def
@@ -0,0 +1,7 @@
+%%
+%% This is file 'pxbase.def'.
+%%
+\PackageError{pxbase}%
+ {pxbase.def should no longer be read}%
+ {The current BX/PXbase package does not need the file.}
+%% EOF
diff --git a/language/japanese/pxbase/pxbase.sty b/language/japanese/pxbase/pxbase.sty
new file mode 100644
index 0000000000..e10ec1c6e2
--- /dev/null
+++ b/language/japanese/pxbase/pxbase.sty
@@ -0,0 +1,15 @@
+%%
+%% This is file 'pxbase.sty'.
+%%
+%% Copyright (c) 2017 Takayuki YATO (aka. "ZR")
+%% GitHub: https://github.com/zr-tex8r
+%% Twitter: @zr_tex8r
+%%
+%% This package is distributed under the MIT License.
+%%
+\NeedsTeXFormat{pLaTeX2e}
+\ProvidesPackage{pxbase}[2017/07/03 v1.1b PX base library]
+% The pxbase package now does the same thing as the bxbase package.
+\RequirePackageWithOptions{bxbase}[2017/05/29]
+\endinput
+%% EOF
diff --git a/language/japanese/pxbase/pxbasenc.def b/language/japanese/pxbase/pxbasenc.def
new file mode 100644
index 0000000000..55f1ac1130
--- /dev/null
+++ b/language/japanese/pxbase/pxbasenc.def
@@ -0,0 +1,516 @@
+%%
+%% This is file 'pxbasenc.def'.
+%%
+
+%% file declaration
+\NeedsTeXFormat{pLaTeX2e}
+\ProvidesFile{pxbasenc.def}[2017/07/03 v1.1b PX encoding library]
+\def\pxec@pkgname{PXbase} % bundle name
+
+%% code guards
+\edef\pxec@restore@codes{%
+ \catcode33=\the\catcode33%
+ \catcode39=\the\catcode39%
+ \catcode45=\the\catcode45%
+ \catcode46=\the\catcode46%
+ \catcode47=\the\catcode47%
+ \catcode58=\the\catcode58%
+ \catcode60=\the\catcode60%
+ \catcode62=\the\catcode62%
+\relax}
+\catcode33=12 % <!>
+\catcode39=12 % <'>
+\catcode45=12 % <->
+\catcode46=12 % <.>
+\catcode47=12 % </>
+\catcode58=12 % <:>
+\catcode60=12 % <<>
+\catcode62=12 % <>>
+
+%--------------------------------------- general
+
+%% packages
+\RequirePackage{ifuptex}[2008/03/14]
+
+%% variables
+\ifx\bxUcv\@undefined
+\newcount\bxUcv
+\fi
+\newif\ifpxec@ok
+\newif\ifpxec@sw
+\newif\ifpxec@star
+
+%% errors
+\def\pxec@error{\PackageError\pxec@pkgname}
+\def\pxec@err@irfam#1{\pxec@error
+ {Encodings '\pxec@tmpa' redefined inconsistently}\@ehc}
+\def\pxec@err@ukjsf{\pxec@error
+ {'\k@encoding' is not valid as JSF encoding}\@ehc}
+
+%--------------------------------------- CJK font declarations
+
+%% obtain error kanji font setting for use as 'safe font setting'
+\begingroup \escapechar\m@ne \error@kfontshape
+ \expandafter\let\expandafter\pxec@tenc
+ \csname t@enc@\f@encoding\endcsname
+ \xdef\pxec@safe@jfontspec
+ {{\f@encoding}{\pxec@tenc}{\f@family}{\f@series}{\f@shape}}%
+ \global\expandafter\let\expandafter\pxec@safe@y@decl
+ \csname \f@encoding/\f@family/\f@series/\f@shape\endcsname
+ \global\expandafter\let\expandafter\pxec@safe@t@decl
+ \csname \pxec@tenc/\f@family/\f@series/\f@shape\endcsname
+\endgroup
+
+%% \pxec@starinvoke\SOMECS
+\def\pxec@starinvoke#1{%
+ \@ifstar{\pxec@startrue#1}{\pxec@starfalse#1}}
+
+%%<+> \pxDeclareCJKEncoding[*]{<h-enc>}{<v-enc>}
+% *-form uses 'safety fonts' as subtitution.
+\@onlypreamble\pxDeclareCJKEncoding
+\def\pxDeclareCJKEncoding{%
+ \pxec@starinvoke\pxec@DeclareCJKEncoding}
+\@onlypreamble\pxDeclareBasicCJKEncoding
+\let\pxDeclareBasicCJKEncoding\pxDeclareCJKEncoding
+\def\pxec@DeclareCJKEncoding#1#2{%
+ \pxec@check@prior@decl{#1}{#2}%
+ \ifbxOk
+ \edef\pxec@args{{#1}{#2}}%
+ \expandafter\pxec@decl@cjkenc@a\pxec@args
+ \fi}
+\@onlypreamble\pxec@decl@cjkenc@a
+\def\pxec@decl@cjkenc@a#1#2{%
+ \DeclareYokoKanjiEncoding{#1}{}{}%
+ \DeclareTateKanjiEncoding{#2}{}{}%
+ \KanjiEncodingPair{#1}{#2}%
+ \ifpxec@star
+ \expandafter\pxec@decl@cjkenc@b\pxec@safe@jfontspec{#1}{#2}%
+ \else
+ \DeclareKanjiSubstitution{#1}{mc}{m}{n}%
+ \DeclareKanjiSubstitution{#2}{mc}{m}{n}%
+ \fi}
+\@onlypreamble\pxec@decl@cjkenc@b
+\def\pxec@decl@cjkenc@b#1#2#3#4#5#6#7{%
+ \DeclareKanjiFamily{#6}{ferr}{}%
+ \DeclareKanjiSubstitution{#6}{ferr}{#4}{#5}%
+ \expandafter\let\csname#6/ferr/#4/#5\endcsname\pxec@safe@y@decl
+ \DeclareKanjiFamily{#7}{ferr}{}%
+ \DeclareKanjiSubstitution{#7}{ferr}{#4}{#5}%
+ \expandafter\let\csname#7/ferr/#4/#5\endcsname\pxec@safe@t@decl}
+
+%% \pxec@check@prior@decl{<h-enc>}{<v-enc>}
+\@onlypreamble\pxec@check@prior@decl
+\def\pxec@check@prior@decl#1#2{%
+ \bxOktrue \def\pxec@tmpa{#1/#2}%
+ {% check if encodings '#1' and '#2' are declared
+ \count@=0\expandafter\ifx\csname T@#1\endcsname\relax\else1\fi
+ \expandafter\ifx\csname T@#2\endcsname\relax\else1\fi\relax
+ \ifnum\count@=\z@ \relax % neither declared, OK
+ \else\ifnum\count@=\@ne % exactly one declared, NG
+ \aftergroup\pxec@error@prior@decl
+ \else % both declared
+ \edef\pxec@y{#1}\edef\pxec@ty{\@nameuse{y@enc@#2}}%
+ \edef\pxec@t{#2}\edef\pxec@yt{\@nameuse{t@enc@#1}}%
+ \ifx\pxec@y\pxec@ty \ifx\pxec@t\pxec@yt \count@\z@ \fi\fi
+ \ifnum\count@=\z@ \aftergroup\bxOkfalse
+ \else \aftergroup\pxec@error@prior@decl \fi
+ \fi\fi}% after this \pxec@error@prior@decl may be called
+}
+\def\pxec@error@prior@decl{\pxec@err@irfam\pxec@tmpa\bxOkfalse}
+
+%%<+> \pxDeclareBasicCJKFamily[*]{<enc>}{<mc-m>}{<gt-m>}{<mc-bx>}{<gt-bx>}
+% Declares the two most basic CJK family, mc (mincho) and gt (gothic),
+% along with the most basic shapes m/n and bx/n for each of them.
+% *-form means the same as \bxDeclareBasicCJKShape.
+\@onlypreamble\pxDeclareBasicCJKFamily
+\def\pxDeclareBasicCJKFamily{%
+ \pxec@starinvoke\pxec@DeclareBasicCJKFamily}
+\@onlypreamble\pxec@DeclareBasicCJKFamily
+\def\pxec@DeclareBasicCJKFamily#1#2#3#4#5{%
+ \pxec@DeclareExtraCJKFamily{#1}{mc}{#2}{#4}%
+ \pxec@DeclareExtraCJKFamily{#1}{gt}{#3}{#5}}
+
+%%<+> \pxDeclareExtraCJKFamily[*]{<enc>}{<fam>}{<font-m>}{<font-bx>}
+\@onlypreamble\pxDeclareExtraCJKFamily
+\def\pxDeclareExtraCJKFamily{%
+ \pxec@starinvoke\pxec@DeclareExtraCJKFamily}
+\@onlypreamble\pxec@DeclareBasicCJKFamily
+\def\pxec@DeclareExtraCJKFamily#1#2#3#4{%
+ \pxDeclareKanjiFamily{#1}{#2}%
+ \pxec@DeclareBasicCJKShape{#1}{#2}{m}{#3}%
+ \pxec@DeclareBasicCJKShape{#1}{#2}{bx}{#4}}
+
+%% \pxec@DeclareBasicShapeSet[*]{<enc>}{<fam>}{<font-m>}{<font-bx>}
+% (private command used for JSF fonts)
+\@onlypreamble\pxec@DeclareBasicShapeSet
+\def\pxec@DeclareBasicShapeSet{%
+ \pxec@starinvoke\pxec@@DeclareBasicShapeSet}
+\@onlypreamble\pxec@@DeclareBasicShapeSet
+\def\pxec@@DeclareBasicShapeSet#1#2#3#4{%
+ \pxec@DeclareBasicCJKShape{#1}{#2}{m}{#3}%
+ \pxec@DeclareBasicCJKShape{#1}{#2}{bx}{#4}}
+
+%%<+> \pxDeclareBasicCJKFallback{<enc>}{<fam>}{<ser>}
+\def\pxDeclareBasicCJKFallback#1#2#3{%
+ \@for\pxec@x:={it,sl,sc}\do{%
+ \pxDeclareFontShape{#1}{#2}{#3}{\pxec@x}{<->ssub*#2/#3/n}}}
+
+%%<+> \pxDeclareBasicCJKShape[*]{<enc>}{<fam>}{<ser>}{<font>}
+% Declares the font for 'n'-shape. *-form does not set
+% substitution for shapes 'it', 'sl', 'sc'.
+\@onlypreamble\pxDeclareBasicCJKShape
+\def\pxDeclareBasicCJKShape{%
+ \pxec@starinvoke\pxec@DeclareBasicCJKShape}
+\@onlypreamble\pxec@DeclareBasicCJKShape
+\def\pxec@DeclareBasicCJKShape#1#2#3#4{%
+ \edef\pxec@args{{#1}{#2}{#3}{#4}}%
+ \expandafter\pxec@decl@bas@cjkshape@a\pxec@args}
+\@onlypreamble\pxec@decl@bas@cjkshape@a
+\def\pxec@decl@bas@cjkshape@a#1#2#3#4{%
+ \pxDeclareCJKShape{#1}{#2}{#3}{n}{#4}%
+ \ifpxec@star\else \pxDeclareBasicCJKFallback{#1}{#2}{#3}\fi}
+
+%%<+> \pxDeclareCJKShape{<enc>}{<fam>}{<ser>}{<shape>}{<font>}
+% Declares a single font shape. Here <font> is a font spec
+% or a fontsubst form.
+\@onlypreamble\pxDeclareCJKShape
+\def\pxDeclareCJKShape#1#2#3#4#5{%
+ \edef\pxec@args{{#1}{#2}{#3}{#4}{\pxFontSubst{#5}}}%
+ \expandafter\pxec@decl@cjkshape@a\pxec@args}
+\@onlypreamble\pxec@decl@cjkshape@a
+\def\pxec@decl@cjkshape@a#1#2#3#4#5{%
+ \pxDeclareFontShape{#1}{#2}{#3}{#4}{<->#5}}
+
+%%<+> \pxDefineFontSubst{<sym>}{<text>}
+% Defines a 'fontsubst' with name <sym>. After its call,
+% \pxFontSubst{*<sym>} will expand to <text>.
+% N.B. A fontsubst must be fully-expandable.
+%%<+> \pxFontSubst{<spec>}
+% Resolves a 'fontsubst' and expands to the resulted text. That is,
+% - <spec> of form !<text> expands to s*[<value>]<text>, where
+% <value> is the standard scale factor defined in \pxUpScale.
+% - <spec> of fotm *<text> expands to the definition of 'fontsubst'
+% with name <text>.
+% - <spec> of other form is left unchanged.
+\@onlypreamble\pxDefineFontSubst
+\def\pxDefineFontSubst#1{\@namedef{pxec@font*#1}}
+\@onlypreamble\pxFontSubst
+\def\pxFontSubst#1{\pxec@fontsubst@a#1\@nil}
+\@onlypreamble\pxec@fontsubst@a
+\def\pxec@fontsubst@a#1#2\@nil{%
+ \if!#1s*[\pxUpScale]#2%
+ \else\if*#1\@nameuse{pxec@font*#2}\else#1#2\fi\fi}
+% define some fontsubsts
+\pxDefineFontSubst{mc}{ssub*mc/m/n}
+\pxDefineFontSubst{gt}{ssub*gt/m/n}
+
+%%<+> \pxDeclareSimpleShape{<enc>}{<fam>}{<ser>}{<shape>}{<font>}
+% An alias of \pxDeclareCJKShape for compatibility.
+\@onlypreamble\pxDeclareSimpleShape
+\let\pxDeclareSimpleShape\pxDeclareCJKShape
+
+%%<+> \pxDeclareExtraCJKShapeBF{<enc>}{<shape>}
+%% {<mc-m>}{<gt-m>}{<mc-bx>}{<gt-bx>}
+\def\pxDeclareExtraCJKShapeBF#1#2#3#4#5#6{%
+ \pxDeclareCJKShape{#1}{mc}{m}{#2}{#3}%
+ \pxDeclareCJKShape{#1}{gt}{m}{#2}{#4}%
+ \pxDeclareCJKShape{#1}{mc}{bx}{#2}{#5}%
+ \pxDeclareCJKShape{#1}{gt}{bx}{#2}{#6}}
+
+
+%--------------------------------------- passive \DeclareFontShape
+
+%%<+> \pxForceFontDeclaration
+% Takes either of the following values and decides what to do
+% when the font shape is already declared.
+% t : Overwrites declaration.
+% f : Skips declaration.
+% e : Displays an error.
+% It should be t except when other values are needed.
+\let\pxForceFontDeclaration=t
+
+%%<+> \pxDeclareKanjiFamily{<enc>}{<fam>}
+\def\pxDeclareKanjiFamily#1#2{%
+ \expandafter\ifx\csname#1+#2\endcsname\relax
+ \DeclareKanjiFamily{#1}{#2}{}%
+ \else\if e\pxForceFontDeclaration
+ \pxec@error{Font family #1/#2 already defined}\@ehc
+ \fi\fi}
+
+%%<+> \pxDeclareFontShape{<enc>}{<fam>}{<ser>}{<shape>}{<spec>}
+\def\pxDeclareFontShape#1#2#3#4#5{%
+ \expandafter\ifx\csname #1/#2/#3/#4\endcsname\relax
+ \DeclareFontShape{#1}{#2}{#3}{#4}{#5}{}%
+ \else\if e\pxForceFontDeclaration
+ \pxec@error{Font shape #1/#2/#3/#4 already defined}\@ehc
+ \else\if f\pxForceFontDeclaration\else
+ \pxUndeclareFontShape{#1}{#2}{#3}{#4}%
+ \DeclareFontShape{#1}{#2}{#3}{#4}{#5}{}%
+ \fi\fi\fi}
+
+%%<+> \pxUndeclareFontShape{<enc>}{<fam>}{<ser>}{<shape>}
+\def\pxUndeclareFontShape#1#2#3#4{%
+ \expandafter\let\csname #1/#2/#3/#4\endcsname\@undefined
+ \@tfor\pxec@y:=\@vpt\@vipt\@viipt\@viiipt\@ixpt\@xpt
+ \@xipt\@xiipt\@xivpt\@xviipt\@xxpt\@xxvpt\do
+ {\expandafter\let\csname #1/#2/#3/#4/\pxec@y\endcsname\@undefined}}
+
+%--------------------------------------- CJK named encodings
+
+%%<+> \pxDeclareEncodingDispatcher{<enc_name>}{<text>}
+\@onlypreamble\pxDeclareEncodingDispatcher
+\def\pxDeclareEncodingDispatcher#1{%
+ \expandafter\pxec@decl@enc@dispat@a\csname pxec@ED/#1\endcsname}
+\def\pxec@decl@enc@dispat@a#1{\@onlypreamble#1\def#1}
+
+%%<+> \pxDispatchEncodings{<enc_name>,...}
+\@onlypreamble\pxDispatchEncodings
+\def\pxDispatchEncodings#1{%
+ \@for\pxec@x:={#1}\do{%
+ \ifx\pxec@x\@empty\else
+ \expandafter\pxec@dispat@enc@a\csname pxec@ED/\pxec@x\endcsname
+ \expandafter\let\csname pxec@EA/\pxec@x\endcsname=t\relax
+ \fi}}
+\def\pxec@dispat@enc@a#1{#1\let#1\relax}
+
+%%<+> \pxIsEncodingDispatched{<enc_name>}
+\def\pxIsEncodingDispatched#1{%
+ 1\expandafter\ifx\csname pxec@EA/#1\endcsname\relax
+ \expandafter0\else\expandafter1\fi}
+
+%%<+> \pxBothEncodingsFromName\CSyoko\CState{<enc_name>}
+%%<+> \pxEncodingFromName{<enc_name>}
+%%<+> \pxTateEncodingFromName{<enc_name>}
+\def\pxBothEncodingsFromName#1#2#3{%
+ \expandafter\let\expandafter#1\csname pxec@EY/#3\endcsname
+ \expandafter\let\expandafter#2\csname pxec@ET/#3\endcsname}
+\def\pxEncodingFromName#1{\csname pxec@EY/#1\endcsname}
+\def\pxTateEncodingFromName#1{\csname pxec@ET/#1\endcsname}
+
+%%<+> \pxSetEncodingName{<enc_name>}{<h_enc>}{<v_enc>}
+\@onlypreamble\pxSetEncodingName
+\def\pxSetEncodingName#1#2#3{%
+ \@namedef{pxec@EY/#1}{#2}\@namedef{pxec@ET/#1}{#3}}
+
+%------------------------------- font declarations using named encodings
+
+%%<+> \pxec@supdef\SOMECS{<text1>}{<text2>}
+% Define \SOMECS to be <text1> if <text1> is non-empty,
+% otherwise <text2>.
+\def\pxec@supdef#1#2#3{%
+ \def#1{#2}\ifx#1\@empty \def#1{#3}\fi}
+
+%%<+> \pxDeclareCJKEncodingNE[*]{<enc_name>}
+\@onlypreamble\pxDeclareCJKEncodingNE
+\def\pxDeclareCJKEncodingNE{%
+ \pxec@starinvoke\pxec@DeclareCJKEncodingNE}
+\def\pxec@DeclareCJKEncodingNE#1{%
+ \pxBothEncodingsFromName\pxec@y\pxec@t{#1}%
+ \pxec@DeclareCJKEncoding\pxec@y\pxec@t}
+
+%%<+> \pxDeclareExtraCJKFamilyNE[*]
+%% {<enc-name>}{<fam>}{<h-m>}{<h-bx>}{<v-m>}{<v-bx>}
+\@onlypreamble\pxDeclareExtraCJKFamilyNE
+\def\pxDeclareExtraCJKFamilyNE{%
+ \pxec@starinvoke\pxec@DeclareExtraCJKFamilyNE}
+\@onlypreamble\pxec@DeclareBasicCJKFamilyNE
+\def\pxec@DeclareExtraCJKFamilyNE#1#2#3#4#5#6{%
+ \pxBothEncodingsFromName\pxec@y\pxec@t{#1}%
+ \pxDeclareKanjiFamily{\pxec@y}{#2}%
+ \pxec@DeclareBasicCJKShape{\pxec@y}{#2}{m}{#3}%
+ \pxec@DeclareBasicCJKShape{\pxec@y}{#2}{bx}{#4}%
+ \pxDeclareKanjiFamily{\pxec@t}{#2}%
+ \pxec@supdef\pxec@vm{#5}{#3}\pxec@supdef\pxec@vb{#6}{#4}%
+ \pxec@DeclareBasicCJKShape{\pxec@t}{#2}{m}{\pxec@vm}%
+ \pxec@DeclareBasicCJKShape{\pxec@t}{#2}{bx}{\pxec@vb}}
+
+%%<+> \pxDeclareBasicCJKShapeNE[*]
+%% {<enc-name>}{<fam>}{<ser>}{<h-font>}{<v-font>}
+% Declares the font shape for 'n'-shape. *-form does not set
+% substitution for shapes 'it', 'sl', 'sc'.
+\@onlypreamble\pxDeclareBasicCJKShapeNE
+\def\pxDeclareBasicCJKShapeNE{%
+ \pxec@starinvoke\pxec@DeclareBasicCJKShapeNE}
+\@onlypreamble\pxec@DeclareBasicCJKShapeNE
+\def\pxec@DeclareBasicCJKShapeNE#1#2#3#4#5{%
+ \pxBothEncodingsFromName\pxec@y\pxec@t{#1}%
+ \pxec@supdef\pxec@z{#5}{#4}%
+ \pxec@DeclareBasicCJKShape\pxec@y{#2}{#3}{#4}%
+ \pxec@DeclareBasicCJKShape\pxec@t{#2}{#3}{\pxec@z}}
+
+%%<+> \pxDeclareCJKShapeNE
+%% {<enc_name>}{<fam>}{<ser>}{<shape>}{<h_font>}{<v_font>}
+\@onlypreamble\pxDeclareCJKShapeNE
+\def\pxDeclareCJKShapeNE#1#2#3#4#5#6{%
+ \pxBothEncodingsFromName\pxec@y\pxec@t{#1}%
+ \pxec@supdef\pxec@z{#6}{#5}%
+ \pxDeclareCJKShape\pxec@y{#2}{#3}{#4}{#5}%
+ \pxDeclareCJKShape\pxec@t{#2}{#3}{#4}{\pxec@z}}
+
+%--------------------------------------- JSF encodings
+
+%%<+> \pxDeclareJSFEncoding{<h-enc>}{<v-enc>}{<sfid>,...}
+\def\pxDeclareJSFEncoding#1#2#3{%
+ \pxDeclareBasicCJKEncoding*{#1}{#2}%
+ \expandafter\edef\csname pxec@ZL/#1\endcsname{#3}%
+ \expandafter\let\csname pxec@ZL/#2\expandafter\endcsname
+ \csname pxec@ZL/#1\endcsname}
+
+%%<+> \DeclareJSFFamily{<enc>}{<fam>}[<sfid>,...]{<body>}
+%%<+> \AppendToJSFFamily{<enc>}{<fam>}[<sfid>,...]{<body>}
+\def\DeclareJSFFamily{\pxec@starfalse\pxec@DeclareJSFFamily}
+\def\AppendToJSFFamily{\pxec@startrue\pxec@DeclareJSFFamily}
+\def\pxec@DeclareJSFFamily#1#2{%
+ \edef\pxec@djf@enc{#1}\edef\pxec@djf@fam{#2}%
+ \expandafter\let\expandafter\pxec@sfidlst\csname pxec@ZL/#1\endcsname
+ \@ifnextchar[%
+ \pxec@decl@jsf@fam@a{\pxec@decl@jsf@fam@b\relax}}
+\def\pxec@decl@jsf@fam@a[#1]{%
+ \pxec@decl@jsf@fam@b{\edef\pxec@sfidlst{#1}}}
+\def\pxec@decl@jsf@fam@b#1{%
+ \ifx\pxec@sfidlst\relax \pxec@err@ukjsf
+ \else #1\expandafter\pxec@decl@jsf@fam@c \fi}
+\def\pxec@decl@jsf@fam@c{%
+ \afterassignment\pxec@decl@jsf@fam@d\def\pxec@djf@body##1##2}
+\def\pxec@decl@jsf@fam@d{%
+ \ifpxec@star\else
+ \DeclareKanjiFamily{\pxec@djf@enc}{\pxec@djf@fam=Z}{\relax}\fi
+ \edef\pxec@nxt{\noexpand\@for\noexpand\pxec@djf@x:=\pxec@sfidlst}%
+ {\pxec@nxt\do{\pxec@decl@jsf@fam@do}}}
+\def\pxec@decl@jsf@fam@do{%
+ \global\expandafter\let\csname
+ pxec@Z/\pxec@djf@enc/\pxec@djf@fam/\pxec@djf@x\endcsname=t%
+ \edef\pxec@famx{\pxec@djf@fam=Z\pxec@djf@x}%
+ \DeclareKanjiFamily{\pxec@djf@enc}{\pxec@famx}{}%
+ \bxDebug{font family \pxec@famx\space loaded}%
+ \edef\JSFBasicShapeSet{\pxec@djf@starinvoke\pxec@JSFBasicShapeSet}%
+ \edef\JSFFallback{\pxec@djf@invoke\pxec@JSFFallback}%
+ \edef\JSFBasicShape{\pxec@djf@starinvoke\pxec@JSFBasicShape}%
+ \edef\JSFShape{\pxec@djf@starinvoke\pxec@JSFShape}%
+ \pxec@djf@body\pxec@djf@x\pxec@djf@fam}
+\def\pxec@djf@invoke#1{\noexpand#1{\pxec@djf@enc}{\pxec@famx}}
+\def\pxec@djf@starinvoke#1{\noexpand\pxec@starinvoke\pxec@djf@invoke#1}
+
+%%%% commands used inside \DeclareJSFFamily
+
+%%<+> \JSFBasicShapeSet[*]{<font-m-n>}{<font-bx-n>}
+\def\pxec@JSFBasicShapeSet{\pxec@DeclareBasicShapeSet}
+
+%%<+> \JSFFallback{<ser>}
+\def\pxec@JSFFallback{\pxDeclareBasicCJKFallback}
+
+%%<+> \JSFBasicShape[*]{<ser>}{<font-n>}
+\def\pxec@JSFBasicShape{\pxDeclareBasicCJKShape}
+
+%%<+> \JSFShape[*]{<ser>}{<shape>}{<font>}
+\def\pxec@JSFShape{%
+ \ifpxec@star \expandafter\pxDeclareFontShape
+ \else \expandafter\pxDeclareCJKShape \fi}
+
+%%<+> \JSFShapeRaw{<ser>}{<shape>}{<spec>}
+\def\pxec@JSFShapeRaw{\pxDeclareFontShape}
+
+%--------------------------------------- basic encodings
+
+%%%% the standard Japanese encodings
+\ifnativeupTeX
+\def\pxStdYEnc{JY2}\def\pxStdTEnc{JT2}
+\else
+\def\pxStdYEnc{JY1}\def\pxStdTEnc{JT1}
+\fi
+
+%%%% encoding name 'standard' for standard encodings
+\edef\pxec@args{{standard}{\pxStdYEnc}{\pxStdTEnc}}
+\expandafter\pxSetEncodingName\pxec@args
+
+%%%% user interfaces
+
+%%<*> \selectjaencoding{<enc_name>}
+\DeclareRobustCommand*\selectjaencoding[1]{%
+ \edef\pxec@tmpa{\pxEncodingFromName{#1}}%
+ \pxec@selectjaencoding\pxec@tmpa \ignorespaces}
+
+%%<*> \normaljaencoding
+\DeclareRobustCommand*\normaljaencoding{%
+ \pxec@selectjaencoding\kanjiencodingdefault}
+
+%%<*> \standardjaencoding
+\DeclareRobustCommand*\standardjaencoding{%
+ \pxec@selectjaencoding\pxStdYEnc}
+
+%% \pxec@selectjaencoding{<enc>}
+% Adjustment for pxbabel.
+\def\pxec@selectjaencoding#1{%
+ \ifx\pxInNonJaLanguage\@undefined \kanjiencoding{#1}\selectfont\fi
+ \ifx\pxbb@org@encoding\@undefined\else \edef\pxbb@org@encoding{#1}\fi}
+
+%%%% declarations for basic Japanese encodings
+
+\ifnativeupTeX %<upTeX>
+
+%% J20, J30 : 2000jis
+\pxSetEncodingName{2000jis}{J20}{J30}
+\pxDeclareEncodingDispatcher{2000jis}{\pxDeclareCJKEncodingNE{2000jis}}
+
+%% J24, J34 : 2004jis
+\pxSetEncodingName{2004jis}{J24}{J34}
+\pxDeclareEncodingDispatcher{2004jis}{\pxDeclareCJKEncodingNE{2004jis}}
+
+\else %<pTeX>
+
+%% J00, J10 : 78jis
+\pxSetEncodingName{78jis}{J00}{J10}
+\pxDeclareEncodingDispatcher{78jis}{\pxDeclareCJKEncodingNE{78jis}}
+
+% It is assumed that the standard encodings (JY1/JT1) have 83JIS form.
+% Thus the encoding '83jis' will not be used.
+%% J01, J11 : 83jis
+%\pxSetEncodingName{83jis}{J01}{J11}
+%\pxDeclareEncodingDispatcher{83jis}{\pxDeclareCJKEncodingNE{83jis}}
+
+% The name "J02/J12' is intended to mean 90JIS (= 97JIS), but Adobe does
+% not distinguish 90JIS from 83JIS. So I will make no distinction between
+% then either.
+
+% The fonts for standard families (mc & gt) in '2000jis' encoding are not
+% provided together with PXfontspec bundle, so this encoding is not ready
+% for use unless the appropriate fonts (jfms) are prepared.
+%% J03, J13 : 2000jis
+\pxSetEncodingName{2000jis}{J03}{J13}
+\pxDeclareEncodingDispatcher{2000jis}{\pxDeclareCJKEncodingNE{2000jis}}
+
+%% J04, J14 : 2004jis
+\pxSetEncodingName{2004jis}{J04}{J14}
+\pxDeclareEncodingDispatcher{2004jis}{\pxDeclareCJKEncodingNE{2004jis}}
+
+%% J08, J18 : winj (CP932)
+\pxSetEncodingName{winj}{J08}{J18}
+\pxDeclareEncodingDispatcher{winj}{\pxDeclareCJKEncodingNE{winj}}
+
+\fi %</upTeX>
+
+%--------------------------------------- patches to OTF/UTF packages
+
+%%%% make \CID work in nonstandard CJK encodings
+% \UTF & \CID require the current encoding to be the standard one, thus
+% they won't work well along with packages that change Japanese encoding
+% (pxfontenc, pxbabel, etc.). This patch resolves this problem.
+\providecommand*\pxBDHookEncSwitchOTF{\pxec@bdhook@encswotf@do}
+\@onlypreamble\pxec@bdhook@encswotf@do
+\def\pxec@bdhook@encswotf@do{%
+ \AtBeginDocument{%
+ \@ifpackageloaded{otf}{\let\pxec@JYn\otf@JYn}{}%
+ \@ifpackageloaded{utf}{\let\pxec@JYn\utf@JYn}{}%
+ \ifx\pxec@JYn\@undefined\else
+ % hook at the \set@character invocation, so that encoding will
+ % be forced to be the standard one
+ \long\def\set@character{% \long, as the original is
+ \afterassignment\pxec@put@character\@tempcnta}%
+ \def\pxec@put@character{\kanjiencoding{\pxec@JYn}\put@character}%
+ \fi}%
+ \let\pxBDHookEncSwitchOTF\@empty}% nullify
+
+%--------------------------------------- all done
+\pxec@restore@codes
+\endinput
+%% EOF
diff --git a/language/japanese/pxbase/pxbsjc.def b/language/japanese/pxbase/pxbsjc.def
new file mode 100644
index 0000000000..d8b27ec658
--- /dev/null
+++ b/language/japanese/pxbase/pxbsjc.def
@@ -0,0 +1,6 @@
+%
+% pxbsjc.def
+% Warning: Do not change encoding of this file!
+\def\bxtb@tmpa{齷齷}% E9 BD B7 E9 BD B7
+\endinput
+% EOF
diff --git a/language/japanese/pxbase/pxbsjc1.def b/language/japanese/pxbase/pxbsjc1.def
new file mode 100644
index 0000000000..2d04593828
--- /dev/null
+++ b/language/japanese/pxbase/pxbsjc1.def
@@ -0,0 +1,7 @@
+%
+% pxbsjc.def
+% Warning: Do not change encoding of this file!
+\def\bxtb@tmpa{齷齷}% E9 BD B7 E9 BD B7
+% O! % 82 4F 21
+\endinput
+% EOF
diff --git a/language/japanese/pxbase/pxjsfenc.def b/language/japanese/pxbase/pxjsfenc.def
new file mode 100644
index 0000000000..0fc28f2e81
--- /dev/null
+++ b/language/japanese/pxbase/pxjsfenc.def
@@ -0,0 +1,212 @@
+%%
+%% This is file 'pxjsfenc.def'.
+%%
+
+%% file declaration
+\NeedsTeXFormat{pLaTeX2e}
+\ProvidesFile{pxjsfenc.def}[2017/07/03 v1.1b PX JSF encoding]
+
+%% code guards
+\edef\pxec@jsf@restore@codes{%
+ \catcode34=\the\catcode34%
+ \catcode43=\the\catcode43%
+ \catcode45=\the\catcode45%
+ \catcode46=\the\catcode46%
+ \catcode47=\the\catcode47%
+ \catcode60=\the\catcode60%
+\relax}
+\catcode34=12 % <">
+\catcode43=12 % <+>
+\catcode45=12 % <->
+\catcode46=12 % <.>
+\catcode47=12 % </>
+\catcode60=12 % <<>
+\g@addto@macro\pxec@jsf@restore@codes{%
+ \let\pxec@jsf@restore@codes\@undefined}
+
+%--------------------------------------- general
+
+%% packages
+\RequirePackage{pxbase}
+\bxRequireDefinition{pxbasenc}
+
+%% variables
+\newif\ifpxec@hyperref % true if hyperref patch is invoked
+
+%--------------------------------------- main
+
+%% \pxec@declare@jsf@gen{<name>}{<enc>}{<ext>}
+\def\pxec@declare@jsf@ucs{\pxec@swtrue\pxec@declare@jsf@a}
+\def\pxec@declare@jsf@cid{\pxec@swfalse\pxec@declare@jsf@a}
+\def\pxec@declare@jsf@a#1{% {<name>} | {<enc>}{<ext>}
+ \expandafter\pxec@declare@jsf@b\csname#1\expandafter\endcsname
+ \csname pxUcv#1\expandafter\endcsname
+ \csname pxec@E@#1\expandafter\endcsname
+ \csname pxec@ext@#1\endcsname{#1}}
+\def\pxec@declare@jsf@b#1#2#3#4#5#6#7{%
+ % \[<name>]\[pxUcv<name>]\[pxec@E@<name>]\[pxec@ext@<name>]
+ % {<name>}{<enc>}{<ext>}
+ \ifpxec@sw \DeclareRobustCommand{#1}[1]{%
+ \uppercase{\bxUcv="##1}\pxec@out@jsf#3#4}%
+ \else \DeclareRobustCommand{#1}[1]{%
+ \uppercase{\bxUcv=##1}\pxec@out@jsf#3#4}%
+ \fi
+ \def#2{\pxec@out@jsf#3#4}\def#3{#6}%
+ \ifpxec@sw \pxec@addto@hyref@patch{#5}\fi
+ \ifx @#7@\else\bxUseShadowMap#4{#7}\fi}
+%% hyperref patch
+\def\pxec@hyref@patch{\pxec@hyperreftrue}
+\AtBeginDocument{\@ifpackageloaded{hyperref}{\pxec@hyref@patch}{}}
+\def\pxec@addto@hyref@patch#1{% {<name>}
+ \expandafter\pxec@addto@hyref@patch@a\csname#1\expandafter\endcsname
+ \csname pxec@hy@#1\expandafter\endcsname\csname#1 \endcsname}
+\def\pxec@addto@hyref@patch@a#1#2#3{%
+ % \[<name>]\[pxec@hy@<name>]\[<name> ]
+ \g@addto@macro\pxec@hyref@patch{\def#1{\protect#2}%
+ \def#2##1{\ifHy@pdfstring\0x##1\else#3{##1}\fi}}}
+
+%% define \UTF command
+% \pxec@E@UTF (second argument) will be \let'd to be either
+% \pxec@E@UTF@a or \pxec@E@UTF@b.
+% Note that pxbabel package \let's \UTF be \UTFK, etc. when
+% a CJK language is in effect.
+\pxec@declare@jsf@ucs{UTF}{J20}{sm-pxot-ja}
+
+%% \pxSwitchUTFCommand
+\def\pxSwitchUTFCommand#1{\csname pxec@SWU/#1\endcsname}
+\@namedef{pxec@SWU/2000jis}{\let\pxec@E@UTF\pxec@E@UTF@a}
+\@namedef{pxec@SWU/2004jis}{\let\pxec@E@UTF\pxec@E@UTF@b}
+
+%% define standard sets
+\pxec@declare@jsf@ucs{UTF@a}{J20}{sm-pxot-ja}
+\pxec@declare@jsf@ucs{UTFK}{J21}{sm-pxot-ko}
+\pxec@declare@jsf@ucs{UTFC}{J22}{sm-pxot-sc}
+\pxec@declare@jsf@ucs{UTFT}{J23}{sm-pxot-tc}
+\pxec@declare@jsf@ucs{UTF@b}{J24}{sm-pxot-ja}
+\pxec@declare@jsf@ucs{UTFM}{J25}{}
+\pxec@declare@jsf@cid{CID}{J40}{}
+\pxec@declare@jsf@cid{CIDK}{J41}{}
+\pxec@declare@jsf@cid{CIDC}{J42}{}
+\pxec@declare@jsf@cid{CIDT}{J43}{}
+
+%--------------------------------------- processing in upTeX
+\ifnativeupTeX
+
+\pxDeclareCJKEncoding*{J20}{J30}
+\pxDeclareCJKEncoding*{J21}{J31}
+\pxDeclareCJKEncoding*{J22}{J32}
+\pxDeclareCJKEncoding*{J23}{J33}
+\pxDeclareCJKEncoding*{J24}{J34}
+\pxDeclareCJKEncoding*{J40}{J50}
+\pxDeclareCJKEncoding*{J41}{J51}
+\pxDeclareCJKEncoding*{J42}{J52}
+\pxDeclareCJKEncoding*{J43}{J53}
+
+%<+> \pxSwitchUTFDirect
+%<+> \pxSwitchUTFIndirect
+\def\pxec@nxt#1{% here #1 is \[UTF ]
+ \let\pxec@UTF@ind#1\let\pxec@UcvUTF@ind\pxUcvUTF
+ \def\pxec@UTF@dir##1{\uppercase{\char"##1 }}%
+ \def\pxec@UcvUTF@dir{\char\bxUcv}%
+ \def\pxSwitchUTFDirect{%
+ \let#1\pxec@UTF@dir \let\pxUcvUTF\pxec@UcvUTF@dir}%
+ \def\pxSwitchUTFIndirect{%
+ \let#1\pxec@UTF@ind \let\pxUcvUTF\pxec@UcvUTF@ind}}
+\expandafter\pxec@nxt\csname UTF \endcsname
+
+%% \pxec@out@jsf{<enc>}\[<ext>]
+\def\pxec@out@jsf#1#2{% {<enc>}\[<ext>]
+ {\kanjiencoding{#1}\selectfont \kchar\bxUcv}}
+
+\pxec@jsf@restore@codes
+\expandafter\endinput \fi\relax % stop here
+%--------------------------------------- processing in pTeX
+
+%% JSF encodings
+\pxDeclareJSFEncoding{J20}{J30}{0,2,3,4,5,6,7,8,9,d,f}
+\pxDeclareJSFEncoding{J21}{J31}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,f}
+\pxDeclareJSFEncoding{J22}{J32}{0,1,2,3,4,5,6,7,8,9,d,f}
+\pxDeclareJSFEncoding{J23}{J33}{0,2,3,4,5,6,7,8,9,d,f}
+\pxDeclareJSFEncoding{J24}{J34}{0,2,3,4,5,6,7,8,9,d,f}
+\pxDeclareJSFEncoding{J40}{J50}{0,1,2,3,4,5}
+\pxDeclareJSFEncoding{J41}{J51}{0,1,2,3,4}
+\pxDeclareJSFEncoding{J42}{J52}{0,1,2,3,4,5,6,7}
+\pxDeclareJSFEncoding{J43}{J53}{0,1,2,3,4}
+
+%% \pxec@out@jsf{<enc>}\[<ext>]
+% The code value specified has been assigned to \bxUcv here.
+\def\pxec@out@jsf#1#2{% {<enc>}\[<ext>]
+ \pxec@loadfontdef{#1}%
+ \bgroup\pxec@pretranscode#2\pxec@transcode
+ \expandafter\let\expandafter\pxec@tmpa
+ \csname #1/\k@family=Z\pxec@sfid/\k@series/\k@shape\endcsname
+ \ifx\pxec@tmpa\relax \pxec@setinvalid \fi
+ \kanjiencoding{#1}\kanjifamily{\k@family=Z\pxec@sfid}%
+ \selectfont\char\jis\bxUcv
+ \egroup\pxec@end}
+
+%% \pxec@transcode
+\mathchardef\pxec@c@jsfa="3030
+\mathchardef\pxec@c@jsfb="1000
+\chardef\pxec@c@jsfx="40
+\chardef\pxec@c@jsfy="C0
+\chardef\pxec@c@jsfz=10
+\def\do#1{\uppercase{\@tempcnta="#1}\relax
+ \expandafter\def\csname pxec@TX/\the\@tempcnta\endcsname{#1}}
+\do a\do b\do c\do d\do e\do f
+\def\pxec@transcode{%
+ \@tempcnta\bxUcv \divide\@tempcnta\pxec@c@jsfb
+ \edef\pxec@sfid{\ifnum\@tempcnta<\pxec@c@jsfz \the\@tempcnta
+ \else \csname pxec@TX/\the\@tempcnta\endcsname \fi}%
+ \multiply\@tempcnta\pxec@c@jsfb \advance\bxUcv-\@tempcnta
+ \@tempcnta\bxUcv \divide\@tempcnta\pxec@c@jsfx
+ \multiply\@tempcnta\pxec@c@jsfy \advance\bxUcv\@tempcnta
+ \advance\bxUcv\pxec@c@jsfa}
+\def\pxec@setinvalid{%
+ % set translated values for source codepoint 0
+ \def\pxec@sfid{0}\bxUcv\pxec@c@jsfa}
+
+%% \pxec@pretranscode\fontSM
+% Here \fontSM is a shadow-map font spec.
+\def\pxec@pretranscode#1{%
+ \ifnum\bxUcv<\p@\else% \p@ = "10000
+ \@tempcnta=\bxUcv \divide\@tempcnta\p@
+ \ifcase\@tempcnta\or \bxUcv\z@ \or
+ \ifx#1\@undefined \bxUcv\z@
+ \else \advance\bxUcv-"20000 \bxMap#1\fi
+ \else\bxUcv\z@\fi
+ \fi}
+
+%% \pxec@loadfontdef{<h-enc>}
+% Tries to load the font definition for current family and encoding
+% <h-enc> on demand from .fd files.
+\def\pxec@loadfontdef#1{%
+ \expandafter\let\expandafter\pxec@tmpa
+ \csname #1+\k@family=Z\endcsname
+ \ifx\pxec@tmpa\@empty \pxec@okfalse % already tried in failure
+ \else\ifx\pxec@tmpa\relax % not yet tried
+ \edef\pxec@nxt{%
+ \noexpand\pxec@loadfontdef@a{#1}%
+ \noexpand\pxec@loadfontdef@a{\csname t@enc#1\endcsname}}%
+ \pxec@oktrue \pxec@nxt
+ \ifpxec@ok\else
+ \expnadafter\let\csname#1+\k@family=Z\endcsname\@empty \fi
+ \else \pxec@oktrue \fi\fi
+ \ifpxec@ok\else \expandafter\pxec@skiptoend \fi}
+\def\pxec@loadfontdef@a#1{%
+ \expandafter\ifx\csname #1+\k@family=Z\endcsname\relax
+ \begingroup \let\typeout\@font@info \escapechar\m@ne
+ \def\f@encoding{#1}\def\f@family{\k@family=Z}%
+ \try@load@fontshape
+ \endgroup\fi
+ \expandafter\ifx\csname #1+\k@family=Z\endcsname\@empty
+ \pxec@err@nojsf{#1}\pxec@okfalse \fi}
+
+%%%% \pxec@skiptoend
+\def\pxec@skiptoend#1\pxec@end{}
+\let\pxec@end\@empty
+
+%--------------------------------------- all done
+\pxec@jsf@restore@codes
+\endinput
+%% EOF
diff --git a/language/japanese/pxbase/upkcat.sty b/language/japanese/pxbase/upkcat.sty
new file mode 100644
index 0000000000..a97cbde36d
--- /dev/null
+++ b/language/japanese/pxbase/upkcat.sty
@@ -0,0 +1,79 @@
+%%
+%% This is file 'upkcat.sty'.
+%%
+%% Copyright (c) 2017 Takayuki YATO (aka. "ZR")
+%% GitHub: https://github.com/zr-tex8r
+%% Twitter: @zr_tex8r
+%%
+%% This package is distributed under the MIT License.
+%%
+
+% Note: This package supports both upLaTeX and plain upTeX.
+
+%% avoid multiple loading
+\csname\if11upkcatstyLoaded\fi\endcsname
+%% code guards
+\edef\x{\catcode32=\the\catcode32%
+\catcode43=\the\catcode43\catcode45=\the\catcode45%
+\catcode46=\the\catcode46\catcode47=\the\catcode47%
+\catcode60=\the\catcode60\catcode63=\the\catcode63%
+\catcode64=\the\catcode64\catcode96=\the\catcode96%
+\endlinechar=\the\endlinechar\relax}
+\catcode32=10\relax\endlinechar=13\relax
+\catcode43=12 \catcode45=12 % <+><->
+\catcode46=12 \catcode47=12 % <.></>
+\catcode60=12 \catcode63=12 % <<><?>
+\catcode64=11 \catcode96=12 % <@><`>
+\edef\pxkq@restore@codes{\x\let\noexpand\pxkq@restore@codes\relax}
+%% check for LaTeX
+\ifx\RequirePackage\@undefined %<*!LaTeX>
+ \long\def\x#1\ProvidesPackage#2[#3]{\immediate\write-1{Package: #2 #3}}
+ \expandafter\x
+\else %<*LaTeX>
+ \RequirePackage{ifuptex}[2008/03/14]\RequireupTeX
+\fi %</LaTeX>
+
+%% package declaration
+\NeedsTeXFormat{pLaTeX2e}
+\ProvidesPackage{upkcat}[2017/06/19 v1.1a safe kcatcode access]
+
+%--------------------------------------- main
+
+%%<*> \getkcatcode{<jachar>}
+\def\getkcatcode#1{\pxkq@getcp{#1}%
+ \edef\thekcatcode{\the\kcatcode\pxkq@cp}}
+%%<*> \setkcatcode{<jachar>}{<value>}
+\def\setkcatcode#1#2{\pxkq@getcp{#1}\kcatcode\pxkq@cp#2}
+\newcount\pxkq@cp \newif\ifpxkq@ok
+\def\pxkq@getcp#1{\pxkq@getcp@a#1\relax\relax}
+\def\pxkq@nxt#1#2#3#4#5{\pxkq@cp#1\loop
+ {\lccode`\?\pxkq@cp \advance\pxkq@cp-#3%
+ \lowercase{\expandafter\xdef\csname pxkq@#4?\endcsname}{#5}}%
+ \advance\pxkq@cp\@ne \ifnum\pxkq@cp<#2\repeat}
+\pxkq@nxt{240}{248}{240}l{\pxkq@cp\the\pxkq@cp\noexpand\pxkq@da}
+\pxkq@nxt{224}{240}{224}l{\pxkq@cp\the\pxkq@cp\noexpand\pxkq@ca}
+\pxkq@nxt{194}{224}{192}l{\pxkq@cp\the\pxkq@cp\noexpand\pxkq@ba}
+\pxkq@nxt{128}{192}{128}t{\advance\pxkq@cp\the\pxkq@cp\noexpand\pxkq@oktrue}
+\def\pxkq@getcp@a#1{\pxkq@cp`#1\relax\pxkq@chkk#1%
+ \ifpxkq@ok \let\pxkq@nxt\pxkq@end \else
+ \expandafter\let\expandafter\pxkq@nxt\csname pxkq@l\string#1\endcsname
+ \ifx\pxkq@nxt\relax \let\pxkq@nxt\pxkq@err \fi
+ \fi \pxkq@nxt}
+\def\pxkq@stp#1#2{\multiply\pxkq@cp64\pxkq@okfalse
+ \csname pxkq@t\string#2\endcsname
+ \ifpxkq@ok \expandafter#1\else \expandafter\pxkq@err \fi}
+\def\pxkq@end#1\relax{}
+\def\pxkq@ba{\pxkq@stp\pxkq@end}\def\pxkq@ca{\pxkq@stp\pxkq@cb}
+\def\pxkq@cb{\pxkq@stp\pxkq@end}\def\pxkq@da{\pxkq@stp\pxkq@db}
+\def\pxkq@db{\pxkq@stp\pxkq@dc}\def\pxkq@dc{\pxkq@stp\pxkq@end}
+\begingroup\lccode`8=`k\lccode`9=`a \lowercase{\endgroup
+ \def\pxkq@chkk#1{\pxkq@okfalse\expandafter\pxkq@chkk@a\meaning#189\@nil}
+ \def\pxkq@chkk@a#189#2\@nil{\ifcat @#1@\pxkq@oktrue\fi}}
+\def\pxkq@err#1\relax{\errhelp{I regard it as U+FFFF}%
+ \errmessage{Corrupted UTF-8 bytes}\pxkq@cp65535\relax}
+%\def\pxkq@end#1\relax{\showthe\pxkq@cp}
+
+%--------------------------------------- all done
+\pxkq@restore@codes
+\endinput
+%% EOF