diff options
author | Norbert Preining <norbert@preining.info> | 2022-08-01 03:04:31 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-08-01 03:04:31 +0000 |
commit | c7ecdfe2e07e2e010de5e2a8d94c001c5dc9fc27 (patch) | |
tree | 80bdca45c628ce054648b8b6adc4c97d21bd48bb /macros/jptex/latex/pxbase | |
parent | 0d7064c66024537b237407f8b36413b055cf9a9a (diff) |
CTAN sync 202208010304
Diffstat (limited to 'macros/jptex/latex/pxbase')
-rw-r--r-- | macros/jptex/latex/pxbase/LICENSE | 21 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/README-ja.md | 240 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/README.md | 87 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/pxbabel.pdf | bin | 0 -> 151912 bytes | |||
-rw-r--r-- | macros/jptex/latex/pxbase/pxbabel.sty | 604 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/pxbabel.tex | 468 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/pxbase.def | 7 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/pxbase.sty | 15 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/pxbasenc.def | 516 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/pxbsjc.def | 6 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/pxbsjc1.def | 7 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/pxjsfenc.def | 212 | ||||
-rw-r--r-- | macros/jptex/latex/pxbase/upkcat.sty | 79 |
13 files changed, 2262 insertions, 0 deletions
diff --git a/macros/jptex/latex/pxbase/LICENSE b/macros/jptex/latex/pxbase/LICENSE new file mode 100644 index 0000000000..ead3a3702e --- /dev/null +++ b/macros/jptex/latex/pxbase/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2008-2021 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/macros/jptex/latex/pxbase/README-ja.md b/macros/jptex/latex/pxbase/README-ja.md new file mode 100644 index 0000000000..53bf41f4fc --- /dev/null +++ b/macros/jptex/latex/pxbase/README-ja.md @@ -0,0 +1,240 @@ +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.3 〈2021/05/31〉 + - pxbabel: japanese-otf のコード入力命令(`\UTF` 等)について、 + 非標準の和文エンコーディングの適用時でも動作するようにパッチを + 適用する。 + - pxbabel: (試験的) `(no)patchutfcmds` オプションを追加。 + + * Version 1.2 〈2021/05/22〉 + - pxbabel: CJK 言語のフォント切替を japanese-otf で多ウェイト拡張 + (`deluxe`)を指定した場合に対応させた。 + - pxbabel: (試験的) `(no)forcedeluxemulti` オプションを追加。 + `forcedeluxemulti` を指定すると、さらに多言語拡張(`multi`)を + 行った場合の日本語以外のフォントにも適用される。 + + * 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/macros/jptex/latex/pxbase/README.md b/macros/jptex/latex/pxbase/README.md new file mode 100644 index 0000000000..5c61ff9728 --- /dev/null +++ b/macros/jptex/latex/pxbase/README.md @@ -0,0 +1,87 @@ +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.3 〈2021/05/31〉 + * Version 1.2 〈2021/05/22〉 + * 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/macros/jptex/latex/pxbase/pxbabel.pdf b/macros/jptex/latex/pxbase/pxbabel.pdf Binary files differnew file mode 100644 index 0000000000..602077c000 --- /dev/null +++ b/macros/jptex/latex/pxbase/pxbabel.pdf diff --git a/macros/jptex/latex/pxbase/pxbabel.sty b/macros/jptex/latex/pxbase/pxbabel.sty new file mode 100644 index 0000000000..1ef550c54a --- /dev/null +++ b/macros/jptex/latex/pxbase/pxbabel.sty @@ -0,0 +1,604 @@ +%% +%% This is file 'pxbabel.sty'. +%% +%% Copyright (c) 2008-2021 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}[2021/05/31 v1.3 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} +\newbool{pxbb@patchutfcmds}\pxbb@patchutfcmdstrue +\DeclareOption{patchutfcmds}{\pxbb@patchutfcmdstrue} +\DeclareOption{nopatchutfcmds}{\pxbb@patchutfcmdsfalse} +\newbool{pxbb@forcedeluxemulti} +\DeclareOption{forcedeluxemulti}{\pxbb@forcedeluxemultitrue} +\DeclareOption{noforcedeluxemulti}{\pxbb@forcedeluxemultifalse} +% (<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@otf +%% \ifpxbb@otfmulti +%% \ifpxbb@pxotf +\newbool{pxbb@otf} +\newbool{pxbb@otfmulti} +\newbool{pxbb@pxotf} +\@ifpackageloaded{otf}{\pxbb@otftrue}{} +\@ifpackageloaded{mlutf}{\pxbb@otfmultitrue}{} +\@ifpackageloaded{pxotf}{\pxbb@otfmultitrue\pxbb@pxotftrue}{} + +%% \ifpxbb@otfdeluxe +\newbool{pxbb@otfdeluxe} +\@ifpackagewith{otf}{deluxe}{\pxbb@otfdeluxetrue}{} + +%% \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 + \pxbb@switchfontfalse +\fi\fi\fi +% Check if 'patchutfcmds' is available. +\if \ifpxbb@switchfont + \ifupTeX + \ifpxbb@otf + \ifx\patchcmd\@undefined F\else T\fi + \else F\fi + \else F\fi + \else F\fi F% + \pxbb@patchutfcmdsfalse +\fi +% Check if 'forcedeluxemulti' is available. +\ifpxbb@forcedeluxemulti + \ifupTeX\else + \PackageWarningNoLine\pxbb@pkgname + {Option 'forcedeluxemulti' is invalid, since\MessageBreak + the engine is not upTeX} + \pxbb@forcedeluxemultifalse + \fi + \ifpxbb@otfmulti\else + \PackageWarningNoLine\pxbb@pkgname + {Option 'forcedeluxemulti' is invalid, since\MessageBreak + package 'otf' is not loaded with 'multi'} + \pxbb@forcedeluxemultifalse + \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 + +%% declarations for upTeX + otf deluxe CJK fonts +\ifpxbb@otfdeluxe + +% UniJIS +\pxDeclareBasicCJKShape{J20}{hmc}{l}{!upnmlminl-h} +\pxDeclareBasicCJKShape{J20}{hmc}{m}{!upnmlminr-h} +\pxDeclareBasicCJKShape{J20}{hmc}{bx}{!upnmlminb-h} +\pxDeclareBasicCJKShape{J20}{hgt}{m}{!upnmlgothr-h} +\pxDeclareBasicCJKShape{J20}{hgt}{bx}{!upnmlgothb-h} +\pxDeclareBasicCJKShape{J20}{hgt}{eb}{!upnmlgotheb-h} +\pxDeclareKanjiFamily{J20}{mg} +\pxDeclareBasicCJKShape{J20}{mg}{m}{!upnmlmgothr-h} + +\pxDeclareBasicCJKShape{J30}{hmc}{l}{!upnmlminl-v} +\pxDeclareBasicCJKShape{J30}{hmc}{m}{!upnmlminr-v} +\pxDeclareBasicCJKShape{J30}{hmc}{bx}{!upnmlminb-v} +\pxDeclareBasicCJKShape{J30}{hgt}{m}{!upnmlgothr-v} +\pxDeclareBasicCJKShape{J30}{hgt}{bx}{!upnmlgothb-v} +\pxDeclareBasicCJKShape{J30}{hgt}{eb}{!upnmlgotheb-v} +\pxDeclareKanjiFamily{J30}{mg} +\pxDeclareBasicCJKShape{J30}{mg}{m}{!upnmlmgothr-v} + +% UniJIS2004 +\pxDeclareBasicCJKShape{J24}{hmc}{l}{!upnmlminln-h} +\pxDeclareBasicCJKShape{J24}{hmc}{m}{!upnmlminrn-h} +\pxDeclareBasicCJKShape{J24}{hmc}{bx}{!upnmlminbn-h} +\pxDeclareBasicCJKShape{J24}{hgt}{m}{!upnmlgothrn-h} +\pxDeclareBasicCJKShape{J24}{hgt}{bx}{!upnmlgothbn-h} +\pxDeclareBasicCJKShape{J24}{hgt}{eb}{!upnmlgothebn-h} +\pxDeclareKanjiFamily{J24}{mg} +\pxDeclareBasicCJKShape{J24}{mg}{m}{!upnmlmgothrn-h} + +\pxDeclareBasicCJKShape{J34}{hmc}{l}{!upnmlminln-v} +\pxDeclareBasicCJKShape{J34}{hmc}{m}{!upnmlminrn-v} +\pxDeclareBasicCJKShape{J34}{hmc}{bx}{!upnmlminbn-v} +\pxDeclareBasicCJKShape{J34}{hgt}{m}{!upnmlgothrn-v} +\pxDeclareBasicCJKShape{J34}{hgt}{bx}{!upnmlgothbn-v} +\pxDeclareBasicCJKShape{J34}{hgt}{eb}{!upnmlgothebn-v} +\pxDeclareKanjiFamily{J34}{mg} +\pxDeclareBasicCJKShape{J34}{mg}{m}{!upnmlmgothrn-v} + +\ifpxbb@forcedeluxemulti + +% UniKS +\pxDeclareBasicCJKShape{J21}{hmc}{l}{!utfkml--h} +\pxDeclareBasicCJKShape{J21}{hmc}{m}{!utfkmr--h} +\pxDeclareBasicCJKShape{J21}{hmc}{bx}{!utfkmb--h} +\pxDeclareBasicCJKShape{J21}{hgt}{m}{!utfkgr--h} +\pxDeclareBasicCJKShape{J21}{hgt}{bx}{!utfkgb--h} +\pxDeclareBasicCJKShape{J21}{hgt}{eb}{!utfkge--h} +\pxDeclareKanjiFamily{J21}{mg} +\pxDeclareBasicCJKShape{J21}{mg}{m}{!utfkmgr--h} + +\pxDeclareBasicCJKShape{J31}{hmc}{l}{!utfkml--v} +\pxDeclareBasicCJKShape{J31}{hmc}{m}{!utfkmr--v} +\pxDeclareBasicCJKShape{J31}{hmc}{bx}{!utfkmb--v} +\pxDeclareBasicCJKShape{J31}{hgt}{m}{!utfkgr--v} +\pxDeclareBasicCJKShape{J31}{hgt}{bx}{!utfkgb--v} +\pxDeclareBasicCJKShape{J31}{hgt}{eb}{!utfkge--v} +\pxDeclareKanjiFamily{J31}{mg} +\pxDeclareBasicCJKShape{J31}{mg}{m}{!utfkmgr--v} + +% UniGB +\pxDeclareBasicCJKShape{J22}{hmc}{l}{!utfcml--h} +\pxDeclareBasicCJKShape{J22}{hmc}{m}{!utfcmr--h} +\pxDeclareBasicCJKShape{J22}{hmc}{bx}{!utfcmb--h} +\pxDeclareBasicCJKShape{J22}{hgt}{m}{!utfcgr--h} +\pxDeclareBasicCJKShape{J22}{hgt}{bx}{!utfcgb--h} +\pxDeclareBasicCJKShape{J22}{hgt}{eb}{!utfcge--h} +\pxDeclareKanjiFamily{J22}{mg} +\pxDeclareBasicCJKShape{J22}{mg}{m}{!utfcmgr--h} + +\pxDeclareBasicCJKShape{J32}{hmc}{l}{!utfcml--v} +\pxDeclareBasicCJKShape{J32}{hmc}{m}{!utfcmr--v} +\pxDeclareBasicCJKShape{J32}{hmc}{bx}{!utfcmb--v} +\pxDeclareBasicCJKShape{J32}{hgt}{m}{!utfcgr--v} +\pxDeclareBasicCJKShape{J32}{hgt}{bx}{!utfcgb--v} +\pxDeclareBasicCJKShape{J32}{hgt}{eb}{!utfcge--v} +\pxDeclareKanjiFamily{J32}{mg} +\pxDeclareBasicCJKShape{J32}{mg}{m}{!utfcmgr--v} + +% UniCNS +\pxDeclareBasicCJKShape{J23}{hmc}{l}{!utftml--h} +\pxDeclareBasicCJKShape{J23}{hmc}{m}{!utftmr--h} +\pxDeclareBasicCJKShape{J23}{hmc}{bx}{!utftmb--h} +\pxDeclareBasicCJKShape{J23}{hgt}{m}{!utftgr--h} +\pxDeclareBasicCJKShape{J23}{hgt}{bx}{!utftgb--h} +\pxDeclareBasicCJKShape{J23}{hgt}{eb}{!utftge--h} +\pxDeclareKanjiFamily{J23}{mg} +\pxDeclareBasicCJKShape{J23}{mg}{m}{!utftmgr--h} + +\pxDeclareBasicCJKShape{J33}{hmc}{l}{!utftml--v} +\pxDeclareBasicCJKShape{J33}{hmc}{m}{!utftmr--v} +\pxDeclareBasicCJKShape{J33}{hmc}{bx}{!utftmb--v} +\pxDeclareBasicCJKShape{J33}{hgt}{m}{!utftgr--v} +\pxDeclareBasicCJKShape{J33}{hgt}{bx}{!utftgb--v} +\pxDeclareBasicCJKShape{J33}{hgt}{eb}{!utftge--v} +\pxDeclareKanjiFamily{J33}{mg} +\pxDeclareBasicCJKShape{J33}{mg}{m}{!utftmgr--v} + +\fi % pxbb@forcedeluxemulti + +\fi % pxbb@otfdeluxe + +%--------------------------------------- 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> + +%--------------------------------------- Patch to '\UTF' etc. +\ifpxbb@patchutfcmds + +%% \pxbb@set@encoding +\edef\pxbb@set@encoding{% + \noexpand\iftdir \noexpand\kanjiencoding{\cy@encoding}% + \noexpand\else \noexpand\kanjiencoding{\ct@encoding}% + \noexpand\fi +} + +%% apply the patch +\@for\pxbb@tmpa:={% + UTF,UTFK,UTFC,UTFT,UTFM,CID,CIDK,CIDC,CIDT% +}\do{% + \ifcsdef{\pxbb@tmpa\space}{%then + \expandafter\patchcmd\csname \pxbb@tmpa\space\endcsname{%from + \begingroup\edef\reserved@a + }{%to + \begingroup\pxbb@set@encoding\edef\reserved@a + }{}{%failure + \PackageWarningNoLine\pxbb@pkgname + {Cannot patch to '\@backslashchar\pxbb@tmpa_'}% + }% + }{}% +} + +\fi +%--------------------------------------- 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/macros/jptex/latex/pxbase/pxbabel.tex b/macros/jptex/latex/pxbase/pxbabel.tex new file mode 100644 index 0000000000..3482bc161a --- /dev/null +++ b/macros/jptex/latex/pxbase/pxbabel.tex @@ -0,0 +1,468 @@ +% 文字コードは UTF-8 +% uplatex で組版する +\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle} +\renewcommand{\headfont}{\gtfamily\romanseries{sbc}\sffamily} +\usepackage[T1]{fontenc} +\usepackage{lmodern,textcomp} +\usepackage{color} +\definecolor{myblue}{rgb}{0,0,0.75} +\definecolor{mygreen}{rgb}{0,0.45,0} +\usepackage[colorlinks,hyperfootnotes=false]{hyperref} +\usepackage{pxjahyper} +\hypersetup{linkcolor=myblue,urlcolor=mygreen, + pdftitle={pxbabelパッケージ}, + pdfauthor={八登崇之}} +\usepackage{bxtexlogo} +\bxtexlogoimport{*} +\usepackage{shortvrb} +\MakeShortVerb{\|} +\newcommand{\PkgVersion}{1.3} +\newcommand{\PkgDate}{2021/05/31} +\newcommand{\Pkg}[1]{\textsf{#1}} +\newcommand{\Meta}[1]{$\langle$\mbox{}#1\mbox{}$\rangle$} +\newcommand{\Note}{\par\noindent ※} +\newcommand{\Means}{:\quad\inhibitglue} +\newcommand{\XS}{\hspace{\xkanjiskip}} +%----------------------------------------------------------- +\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{概要} +\label{sec:Overview} + +{(u)\pLaTeX}における日本語・簡体字中国語・繁体字中国語・ +韓国語の間の +「和文(CJK)フォント」の切り替えをBabelのインタフェースを +用いて行えるようにする。 + +\paragraph{前提環境} + +\begin{itemize} +\item {\TeX}フォーマット: {\pLaTeX}/{\upLaTeX} + (拡張エンジンを含む) +\end{itemize} + +\paragraph{依存パッケージ} + +\begin{itemize} +\item \Pkg{babel}パッケージ +\item \Pkg{japanese-otf}パッケージ({\pLaTeX}の場合) +\end{itemize} + +%------------------- +\subsection{用語集} +\label{ssec:terminology} + +\begin{itemize} +\item CJK言語\Means +「日本語」「簡体字中国語」「繁体字中国語」「韓国語」の総称。% +\footnote{普通の意味で「言語」の区別といえるかは問題にしない。} +\item CJK言語識別子\Means +本パッケージにおいてCJK言語を指し示す、以下の文字列。 + \begin{itemize} + \item |japanese|\Means 日本語 + \item |korean|\Means 韓国語 + \item |schinese|\Means 簡体字中国語 + \item |tchinese|\Means 繁体字中国語 + \end{itemize} +\item 言語名\Means +Babelで指定する(|\foreignlanguage| 等の引数にする) +言語を表す文字列。 +\Note 既定ではCJK言語に対する「言語名」は「CJK言語識別子」と +同じ(例えば日本語の「言語名」は|japanese|)であるが、 +そうでない設定も可能である。 +\item 仮想言語\Means +Babelの言語オプション定義ファイル(|*.ldf|)の読込を伴わない +言語のこと。 +本パッケージではCJK言語を仮想言語として扱えるため、 +各言語の定義ファイルを用意する必要がない。 +\Note CJK言語を仮想言語にせず定義ファイルを利用することも可能。 +\end{itemize} + +%=========================================================== +\section{読込} +\label{sec:Loading} + +0.9版より\Pkg{babel}パッケージと一緒に読み込む方式 +(一括読込モード)をサポートした。 +従来通り、別個に読み込む方式(分離読込モード)も可能である。 +どちらであるかは、\Pkg{pxbabel}読込時に\Pkg{babel}が読込済か +どうかで判別する。 + +\begin{quote} +〈一括読込モードの場合〉\\ +|\usepackage[|\Meta{オプション}|]{pxbabel}| +\par\bigskip +〈分離読込モードの場合〉\\ +|\usepackage[|\Meta{Babelのオプション}|]{babel}|\\ +|\usepackage[|\Meta{オプション}|]{pxbabel}| +\end{quote} + +%------------------- +\subsection{パッケージオプション} +\label{ssec:options} + +\begin{itemize} +\item \Meta{CJK言語識別子}|=|\Meta{言語名}\Means +CJK言語を仮想言語として扱い、実際に使用するBabelの言語名を指定する。 +\Note 詳細は\ref{sec:Commands}節を参照。 +\Note 言語名の既定値はCJK言語識別子と同一名。 + +\item \Meta{CJK言語識別子}\Means +「\Meta{CJK言語識別子}|=|\Meta{CJK言語識別子}」と同じ。 +\Note 既定でこれと同等の設定が適用されるので通常は指定する必要がないが、 +一括読込モードで「最後の言語(基底言語になる)」を +指定するのに有用である。 + +\item \Meta{CJK言語識別子}|=+|\Meta{言語名}\Means +CJK言語を非仮想言語として扱い、実際に使用するBabelの言語名を指定する。 +\Note 「\Meta{言語名}|.ldf|」という名前の +言語オプション定義ファイルが読み込まれる。 + +\item |+|\Meta{CJK言語識別子}\Means +「\Meta{CJK言語識別子}|=+|\Meta{CJK言語識別子}」と同じ。 + +\item Babelの有効な言語名\Means +その言語の定義ファイルを読み込む。 +\Note 分離読込モードでの非CJK言語の読込については +確実に動作させるのが困難であるため、 +1.3版において\textbf{非推奨}の扱いとする。 +すなわち、分離読込モードではCJK言語のみが指定可能となり、 +CJK言語以外は\texttt{babel}のオプションとして指定する必要がある。 + +\item |main=|\Meta{言語名}\Means +文書開始時に有効となる基底言語を、言語名 +\footnote{CJK言語について言語名とCJK言語識別子が異なる設定を +用いる場合、\texttt{main}に指定するのは言語名の方であることに注意。}% +で指定する。 +\Note |main|の指定がない場合、 +分離読込モードでは\Pkg{babel}で最後に読まれた言語が基底言語になる。 +一括読込モードでは\Pkg{pxbabel}で最後に読まれた言語が基底言語になる。 + +\item |caption=|\Meta{値}\Means +キャプション言語(キャプションや日付の文字列で使われる言語)の +固定に関する設定を行う。 +有効な値は次の通り: + \begin{itemize} + \item 有効な言語名\Means その言語に固定する。 + \item |main|\Means 文書開始時の基底言語に固定する。 + \item |default|\Means キャプション文字列を文書クラスで + 指定されたものから変更しない。 + \item |switch|\Means キャプション言語の固定を行わない。 + (Babelの既定動作。) + \item |auto|(既定値)\Means + 文書開始時の基底言語が + 仮想言語の場合は |default|、 + それ以外は |switch|。 + \end{itemize} +\Note 詳細は\ref{sec:Caption-Lang}節を参照。 + +\item |noswitchcaption|\Means +|caption=default|と同じ。 + +\item |switchcaption|\Means +|caption=switch|と同じ。 +\Note (|no|)|switchcaption|は0.9版より前との互換性のため存在する。 + +\item |switchfont|(既定値)\Means +CJK言語でフォントを切り替える機能を有効にする。 + +\item |noswitchfont|\Means +|switchfont|の否定。 + +\item |stdjaencoding|\Means +入力言語が日本語の場合には{\upLaTeX}標準の「和文エンコーディング」を +適用する。 +\Note 詳細は\ref{ssec:switch-jafont}節を参照。 +{\upLaTeX}でのみ意味をもつ。 + +\item |nostdjaencoding|(既定)\Means +|nostdjaencoding|の否定。 +\Note \Pkg{japanese-otf}パッケージが読込済の場合には +既定が|stdjaencoding|に変更される。 + +\item |forcedeluxemulti|\Means +{\upLaTeX}で\Pkg{japanese-otf}パッケージを +|deluxe|オプションおよび|multi|オプション付で使用している +(|\UTFK|/|\UTFC|/|\UTFT|が多ウェイトで使える)ときに、 +日本語以外のテキストについても多ウェイトの設定を有効にする。 +\Note 本来は\XS|\UTFK|/|\UTFC|/|\UTFT|入力用である{\TeX}フォント +(和文TFM)を使うため、約物の周りの空き調整が無効になる。 + +\item |noforcedeluxemulti|(既定値)\Means +|forcedeluxemulti|の否定。 +日本語以外のテキストについて多ウェイト設定を無効にする。 +\Note 約物の周りの空き調整が正常に行われる。 +\Note (|no|)|forcedeluxemulti|は試験的な機能であり、 +将来的に廃止される可能性がある。 + +\item |patchutfcmds|(既定値)\Means +\Pkg{japanese-otf}パッケージのコード入力命令(\XS|\UTF|命令等) +について、「非標準の和文エンコーディングが適用される場合にも +正常動作する」ようにパッチを適用する。 + +\item |nopatchutfcmds|\Means +|patchutfcmds|の否定。 +\Note (|no|)|patchutfcmds|は試験的な機能であり、 +将来的に廃止される可能性がある。 +\end{itemize} + +%=========================================================== +\section{ユーザ命令} +\label{sec:Commands} + +本パッケージの主要機能であるCJKフォント切替に +ついてはBabelの機能を用いて行うことになるため、 +パッケージ特有の命令は存在しない。 + +例えば、次のようなパッケージ読込(一括読込モード)の場合 +\footnote{使用エンジンが{\upLaTeX}であるか、または + {\pLaTeX}で\Pkg{bxutf8}入力エンコーディングを用いているとする。}% +: +\begin{quote}\begin{verbatim} +\usepackage[korean,japanese]{pxbabel} +\end{verbatim}\end{quote} +本文中で +\begin{quote} +|日本語文書中に\foreignlanguage{korean}{|% +\textgt{\Kor{한글}}|}がある。| +\end{quote} +と入力すれば次の出力が得られる。 +\begin{quote} +日本語文書中に\Kor{한글}がある。 +\end{quote} + +本パッケージが提供する命令には次のものがある。 + +\begin{itemize} +\item |\cjklanguagename{|\Meta{CJK言語識別子}|}|\Means +そのCJK言語に対するBabel言語名。 +\Note 完全展開可能である。 +\Note 例えば、パッケージオプションで|schinese=chinesesimp|と指定した場合、 +|\cjklanguagename|\hspace{0pt}|{schinese}|\XS は +「|chinesesimp|」に展開される。 + +\item |\UTFJ{|\Meta{Unicode符号値}|}|\Means +常に「本来の\XS|\UTF|命令」の動作をする。 +\Note 本パッケージで|switchfont|が有効で、かつ\Pkg{japanese-otf}が +|multi|付で読み込まれている場合に定義される。% +\footnote{ただし、|\UTFJ|命令は文書本体開始時に定義されることに注意。 +プリアンブルでは|\UTF|命令の切替はまだ発生しないので、 +日本語用には|\UTF|命令を使えばよい。}% +この場合、入力言語が日本語以外のCJK言語のときに\XS|\UTF|命令の動作が +他言語用(|\UTFK|等)に切り替わるので、本来の日本語用の\XS|\UTF|命令が +必要なときには\XS|\UTFJ|を利用すればよい。 +\Note 詳細は\ref{ssec:switch-utffont}節を参照。 + +\end{itemize} + +%=========================================================== +\section{キャプション言語の固定に関する設定} +\label{sec:Caption-Lang} + +Babelにおける言語切替の指定は大別すると、入力言語のみを切り替えるもの +(|\foreignlanguage|命令、|otherlanguage*|\XS 環境) +と基底言語を切り替えるもの +(|\selectlanguage|命令、|otherlanguage|環境) +があり、既定動作ではキャプション言語は基底言語に常に追随する +(|caption=switch|指定時と同じ)。 + +ところが、実際の言語定義を伴わない仮想言語においては、 +キャプション文字列の設定は行われない。 +このため、基底言語を仮想言語に切り替えた場合には +キャプション言語が正しくない事態が生じえる。% +\footnote{ただし「文書開始時以外に(入力言語でなく) + 基底言語を仮想言語に切り替える」 + ことをしなければ問題は起こらない。 + 特に、「日本語の文書クラスを用いて、かつBabelにおいて + 仮想言語扱いの日本語を文書全体で基底言語にする」 + 場合は、キャプションは文書クラスで定めたものに固定される。 + 多くの場合これは好都合な動作だろう。} +これによる混乱を避けるために、|caption|オプションによる +キャプション言語の固定が有用かもしれない。 + +特に、「Babelによるキャプション文字列の変更を抑止して文書クラスで +定めた文字列を常に有効にしたい」という場合は、 +|caption=default|を指定すればよい。 +文書開始時の基底言語が仮想言語である場合はこちらの使い方が +多いと考えられるので、この場合に限って|caption|の既定値を +(Babelの既定動作に相当する|switch|ではなく) +|default|としている。 + +\Note 0.9版より前は常に|default|を既定値としていが、 +既定言語が仮想言語でない場合は|default|にする必然性が少ないため、 +Babelの既定動作に合わせる目的で仕様が変更された。 +ゆえに、|caption|(および(|no|)|switchcaption|)オプション +指定がなくかつ基底言語が仮想言語でない場合の|caption|設定は、 +0.9版より前は|default|、以降は|switch|と異なることになる。 + +\Note \Pkg{bxbase}パッケージの\XS|\fixcaptiopnlanguage|命令による +キャプション言語固定の設定は、常に本パッケージでの設定より優先される。 +この仕様は|main|オプションのものと一貫していないが、 +互換性のためそのままにしている。 + +%=========================================================== +\section{CJKフォント切替機能の原理} +\label{sec:Switch-Font} + +次の2つの仕組を用意している。 + +\subsection{標準和文フォントの切替({\upLaTeX}のみ)} +\label{ssec:switch-jafont} + +{\upTeX}は標準で、CJK言語の{\TeX}フォント(和文TFM)を用意している。 +本パッケージはBabelにおいてCJK言語の切替処理(|\extras...|\XS マクロ) +の中に、フォントの切替を追加し、 +言語の選択に応じて適切なフォントが選ばれるようにする。 +%言語に対するBabelの言語オプションの名前は変わりうるので、 +%その名前をパッケージ読込時に指定できるようにした。 +%また、あるCJK言語の為のオプションが読み込まれていない時は、 +%フォントの切替のみをする簡易の言語オプション(仮想言語設定) +%をその場で生成する。 + +\Note 標準和文フォントの切替は、内部的には「和文エンコーディング」 +を切り替えることで実現している。 +ところが、標準以外の「和文エンコーディング」が指定されている状態では、 +他パッケージの(和文フォントに関する)機能に不具合が生じる可能性がある。 +これは日本語以外のCJK言語を使う場合にはある程度は仕方がないであろう。 +ただし、現状の既定では入力言語が日本語である場合にも非標準の +「和文エンコーディング」が適用される。% +\footnote{標準の横組/縦組の「和文エンコーディング」は|JY2|/|JT2|で + あるが、フォント切替を有効にして入力言語を日本語にした場合には + |J20|/|J30|(|jis2004|有効時には|J24|/|J34|)が適用される。}% +|stdjaencoding| オプションを指定すると +「入力言語が日本語の場合には標準の和文エンコーディングを使う」 +動作に切り替わるので、不具合が回避できる可能性がある。% +\footnote{最近の{\upLaTeX}の標準設定では、実は非標準の +「和文エンコーディング」を使うメリットがほぼなくなっている。 +従って「常に|stdjaencoding|を指定する」という方針でも構わない。 +現在、|stdjaencoding|の既定値の変更を検討している。} + +\subsection{{\textbackslash UTF}命令に対する調整} +\label{ssec:switch-utffont} + +\Pkg{japanese-otf}パッケージの|multi|オプションは +韓国語・中国語を扱うためのもので、 +これを有効にすると\XS|\UTFK|/|\UTFC|/|\UTFT|の各命令 +\footnote{\XS|\UTF|と同様に、これらの命令の引数にはUnicode符号値を + 16進表記で指定する。}% +で韓国語/簡体字中国語/繁体字中国語のフォントを用いて +文字を出力することができる。 + +本パッケージを読み込むと、 +Babelの入力言語がCJK言語に切り替わった場合に言語に応じて\XS +|\UTF|の動作を「本来の\XS|\UTF|」\</|\UTFK|/|\UTFC|/|\UTFT| +の何れかに切り替えるようになる。 +また、「本来の\XS|\UTF|」の動作をする命令\XS|\UTFJ|が提供されるので、 +入力言語が日本語以外のときに日本語の文字を入力したい +場合には\XS|\UTFJ|を利用すればよい。 + +この機能は単独ではあまり有用とはいえないが、 +{\pLaTeX}において\Pkg{bxutf8}入力エンコーディング +と併用してCJK言語のUTF-8直接入力を行う時に有用となる。 +すなわち、直接入力されたCJK文字は\XS|\UTF|に帰着するので、 +結果的に{\upLaTeX}の時と同じように、現在の入力言語用の +フォントで出力されることになる。 + +\Note ただし、この方策は、 +「({\pLaTeX}では) +JIS X~0208にある文字はそもそも\XS|\UTF|に変換されないので +常に日本語フォントで出力されてしまう」 +という欠点をもつ。 +これを解決するには\Pkg{pxfltsrc}パッケージ等の機能を用いて +文書にテキスト変換フィルタを適用するといった追加の処理が必要になる。 + +%=========================================================== +\section{Babel一括読込モード} +\label{sec:Lumped-Loading} + +0.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|オプションが必要となる。 + +そこで、0.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}の非BMP文字対応の日本語フォントが使いたい」 +だけの場合 +\footnote{現在の{\upLaTeX}では既定の和文フォントが既に非BMP文字に +対応しているため、この使い方は不要である。}% +は以下のようになる。 + +\begin{quote}\begin{verbatim} +\usepackage[japanese]{pxbabel} +\end{verbatim}\end{quote} +\Note |japanese|のみ指定して、当然これを基底とする。 + +実際には、4つのCJK言語のオプションは「常に」出現するので、 +上の2つの指定は等価であるが、 +一括読込の場合は\Pkg{babel}の習慣に合わせて記述するのが +解りやすいと思われる。 + +%------------------- +\subsection{複雑な例} +\label{ssec:complex-loading} + +少し複雑な例を挙げておく。 +ドイツ語(|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 非仮想言語の|japanese|が基底なので、 +|caption|は|switch|が既定値になる。 +なお、非CJK言語(|ngerman|)には決して\XS|+|\XS を付けないことに注意。 + +%=========================================================== +\end{document} diff --git a/macros/jptex/latex/pxbase/pxbase.def b/macros/jptex/latex/pxbase/pxbase.def new file mode 100644 index 0000000000..214e278e54 --- /dev/null +++ b/macros/jptex/latex/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/macros/jptex/latex/pxbase/pxbase.sty b/macros/jptex/latex/pxbase/pxbase.sty new file mode 100644 index 0000000000..0078547e4f --- /dev/null +++ b/macros/jptex/latex/pxbase/pxbase.sty @@ -0,0 +1,15 @@ +%% +%% This is file 'pxbase.sty'. +%% +%% Copyright (c) 2008-2021 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}[2021/05/31 v1.3 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/macros/jptex/latex/pxbase/pxbasenc.def b/macros/jptex/latex/pxbase/pxbasenc.def new file mode 100644 index 0000000000..df54e082bf --- /dev/null +++ b/macros/jptex/latex/pxbase/pxbasenc.def @@ -0,0 +1,516 @@ +%% +%% This is file 'pxbasenc.def'. +%% + +%% file declaration +\NeedsTeXFormat{pLaTeX2e} +\ProvidesFile{pxbasenc.def}[2021/05/31 v1.3 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/macros/jptex/latex/pxbase/pxbsjc.def b/macros/jptex/latex/pxbase/pxbsjc.def new file mode 100644 index 0000000000..d8b27ec658 --- /dev/null +++ b/macros/jptex/latex/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/macros/jptex/latex/pxbase/pxbsjc1.def b/macros/jptex/latex/pxbase/pxbsjc1.def new file mode 100644 index 0000000000..2d04593828 --- /dev/null +++ b/macros/jptex/latex/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/macros/jptex/latex/pxbase/pxjsfenc.def b/macros/jptex/latex/pxbase/pxjsfenc.def new file mode 100644 index 0000000000..52210eabec --- /dev/null +++ b/macros/jptex/latex/pxbase/pxjsfenc.def @@ -0,0 +1,212 @@ +%% +%% This is file 'pxjsfenc.def'. +%% + +%% file declaration +\NeedsTeXFormat{pLaTeX2e} +\ProvidesFile{pxjsfenc.def}[2021/05/31 v1.3 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/macros/jptex/latex/pxbase/upkcat.sty b/macros/jptex/latex/pxbase/upkcat.sty new file mode 100644 index 0000000000..721bddd2e2 --- /dev/null +++ b/macros/jptex/latex/pxbase/upkcat.sty @@ -0,0 +1,79 @@ +%% +%% This is file 'upkcat.sty'. +%% +%% Copyright (c) 2008-2021 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}[2021/05/31 v1.3 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 |