diff options
author | Karl Berry <karl@freefriends.org> | 2012-05-07 22:50:52 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2012-05-07 22:50:52 +0000 |
commit | d543752477df00db9845d783c27fd913a48c6f73 (patch) | |
tree | f1d8f6958eba4bf4d22dda07a9fbc85298b4d7be /Master/texmf-dist/tex/xelatex | |
parent | d62dfb02a03e1cd263bfbd6f33fda7006178193d (diff) |
xecjk (7may12)
git-svn-id: svn://tug.org/texlive/trunk@26246 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/xelatex')
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty | 3252 |
1 files changed, 2115 insertions, 1137 deletions
diff --git a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty index eeed2ec6cf4..6ee01e7a082 100644 --- a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty +++ b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty @@ -4,1148 +4,2126 @@ %% %% The original source files were: %% -%% xeCJK.dtx (with options: `xeCJK') +%% xeCJK.dtx (with options: `package') %% -%% Version 2.4.5 (31-Jan-2012) +%% Version 3.0.4 (06-May-2012) +%% ----------------------------------------------------------------- +%% Author: Wenchang Sun <sunwch@hotmail.com> +%% Maintainer: Leo Liu <leoliu.pku@gmail.com> +%% Qing Lee <sobenlee@gmail.com> +%% Copyright (C) 2007--2012 Wenchang Sun %% -%% Copyright (C) Wenchang Sun <sunwch@hotmail.com> +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. %% -%% This file may be distributed and/or modified under the -%% conditions of the LaTeX Project Public License, either version 1.3 -%% of this license or (at your option) any later version. -%% The latest version of this license is in -%% http://www.latex-project.org/lppl.txt -%% and version 1.3 or later is part of all distributions of LaTeX -%% version 2005/12/01 or later. +%% This work has the LPPL maintenance status "maintained". +%% The Current Maintainer of this work are Leo Liu and Qing Lee. +%% ----------------------------------------------------------------- %% -\def\fileversion{2.4.5} -\def\filedate{2012/01/31} -\ProvidesPackage{xeCJK}[\filedate\space\fileversion\space package for typesetting CJK scripts with XeLaTeX] -\RequirePackage{ifxetex} -\RequireXeTeX -\expandafter\def\csname ver@CJK.sty\endcsname{2020/01/01} - -\newif\ifxeCJK@SlantFont@ - -\newif\ifxeCJK@BoldFont@ - -\newif\ifxeCJK@fallback@ - -\newif\ifxeCJK@num - -\newif\ifxeCJK@checksingle - -\newif\ifxeCJK@indentfirst -\xeCJK@indentfirsttrue - -\newif\ifxeCJK@space@ -\xeCJK@space@false - -\DeclareOption{boldfont}{\xeCJK@BoldFont@true} -\DeclareOption{BoldFont}{\ExecuteOptions{boldfont}} -\DeclareOption{slantfont}{\xeCJK@SlantFont@true} -\DeclareOption{SlantFont}{\ExecuteOptions{slantfont}} -\DeclareOption{fallback}{\xeCJK@fallback@true} -\DeclareOption{CJKnumber}{\xeCJK@numtrue} -\DeclareOption{normalindentfirst}{\xeCJK@indentfirstfalse} -\DeclareOption{CJKchecksingle}{\AtEndOfPackage{\let\xeCJK@i@i\xeCJK@checksingle}} -\DeclareOption{space}{\xeCJK@space@true} -\DeclareOption{nospace}{\xeCJK@space@false} - -\DeclareOption{CJKnormalspaces}{\PackageWarning{xeCJK}{% - obsolete option 'CJKnormalspaces'. It may be removed in the future.}} -\DeclareOption{CJKaddspaces}{\PackageWarning{xeCJK}{% - obsolete option 'CJKaddspaces'. It may be removed in the future.}} -\DeclareOption{CJKtextspaces}{\PackageWarning{xeCJK}{% - obsolete option 'CJKtextspaces'. It may be removed in the future.}} -\DeclareOption{CJKmathspaces}{\PackageWarning{xeCJK}{% - obsolete option 'CJKmathspaces'. It may be removed in the future.}} -\DeclareOption{CJKsetspaces}{\PackageWarning{xeCJK}{% - obsolete option 'CJKsetspaces'. It may be removed in the future.}} -\DeclareOption{CJKnospaces}{\PackageWarning{xeCJK}{% - obsolete option 'CJKnospaces'. It may be removed in the future.}} - -\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{fontspec}} -\ProcessOptions\relax - -\RequirePackage{xkeyval} -\RequirePackage{expl3} -\RequirePackage{fontspec} - -\ifxeCJK@indentfirst - \let\@afterindentfalse\relax -\fi -\endlinechar \m@ne -\def\xeCJK@patch#1#2#3{ - \edef#1{ - \unexpanded{#2} - \unexpanded\expandafter{#1} - \unexpanded{#3}}} -\def\makexeCJKactive{ - \XeTeXinterchartokenstate=1\relax} - -\def\makexeCJKinactive{ - \XeTeXinterchartokenstate=0\relax} - -\makexeCJKactive -\def\xeCJKsetcharclass#1#2#3{ - \@tempcnta=#1 - \loop - \XeTeXcharclass \@tempcnta #3\relax - \advance\@tempcnta 1\relax - \unless\ifnum\the\@tempcnta>#2 \repeat - \xeCJK@setpunctcharclass} - -\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} - -\def\xeCJK@setpunctcharclass{ - \xeCJK@prePunct{20}{18,1C} - \xeCJK@postPunct{20}{19,1D,14,26} - \xeCJK@postPunct{25}{00} - \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{1}{0}{B7} - \xeCJK@setPunct{4}{0}{28,2D,5B,60,7B} - \xeCJK@setPunct{5}{0}{21,22,25,27,29,2C,2E,3A,3B,3F,5D,7D}} - -\xeCJKsetcharclass{"1100}{"11FF}{1} -\xeCJKsetcharclass{"2E80}{"2EFF}{1} -\xeCJKsetcharclass{"2F00}{"2FDF}{1} -\xeCJKsetcharclass{"2FF0}{"2FFF}{1} -\xeCJKsetcharclass{"3000}{"303F}{1} -\xeCJKsetcharclass{"3040}{"309F}{1} -\xeCJKsetcharclass{"30A0}{"30FF}{1} -\xeCJKsetcharclass{"3100}{"312F}{1} -\xeCJKsetcharclass{"3130}{"318F}{1} -\xeCJKsetcharclass{"3190}{"319F}{1} -\xeCJKsetcharclass{"31A0}{"31BF}{1} -\xeCJKsetcharclass{"31C0}{"31EF}{1} -\xeCJKsetcharclass{"31F0}{"31FF}{1} -\xeCJKsetcharclass{"3200}{"32FF}{1} -\xeCJKsetcharclass{"3300}{"33FF}{1} -\xeCJKsetcharclass{"3400}{"4DBF}{1} -\xeCJKsetcharclass{"4E00}{"9FFF}{1} -\xeCJKsetcharclass{"A000}{"A4CF}{1} -\xeCJKsetcharclass{"AC00}{"D7AF}{1} -\xeCJKsetcharclass{"F900}{"FAFF}{1} -\xeCJKsetcharclass{"FE30}{"FE4F}{1} -\xeCJKsetcharclass{"FF00}{"FFEF}{1} -\xeCJKsetcharclass{"20000}{"2A6DF}{1} -\xeCJKsetcharclass{"2A700}{"2B73F}{1} -\xeCJKsetcharclass{"2B740}{"2B81F}{1} -\xeCJKsetcharclass{"2F800}{"2FA1F}{1} - -\def\CJK@stop{\CJK@stop} - -\def\normalspacedchars#1{ - \xeCJK@setnormalspacedchar#1\CJK@stop} - -\def\xeCJK@setnormalspacedchar#1{ - \ifx#1\CJK@stop - \else - \XeTeXcharclass`#1=6 - \expandafter\xeCJK@setnormalspacedchar - \fi} - +\RequirePackage{xparse} +\RequirePackage{l3keys2e} +\ProvidesExplPackage {xeCJK} {2012/05/06} {3.0.4} + {package for typesetting CJK scripts with XeLaTeX} +\cs_new_nopar:Npn \xeCJK_msg_new:nn { \msg_new:nnn { xeCJK } } +\cs_new_nopar:Npn \xeCJK_error:n { \msg_error:nn { xeCJK } } +\cs_new_nopar:Npn \xeCJK_error:nx { \msg_error:nnx { xeCJK } } +\cs_new_nopar:Npn \xeCJK_warning:n { \msg_warning:nn { xeCJK } } +\cs_new_nopar:Npn \xeCJK_warning:nx { \msg_warning:nnx { xeCJK } } +\cs_new_nopar:Npn \xeCJK_info:nx { \msg_info:nnx { xeCJK } } +\cs_new_nopar:Npn \xeCJK_info:nxx { \msg_info:nnxx { xeCJK } } +\msg_new:nnn {xeCJK} { Require-XeTeX } + { + The~xeCJK~package~requires~XeTeX~to~function.\\\\ + You~must~change~your~typesetting~engine~to~"xelatex" \\ + instead~of~plain~"latex"~or~"pdflatex"~or~"lualatex". + } +\xetex_if_engine:F { \msg_critical:nn { xeCJK } { Require-XeTeX } } +\xeCJK_msg_new:nn { XeTeX-too-old } + { + \token_to_str:N \XeTeXglyphbounds\c_space_tl is~not~defined.\\\\ + You~have~to~update~XeTeX~to~the~version~0.9995.0~or~later. + } +\cs_if_free:NT \XeTeXglyphbounds + { + \xeCJK_error:n { XeTeX-too-old } + \AtBeginDocument { \punctstyle { plain } } + } +\char_set_catcode_ignore:n { "FEFF } +\keys_define:nn { xeCJK / options } + { + xeCJKactive .choice:, + xeCJKactive / true .code:n = { \makexeCJKactive } , + xeCJKactive / false .code:n = { \makexeCJKinactive } , + xeCJKactive .default:n = { true }, + } +\NewDocumentCommand \makexeCJKactive { } { \XeTeXinterchartokenstate = \c_one } +\NewDocumentCommand \makexeCJKinactive { } { \XeTeXinterchartokenstate = \c_zero } +\int_const:Nn \xeCJK_Default_class { 0 } +\int_const:Nn \xeCJK_CJK_class { 1 } +\int_const:Nn \xeCJK_FullLeft_class { 2 } +\int_const:Nn \xeCJK_FullRight_class { 3 } +\int_const:Nn \xeCJK_Boundary_class { 255 } +\cs_new_nopar:Nn \xeCJK_new_class:n + { + \exp_after:wN \newXeTeXintercharclass \cs:w xeCJK_#1_class\cs_end: + \clist_gclear_new:c { g_xeCJK_#1_range_clist } + \seq_gput_right:Nv \g_xeCJK_class_seq { xeCJK_#1_class } + } +\seq_new:N \g_xeCJK_class_seq +\xeCJK_new_class:n { HalfLeft } +\xeCJK_new_class:n { HalfRight } +\xeCJK_new_class:n { NormalSpace } +\clist_set:Nn \g_xeCJK_base_class_clist + { + Default, CJK, FullLeft, FullRight, Boundary, + HalfLeft, HalfRight, NormalSpace + } +\clist_map_inline:Nn \g_xeCJK_base_class_clist + { \clist_gclear_new:c { g_xeCJK_#1_range_clist } } +\clist_new:N \g_xeCJK_CJK_class_clist +\prop_new:N \g_xeCJK_CJK_class_prop +\cs_new_nopar:Nn \xeCJK_save_CJK_class:n + { + \clist_gput_right:Nx \g_xeCJK_CJK_class_clist {#1} + \prop_gput:Nvx \g_xeCJK_CJK_class_prop { xeCJK_#1_class } {#1} + } +\cs_generate_variant:Nn \prop_gput:Nnn { Nvx } +\clist_map_inline:nn { CJK, FullLeft, FullRight } { \xeCJK_save_CJK_class:n {#1} } +\cs_new_nopar:Nn \xeCJK_class_num:n { \use:c { xeCJK_#1_class } } +\prg_set_conditional:Nnn \tl_if_blank:x { p , T , F , TF } + { + \if_int_compare:w \pdftex_strcmp:D { \c_empty_tl } {#1} = \c_zero + \prg_return_true: + \else: + \if_int_compare:w \pdftex_strcmp:D { \c_space_tl } {#1} = \c_zero + \prg_return_true: \else: \prg_return_false: \fi: + \fi: + } +\NewDocumentCommand \xeCJKDeclareCharClass { > { \TrimSpaces } m m } + { + \clist_gput_right:cx { g_xeCJK_#1_range_clist } {#2} + \clist_map_inline:xn {#2} + { + \str_if_eq:xxF {##1} { -> } + { + \xeCJK_setcharclass_aux:Nn \xeCJKsetcharclass {##1} + { \xeCJK_class_num:n {#1} } + } + } + } +\NewDocumentCommand \xeCJK_setcharclass_aux:Nn + { m > { \SplitArgument { 1 } { -> } } m } { #1 #2 } +\cs_generate_variant:Nn \clist_map_inline:nn { x } +\NewDocumentCommand \xeCJKsetcharclass { m m m } + { + \xeCJK_check_num_range:nnNN {#1} {#2} \l_tmpa_int \l_tmpb_int + \int_set:Nn \l_tmpc_int {#3} + \prop_if_in:NVTF \g_xeCJK_CJK_class_prop \l_tmpc_int + { \cs_set_eq:NN \xeCJK_set_catcode:n \char_set_catcode_other:n } + { \cs_set_eq:NN \xeCJK_set_catcode:n \use_none:n } + \loop + \xeCJK_set_catcode:n \l_tmpa_int + \XeTeXcharclass \l_tmpa_int = \l_tmpc_int + \if_int_compare:w \l_tmpa_int < \l_tmpb_int + \int_incr:N \l_tmpa_int + \repeat + } +\cs_new_nopar:Nn \xeCJK_check_num_range:nnNN + { + \bool_if:nTF { \tl_if_blank_p:x {#1} || \tl_if_blank_p:x {#2} } + { + \int_set:Nn #3 { \tl_if_blank:xTF {#1} {#2} {#1} } + \int_set_eq:NN #3 #4 + } + { + \int_set:Nn #3 { \int_min:nn {#1} { \IfNoValueTF {#2} {#1} {#2} } } + \int_set:Nn #4 { \int_max:nn {#1} { \IfNoValueTF {#2} {#1} {#2} } } + } + } +\NewDocumentCommand \xeCJKResetPunctClass { } + { + \xeCJKDeclareCharClass { HalfLeft } + { "28 , "2D , "5B , "60 , "7B } + \xeCJKDeclareCharClass { HalfRight } + { "21 , "22 , "25 , "27 , "29 , "2C , "2E , "3A , "3B , "3F , "5D , "7D , } + \xeCJKDeclareCharClass { FullLeft } + { + "2018 , "201C , "2116 , "3008 , "300A , "300C , "300E , "3010 , "3012 , + "3014 , "3016 , "3018 , "301A , "301D , "3036 , "E76C , "FE59 , "FE5B , + "FE5D , "FE5F , "FE60 , "FE69 , "FE6B , "FF03 , "FF04 , "FF08 , "FF20 , + "FF3B , "FF5B , "FFE0 , "FFE1 , "FFE5 , "FFE6 , + } + \xeCJKDeclareCharClass { FullRight } + { + "00B7 , "2019 , "201D , "2014 , "2025 , "2026 , "2030 , "2500 , "3001 , + "3002 , "3005 , "3006 , "3009 , "300B , "300D , "300F , "3011 , "3015 , + "3017 , "3019 , "301B , "301E , "301F , "3041 , "3043 , "3045 , "3047 , + "3049 , "3063 , "3083 , "3085 , "3087 , "308E , "309B , "309C , "309D , + "309E , "30A1 , "30A3 , "30A5 , "30A7 , "30A9 , "30C3 , "30E3 , "30E5 , + "30E7 , "30EE , "30F5 , "30F6 , "30FB , "30FC , "30FD , "30FE , "FE50 , + "FE51 , "FE52 , "FE54 , "FE55 , "FE56 , "FE57 , "FE5A , "FE5C , "FE5E , + "FE6A , "FF01 , "FF05 , "FF09 , "FF0C , "FF0E , "FF1A , "FF1B , "FF1F , + "FF3D , "FF5D , "FF61 , "FF63 , "FF64 , "FF65 , "FF67 , "FF68 , "FF69 , + "FF6A , "FF6B , "FF6C , "FF6D , "FF6E , "FF6F , "FF70 , "FF9E , "FF9F , + } + } +\xeCJKDeclareCharClass { CJK } + { + "1100 -> "11FF , + "2E80 -> "2EFF , + "2F00 -> "2FDF , + "2FF0 -> "2FFF , + "3000 -> "303F , + "3040 -> "309F , + "30A0 -> "30FF , + "3100 -> "312F , + "3130 -> "318F , + "3190 -> "319F , + "31A0 -> "31BF , + "31C0 -> "31EF , + "31F0 -> "31FF , + "3200 -> "32FF , + "3300 -> "33FF , + "3400 -> "4DBF , + "4DC0 -> "4DFF , + "4E00 -> "9FFF , + "A000 -> "A48F , + "A490 -> "A4CF , + "A960 -> "A97F , + "AC00 -> "D7AF , + "B000 -> "B0FF , + "D7B0 -> "D7FF , + "F900 -> "FAFF , + "FE30 -> "FE4F , + "FF00 -> "FFEF , + "20000 -> "2A6DF , + "2A700 -> "2B73F , + "2B740 -> "2B81F , + "2F800 -> "2FA1F , + } +\xeCJKResetPunctClass +\NewDocumentCommand \normalspacedchars { m } + { + \tl_map_inline:nn {#1} + { \XeTeXcharclass `##1 = \xeCJK_class_num:n { NormalSpace } } + } \normalspacedchars{/} - -\AtBeginDocument{% - \xeCJK@patch\textellipsis {\begingroup\makexeCJKinactive}{\endgroup} - \xeCJK@patch\textemdash {\begingroup\makexeCJKinactive}{\endgroup} - \xeCJK@patch\textperiodcentered {\begingroup\makexeCJKinactive}{\endgroup} - \xeCJK@patch\textcentereddot {\begingroup\makexeCJKinactive}{\endgroup} - \xeCJK@patch\textquoteleft {\begingroup\makexeCJKinactive}{\endgroup} - \xeCJK@patch\textquoteright {\begingroup\makexeCJKinactive}{\endgroup} - \xeCJK@patch\textquotedblleft {\begingroup\makexeCJKinactive}{\endgroup} - \xeCJK@patch\textquotedblright {\begingroup\makexeCJKinactive}{\endgroup} - \xeCJK@patch\tipaencoding {\makexeCJKinactive}{} % tipa package in T3 encoding - \let\xeCJK@save@r\r - \def\r#1{{\makexeCJKinactive\xeCJK@save@r{#1}}} % \r{u} in T1 encoding - \@ifpackageloaded{pifont}{ % pifont package in U encoding - \renewcommand\Pifont[1]{\fontfamily{#1}\fontencoding{U}% - \fontseries{m}\fontshape{n}\selectfont\makexeCJKinactive}}{} -} -\XeTeXinterchartoks 1 0{\egroup\CJKecglue} -\XeTeXinterchartoks 1 1{\xeCJK@i@i} -\XeTeXinterchartoks 1 2{\xeCJK@i@ii} -\XeTeXinterchartoks 1 3{\xeCJK@i@iii} -\XeTeXinterchartoks 1 4{\egroup\CJKecglue} -\XeTeXinterchartoks 1 5{\egroup} -\XeTeXinterchartoks 1 255{\xeCJK@i@cclv} - -\XeTeXinterchartoks 2 0{\xeCJK@ii@} -\XeTeXinterchartoks 2 1{\xeCJK@ii@i} -\XeTeXinterchartoks 2 2{\xeCJK@ii@ii} -\XeTeXinterchartoks 2 3{\xeCJK@ii@iii} -\XeTeXinterchartoks 2 4{\xeCJK@ii@iv} -\XeTeXinterchartoks 2 5{\xeCJK@ii@v} -\XeTeXinterchartoks 2 255{\xeCJK@ii@cclv} - -\XeTeXinterchartoks 3 0{\xeCJK@iii@} -\XeTeXinterchartoks 3 1{\xeCJK@iii@i} -\XeTeXinterchartoks 3 2{\xeCJK@iii@ii} -\XeTeXinterchartoks 3 3{\xeCJK@iii@iii} -\XeTeXinterchartoks 3 4{\xeCJK@iii@iv} -\XeTeXinterchartoks 3 5{\xeCJK@iii@v} -\XeTeXinterchartoks 3 255{\xeCJK@iii@cclv} - -\XeTeXinterchartoks 0 1{\xeCJK@@i} -\XeTeXinterchartoks 0 2{\xeCJK@@ii} -\XeTeXinterchartoks 0 3{\xeCJK@@iii} -\XeTeXinterchartoks 0 255{\xeCJK@@cclv} - -\XeTeXinterchartoks 4 1{\xeCJK@iv@i} -\XeTeXinterchartoks 4 2{\xeCJK@iv@ii} -\XeTeXinterchartoks 4 3{\xeCJK@iv@iii} - -\XeTeXinterchartoks 5 1{\xeCJK@v@i} -\XeTeXinterchartoks 5 2{\xeCJK@v@ii} -\XeTeXinterchartoks 5 3{\xeCJK@v@iii} -\XeTeXinterchartoks 5 255{\xeCJK@v@cclv} - -\XeTeXinterchartoks 255 0{\xeCJK@cclv@} -\XeTeXinterchartoks 255 1{\xeCJK@cclv@i} -\XeTeXinterchartoks 255 2{\xeCJK@cclv@ii} -\XeTeXinterchartoks 255 3{\xeCJK@cclv@iii} -\XeTeXinterchartoks 255 4{\xeCJK@cclv@iv} - -\XeTeXinterchartoks 1 6{\xeCJK@i@vi} -\XeTeXinterchartoks 2 6{\xeCJK@ii@vi} -\XeTeXinterchartoks 3 6{\xeCJK@iii@vi} -\XeTeXinterchartoks 6 1{\xeCJK@vi@i} -\XeTeXinterchartoks 6 2{\xeCJK@vi@ii} -\XeTeXinterchartoks 6 3{\xeCJK@vi@iii} - -\def\xeCJK@vi@i{ - \bgroup - \xeCJK@emptyCJKtoks - \xeCJK@setfont - \CJKsymbol} - -\def\xeCJK@i@vi{ - \egroup} - -\let\xeCJK@ii@vi \xeCJK@i@vi -\let\xeCJK@iii@vi\xeCJK@i@vi - -\let\xeCJK@vi@ii \xeCJK@vi@i -\let\xeCJK@vi@iii\xeCJK@vi@i - -\def\xeCJK@i@i{ - \CJKglue - \CJKsymbol} - -\def\xeCJK@i@ii#1{ - \xeCJK@punctrule{#1}{l} - \hskip \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @lglue@#1\endcsname - plus 0.1em minus 0.1 em - \xeCJK@setprepunct{#1}} - -\def\xeCJK@i@iii#1{ - \xeCJK@punctrule{#1}{r} - \ifcsname xeCJK@specialpunct#1\endcsname - \CJKglue % breakable - \else +\cs_new_nopar:Nn \xeCJK_inter_class_toks:nnn + { \XeTeXinterchartoks \xeCJK_class_num:n {#1} \xeCJK_class_num:n {#2} = {#3} } +\cs_generate_variant:Nn \xeCJK_inter_class_toks:nnn { nnc } +\cs_new_nopar:Nn \xeCJK_clear_inter_class_toks:nn + { + \XeTeXinterchartoks + \xeCJK_class_num:n {#1} \xeCJK_class_num:n {#2} = { \c_empty_tl } + } +\cs_new_nopar:Nn \xeCJK_pre_inter_class_toks:nnn + { + \use:x + { + \XeTeXinterchartoks \xeCJK_class_num:n {#1} \xeCJK_class_num:n {#2} = + { + \exp_not:n {#3} \tex_the:D \XeTeXinterchartoks + \xeCJK_class_num:n {#1} \xeCJK_class_num:n {#2} + } + } + } +\cs_new_nopar:Nn \xeCJK_app_inter_class_toks:nnn + { + \use:x + { + \XeTeXinterchartoks \xeCJK_class_num:n {#1} \xeCJK_class_num:n {#2} = + { + \tex_the:D \XeTeXinterchartoks \xeCJK_class_num:n {#1} + \xeCJK_class_num:n {#2} \exp_not:n {#3} + } + } + } +\cs_generate_variant:Nn \xeCJK_app_inter_class_toks:nnn { nnc } +\cs_new_nopar:Nn \xeCJK_get_inter_class_toks:nn + { + \tex_the:D \XeTeXinterchartoks \xeCJK_class_num:n {#1} \xeCJK_class_num:n {#2} + } +\cs_new_nopar:Nn \xeCJK_copy_inter_class_toks:nnnn + { + \use:x + { + \xeCJK_inter_class_toks:nnn {#1} {#2} + { \xeCJK_get_inter_class_toks:nn {#3} {#4} } + } + } +\cs_new_nopar:Nn \xeCJK_clear_CJK_toks: + { + \clist_map_inline:Nn \g_xeCJK_CJK_class_clist + { \xeCJK_clear_inter_class_toks:nn { Boundary } {##1} } + } +\clist_map_inline:nn { Default, HalfLeft, HalfRight, NormalSpace } + { + \clist_map_inline:nn { CJK, FullLeft, FullRight } + { + \xeCJK_inter_class_toks:nnn {#1} {##1} + { + \c_group_begin_token + \xeCJK_select_font: + \xeCJK_clear_inter_class_toks:nn {#1} {##1} + \xeCJK_clear_CJK_toks: + } + } + \xeCJK_app_inter_class_toks:nnn {#1} { CJK } { \CJKsymbol } + \clist_map_inline:nn { FullLeft, FullRight } + { \xeCJK_app_inter_class_toks:nnc {#1} {##1} { xeCJK_CJK_and_##1:N } } + \xeCJK_inter_class_toks:nnn { CJK } {#1} { \c_group_end_token } + \xeCJK_inter_class_toks:nnn { FullLeft } {#1} { \nobreak \c_group_end_token } + \xeCJK_inter_class_toks:nnn { FullRight } {#1} + { \xeCJK_after_FullRight: \c_group_end_token } + } +\xeCJK_pre_inter_class_toks:nnn { Default } { CJK } { \CJKecglue } +\clist_map_inline:nn { Default, HalfLeft, NormalSpace } + { + \xeCJK_inter_class_toks:nnn { Boundary } {#1} + { + \int_compare:nNnTF \tex_lastkern:D = \c_one { \CJKecglue } + { \int_compare:nNnT \tex_lastkern:D = \c_two \xeCJK_space_or_xecglue: } + } + \str_if_eq:xxF {#1} { NormalSpace } + { \xeCJK_app_inter_class_toks:nnn { CJK } {#1} { \CJKecglue } } + } +\clist_map_inline:nn { Default, HalfRight, NormalSpace } + { + \xeCJK_inter_class_toks:nnn {#1} { Boundary } + { + \peek_catcode:NTF \c_space_token + { { \xeCJK_default_space_kern: } } { { \xeCJK_default_kern: } } + } + } +\xeCJK_inter_class_toks:nnn { Boundary } { CJK } { \xeCJK_Boundary_and_CJK: } +\cs_new_nopar:Nn \xeCJK_Boundary_and_CJK: + { + { + \bool_if:nTF + { + \int_compare_p:nNn \tex_lastkern:D = \c_one || + \int_compare_p:nNn \tex_lastkern:D = \c_two + } + { \CJKglue } + { + \bool_if:nTF + { + \int_compare_p:nNn \tex_lastkern:D = \c_three || + \int_compare_p:nNn \etex_lastnodetype:D = \c_ten || + ( \int_compare_p:nNn \etex_lastnodetype:D = \c_twelve && + \g_xeCJK_itcorr_bool ) + } + { \CJKecglue } + { + \bool_if:nT + { + \l_xeCJK_xecglue_bool && + \int_compare_p:nNn \etex_lastnodetype:D = \c_eleven && + ( \int_compare_p:nNn + \tex_lastskip:D = { \tex_fontdimen:D \c_two \tex_font:D } || + \int_compare_p:nNn \tex_lastskip:D = \l_xeCJK_ecglue_dim ) + } + { + \skip_set_eq:NN \l_tmpa_skip \tex_lastskip:D + \tex_unskip:D + \bool_if:nTF + { + \int_compare_p:nNn \tex_lastkern:D = \c_four || + \int_compare_p:nNn \etex_lastnodetype:D = \c_ten || + \int_compare_p:nNn \tex_lastkern:D = \c_three || + \g_xeCJK_itcorr_bool + } + { \CJKecglue } + { + \bool_if:nT + { + ! ( \int_compare_p:nNn \tex_lastkern:D = \c_one ) || + ! ( \int_compare_p:nNn \tex_lastkern:D = \c_two ) || + \l_xeCJK_space_bool + } + { \skip_horizontal:N \l_tmpa_skip } + } + } + } + } + \bool_gset_false:N \g_xeCJK_itcorr_bool + } + \c_group_begin_token + \xeCJK_clear_CJK_toks: + \xeCJK_select_font: + \CJKsymbol + } +\xeCJK_inter_class_toks:nnn { CJK } { Boundary } + { + \c_group_end_token + { \xeCJK_CJK_kern: } + \xeCJK_ignorespaces: + } +\xeCJK_inter_class_toks:nnn { CJK } { CJK } { \xeCJK_CJK_and_CJK:N } +\cs_new_nopar:Nn \xeCJK_CJK_and_CJK:N { \CJKglue \CJKsymbol {#1} } +\clist_map_inline:nn { FullLeft, FullRight } + { + \xeCJK_inter_class_toks:nnn { Boundary } {#1} + { + \c_group_begin_token + \xeCJK_clear_CJK_toks: + \xeCJK_select_font: + \use:c { xeCJK_CJK_and_#1:N } + } + \xeCJK_inter_class_toks:nnn {#1} { CJK } { \CJKsymbol } + \xeCJK_inter_class_toks:nnn {#1} { Boundary } + { \c_group_end_token \tex_ignorespaces:D } + \clist_map_inline:nn { CJK, Boundary } + { + \exp_args:Nnnx \xeCJK_pre_inter_class_toks:nnn {#1} {##1} + { + \str_if_eq:xxTF {#1} { FullLeft } + { \exp_not:N \nobreak } { \exp_not:N \xeCJK_after_FullRight: } + } + } + } +\cs_new_nopar:Nn \xeCJK_punct_rule:n + { + \tex_vrule:D + \@width \dim_eval:c { \l_xeCJK_punct_coor_tl/rule/#1 } + \@depth \c_zero_dim + \@height \c_zero_dim \scan_stop: + } +\cs_new_nopar:Nn \xeCJK_punct_glue:n + { + \skip_horizontal:n + { + \dim_eval:c { \l_xeCJK_punct_coor_tl/glue/#1 } + \@plus \dim_eval:n { \tl_use:c { \l_xeCJK_punct_coor_tl/glue/#1 } /4 } + \@minus \dim_eval:n { \tl_use:c { \l_xeCJK_punct_coor_tl/glue/#1 } /2 } + } + } +\cs_new_nopar:Nn \xeCJK_punct_kern:n + { \tex_kern:D \dim_eval:c { \l_xeCJK_punct_coor_tl/kern/#1 } } +\cs_generate_variant:Nn \dim_eval:n { c } +\cs_new_nopar:Nn \xeCJK_before_FullLeft:N + { + \tl_set:Nx \l_xeCJK_lastpunct_tl {#1} + \xeCJK_punct_rule:n { l/#1 } + \CJKpunctsymbol {#1} + } +\cs_new_nopar:Nn \xeCJK_after_FullRight: + { + \xeCJK_get_punct_bounds:nV { r } \l_xeCJK_lastpunct_tl + \xeCJK_punct_rule:n { r/\l_xeCJK_lastpunct_tl } + \xeCJK_punct_glue:n { r/\l_xeCJK_lastpunct_tl } + } +\clist_map_inline:nn { CJK, FullLeft, FullRight } + { + \clist_map_inline:nn { FullLeft, FullRight } + { \xeCJK_inter_class_toks:nnc {#1} {##1} { xeCJK_#1_and_##1:N } } + } +\cs_new_nopar:Nn \xeCJK_CJK_and_FullLeft:N + { + \xeCJK_get_punct_bounds:nN { l } {#1} + \int_compare:nNnF \etex_lastnodetype:D = \c_one + { \xeCJK_punct_glue:n { l/#1 } } + \xeCJK_before_FullLeft:N {#1} + \xeCJK_punct_if_middle:NT {#1} + { + \xeCJK_punct_rule:n { m/#1 } + \xeCJK_punct_glue:n { l/#1 } + } + } +\cs_new_nopar:Nn \xeCJK_CJK_and_FullRight:N + { + \xeCJK_get_punct_bounds:nN { r } {#1} + \xeCJK_punct_if_long:NTF {#1} \CJKglue + { + \nobreak + \xeCJK_punct_if_middle:NT {#1} + { + \xeCJK_punct_glue:n { r/#1 } + \xeCJK_punct_rule:n { m/#1 } + } + } + \tl_gset:Nx \l_xeCJK_lastpunct_tl {#1} + \CJKpunctsymbol {#1} + } +\cs_new_nopar:Nn \xeCJK_FullLeft_and_FullLeft:N + { + \nobreak + \xeCJK_get_punct_bounds:nN { l } {#1} + \xeCJK_get_kern:VN \l_xeCJK_lastpunct_tl {#1} + \xeCJK_punct_kern:n { \l_xeCJK_lastpunct_tl - #1 } + \xeCJK_before_FullLeft:N {#1} + } +\cs_new_nopar:Nn \xeCJK_FullLeft_and_FullRight:N + { + \nobreak + \xeCJK_get_punct_bounds:nN { r } {#1} + \xeCJK_get_kern:VN \l_xeCJK_lastpunct_tl {#1} + \xeCJK_punct_kern:n { \l_xeCJK_lastpunct_tl - #1 } \nobreak - \fi - \global\edef\xeCJK@lastpunct{#1} - \CJKpunctsymbol{#1}} - -\def\xeCJK@setprepunct#1{ - \edef\xeCJK@lastpunct{#1} - \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname - @lrule@#1\endcsname depth \z@ height \z@ - \CJKpunctsymbol{#1}} - -\def\xeCJK@i@cclv{ - \egroup - {\xeCJK@CJKkern} - \xeCJK@ignorespaces} - -\def\xeCJK@ii@i{ - \nobreak - \CJKsymbol} - -\def\xeCJK@ii@ii#1{ - \nobreak - \xeCJK@punctrule{#1}{l} - \xeCJK@setkern{\xeCJK@lastpunct}{#1} - \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname - \xeCJK@setprepunct{#1}} - -\def\xeCJK@ii@iii#1{ - \nobreak - \xeCJK@punctrule{#1}{r} - \xeCJK@setkern{\xeCJK@lastpunct}{#1} - \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname - \nobreak - \edef\xeCJK@lastpunct{#1} - \CJKpunctsymbol{#1}} - -\def\xeCJK@ii@{ - \nobreak - \egroup} - -\let\xeCJK@ii@iv\xeCJK@ii@ -\let\xeCJK@ii@v\xeCJK@ii@ - -\def\xeCJK@ii@cclv{ - \nobreak - \egroup - \ignorespaces} - -\def\xeCJK@iii@{ - \xeCJK@afterpostpunct - \egroup} - -\def\xeCJK@iii@i{ - \xeCJK@afterpostpunct - \CJKsymbol} - -\def\xeCJK@iii@ii#1{ - \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname - @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@ - \xeCJK@punctrule{#1}{l} - \xeCJK@setkern{\xeCJK@lastpunct}{#1} - \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname - \xeCJKpunctnobreak - \xeCJK@setprepunct{#1}} - -\def\xeCJK@iii@iii#1{ - \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname - @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@ - \xeCJK@punctrule{#1}{r} - \xeCJK@setkern{\xeCJK@lastpunct}{#1} - \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname - \nobreak - \edef\xeCJK@lastpunct{#1} - \CJKpunctsymbol{#1}} - -\def\xeCJK@iii@iv{ - \xeCJK@afterpostpunct - \egroup} - -\def\xeCJK@afterpostpunct{ - \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname - @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@ - \hskip \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @rglue@\xeCJK@lastpunct\endcsname - plus 0.1em minus 0.1 em} -\let\xeCJK@iii@v\xeCJK@iii@iv - -\def\xeCJK@iii@cclv{ - \xeCJK@afterpostpunct - \egroup - \ignorespaces} - -\def\xeCJK@@i{ - \CJKecglue - \bgroup - \xeCJK@setfont - \xeCJK@emptyCJKtoks - \CJKsymbol} - -\def\xeCJK@@ii{ - \bgroup - \xeCJK@setfont - \XeTeXinterchartoks 0 2{\relax} - \xeCJK@emptyCJKtoks - \xeCJK@i@ii} - -\def\xeCJK@@iii{ - \bgroup - \xeCJK@setfont - \XeTeXinterchartoks 0 3{\relax} - \xeCJK@emptyCJKtoks - \xeCJK@i@iii} - -\def\xeCJK@iv@i{ - \bgroup - \xeCJK@setfont - \XeTeXinterchartoks 4 1{\relax} - \xeCJK@emptyCJKtoks - \CJKsymbol} - -\def\xeCJK@iv@ii{ - \bgroup - \xeCJK@setfont - \XeTeXinterchartoks 4 2{\relax} - \xeCJK@emptyCJKtoks - \xeCJK@i@ii} - -\def\xeCJK@iv@iii{ - \bgroup - \xeCJK@setfont - \XeTeXinterchartoks 4 3{\relax} - \xeCJK@emptyCJKtoks - \xeCJK@i@iii} - -\def\xeCJK@v@i{ - \CJKecglue - \bgroup - \xeCJK@setfont - \xeCJK@emptyCJKtoks - \CJKsymbol} - -\def\xeCJK@v@ii{ - \bgroup - \xeCJK@setfont - \XeTeXinterchartoks 5 2{\relax} - \xeCJK@emptyCJKtoks - \xeCJK@i@ii} - -\def\xeCJK@v@iii{ - \bgroup - \xeCJK@setfont - \XeTeXinterchartoks 5 3{\relax} - \xeCJK@emptyCJKtoks - \xeCJK@i@iii} - -\def\xeCJK@emptyCJKtoks{ - \XeTeXinterchartoks 255 1{\relax} - \XeTeXinterchartoks 255 2{\relax} - \XeTeXinterchartoks 255 3{\relax}} - -\def\xeCJK@@cclv{ - \futurelet\xeCJK@nexttoken\xeCJK@zz@cclv} - -\def\xeCJK@zz@cclv{ - \ifx\xeCJK@nexttoken\@sptoken - \else - {\xeCJK@zerokern} - \fi} - -\let\xeCJK@v@cclv\xeCJK@@cclv - -\def\xeCJK@cclv@{ - \ifnum\lastkern=\@ne - \@sptoken%\CJKecglue - \fi} -\let\xeCJK@cclv@iv\xeCJK@cclv@ - -\def\xeCJK@cclv@i{{ - \ifnum\lastkern=\@ne - \CJKglue - \else - \ifnum\lastkern=\xeCJK@four - \@sptoken%\CJKecglue - \else - \ifnum\lastnodetype=\xeCJK@ten - \CJKecglue - \fi - \fi - \fi} - \bgroup - - \xeCJK@emptyCJKtoks - \xeCJK@setfont - \CJKsymbol} - -\def\xeCJK@cclv@ii{ - \bgroup - \xeCJK@emptyCJKtoks - \xeCJK@setfont - \xeCJK@i@ii} - -\def\xeCJK@cclv@iii{ - \bgroup - \xeCJK@emptyCJKtoks - \xeCJK@setfont - \xeCJK@i@iii} - -\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@zerokern{\kern -4sp\kern 4sp} - -\chardef\xeCJK@four=4 -\chardef\xeCJK@ten=10 - -\def\CJKspace{\let\xeCJK@ignorespaces\@empty} -\def\CJKnospace{\let\xeCJK@ignorespaces\xeCJK@@ignorespaces} -\ifxeCJK@space@ - \AtEndOfPackage{\CJKspace} -\else - \AtEndOfPackage{\CJKnospace} -\fi - -\def\xeCJK@@ignorespaces{ - \futurelet\xeCJK@nexttoken\xeCJK@checknext} - -\def\xeCJK@checknext{ - \ifx\xeCJK@nexttoken\@sptoken - \expandafter\xeCJK@@checknext - \else - \ifx $\xeCJK@nexttoken - \CJKecglue - \fi - \fi} - -{ - \def\:{\xeCJK@@checknext} - \global\expandafter\def\: {\futurelet\@let@token\xeCJK@@@checknext} -} - -\def\xeCJK@@@checknext{ - \ifx $\@let@token - \@sptoken%\CJKecglue - \else - \if\relax\noexpand\@let@token - \ifx\@let@token\xeCJK@par - \else - \@sptoken - \fi - \fi - \fi - \let\xeCJK@nexttoken\relax} - -\long\def\xeCJK@gobble#1\CJK@stop{} - - -\def\xeCJK@checksingle#1{ - \def\xeCJK@setcurrentchar@i{ - \CJKglue - \CJKsymbol{#1}} - \def\xeCJK@setcurrentnobreakchar@i{ - \CJKsymbol{#1}} - \futurelet\@let@token\xeCJK@@checksingle} - -\def\xeCJK@@checksingle{ - \ifcat 。\noexpand\@let@token - \expandafter\xeCJK@@@checksingle - \else - \expandafter\xeCJK@setcurrentchar@i - \fi} - -\def\xeCJK@@@checksingle#1{ - \def\xeCJK@setcurrentchar@ii{ - \xeCJK@setcurrentchar@i #1} - \def\xeCJK@setcurrentchar@ii@s{ - \xeCJK@setcurrentchar@i #1 } - \def\xeCJK@setcurrentnobreakchar@ii{ - \xeCJK@setcurrentnobreakchar@i #1} - \futurelet\@let@token\xeCJK@@@@checksingle} - -\def\xeCJK@@@@checksingle{ - \ifx\@let@token\@sptoken - \expandafter\xeCJK@checkpar - \else - \expandafter\xeCJK@setcurrentchar@ii - \fi} - -\let\xeCJK@par\par -\def\xeCJK@checkpar{ - \@ifnextchar\xeCJK@par{\xeCJK@setcurrentnobreakchar@ii}{\xeCJK@setcurrentchar@ii@s}} - -\def\xeCJKsetecglue#1{ - \def\CJK@ecglue{#1} - \let\CJKecglue\CJK@ecglue} -\let\CJKsetecglue\xeCJKsetecglue -\CJKsetecglue{ } - -\def\xeCJKallowbreakbetweenpuncts{ - \def\xeCJKpunctnobreak{ - \hskip 0pt}} - -\def\xeCJKnobreakbetweenpuncts{ - \let\xeCJKpunctnobreak\nobreak} -\xeCJKnobreakbetweenpuncts - -\let\xeCJK@itcorr\/ -\def\/{% - \relax - \ifnum\lastkern=4 % - \unkern\unkern - \fi - \xeCJK@itcorr} -\let\@@italiccorr=\/ - -\newcount\xeCJK@cnta -\newcount\xeCJK@cntb -\newcount\xeCJK@cntc -\newcount\xeCJK@cntd -\newcount\xeCJK@cnte -\newdimen\xeCJK@dima -\newif\ifxeCJK@dokerning - -\def\xeCJK@punctrule#1#2{ - \xdef\xeCJK@bboxname{\xeCJK@family/\f@series/\f@shape} - \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2rule@#1\endcsname - \else - \ifcsname xeCJK@\xeCJK@bboxname @lspace@#1\endcsname - \else - {\xeCJK@setfont - \xeCJK@setpunctbounds{#1}} - \fi - \xeCJK@dokerningtrue - \ifnum\xeCJK@punctstyle=\xeCJK@ps@plain\relax - \xeCJK@dokerningfalse - \else - \ifcsname xeCJK@specialpunct#1\endcsname - \xeCJK@dokerningfalse - \fi - \fi - \ifxeCJK@dokerning - \xeCJK@cnta=\csname xeCJK@\xeCJK@bboxname @#2space@#1\endcsname\relax - \xeCJK@cntc=\xeCJK@cnta - \ifcase\xeCJK@punctstyle - % hangmobanjiao - \or % quanjiao - \or % banjiao - \advance\xeCJK@cntc -50\relax - \or % kaiming - \ifcsname xeCJK@kaiming#1\endcsname - \else - \advance\xeCJK@cntc -50\relax - \fi - \or %CCT - \advance\xeCJK@cntc -20\relax - \fi - \xeCJK@cntd=\xeCJK@cntc - \ifnum\xeCJK@cntc<0\relax - \xeCJK@cntc=0\relax - \fi - \else - \xeCJK@cnta=0\relax - \xeCJK@cntc=0\relax - \xeCJK@cntd=0\relax - \fi - \xeCJK@numtodim{\xeCJK@cnta} - \global\expandafter\edef\csname - xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2rule@#1\endcsname{ - -\xeCJK@temp em} - \xeCJK@numtodim{\xeCJK@cntc} - \global\expandafter\edef\csname - xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2glue@#1\endcsname{ - \xeCJK@temp em} - \global\expandafter\edef\csname - xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2oglue@#1\endcsname{ - \the\xeCJK@cntd} - \fi} - -\def\xeCJK@numtodim#1{ - \xeCJK@cnte=#1\relax - \ifnum\the\xeCJK@cnte<100\relax - \def\xeCJK@temp{0} - \else - \advance\xeCJK@cnte -100\relax - \def\xeCJK@temp{1} - \fi - \ifnum\the\xeCJK@cnte<10 - \edef\xeCJK@temp{\xeCJK@temp.0\the\xeCJK@cnte} - \else - \edef\xeCJK@temp{\xeCJK@temp.\the\xeCJK@cnte} - \fi} - -\expandafter\def\csname xeCJK@kaiming.\endcsname{} -\expandafter\def\csname xeCJK@kaiming。\endcsname{} -\expandafter\def\csname xeCJK@kaiming?\endcsname{} -\expandafter\def\csname xeCJK@kaiming!\endcsname{} -\expandafter\def\csname xeCJK@specialpunct—\endcsname{}% U+2014 -\expandafter\def\csname xeCJK@specialpunct─\endcsname{}% U+2500 -\expandafter\def\csname xeCJK@specialpunct…\endcsname{} -\def\xeCJK@setkern#1#2{ - \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern#1#2\endcsname - \else - \xeCJK@cnta=0\relax - \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @roglue@#1\endcsname - \advance\xeCJK@cnta\csname - xeCJK\xeCJK@punctstyle\xeCJK@bboxname @roglue@#1\endcsname - \fi - \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @loglue@#2\endcsname - \advance\xeCJK@cnta\csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname - @loglue@#2\endcsname - \fi - \relax - \ifcase\xeCJK@punctstyle - % hangmobanjiao - \or % quanjiao - \advance\xeCJK@cnta -50\relax - \or % banjiao - \or % kaiming - \ifcsname xeCJK@kaiming#1\endcsname - \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @roglue@#2\endcsname - \advance\xeCJK@cnta -50\relax - \fi - \fi - \fi - \ifnum\xeCJK@cnta<0\relax - \xeCJK@cnta=0\relax - \fi - \xeCJK@numtodim{\xeCJK@cnta} - \global\expandafter\edef\csname - xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern#1#2\endcsname{ - \xeCJK@temp em} - \fi} - -\def\xeCJKsetkern#1#2#3{ - \xdef\xeCJK@bboxname{\xeCJK@family/\f@series/\f@shape} - \global\expandafter\edef\csname - xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern#1#2\endcsname{#3}} - -\def\punctstyle#1{ - \ifcsname xeCJK@ps@#1\endcsname - \edef\xeCJK@punctstyle{\csname xeCJK@ps@#1\endcsname} - \ifnum\xeCJK@punctstyle=\xeCJK@ps@plain\relax - \xeCJKallowbreakbetweenpuncts - \fi - \else - \typeout{Warning: Punctstyle #1\space is not defined.} - \fi} - -\def\xeCJK@ps@hangmobanjiao{0} -\def\xeCJK@ps@marginkerning{0} -\def\xeCJK@ps@quanjiao{1} -\def\xeCJK@ps@fullwidth{1} -\def\xeCJK@ps@banjiao{2} -\def\xeCJK@ps@halfwidth{2} -\def\xeCJK@ps@kaiming{3} -\def\xeCJK@ps@mixedwidth{3} -\def\xeCJK@ps@CCT{4} -\def\xeCJK@ps@plain{5} -\punctstyle{quanjiao} - -\def\xeCJKplainchr{\punctstyle{plain}} - -\def\xeCJK@sidespace{10} - -\def\xeCJK@getglyphbounds#1{ - \xeCJK@cnta=\number\XeTeXglyphbounds #1 \xeCJK@gid - \xeCJK@dima 1em\relax - \xeCJK@cntb=\number\xeCJK@dima - \multiply\xeCJK@cnta 100\relax - \divide\xeCJK@cnta\xeCJK@cntb - \advance\xeCJK@cnta -15\relax - \edef\xeCJK@temp{\the\xeCJK@cnta} - \ifnum\xeCJK@temp<0\relax - \def\xeCJK@temp{0} - \fi} - -\def\xeCJK@setpunctbounds#1{ - \edef\xeCJK@gid{\the\XeTeXcharglyph`#1} - \xeCJK@getglyphbounds{1} - \expandafter\xdef\csname xeCJK@\xeCJK@bboxname @lspace@#1\endcsname{ - \xeCJK@temp} - \xeCJK@getglyphbounds{3} - \expandafter\xdef\csname xeCJK@\xeCJK@bboxname @rspace@#1\endcsname{ - \xeCJK@temp} - \ifcsname xeCJK@specialpunct#1\endcsname - \ifx#1… - \else - \xeCJK@cnta=\number\XeTeXglyphbounds 1 \xeCJK@gid - \advance\xeCJK@cnta\number\XeTeXglyphbounds 3 \xeCJK@gid - \xeCJK@dima 1em\relax - \xeCJK@cntb=\number\xeCJK@dima - \multiply\xeCJK@cnta 100\relax - \divide\xeCJK@cnta\xeCJK@cntb - \advance\xeCJK@cnta 1\relax - \ifnum\xeCJK@cnta>9 - \edef\xeCJK@temp{-0.\the\xeCJK@cnta em} - \else - \ifnum\xeCJK@cnta>1 - \edef\xeCJK@temp{-0.0\the\xeCJK@cnta em} - \else - \edef\xeCJK@temp{-0.01 em} - \fi - \fi - \xeCJK@cnta=0 - \loop - \global\expandafter\edef\csname xeCJK\the\xeCJK@cnta\xeCJK@bboxname - @kern#1#1\endcsname{\xeCJK@temp} - \advance \xeCJK@cnta 1\relax - \ifnum\xeCJK@cnta<6\repeat - \fi - \fi} - -\ifcsname XeTeXglyphbounds\endcsname -\else - \PackageError{xeCJK}{\string\XeTeXglyphbounds \space not defined.^^J - You have to update XeTeX to the version 0.9995.0 or later} - \relax -\fi - -\def\CJKsymbol#1{#1} -\def\CJKpunctsymbol#1{#1} - -\def\xeCJK@fallback@testsymbol#1{ - \iffontchar\font`#1 - #1 - \else - {\csname xeCJK@fallback@\xeCJK@family\endcsname #1} - \fi} -\newcommand\xeCJKenablefallback{\let\xeCJK@fallback@CJKsymbol\CJKsymbol - \def\CJKsymbol##1{\xeCJK@fallback@CJKsymbol{\xeCJK@fallback@testsymbol{##1}}}} -\newcommand\xeCJKdisablefallback{\let\CJKsymbol\xeCJK@fallback@CJKsymbol} -\ifxeCJK@fallback@ - \xeCJKenablefallback -\fi -\newcommand\setCJKfallbackfamilyfont[1]{ - \@ifnextchar[ - {\xeCJK@setfallbackfamilyfont{#1}} - {\xeCJK@setfallbackfamilyfont{#1}[]}} -\def\xeCJK@setfallbackfamilyfont#1[#2]#3{ - \expandafter\newfontfamily\csname xeCJK@fallback@#1\endcsname[#2]{#3} -} - -\DeclareRobustCommand{\xeCJK@ULprepunctchar}[1]{ - {\XeTeXinterchartokenstate=0 - \CJKpunctsymbol{#1} - \nobreak} - \ignorespaces} -\DeclareRobustCommand{\xeCJK@ULpostpunctchar}[1]{ - {\XeTeXinterchartokenstate=0 - \CJKpunctsymbol{#1}} - \xeCJK@ignorespaces} -\def\xeCJK@ULroutines{ - \XeTeXinterchartoks 0 1 {\CJKecglue\CJKsymbol} - \XeTeXinterchartoks 4 1 {\CJKsymbol} - \XeTeXinterchartoks 5 1 {\CJKecglue\CJKsymbol} - \XeTeXinterchartoks 255 1 {\xeCJK@cclv@i} - \XeTeXinterchartoks 0 2 {\xeCJK@ULprepunctchar} - \XeTeXinterchartoks 4 2 {\xeCJK@ULprepunctchar} - \XeTeXinterchartoks 5 2 {\xeCJK@ULprepunctchar} - \XeTeXinterchartoks 255 2 {\xeCJK@ULprepunctchar} - \XeTeXinterchartoks 0 3 {\xeCJK@ULpostpunctchar} - \XeTeXinterchartoks 4 3 {\xeCJK@ULpostpunctchar} - \XeTeXinterchartoks 5 3 {\xeCJK@ULpostpunctchar} - \XeTeXinterchartoks 255 3 {\xeCJK@ULpostpunctchar}} - -\AtBeginDocument{ - \ifcsname UL@hook\endcsname - \addto@hook\UL@hook{ - \let\xeCJK@UL@CJKsymbol\CJKsymbol - \let\xeCJK@UL@CJKpunctsymbol\CJKpunctsymbol - \def\CJKsymbol#1{{\xeCJK@setfont \xeCJK@UL@CJKsymbol{#1}} - \kern -1sp\kern 1sp\xeCJK@ignorespaces} - \def\CJKpunctsymbol#1{{\xeCJK@setfont \xeCJK@UL@CJKpunctsymbol{#1}}} - \xeCJK@ULroutines} - \fi - \ifcsname ver@CJKfntef.sty\endcsname - \def\XeTeX@CJKfntef@hook{ - \xeCJK@setfont - \XeTeXinterchartokenstate=0} - \fi} - -\def\xeCJK@setfont{ - \ifcsname xeCJK@\xeCJK@family/\f@series/\f@shape/\f@size\endcsname - \csname xeCJK@\xeCJK@family/\f@series/\f@shape/\f@size\endcsname - \else - \edef\xeCJK@currentcoor{xeCJK@\xeCJK@family/\f@series/\f@shape/\f@size} - \csname xeCJK@font@\xeCJK@family\endcsname - \begingroup - \get@external@font - \edef\xeCJK@temp{\def\noexpand\external@font{\external@font}} - \expandafter\endgroup\xeCJK@temp - \expandafter\global\expandafter\font - \csname\xeCJK@currentcoor\endcsname=\external@font - \fi} - -\def\CJKrmdefault{rm} -\def\setCJKmainfont{ - \xeCJK@newfontfamily{\CJKrmdefault}} - -\let\setCJKromanfont\setCJKmainfont - -\def\CJKsfdefault{sf} -\def\setCJKsansfont{ - \xeCJK@newfontfamily{\CJKsfdefault}} - -\providecommand\CJKttdefault{tt} - -\def\setCJKfamilyfont#1{ - \xeCJK@newfontfamily{#1}} -\def\CJKfamilydefault{\CJKrmdefault} -\DeclareRobustCommand\normalfont - {\CJKfamily{\CJKfamilydefault} - \usefont\encodingdefault - \familydefault - \seriesdefault - \shapedefault - \relax} -\let\reset@font\normalfont - -\DeclareRobustCommand\rmfamily - {\not@math@alphabet\rmfamily\mathrm - \fontfamily\rmdefault\CJKfamily{\CJKrmdefault}\selectfont} - -\DeclareRobustCommand\sffamily - {\not@math@alphabet\sffamily\mathsf - \fontfamily\sfdefault\CJKfamily{\CJKsfdefault}\selectfont} - -\DeclareRobustCommand\ttfamily - {\not@math@alphabet\ttfamily\mathtt - \fontfamily\ttdefault\CJKfamily{\CJKttdefault}\selectfont} - -\newcommand*\xeCJK@newfontfamily[1]{ - \@ifnextchar[ - {\xeCJK@newfontfamily@{#1}} - {\xeCJK@newfontfamily@{#1}[]}} - -\def\xeCJK@setmacro@define@key#1{ - \define@key[xeCJK]{preparse}{#1}{ - \expandafter\xdef\csname xeCJK@#1\endcsname{##1}}} - -\xeCJK@setmacro@define@key{ItalicFont} -\xeCJK@setmacro@define@key{BoldFont} -\xeCJK@setmacro@define@key{BoldItalicFont} - -\def\xeCJK@newfontfamily@#1[#2]#3{ - % - % Get user defined options - - \let\xeCJK@BoldFont\@empty - \let\xeCJK@ItalicFont\@empty - \let\xeCJK@BoldItalicFont\@empty - \bgroup - \setkeys*[xeCJK]{preparse}{#2} - \egroup - \edef\xeCJK@Features{} - - \ifxeCJK@BoldFont@ - \ifx\xeCJK@BoldFont\@empty - \edef\xeCJK@Features{BoldFont={#3}, - BoldFeatures={RawFeature={embolden=\xeCJK@emboldenfactor}}} - \fi - \fi - - \ifxeCJK@SlantFont@ - \ifx\xeCJK@ItalicFont\@empty - \ifx\xeCJK@Features\@empty - \edef\xeCJK@Features{ItalicFont={#3}, - ItalicFeatures={RawFeature={slant=\xeCJK@slantfactor}}} - \else - \edef\xeCJK@Features{\xeCJK@Features,ItalicFont={#3}, - ItalicFeatures={RawFeature={slant=\xeCJK@slantfactor}}} - \fi - \fi - - \ifx\xeCJK@BoldItalicFont\@empty - \ifx\xeCJK@BoldFont\@empty - \edef\xeCJK@Features{\xeCJK@Features,BoldItalicFont={#3}, - BoldItalicFeatures={RawFeature={embolden=\xeCJK@emboldenfactor,slant=\xeCJK@slantfactor}}} - \else - \edef\xeCJK@Features{\xeCJK@Features,BoldItalicFont={\xeCJK@BoldFont}, - BoldItalicFeatures={RawFeature={slant=\xeCJK@slantfactor}}} - \fi - \fi - \fi - - \edef\xeCJK@temp{#2} - \ifx\xeCJK@temp\@empty - \else - \ifx\xeCJK@Features\@empty - \edef\xeCJK@Features{#2} - \else - \edef\xeCJK@Features{\xeCJK@Features,#2} - \fi - \fi - - \expandafter\edef\csname xeCJK@font@#1\endcsname{ - \noexpand\fontspec[\xeCJK@Features]{#3}} - \expandafter\edef\csname xeCJK@fontoptions@#1\endcsname{\xeCJK@Features} - \expandafter\edef\csname xeCJK@fontname@#1\endcsname{#3}} - - -\newcount\xeCJK@featureadded -\xeCJK@featureadded=0 - -\let\xeCJK@addfontfeatures\addfontfeatures -\def\addCJKfontfeatures#1{ - \global\advance\xeCJK@featureadded\@ne - \ifcsname xeCJK@family\endcsname - \edef\xeCJK@tempa{\csname xeCJK@fontoptions@\xeCJK@family\endcsname,#1} - \edef\xeCJK@tempb{\csname xeCJK@fontname@\xeCJK@family\endcsname} - \edef\xeCJK@tempf{\xeCJK@family @\the\xeCJK@featureadded} - \expandafter\edef\csname xeCJK@font@\xeCJK@tempf\endcsname{ - \noexpand\fontspec[\xeCJK@tempa]{\xeCJK@tempb}} - \expandafter\edef\csname xeCJK@fontoptions@\xeCJK@tempf\endcsname{\xeCJK@tempa} - \expandafter\edef\csname xeCJK@fontname@\xeCJK@tempf\endcsname{\xeCJK@tempb} - \CJKfamily{\xeCJK@tempf} - \fi} - -\def\addfontfeatures#1{ - \xeCJK@addfontfeatures{#1} - \addCJKfontfeatures{#1}} - - -\expandafter\def\csname xeCJK@font@\CJKfamilydefault\endcsname{} - -\DeclareRobustCommand\CJKfamily[1]{ - \ifcsname xeCJK@font@#1\endcsname - \edef\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} -\AtBeginDocument{\CJKfamily{\CJKfamilydefault}} - -\def\xeCJKsetslantfactor#1{\edef\xeCJK@slantfactor{#1}} -\def\xeCJKsetemboldenfactor#1{\edef\xeCJK@emboldenfactor{#1}} - -\xeCJKsetslantfactor{0.17} -\xeCJKsetemboldenfactor{4} -\ExplSyntaxOn - -\fp_new:N \g_xecjk_monoscale_fp -\fp_gset_eq:NN \g_xecjk_monoscale_fp \c_one_fp - -\dim_new:N \g_xecjk_exspace_dim -\dim_gset_eq:NN \g_xecjk_exspace_dim \c_zero_dim - -\cs_new:Nn \xecjk_setmonoscale: -{ - \dim_gset_eq:NN \g_xecjk_exspace_dim \c_zero_dim - \group_begin: - \fontfamily\ttdefault\selectfont - \fp_gset_from_dim:Nn \g_xecjk_monoscale_fp {\c_two\fontdimen\c_two\font} - \fp_gdiv:Nn \g_xecjk_monoscale_fp {\f@size} - \group_end: -} - -\newcommand*\setCJKmonoscale{ - \xecjk_setmonoscale: - \addCJKfontfeatures{Scale=\fp_use:N\g_xecjk_monoscale_fp} -} - -\DeclareRobustCommand\setCJKmonoscalefont[2][]{ - \xecjk_setmonoscale: - \xeCJK@newfontfamily{\CJKttdefault}[#1,Scale=\fp_use:N \g_xecjk_monoscale_fp]{#2}} - -\cs_new:Nn \xecjk_set_monoexspace: -{ - \fp_gset_eq:NN \g_xecjk_monoscale_fp \c_one_fp - \group_begin: - \fontfamily\ttdefault\selectfont - \dim_gset:Nn \g_xecjk_exspace_dim {\c_two\fontdimen\c_two\font - \f@size\p@} - \group_end: -} - -\newcommand*\setCJKmonoexspace{ - \xecjk_set_monoexspace: -} - -\cs_new:Nn \xecjk_fixed_ecglue: -{ - \skip_horizontal:N .5\g_xecjk_exspace_dim -} - -\cs_new:Nn \xecjk_fixed_cjkglue: -{ - \skip_horizontal:N \g_xecjk_exspace_dim -} - -\tl_set_eq:NN \l_xecjk_flexible_punctstyle_tl \xeCJK@punctstyle -\cs_set_eq:NN \xecjk_flexible_ecglue: \CJKecglue -\cs_set_eq:NN \xecjk_flexible_cjkglue: \CJKglue - -\newcommand*\CJKfixedspacing{ - \unless\ifnum \xeCJK@punctstyle = \xeCJK@ps@plain - \tl_set_eq:NN \l_xecjk_flexible_punctstyle_tl \xeCJK@punctstyle -\punctstyle{plain} - \fi - \unless\ifx \CJKecglue \xecjk_fixed_ecglue: - \cs_set_eq:NN \xecjk_flexible_ecglue: \CJKecglue - \let \CJKecglue \xecjk_fixed_ecglue: - \fi - \unless\ifx \CJKglue \xecjk_fixed_cjkglue: - \cs_set_eq:NN \xecjk_flexible_cjkglue: \CJKglue - \let \CJKglue \xecjk_fixed_cjkglue: - \fi -} - -\newcommand*\CJKflexiblespacing{ - \let \xeCJK@punctstyle \l_xecjk_flexible_punctstyle_tl - \let \CJKecglue \xecjk_flexible_ecglue: - \let \cjkglue \xecjk_flexible_cjkglue: -} - -\DeclareRobustCommand\setCJKmonoexspacefont[2][]{ - \xecjk_set_monoexspace: - \xeCJK@newfontfamily{\CJKttdefault}[#1]{#2}} - -\def\xeCJK@ifplus#1{\@ifnextchar +{\@firstoftwo{#1}}} - -\DeclareRobustCommand\setCJKmonofont{\@ifstar - {\setCJKmonoscalefont} - {\xeCJK@ifplus - {\setCJKmonoexspacefont} - {\xeCJK@newfontfamily{\CJKttdefault}}}} - -\AtBeginDocument{ - \tl_put_right:Nn \verbatim@font { - \CJKfixedspacing - } -} - -\ExplSyntaxOff - - -\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 - -\def\CJK@ifundefined#1{ - \ifx #1\@undefined - \expandafter\@firstoftwo - \else - \expandafter\@secondoftwo - \fi -} - -\newcommand{\xeCJKcaption}[2][]{ - \edef\xeCJK@temp{#1} - \ifx\xeCJK@temp\@empty - \else - \XeTeXdefaultencoding "#1" - \fi - \makeatletter - \input{#2.cpx} - \makeatother - \XeTeXdefaultencoding "UTF-8"} - -\endlinechar `\^^M -\catcode "FEFF=9\relax -\endinput + \tl_set:Nx \l_xeCJK_lastpunct_tl {#1} + \CJKpunctsymbol {#1} + } +\cs_new_nopar:Nn \xeCJK_FullRight_and_FullLeft:N + { + \xeCJK_punct_rule:n { r/\l_xeCJK_lastpunct_tl } + \xeCJK_get_punct_bounds:nN { l } {#1} + \xeCJK_get_kern:VN \l_xeCJK_lastpunct_tl {#1} + \xeCJK_punct_kern:n { \l_xeCJK_lastpunct_tl - #1 } + \xeCJK_punct_nobreak: + \xeCJK_before_FullLeft:N {#1} + } +\cs_new_nopar:Nn \xeCJK_FullRight_and_FullRight:N + { + \xeCJK_punct_rule:n { r/\l_xeCJK_lastpunct_tl } + \xeCJK_get_punct_bounds:nN { r } {#1} + \xeCJK_get_kern:VN \l_xeCJK_lastpunct_tl {#1} + \xeCJK_punct_kern:n { \l_xeCJK_lastpunct_tl - #1 } + \nobreak + \tl_set:Nx \l_xeCJK_lastpunct_tl {#1} + \CJKpunctsymbol {#1} + } +\cs_new_nopar:Nn \xeCJK_CJK_kern: { \tex_kern:D -1 sp \tex_kern:D 1 sp } +\cs_new_nopar:Nn \xeCJK_CJK_space_kern: { \tex_kern:D -2 sp \tex_kern:D 2 sp } +\cs_new_nopar:Nn \xeCJK_default_kern: { \tex_kern:D -3 sp \tex_kern:D 3 sp } +\cs_new_nopar:Nn \xeCJK_default_space_kern: { \tex_kern:D -4 sp \tex_kern:D 4 sp } +\keys_define:nn { xeCJK / options } { CJKglue .tl_set_x:N = \CJKglue } +\keys_define:nn { xeCJK / options } + { + CJKecglue .code:n = + { + \cs_set:Npx \CJKecglue {#1} + \settowidth \l_xeCJK_ecglue_dim \CJKecglue + }, + xCJKecglue .choice:, + xCJKecglue / true .code:n = + { + \bool_set_true:N \l_xeCJK_xecglue_bool + \cs_set_eq:NN \xeCJK_space_or_xecglue: \CJKecglue + }, + xCJKecglue / false .code:n = + { + \bool_set_false:N \l_xeCJK_xecglue_bool + \cs_set_eq:NN \xeCJK_space_or_xecglue: \c_space_token + }, + xCJKecglue / unknown .code:n = + { + \bool_set_true:N \l_xeCJK_xecglue_bool + \cs_set:Npx \CJKecglue {#1} + \settowidth \l_xeCJK_ecglue_dim \CJKecglue + \cs_set_eq:NN \xeCJK_space_or_xecglue: \CJKecglue + }, + xCJKecglue .default:n = { true } , + } +\dim_new:N \l_xeCJK_ecglue_dim +\bool_new:N \l_xeCJK_xecglue_bool +\keys_define:nn { xeCJK / options } + { + CJKspace .choice:, + CJKspace / true .code:n = { \CJKspace }, + CJKspace / false .code:n = { \CJKnospace }, + CJKspace .default:n = { true }, + space .meta:n = { CJKspace = true }, + nospace .meta:n = { CJKspace = false }, + } +\NewDocumentCommand \CJKspace { } + { + \bool_set_true:N \l_xeCJK_space_bool + \cs_set_eq:NN \xeCJK_ignorespaces: \xeCJK_peek_math: + } +\NewDocumentCommand \CJKnospace { } + { + \bool_set_false:N \l_xeCJK_space_bool + \cs_set_eq:NN \xeCJK_ignorespaces: \xeCJK_ignore_spaces: + } +\cs_new_nopar:Nn \xeCJK_ignore_spaces: + { + \peek_catcode:NTF \c_space_token + { + \int_compare:nNnT \tex_lastkern:D = \c_one + { \tex_unkern:D \tex_unkern:D { \xeCJK_CJK_space_kern: } } + \peek_catcode_ignore_spaces:NTF \c_math_toggle_token + { \xeCJK_space_or_xecglue: } + { \bool_if:nT { \token_if_cs_p:N \l_peek_token } \xeCJK_space_or_xecglue: } + } + { + \token_if_math_toggle:NTF \l_peek_token \CJKecglue + { \cs_if_exist:NF \l_peek_token \exp_not:N } + } + } +\cs_new_nopar:Nn \xeCJK_peek_math: + { + \peek_catcode:NTF \c_space_token + { + \int_compare:nNnT \tex_lastkern:D = \c_one + { \tex_unkern:D \tex_unkern:D { \xeCJK_CJK_space_kern: } } + \peek_catcode_ignore_spaces:NF \c_space_token { \xeCJK_space_or_xecglue: } + } + { + \token_if_math_toggle:NTF \l_peek_token \CJKecglue + { \cs_if_exist:NF \l_peek_token \exp_not:N } + } + } +\keys_define:nn { xeCJK / options } + { + CheckSingle .choice:, + CheckSingle / true .code:n = { \xeCJKenablechecksingle }, + CheckSingle / false .code:n = { \xeCJKdisablechecksingle }, + CheckSingle .default:n = { true }, + CJKchecksingle .meta:n = { CheckSingle = true } , + CheckSingleglue .tl_set_x:N = { \CJKchecksingleglue }, + } +\bool_new:N \l_xeCJK_checksingle_bool +\NewDocumentCommand \xeCJKenablechecksingle { } + { + \bool_if:NF \l_xeCJK_checksingle_bool + { + \bool_set_true:N \l_xeCJK_checksingle_bool + \cs_set_eq:NN \xeCJK_checksingle_save_CJKsymbol:N \xeCJK_CJK_and_CJK:N + \cs_set_eq:NN \xeCJK_checksingle_save_CJKglue \CJKglue + \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \xeCJK_checksingle:N + \cs_set_nopar:Npn \CJKglue { \CJKchecksingleglue } + } + } +\NewDocumentCommand \xeCJKdisablechecksingle { } + { + \bool_if:NT \l_xeCJK_checksingle_bool + { + \bool_set_false:N \l_xeCJK_checksingle_bool + \cs_set_eq:NN \CJKglue \xeCJK_checksingle_save_CJKglue + \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \xeCJK_checksingle_save_CJKsymbol:N + } + } +\cs_new_nopar:Nn \xeCJK_checksingle:N + { + \peek_catcode:NTF \c_catcode_other_token + { \xeCJK_checksingle:NN {#1} } + { + \bool_if:nTF + { + \tl_if_empty_p:x { \token_get_arg_spec:N \l_peek_token } && + \exp_args:No \tl_if_single_token_p:n \l_peek_token && + \exp_after:wN \token_if_other_p:N \l_peek_token + } + { \xeCJK_checksingle:NN {#1} } + { \xeCJK_checksingle_save_CJKsymbol:N {#1} } + } + } +\cs_new_nopar:Nn \xeCJK_checksingle:NN + { + \peek_catcode:NTF \c_catcode_other_token + { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2 } + { + \bool_if:nTF + { + \token_if_space_p:N \l_peek_token || + \token_if_math_toggle_p:N \l_peek_token || + \token_if_cs_p:N \l_peek_token + } + { + \bool_if:nTF { \token_if_space_p:N \l_peek_token } + { + \peek_catcode_ignore_spaces:NTF \c_catcode_other_token + { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2 \c_space_token } + { + \bool_if:nTF + { + \token_if_math_toggle_p:N \l_peek_token || + \token_if_cs_p:N \l_peek_token + } + { \xeCJK_checksingle:NNN {#1} {#2} \c_space_token } + { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2 \c_space_token } + } + } + { \xeCJK_checksingle:NNN {#1} {#2} { } } + } + { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2 } + } + } +\cs_new_nopar:Nn \xeCJK_checksingle:NNN + { + \bool_if:nTF + { + \token_if_eq_meaning_p:NN \l_peek_token \par || + \token_if_eq_meaning_p:NN \l_peek_token \[ % \] + } + { \CJKsymbol {#1} \nobreak #2 } + { \xeCJK_checksingle_env:NNN {#1} {#2} {#3} } + } +\cs_new_nopar:Nn \xeCJK_checksingle_env:NNN + { + \peek_catcode_remove:NTF \c_math_toggle_token + { + \peek_catcode:NTF \c_math_toggle_token + { \CJKsymbol {#1} \nobreak #2 \c_math_toggle_token } + { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2#3 \c_math_toggle_token } + } + { + \peek_meaning_remove:NTF \begin + { \xeCJK_checksingle_env:NNNNn {#1} {#2} {#3} \begin } + { + \peek_meaning_remove:NTF \end + { \xeCJK_checksingle_env:NNNNn {#1} {#2} {#3} \end } + { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2#3 } + } + } + } +\cs_new_nopar:Nn \xeCJK_checksingle_env:NNNNn + { + \clist_if_in:NnTF \g_xeCJK_inline_env_clist {#5} + { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2#3 } + { \CJKsymbol {#1} \nobreak #2 } + \scan_stop: #4 {#5} + } +\clist_new:N \g_xeCJK_inline_env_clist +\keys_define:nn { xeCJK / options } + { + InlineEnv .clist_gset:N = \g_xeCJK_inline_env_clist , + InlineEnv+ .code:n = + { + \clist_gput_right:Nx \g_xeCJK_inline_env_clist {#1} + \clist_gremove_duplicates:N \g_xeCJK_inline_env_clist + }, + InlineEnv- .code:n = + { + \clist_map_inline:xn {#1} + { \clist_gremove_all:Nn \g_xeCJK_inline_env_clist {##1} } + }, + } +\tl_new:N \xeCJK_UL_subclass_patch_tl +\clist_new:N \g_xeCJK_CJK_subclass_clist +\cs_new_nopar:Nn \xeCJK_erase_CJKsymbol: + { + \cs_gset_eq:NN \CJKsymbol_Block \CJKsymbol + \cs_gset_eq:NN \CJKsymbol \prg_do_nothing: + } +\cs_new_nopar:Nn \xeCJK_restore_CJKsymbol: + { + \cs_gset_eq:NN \CJKsymbol \CJKsymbol_Block + \CJKsymbol + } +\NewDocumentCommand \xeCJKDeclareSubCJKBlock { m m } + { \xeCJKDeclareSubCharClass { CJK } {#1} {#2} } +\@onlypreamble \xeCJKDeclareSubCJKBlock +\bool_new:N \l_xeCJK_sub_cancel_bool +\NewDocumentCommand \xeCJKCancelSubCJKBlock { m } + { + \bool_if:NF \l_xeCJK_sub_cancel_bool + { + \bool_set_true:N \l_xeCJK_sub_cancel_bool + \xeCJK_sub_restore_or_cancel:n {#1} + } + } +\NewDocumentCommand \xeCJKRestoreSubCJKBlock { m } + { + \bool_if:NT \l_xeCJK_sub_cancel_bool + { + \bool_set_false:N \l_xeCJK_sub_cancel_bool + \xeCJK_sub_restore_or_cancel:n {#1} + } + } +\cs_new_nopar:Nn \xeCJK_sub_restore_or_cancel:n + { + \clist_map_inline:xn {#1} + { + \cs_if_free:cTF { xeCJK_ CJK/##1 _class } + { \xeCJK_error:nx { SubBlock-undefined } {##1} } + { + \xeCJKDeclareCharClass + { CJK \bool_if:NF \l_xeCJK_sub_cancel_bool { /##1 } } + { \clist_use:c { g_xeCJK_CJK/##1_range_clist } } + } + } + } +\xeCJK_msg_new:nn { SubBlock-undefined } + { + The~CJK~sub~block~'#1'~is~undefined.\\\\ + Try~to~use~\token_to_str:N \xeCJKDeclareSubCJKBlock \c_space_tl + to~declare~it. + } +\NewDocumentCommand \xeCJKDeclareSubCharClass + { > { \TrimSpaces } m > { \TrimSpaces } m m } + { + \cs_if_free:cT { xeCJK_ #1/#2 _class } + { + \xeCJK_new_class:n { #1/#2 } + \xeCJK_set_sub_class_toks:nn {#1} {#2} + \xeCJK_new_sub_key:n {#2} + \xeCJK_UL_subclass_patch:nn {#1} {#2} + } + \xeCJKDeclareCharClass { #1/#2 } {#3} + } +\@onlypreamble \xeCJKDeclareSubCharClass +\cs_new_nopar:Nn \xeCJK_set_sub_class_toks:nn + { + \clist_map_inline:Nn \g_xeCJK_base_class_clist + { + \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } {##1} {#1} {##1} + \xeCJK_copy_inter_class_toks:nnnn {##1} { #1/#2 } {##1} {#1} + \str_if_eq:xxTF {##1} { CJK } + { + \xeCJK_pre_inter_class_toks:nnn {##1} { #1/#2 } + { \xeCJK_switch_font:nn {#1} {#2} } + } + { + \xeCJK_pre_inter_class_toks:nnn {##1} { #1/#2 } + { \xeCJK_erase_CJKsymbol: } + \xeCJK_app_inter_class_toks:nnn {##1} { #1/#2 } + { \xeCJK_switch_font:nn {#1} {#2} \xeCJK_restore_CJKsymbol: } + } + } + \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } { #1/#2 } {#1} {#1} + \clist_if_empty:NF \g_xeCJK_CJK_subclass_clist + { + \clist_map_inline:Nn \g_xeCJK_CJK_subclass_clist + { + \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } { #1/##1 } {#1} {#1} + \xeCJK_copy_inter_class_toks:nnnn { #1/##1 } { #1/#2 } {#1} {#1} + \xeCJK_pre_inter_class_toks:nnn { #1/#2 } { #1/##1 } + { \xeCJK_switch_font:nn {#2} {##1} } + \xeCJK_pre_inter_class_toks:nnn { #1/##1 } { #1/#2 } + { \xeCJK_switch_font:nn {##1} {#2} } + } + } + \clist_gput_right:Nn \g_xeCJK_CJK_subclass_clist {#2} + \xeCJK_save_CJK_class:n { #1/#2 } + \clist_map_inline:nn { CJK, FullLeft, FullRight } + { + \xeCJK_pre_inter_class_toks:nnn { #1/#2 } {##1} + { \xeCJK_switch_font:nn {#2} {#1} } + } + } +\cs_new_nopar:Nn \xeCJK_UL_subclass_patch:nn + { + \tl_put_right:Nn \xeCJK_UL_subclass_patch_tl + { + \clist_map_inline:nn { Default, HalfLeft, HalfRight } + { + \str_if_eq:xxTF {##1} { HalfLeft } + { \xeCJK_inter_class_toks:nnn {#1} { #1/#2 } { \CJKecglue \CJKsymbol } } + { \xeCJK_inter_class_toks:nnn {#1} { #1/#2 } { \CJKsymbol } } + \xeCJK_inter_class_toks:nnn { Boundary } { #1/#2 } + { + \xeCJK_erase_CJKsymbol: + \xeCJK_Boundary_and_CJK: + \xeCJK_switch_font:nn {#1} {#2} + \xeCJK_restore_CJKsymbol: + } + } + } + } +\clist_new:N \g_xeCJK_punctstyle_clist +\clist_set:Nn \g_xeCJK_punctstyle_clist + { CCT , halfwidth , fullwidth , marginkerning , mixedwidth , plain } +\clist_map_inline:Nn \g_xeCJK_punctstyle_clist + { \tl_const:cn { c_xeCJK_ps_#1_tl } {#1} } +\cs_generate_variant:Nn \keys_choices_generate:n { V } +\cs_new_protected:cpn { \c_keys_props_root_tl .generate_choices:V } #1 + { \keys_choices_generate:V {#1} } +\keys_define:nn { xeCJK / options } + { + AllowBreakBetweenPuncts .choice:, + AllowBreakBetweenPuncts / true .code:n = { \xeCJKallowbreakbetweenpuncts }, + AllowBreakBetweenPuncts / false .code:n = { \xeCJKnobreakbetweenpuncts }, + AllowBreakBetweenPuncts .default:n = { true }, + KaiMingPunct .code:n = { \xeCJK_set_special_punct:nn { mixedwidth } {#1} }, + KaiMingPunct+ .code:n = { \xeCJK_add_special_punct:nn { mixedwidth } {#1} }, + KaiMingPunct- .code:n = { \xeCJK_sub_special_punct:nn { mixedwidth } {#1} }, + LongPunct .code:n = { \xeCJK_set_special_punct:nn { long } {#1} }, + LongPunct+ .code:n = { \xeCJK_add_special_punct:nn { long } {#1} }, + LongPunct- .code:n = { \xeCJK_sub_special_punct:nn { long } {#1} }, + MiddlePunct+ .code:n = { \xeCJK_add_special_punct:nn { middle } {#1} }, + MiddlePunct .code:n = { \xeCJK_set_special_punct:nn { middle } {#1} }, + MiddlePunct- .code:n = { \xeCJK_sub_special_punct:nn { middle } {#1} }, + PunctWidth .tl_gset:N = \g_xeCJK_punct_width_tl , + PunctStyle .choice_code:n = + { + \tl_set:Nx \l_xeCJK_punctstyle_tl { \l_keys_choice_tl } + \tl_if_eq:NNT \l_xeCJK_punctstyle_tl \c_xeCJK_ps_plain_tl + { \xeCJKallowbreakbetweenpuncts } + }, + PunctStyle .generate_choices:V = \g_xeCJK_punctstyle_clist, + PunctStyle / banjiao .meta:n = { PunctStyle = halfwidth }, + PunctStyle / quanjiao .meta:n = { PunctStyle = fullwidth }, + PunctStyle / kaiming .meta:n = { PunctStyle = mixedwidth }, + PunctStyle / hangmobanjiao .meta:n = { PunctStyle = marginkerning }, + PunctStyle / unknown .code:n = + { \xeCJK_error:nx { PunctStyle-undefined } \l_keys_value_tl }, + } +\xeCJK_msg_new:nn { PunctStyle-undefined } + { + Punctstyle~"#1"~is~not~available. \\\\ + You~can~only~use~one~of\\\\ + "\g_xeCJK_punctstyle_clist".\\ + } +\NewDocumentCommand \xeCJKallowbreakbetweenpuncts { } + { \cs_set_eq:NN \xeCJK_punct_nobreak: \xeCJK_zero_glue: } +\NewDocumentCommand \xeCJKnobreakbetweenpuncts { } + { \cs_set_eq:NN \xeCJK_punct_nobreak: \nobreak } +\cs_new_protected_nopar:Nn \xeCJK_zero_glue: { \skip_horizontal:N \c_zero_skip } +\clist_set:Nn \g_xeCJK_special_ps_clist { mixedwidth , long , middle } +\clist_map_inline:Nn \g_xeCJK_special_ps_clist + { + \tl_new:c { l_xeCJK_#1_punct_tl } + \prop_new:c { l_xeCJK_#1_punct_prop } + } +\cs_new_nopar:Nn \xeCJK_set_special_punct:nn + { + \tl_set:cx { l_xeCJK_#1_punct_tl } {#2} + \prop_clear:c { l_xeCJK_#1_punct_prop } + \tl_map_inline:cn { l_xeCJK_#1_punct_tl } + { \prop_put:cnn { l_xeCJK_#1_punct_prop } {##1} { } } + } +\cs_new_nopar:Nn \xeCJK_add_special_punct:nn + { + \tl_put_right:cx { l_xeCJK_#1_punct_tl } {#2} + \tl_map_inline:cn { l_xeCJK_#1_punct_tl } + { \prop_put:cnn { l_xeCJK_#1_punct_prop } {##1} { } } + } +\cs_new_nopar:Nn \xeCJK_sub_special_punct:nn + { + \tl_map_inline:xn {#2} + { + \tl_remove_all:cn { l_xeCJK_#1_punct_tl } {##1} + \prop_del:cn { l_xeCJK_#1_punct_prop } {##1} + } + } +\cs_generate_variant:Nn \tl_map_inline:nn { x } +\cs_generate_variant:Nn \dim_set:Nn { Nc } +\cs_generate_variant:Nn \dim_add:Nn { Nc } +\cs_generate_variant:Nn \dim_set_min:Nn { Nc } +\tl_set:Nn \l_xeCJK_punct_coor_tl { \l_xeCJK_font_coor_tl/\l_xeCJK_punctstyle_tl } +\cs_new_nopar:Nn \xeCJK_get_punct_bounds:nN + { + \tl_if_exist:cF { \l_xeCJK_punct_coor_tl/rule/#1/#2 } + { + \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_plain_tl + { + \clist_map_inline:nn { glue , rule , bound } + { \tl_gset:cV { \l_xeCJK_punct_coor_tl/##1/#1/#2 } \c_zero_dim } + \tl_gset:cV { \l_xeCJK_punct_coor_tl/rule/m/#2 } \c_zero_dim + } + { + \tl_if_exist:cF { \l_xeCJK_punct_coor_tl/bound/#1/#2 } + { { \xeCJK_select_font: \xeCJK_get_punct_dimen:N {#2} } } + \xeCJK_punct_if_long:NTF {#2} + { + \dim_zero:N \l_tmpa_dim + \dim_zero:N \l_tmpb_dim + \dim_zero:N \l_tmpc_dim + } + { + \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/#1/#2 } + \dim_set:Nc \l_tmpb_dim + { \l_xeCJK_punct_coor_tl/bound/\str_if_eq:xxTF {#1} lrl/#2 } + \dim_set:Nn \l_tmpc_dim + { + \tl_if_exist:cTF { g_xeCJK_punct_width/#2 } + { \tl_use:c { g_xeCJK_punct_width/#2 } } + { + \tl_if_blank:xTF \g_xeCJK_punct_width_tl + { \c_zero_dim } + { \g_xeCJK_punct_width_tl } + } + } + \xeCJK_punct_if_middle:NTF {#2} + { + \dim_set:Nn \l_tmpc_dim + { + \dim_compare:nNnTF \l_tmpc_dim > \c_zero_dim + { \l_tmpc_dim } + { + \prg_case_tl:Nnn \l_xeCJK_punctstyle_tl + { + \c_xeCJK_ps_halfwidth_tl { .5 em } + \c_xeCJK_ps_mixedwidth_tl { .5 em } + \c_xeCJK_ps_CCT_tl { .7 em } + \c_xeCJK_ps_fullwidth_tl { 1 em } + } + { 1 em } + } + - \tl_use:c { \l_xeCJK_punct_coor_tl/dimen/#2 } + } + \dim_set:Nn \l_tmpc_dim { .5 \l_tmpc_dim } + } + { + \dim_compare:nNnTF \l_tmpc_dim > \c_zero_dim + { + \dim_set:Nn \l_tmpc_dim + { + \l_tmpc_dim - \l_tmpb_dim + - \tl_use:c { \l_xeCJK_punct_coor_tl/dimen/#2 } + } + } + { + \dim_set_eq:NN \l_tmpc_dim \l_tmpa_dim + \dim_set_min:Nn \l_tmpc_dim \l_tmpb_dim + \prg_case_tl:Nnn \l_xeCJK_punctstyle_tl + { + \c_xeCJK_ps_halfwidth_tl { \prg_do_nothing: } + \c_xeCJK_ps_mixedwidth_tl + { + \xeCJK_punct_if_mixedwidth:NT {#2} + { + \dim_add:Nn \l_tmpc_dim { .5 \l_tmpa_dim } + \dim_set_min:Nn \l_tmpc_dim \l_tmpa_dim + } + } + \c_xeCJK_ps_CCT_tl + { + \xeCJK_punct_if_mixedwidth:NTF {#2} + { \dim_add:Nn \l_tmpc_dim { .5 \l_tmpa_dim } } + { \dim_add:Nn \l_tmpc_dim { .3 \l_tmpa_dim } } + \dim_set_min:Nn \l_tmpc_dim \l_tmpa_dim + } + } + { \dim_set_eq:NN \l_tmpc_dim \l_tmpa_dim } + } + } + \dim_set_max:Nn \l_tmpc_dim \c_zero_dim + } + \tl_gset:cx { \l_xeCJK_punct_coor_tl/rule/#1/#2 } + { - \dim_use:N \l_tmpa_dim } + \tl_gset:cx { \l_xeCJK_punct_coor_tl/rule/m/#2 } + { - \dim_use:N \l_tmpb_dim } + \tl_gset:cV { \l_xeCJK_punct_coor_tl/glue/#1/#2 } \l_tmpc_dim + } + } + } +\cs_generate_variant:Nn \xeCJK_get_punct_bounds:nN { nV } +\NewDocumentCommand \xeCJKsetwidth { m m } + { \tl_map_inline:xn {#1} { \tl_gset:cn { g_xeCJK_punct_width/##1 } {#2} } } +\prg_new_conditional:Nnn \xeCJK_punct_if_right:N { p , T , F , TF } + { + \tl_if_exist:cTF { \l_xeCJK_punct_coor_tl/glue/r/#1 } + \prg_return_true: \prg_return_false: + } +\prg_new_conditional:Nnn \xeCJK_punct_if_both_left_right:NN { p , T , F , TF } + { + \bool_if:nTF + { + ( \tl_if_exist_p:c { \l_xeCJK_punct_coor_tl/glue/r/#1 } && + \tl_if_exist_p:c { \l_xeCJK_punct_coor_tl/glue/r/#2 } ) || + ( \tl_if_exist_p:c { \l_xeCJK_punct_coor_tl/glue/l/#1 } && + \tl_if_exist_p:c { \l_xeCJK_punct_coor_tl/glue/l/#2 } ) + } + \prg_return_true: \prg_return_false: + } +\cs_generate_variant:Nn \prg_new_conditional:Nnn { c } +\clist_map_inline:Nn \g_xeCJK_special_ps_clist + { + \prg_new_conditional:cnn { xeCJK_punct_if_#1:N } { p , T , F , TF } + { + \prop_if_in:cnTF { l_xeCJK_#1_punct_prop } {##1} + \prg_return_true: \prg_return_false: + } + } +\cs_new_nopar:Nn \xeCJK_get_kern:NN + { + \tl_if_exist:cF { \l_xeCJK_punct_coor_tl/kern/#1-#2 } + { + \dim_zero:N \l_tmpa_dim + \tl_if_eq:NNF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_plain_tl + { + \tl_if_exist:cTF { g_xeCJK_punct/kern/#1-#2 } + { \dim_set:Nc \l_tmpa_dim { g_xeCJK_punct/kern/#1-#2 } } + { \xeCJK_calc_kern:NN {#1} {#2} } + } + \tl_gset:cV { \l_xeCJK_punct_coor_tl/kern/#1-#2 } \l_tmpa_dim + } + } +\cs_new_nopar:Nn \xeCJK_calc_kern:NN + { + \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_marginkerning_tl + { + \xeCJK_punct_if_right:NT {#1} + { \dim_add:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } } + \xeCJK_punct_if_right:NF {#2} + { \dim_add:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } } + } + { + \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_fullwidth_tl + { \xeCJK_calc_kern:NnNN \l_tmpa_dim { 1.5 em } {#1} {#2} } + { + \xeCJK_punct_if_both_left_right:NNTF {#1} {#2} + { + \xeCJK_punct_if_mixedwidth:NT {#1} + { + \xeCJK_calc_kern:NnNN \l_tmpa_dim { 1 em } {#1} {#2} + \dim_compare:nNnT \l_tmpa_dim < { .1 em } + { \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } } + } + } + { + \bool_if:nTF + { + \xeCJK_punct_if_mixedwidth_p:N {#1} && + ! ( \tl_if_eq_p:NN \l_xeCJK_punctstyle_tl \c_xeCJK_ps_halfwidth_tl ) + } + { + \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/glue/r/#1 } + \dim_set:Nn \l_tmpa_dim { .7 \l_tmpa_dim } + } + { + \xeCJK_calc_kern:NnNN \l_tmpa_dim { 1 em } {#1} {#2} + \dim_compare:nNnT \l_tmpa_dim < { .1 em } + { + \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } + \dim_set_min:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } + \dim_set:Nc \l_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } + \dim_set_min:Nc \l_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/r/#2 } + \dim_set_max:Nn \l_tmpa_dim \l_tmpb_dim + } + } + } + } + \bool_if:nT + { \xeCJK_punct_if_long_p:N {#1} || \xeCJK_punct_if_long_p:N {#2} } + { \dim_set_max:Nn \l_tmpa_dim { .1 em } } + } + \dim_set_max:Nn \l_tmpa_dim \c_zero_dim + } +\cs_generate_variant:Nn \xeCJK_get_kern:NN { V } +\cs_new_nopar:Nn \xeCJK_calc_kern:NnNN + { + \dim_set:Nn #1 + { + #2 + - \tl_use:c { \l_xeCJK_punct_coor_tl/ + \xeCJK_punct_if_right:NTF {#3} { bound } { glue } /l/#3 } + - \tl_use:c { \l_xeCJK_punct_coor_tl/ + \xeCJK_punct_if_right:NTF {#4} { glue } { bound } /r/#4 } + - \tl_use:c { \l_xeCJK_punct_coor_tl/dimen/#3 } + - \tl_use:c { \l_xeCJK_punct_coor_tl/dimen/#4 } + \xeCJK_punct_if_both_left_right:NNT {#3} {#4} + { + \tl_use:c { \l_xeCJK_punct_coor_tl/rule/m/#4 } } + } + } +\cs_new_nopar:Nn \xeCJK_get_punct_dimen:N + { + \xeCJK_get_glyph_bounds:nNN { left } {#1} \l_tmpa_dim + \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/l/#1 } \l_tmpa_dim + \dim_set_eq:NN \l_tmpb_dim \l_tmpa_dim + \xeCJK_get_glyph_bounds:nNN { right } {#1} \l_tmpa_dim + \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/r/#1 } \l_tmpa_dim + \dim_add:Nn \l_tmpb_dim \l_tmpa_dim + \tl_gset:cx { \l_xeCJK_punct_coor_tl/dimen/#1 } + { \dim_eval:n { \etex_fontcharwd:D \tex_font:D `#1 - \l_tmpb_dim } } + \bool_if:nT + { + \xeCJK_punct_if_long_p:N {#1} && + ! ( \str_if_eq_p:xx {#1} { … } || \str_if_eq_p:xx {#1} { ‥ } ) + } + { + \clist_map_inline:Nn \g_xeCJK_punctstyle_clist + { + \str_if_eq:xxF \c_xeCJK_ps_plain_tl {##1} + { + \tl_gset:cx { \l_xeCJK_font_coor_tl/##1/kern/#1-#1 } + { - \dim_use:N \l_tmpb_dim } + } + } + } + } +\cs_new_nopar:Nn \xeCJK_get_glyph_bounds:nNN + { + \dim_set:Nn #3 + { + \XeTeXglyphbounds + \prg_case_str:xxn {#1} + { + { left } { \c_one } { top } { \c_two } + { right } { \c_three } { bottom } { \c_four } + } + { \c_three } + \int_eval:n { \XeTeXcharglyph `#2 } + } + } +\NewDocumentCommand \xeCJKsetkern { m m m } + { \tl_gset:cn { g_xeCJK_punct/kern/#1-#2 } {#3} } +\keys_define:nn { xeCJK / options } + { + AutoFallBack .choice:, + AutoFallBack / true .code:n = { \xeCJKenablefallback }, + AutoFallBack / false .code:n = { \xeCJKdisablefallback }, + AutoFallBack .default:n = { true }, + fallback .meta:n = { AutoFallBack = true }, + } +\bool_new:N \l_xeCJK_fallback_bool +\NewDocumentCommand \xeCJKenablefallback { } + { + \bool_if:NF \l_xeCJK_fallback_bool + { + \bool_set_true:N \l_xeCJK_fallback_bool + \cs_set_eq:NN \xeCJK_fallback_save_CJKsymbol:N \CJKsymbol + \cs_set_eq:NN \CJKsymbol \xeCJK_fallback_testsymbol:N + } + } +\NewDocumentCommand \xeCJKdisablefallback { } + { + \bool_if:NT \l_xeCJK_fallback_bool + { + \bool_set_false:N \l_xeCJK_fallback_bool + \cs_set_eq:NN \CJKsymbol \xeCJK_fallback_save_CJKsymbol:N + } + } +\cs_new_nopar:Nn \xeCJK_fallback_testsymbol:N + { + \font_glyph_if_exist:NnTF \tex_font:D {`#1} + { \xeCJK_fallback_save_CJKsymbol:N {#1} } + { + \xeCJK_family_if_exist:nTF { \xeCJK@family/FallBack } + { { + \tl_put_right:Nn \xeCJK@family { /FallBack } + \xeCJK_select_font: + \xeCJK_fallback_testsymbol:N {#1} + } } + { + \xeCJK_warning:nx { fallback } {#1} + \xeCJK_fallback_save_CJKsymbol:N {#1} + } + } + } +\xeCJK_msg_new:nn { fallback } + { + CJKfamily~'\xeCJK@family'~ + ( \prop_get:NV \g_xeCJK_family_prop \xeCJK@family )~ + does~not~contain~glyph~'#1'~(U+\int_to_hexadecimal:n {`#1}).\\ + } +\NewDocumentCommand \setCJKfallbackfamilyfont { m O{} m } + { + \exp_args:Nx \tl_if_in:nnTF {#3} { , } + { \xeCJK_set_family_fallback:nnn {#1} {#2} {#3} } + { \xeCJK_set_family:nnn { #1/FallBack } {#2} {#3} } + } +\cs_new_nopar:Nn \xeCJK_set_family_fallback:nnn + { + \group_begin: + \tl_set:Nx \l_xeCJK_family_fb_tl {#1} + \prop_get:NVNF \g_xeCJK_family_prop \l_xeCJK_family_fb_tl \l_xeCJK_fontname_tl + { \tl_clear:N \l_xeCJK_fontname_tl } + \clist_map_inline:xn {#3} + { + \tl_put_right:Nn \l_xeCJK_family_fb_tl { /FallBack } + \xeCJK_get_sub_features:nn \l_xeCJK_family_fb_tl {##1} + \clist_put_left:cx { l_xeCJK_ \l_xeCJK_family_fb_tl _fontfeat_clist } {#2} + \xeCJK_set_family:ncc \l_xeCJK_family_fb_tl + { l_xeCJK_ \l_xeCJK_family_fb_tl _fontfeat_clist } + { l_xeCJK_ \l_xeCJK_family_fb_tl _fontname_tl } + } + \group_end: + } +\bool_new:N \g_xeCJK_AutoFakeBold_bool +\bool_new:N \g_xeCJK_AutoFakeSlant_bool +\fp_new:N \g_xeCJK_EmboldenFactor_fp +\fp_new:N \g_xeCJK_SlantFactor_fp +\keys_define:nn { xeCJK / options } + { + AutoFakeBold .choice:, + AutoFakeBold / true .code:n = + { \bool_set_true:N \g_xeCJK_AutoFakeBold_bool }, + AutoFakeBold / false .code:n = + { \bool_set_false:N \g_xeCJK_AutoFakeBold_bool }, + AutoFakeBold / unknown .code:n = + { + \bool_set_true:N \g_xeCJK_AutoFakeBold_bool + \fp_set:Nn \g_xeCJK_EmboldenFactor_fp { \l_keys_value_tl } + }, + AutoFakeBold .default:n = { true }, + AutoFakeSlant .choice:, + AutoFakeSlant / true .code:n = + { \bool_set_true:N \g_xeCJK_AutoFakeSlant_bool }, + AutoFakeSlant / false .code:n = + { \bool_set_false:N \g_xeCJK_AutoFakeSlant_bool }, + AutoFakeSlant / unknown .code:n = + { + \bool_set_true:N \g_xeCJK_AutoFakeSlant_bool + \fp_set:Nn \g_xeCJK_SlantFactor_fp { \l_keys_value_tl } + }, + AutoFakeSlant .default:n = { true }, + EmboldenFactor .fp_set:N = \g_xeCJK_EmboldenFactor_fp, + SlantFactor .fp_set:N = \g_xeCJK_SlantFactor_fp, + BoldFont .meta:n = { AutoFakeBold = true }, + boldfont .meta:n = { AutoFakeBold = true }, + SlantFont .meta:n = { AutoFakeSlant = true }, + slantfont .meta:n = { AutoFakeSlant = true }, + } +\cs_generate_variant:Nn \keys_set_known:nnN { nx } +\clist_new:N \g_xeCJK_sub_key_clist +\cs_new_nopar:Nn \xeCJK_new_sub_key:n + { + \clist_gput_right:Nx \g_xeCJK_sub_key_clist {#1} + \keys_define:nn { xeCJK / features } + { + #1 .code:n = + { + \tl_if_blank:xTF {##1} + { + \bool_set_false:c { l_xeCJK_copy_#1_bool } + \bool_set_false:c { l_xeCJK_add_#1_bool } + \tl_put_right:Nx \l_xeCJK_family_tl { /#1 } + } + { + \clist_put_right:Nx \l_xeCJK_sub_key_clist {#1} + \str_if_eq:xxTF {##1} * + { + \bool_set_true:c { l_xeCJK_copy_#1_bool } + \bool_set_false:c { l_xeCJK_add_#1_bool } + } + { + \bool_set_false:c { l_xeCJK_copy_#1_bool } + \bool_set_true:c { l_xeCJK_add_#1_bool } + \xeCJK_get_sub_features:nn {#1} {##1} + } + } + }, + #1 .default:n = \c_empty_tl, + } + } +\cs_generate_variant:Nn \xeCJK_new_sub_key:n { x } +\cs_new_nopar:Nn \xeCJK_get_sub_features:nn + { + \tl_set:Nx \l_tmpa_tl {#2} + \clist_clear:N \l_xeCJK_sub_fontfeat_clist + \xeCJK_gobble_brace:N \l_tmpa_tl + \exp_args:No \tl_if_head_eq_charcode:nNTF \l_tmpa_tl [ % ] + { + \exp_after:wN \xeCJK_get_sub_features_aux:n \l_tmpa_tl \c_empty_tl + \tl_if_blank:xT \l_xeCJK_sub_fontname_tl + { + \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_tmpa_tl + \clist_clear:N \l_xeCJK_sub_fontfeat_clist + } + } + { \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_tmpa_tl } + \tl_if_blank:xTF \l_xeCJK_sub_fontname_tl + { \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_xeCJK_fontname_tl } + { \tl_replace_all:Nnx \l_xeCJK_sub_fontname_tl * \l_xeCJK_fontname_tl } + \clist_set:cx { l_xeCJK_#1_fontfeat_clist } \l_xeCJK_sub_fontfeat_clist + \tl_set:cx { l_xeCJK_#1_fontname_tl } \l_xeCJK_sub_fontname_tl + } +\cs_new_nopar:Nn \xeCJK_gobble_brace:N + { + \exp_args:No \tl_if_head_group:nT #1 + { + \exp_after:wN \tl_set:Nn \exp_after:wN #1 #1 + \xeCJK_gobble_brace:N #1 + } + } +\cs_new_nopar:Npn \xeCJK_get_sub_features_aux:n [#1] #2 + { + \clist_set:Nx \l_xeCJK_sub_fontfeat_clist {#1} + \tl_set:Nx \l_xeCJK_sub_fontname_tl {#2} + } +\xeCJK_new_sub_key:n { FallBack } +\cs_set_protected:cpn { \c_keys_props_root_tl .clist_set_x:N } #1 + { \keys_variable_set:NnN #1 { clist } x } +\cs_set_protected:cpn { \c_keys_props_root_tl .clist_set_x:c } #1 + { \keys_variable_set:cnN {#1} { clist } x } +\cs_new_nopar:Nn \xeCJK_map_features_id:n + { \prop_get:Nn \g_xeCJK_features_id_prop { #1 } } +\prop_new:N \g_xeCJK_features_id_prop +\prop_put:Nnn \g_xeCJK_features_id_prop { bf } { Bold } +\prop_put:Nnn \g_xeCJK_features_id_prop { it } { Italic } +\prop_put:Nnn \g_xeCJK_features_id_prop { bfit } { BoldItalic } +\prop_put:Nnn \g_xeCJK_features_id_prop { sl } { Slanted } +\prop_put:Nnn \g_xeCJK_features_id_prop { bfsl } { BoldSlanted } +\prop_map_inline:Nn \g_xeCJK_features_id_prop + { + \keys_define:nn { xeCJK / features } + { + #2Font .tl_set_x:c = { l_xeCJK_fontname_#1_tl }, + #2Features .clist_set_x:c = { l_xeCJK_fontfeat_#1_clist } , + } + } +\keys_define:nn { xeCJK / features } + { + AutoFakeBold .choice:, + AutoFakeBold / false .code:n = + { \bool_set_false:N \l_xeCJK_AutoFakeBold_bool }, + AutoFakeBold / unknown .code:n = + { + \bool_set_true:N \l_xeCJK_AutoFakeBold_bool + \fp_set:Nn \l_xeCJK_EmboldenFactor_fp { \l_keys_value_tl } + }, + AutoFakeBold .default:n = { \g_xeCJK_EmboldenFactor_fp }, + AutoFakeSlant .choice:, + AutoFakeSlant / false .code:n = + { \bool_set_false:N \l_xeCJK_AutoFakeSlant_bool }, + AutoFakeSlant / unknown .code:n = + { + \bool_set_true:N \l_xeCJK_AutoFakeSlant_bool + \fp_set:Nn \l_xeCJK_SlantFactor_fp { \l_keys_value_tl } + }, + AutoFakeSlant .default:n = { \g_xeCJK_SlantFactor_fp }, + Mono .choice:, + Mono / Exspace .code:n = { \xeCJK_set_monoexspace: }, + Mono / Scale .code:n = + { + \xeCJK_set_monoscale: + \tl_set:Nx \l_xeCJK_monoscale_tl + { Scale = { \fp_use:N \g_xeCJK_monoscale_fp } } + } + } +\cs_new_nopar:Nn \xeCJK_set_init: + { + \tl_clear:N \l_xeCJK_monoscale_tl + \int_gincr:N \g_xeCJK_fontspec_int + \prop_clear:N \l_xeCJK_add_font_prop + \prop_map_inline:Nn \g_xeCJK_features_id_prop + { + \tl_clear:c { l_xeCJK_fontname_##1_tl } + \clist_clear:c { l_xeCJK_fontfeat_##1_clist } + } + \clist_clear:N \l_xeCJK_pass_features_clist + \clist_clear:N \l_xeCJK_sub_key_clist + \clist_map_inline:Nn \g_xeCJK_sub_key_clist + { + \bool_set_false:c { l_xeCJK_copy_##1_bool } + \bool_set_false:c { l_xeCJK_add_##1_bool } + } + \bool_set_eq:NN \l_xeCJK_AutoFakeBold_bool \g_xeCJK_AutoFakeBold_bool + \bool_set_eq:NN \l_xeCJK_AutoFakeSlant_bool \g_xeCJK_AutoFakeSlant_bool + \fp_set_eq:NN \l_xeCJK_EmboldenFactor_fp \g_xeCJK_EmboldenFactor_fp + \fp_set_eq:NN \l_xeCJK_SlantFactor_fp \g_xeCJK_SlantFactor_fp + } +\cs_new_protected_nopar:Nn \xeCJK_set_family:nnn + { + \group_begin: + \xeCJK_set_init: + \tl_set:Nx \l_xeCJK_family_tl {#1} + \clist_set:Nx \l_xeCJK_fontoptions_clist {#2} + \tl_set:Nx \l_xeCJK_fontname_tl {#3} + \keys_set_known:nxN { xeCJK / features } + { \g_xeCJK_default_features_clist, #2 } \l_xeCJK_pass_features_clist + \xeCJK_parse_features: + \xeCJK_pass_features: + \cs_gset_protected_nopar:cpx { xeCJK/family/\l_xeCJK_family_tl } + { + \exp_not:n { \fontspec_set_family:Nnn \l_xeCJK_fontspec_family_tl } + { \l_xeCJK_pass_features_clist } { \l_xeCJK_fontname_tl } + \prop_gput:NnV \exp_not:N \g_xeCJK_family_name_prop + { \l_xeCJK_family_tl } \exp_not:N \l_xeCJK_fontspec_family_tl + \cs_gset_protected_nopar:cpx { xeCJK/family/\l_xeCJK_family_tl } + \exp_not:n + { { + \exp_not:N \fontencoding { \g_fontspec_encoding_tl } + \exp_not:N \fontfamily { \l_xeCJK_fontspec_family_tl } + \exp_not:N \selectfont + } } + } + \xeCJK_save_family_info: + \xeCJK_add_sub_block: + \group_end: + } +\cs_generate_variant:Nn \xeCJK_set_family:nnn { ncc } +\cs_new_nopar:Nn \xeCJK_add_font:nn + { + \prop_put:Nxx \l_xeCJK_add_font_prop + { \xeCJK_map_features_id:n {#1} Font } {#2} + } +\cs_new_nopar:Nn \xeCJK_add_font_if_new:nn + { + \prop_put_if_new:Nxx \l_xeCJK_add_font_prop + { \xeCJK_map_features_id:n {#1} Font } {#2} + } +\cs_generate_variant:Nn \xeCJK_add_font:nn { nx, nc, nV, nv } +\cs_generate_variant:Nn \xeCJK_add_font_if_new:nn { nx, nc, nV, nv } +\cs_generate_variant:Nn \prop_put:Nnn { Nxx } +\cs_generate_variant:Nn \prop_get:Nn { NV } +\cs_generate_variant:Nn \prop_get:NnNF { Nx } +\cs_generate_variant:Nn \prop_get:NnNTF { Nx } +\cs_generate_variant:Nn \prop_if_in:NnF { Nx } +\cs_generate_variant:Nn \prop_put_if_new:Nnn { Nxx } +\cs_new_nopar:Nn \xeCJK_add_fake_bold:n + { + \clist_put_left:cx { l_xeCJK_fontfeat_#1_clist } + { FakeBold = { \fp_use:N \l_xeCJK_EmboldenFactor_fp } } + } +\cs_new_nopar:Nn \xeCJK_add_fake_slant:n + { + \clist_put_left:cx { l_xeCJK_fontfeat_#1_clist } + { FakeSlant = { \fp_use:N \l_xeCJK_SlantFactor_fp } } + } +\cs_new_nopar:Nn \xeCJK_parse_features: + { \prop_map_inline:Nn \g_xeCJK_features_id_prop { \xeCJK_parse_features:n {##1} } } +\cs_new_nopar:Nn \xeCJK_parse_features:n + { + \xeCJK_if_font_select:nTF {#1} + { + \xeCJK_add_font:nv {#1} { l_xeCJK_fontname_#1_tl } + \xeCJK_if_it_or_sl:nTF {#1} + { + \xeCJK_if_font_select:nF {bf#1} + { \xeCJK_add_font_if_new:nv {bf#1} { l_xeCJK_fontname_#1_tl } } + } + { + \str_if_eq:xxT {#1} {bf} + { + \clist_map_inline:nn { it , sl } + { + \xeCJK_if_font_select:nF {bf##1} + { \xeCJK_add_font:nV {bf##1} \l_xeCJK_fontname_bf_tl } + } + } + } + } + { \xeCJK_set_fake:n {#1} } + } +\prg_new_conditional:Nnn \xeCJK_if_font_select:n { p, T, F, TF } + { + \exp_args:Nc + \tl_if_blank:xTF { l_xeCJK_fontname_#1_tl } \prg_return_false: \prg_return_true: + } +\prg_new_conditional:Nnn \xeCJK_if_it_or_sl:n { p, T, F, TF } + { + \bool_if:nTF { \str_if_eq_p:xx { it } {#1} || \str_if_eq_p:xx { sl } {#1} } + \prg_return_true: \prg_return_false: + } +\cs_new_nopar:Nn \xeCJK_set_fake:n + { + \str_if_eq:xxTF {#1} { bf } + { \bool_if:NT \l_xeCJK_AutoFakeBold_bool { \xeCJK_add_fake_bold:n {#1} } } + { + \bool_if:NTF \l_xeCJK_AutoFakeSlant_bool + { + \bool_if:nT + { \xeCJK_if_it_or_sl_p:n {#1} || + ( \str_if_eq_p:xx {#1} {bfit} && ! ( \xeCJK_if_font_select_p:n {it} ) ) || + ( \str_if_eq_p:xx {#1} {bfsl} && ! ( \xeCJK_if_font_select_p:n {sl} ) ) + } + { \xeCJK_add_fake_slant:n {#1} } + } + { \xeCJK_if_it_or_sl:nT {#1} { \xeCJK_map_it_sl:n {#1} } } + \bool_if:nT + { \l_xeCJK_AutoFakeBold_bool + && ! ( \xeCJK_if_it_or_sl_p:n {#1} ) + && ! ( \xeCJK_if_font_select_p:n {bf} ) + } + { \xeCJK_add_fake_bold:n {#1} } + } + \xeCJK_add_font_if_new:nn {#1} * + } +\cs_new_nopar:Nn \xeCJK_map_it_sl:n + { + \xeCJK_if_map_font_select:nT {#1} + { + \xeCJK_add_font:nx {#1} { \xeCJK_get_map_font:n {#1} } + \xeCJK_if_font_select:nF {bf#1} + { \xeCJK_add_font_if_new:nx {bf#1} { \xeCJK_get_map_font:n {#1} } } + } + } +\cs_new_nopar:Nn \xeCJK_get_map_font:n + { \tl_use:c { l_xeCJK_fontname_\str_if_eq:xxTF {#1} {it} {sl} {it} _tl } } +\prg_new_conditional:Nnn \xeCJK_if_map_font_select:n { p, T, F, TF } + { + \tl_if_blank:xTF { \xeCJK_get_map_font:n {#1} } + \prg_return_false: \prg_return_true: + } +\cs_new_nopar:Nn \xeCJK_pass_features: + { + \prop_map_inline:Nn \g_xeCJK_features_id_prop + { + \clist_if_empty:cF { l_xeCJK_fontfeat_##1_clist } + { + \clist_put_right:Nx \l_xeCJK_pass_features_clist + { ##2Features = { \clist_use:c { l_xeCJK_fontfeat_##1_clist } } } + } + } + \prop_map_inline:Nn \l_xeCJK_add_font_prop + { \clist_put_right:Nx \l_xeCJK_pass_features_clist { ##1 = { ##2 } } } + \tl_if_blank:xF \l_xeCJK_monoscale_tl + { \clist_put_right:Nx \l_xeCJK_pass_features_clist \l_xeCJK_monoscale_tl } + } +\prop_new:N \g_xeCJK_family_prop +\prop_new:N \g_xeCJK_family_name_prop +\prop_new:N \g_xeCJK_family_options_prop +\cs_new_nopar:Nn \xeCJK_save_family_info: + { + \group_begin: + \clist_map_inline:Nn \g_xeCJK_CJK_subclass_clist + { + \clist_remove_all:Nn \l_xeCJK_fontoptions_clist {##1} + \clist_remove_all:Nn \l_xeCJK_fontoptions_clist { ##1 = } + } + \prop_gput:NVV \g_xeCJK_family_prop + \l_xeCJK_family_tl \l_xeCJK_fontname_tl + \prop_gput:NVV \g_xeCJK_family_options_prop + \l_xeCJK_family_tl \l_xeCJK_fontoptions_clist + \group_end: + } +\cs_new_nopar:Nn \xeCJK_add_sub_block: + { + \clist_remove_duplicates:N \l_xeCJK_sub_key_clist + \clist_map_inline:Nn \l_xeCJK_sub_key_clist + { + \tl_set:Nx \l_tmpa_tl { \l_xeCJK_family_tl/##1 } + \bool_if:cT { l_xeCJK_copy_##1_bool } + { + \tl_map_inline:nn { \g_xeCJK_family_prop \g_xeCJK_family_options_prop } + { + \prop_get:NVNT ####1 \l_xeCJK_family_tl \l_tmpb_tl + { \prop_gput:NVV ####1 \l_tmpa_tl \l_tmpb_tl } + } + \prop_get:NVNT \g_xeCJK_family_options_prop \l_tmpa_tl \l_tmpa_clist + { + \clist_remove_all:Nn \l_tmpa_clist { ##1 = * } + \prop_gput:NVV \g_xeCJK_family_options_prop \l_tmpa_tl \l_tmpa_clist + } + \cs_gset_protected_nopar:cpx { xeCJK/family/\l_tmpa_tl } + { + \exp_not:N \xeCJK_family_if_exist:nT { \l_xeCJK_family_tl } + { + \prop_get:NnNT \exp_not:N \g_xeCJK_family_name_prop + { \l_xeCJK_family_tl } \exp_not:N \l_tmpa_tl + { + \prop_gput:NnV \exp_not:N \g_xeCJK_family_name_prop + { \l_tmpa_tl } \exp_not:N \l_tmpa_tl + \cs_gset_protected_nopar:cpx { xeCJK/family/\l_tmpa_tl } + \exp_not:n + { { + \exp_not:N \fontencoding { \g_fontspec_encoding_tl } + \exp_not:N \fontfamily { \l_tmpa_tl } + \exp_not:N \selectfont + } } + } + } + } + } + \bool_if:cT { l_xeCJK_add_##1_bool } + { + \xeCJK_set_family:ncc \l_tmpa_tl + { l_xeCJK_##1_fontfeat_clist } { l_xeCJK_##1_fontname_tl } + } + } + } +\cs_new_nopar:Nn \xeCJK_copy_family:nn + { + \xeCJK_family_if_exist:nT {#2} + { + \tl_map_inline:nn + { \g_xeCJK_family_prop \g_xeCJK_family_options_prop \g_xeCJK_family_name_prop } + { \prop_get:NnNT ##1 {#2} \l_tmpa_tl { \prop_gput:NnV ##1 {#1} \l_tmpa_tl } } + \cs_gset_eq:cc { xeCJK/family/#1 } { xeCJK/family/#2 } + } + } +\cs_generate_variant:Nn \xeCJK_copy_family:nn { xx } +\tl_set:Nn \l_xeCJK_font_coor_tl { xeCJK/\xeCJK@family/\f@series/\f@shape/\f@size } +\cs_new_nopar:Nn \xeCJK_select_font: + { + \cs_if_exist_use:cF \l_xeCJK_font_coor_tl + { + \tl_set:Nx \l_xeCJK_current_coor_tl \l_xeCJK_font_coor_tl + \cs_if_exist_use:cT { xeCJK/family/\xeCJK@family } + { \exp_last_unbraced:NNV \cs_gset_eq:cN \l_xeCJK_current_coor_tl \font@name } + } + } +\cs_new_eq:NN \xeCJK@setfont \xeCJK_select_font: +\cs_new_nopar:Nn \xeCJK_switch_font:nn + { + \str_if_eq:xxF {#1} {#2} + { + \xeCJK_info:nxx { CJK-block } {#1} {#2} + \tl_remove_all:Nn \xeCJK@family { /#1 } + \str_if_eq:xxF {#2} { CJK } + { + \tl_set:Nx \l_tmpa_tl \xeCJK@family + \tl_put_right:Nx \xeCJK@family { /#2 } + \xeCJK_family_if_exist:nF \xeCJK@family + { + \xeCJK_family_if_exist:nTF { \CJKfamilydefault/#2 } + { \xeCJK_copy_family:xx \xeCJK@family { \CJKfamilydefault/#2 } } + { \xeCJK_copy_family:xx \xeCJK@family \l_tmpa_tl } + } + } + } + \xeCJK_select_font: + } +\xeCJK_msg_new:nn { CJK-block } { Switch~from~block~'#1'~to~'#2'. } +\prg_new_conditional:Nnn \xeCJK_family_if_exist:n { T, F, TF } + { + \cs_if_free:cTF { xeCJK/family/#1 } \prg_return_false: + { + \prop_if_in:NxF + \g_xeCJK_family_name_prop {#1} { \use:c { xeCJK/family/#1 } } + \prg_return_true: + } + } +\NewDocumentCommand \CJKfamily { m } + { + \xeCJK_family_if_exist:nTF {#1} + { \tl_set:Nx \xeCJK@family {#1} } + { + \cs_if_free:cT { xeCJK_warned_aux_#1 } + { + \xeCJK_warning:nx { CJKfamily-Unknown } {#1} + \tl_new:c { xeCJK_warned_aux_#1 } + } + } + } +\xeCJK_msg_new:nn { CJKfamily-Unknown } + { + Unknown~CJK~family~'#1'~is~ignored.\\\\ + Try~to~use~ + \prg_case_str:xxn {#1} + { + \CJKrmdefault { \token_to_str:N \setCJKmainfont } + \CJKsfdefault { \token_to_str:N \setCJKsansfont } + \CJKttdefault { \token_to_str:N \setCJKmonofont } + } + { \token_to_str:N \setCJKfamilyfont {#1} } + [...]{...}~to~define~it. + } +\NewDocumentCommand \setCJKfamilyfont { m O{} m } + { \xeCJK_set_family:nnn {#1} {#2} {#3} } +\NewDocumentCommand \newCJKfontfamily { o m O{} m } + { + \IfNoValueTF {#1} + { \tl_set:Nx \l_xeCJK_family_tl { \cs_to_str:N #2 } } + { \tl_set:Nx \l_xeCJK_family_tl {#1} } + \xeCJK_set_family:nnn \l_xeCJK_family_tl {#3} {#4} + \cs_new_protected_nopar:Npx #2 + { \exp_not:N \CJKfamily { \l_xeCJK_family_tl } } + } +\int_new:N \g_xeCJK_fontspec_int +\int_gdecr:N \g_xeCJK_fontspec_int +\NewDocumentCommand \CJKfontspec { O{} m } + { + \tl_set:Nx \l_xeCJK_CJKfontspec_id_tl { CJKfontspec/#1/#2/id } + \cs_if_free:cT \l_xeCJK_CJKfontspec_id_tl + { + \int_gincr:N \g_xeCJK_fontspec_int + \tl_gset:Nx \g_xeCJK_family_spec_tl + { CJKfontspec ( \int_use:N \g_xeCJK_fontspec_int ) } + \xeCJK_set_family:nnn \g_xeCJK_family_spec_tl {#1} {#2} + \tl_gset:cx \l_xeCJK_CJKfontspec_id_tl \g_xeCJK_family_spec_tl + } + \exp_args:Nv \CJKfamily \l_xeCJK_CJKfontspec_id_tl + \tex_ignorespaces:D + } +\clist_new:N \g_xeCJK_default_features_clist +\NewDocumentCommand \defaultCJKfontfeatures { m } + { \clist_gset:Nn \g_xeCJK_default_features_clist {#1} } +\@onlypreamble \defaultCJKfontfeatures +\NewDocumentCommand \addCJKfontfeatures { m } + { + \prop_if_in:NVTF \g_xeCJK_family_prop \xeCJK@family + { + \group_begin: + \clist_set:Nx \l_tmpa_clist {#1} + \prop_get:NVN \g_xeCJK_family_prop \xeCJK@family \l_tmpa_tl + \clist_map_inline:Nn \g_xeCJK_CJK_subclass_clist + { + \clist_if_in:NnT \l_tmpa_clist {##1} + { + \clist_remove_all:Nn \l_tmpa_clist {##1} + \prop_get:NxNF \g_xeCJK_family_prop + { \xeCJK@family/##1 } \l_tmpb_tl + { + \prop_get:NxNF \g_xeCJK_family_prop + { \CJKfamilydefault/##1 } \l_tmpb_tl + { \tl_set:Nx \l_tmpb_tl \l_tmpa_tl } + } + \clist_set:Nx \l_tmpa_clist + { ##1 = { [ \l_tmpa_clist ] { \l_tmpb_tl } } } + \clist_map_break: + } + } + \prop_get:NVNF \g_xeCJK_family_options_prop \xeCJK@family + \l_tmpb_clist { \clist_clear:N \l_tmpb_clist } + \clist_clear:N \l_tmpc_clist + \clist_map_inline:Nn \l_tmpb_clist + { + \clist_if_in:NnF \l_tmpa_clist {##1} + { \clist_put_right:Nn \l_tmpc_clist {##1} } + } + \clist_put_left:NV \l_tmpa_clist \l_tmpc_clist + \use:x + { \group_end: \exp_not:N \CJKfontspec [ \l_tmpa_clist ] { \l_tmpa_tl } } + } + { \xeCJK_warning:n { addCJKfontfeature-ignored } } + \tex_ignorespaces:D + } +\cs_new_eq:NN \addCJKfontfeature \addCJKfontfeatures +\xeCJK_msg_new:nn { addCJKfontfeature-ignored } + { + \tl_to_str:N \addCJKfontfeatures (s)~ignored.\\\\ + It~cannot~be~used~with~a~font~that~wasn't~selected~by~xeCJK. + } +\NewDocumentCommand \setCJKmainfont { O{} m } + { \xeCJK_set_family:nnn \CJKrmdefault {#1} {#2} } +\cs_new_eq:NN \setCJKromanfont \setCJKmainfont +\NewDocumentCommand \setCJKsansfont { O{} m } + { \xeCJK_set_family:nnn \CJKsfdefault {#1} {#2} } +\cs_if_free:NT \CJKrmdefault { \tl_set:Nn \CJKrmdefault { rm } } +\cs_if_free:NT \CJKsfdefault { \tl_set:Nn \CJKsfdefault { sf } } +\cs_if_free:NT \CJKttdefault { \tl_set:Nn \CJKttdefault { tt } } +\cs_if_free:NT \CJKfamilydefault { \tl_set:Nn \CJKfamilydefault { \CJKrmdefault } } +\tl_new:c { xeCJK/family/\CJKfamilydefault } +\AtEndOfPackage + { + \etex_protected:D \tl_put_right:Nn \normalfont { \CJKfamily \CJKfamilydefault } + \etex_protected:D \tl_put_right:Nn \rmfamily { \CJKfamily \CJKrmdefault } + \etex_protected:D \tl_put_right:Nn \sffamily { \CJKfamily \CJKsfdefault } + \etex_protected:D \tl_put_right:Nn \ttfamily { \CJKfamily \CJKttdefault } + \cs_set_eq:NN \reset@font \normalfont + } +\NewDocumentCommand \setCJKmathfont { O{} m } + { \xeCJK_set_family:nnn \c_xeCJK_math_tl {#1} {#2} } +\tl_const:Nn \c_xeCJK_math_tl { CJKmath } +\keys_define:nn { xeCJK / options } { CJKmath .bool_gset:N = \g_xeCJK_math_bool } +\NewDocumentCommand \xeCJKsetmathcode { m m m m } + { + \xeCJK_check_num_range:nnNN {#1} {#2} \l_tmpa_int \l_tmpb_int + \int_set:Nn \l_tmpc_int { \xeCJK_math_type:n {#3} } + \loop + \XeTeXmathcode \l_tmpa_int = \l_tmpc_int \use:c { sym #4 } \l_tmpa_int + \if_int_compare:w \l_tmpa_int < \l_tmpb_int + \int_incr:N \l_tmpa_int + \repeat + } +\cs_set_eq:NN \xeCJK_math_type:n \mathchar@type +\tl_put_left:Nn \document + { + \group_end: + \prop_if_empty:NTF \g_xeCJK_family_prop + { \xeCJK_warning:n { no-CJKfamily } } + { + \bool_if:NT \g_xeCJK_math_bool + { + \xeCJK_family_if_exist:nTF \c_xeCJK_math_tl + { \tl_set:Nx \l_tmpa_tl \c_xeCJK_math_tl } + { + \xeCJK_family_if_exist:nTF \CJKfamilydefault + { \tl_set:Nx \l_tmpa_tl \CJKfamilydefault } + { \tl_set_eq:NN \l_tmpa_tl \q_no_value } + } + \prop_get:NVNT \g_xeCJK_family_name_prop \l_tmpa_tl \l_xeCJK_math_family_tl + { + \DeclareSymbolFont \c_xeCJK_math_tl \g_fontspec_encoding_tl + \l_xeCJK_math_family_tl \mddefault \shapedefault + \SetSymbolFont \c_xeCJK_math_tl { bold } \g_fontspec_encoding_tl + \l_xeCJK_math_family_tl \bfdefault \shapedefault + \clist_map_inline:nn { CJK, FullLeft, FullRight } + { + \clist_map_inline:cn { g_xeCJK_#1_range_clist } + { + \xeCJK_setcharclass_aux:Nn \xeCJKsetmathcode {##1} + \mathalpha \c_xeCJK_math_tl + } + } + } + } + \normalfont + } + \group_begin: + } +\xeCJK_msg_new:nn { no-CJKfamily } + { + It~seems~that~you~have~not~declare~a~CJKfamily.\\ + If~you~want~to~use~xeCJK~in~the~right~way,~you~should~use\\\\ + \token_to_str:N~\xeCJKmainfont[...]{...}\\\\ + in~the~preamble~to~declare~the~main~CJKfamily.\\ + } +\@onlypreamble \setCJKmainfont +\@onlypreamble \setCJKmathfont +\@onlypreamble \setCJKsansfont +\@onlypreamble \setCJKmonofont +\@onlypreamble \setCJKromanfont +\fp_new:N \g_xeCJK_monoscale_fp +\fp_gset_eq:NN \g_xeCJK_monoscale_fp \c_one_fp +\dim_new:N \g_xeCJK_exspace_dim +\NewDocumentCommand \setCJKmonoscale { } + { + \xeCJK_set_monoscale: + \addCJKfontfeatures { Scale = \fp_use:N \g_xeCJK_monoscale_fp } + } +\cs_new_nopar:Nn \xeCJK_set_monoscale: + { + \dim_gzero:N \g_xeCJK_exspace_dim + \group_begin: + \fontfamily \ttdefault \selectfont + \fp_gset_from_dim:Nn \g_xeCJK_monoscale_fp + { \c_two \tex_fontdimen:D \c_two \tex_font:D } + \fp_gdiv:Nn \g_xeCJK_monoscale_fp \f@size + \group_end: + } +\NewDocumentCommand \setCJKmonoexspace { } { \xeCJK_set_monoexspace: } +\cs_new_nopar:Nn \xeCJK_set_monoexspace: + { + \fp_gset_eq:NN \g_xeCJK_monoscale_fp \c_one_fp + \group_begin: + \fontfamily \ttdefault \selectfont + \dim_gset:Nn \g_xeCJK_exspace_dim + { \c_two \tex_fontdimen:D \c_two \tex_font:D - \f@size \p@ } + \group_end: + } +\cs_new_nopar:Nn \xeCJK_fixed_ecglue: { \skip_horizontal:n { .5\g_xeCJK_exspace_dim } } +\cs_new_nopar:Nn \xeCJK_fixed_cjkglue: { \skip_horizontal:N \g_xeCJK_exspace_dim } +\AtEndOfPackage + { + \tl_set_eq:NN \l_xeCJK_flexible_punctstyle_tl \l_xeCJK_punctstyle_tl + \cs_new_eq:NN \xeCJK_flexible_ecglue: \CJKecglue + \cs_new_eq:NN \xeCJK_flexible_cjkglue: \CJKglue + } +\NewDocumentCommand \CJKfixedspacing { } + { + \tl_if_eq:NNF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_plain_tl + { + \tl_set_eq:NN \l_xeCJK_flexible_punctstyle_tl \l_xeCJK_punctstyle_tl + \punctstyle { plain } + } + \cs_if_eq:NNF \CJKecglue \xeCJK_fixed_ecglue: + { + \cs_set_eq:NN \xeCJK_flexible_ecglue: \CJKecglue + \cs_set_eq:NN \CJKecglue \xeCJK_fixed_ecglue: + } + \cs_if_eq:NNF \CJKglue \xeCJK_fixed_cjkglue: + { + \cs_set_eq:NN \xeCJK_flexible_cjkglue: \CJKglue + \cs_set_eq:NN \CJKglue \xeCJK_fixed_cjkglue: + } + } +\AtBeginDocument { \tl_put_right:Nn \verbatim@font \CJKfixedspacing } +\NewDocumentCommand \CJKflexiblespacing { m } + { + \cs_set_eq:NN \l_xeCJK_punctstyle_tl \l_xeCJK_flexible_punctstyle_tl + \cs_set_eq:NN \CJKecglue \xeCJK_flexible_ecglue: + \cs_set_eq:NN \CJKglue \xeCJK_flexible_cjkglue: + } +\NewDocumentCommand \setCJKmonofont { s t+ O{} m } + { + \IfBooleanTF {#1} + { \xeCJK_set_family:nnn \CJKttdefault { Mono = Scale, #3 } {#4} } + { + \IfBooleanTF {#2} + { \xeCJK_set_family:nnn \CJKttdefault { Mono = Exspace, #3 } {#4} } + { \xeCJK_set_family:nnn \CJKttdefault {#3} {#4} } + } + } +\bool_new:N \g_xeCJK_indent_bool +\keys_define:nn { xeCJK / options } + { + CJKnumber .bool_set:N = \g_xeCJK_number_bool , + indentfirst .bool_set:N = \g_xeCJK_indent_bool , + normalindentfirst .meta:n = { indentfirst = true } , + quiet .code:n = + { + \msg_redirect_module:nnn { xeCJK } { warning } { info } + \msg_redirect_module:nnn { xeCJK } { info } { none } + \PassOptionsToPackage { quiet } { fontspec } + }, + silent .code:n = + { + \msg_redirect_module:nnn { xeCJK } { warning } { none } + \msg_redirect_module:nnn { xeCJK } { info } { none } + \PassOptionsToPackage { silent } { fontspec } + }, + unknown .code:n = + { + \@ifpackageloaded { fontspec } + { \xeCJK_error:nx { key-unknown } { \l_keys_key_tl } } + { \PassOptionsToPackage { \l_keys_key_tl } { fontspec } } + }, + } +\xeCJK_msg_new:nn { key-unknown } + { + Sorry,~but~\l_keys_module_tl\c_space_tl does~not~have~a~key~called~'#1'.\\\\ + The~key~'#1'~is~being~ignored. + } +\keys_set:nn { xeCJK / options } + { + CJKglue = { \skip_horizontal:n { \c_zero_skip \@plus .08\baselineskip } } , + CJKecglue = \c_space_token , + CheckSingleglue = \CJKglue , + xCJKecglue = false , + CheckSingle = false , + CJKspace = false , + CJKmath = false , + xeCJKactive = true , + indentfirst = true , + EmboldenFactor = 4 , + SlantFactor = .167 , + PunctStyle = quanjiao , + KaiMingPunct = { . 。? ! } , + LongPunct = { — ‥ … ─ } , + MiddlePunct = { · ・ ・ } , + AllowBreakBetweenPuncts = false , + } +\cs_new_nopar:Npn \CJKsymbol #1 {#1} +\cs_new_nopar:Npn \CJKpunctsymbol #1 {#1} +\ProcessKeysOptions { xeCJK / options } +\RequirePackage { fontspec } [ 2011/09/13 ] +\bool_if:NT \g_xeCJK_indent_bool + { + \cs_set_eq:NN \@afterindentfalse \@afterindenttrue + \@afterindenttrue + } +\NewDocumentCommand \xeCJKsetup { m } + { + \keys_set:nn { xeCJK / options } {#1} + \tex_ignorespaces:D + } +\NewDocumentCommand \xeCJKsetEmboldenFactor { m } + { \xeCJKsetup { EmboldenFactor = {#1} } } +\NewDocumentCommand \xeCJKsetSlantFactor { m } + { \xeCJKsetup { SlantFactor = {#1} } } +\NewDocumentCommand \punctstyle { m } { \xeCJKsetup { PunctStyle = {#1} } } +\cs_new_nopar:Npn \xeCJKplainchr { \punctstyle { plain } } +\NewDocumentCommand \CJKsetecglue { m } { \xeCJKsetup { CJKecglue = {#1} } } +\cs_new_eq:NN \xeCJKsetecglue \CJKsetecglue +\cs_new_eq:NN \xeCJK_itcorr_aux \/ +\bool_new:N \g_xeCJK_itcorr_bool +\cs_set_protected_nopar:Npn \/ + { + \scan_stop: + \int_compare:nNnT \tex_lastkern:D = \c_three + { + \tex_unkern:D \tex_unkern:D + \bool_gset_true:N \g_xeCJK_itcorr_bool + } + \xeCJK_itcorr_aux + } +\cs_set_eq:NN \@@italiccorr \/ +\cs_new_nopar:Nn \xeCJK_compatibility_hook: + { + \int_compare:nNnF + { \c_three + \seq_length:N \g_xeCJK_class_seq } = \xe@alloc@intercharclass + { + \int_set_eq:NN \l_tmpa_int \c_three + \int_until_do:nNnn \l_tmpa_int = \xe@alloc@intercharclass + { + \int_incr:N \l_tmpa_int + \seq_if_in:NVF \g_xeCJK_class_seq \l_tmpa_int + { \xeCJK_set_others_toks:n \l_tmpa_int } + } + } + } +\cs_new_nopar:Nn \xeCJK_set_others_toks:n + { + \int_set:Nn \xeCJK_Others_class {#1} + \clist_map_inline:Nn \g_xeCJK_CJK_class_clist + { + \xeCJK_copy_inter_class_toks:nnnn {##1} { Others } {##1} { NormalSpace } + \xeCJK_copy_inter_class_toks:nnnn { Others } {##1} { NormalSpace } {##1} + \exp_args:Nnnx \xeCJK_app_inter_class_toks:nnn {##1} { Others } + { \xeCJK_get_inter_class_toks:nn { Default } { Others } } + \exp_args:Nnnx \xeCJK_pre_inter_class_toks:nnn { Others } {##1} + { \xeCJK_get_inter_class_toks:nn { Others } { Default } } + \tl_if_empty:xT { \xeCJK_get_inter_class_toks:nn { Others } { Boundary } } + { + \xeCJK_copy_inter_class_toks:nnnn + { Others } { Boundary } { Default } { Boundary } + } + \tl_if_empty:xT { \xeCJK_get_inter_class_toks:nn { Boundary } { Others } } + { + \xeCJK_copy_inter_class_toks:nnnn + { Boundary } { Others } { Boundary } { Default } + } + } + } +\int_new:N \xeCJK_Others_class +\tl_put_right:Nn \document { \xeCJK_compatibility_hook: \tex_ignorespaces:D } +\cs_new_nopar:Nn \xeCJK_patch:Nnn + { \tl_put_left:Nn #1 {#2} \tl_put_right:Nn #1 {#3} } +\AtBeginDocument + { + \tl_map_inline:nn + { + \textellipsis \textemdash \textperiodcentered \textcentereddot + \textquoteleft \textquoteright \textquotedblleft \textquotedblright + } + { \xeCJK_patch:Nnn #1 { \group_begin: \makexeCJKinactive } { \group_end: } } + \xeCJK_patch:Nnn \tipaencoding { \makexeCJKinactive } { } + \cs_set_eq:NN \xeCJK_aux_r \r + \cs_set_nopar:Npn \r #1 { { \makexeCJKinactive \xeCJK_aux_r {#1} } } + \@ifpackageloaded { pifont } + { + \RenewDocumentCommand \Pifont { m } + { + \fontencoding {U} \fontfamily {#1} \fontseries {m} \fontshape {n} + \selectfont \makexeCJKinactive + } + } { } + } +\tl_set:cn { ver@CJK.sty } { 2050/01/01 } +\cs_if_free:NT \CJK@ifundefined + { \cs_set_eq:NN \CJK@ifundefined \cs_if_free:NTF } +\NewDocumentCommand \xeCJKcaption { o m } + { + \IfValueT {#1} { \XeTeXdefaultencoding "#1" } + \cs_set_nopar:Nx \xeCJK_reset_at_catcode: + { + \exp_not:n { \char_set_catcode:nn { `\@ } } + { \char_value_catcode:n { `\@ } } + } + \char_set_catcode_letter:N \@ + \file_input:n { #2.cpx } + \xeCJK_reset_at_catcode: + \XeTeXdefaultencoding "UTF-8" + } +\cs_new_protected_nopar:Nn \xeCJK_ULprepunctchar:n + { + { \makexeCJKinactive \CJKpunctsymbol {#1} \nobreak } + \tex_ignorespaces:D + } +\cs_new_protected_nopar:Nn \xeCJK_ULpostpunctchar:n + { + { \makexeCJKinactive \CJKpunctsymbol {#1} } + \xeCJK_ignorespaces: + } +\cs_new_protected_nopar:Nn \xeCJK_ULroutines: + { + \xeCJK_inter_class_toks:nnn { Default } { CJK } { \CJKecglue \CJKsymbol } + \xeCJK_inter_class_toks:nnn { HalfLeft } { CJK } { \CJKsymbol } + \xeCJK_inter_class_toks:nnn { HalfRight } { CJK } { \CJKecglue \CJKsymbol } + \xeCJK_inter_class_toks:nnn { Boundary } { CJK } { \xeCJK_Boundary_and_CJK: } + \clist_map_inline:nn { Default, HalfLeft, HalfRight, Boundary } + { + \xeCJK_inter_class_toks:nnn {##1} { FullLeft } { \xeCJK_ULprepunctchar:n } + \xeCJK_inter_class_toks:nnn {##1} { FullRight } { \xeCJK_ULpostpunctchar:n } + } + \xeCJK_UL_subclass_patch_tl + } +\AtBeginDocument + { + \cs_if_exist:NT \UL@hook + { + \addto@hook \UL@hook + { + \cs_set_eq:NN \xeCJK_UL_CJKsymbol \CJKsymbol + \cs_set_eq:NN \xeCJK_UL_CJKpunctsymbol \CJKpunctsymbol + \cs_set_nopar:Npn \CJKsymbol #1 + { + { \xeCJK_select_font: \xeCJK_UL_CJKsymbol {#1} } + \xeCJK_CJK_kern: \xeCJK_ignorespaces: + } + \cs_set_nopar:Npn \CJKpunctsymbol #1 + { { \xeCJK_select_font: \xeCJK_UL_CJKpunctsymbol {#1} } } + \xeCJK_ULroutines: + } + } + \cs_if_exist:NT \XeTeX@CJKfntef@hook + { + \cs_set_nopar:Npn \XeTeX@CJKfntef@hook + { \xeCJK_select_font: \makexeCJKinactive } + } + } +\bool_if:NT \g_xeCJK_number_bool + { + \tl_set:Nn \CJK@UnicodeEnc { UTF8 } + \cs_set_nopar:Npn \CJKaddEncHook #1#2 { \cs_set_nopar:cpn { xeCJK_enc_#1 } {#2} } + \cs_set_nopar:Npn \Unicode #1#2 + { \tex_char:D \int_eval:n { #1 * \c_two_hundred_fifty_six + #2 } } + \RequirePackage { CJKnumb } + \use:c { xeCJK_enc_\CJK@UnicodeEnc } + \tl_set:Nn \CJK@tenthousand { 万 } + \tl_set:Nn \CJK@hundredmillion { 亿 } + } +%% %% %% End of file `xeCJK.sty'. |