% -*- coding: utf-8 -*- % % This is a modified version of CJK package for XeTeX. % % created by Wenchang Sun % % 2008/04/23: \addto@hook\UL@hook{\CJKnospaces} % 2008/04/19: Change the CJK range: % \RequirePackage{ifxetex} \RequireXeTeX \def\fileversion{2.0.24} \def\filedate{2008/06/20} \ProvidesPackage{xeCJK}[\filedate\space\fileversion] \XeTeXdefaultencoding "UTF-8" \RequirePackage{fontspec} \newif\ifxeCJK@SlantFont@ \xeCJK@SlantFont@false \newif\ifxeCJK@BoldFont@ \xeCJK@BoldFont@false \newif\ifxeCJK@num \xeCJK@numfalse \newif\ifxeCJK@addspaces \xeCJK@addspacesfalse \newif\ifxeCJK@nospaces \xeCJK@nospacesfalse \DeclareOption{boldfont}{\xeCJK@BoldFont@true} \DeclareOption{BoldFont}{\ExecuteOptions{boldfont}} \DeclareOption{slantfont}{\xeCJK@SlantFont@true} \DeclareOption{SlantFont}{\ExecuteOptions{slantfont}} \DeclareOption{CJKnumber}{\xeCJK@numtrue} \DeclareOption{CJKaddspaces}{\xeCJK@addspacestrue} \DeclareOption{CJKnormalspaces}{\xeCJK@addspacesfalse} \DeclareOption{CJKnospaces}{\xeCJK@nospacestrue} \ProcessOptions\relax \endlinechar \m@ne % set XeTeXcharclass for CJK characters: % % 1: normal char % 2: prepunct % 3: postpunct \XeTeXinterchartokenstate=1\relax \def\xeCJKsetcharclass#1#2#3{ \@tempcnta=#1 \loop \XeTeXcharclass \@tempcnta #3\relax \advance\@tempcnta 1\relax \ifnum\the\@tempcnta<#2 \repeat} % % For CJK characters \xeCJKsetcharclass{"3000}{"9FFF}{1} \def\xeCJK@prePunct#1#2{\xeCJK@setPunct{2}{#1}{#2}} \def\xeCJK@postPunct#1#2{\xeCJK@setPunct{3}{#1}{#2}} \def\xeCJK@setPunct#1#2#3{ \def\xeCJK@class{#1} \@tempcnta "#2\relax \multiply\@tempcnta 256\relax \xeCJK@setPunct@#3,,} \def\xeCJK@setPunct@#1,{ \edef\xeCJK@temp{#1}% \ifx\xeCJK@temp\@empty \else \@tempcntb "#1\relax \advance\@tempcntb\@tempcnta\relax \XeTeXcharclass \@tempcntb=\xeCJK@class\relax \def\xeCJK@temp{\xeCJK@setPunct@} \fi \xeCJK@temp} \xeCJK@prePunct{20}{18,1C} \xeCJK@postPunct{20}{19,1D,14,26} \xeCJK@prePunct{30}{08,0A,0C,0E,10,12,14,16,18,1A,1D,1F,36} \xeCJK@postPunct{30}{01,02,05,06,09,0B,0D,0F,11,15,17,19,1B,1E, 41,43,45,47,49,63,83,85,87,8E, 9B,9C,9D,9E,A1,A3,A5,A7,A9,C3,E3,E5,E7,EE,F5,F6,FB,FC,FD,FE} \xeCJK@prePunct {FE}{59,5B,5D,5F,60,69,6B} \xeCJK@postPunct{FE}{50,51,52,54,55,56,57,5A,5C,5E,6A} \xeCJK@prePunct {FF}{03,04,08,20,3B,5B,E0,E1,E5,E6} \xeCJK@postPunct{FF}{01,05,09,0C,0E,1A,1B,1F,3D,5D, 61,63,64,65,67,68,69,6A,6B,6C,6D,6E,6F,70,9E,9F} \xeCJK@setPunct{4}{0}{28,5B,60,7B} \xeCJK@setPunct{5}{0}{21,22,25,27,29,2C,2E,3A,3B,3F,5D,7D} % prevent from loading CJK.sty % and suppress any warning message like % % You have requested version 'xxxx/xx/xx' of CJK, % but only version 'xxxx/xx/xx' is available. % \expandafter\def\csname ver@CJK.sty\endcsname{2020/01/01} \XeTeXinterchartoks 0 255 {\xeCJK@@cclv} \XeTeXinterchartoks 0 1 {\xeCJK@@i\xeCJK@char} \XeTeXinterchartoks 4 1 {\xeCJK@char} \XeTeXinterchartoks 5 1 {\xeCJK@v@i\xeCJK@char} \XeTeXinterchartoks 255 1 {\xeCJK@cclv@i\xeCJK@char} \XeTeXinterchartoks 0 2 {\xeCJK@prepunctchar} \XeTeXinterchartoks 4 2 {\xeCJK@prepunctchar} \XeTeXinterchartoks 5 2 {\xeCJK@prepunctchar} \XeTeXinterchartoks 255 2 {\xeCJK@prepunctchar} \XeTeXinterchartoks 0 3 {\xeCJK@postpunctchar} \XeTeXinterchartoks 4 3 {\xeCJK@postpunctchar} \XeTeXinterchartoks 5 3 {\xeCJK@postpunctchar} \XeTeXinterchartoks 255 3 {\xeCJK@postpunctchar} \XeTeXinterchartoks 255 0 {\xeCJK@cclv@} \XeTeXinterchartoks 255 4 {\xeCJK@cclv@iv} \def\CJKglue{\hskip \z@ \@plus .08\baselineskip} \def\CJK@nobreakglue{\nobreak\CJKglue\nobreak} \edef\xeCJK@CJKkern{\kern -1sp\kern 1sp} \edef\xeCJK@prepunctkern{\kern -2sp\kern 2sp} \edef\xeCJK@postpunctkern{\kern -3sp\kern 3sp} \edef\xeCJK@zerokern{\kern -4sp\kern 4sp} \newif\if@xeCJK@inmath \@xeCJK@inmathfalse % common macros for \CJKaddspaces and \CJKnormalspaces % % % \def\xeCJK@ignorespaces{ \futurelet\xeCJK@nexttoken\xeCJK@checknext} \def\xeCJK@checknext{ \ifx\xeCJK@nexttoken\@sptoken \expandafter\xeCJK@@checknext \fi} { \def\:{\xeCJK@@checknext} \global\expandafter\def\: {\futurelet\@let@token\xeCJK@@@checknext} } \def\CJK@stop{\CJK@stop} \def\xeCJK@@@checknext{ \expandafter\futurelet \expandafter\xeCJK@tempb \expandafter\xeCJK@gobble\meaning\@let@token\CJK@stop \if t\xeCJK@tempb \else \let\xeCJK@nexttoken\relax \CJKecglue \fi} \long\def\xeCJK@gobble#1\CJK@stop{} % macros for CJKaddspaces % % Make `\$ active to add blank spaces before CJK characters if necessary \catcode`\^^B=3\relax \catcode`\$=13 \def\CJKaddspaces{ \def\xeCJK@@cclv{{\xeCJK@zerokern}} \def\CJKecglue{\hskip 0.25em plus 0.10em minus 0.10em} \let\xeCJK@@i\CJKecglue \let\xeCJK@v@i\CJKecglue \def\xeCJK@cclv@{ \ifodd\lastkern \CJKecglue \fi} \let\xeCJK@cclv@iv\xeCJK@cclv@ \def\xeCJK@cclv@i{ \ifcase\lastkern \hskip 0pt \or %1 \CJKglue \or %2 \xeCJK@ULspecials \or %3 \xeCJK@ULspecials \or %4 \CJKecglue \fi} \catcode`\$=13} \def${ \ifx\protect \@typeset@protect \expandafter\xeCJK@math \else ^^B \fi} \def\xeCJK@math{ \futurelet\xeCJK@temp\xeCJK@@math} \def\xeCJK@@math{ \ifx\xeCJK@temp$ \def\xeCJK@tempb{\xeCJK@@@dmath} \else \def\xeCJK@tempb{\xeCJK@@@math} \fi \xeCJK@tempb} \def\xeCJK@@@dmath#1{^^B^^B} \def\xeCJK@@@math{ \if@xeCJK@inmath \def\xeCJK@tempb{ ^^B \@xeCJK@inmathfalse \futurelet\xeCJK@temp\xeCJK@aftermath} \else \def\xeCJK@tempb{ \@xeCJK@inmathtrue \xeCJK@cclv@ ^^B} \fi \xeCJK@tempb} \def\xeCJK@aftermath{ \ifx\xeCJK@temp\@sptoken \else \xeCJK@zerokern \fi} % % % macros for CJK normal spaces \catcode`\$=3 \def\CJKnormalspaces{ \let\xeCJK@@cclv\relax \let\xeCJK@@i\relax \let\xeCJK@v@i\relax \def\CJKecglue{ } \def\xeCJK@cclv@{ \ifodd\lastkern \xeCJK@@glue \fi} \let\xeCJK@cclv@iv\xeCJK@cclv@ \def\xeCJK@cclv@i{ \ifcase\lastkern \hskip 0pt \or %1 \CJKglue \or %2 \xeCJK@ULspecials \or %3 \xeCJK@ULspecials \fi} \def\xeCJK@@glue{ \ifx\xeCJK@nexttoken\@sptoken { } \fi \let\xeCJK@nexttoken\relax} \catcode`\$=3\relax} % % % CJK no spaces \def\CJKnospaces{ \catcode`\$=3\relax \let\xeCJK@@cclv\relax \let\xeCJK@@i\relax \let\xeCJK@v@i\relax \let\xeCJK@cclv@\relax \def\xeCJK@cclv@i{{% We need extra braces for CJKulem/CJKfntef.sty to work. \ifcase\lastkern \hskip 0pt \or % 1 \CJKglue \or % 2 \xeCJK@ULspecials \or % 3 \xeCJK@ULspecials \fi}} \let\xeCJK@cclv@iv\relax \let\xeCJK@ignorespaces\ignorespaces} \def\xeCJK@setspacemode{ \ifxeCJK@nospaces \CJKnospaces \else \ifxeCJK@addspaces \CJKaddspaces \else \CJKnormalspaces \fi \fi} \CJKnormalspaces \AtBeginDocument{ \xeCJK@setspacemode \ifcsname UL@hook\endcsname \addto@hook\UL@hook{\CJKnospaces \let\xeCJK@unskip\xeCJK@UL@unskip \let\xeCJK@ULspecials\xeCJK@UL@punctgroup} \fi} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 % % Set CJK fonts separately % \def\CJKsymbol#1{{\xeCJK@setfont #1}} \let\CJKpunctsymbol\CJKsymbol \def\xeCJK@setfont{ \ifcsname\xeCJK@family/\f@series/\f@shape/\f@size\endcsname \csname\xeCJK@family/\f@series/\f@shape/\f@size\endcsname \else \csname xeCJK@font@\xeCJK@family\endcsname \get@external@font \expandafter\global\expandafter\font \csname\xeCJK@family/\f@series/\f@shape/\f@size\endcsname=\external@font \fi} % some shorthands for CJK font families; arguments are handled by % \newfontfamily (from fontspec.sty). \def\setCJKmainfont{ \xeCJK@newfontfamily{xeCJK@font@}} \let\setCJKromanfont\setCJKmainfont \def\setCJKsansfont{ \xeCJK@newfontfamily{xeCJK@font@sans}} \def\setCJKmonofont{ \xeCJK@newfontfamily{xeCJK@font@mono}} \def\setCJKfamilyfont#1{ \xeCJK@newfontfamily{xeCJK@font@#1}} % % Redefine \sffamily and \ttfamily to set CJKfamily \DeclareRobustCommand\sffamily {\not@math@alphabet\sffamily\mathsf \fontfamily\sfdefault\CJKfamily{sans}\selectfont} \DeclareRobustCommand\ttfamily {\not@math@alphabet\ttfamily\mathtt \fontfamily\ttdefault\CJKfamily{mono}\selectfont} % \xeCJK@newfontfamily is similar to \newfontfamily % but introduce fake slant/bold fonts for CJK characters. \newcommand*\xeCJK@newfontfamily[1]{ \@ifnextchar[ {\xeCJK@newfontfamily@{#1}} {\xeCJK@newfontfamily@{#1}[]}} \def\xeCJK@newfontfamily@#1[#2]#3{ % % Get user defined options \def\xeCJK@temp{#2} \expandafter \xeCJK@getBoldFont\xeCJK@temp BoldFont={}{}\relax \expandafter \xeCJK@getBoldItalicFont\xeCJK@temp BoldItalicFont={}{}\relax \expandafter \xeCJK@getItalicFont\xeCJK@temp ItalicFont={}{}\relax \expandafter \xeCJK@getBoldItalicFeatures\xeCJK@temp BoldItalicFeatures={}{}\relax \expandafter \xeCJK@getBoldFeatures\xeCJK@temp BoldFeatures={}{}\relax \expandafter \xeCJK@getItalicFeatures\xeCJK@temp ItalicFeatures={}{}\relax \expandafter \xeCJK@getRawFeature\xeCJK@BoldFeatures RawFeature={}{}\relax \edef\xeCJK@Bold@RawFeature{\xeCJK@tempRawFeature} \expandafter \xeCJK@getRawFeature\xeCJK@BoldItalicFeatures RawFeature={}{}\relax \edef\xeCJK@BoldItalic@RawFeature{\xeCJK@tempRawFeature} \expandafter \xeCJK@getRawFeature\xeCJK@ItalicFeatures RawFeature={}{}\relax \edef\xeCJK@Italic@RawFeature{\xeCJK@tempRawFeature} \edef\xeCJK@Features{} \ifxeCJK@BoldFont@ \ifx\xeCJK@BoldFont\@empty \ifx\xeCJK@Bold@RawFeature\@empty \def\xeCJK@Bold@RawFeature{ embolden=\xeCJK@emboldenfactor} \else \edef\xeCJK@Bold@RawFeature{ embolden=\xeCJK@emboldenfactor, \xeCJK@Bold@RawFeature} \fi \ifx\xeCJK@BoldFeatures\@empty \edef\xeCJK@Features{ BoldFeatures={ RawFeature={\xeCJK@Bold@RawFeature}}} \else \edef\xeCJK@Features{ BoldFeatures={ \xeCJK@BoldFeatures, RawFeature={\xeCJK@Bold@RawFeature}}} \fi \ifx\xeCJK@BoldItalic@RawFeature\@empty \def\xeCJK@BoldItalic@RawFeature{ embolden=\xeCJK@emboldenfactor} \else \edef\xeCJK@BoldItalic@RawFeature{ embolden=\xeCJK@emboldenfactor, \xeCJK@BoldItalic@RawFeature} \fi \fi \fi \ifxeCJK@SlantFont@ \ifx\xeCJK@ItalicFont\@empty \ifx\xeCJK@Italic@RawFeature\@empty \edef\xeCJK@Italic@RawFeature{ slant=\xeCJK@slantfactor} \else \edef\xeCJK@Italic@RawFeature{ slant=\xeCJK@slantfactor, \xeCJK@Italic@RawFeature} \fi \ifx\xeCJK@ItalicFeatures\@empty \edef\xeCJK@ItalicFeatures{ RawFeature={\xeCJK@Italic@RawFeature}} \else \edef\xeCJK@ItalicFeatures{ \xeCJK@ItalicFeatures, RawFeature={\xeCJK@Italic@RawFeature}} \fi \ifx\xeCJK@BoldItalic@RawFeature\@empty \edef\xeCJK@BoldItalic@RawFeature{ slant=\xeCJK@slantfactor} \else \edef\xeCJK@BoldItalic@RawFeature{ slant=\xeCJK@slantfactor, \xeCJK@BoldItalic@RawFeature} \fi \ifx\xeCJK@BoldItalicFeatures\@empty \edef\xeCJK@BoldItalicFeatures{ RawFeature={\xeCJK@BoldItalic@RawFeature}} \else \edef\xeCJK@BoldItalicFeatures{ \xeCJK@BoldItalicFeatures, RawFeature={\xeCJK@BoldItalic@RawFeature}} \fi \ifx\xeCJK@Features\@empty \edef\xeCJK@Features{ ItalicFeatures={\xeCJK@ItalicFeatures}, BoldItalicFeatures={\xeCJK@BoldItalicFeatures}} \else \edef\xeCJK@Features{ \xeCJK@Features, ItalicFeatures={\xeCJK@ItalicFeatures}, BoldItalicFeatures={\xeCJK@BoldItalicFeatures}} \fi \fi \fi \edef\xeCJK@temp{#2} \ifx\xeCJK@temp\@empty \else \edef\xeCJK@temp{,#2} \fi \ifx\xeCJK@Features\@empty \else \edef\xeCJK@Features{,\xeCJK@Features} \fi \edef\xeCJK@Features{ [BoldFont={#3}, ItalicFont={#3}, BoldItalicFont={#3}% The first three parameters can be overridden by % user defined parameters in #2 \xeCJK@temp\xeCJK@Features]} \expandafter \newfontfamily@i\csname #1\expandafter\endcsname \xeCJK@Features {#3}} \def\xeCJK@setmacro@getkey#1{ \expandafter\def\csname xeCJK@get#1\endcsname ##1#1=##2##3\relax{ \expandafter\edef\csname xeCJK@#1\endcsname{##2} \edef\xeCJK@temp{##1##3}}} \xeCJK@setmacro@getkey{BoldFont} \xeCJK@setmacro@getkey{ItalicFont} \xeCJK@setmacro@getkey{BoldItalicFont} \xeCJK@setmacro@getkey{ItalicFeatures} \xeCJK@setmacro@getkey{BoldFeatures} \xeCJK@setmacro@getkey{BoldItalicFeatures} \def\xeCJK@getRawFeature#1RawFeature=#2#3\relax{ \edef\xeCJK@tempRawFeature{#2}} \define@key[zf]{preparse}{ItalicFeatures}{ \edef\zf@it@feat{,#1} \edef\zf@family@long{\zf@family@long itfeat:#1}} % redefine \CJKfamily. \def\xeCJK@font@{} \DeclareRobustCommand\CJKfamily[1]{ \ifcsname xeCJK@font@#1\endcsname \def\xeCJK@family{#1} \else \ifcsname xeCJK@#1@warned\endcsname \else \PackageWarning{xeCJK}{ Unknown CJK family `#1' is ignored.^^J Use \string\setCJKfamilyfont \space to define a CJK family.} \expandafter\gdef\csname xeCJK@#1@warned\endcsname{} \fi \fi} \CJKfamily{} \def\xeCJKsetslantfactor#1{\edef\xeCJK@slantfactor{#1}} \def\xeCJKsetemboldenfactor#1{\edef\xeCJK@emboldenfactor{#1}} \xeCJKsetslantfactor{0.17} \xeCJKsetemboldenfactor{4} % % Loading language dependent macros. % \input{xeCJK.chr} \def\CJKlanguage#1{ \ifcsname CJK@#1\endcsname \edef\xeCJK@language{\csname CJK@#1\endcsname} \else \PackageWarning{xeCJK}{ Unknown CJK language `#1' is ignored.^^J Valid languages are `Chinese-Simp', `Chinese-Trad', `Japanese' and 'Korean'.} \relax \fi} \expandafter\def\csname CJK@zh-cn\endcsname{chs} \expandafter\def\csname CJK@Chinese-Simp\endcsname{chs} \expandafter\def\csname CJK@Chinese-Trad\endcsname{cht} \expandafter\def\csname CJK@Japanese\endcsname{ja} \expandafter\def\csname CJK@Korean\endcsname{ko} \CJKlanguage{Chinese-Simp} % macros for using CJKfntef.sty and CJKnumb.sty % \@ifundefined{UL@hskip}{\let\UL@hskip\relax}{} \let\xeCJK@ULspecials\relax \def\xeCJK@UL@punctgroup{ \ifx\hskip\UL@hskip \egroup \UL@stop \UL@start \bgroup \fi} \ifxeCJK@num \edef\CJK@UnicodeEnc{UTF8} \def\CJKaddEncHook#1#2{\expandafter\def\csname xeCJK@enc@#1\endcsname{#2}} \def\Unicode#1#2{\@tempcnta #1\relax \multiply\@tempcnta 256\relax \advance\@tempcnta #2\relax \char\@tempcnta} \RequirePackage{CJKnumb} \csname xeCJK@enc@UTF8\endcsname \def\CJK@tenthousand{δΈ‡} \fi \endlinechar `\^^M \endinput