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