diff options
author | Karl Berry <karl@freefriends.org> | 2018-01-30 21:06:15 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-01-30 21:06:15 +0000 |
commit | f223ad48afe014b1314fd294f0e099232f46b63e (patch) | |
tree | b757d99568ed6dede03f757f40094089706e23f2 /Master/texmf-dist/tex/xelatex | |
parent | 4011de170d5d27b6758bef7c7146ab7297b80301 (diff) |
xecjk (30jan18)
git-svn-id: svn://tug.org/texlive/trunk@46497 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/xelatex')
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty | 8 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg | 4 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty | 1653 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xecjk/xeCJKfntef.sty | 154 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xecjk/xunicode-addon.sty | 8 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xecjk/xunicode-extra.def | 8 |
6 files changed, 1216 insertions, 619 deletions
diff --git a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty index 92fe13cbd7b..b19c1a82f24 100644 --- a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty +++ b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty @@ -7,8 +7,8 @@ %% xeCJK.dtx (with options: `listings') %% %% Copyright (C) 2007--2010 by Wenchang Sun <sunwch@nankai.edu.cn> -%% Copyright (C) 2009--2017 by Leo Liu <leoliu.pku@gmail.com> -%% Copyright (C) 2012--2017 by Qing Lee <sobenlee@gmail.com> +%% Copyright (C) 2009--2018 by Leo Liu <leoliu.pku@gmail.com> +%% Copyright (C) 2012--2018 by Qing Lee <sobenlee@gmail.com> %% ---------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -29,10 +29,10 @@ %% \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} -\GetIdInfo$Id: xeCJK.dtx 5a18688 2017-11-22 19:12:51 +0800 Qing Lee <sobenlee@gmail.com> $ +\GetIdInfo$Id: xeCJK.dtx 54327e6 2018-01-28 19:10:14 +0800 Qing Lee <sobenlee@gmail.com> $ {xeCJK patch file for listings} \ProvidesExplPackage{xeCJK-listings} - {\ExplFileDate}{3.5.1}{\ExplFileDescription} + {\ExplFileDate}{3.6.0}{\ExplFileDescription} \DeclareOption* { \PassOptionsToPackage { \CurrentOption } { xeCJK } } \ProcessOptions \scan_stop: \RequirePackage { xeCJK } diff --git a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg index 354fb8b2156..3101a8568ac 100644 --- a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg +++ b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg @@ -6,10 +6,10 @@ %% %% xeCJK.dtx (with options: `config') %% -\GetIdInfo$Id: xeCJK.dtx 5a18688 2017-11-22 19:12:51 +0800 Qing Lee <sobenlee@gmail.com> $ +\GetIdInfo$Id: xeCJK.dtx 54327e6 2018-01-28 19:10:14 +0800 Qing Lee <sobenlee@gmail.com> $ {Configuration file for xeCJK package} \ProvidesExplFile{\ExplFileName.cfg} - {\ExplFileDate}{3.5.1}{\ExplFileDescription} + {\ExplFileDate}{3.6.0}{\ExplFileDescription} %% %% diff --git a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty index 00dc7a2c4e6..22598d0c915 100644 --- a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty +++ b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty @@ -7,8 +7,8 @@ %% xeCJK.dtx (with options: `package') %% %% Copyright (C) 2007--2010 by Wenchang Sun <sunwch@nankai.edu.cn> -%% Copyright (C) 2009--2017 by Leo Liu <leoliu.pku@gmail.com> -%% Copyright (C) 2012--2017 by Qing Lee <sobenlee@gmail.com> +%% Copyright (C) 2009--2018 by Leo Liu <leoliu.pku@gmail.com> +%% Copyright (C) 2012--2018 by Qing Lee <sobenlee@gmail.com> %% ---------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -29,10 +29,10 @@ %% \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} -\GetIdInfo$Id: xeCJK.dtx 5a18688 2017-11-22 19:12:51 +0800 Qing Lee <sobenlee@gmail.com> $ +\GetIdInfo$Id: xeCJK.dtx 54327e6 2018-01-28 19:10:14 +0800 Qing Lee <sobenlee@gmail.com> $ {Typesetting CJK scripts with XeLaTeX} \ProvidesExplPackage{\ExplFileName} - {\ExplFileDate}{3.5.1}{\ExplFileDescription} + {\ExplFileDate}{3.6.0}{\ExplFileDescription} \msg_new:nnn { xeCJK } { Require-XeTeX } { The~xeCJK~package~requires~XeTeX~to~function.\\\\ @@ -49,7 +49,7 @@ using~your~TeX~package~manager~or~from~CTAN.\\ \str_if_eq:nnT {#1} { expl3 } { Loading~xeCJK~will~abort! } } -\@ifpackagelater { expl3 } { 2017/07/19 } { } +\@ifpackagelater { expl3 } { 2017/12/16 } { } { \msg_critical:nnn { xeCJK } { l3-too-old } { expl3 } } \prg_new_conditional:Npnn \xeCJK_if_package_loaded:n #1 { p , T , F , TF } { @@ -98,8 +98,10 @@ \cs_new_protected_nopar:Npn \__xeCJK_warning:nxx { \msg_warning:nnxx { xeCJK } } \cs_new_protected_nopar:Npn \__xeCJK_warning:nxxx { \msg_warning:nnxxx { xeCJK } } \cs_new_protected_nopar:Npn \__xeCJK_info:nxx { \msg_info:nnxx { xeCJK } } -\cs_new_protected_nopar:Npn \xeCJK_allow_break: { \tex_penalty:D \c_zero } -\cs_new_protected_nopar:Npn \xeCJK_no_break: { \tex_penalty:D \c_ten_thousand } +\cs_new_protected_nopar:Npn \xeCJK_allow_break: + { \tex_penalty:D \c_zero } +\cs_new_protected_nopar:Npn \xeCJK_no_break: + { \tex_penalty:D \c_ten_thousand } \tl_new:N \g__xeCJK_at_end_preamble_hook_tl \tl_new:N \g__xeCJK_after_preamble_hook_tl \tl_new:N \g__xeCJK_after_end_preamble_hook_tl @@ -150,8 +152,6 @@ { \tl_put_right:Nn \l__xeCJK_shipout_hook_tl } \tl_new:N \l__xeCJK_shipout_hook_tl \bool_new:N \l__xeCJK_shipout_hook_bool -\cs_new_nopar:Npn \xeCJK_reverse:nnn #1#2#3 - { \str_if_eq_x:nnTF {#1} {#2} {#3} {#2} } \cs_new_protected_nopar:Npn \xeCJK_tl_remove_outer_braces:N #1 { \tl_set:Nx #1 { \exp_args:NV \xeCJK_tl_remove_outer_braces:n #1 } } \cs_new:Npn \xeCJK_tl_remove_outer_braces:n #1 @@ -190,7 +190,7 @@ } \tl_const:Nn \c_xeCJK_space_skip_tl { - \int_compare:nNnTF \g__xeCJK_spacefactor_int = \c_one_thousand + \int_compare:nNnTF \g__xeCJK_space_factor_int = \c_one_thousand { \skip_if_eq:nnTF \tex_spaceskip:D \c_zero_skip { @@ -203,8 +203,11 @@ { \skip_if_eq:nnTF \tex_spaceskip:D \c_zero_skip { - \int_compare:nNnTF \g__xeCJK_spacefactor_int < { 2000 } - { \__xeCJK_space_skip_scale:nnn { \tex_fontdimen:D \c_two \tex_font:D } } + \int_compare:nNnTF \g__xeCJK_space_factor_int < { 2000 } + { + \__xeCJK_space_skip_scale:nnn + { \tex_fontdimen:D \c_two \tex_font:D } + } { \skip_if_eq:nnTF \tex_xspaceskip:D \c_zero_skip { @@ -220,13 +223,16 @@ { \tex_fontdimen:D \c_four \tex_font:D } } { - \int_compare:nNnTF \g__xeCJK_spacefactor_int < { 2000 } + \int_compare:nNnTF \g__xeCJK_space_factor_int < { 2000 } { \__xeCJK_space_skip_scale:nnn { \tex_spaceskip:D } } { \skip_if_eq:nnTF \tex_xspaceskip:D \c_zero_skip { \__xeCJK_space_skip_scale:nnn - { \tex_spaceskip:D + \tex_fontdimen:D \c_seven \tex_font:D } + { + \tex_spaceskip:D + + \tex_fontdimen:D \c_seven \tex_font:D + } } { \tex_xspaceskip:D \use_none:nn } } @@ -238,13 +244,13 @@ \cs_new_nopar:Npn \__xeCJK_space_skip_scale:nnn #1#2#3 { \dim_eval:n {#1} - plus \fp_eval:n { \g__xeCJK_spacefactor_int / 1000 } #2 + plus \fp_eval:n { \g__xeCJK_space_factor_int / 1000 } #2 minus \int_div_truncate:nn - { 1000 * \tex_number:D #3 } { \g__xeCJK_spacefactor_int } sp + { 1000 * \tex_number:D #3 } { \g__xeCJK_space_factor_int } sp } -\int_new:N \g__xeCJK_spacefactor_int -\int_gset_eq:NN \g__xeCJK_spacefactor_int \c_one_thousand +\int_new:N \g__xeCJK_space_factor_int +\int_gset_eq:NN \g__xeCJK_space_factor_int \c_one_thousand \cs_new_protected_nopar:Npn \xeCJK_glue_to_skip:nN #1#2 { \group_begin: @@ -271,14 +277,17 @@ \fi: } \cs_new_protected:Npn \xeCJK_int_until_do:nn #1#2 - { \__xeCJK_int_until_do:wn \use_none:n { \reverse_if:N \if_int_compare:w #1#2 } } + { + \__xeCJK_int_until_do:wn \use_none:n + { \reverse_if:N \if_int_compare:w #1#2 } + } \cs_new_protected:Npn \__xeCJK_int_until_do:wn \use_none:n #1 { #1 \exp_after:wN \__xeCJK_int_until_do:wn \fi: \use_none:n {#1} } \int_new:N \l__xeCJK_begin_int \int_new:N \l__xeCJK_end_int \cs_new_protected:Npn \xeCJK_peek_catcode_ignore_spaces:NTF #1#2#3 { - \cs_set_eq:NN \l__peek_search_token #1 \scan_stop: + \cs_set_eq:NN \l__xeCJK_peek_search_token #1 \scan_stop: \tl_set:Nn \__xeCJK_peek_catcode_true:w { \group_align_safe_end: #2 } \tl_set:Nn \__xeCJK_peek_catcode_false:w { \group_align_safe_end: #3 } \bool_set_false:N \l__xeCJK_peek_ignore_spaces_bool @@ -294,7 +303,7 @@ \tex_romannumeral:D 0 \else: \if_catcode:w - \exp_not:N \l_peek_token \exp_not:N \l__peek_search_token + \exp_not:N \l_peek_token \exp_not:N \l__xeCJK_peek_search_token \exp_after:wN \exp_after:wN \exp_after:wN \__xeCJK_peek_catcode_true:w \else: @@ -303,6 +312,7 @@ \fi: \fi: } +\cs_new_eq:NN \l__xeCJK_peek_search_token ? \tl_new:N \__xeCJK_peek_catcode_true:w \tl_new:N \__xeCJK_peek_catcode_false:w \bool_new:N \l__xeCJK_peek_ignore_spaces_bool @@ -357,16 +367,17 @@ \group_end: \prg_new_conditional:Npnn \xeCJK_if_CJK_class:N #1 { p , T , F , TF } { - \if_cs_exist:w \__xeCJK_CJK_class_tl:n { \xeCJK_token_value_class:N #1 } \cs_end: + \if_cs_exist:w + \__xeCJK_CJK_class_tl:n { \xeCJK_token_value_class:N #1 } + \cs_end: \prg_return_true: \else: \prg_return_false: \fi: } \cs_new_nopar:Npn \__xeCJK_CJK_class_tl:n #1 { c__xeCJK_CJK_class_ \int_eval:n {#1} _tl } -\cs_generate_variant:Nn \__xeCJK_CJK_class_tl:n { c } \prg_new_conditional:Npnn \xeCJK_if_same_class:NN #1#2 { p , T , F , TF } { - \if_int_compare:w - \xeCJK_token_value_class:N #1 = \xeCJK_token_value_class:N #2 \exp_stop_f: + \if_int_compare:w \xeCJK_token_value_class:N #1 = + \xeCJK_token_value_class:N #2 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: } \keys_define:nn { xeCJK / options } @@ -376,8 +387,10 @@ xeCJKactive / false .code:n = { \makexeCJKinactive } , xeCJKactive .default:n = { true } } -\NewDocumentCommand \makexeCJKactive { } { \xetex_interchartokenstate:D = \c_one } -\NewDocumentCommand \makexeCJKinactive { } { \xetex_interchartokenstate:D = \c_zero } +\NewDocumentCommand \makexeCJKactive { } + { \xetex_interchartokenstate:D = \c_one } +\NewDocumentCommand \makexeCJKinactive { } + { \xetex_interchartokenstate:D = \c_zero } \char_set_catcode_ignore:n { "FEFF } \seq_new:N \g__xeCJK_class_seq \seq_new:N \g__xeCJK_new_class_seq @@ -386,10 +399,12 @@ \int_if_exist:cTF { \__xeCJK_class_csname:n {#1} } { \__xeCJK_error:nx { class-already-defined } {#1} } { - \exp_args:Nc \newXeTeXintercharclass { \__xeCJK_class_csname:n {#1} } + \exp_args:Nc \newXeTeXintercharclass + { \__xeCJK_class_csname:n {#1} } \clist_new:c { g__xeCJK_#1_range_clist } \seq_gput_right:Nn \g__xeCJK_class_seq {#1} - \seq_gput_right:Nv \g__xeCJK_new_class_seq { \__xeCJK_class_csname:n {#1} } + \seq_gput_right:Nv \g__xeCJK_new_class_seq + { \__xeCJK_class_csname:n {#1} } } } \cs_new_protected_nopar:Npn \xeCJK_save_class:nn #1#2 @@ -447,24 +462,32 @@ } \clist_const:Nn \c__xeCJK_PR_chars_clist { "FE69 , "FF04 , "FFE1 , "FFE5 , "FFE6 } -\clist_const:Nx \c__xeCJK_FullLeft_chars_clist - { - \c__xeCJK_OP_chars_clist , - \c__xeCJK_PR_chars_clist - } +\clist_new:N \c__xeCJK_FullLeft_chars_clist +\clist_gconcat:NNN \c__xeCJK_FullLeft_chars_clist + \c__xeCJK_OP_chars_clist + \c__xeCJK_PR_chars_clist \clist_const:Nn \c__xeCJK_CL_chars_clist { - "00B7 , "2019 , "201D , "2013 , "2014 , "2025 , "2026 , "2027 , + "00B7 , "2019 , "201D , "2013 , "2014 , "2025 , "2026 , "2027 , "2E3A , "3001 , "3002 , "3009 , "300B , "300D , "300F , "3011 , "3015 , "3017 , "3019 , "301B , "301E , "301F , "FE11 , "FE12 , "FE18 , "FE36 , "FE38 , "FE3A , "FE3C , "FE3E , "FE40 , "FE42 , "FE44 , "FE48 , "FE50 , "FE52 , "FE5A , "FE5C , "FE5E , "FF09 , "FF0C , "FF0E , "FF3D , "FF5D , "FF60 , "FF61 , "FF63 , "FF64 } -\clist_const:Nn \c__xeCJK_hyphens_chars_clist { "301C , "30A0 } +\clist_const:Nn \c__xeCJK_hyphens_chars_clist + { "301C , "30A0 , "FF5E } \clist_const:Nn \c__xeCJK_iteration_marks_chars_clist { "3005 , "303B , "309D , "309E , "30FD , "30FE } \clist_const:Nn \c__xeCJK_NS_chars_clist { "30FB , "FE54 , "FE55 , "FF1A , "FF1B , "FF65 , "16FE0 } +\AtEndOfPackage + { + \cs_set:Npn \__xeCJK_tmp:w #1 + { \char_generate:nn {#1} { \c_twelve } } + \__xeCJK_add_special_punct:nn { middle } + { \clist_map_function:NN \c__xeCJK_hyphens_chars_clist \__xeCJK_tmp:w } + \cs_undefine:N \__xeCJK_tmp:w + } \clist_const:Nn \c__xeCJK_EX_chars_clist { "FE15 , "FE16 , "FE56 , "FE57 , "FF01 , "FF1F } \clist_const:Nn \c__xeCJK_IS_chars_clist { "FE10 , "FE13 , "FE14 } @@ -478,13 +501,19 @@ "FF70 } \clist_const:Nn \c__xeCJK_PO_chars_clist { "FE6A , "FF05 , "FFE0 } -\clist_const:Nx \c__xeCJK_FullRight_chars_clist +\clist_new:N \c__xeCJK_FullRight_chars_clist +\tl_map_inline:nn { - \c__xeCJK_CL_chars_clist , - \c__xeCJK_NS_chars_clist , - \c__xeCJK_EX_chars_clist , - \c__xeCJK_IS_chars_clist , + \c__xeCJK_CL_chars_clist + \c__xeCJK_NS_chars_clist + \c__xeCJK_EX_chars_clist + \c__xeCJK_IS_chars_clist \c__xeCJK_PO_chars_clist + \c__xeCJK_hyphens_chars_clist + } + { + \clist_gconcat:NNN \c__xeCJK_FullRight_chars_clist + \c__xeCJK_FullRight_chars_clist #1 } \clist_const:Nn \c__xeCJK_CJK_chars_clist { @@ -537,7 +566,8 @@ "A960 -> "A97F , "D7B0 -> "D7FF } -\cs_new_nopar:Npn \xeCJK_class_num:n #1 { \use:c { \__xeCJK_class_csname:n {#1} } } +\cs_new_nopar:Npn \xeCJK_class_num:n #1 + { \use:c { \__xeCJK_class_csname:n {#1} } } \NewDocumentCommand \xeCJKDeclareCharClass { s > { \TrimSpaces } m m } { \xeCJK_declare_char_class:nn {#2} {#3} @@ -565,7 +595,6 @@ \NewDocumentCommand \__xeCJK_set_char_class_aux:Nnw { m > { \SplitArgument { 1 } { -> } } m } { #1 #2 } \cs_generate_variant:Nn \clist_gconcat:NNN { cc } -\cs_generate_variant:Nn \xeCJK_declare_char_class:nn { nc } \cs_new_protected_nopar:Npn \__xeCJK_check_num_range:nnNN #1#2#3#4 { \bool_lazy_or:nnTF @@ -576,8 +605,8 @@ \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} } } + \int_set:Nn #3 { \int_min:nn {#1} { \tl_if_novalue:nTF {#2} {#1} {#2} } } + \int_set:Nn #4 { \int_max:nn {#1} { \tl_if_novalue:nTF {#2} {#1} {#2} } } } } \token_if_letter:NF ^^^^ac00 @@ -636,10 +665,16 @@ } \xeCJKResetCharClass \cs_new_protected_nopar:Npn \xeCJK_inter_class_toks:nnn #1#2#3 - { \xetex_interchartoks:D \xeCJK_class_num:n {#1} ~ \xeCJK_class_num:n {#2} = {#3} } -\cs_generate_variant:Nn \xeCJK_inter_class_toks:nnn { nnc , nnx } + { + \xetex_interchartoks:D \xeCJK_class_num:n {#1} ~ + \xeCJK_class_num:n {#2} = {#3} + } +\cs_generate_variant:Nn \xeCJK_inter_class_toks:nnn { nnx } \cs_new_nopar:Npn \xeCJK_get_inter_class_toks:nn #1#2 - { \tex_the:D \xetex_interchartoks:D \xeCJK_class_num:n {#1} ~ \xeCJK_class_num:n {#2} } + { + \tex_the:D \xetex_interchartoks:D \xeCJK_class_num:n {#1} ~ + \xeCJK_class_num:n {#2} + } \cs_new_protected_nopar:Npn \xeCJK_clear_inter_class_toks:nn #1#2 { \xeCJK_inter_class_toks:nnn {#1} {#2} { \prg_do_nothing: } } \cs_new_protected_nopar:Npn \xeCJK_pre_inter_class_toks:nnn #1#2#3 @@ -653,13 +688,15 @@ \xeCJK_inter_class_toks:nnx {#1} {#2} { \xeCJK_get_inter_class_toks:nn {#1} {#2} \exp_not:n {#3} } } -\cs_generate_variant:Nn \xeCJK_app_inter_class_toks:nnn { nnc , nnx } +\cs_generate_variant:Nn \xeCJK_app_inter_class_toks:nnn { nnx } \cs_new_protected_nopar:Npn \xeCJK_copy_inter_class_toks:nnnn #1#2#3#4 { - \tl_set:Nx \l__xeCJK_tmp_tl { \xeCJK_get_inter_class_toks:nn {#3} {#4} } + \tl_set:Nx \l__xeCJK_tmp_tl + { \xeCJK_get_inter_class_toks:nn {#3} {#4} } \tl_if_empty:NTF \l__xeCJK_tmp_tl { - \tl_set:Nx \l__xeCJK_tmp_tl { \xeCJK_get_inter_class_toks:nn {#1} {#2} } + \tl_set:Nx \l__xeCJK_tmp_tl + { \xeCJK_get_inter_class_toks:nn {#1} {#2} } \tl_if_empty:NF \l__xeCJK_tmp_tl { \xeCJK_clear_inter_class_toks:nn {#1} {#2} } } @@ -667,11 +704,13 @@ } \cs_new_protected_nopar:Npn \xeCJK_replace_inter_class_toks:nnnn #1#2#3#4 { - \tl_set:Nx \l__xeCJK_tmp_tl { \xeCJK_get_inter_class_toks:nn {#1} {#2} } + \tl_set:Nx \l__xeCJK_tmp_tl + { \xeCJK_get_inter_class_toks:nn {#1} {#2} } \tl_if_empty:NF \l__xeCJK_tmp_tl { \tl_replace_all:Nnn \l__xeCJK_tmp_tl {#3} {#4} - \xeCJK_inter_class_toks:nnx {#1} {#2} { \exp_not:o \l__xeCJK_tmp_tl } + \xeCJK_inter_class_toks:nnx {#1} {#2} + { \exp_not:o \l__xeCJK_tmp_tl } } } \cs_new_protected_nopar:Npn \xeCJK_clear_Boundary_and_CJK_toks: @@ -682,8 +721,8 @@ { \exp_not:o { \xeCJK_clear_Boundary_and_CJK_toks: } \xetex_interchartoks:D - \xeCJK_class_num:n { Boundary } ~ \xeCJK_class_num:n {#1} - = { \exp_not:N \prg_do_nothing: } + \xeCJK_class_num:n { Boundary } ~ + \xeCJK_class_num:n {#1} = { \exp_not:N \prg_do_nothing: } } } \seq_new:N \g__xeCJK_base_class_seq @@ -695,7 +734,9 @@ \cs_new_protected_nopar:Npn \__xeCJK_save_CJK_class:n #1 { \seq_gput_right:Nn \g__xeCJK_CJK_class_seq {#1} - \tl_const:cn { \__xeCJK_CJK_class_tl:c { \__xeCJK_class_csname:n {#1} } } {#1} + \tl_const:cn + { \__xeCJK_CJK_class_tl:n { \use:c { \__xeCJK_class_csname:n {#1} } } } + {#1} \__xeCJK_update_clear_toks:n {#1} } \clist_map_function:nN @@ -704,7 +745,7 @@ { \c_group_begin_token \bool_set_true:N \l__xeCJK_CJK_group_bool - \int_gset_eq:NN \g__xeCJK_spacefactor_int \c_one_thousand + \int_gset_eq:NN \g__xeCJK_space_factor_int \c_one_thousand \int_zero:N \xetex_dashbreakstate:D } \bool_new:N \l__xeCJK_CJK_group_bool @@ -747,8 +788,10 @@ } \clist_map_inline:nn { Default , HalfLeft } { - \xeCJK_inter_class_toks:nnn { Boundary } {#1} { \xeCJK_Boundary_and_Default: } - \xeCJK_app_inter_class_toks:nnn { CJK } {#1} { \CJKecglue } + \xeCJK_inter_class_toks:nnn { Boundary } {#1} + { \xeCJK_Boundary_and_Default: } + \xeCJK_app_inter_class_toks:nnn { CJK } {#1} + { \CJKecglue } } \cs_new_protected_nopar:Npn \xeCJK_Boundary_and_Default: { \xeCJK_check_for_ecglue: } @@ -779,7 +822,9 @@ { \xeCJK_if_last_node:nTF { CJK } { - \skip_if_eq:nnTF { \l__xeCJK_last_skip } { \c_xeCJK_space_skip_tl } + \skip_if_eq:nnTF + { \l__xeCJK_last_skip } + { \c_xeCJK_space_skip_tl } { \xeCJK_remove_node: \CJKecglue } { \skip_horizontal:N \l__xeCJK_last_skip } } @@ -791,7 +836,7 @@ { \xeCJK_inter_class_toks:nnn {#1} { Boundary } { - \int_gset_eq:NN \g__xeCJK_spacefactor_int \tex_spacefactor:D + \int_gset_eq:NN \g__xeCJK_space_factor_int \tex_spacefactor:D \peek_meaning_remove:NTF \tex_italiccorrection:D { \tex_italiccorrection:D @@ -820,10 +865,11 @@ \xeCJK_if_last_node:nT { CJK-space } { \xeCJK_remove_node: \xeCJK_space_or_xecglue: } } -\cs_new_eq:NN \xeCJK_check_for_ecglue_normalsp: \__xeCJK_check_for_ecglue_normalsp: +\cs_new_eq:NN \xeCJK_check_for_ecglue_normalsp: + \__xeCJK_check_for_ecglue_normalsp: \xeCJK_inter_class_toks:nnn { NormalSpace } { Boundary } { - \int_gset_eq:NN \g__xeCJK_spacefactor_int \tex_spacefactor:D + \int_gset_eq:NN \g__xeCJK_space_factor_int \tex_spacefactor:D \peek_meaning_remove:NTF \tex_italiccorrection:D { \tex_italiccorrection:D @@ -845,21 +891,43 @@ } \cs_new_protected_nopar:Npn \xeCJK_check_for_glue: { - \bool_lazy_or:nnTF - { \xeCJK_if_last_node_p:n { CJK } } - { \xeCJK_if_last_node_p:n { CJK-space } } - { \xeCJK_remove_node: \CJKglue } + \int_compare:nNnTF \etex_lastnodetype:D = \c_twelve + { \__xeCJK_check_for_glue_auxi: } { - \xeCJK_if_last_node:nTF { CJK-widow } - { \xeCJK_remove_node: \xeCJK_widow_penalty: \CJKglue } - { - \bool_lazy_or:nnTF - { \xeCJK_if_last_node_p:n { default } } - { \int_compare_p:nNn \etex_lastnodetype:D = \c_ten } - { \xeCJK_remove_node: \CJKecglue } - { \xeCJK_check_for_xglue: } - } + \int_compare:nNnTF \etex_lastnodetype:D = \c_ten + { \xeCJK_remove_node: \CJKecglue } + { \__xeCJK_check_for_glue_auxii: } + } + } +\cs_new_protected_nopar:Npn \__xeCJK_check_for_glue_auxi: + { + \dim_case:nn { \tex_lastkern:D } + { + { \__xeCJK_node:n { CJK } } + { \xeCJK_remove_node: \CJKglue } + { \__xeCJK_node:n { CJK-space } } + { \xeCJK_remove_node: \CJKglue } + { \__xeCJK_node:n { CJK-widow } } + { \xeCJK_remove_node: \xeCJK_widow_penalty: \CJKglue } + { \__xeCJK_node:n { default } } + { \xeCJK_remove_node: \CJKecglue } + } + } +\cs_new_protected_nopar:Npn \__xeCJK_check_for_glue_auxii: + { + \xeCJK_if_last_punct:TF + { \__xeCJK_check_for_glue_auxiii: } + { \xeCJK_check_for_xglue: } + } +\cs_new_protected_nopar:Npn \__xeCJK_check_for_glue_auxiii: + { + \bool_if:NT \l__xeCJK_last_penalty_bool + { + \__xeCJK_add_offset_skip:N \l__xeCJK_last_skip + \tex_penalty:D \l__xeCJK_last_penalty_int } + \skip_horizontal:N \l__xeCJK_last_skip + \tl_if_eq:NNF \l__xeCJK_aligni_tl \c__xeCJK_left_tl { \CJKglue } } \cs_new_eq:NN \xeCJK_check_for_xglue: \prg_do_nothing: \cs_new_protected_nopar:Npn \__xeCJK_check_for_xglue: @@ -879,7 +947,9 @@ } \cs_new_protected_nopar:Npn \__xeCJK_check_for_xglue_aux: { - \skip_if_eq:nnTF { \l__xeCJK_last_skip } { \c_xeCJK_space_skip_tl } + \skip_if_eq:nnTF + { \l__xeCJK_last_skip } + { \c_xeCJK_space_skip_tl } { \xeCJK_if_last_node:nTF { CJK } { \xeCJK_remove_node: \__xeCJK_ccglue_or_space: } @@ -912,11 +982,9 @@ \int_new:N \g__xeCJK_node_int \int_gset_eq:NN \g__xeCJK_node_int \c_ten \cs_new_protected_nopar:Npn \xeCJK_make_node:n #1 - { - \exp_after:wN \__xeCJK_make_node:N - \cs:w c__xeCJK_#1_node_dim \exp_after:wN \cs_end: - \exp_after:wN \tex_spacefactor:D \int_use:N \tex_spacefactor:D \exp_stop_f: - } + { \exp_args:Nc \__xeCJK_make_node:N { c__xeCJK_#1_node_dim } } +\cs_new_nopar:Npn \__xeCJK_node:n #1 + { \use:c { c__xeCJK_#1_node_dim } } \cs_new_protected_nopar:Npn \__xeCJK_make_node:N #1 { \tex_kern:D - #1 @@ -1093,8 +1161,10 @@ { \group_align_safe_end: } } \cs_new_eq:NN \__xeCJK_ignore_space_end: \group_align_safe_end: -\xeCJK_inter_class_toks:nnn { CJK } { CJK } { \xeCJK_CJK_and_CJK:N } -\cs_new_protected_nopar:Npn \xeCJK_CJK_and_CJK:N #1 { \CJKglue \CJKsymbol {#1} } +\xeCJK_inter_class_toks:nnn { CJK } { CJK } + { \xeCJK_CJK_and_CJK:N } +\cs_new_protected_nopar:Npn \xeCJK_CJK_and_CJK:N + { \CJKglue \CJKsymbol } \xeCJK_inter_class_toks:nnn { FullLeft } { CJK } { \xeCJK_FullLeft_and_CJK: \CJKsymbol } \xeCJK_inter_class_toks:nnn { FullRight } { CJK } @@ -1105,56 +1175,216 @@ { \xeCJK_inter_class_toks:nnx {#1} {##1} { \exp_not:c { xeCJK_Default_and_##1:nN } {#1} } - \xeCJK_inter_class_toks:nnc {##1} {#1} { xeCJK_##1_and_Default: } + \xeCJK_inter_class_toks:nnx {##1} {#1} + { \exp_not:c { xeCJK_##1_and_Default: } } } } \xeCJK_inter_class_toks:nnn { Boundary } { FullLeft } { \xeCJK_Boundary_and_FullLeft:N } \xeCJK_inter_class_toks:nnn { Boundary } { FullRight } { \xeCJK_Boundary_and_FullRight:N } -\xeCJK_app_inter_class_toks:nnn { FullLeft } { Boundary } { \tex_ignorespaces:D } +\xeCJK_inter_class_toks:nnn { FullLeft } { Boundary } + { \xeCJK_FullLeft_and_Boundary: } \xeCJK_inter_class_toks:nnn { FullRight } { Boundary } { \xeCJK_FullRight_and_Boundary: } +\cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_Boundary: + { + \__xeCJK_punct_if_middle:NTF \g__xeCJK_last_punct_tl + { + \__xeCJK_punct_bound_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \xeCJK_class_group_end: + \exp_after:wN \xeCJK_punct_node:N \g__xeCJK_last_punct_tl + \xeCJK_no_break: + \__xeCJK_punct_glue:NN \c__xeCJK_left_tl \g__xeCJK_last_punct_tl + } + { + \xeCJK_class_group_end: + \exp_after:wN \xeCJK_punct_node:N \g__xeCJK_last_punct_tl + \xeCJK_no_break: \__xeCJK_zero_glue: + } + \tex_ignorespaces:D + } \cs_new_protected_nopar:Npn \xeCJK_FullRight_and_Boundary: - { \xeCJK_FullRight_and_Default: \tex_ignorespaces:D } + { + \__xeCJK_punct_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \xeCJK_class_group_end: + \__xeCJK_punct_offset:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \exp_after:wN \xeCJK_punct_node:N \g__xeCJK_last_punct_tl + \__xeCJK_punct_glue:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \tex_ignorespaces:D + } +\cs_new_protected_nopar:Npn \xeCJK_punct_node:N #1 + { + \__xeCJK_punct_bound_unitization:NN #1 \l__xeCJK_tmp_dim + \__xeCJK_make_node:N \l__xeCJK_tmp_dim + \dim_set:Nn \l__xeCJK_tmp_dim { `#1 sp } + \__xeCJK_make_node:N \l__xeCJK_tmp_dim + } +\cs_new_protected_nopar:Npn \__xeCJK_punct_bound_unitization:NN #1#2 + { + \dim_set:Nn #2 + { + \dim_max:nn + { \c_zero_dim } + { \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_right_tl #1 } + } + \dim_compare:nNnF {#2} < { 1pt } + { \dim_set:Nn #2 { -1pt * \dim_ratio:nn {#2} { \c_max_dim } } } + } +\cs_new_protected_nopar:Npn \xeCJK_punct_bound_kern:N #1 + { + \exp_after:wN \__xeCJK_punct_bound_kern:NN + \g__xeCJK_last_punct_tl #1 + } +\cs_new_protected_nopar:Npn \__xeCJK_punct_bound_kern:NN #1#2 + { + \xeCJK_get_punct_bounds:NN \l__xeCJK_aligni_tl #1 + \xeCJK_get_punct_kerning:NN #1 #2 + \__xeCJK_punct_bound_unitization:NN #1 \l__xeCJK_tmp_dim + \skip_set:Nn \l__xeCJK_punct_kern_skip + { \__xeCJK_use_dim_or_skip:nNN { bound_kern } #1 #2 } + \dim_compare:nNnF \l__xeCJK_tmp_dim = \l__xeCJK_last_bound_dim + { \__xeCJK_punct_bound_kern_ratio:NN #1 #2 } + \__xeCJK_add_offset_skip:N \l__xeCJK_punct_kern_skip + \bool_if:NTF \l__xeCJK_last_penalty_bool + { + \tex_penalty:D \l__xeCJK_last_penalty_int + \skip_horizontal:N + } + { \__xeCJK_punct_bound_kern_aux:NNN #1 #2 } + \l__xeCJK_punct_kern_skip + } +\cs_new_protected_nopar:Npn \__xeCJK_add_offset_skip:N #1 + { + \tl_if_eq:NNF \l__xeCJK_aligni_tl \c__xeCJK_left_tl + { + \int_compare:nNnT \etex_lastnodetype:D = \c_eleven + { + \skip_add:Nn #1 { \tex_lastskip:D } + \tex_unskip:D + } + } + } +\skip_new:N \l__xeCJK_punct_kern_skip +\cs_new_protected_nopar:Npn \__xeCJK_punct_bound_kern_ratio:NN #1#2 + { + \dim_set:Nn \l__xeCJK_bound_dim + { \__xeCJK_use_punct_dim:nNN { bound_width } #1 #2 } + \dim_compare:nNnT \l__xeCJK_bound_dim > \c_zero_dim + { + \dim_compare:nNnF \l__xeCJK_last_bound_dim > \c_zero_dim + { + \dim_set:Nn \l__xeCJK_last_bound_dim + { + - \l__xeCJK_last_bound_dim * + \dim_ratio:nn { \c_max_dim } { 1pt } + } + } + \__xeCJK_punct_bound_kern_ratio_aux:N #2 + } + } +\cs_new_protected_nopar:Npn \__xeCJK_punct_bound_kern_ratio_aux:N #1 + { + \skip_set:Nn \l__xeCJK_punct_kern_skip + { + \l__xeCJK_punct_kern_skip * + \dim_ratio:nn + { + \l__xeCJK_last_bound_dim + + \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_left_tl #1 + } + { \l__xeCJK_bound_dim } + } + } +\cs_new_protected_nopar:Npn \__xeCJK_nobreak_hskip:N + { \xeCJK_no_break: \skip_horizontal:N } +\cs_new_protected_nopar:Npn \__xeCJK_nobreak_hskip:n + { \xeCJK_no_break: \skip_horizontal:n } +\cs_new_eq:NN \__xeCJK_punct_bound_kern:N \__xeCJK_nobreak_hskip:N +\cs_new_protected_nopar:Npn \__xeCJK_punct_bound_breakable_kern:N + { + \tl_if_eq:NNTF \l__xeCJK_aligni_tl \c__xeCJK_right_tl + { + \tl_if_eq:NNTF \l__xeCJK_alignii_tl \c__xeCJK_left_tl + { \skip_horizontal:N } + { \__xeCJK_nobreak_hskip:N } + } + { \__xeCJK_nobreak_hskip:N } + } +\cs_new_protected_nopar:Npn \__xeCJK_punct_bound_kern_aux:NNN #1#2 + { + \str_if_eq:nnTF {#1} {#2} + { \__xeCJK_punct_bound_kern:N } + { + \__xeCJK_punct_if_long:NTF #1 + { \skip_horizontal:N } + { + \__xeCJK_punct_if_long:NTF #2 + { \skip_horizontal:N } + { \__xeCJK_punct_bound_kern:N } + } + } + } \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 } } + { + \xeCJK_inter_class_toks:nnx {#1} {##1} + { \exp_not:c { xeCJK_#1_and_##1:N } } + } } \cs_new_protected_nopar:Npn \__xeCJK_punct_bound_rule:NN #1#2 { \tex_vrule:D - width - \__xeCJK_use_punct_dim:nnn { bound } {#1} {#2} + width - \__xeCJK_use_punct_dim:nNN { bound } #1 #2 ~ depth \c_zero_dim height \c_zero_dim \scan_stop: } \cs_new_protected_nopar:Npn \__xeCJK_punct_rule:NN #1#2 { \tex_vrule:D - width \__xeCJK_use_punct_dim:nnn { rule } {#1} {#2} + width \__xeCJK_use_punct_dim:nNN { rule } #1 #2 ~ depth \c_zero_dim height \c_zero_dim \scan_stop: } \cs_new_protected_nopar:Npn \__xeCJK_punct_offset:NN #1#2 - { \__xeCJK_punct_kern:n { - \__xeCJK_use_punct_dim:nnn { offset } {#1} {#2} } } -\cs_new_protected_nopar:Npn \__xeCJK_punct_kern:n #1 { - \dim_set:Nn \l__xeCJK_tmp_dim {#1} + \dim_set:Nn \l__xeCJK_tmp_dim + { - \__xeCJK_use_punct_dim:nNN { offset } #1 #2 } \dim_compare:nNnF \l__xeCJK_tmp_dim = \c_zero_dim - { \tex_kern:D \l__xeCJK_tmp_dim } + { \__xeCJK_punct_hskip:n { \l__xeCJK_tmp_dim } } } \cs_new_protected_nopar:Npn \__xeCJK_punct_glue:NN #1#2 - { - \__xeCJK_punct_hskip:n - { \__xeCJK_use_dim_or_skip:nnn { glue } {#1} {#2} } - } + { \__xeCJK_punct_hskip:n { \__xeCJK_use_dim_or_skip:nNN { glue } #1 #2 } } \cs_new_eq:NN \__xeCJK_punct_hskip:n \skip_horizontal:n \cs_new_protected_nopar:Npn \__xeCJK_punct_kern:NN #1#2 { - \__xeCJK_nobreak_hskip:n - { \__xeCJK_use_dim_or_skip:nnn { kern } {#1} {#2} } + \str_if_eq_x:nnTF {#1} {#2} + { \__xeCJK_punct_nobreak_kern:NN } + { + \__xeCJK_punct_if_long:NTF #1 + { \__xeCJK_punct_breakable_kern:NN } + { + \__xeCJK_punct_if_long:NTF #2 + { \__xeCJK_punct_breakable_kern:NN } + { \__xeCJK_punct_nobreak_kern:NN } + } + } + #1 #2 + } +\cs_new_eq:NN \xeCJK_punct_kern:NN \__xeCJK_punct_kern:NN +\cs_new_protected_nopar:Npn \__xeCJK_punct_nobreak_kern:NN #1#2 + { \__xeCJK_nobreak_hskip:n { \__xeCJK_use_dim_or_skip:nNN { kern } #1 #2 } } +\cs_new_protected_nopar:Npn \__xeCJK_punct_breakable_kern:NN #1#2 + { + \exp_after:wN \__xeCJK_punct_if_right:NT #1 + { \__xeCJK_punct_rule:NN \c__xeCJK_right_tl #1 } + \__xeCJK_punct_breakable_kern:n + { \__xeCJK_use_dim_or_skip:nNN { break_kern } #1 #2 } + \__xeCJK_punct_if_right:NF #2 + { \__xeCJK_punct_rule:NN \c__xeCJK_left_tl #2 } } +\cs_new_eq:NN \__xeCJK_punct_breakable_kern:n \skip_horizontal:n \tl_new:N \g__xeCJK_last_punct_tl \cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_CJK: { @@ -1162,9 +1392,10 @@ { \__xeCJK_punct_bound_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl \xeCJK_no_break: - \__xeCJK_punct_glue:NN \c__xeCJK_left_tl \g__xeCJK_last_punct_tl + \__xeCJK_punct_glue:NN \c__xeCJK_left_tl \g__xeCJK_last_punct_tl } - { \xeCJK_no_break: } + { } + \__xeCJK_select_font: } \cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_Default: { @@ -1174,7 +1405,7 @@ \xeCJK_class_group_end: \xeCJK_no_break: \__xeCJK_punct_glue:NN \c__xeCJK_left_tl \g__xeCJK_last_punct_tl } - { \xeCJK_class_group_end: \xeCJK_no_break: \__xeCJK_zero_glue: } + { \xeCJK_class_group_end: } } \cs_new_protected_nopar:Npn \__xeCJK_zero_glue: { \skip_horizontal:N \c_zero_skip } @@ -1183,6 +1414,7 @@ \__xeCJK_punct_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl \__xeCJK_punct_offset:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl \__xeCJK_punct_glue:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \__xeCJK_select_font: \CJKglue } \cs_new_protected_nopar:Npn \xeCJK_FullRight_and_Default: @@ -1194,187 +1426,339 @@ } \cs_new_protected_nopar:Npn \xeCJK_Default_and_FullLeft:nN #1#2 { - \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl {#2} - \__xeCJK_Default_and_FullLeft_glue:N {#2} + \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl #2 + \__xeCJK_Default_and_FullLeft_glue:N #2 \xeCJK_class_group_begin: - \xeCJK_select_font: + \xeCJK_select_punct_font: \xeCJK_clear_inter_class_toks:nn {#1} { FullLeft } \xeCJK_clear_Boundary_and_CJK_toks: - \tl_gset:Nx \g__xeCJK_last_punct_tl {#2} - \__xeCJK_punct_rule:NN \c__xeCJK_left_tl {#2} - \CJKpunctsymbol {#2} + \tl_gset:Nn \g__xeCJK_last_punct_tl {#2} + \__xeCJK_punct_rule:NN \c__xeCJK_left_tl #2 + \CJKpunctsymbol #2 } \cs_new_protected_nopar:Npn \__xeCJK_Default_and_FullLeft_glue:N #1 { - \__xeCJK_punct_glue:NN \c__xeCJK_left_tl {#1} - \__xeCJK_punct_offset:NN \c__xeCJK_left_tl {#1} + \__xeCJK_punct_glue:NN \c__xeCJK_left_tl #1 + \__xeCJK_punct_offset:NN \c__xeCJK_left_tl #1 } \cs_new_protected_nopar:Npn \xeCJK_CJK_and_FullLeft:N #1 { - \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl {#1} - \__xeCJK_CJK_and_FullLeft_glue:N {#1} - \tl_gset:Nx \g__xeCJK_last_punct_tl {#1} - \__xeCJK_punct_rule:NN \c__xeCJK_left_tl {#1} - \CJKpunctsymbol {#1} + \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl #1 + \__xeCJK_CJK_and_FullLeft_glue:N #1 + \tl_gset:Nn \g__xeCJK_last_punct_tl {#1} + \__xeCJK_punct_rule:NN \c__xeCJK_left_tl #1 + \__xeCJK_select_punct_font: + \CJKpunctsymbol #1 } \cs_new_protected_nopar:Npn \__xeCJK_CJK_and_FullLeft_glue:N #1 { \CJKglue - \__xeCJK_punct_glue:NN \c__xeCJK_left_tl {#1} - \__xeCJK_punct_offset:NN \c__xeCJK_left_tl {#1} + \__xeCJK_punct_glue:NN \c__xeCJK_left_tl #1 + \__xeCJK_punct_offset:NN \c__xeCJK_left_tl #1 } \cs_new_protected_nopar:Npn \xeCJK_Boundary_and_FullLeft:N #1 { - \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl {#1} - \__xeCJK_Boundary_and_FullLeft_glue:N {#1} - \__xeCJK_punct_offset:NN \c__xeCJK_left_tl {#1} + \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl #1 + \__xeCJK_Boundary_and_FullLeft_glue:N #1 + \__xeCJK_punct_offset:NN \c__xeCJK_left_tl #1 \xeCJK_class_group_begin: - \xeCJK_select_font: + \xeCJK_select_punct_font: \xeCJK_clear_Boundary_and_CJK_toks: - \tl_gset:Nx \g__xeCJK_last_punct_tl {#1} - \__xeCJK_punct_rule:NN \c__xeCJK_left_tl {#1} - \CJKpunctsymbol {#1} + \tl_gset:Nn \g__xeCJK_last_punct_tl {#1} + \__xeCJK_punct_rule:NN \c__xeCJK_left_tl #1 + \CJKpunctsymbol #1 } \cs_new_protected_nopar:Npn \__xeCJK_Boundary_and_FullLeft_glue:N #1 { - \int_case:nnTF { \etex_lastnodetype:D } + \tl_set_eq:NN \l__xeCJK_alignii_tl \c__xeCJK_left_tl + \group_begin: \exp_args:NNc \group_end: \cs_if_exist_use:NTF + { __xeCJK_bound_type_ \int_use:N \etex_lastnodetype:D _glue:Nn } + {#1} + { \use:n } + { \__xeCJK_punct_glue:NN \c__xeCJK_left_tl #1 } + } +\tl_new:N \c__xeCJK_alignii_tl +\cs_new_protected_nopar:cpn { __xeCJK_bound_type_ -1 _glue:Nn } #1#2 + { \__xeCJK_zero_glue: } +\cs_new_protected_nopar:cpn { __xeCJK_bound_type_ 1 _glue:Nn } #1#2 + { + \box_set_to_last:N \l__xeCJK_tmp_box + \int_compare:nNnTF \etex_lastnodetype:D = { -1 } { - { \c_one } - { - \box_set_to_last:N \l__xeCJK_tmp_box - \bool_lazy_and:nnTF - { \int_compare_p:nNn \etex_lastnodetype:D = { -1 } } - { \dim_compare_p:nNn { \box_wd:N \l__xeCJK_tmp_box } = \tex_parindent:D } - { \box_use_clear:N \l__xeCJK_tmp_box \use_none:n } - { \box_use_clear:N \l__xeCJK_tmp_box \use:n } - } - { -1 } { \__xeCJK_zero_glue: \use_none:n } - { \c_eleven } - { - \bool_lazy_or:nnTF - { ! ( \skip_if_finite_p:n { \tex_lastskip:D } ) } - { \skip_if_eq_p:nn { \tex_lastskip:D } { 1 sp } } - { \__xeCJK_zero_glue: \use_none:n } - { - \skip_if_eq:nnTF { \tex_lastskip:D } { \labelsep } - { - \tex_unskip:D - \bool_lazy_and:nnTF - { \int_compare_p:nNn \etex_lastnodetype:D = \c_thirteen } - { \int_compare_p:nNn \tex_lastpenalty:D = \c_zero } - { \skip_horizontal:n { \labelsep } \use_none:n } - { \skip_horizontal:n { \labelsep } \use:n } - } - { \use:n } - } - } - { \c_thirteen } - { - \int_compare:nNnTF \tex_lastpenalty:D = \c_zero - { - \tex_unpenalty:D - \int_compare:nNnTF \etex_lastnodetype:D = \c_one - { \tex_penalty:D \c_zero \use_none:n } - { \tex_penalty:D \c_zero \use:n } - } - { \use:n } - } + \dim_compare:nNnTF + { \box_wd:N \l__xeCJK_tmp_box } = \tex_parindent:D + { \box_use_drop:N \l__xeCJK_tmp_box } + { \box_use_drop:N \l__xeCJK_tmp_box #2 } + } + { \box_use_drop:N \l__xeCJK_tmp_box #2 } + } +\cs_new_protected_nopar:cpn { __xeCJK_bound_type_ 11 _glue:Nn } #1#2 + { + \skip_if_finite:nTF { \tex_lastskip:D } + { \__xeCJK_bound_glue_auxi:Nn #1 {#2} } + { \__xeCJK_zero_glue: } + } +\cs_new_protected_nopar:Npn \__xeCJK_bound_glue_auxi:Nn #1#2 + { + \__xeCJK_if_last_punct_glue:TF + { \xeCJK_punct_bound_kern:N #1 } + { \__xeCJK_bound_glue_auxii:n {#2} } + } +\cs_new_protected_nopar:Npn \__xeCJK_bound_glue_auxii:n #1 + { + \skip_if_eq:nnTF { \l__xeCJK_last_skip } { 1sp } + { \__xeCJK_zero_glue: } + { + \skip_if_eq:nnTF { \l__xeCJK_last_skip } { \labelsep } + { + \tex_unskip:D + \int_compare:nNnTF \etex_lastnodetype:D = \c_thirteen + { + \int_compare:nNnTF \tex_lastpenalty:D = \c_zero + { \skip_horizontal:N \l__xeCJK_last_skip } + { \skip_horizontal:N \l__xeCJK_last_skip #1 } + } + { \skip_horizontal:N \l__xeCJK_last_skip #1 } + } + {#1} + } + } +\cs_new_protected_nopar:cpn { __xeCJK_bound_type_ 12 _glue:Nn } #1#2 + { + \xeCJK_if_last_node:nF { CJK } + { \xeCJK_if_last_node:nF { CJK-space } { \use_none:nn } } + \xeCJK_remove_node: \CJKglue + #2 + } +\cs_new_protected_nopar:cpn { __xeCJK_bound_type_ 13 _glue:Nn } #1#2 + { + \__xeCJK_if_last_punct_penalty:TF + { \xeCJK_punct_bound_kern:N #1 } + { + \int_compare:nNnTF \tex_lastpenalty:D = \c_zero + { + \tex_unpenalty:D + \int_compare:nNnTF \etex_lastnodetype:D = \c_one + { \tex_penalty:D \c_zero } + { \tex_penalty:D \c_zero #2 } + } + {#2} } - { { \__xeCJK_punct_glue:NN \c__xeCJK_left_tl {#1} } } - { \__xeCJK_punct_glue:NN \c__xeCJK_left_tl {#1} } } \cs_new_protected_nopar:Npn \xeCJK_Default_and_FullRight:nN #1#2 { - \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl {#2} - \__xeCJK_Default_and_FullRight_glue:N {#2} + \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl #2 + \__xeCJK_Default_and_FullRight_glue:N #2 \xeCJK_class_group_begin: - \xeCJK_select_font: + \xeCJK_select_punct_font: \xeCJK_clear_inter_class_toks:nn {#1} { FullRight } \xeCJK_clear_Boundary_and_CJK_toks: - \tl_gset:Nx \g__xeCJK_last_punct_tl {#2} - \xeCJK_FullRight_symbol:N {#2} + \tl_gset:Nn \g__xeCJK_last_punct_tl {#2} + \xeCJK_FullRight_symbol:N #2 } \cs_new_protected_nopar:Npn \xeCJK_Boundary_and_FullRight:N #1 { - \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl {#1} - \__xeCJK_Default_and_FullRight_glue:N {#1} + \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl #1 + \xeCJK_if_last_punct:TF + { + \tl_set_eq:NN \l__xeCJK_alignii_tl \c__xeCJK_right_tl + \xeCJK_punct_bound_kern:N + } + { \__xeCJK_Default_and_FullRight_glue:N } + #1 \xeCJK_class_group_begin: - \xeCJK_select_font: + \xeCJK_select_punct_font: \xeCJK_clear_Boundary_and_CJK_toks: - \tl_gset:Nx \g__xeCJK_last_punct_tl {#1} - \xeCJK_FullRight_symbol:N {#1} + \tl_gset:Nn \g__xeCJK_last_punct_tl {#1} + \xeCJK_FullRight_symbol:N #1 } \cs_new_protected_nopar:Npn \xeCJK_CJK_and_FullRight:N #1 { - \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl {#1} - \__xeCJK_CJK_and_FullRight_glue:N {#1} - \tl_gset:Nx \g__xeCJK_last_punct_tl {#1} - \xeCJK_FullRight_symbol:N {#1} + \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl #1 + \__xeCJK_CJK_and_FullRight_glue:N #1 + \tl_gset:Nn \g__xeCJK_last_punct_tl {#1} + \__xeCJK_select_punct_font: + \xeCJK_FullRight_symbol:N #1 } -\cs_new_protected_nopar:Npn \__xeCJK_CJK_and_FullRight_glue:N #1 +\cs_new_protected_nopar:Npn \xeCJK_if_last_punct:TF { - \__xeCJK_punct_if_long:NTF {#1} - { \CJKglue } + \bool_set_false:N \l__xeCJK_last_penalty_bool + \int_compare:nNnTF \etex_lastnodetype:D = \c_eleven + { \__xeCJK_if_last_punct_glue:TF } { - \__xeCJK_punct_if_middle:NTF {#1} + \int_compare:nNnTF \etex_lastnodetype:D = \c_thirteen + { \__xeCJK_if_last_punct_penalty:TF } + { \use_ii:nn } + } + } +\cs_new_protected:Npn \__xeCJK_if_last_punct_glue:TF #1#2 + { + \skip_set_eq:NN \l__xeCJK_last_skip \tex_lastskip:D + \tex_unskip:D + \int_compare:nNnTF \tex_lastpenalty:D = \c_ten_thousand + { \__xeCJK_if_last_punct_auxi:TF } + { + \xeCJK_if_last_node:TF + { \__xeCJK_if_last_punct_auxii:TF } + { \__xeCJK_if_last_punct_auxiii:TF } + } + {#1} + { \skip_horizontal:N \l__xeCJK_last_skip #2 } + } +\cs_new_protected:Npn \__xeCJK_if_last_punct_penalty:TF #1#2 + { + \int_set_eq:NN \l__xeCJK_last_penalty_int \tex_lastpenalty:D + \tex_unpenalty:D + \bool_set_true:N \l__xeCJK_last_penalty_bool + \int_compare:nNnTF \etex_lastnodetype:D = \c_eleven + { + \__xeCJK_if_last_punct_glue:TF + {#1} + { \tex_penalty:D \l__xeCJK_last_penalty_int #2 } + } + { \tex_penalty:D \l__xeCJK_last_penalty_int #2 } + } +\cs_new_protected:Npn \__xeCJK_if_last_punct_auxi:TF #1#2 + { + \tex_unpenalty:D + \bool_if:NF \l__xeCJK_last_penalty_bool + { + \bool_set_true:N \l__xeCJK_last_penalty_bool + \int_set_eq:NN \l__xeCJK_last_penalty_int \c_ten_thousand + } + \__xeCJK_if_last_punct_auxiv:TF + {#1} + { \xeCJK_no_break: #2 } + } +\cs_new_protected:Npn \__xeCJK_if_last_punct_auxii:TF #1#2 + { + \int_case:nnTF { \xetex_charclass:D \l__xeCJK_last_kern_dim } + { + { \xeCJK_class_num:n { FullRight } } + { \tl_set_eq:NN \l__xeCJK_aligni_tl \c__xeCJK_right_tl } + { \xeCJK_class_num:n { FullLeft } } + { \tl_set_eq:NN \l__xeCJK_aligni_tl \c__xeCJK_left_tl } + } + { \__xeCJK_if_last_punct_auxv:TF {#1} {#2} } + { \__xeCJK_make_node:N \l__xeCJK_last_kern_dim #2 } + } +\cs_new_protected_nopar:Npn \__xeCJK_if_last_punct_auxiii:TF + { + \int_compare:nNnTF \etex_lastnodetype:D = \c_eleven + { \__xeCJK_if_last_punct_auxvi:TF } + { \use_ii:nn } + } +\cs_new_protected_nopar:Npn \__xeCJK_if_last_punct_auxiv:TF + { + \xeCJK_if_last_node:TF + { \__xeCJK_if_last_punct_auxii:TF } + { \use_ii:nn } + } +\cs_new_protected:Npn \__xeCJK_if_last_punct_auxv:TF #1#2 + { + \dim_set_eq:NN \l__xeCJK_tmp_dim \l__xeCJK_last_kern_dim + \xeCJK_if_last_node:TF + { + \tl_gset:Nx \g__xeCJK_last_punct_tl + { \utex_char:D \l__xeCJK_tmp_dim } + \dim_set_eq:NN \l__xeCJK_last_bound_dim \l__xeCJK_last_kern_dim + #1 + } + { \__xeCJK_make_node:N \l__xeCJK_tmp_dim #2 } + } +\cs_new_protected:Npn \__xeCJK_if_last_punct_auxvi:TF #1#2 + { + \int_gset_eq:NN \g__xeCJK_space_factor_int \tex_spacefactor:D + \skip_if_eq:nnTF + { \l__xeCJK_last_skip } + { \c_xeCJK_space_skip_tl } + { + \skip_set_eq:NN \l__xeCJK_tmp_skip \tex_lastskip:D + \tex_unskip:D + \int_compare:nNnTF \tex_lastpenalty:D = \c_ten_thousand + { \__xeCJK_if_last_punct_auxi:TF } + { \__xeCJK_if_last_punct_auxiv:TF } + { \skip_set_eq:NN \l__xeCJK_last_skip \l__xeCJK_tmp_skip #1 } + { \skip_horizontal:N \l__xeCJK_tmp_skip #2 } + } + {#2} + } +\tl_new:N \l__xeCJK_aligni_tl +\tl_new:N \l__xeCJK_alignii_tl +\int_new:N \l__xeCJK_last_penalty_int +\dim_new:N \l__xeCJK_last_bound_dim +\bool_new:N \l__xeCJK_last_penalty_bool +\cs_new_protected:Npn \xeCJK_if_last_node:TF #1#2 + { + \int_compare:nNnTF \etex_lastnodetype:D = \c_twelve + { + \dim_set_eq:NN \l__xeCJK_last_kern_dim \tex_lastkern:D + \tex_unkern:D + \int_compare:nNnTF \etex_lastnodetype:D = \c_twelve { - \xeCJK_no_break: - \__xeCJK_punct_glue:NN \c__xeCJK_right_tl {#1} - \__xeCJK_punct_bound_rule:NN \c__xeCJK_left_tl {#1} + \dim_compare:nNnTF \tex_lastkern:D = { - \l__xeCJK_last_kern_dim } + { \tex_unkern:D #1 } + { \tex_kern:D \l__xeCJK_last_kern_dim #2 } } - { \xeCJK_no_break: } + { \tex_kern:D \l__xeCJK_last_kern_dim #2 } } + {#2} } -\cs_new_eq:NN \__xeCJK_Default_and_FullRight_glue:N \__xeCJK_CJK_and_FullRight_glue:N -\cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_FullLeft:N #1 +\dim_new:N \l__xeCJK_last_kern_dim +\cs_new_protected_nopar:Npn \__xeCJK_CJK_and_FullRight_glue:N #1 { - \xeCJK_no_break: - \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl {#1} - \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl {#1} - \__xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl {#1} - \tl_gset:Nx \g__xeCJK_last_punct_tl {#1} - \CJKpunctsymbol {#1} + \__xeCJK_punct_if_long:NTF #1 + { \xeCJK_allow_break: } + { \xeCJK_no_break: } + \__xeCJK_punct_if_middle:NT #1 + { + \CJKglue + \__xeCJK_punct_glue:NN \c__xeCJK_right_tl #1 + \__xeCJK_punct_bound_rule:NN \c__xeCJK_left_tl #1 + } } -\cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_FullRight:N #1 +\cs_new_protected_nopar:Npn \__xeCJK_Default_and_FullRight_glue:N #1 { - \xeCJK_no_break: - \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl {#1} - \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl {#1} - \__xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl {#1} - \tl_gset:Nx \g__xeCJK_last_punct_tl {#1} - \xeCJK_no_break: - \xeCJK_FullRight_symbol:N {#1} + \__xeCJK_punct_if_long:NTF #1 + { \xeCJK_allow_break: } + { \xeCJK_no_break: } + \__xeCJK_punct_if_middle:NT #1 + { + \__xeCJK_punct_glue:NN \c__xeCJK_right_tl #1 + \__xeCJK_punct_bound_rule:NN \c__xeCJK_left_tl #1 + } } -\cs_new_protected_nopar:Npn \xeCJK_FullRight_and_FullLeft:N #1 +\cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_FullLeft:N #1 { - \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl {#1} - \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl {#1} - \xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl {#1} - \tl_gset:Nx \g__xeCJK_last_punct_tl {#1} - \CJKpunctsymbol {#1} + \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl #1 + \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl #1 + \__xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl #1 + \tl_gset:Nn \g__xeCJK_last_punct_tl {#1} + \CJKpunctsymbol #1 } -\cs_new_protected_nopar:Npn \__xeCJK_punct_nobreak_kern:NN #1#2 +\cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_FullRight:N #1 { - \__xeCJK_punct_kern:NN #1#2 - \xeCJK_no_break: + \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl #1 + \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl #1 + \__xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl #1 + \tl_gset:Nn \g__xeCJK_last_punct_tl {#1} + \xeCJK_FullRight_symbol:N #1 } -\cs_new_eq:NN \xeCJK_punct_kern:NN \__xeCJK_punct_nobreak_kern:NN -\cs_new_protected_nopar:Npn \__xeCJK_punct_breakable_kern:NN #1#2 +\cs_new_protected_nopar:Npn \xeCJK_FullRight_and_FullLeft:N #1 { - \__xeCJK_punct_rule:NN \c__xeCJK_right_tl #1 - \__xeCJK_punct_breakable_kern:n - { \__xeCJK_use_dim_or_skip:nnn { break_kern } {#1} {#2} } - \__xeCJK_punct_rule:NN \c__xeCJK_left_tl #2 + \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl #1 + \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl #1 + \xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl #1 + \tl_gset:Nn \g__xeCJK_last_punct_tl {#1} + \CJKpunctsymbol #1 } -\cs_new_eq:NN \__xeCJK_punct_breakable_kern:n \skip_horizontal:n \cs_new_protected_nopar:Npn \xeCJK_FullRight_and_FullRight:N #1 { - \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl {#1} - \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl {#1} - \__xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl {#1} - \tl_gset:Nx \g__xeCJK_last_punct_tl {#1} - \xeCJK_no_break: - \xeCJK_FullRight_symbol:N {#1} + \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl #1 + \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl #1 + \__xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl #1 + \tl_gset:Nn \g__xeCJK_last_punct_tl {#1} + \xeCJK_FullRight_symbol:N #1 } \keys_define:nn { xeCJK / options } { @@ -1383,18 +1767,24 @@ { \cs_if_eq:NNF \xeCJK_FullRight_and_Boundary: \xeCJK_check_FullRight: { - \cs_set_eq:NN \__xeCJK_save_FullRight_check: \xeCJK_FullRight_and_Boundary: - \cs_set_eq:NN \__xeCJK_save_FullRight_symbol:N \xeCJK_FullRight_symbol:N - \cs_set_eq:NN \xeCJK_FullRight_and_Boundary: \xeCJK_check_FullRight: - \cs_set_eq:NN \xeCJK_FullRight_symbol:N \xeCJK_check_FullRight_symbol:Nw + \cs_set_eq:NN \__xeCJK_save_FullRight_check: + \xeCJK_FullRight_and_Boundary: + \cs_set_eq:NN \__xeCJK_save_FullRight_symbol:N + \xeCJK_FullRight_symbol:N + \cs_set_eq:NN \xeCJK_FullRight_and_Boundary: + \xeCJK_check_FullRight: + \cs_set_eq:NN \xeCJK_FullRight_symbol:N + \xeCJK_check_FullRight_symbol:Nw } } , CheckFullRight / false .code:n = { \cs_if_eq:NNT \xeCJK_FullRight_and_Boundary: \xeCJK_check_FullRight: { - \cs_set_eq:NN \xeCJK_FullRight_and_Boundary: \__xeCJK_save_FullRight_check: - \cs_set_eq:NN \xeCJK_FullRight_symbol:N \__xeCJK_save_FullRight_symbol:N + \cs_set_eq:NN \xeCJK_FullRight_and_Boundary: + \__xeCJK_save_FullRight_check: + \cs_set_eq:NN \xeCJK_FullRight_symbol:N + \__xeCJK_save_FullRight_symbol:N } } , CheckFullRight .default:n = { true } @@ -1402,20 +1792,28 @@ \cs_new_nopar:Npn \xeCJK_FullRight_symbol:N { \CJKpunctsymbol } \cs_new_protected_nopar:Npn \xeCJK_check_FullRight: { - \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \xeCJK_get_punct_bounds:No \c__xeCJK_right_tl \g__xeCJK_last_punct_tl \__xeCJK_punct_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl - \__xeCJK_punct_offset:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl \group_align_safe_begin: \tl_case:NoTF \l_peek_token { \l__xeCJK_no_break_cs_case_tl } - { \group_align_safe_end: \xeCJK_no_break: } + { + \group_align_safe_end: + \xeCJK_no_break: + \group_insert_after:N \xeCJK_no_break: + } { \group_align_safe_end: } - \__xeCJK_punct_glue:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \__xeCJK_punct_offset:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \exp_after:wN \xeCJK_punct_node:N \g__xeCJK_last_punct_tl \xeCJK_class_group_end: + \__xeCJK_punct_glue:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl } -\cs_generate_variant:Nn \tl_case:NnTF { No } +\prg_generate_conditional_variant:Nnn \tl_case:Nn { No } { TF , F } \cs_new_protected_nopar:Npn \xeCJK_check_FullRight_symbol:Nw #1 - { \xeCJK_peek_after_ignore_spaces:nw { \__xeCJK_save_FullRight_symbol:N {#1} } } + { + \xeCJK_peek_after_ignore_spaces:nw + { \__xeCJK_save_FullRight_symbol:N #1 } + } \cs_new_protected:Npn \xeCJK_cs_case_keys_define:nNNnn #1#2#3#4#5 { \tl_new:N #2 @@ -1456,13 +1854,30 @@ \bool_if:NTF \l__xeCJK_tmp_bool { \bool_set_false:N \l__xeCJK_tmp_bool - \skip_set_eq:NN \l__xeCJK_tmp_skip \tex_lastskip:D + \skip_set_eq:NN \l__xeCJK_last_skip \tex_lastskip:D } - { \skip_add:Nn \l__xeCJK_tmp_skip \tex_lastskip:D } + { \skip_add:Nn \l__xeCJK_last_skip \tex_lastskip:D } \tex_unskip:D } + \xeCJK_if_last_node:TF + { + \dim_set_eq:NN \l__xeCJK_tmp_dim \l__xeCJK_last_kern_dim + \xeCJK_if_last_node:TF + { + \int_compare:nNnT \etex_lastnodetype:D = \c_eleven + { + \exp_args:NNNo \tex_unskip:D \xeCJK_no_break: + \skip_horizontal:n { \skip_use:N \tex_lastskip:D } + } + \__xeCJK_make_node:N \l__xeCJK_last_kern_dim + } + { } + \__xeCJK_make_node:N \l__xeCJK_tmp_dim + } + { } \xeCJK_no_break: - \bool_if:NF \l__xeCJK_tmp_bool { \skip_horizontal:N \l__xeCJK_tmp_skip } + \bool_if:NF \l__xeCJK_tmp_bool + { \skip_horizontal:N \l__xeCJK_last_skip } } \keys_define:nn { xeCJK / options } { @@ -1598,7 +2013,6 @@ { \__xeCJK_check_single_end:N #1 #2#3 } } \tl_new:N \l__xeCJK_check_single_cs_case_tl -\cs_generate_variant:Nn \tl_case:NnF { No } \cs_new_protected_nopar:Npn \xeCJK_check_single_env:nnNn #1#2#3#4 { \str_case_x:noTF {#4} @@ -1607,7 +2021,7 @@ {#1} #3 {#4} } -\cs_generate_variant:Nn \str_case_x:nnTF { no } +\prg_generate_conditional_variant:Nnn \str_case_x:nn { no } { TF } \xeCJK_cs_case_keys_define:nNNnn { NewLineCS } \l__xeCJK_new_line_cs_case_tl \l__xeCJK_new_line_cs_seq { \use_ii:nnn } @@ -1686,9 +2100,9 @@ { \int_if_exist:cTF { \__xeCJK_class_csname:n { CJK/##1 } } { - \xeCJK_declare_char_class:nc + \xeCJK_declare_char_class:nn { CJK \bool_if:NF \l__xeCJK_sub_cancel_bool { /##1 } } - { g__xeCJK_CJK/##1_range_clist } + { \use:c { g__xeCJK_CJK/##1_range_clist } } } { \__xeCJK_error:nx { SubBlock-undefined } {##1} } } @@ -1792,11 +2206,15 @@ { \bool_set_true:N \l__xeCJK_punct_breakable_bool \cs_set_eq:NN \xeCJK_punct_kern:NN \__xeCJK_punct_breakable_kern:NN + \cs_set_eq:NN \__xeCJK_punct_bound_kern:N + \__xeCJK_punct_bound_breakable_kern:N } , AllowBreakBetweenPuncts / false .code:n = { \bool_set_false:N \l__xeCJK_punct_breakable_bool - \cs_set_eq:NN \xeCJK_punct_kern:NN \__xeCJK_punct_nobreak_kern:NN + \cs_set_eq:NN \xeCJK_punct_kern:NN \__xeCJK_punct_kern:NN + \cs_set_eq:NN \__xeCJK_punct_bound_kern:N + \__xeCJK_nobreak_hskip:N } , AllowBreakBetweenPuncts .default:n = { true } , KaiMingPunct .code:n = { \__xeCJK_set_special_punct:nn { mixed_width } {#1} } , @@ -1815,13 +2233,13 @@ RubberPunctSkip .choice: , RubberPunctSkip .default:n = { true } , RubberPunctSkip / true .code:n = - { \cs_set_eq:NN \__xeCJK_use_dim_or_skip:nnn \__xeCJK_use_punct_skip:nnn } , + { \cs_set_eq:NN \__xeCJK_use_dim_or_skip:nNN \__xeCJK_use_punct_skip:nNN } , RubberPunctSkip / plus .code:n = - { \cs_set_eq:NN \__xeCJK_use_dim_or_skip:nnn \__xeCJK_use_punct_skip_plus:nnn } , + { \cs_set_eq:NN \__xeCJK_use_dim_or_skip:nNN \__xeCJK_use_punct_skip_plus:nNN } , RubberPunctSkip / minus .code:n = - { \cs_set_eq:NN \__xeCJK_use_dim_or_skip:nnn \__xeCJK_use_punct_skip_minus:nnn } , + { \cs_set_eq:NN \__xeCJK_use_dim_or_skip:nNN \__xeCJK_use_punct_skip_minus:nNN } , RubberPunctSkip / false .code:n = - { \cs_set_eq:NN \__xeCJK_use_dim_or_skip:nnn \__xeCJK_use_punct_dim:nnn } + { \cs_set_eq:NN \__xeCJK_use_dim_or_skip:nNN \__xeCJK_use_punct_dim:nNN } } \bool_new:N \l__xeCJK_punct_breakable_bool \clist_new:N \g__xeCJK_special_punct_clist @@ -1862,7 +2280,8 @@ } \prg_new_conditional:Npnn \__xeCJK_punct_if_right:N #1 { p , T , F , TF } { - \if_int_compare:w \xeCJK_token_value_class:N #1 = \xeCJK_class_num:n { FullRight } + \if_int_compare:w \xeCJK_token_value_class:N #1 = + \xeCJK_class_num:n { FullRight } \prg_return_true: \else: \prg_return_false: \fi: } \clist_map_inline:Nn \g__xeCJK_special_punct_clist @@ -1876,27 +2295,27 @@ } \cs_new:Npn \__xeCJK_punct_csname:n #1 { c__xeCJK_\l_xeCJK_current_font_tl/\l_xeCJK_punct_style_tl/#1/tl } -\cs_new:Npn \__xeCJK_use_punct_dim:nn #1#2 +\cs_new:Npn \__xeCJK_use_punct_dim:nN #1#2 { \use:c { \__xeCJK_punct_csname:n { dim/#1/#2 } } } -\cs_new:Npn \__xeCJK_use_punct_dim:nnn #1#2#3 +\cs_new:Npn \__xeCJK_use_punct_dim:nNN #1#2#3 { \use:c { \__xeCJK_punct_csname:n { dim/#1/#2/#3 } } } -\cs_new:Npn \__xeCJK_use_punct_skip:nnn #1#2#3 +\cs_new:Npn \__xeCJK_use_punct_skip:nNN #1#2#3 { \use:c { \__xeCJK_punct_csname:n { skip/#1/#2/#3 } } } -\cs_new:Npn \__xeCJK_use_punct_skip_plus:nnn #1#2#3 +\cs_new:Npn \__xeCJK_use_punct_skip_plus:nNN #1#2#3 { \use:c { \__xeCJK_punct_csname:n { skip/plus/#1/#2/#3 } } } -\cs_new:Npn \__xeCJK_use_punct_skip_minus:nnn #1#2#3 +\cs_new:Npn \__xeCJK_use_punct_skip_minus:nNN #1#2#3 { \use:c { \__xeCJK_punct_csname:n { skip/minus/#1/#2/#3 } } } -\cs_new_protected:Npn \__xeCJK_save_punct_dim:nnn #1#2 +\cs_new_protected:Npn \__xeCJK_save_punct_dim:nNn #1#2 { \__xeCJK_save_punct_width_aux:nnn { dim } { #1/#2 } } -\cs_new_protected:Npn \__xeCJK_save_punct_dim:nnnn #1#2#3 +\cs_new_protected:Npn \__xeCJK_save_punct_dim:nNNn #1#2#3 { \__xeCJK_save_punct_width_aux:nnn { dim } { #1/#2/#3 } } -\cs_new_protected:Npn \__xeCJK_save_punct_skip:nnnn #1#2#3#4 +\cs_new_protected:Npn \__xeCJK_save_punct_skip:nNNn #1#2#3#4 { \__xeCJK_save_punct_width_aux:nnn { skip } { #1/#2/#3 } {#4} \__xeCJK_save_punct_width_aux:nnn { skip } { plus/#1/#2/#3 } {#4} \__xeCJK_save_punct_width_aux:nnn { skip } { minus/#1/#2/#3 } {#4} } -\cs_new_protected:Npn \__xeCJK_save_punct_skip:nnnnnn #1#2#3#4#5#6 +\cs_new_protected:Npn \__xeCJK_save_punct_skip:nNNnnn #1#2#3#4#5#6 { \use:x { @@ -1908,16 +2327,19 @@ } \cs_new_protected:Npn \__xeCJK_save_punct_skip_aux:nnnn #1#2#3#4 { - \__xeCJK_save_punct_width_aux:nnn { skip } {#1} { #2 ~ plus ~ #3 ~ minus ~ #4 ~ } - \__xeCJK_save_punct_width_aux:nnn { skip } { plus/#1 } { #2 ~ plus ~ #3 ~ } - \__xeCJK_save_punct_width_aux:nnn { skip } { minus/#1 } { #2 ~ minus ~ #4 ~ } + \__xeCJK_save_punct_width_aux:nnn { skip } + {#1} { #2 ~ plus ~ #3 ~ minus ~ #4 ~ } + \__xeCJK_save_punct_width_aux:nnn { skip } + { plus/#1 } { #2 ~ plus ~ #3 ~ } + \__xeCJK_save_punct_width_aux:nnn { skip } + { minus/#1 } { #2 ~ minus ~ #4 ~ } } \cs_new_protected:Npn \__xeCJK_save_punct_width_aux:nnn #1#2#3 { \tl_const:cx { \__xeCJK_punct_csname:n { #1/#2 } } { \use:c { #1_eval:n } {#3} } } -\cs_new_eq:NN \__xeCJK_use_dim_or_skip:nnn \__xeCJK_use_punct_skip:nnn +\cs_new_eq:NN \__xeCJK_use_dim_or_skip:nNN \__xeCJK_use_punct_skip:nNN \DeclareObjectType { xeCJK / punctuation } { \c_zero } \DeclareTemplateInterface { xeCJK / punctuation } { basic } { \c_zero } { @@ -1995,32 +2417,37 @@ \cs_new_protected_nopar:Npn \xeCJK_get_punct_bounds:NN #1#2 { \tl_if_exist:cF { \__xeCJK_punct_csname:n { dim/glue/#1/#2 } } + { \__xeCJK_get_punct_bounds_aux:NN #1 #2 } + } +\cs_new_protected_nopar:Npn \__xeCJK_get_punct_bounds_aux:NN #1#2 + { + \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c__xeCJK_punct_style_plain_tl { - \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c__xeCJK_punct_style_plain_tl - { - \__xeCJK_save_punct_dim:nnnn { rule } {#1} {#2} { \c_zero_dim } - \__xeCJK_save_punct_dim:nnnn { glue } {#1} {#2} { \c_zero_dim } - \__xeCJK_save_punct_dim:nnnn { offset } {#1} {#2} { \c_zero_dim } - \__xeCJK_save_punct_dim:nnnn { bound } \c__xeCJK_left_tl {#2} { \c_zero_dim } - \__xeCJK_save_punct_dim:nnnn { bound } \c__xeCJK_right_tl {#2} { \c_zero_dim } - \__xeCJK_save_punct_skip:nnnn { glue } {#1} {#2} { \c_zero_skip } - } + \__xeCJK_save_punct_dim:nNNn { rule } #1 #2 { \c_zero_dim } + \__xeCJK_save_punct_dim:nNNn { glue } #1 #2 { \c_zero_dim } + \__xeCJK_save_punct_dim:nNNn { offset } #1 #2 { \c_zero_dim } + \__xeCJK_save_punct_dim:nNNn { bound } \c__xeCJK_left_tl {#2} { \c_zero_dim } + \__xeCJK_save_punct_dim:nNNn { bound } \c__xeCJK_right_tl {#2} { \c_zero_dim } + \__xeCJK_save_punct_skip:nNNn { glue } #1 #2 { \c_zero_skip } + } + { + { \xeCJK_select_punct_font: \xeCJK_calc_punct_dimen:N #2 } + \dim_set:Nn \l__xeCJK_bound_dim + { \__xeCJK_use_punct_dim:nNN { bound } #1 #2 } + \dim_set:Nn \l__xeCJK_reverse_bound_dim { - { \xeCJK_select_font: \xeCJK_calc_punct_dimen:o {#2} } - \dim_set:Nn \l__xeCJK_bound_dim - { \__xeCJK_use_punct_dim:nnn { bound } {#1} {#2} } - \dim_set:Nn \l__xeCJK_reverse_bound_dim - { - \__xeCJK_use_punct_dim:nnn { bound } - { \xeCJK_reverse:nnn {#1} \c__xeCJK_left_tl \c__xeCJK_right_tl } - {#2} - } - \UseInstance { xeCJK / punctuation } { \l_xeCJK_punct_style_tl } - \xeCJK_punct_margin_process:NN {#1} {#2} - \xeCJK_punct_offset_process:NN {#1} {#2} + \tl_if_eq:NNTF #1 \c__xeCJK_left_tl + { \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_right_tl } + { \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_left_tl } + #2 } + \UseInstance { xeCJK / punctuation } { \l_xeCJK_punct_style_tl } + \xeCJK_punct_margin_process:NN #1 #2 + \xeCJK_punct_offset_process:NN #1 #2 } } +\cs_new_protected_nopar:Npn \xeCJK_get_punct_bounds:No + { \exp_last_unbraced:NNo \xeCJK_get_punct_bounds:NN } \dim_new:N \l__xeCJK_bound_dim \dim_new:N \l__xeCJK_reverse_bound_dim \cs_new_protected_nopar:Npn \xeCJK_get_punct_kerning:NN #1#2 @@ -2029,42 +2456,36 @@ { \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c__xeCJK_punct_style_plain_tl { - \__xeCJK_save_punct_dim:nnnn { kern } {#1} {#2} { \c_zero_dim } - \__xeCJK_save_punct_dim:nnnn { break_kern } {#1} {#2} { \c_zero_dim } - \__xeCJK_save_punct_skip:nnnn { kern } {#1} {#2} { \c_zero_skip } - \__xeCJK_save_punct_skip:nnnn { break_kern } {#1} {#2} { \c_zero_skip } + \__xeCJK_save_punct_dim:nNNn { kern } #1 #2 { \c_zero_dim } + \__xeCJK_save_punct_dim:nNNn { break_kern } #1 #2 { \c_zero_dim } + \__xeCJK_save_punct_dim:nNNn { bound_kern } #1 #2 { \c_zero_dim } + \__xeCJK_save_punct_dim:nNNn { bound_width } #1 #2 { \c_zero_dim } + \__xeCJK_save_punct_skip:nNNn { kern } #1 #2 { \c_zero_skip } + \__xeCJK_save_punct_skip:nNNn { break_kern } #1 #2 { \c_zero_skip } + \__xeCJK_save_punct_skip:nNNn { bound_kern } #1 #2 { \c_zero_skip } } { \UseInstance { xeCJK / punctuation } { \l_xeCJK_punct_style_tl } - \xeCJK_punct_kerning_process:NN {#1} {#2} + \xeCJK_punct_kerning_process:NN #1 #2 } } } -\cs_generate_variant:Nn \xeCJK_get_punct_kerning:NN { o } +\cs_new_protected_nopar:Npn \xeCJK_get_punct_kerning:oN + { \exp_after:wN \xeCJK_get_punct_kerning:NN } \cs_new_protected_nopar:Npn \xeCJK_punct_margin_process:NN #1#2 { \dim_set:Nn \l__xeCJK_tmp_dim { \bool_if:NTF \l__xeCJK_enabled_global_setting_bool { - \cs_if_exist_use:cTF { g__xeCJK_punct_width/#2/tl } - { \use_none:n } + \cs_if_exist_use:cF { g__xeCJK_punct_width/#2/tl } { \tl_if_empty:NTF \g__xeCJK_punct_width_tl - { \use:n } - { \g__xeCJK_punct_width_tl \use_none:n } - } - } - { \use:n } - { - \__xeCJK_punct_if_middle:NTF {#2} - { \__xeCJK_punct_width_or_ratio:nN { middle } {#2} } - { - \__xeCJK_punct_if_mixed_width:NTF {#2} - { \__xeCJK_punct_width_or_ratio:nN { mixed } {#2} } - { \__xeCJK_punct_width_or_ratio:nN { fixed } {#2} } + { \__xeCJK_calc_punct_width:N #2 } + { \g__xeCJK_punct_width_tl } } } + { \__xeCJK_calc_punct_width:N #2 } } \dim_set:Nn \l__xeCJK_tmp_dim { @@ -2073,22 +2494,27 @@ { \dim_compare:nNnTF \l__xeCJK_tmp_dim < \c_max_dim { - \__xeCJK_punct_if_middle:NTF {#2} + \__xeCJK_punct_if_middle:NTF #2 { - ( - \l__xeCJK_tmp_dim - ( \__xeCJK_use_punct_dim:nn { dimen } {#2} ) + ( \l__xeCJK_tmp_dim + - ( \__xeCJK_use_punct_dim:nN { dimen } #2 ) ) / \c_two } { \bool_if:NTF \l__xeCJK_optimize_margin_bool { \dim_max:nn - { \dim_min:nn \l__xeCJK_bound_dim \l__xeCJK_reverse_bound_dim } + { + \dim_min:nn + { \l__xeCJK_bound_dim } + { \l__xeCJK_reverse_bound_dim } + } } { \use:n } { - \l__xeCJK_tmp_dim - \l__xeCJK_reverse_bound_dim - - ( \__xeCJK_use_punct_dim:nn { dimen } {#2} ) + \l__xeCJK_tmp_dim + - \l__xeCJK_reverse_bound_dim + - ( \__xeCJK_use_punct_dim:nN { dimen } #2 ) } } } @@ -2096,61 +2522,72 @@ \bool_if:NTF \l__xeCJK_optimize_margin_bool { \dim_min:nn { \l__xeCJK_bound_dim } } { \use:n } - { - \__xeCJK_punct_if_middle:NTF {#2} - { - \dim_compare:nNnTF \l__xeCJK_middle_margin_width_dim < \c_max_dim - { \l__xeCJK_middle_margin_width_dim } - { - \fp_use:N \l__xeCJK_middle_margin_ratio_fp - \etex_dimexpr:D - ( \l__xeCJK_bound_dim + \l__xeCJK_reverse_bound_dim ) / \c_two - \scan_stop: - } - } - { - \__xeCJK_punct_if_mixed_width:NTF {#2} - { \__xeCJK_margin_width_or_ratio:n { mixed } } - { \__xeCJK_margin_width_or_ratio:n { fixed } } - } - } + { \__xeCJK_calc_margin_width:N #2 } } } } - \__xeCJK_save_punct_dim:nnnn { glue } {#1} {#2} { \l__xeCJK_tmp_dim } - \__xeCJK_save_punct_skip:nnnnnn { glue } {#1} {#2} + \__xeCJK_save_punct_dim:nNNn { glue } #1 #2 { \l__xeCJK_tmp_dim } + \__xeCJK_save_punct_skip:nNNnnn { glue } #1 #2 { \l__xeCJK_tmp_dim } { - \__xeCJK_punct_if_middle:NTF {#2} + \__xeCJK_punct_if_middle:NTF #2 { - ( \__xeCJK_use_punct_dim:nn { width } {#2} - - \__xeCJK_use_punct_dim:nn { dimen } {#2} ) / \c_two + ( \__xeCJK_use_punct_dim:nN { width } #2 - + \__xeCJK_use_punct_dim:nN { dimen } #2 ) / \c_two - \l__xeCJK_tmp_dim } { \l__xeCJK_bound_dim - \l__xeCJK_tmp_dim } } { - \__xeCJK_punct_if_middle:NTF {#2} + \__xeCJK_punct_if_middle:NTF #2 { .5 \l__xeCJK_tmp_dim } { \l__xeCJK_tmp_dim - \l__xeCJK_reverse_bound_dim } } } +\cs_new_nopar:Npn \__xeCJK_calc_punct_width:N #1 + { + \__xeCJK_punct_if_middle:NTF #1 + { \__xeCJK_punct_width_or_ratio:nN { middle } } + { + \__xeCJK_punct_if_mixed_width:NTF #1 + { \__xeCJK_punct_width_or_ratio:nN { mixed } } + { \__xeCJK_punct_width_or_ratio:nN { fixed } } + } + #1 + } +\cs_new_nopar:Npn \__xeCJK_calc_margin_width:N #1 + { + \__xeCJK_punct_if_middle:NTF #1 + { + \dim_compare:nNnTF \l__xeCJK_middle_margin_width_dim < \c_max_dim + { \l__xeCJK_middle_margin_width_dim } + { + \fp_use:N \l__xeCJK_middle_margin_ratio_fp + \etex_dimexpr:D + ( \l__xeCJK_bound_dim + \l__xeCJK_reverse_bound_dim ) / \c_two + \scan_stop: + } + } + { + \__xeCJK_punct_if_mixed_width:NTF #1 + { \__xeCJK_margin_width_or_ratio:n { mixed } } + { \__xeCJK_margin_width_or_ratio:n { fixed } } + } + } \cs_new_protected_nopar:Npn \xeCJK_punct_offset_process:NN #1#2 { \dim_set:Nn \l__xeCJK_tmp_dim { \bool_if:NTF \l__xeCJK_enabled_global_setting_bool { - \cs_if_exist_use:cTF { g__xeCJK_punct_bound_width/#2/tl } - { \use_none:n } + \cs_if_exist_use:cF { g__xeCJK_punct_bound_width/#2/tl } { \tl_if_empty:NTF \g__xeCJK_punct_bound_width_tl - { \use:n } - { \g__xeCJK_punct_bound_width_tl \use_none:n } + { \__xeCJK_punct_width_or_ratio:nN { bound } #2 } + { \g__xeCJK_punct_bound_width_tl } } } - { \use:n } - { \__xeCJK_punct_width_or_ratio:nN { bound } {#2} } + { \__xeCJK_punct_width_or_ratio:nN { bound } #2 } } \dim_set:Nn \l__xeCJK_tmp_dim { @@ -2160,15 +2597,16 @@ { \dim_compare:nNnTF \l__xeCJK_tmp_dim < \c_max_dim { - \__xeCJK_punct_if_middle:NTF {#2} + \__xeCJK_punct_if_middle:NTF #2 { - \l__xeCJK_tmp_dim - - ( \__xeCJK_use_punct_dim:nnn { glue } {#1} {#2} ) - - ( \__xeCJK_use_punct_dim:nn { dimen } {#2} ) + \l__xeCJK_tmp_dim + - ( \__xeCJK_use_punct_dim:nNN { glue } #1 #2 ) + - ( \__xeCJK_use_punct_dim:nN { dimen } #2 ) } { - \l__xeCJK_tmp_dim - \l__xeCJK_reverse_bound_dim - - ( \__xeCJK_use_punct_dim:nn { dimen } {#2} ) + \l__xeCJK_tmp_dim + - \l__xeCJK_reverse_bound_dim + - ( \__xeCJK_use_punct_dim:nN { dimen } #2 ) } } { @@ -2179,8 +2617,9 @@ } } } - \__xeCJK_save_punct_dim:nnnn { offset } {#1} {#2} { \l__xeCJK_tmp_dim } - \__xeCJK_save_punct_dim:nnnn { rule } {#1} {#2} + \__xeCJK_save_punct_dim:nNNn { offset } #1 #2 + { \l__xeCJK_tmp_dim } + \__xeCJK_save_punct_dim:nNNn { rule } #1 #2 { - \l__xeCJK_bound_dim + \l__xeCJK_tmp_dim } } \cs_new_nopar:Npn \__xeCJK_punct_width_or_ratio:nN #1#2 @@ -2192,7 +2631,7 @@ { \c_max_dim } { \fp_use:c { l__xeCJK_#1_punct_ratio_fp } - \etex_dimexpr:D \__xeCJK_use_punct_dim:nn { width } {#2} \scan_stop: + \etex_dimexpr:D \__xeCJK_use_punct_dim:nN { width } #2 \scan_stop: } } } @@ -2210,51 +2649,95 @@ \cs_new_protected_nopar:Npn \xeCJK_punct_kerning_process:NN #1#2 { \dim_set:Nn \l__xeCJK_original_margin_dim - { \__xeCJK_original_kerning_margin:NN {#1} {#2} } + { \__xeCJK_original_kerning_margin:NN #1 #2 } \dim_set:Nn \l__xeCJK_minimum_bound_dim - { \__xeCJK_punct_min_bound:NN {#1} {#2} } - \__xeCJK_punct_if_long:NTF {#1} + { \__xeCJK_punct_min_bound:NN #1 #2 } + \__xeCJK_punct_if_long:NTF #1 { \bool_set_false:N \l__xeCJK_enabled_kerning_bool } { - \__xeCJK_punct_if_long:NT {#2} + \__xeCJK_punct_if_long:NT #2 { \bool_set_false:N \l__xeCJK_enabled_kerning_bool } } \dim_set:Nn \l__xeCJK_kerning_margin_dim { \bool_if:NTF \l__xeCJK_enabled_global_setting_bool { - \cs_if_exist_use:cTF { g__xeCJK_punct/kern/#1/#2/tl } - { \use_none:n } - { \use:n } + \cs_if_exist_use:cF { g__xeCJK_punct/kern/#1/#2/tl } + { \__xeCJK_punct_kerning_process_aux:NN #1 #2 } + } + { \__xeCJK_punct_kerning_process_aux:NN #1 #2 } + } + \__xeCJK_save_kerning:nnNN { kern } { bound } #1 #2 + \__xeCJK_save_punct_dim:nNNn { bound_width } #1 #2 + { \l__xeCJK_kerning_margin_dim - \l__xeCJK_tmp_dim } + \__xeCJK_punct_if_right:NTF #1 + { + \__xeCJK_punct_if_right:NTF #2 + { + \__xeCJK_save_kerning:nNNNN + { bound_kern } \c__xeCJK_left_tl #2 #1 #2 + \__xeCJK_save_kerning:nnnNN + { break_kern } { offset } { bound } } - { \use:n } { - \bool_if:NTF \l__xeCJK_enabled_kerning_bool - { \__xeCJK_calc_kerning_margin:NN {#1} {#2} } - { \l__xeCJK_original_margin_dim } + \__xeCJK_save_kerning:nnNN + { break_kern } { offset } #1 #2 + \__xeCJK_save_kerning_aux:nnNN + { bound_kern } { \l__xeCJK_kerning_margin_dim } } } - \__xeCJK_save_kerning:nnNN { kern } { bound } {#1} {#2} - \__xeCJK_punct_if_right:NF {#2} { - \__xeCJK_punct_if_right:NT {#1} - { \__xeCJK_save_kerning:nnNN { break_kern } { offset } {#1} {#2} } + \__xeCJK_punct_if_right:NTF #2 + { + \__xeCJK_save_kerning:nnNN + { bound_kern } { bound } #1 #2 + \__xeCJK_save_kerning_aux:nnNN + { break_kern } { \l__xeCJK_tmp_dim } + } + { + \__xeCJK_save_kerning:nNNNN + { bound_kern } \c__xeCJK_right_tl #1 #1 #2 + \__xeCJK_save_kerning:nnnNN + { break_kern } { bound } { offset } + } } + #1 #2 + } +\cs_new_nopar:Npn \__xeCJK_punct_kerning_process_aux:NN #1#2 + { + \bool_if:NTF \l__xeCJK_enabled_kerning_bool + { \__xeCJK_calc_kerning_margin:NN #1 #2 } + { \l__xeCJK_original_margin_dim } } \dim_new:N \l__xeCJK_minimum_bound_dim \dim_new:N \l__xeCJK_kerning_margin_dim \dim_new:N \l__xeCJK_original_margin_dim -\cs_new_protected_nopar:Npn \__xeCJK_save_kerning:nnNN #1#2#3#4 +\cs_new_protected_nopar:Npn \__xeCJK_save_kerning:nnNN #1#2 + { \__xeCJK_save_kerning:nnnNN {#1} {#2} {#2} } +\cs_new_protected_nopar:Npn \__xeCJK_save_kerning:nnnNN #1#2#3#4#5 { \dim_set:Nn \l__xeCJK_tmp_dim { - \l__xeCJK_kerning_margin_dim - - ( \__xeCJK_use_punct_dim:nnn {#2} \c__xeCJK_right_tl {#3} ) - - ( \__xeCJK_use_punct_dim:nnn {#2} \c__xeCJK_left_tl {#4} ) + \l__xeCJK_kerning_margin_dim + - ( \__xeCJK_use_punct_dim:nNN {#2} \c__xeCJK_right_tl #4 ) + - ( \__xeCJK_use_punct_dim:nNN {#3} \c__xeCJK_left_tl #5 ) } - \__xeCJK_save_punct_dim:nnnn {#1} {#3} {#4} { \l__xeCJK_tmp_dim } - \__xeCJK_save_punct_skip:nnnnnn {#1} {#3} {#4} - { \l__xeCJK_tmp_dim } + \__xeCJK_save_kerning_aux:nnNN {#1} { \l__xeCJK_tmp_dim } #4 #5 + } +\cs_new_protected_nopar:Npn \__xeCJK_save_kerning:nNNNN #1#2#3#4#5 + { + \dim_set:Nn \l__xeCJK_tmp_dim + { + \l__xeCJK_kerning_margin_dim + - ( \__xeCJK_use_punct_dim:nNN { bound } #2 #3 ) + } + \__xeCJK_save_kerning_aux:nnNN {#1} { \l__xeCJK_tmp_dim } #4 #5 + } +\cs_new_protected_nopar:Npn \__xeCJK_save_kerning_aux:nnNN #1#2#3#4 + { + \__xeCJK_save_punct_dim:nNNn {#1} #3 #4 {#2} + \__xeCJK_save_punct_skip:nNNnnn {#1} #3 #4 + {#2} { \l__xeCJK_original_margin_dim - \l__xeCJK_kerning_margin_dim } { \l__xeCJK_kerning_margin_dim - \l__xeCJK_minimum_bound_dim } } @@ -2262,12 +2745,11 @@ { \dim_eval:n { - \__xeCJK_use_punct_dim:nnn - { \__xeCJK_punct_if_right:NTF {#1} { glue } { bound } } - { \c__xeCJK_right_tl } {#1} + - \__xeCJK_use_punct_dim:nnn - { \__xeCJK_punct_if_right:NTF {#2} { bound } { glue } } - { \c__xeCJK_left_tl } {#2} + \__xeCJK_use_punct_dim:nNN + { \__xeCJK_punct_if_right:NTF #1 { glue } { bound } } \c__xeCJK_right_tl #1 + + + \__xeCJK_use_punct_dim:nNN + { \__xeCJK_punct_if_right:NTF #2 { bound } { glue } } \c__xeCJK_left_tl #2 } } \cs_new_nopar:Npn \__xeCJK_calc_kerning_margin:NN #1#2 @@ -2281,31 +2763,33 @@ \bool_if:NTF \l__xeCJK_optimize_kerning_bool { \dim_max:nn { \l__xeCJK_minimum_bound_dim } } { \use:n } + { \__xeCJK_calc_kerning_margin_aux:NN #1 #2 } + } + } + } +\cs_new_nopar:Npn \__xeCJK_calc_kerning_margin_aux:NN #1#2 + { + \dim_compare:nNnTF \l__xeCJK_kerning_total_width_dim < \c_max_dim + { \__xeCJK_calc_kerning_margin:nNN \l__xeCJK_kerning_total_width_dim } + { + \fp_compare:nNnTF \l__xeCJK_kerning_total_ratio_fp ? \c_zero_fp + { + \xeCJK_if_same_class:NNTF #1 #2 + { \__xeCJK_kerning_width_or_ratio:nNN { same } } + { \__xeCJK_kerning_width_or_ratio:nNN { different } } + } + { + \__xeCJK_calc_kerning_margin:nNN { - \dim_compare:nNnTF \l__xeCJK_kerning_total_width_dim < \c_max_dim - { \__xeCJK_calc_kerning_margin:nNN \l__xeCJK_kerning_total_width_dim } - { - \fp_compare:nNnTF \l__xeCJK_kerning_total_ratio_fp ? \c_zero_fp - { - \xeCJK_if_same_class:NNTF {#1} {#2} - { \__xeCJK_kerning_width_or_ratio:nNN { same } } - { \__xeCJK_kerning_width_or_ratio:nNN { different } } - } - { - \__xeCJK_calc_kerning_margin:nNN - { - \fp_use:N \l__xeCJK_kerning_total_ratio_fp - \etex_dimexpr:D - \__xeCJK_use_punct_dim:nn { width } {#1} + - \__xeCJK_use_punct_dim:nn { width } {#2} - \scan_stop: - } - } - } - {#1} {#2} + \fp_use:N \l__xeCJK_kerning_total_ratio_fp + \etex_dimexpr:D + \__xeCJK_use_punct_dim:nN { width } #1 + + \__xeCJK_use_punct_dim:nN { width } #2 + \scan_stop: } } } + #1 #2 } \cs_new_nopar:Npn \__xeCJK_kerning_width_or_ratio:nNN #1#2#3 { @@ -2327,46 +2811,46 @@ \dim_max:nn { \dim_min:nn - { \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_left_tl {#1} } - { \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_right_tl {#1} } + { \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_left_tl #1 } + { \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_right_tl #1 } } { \dim_min:nn - { \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_left_tl {#2} } - { \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_right_tl {#2} } + { \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_left_tl #2 } + { \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_right_tl #2 } } } \cs_new_nopar:Npn \__xeCJK_calc_kerning_margin:nNN #1#2#3 { \dim_eval:n { - (#1) - - ( \__xeCJK_use_punct_dim:nnn - { \__xeCJK_punct_if_right:NTF {#2} { bound } { glue } } - { \c__xeCJK_left_tl } {#2} ) - - ( \__xeCJK_use_punct_dim:nnn - { \__xeCJK_punct_if_right:NTF {#3} { glue } { bound } } - { \c__xeCJK_right_tl } {#3} ) - - ( \__xeCJK_use_punct_dim:nn { dimen } {#2} ) - - ( \__xeCJK_use_punct_dim:nn { dimen } {#3} ) + (#1) + - ( \__xeCJK_use_punct_dim:nNN + { \__xeCJK_punct_if_right:NTF #2 { bound } { glue } } + \c__xeCJK_left_tl #2 ) + - ( \__xeCJK_use_punct_dim:nNN + { \__xeCJK_punct_if_right:NTF #3 { glue } { bound } } + \c__xeCJK_right_tl #3 ) + - ( \__xeCJK_use_punct_dim:nN { dimen } #2 ) + - ( \__xeCJK_use_punct_dim:nN { dimen } #3 ) } } \cs_new_protected_nopar:Npn \xeCJK_calc_punct_dimen:N #1 { - \__xeCJK_save_punct_dim:nnnn { bound } \c__xeCJK_left_tl {#1} - { \xeCJK_glyph_bounds:NN \c_one {#1} } - \__xeCJK_save_punct_dim:nnnn { bound } \c__xeCJK_right_tl {#1} - { \xeCJK_glyph_bounds:NN \c_three {#1} } + \__xeCJK_save_punct_dim:nNNn { bound } \c__xeCJK_left_tl #1 + { \xeCJK_glyph_bounds:NN \c_one #1 } + \__xeCJK_save_punct_dim:nNNn { bound } \c__xeCJK_right_tl #1 + { \xeCJK_glyph_bounds:NN \c_three #1 } \dim_set:Nn \l__xeCJK_tmp_dim { - ( \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_left_tl {#1} ) + - ( \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_right_tl {#1} ) + ( \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_left_tl #1 ) + + ( \__xeCJK_use_punct_dim:nNN { bound } \c__xeCJK_right_tl #1 ) } - \__xeCJK_save_punct_dim:nnn { width } {#1} - { \etex_fontcharwd:D \tex_font:D \xeCJK_token_value_charcode:N #1 } - \__xeCJK_save_punct_dim:nnn { dimen } {#1} - { \__xeCJK_use_punct_dim:nn { width } {#1} - \l__xeCJK_tmp_dim } - \__xeCJK_punct_if_long:NT {#1} + \__xeCJK_save_punct_dim:nNn { width } #1 + { \etex_fontcharwd:D \tex_font:D `#1 } + \__xeCJK_save_punct_dim:nNn { dimen } #1 + { \__xeCJK_use_punct_dim:nN { width } #1 - \l__xeCJK_tmp_dim } + \__xeCJK_punct_if_long:NT #1 { \dim_set:Nn \l__xeCJK_tmp_dim { @@ -2375,16 +2859,12 @@ { \c_zero_dim } { \dim_min:nn { - \l__xeCJK_tmp_dim } { \c_zero_dim } } } - \__xeCJK_save_punct_dim:nnnn { kern } {#1} {#1} { \l__xeCJK_tmp_dim } - \__xeCJK_save_punct_skip:nnnn { kern } {#1} {#1} { \l__xeCJK_tmp_dim } + \__xeCJK_save_punct_dim:nNNn { kern } #1 #1 { \l__xeCJK_tmp_dim } + \__xeCJK_save_punct_skip:nNNn { kern } #1 #1 { \l__xeCJK_tmp_dim } } } -\cs_generate_variant:Nn \xeCJK_calc_punct_dimen:N { o } \cs_new_nopar:Npn \xeCJK_glyph_bounds:NN #1#2 - { - \dim_use:N \xetex_glyphbounds:D #1 ~ - \xetex_charglyph:D \xeCJK_token_value_charcode:N #2 \exp_stop_f: - } + { \xetex_glyphbounds:D #1 ~ \xetex_charglyph:D `#2 \exp_stop_f: } \keys_define:nn { xeCJK / options } { PunctStyle .choice: , @@ -2476,13 +2956,13 @@ } \cs_new_protected_nopar:Npn \xeCJK_fallback_test_glyph:N #1 { - \xeCJK_glyph_if_exist:NTF {#1} - { \__xeCJK_fallback_save_CJKsymbol:N {#1} } + \xeCJK_glyph_if_exist:NTF #1 + { \__xeCJK_fallback_save_CJKsymbol:N #1 } { \group_begin: - \xeCJK_aftergroup_reset_Boundary:N {#1} + \xeCJK_aftergroup_reset_Boundary:N #1 \tl_set_eq:NN \l__xeCJK_fallback_family_tl \l_xeCJK_family_tl - \xeCJK_fallback_loop:Nn {#1} { \l_xeCJK_family_tl/FallBack } + \xeCJK_fallback_loop:No #1 { \l_xeCJK_family_tl/FallBack } \group_end: } } @@ -2498,14 +2978,14 @@ \tl_new:N \g__xeCJK_aftergroup_Boundary_tl \cs_new_protected_nopar:Npn \xeCJK_fallback_loop:Nn #1#2 { - \xeCJK_family_if_exist:xTF {#2} + \xeCJK_family_if_exist:nTF {#2} { - \tl_set:Nx \l_xeCJK_family_tl {#2} + \tl_set:Nn \l_xeCJK_family_tl {#2} \tl_set_eq:NN \CJK@family \l__xeCJK_fontspec_family_tl \xeCJK_select_font: - \xeCJK_glyph_if_exist:NTF {#1} - { \__xeCJK_fallback_save_CJKsymbol:N {#1} } - { \xeCJK_fallback_loop:Nn {#1} { \l_xeCJK_family_tl/FallBack } } + \xeCJK_glyph_if_exist:NTF #1 + { \__xeCJK_fallback_save_CJKsymbol:N #1 } + { \xeCJK_fallback_loop:No #1 { \l_xeCJK_family_tl/FallBack } } } { \str_if_eq_x:nnTF { \CJKfamilydefault } { \l__xeCJK_fallback_family_tl } @@ -2513,14 +2993,15 @@ \__xeCJK_warning:nxxx { missing-glyph } { \l_xeCJK_family_tl } {#1} { \int_to_Hex:n { `#1 } } - \__xeCJK_fallback_save_CJKsymbol:N {#1} + \__xeCJK_fallback_save_CJKsymbol:N #1 } { \tl_set:Nx \l__xeCJK_fallback_family_tl { \CJKfamilydefault } - \xeCJK_fallback_loop:Nn {#1} { \l__xeCJK_fallback_family_tl } + \xeCJK_fallback_loop:Nn #1 { \l__xeCJK_fallback_family_tl } } } } +\cs_generate_variant:Nn \xeCJK_fallback_loop:Nn { No } \__xeCJK_msg_new:nn { missing-glyph } { CJKfamily~`\__xeCJK_msg_family_map:n {#1}'~ @@ -2537,7 +3018,7 @@ { \group_begin: \tl_set:Nn \l__xeCJK_fallback_family_tl {#1} - \prop_get:NVNF \g__xeCJK_family_font_name_prop + \prop_get:NoNF \g__xeCJK_family_font_name_prop \l__xeCJK_fallback_family_tl \l__xeCJK_font_name_tl { \tl_clear:N \l__xeCJK_font_name_tl } \clist_map_inline:nn {#3} @@ -2821,13 +3302,13 @@ \cs_new_protected_nopar:Npn \__xeCJK_copy_sub_family:n #1 { \__xeCJK_check_family:V \l__xeCJK_sub_family_name_tl - \prop_get:NVNT \g__xeCJK_family_font_name_prop + \prop_get:NoNT \g__xeCJK_family_font_name_prop \l__xeCJK_family_name_tl \l__xeCJK_sub_font_name_tl { \prop_gput:NVV \g__xeCJK_family_font_name_prop \l__xeCJK_sub_family_name_tl \l__xeCJK_sub_font_name_tl } - \prop_get:NVNT \g__xeCJK_family_font_options_prop + \prop_get:NoNT \g__xeCJK_family_font_options_prop \l__xeCJK_family_name_tl \l__xeCJK_sub_font_options_clist { \clist_remove_all:Nn \l__xeCJK_sub_font_options_clist { #1 = * } @@ -2867,19 +3348,37 @@ } \cs_new_protected_nopar:Npn \__xeCJK_copy_family:xx #1#2 { \use:x { \__xeCJK_copy_family:nn {#1} {#2} } } +\cs_new_nopar:Npn \__xeCJK_font_csname:n #1 + { xeCJK/#1/\f@series/\f@shape/\f@size } \tl_new:N \l_xeCJK_current_font_tl -\tl_set:Nn \l_xeCJK_current_font_tl { \__xeCJK_font_csname:n { \CJK@family } } -\cs_new_nopar:Npn \__xeCJK_font_csname:n #1 { xeCJK/#1/\f@series/\f@shape/\f@size } +\tl_set:No \l_xeCJK_current_font_tl + { \__xeCJK_font_csname:n { \CJK@family } } \cs_new_protected_nopar:Npn \xeCJK_select_font: { \exp_args:Nc \cs_if_exist_use:NF { \l_xeCJK_current_font_tl } { - \__xeCJK_family_use:x { \l_xeCJK_family_tl } + \__xeCJK_family_use:n { \l_xeCJK_family_tl } \xeCJK_font_gset_to_current:c { \l_xeCJK_current_font_tl } } } \tl_new:N \l__xeCJK_current_coor_tl \cs_new_eq:NN \xeCJK@setfont \xeCJK_select_font: +\cs_new_eq:NN \xeCJK_select_punct_font: \xeCJK_select_font: +\cs_new_protected_nopar:Npn \__xeCJK_select_punct_font_aux: + { + \exp_args:Nc \cs_if_exist_use:NF { \l_xeCJK_current_punct_font_tl } + { + \__xeCJK_family_use:n { \l_xeCJK_punct_family_tl } + \xeCJK_font_gset_to_current:c { \l_xeCJK_current_punct_font_tl } + } + } +\tl_new:N \CJK@punctfamily +\tl_new:N \l_xeCJK_punct_family_tl +\tl_new:N \l_xeCJK_current_punct_font_tl +\tl_set:No \l_xeCJK_current_punct_font_tl + { \__xeCJK_font_csname:n { \CJK@punctfamily } } +\cs_new_eq:NN \__xeCJK_select_font: \prg_do_nothing: +\cs_new_eq:NN \__xeCJK_select_punct_font: \prg_do_nothing: \cs_new_protected_nopar:Npn \__xeCJK_switch_font:nn #1#2 { \str_if_eq:nnF {#1} {#2} @@ -2893,10 +3392,11 @@ \__xeCJK_msg_new:nn { CJK-block } { Switch~from~block~`#1'~to~`#2'. } \cs_new_protected_nopar:Npn \xeCJK_select_font:n #1 { - \exp_args:Nc \cs_if_exist_use:NF { \__xeCJK_font_csname:n { \CJK@family/#1 } } + \exp_args:Nc \cs_if_exist_use:NF + { \__xeCJK_font_csname:n { \CJK@family/#1 } } { \xeCJK_block_family:nn { \l_xeCJK_family_tl } {#1} - \__xeCJK_family_use:x { \l_xeCJK_family_tl/#1 } + \__xeCJK_family_use:n { \l_xeCJK_family_tl/#1 } \xeCJK_font_gset_to_current:c { \__xeCJK_font_csname:n { \CJK@family/#1 } } } @@ -2913,73 +3413,113 @@ } } } -\cs_new_nopar:Npn \__xeCJK_family_csname:n #1 { xeCJK/family/#1 } -\cs_new_nopar:Npn \__xeCJK_family_nfss_csname:n #1 { xeCJK/family/nfss/#1 } -\cs_new_nopar:Npn \__xeCJK_family_use:x #1 { \use:c { \__xeCJK_family_nfss_csname:n {#1} } } -\cs_new_protected_nopar:Npn \__xeCJK_gset_family_nfss_cs:xx #1#2 +\cs_new_nopar:Npn \__xeCJK_family_csname:n #1 + { xeCJK/family/#1 } +\cs_new_nopar:Npn \__xeCJK_family_nfss_csname:n #1 + { xeCJK/family/nfss/#1 } +\cs_new_nopar:Npn \__xeCJK_family_use:n #1 + { \use:c { \__xeCJK_family_nfss_csname:n {#1} } } +\cs_new_protected_nopar:Npn \__xeCJK_gset_family_nfss_cs:nn #1#2 { - \prop_gput:Nxx \g__xeCJK_family_name_prop {#1} {#2} - \cs_gset_protected_nopar:cpx { \__xeCJK_family_nfss_csname:n {#1} } + \prop_gput:Nnn \g__xeCJK_family_name_prop {#1} {#2} + \cs_gset_protected_nopar:cpx + { \__xeCJK_family_nfss_csname:n {#1} } { \exp_not:N \fontencoding { \c__xeCJK_encoding_tl } - \tl_set:Nx \exp_not:N \f@family {#2} + \tl_set:Nn \exp_not:N \f@family {#2} \exp_not:N \selectfont } } -\cs_generate_variant:Nn \prop_gput:Nnn { Nxx } +\cs_generate_variant:Nn \__xeCJK_gset_family_nfss_cs:nn { xx } \prg_new_protected_conditional:Npnn \xeCJK_family_if_exist:n #1 { T , F , TF } { - \prop_get:NnNTF \g__xeCJK_family_name_prop {#1} \l__xeCJK_fontspec_family_tl + \prop_get:NnNTF \g__xeCJK_family_name_prop + {#1} \l__xeCJK_fontspec_family_tl { \prg_return_true: } { - \exp_args:Nc \cs_if_exist_use:NTF { \__xeCJK_family_csname:n {#1} } - { \prg_return_true: } { \prg_return_false: } + \cs_if_exist_use:cTF { \__xeCJK_family_csname:n {#1} } + { \prg_return_true: } + { \prg_return_false: } } } -\cs_generate_variant:Nn \xeCJK_family_if_exist:nT { x } -\cs_generate_variant:Nn \xeCJK_family_if_exist:nF { x } -\cs_generate_variant:Nn \xeCJK_family_if_exist:nTF { x } +\prg_generate_conditional_variant:Nnn \xeCJK_family_if_exist:n { x } { T , F , TF } \NewDocumentCommand \CJKfamily { t+ t- m } { - \xeCJK_if_blank_x:nTF {#3} + \xeCJK_family:NNx #1 #2 {#3} + \tex_ignorespaces:D + } +\cs_new_protected_nopar:Npn \xeCJK_family:NNn #1#2#3 + { + \tl_if_blank:nTF {#3} { - \IfBooleanF {#1} { \IfBooleanF {#2} { \use_none:nn } } + \bool_if:NF #1 { \bool_if:NF #2 { \use_none:nn } } \xeCJK_family_if_exist_use:x { \l_xeCJK_family_tl } } { - \IfBooleanTF {#2} { \xeCJK_family_if_exist_use:x {#3} } + \bool_if:NTF #2 + { \xeCJK_family_if_exist_use:n {#3} } { - \xeCJK_family_if_exist:xTF {#3} + \xeCJK_family_if_exist:nTF {#3} { - \tl_set:Nx \l_xeCJK_family_tl {#3} + \tl_set:Nn \l_xeCJK_family_tl {#3} \tl_set_eq:NN \CJK@family \l__xeCJK_fontspec_family_tl - \IfBooleanT {#1} { \__xeCJK_family_use:x {#3} } + \bool_if:NT #1 { \__xeCJK_family_use:n {#3} } } - { \__xeCJK_family_unknown_warning:x {#3} } + { \__xeCJK_family_unknown_warning:n {#3} } } } - \tex_ignorespaces:D } +\cs_generate_variant:Nn \xeCJK_family:NNn { NNx } \cs_new_protected_nopar:Npn \xeCJK_switch_family:n #1 { - \xeCJK_family_if_exist:xTF {#1} + \xeCJK_family_if_exist:nTF {#1} { - \tl_set:Nx \l_xeCJK_family_tl {#1} + \tl_set:Nn \l_xeCJK_family_tl {#1} \tl_set_eq:NN \CJK@family \l__xeCJK_fontspec_family_tl } - { \__xeCJK_family_unknown_warning:x {#1} } + { \__xeCJK_family_unknown_warning:n {#1} } + } +\cs_generate_variant:Nn \xeCJK_switch_family:n { x , o } +\keys_define:nn { xeCJK / options } + { + PunctFamily .choice: , + PunctFamily .value_required:n = { true } , + PunctFamily / false .code:n = + { + \tl_clear:N \l_xeCJK_punct_family_tl + \tl_clear:N \CJK@punctfamily + \xeCJK_cs_clear:N \__xeCJK_select_font: + \xeCJK_cs_clear:N \__xeCJK_select_punct_font: + \cs_set_eq:NN \xeCJK_select_punct_font: \xeCJK_select_font: + } , + PunctFamily / unknown .code:n = + { \xeCJK_punct_family:x {#1} } , + } +\cs_new_protected_nopar:Npn \xeCJK_punct_family:n #1 + { + \xeCJK_family_if_exist:nTF {#1} + { + \tl_set:Nn \l_xeCJK_punct_family_tl {#1} + \tl_set_eq:NN \CJK@punctfamily \l__xeCJK_fontspec_family_tl + \cs_set_eq:NN \__xeCJK_select_font: \xeCJK_select_font: + \cs_set_eq:NN \__xeCJK_select_punct_font: \__xeCJK_select_punct_font_aux: + \cs_set_eq:NN \xeCJK_select_punct_font: \__xeCJK_select_punct_font: + } + { \__xeCJK_family_unknown_warning:n {#1} } } +\cs_generate_variant:Nn \xeCJK_punct_family:n { x } \tl_new:N \l_xeCJK_family_tl \tl_new:N \CJK@family \cs_new_protected_nopar:Npn \__xeCJK_gobble_CJKfamily: { \cs_set_eq:NN \CJKfamily \__xeCJK_gobble_CJKfamily:wn } \DeclareExpandableDocumentCommand \__xeCJK_gobble_CJKfamily:wn { t+ t- m } { } -\cs_new_protected_nopar:Npn \xeCJK_family_if_exist_use:x #1 +\cs_new_protected_nopar:Npn \xeCJK_family_if_exist_use:n #1 { - \xeCJK_family_if_exist:xTF {#1} - { \__xeCJK_family_use:x {#1} } - { \__xeCJK_family_unknown_warning:x {#1} } + \xeCJK_family_if_exist:nTF {#1} + { \__xeCJK_family_use:n {#1} } + { \__xeCJK_family_unknown_warning:n {#1} } } +\cs_generate_variant:Nn \xeCJK_family_if_exist_use:n { x } \cs_new_protected_nopar:Npn \__xeCJK_family_unknown_warning:n #1 { \prop_if_empty:NF \g__xeCJK_family_font_name_prop @@ -3021,7 +3561,7 @@ } \cs_new_protected:Npn \__xeCJK_pass_args:nnnn #1#2#3#4 { - \IfNoValueTF {#2} + \tl_if_novalue:nTF {#2} { \__xeCJK_post_arg:w {#1} {#3} {#4} } { \use:x { #1 {#2} {#3} } @@ -3065,8 +3605,10 @@ } \NewDocumentCommand \newCJKfontfamily { o m o m } { - \tl_set:Nx \l__xeCJK_tmp_tl { \IfNoValueTF {#1} { \cs_to_str:N #2 } {#1} } - \cs_new_protected_nopar:Npx #2 { \xeCJK_switch_family:n { \l__xeCJK_tmp_tl } } + \tl_set:Nx \l__xeCJK_tmp_tl + { \tl_if_novalue:nTF {#1} { \cs_to_str:N #2 } {#1} } + \cs_new_protected_nopar:Npx #2 + { \xeCJK_switch_family:n { \l__xeCJK_tmp_tl } } \__xeCJK_pass_args:nnnn { \xeCJK_set_family:nnn { \l__xeCJK_tmp_tl } } {#3} {#4} { } @@ -3081,7 +3623,7 @@ { \prop_get:NnNTF \g__xeCJK_fontspec_prop { CJKfontspec/#1/#2/id } \l_xeCJK_family_tl - { \xeCJK_switch_family:n { \l_xeCJK_family_tl } } + { \xeCJK_switch_family:o { \l_xeCJK_family_tl } } { \__xeCJK_fontspec:xnn { CJKfontspec ( \int_eval:n { \g__xeCJK_family_int + \c_one } ) } @@ -3109,7 +3651,7 @@ \cs_new_eq:NN \addCJKfontfeature \addCJKfontfeatures \cs_new_protected_nopar:Npn \xeCJK_add_font_features:Nnn #1#2#3 { - \prop_get:NVNTF \g__xeCJK_family_font_name_prop + \prop_get:NoNTF \g__xeCJK_family_font_name_prop \l_xeCJK_family_tl \l__xeCJK_font_name_tl { \clist_set:Nn \l__xeCJK_add_font_features_clist {#3} @@ -3133,7 +3675,7 @@ \seq_map_function:NN \g__xeCJK_sub_key_seq \__xeCJK_add_sub_class_features:n } - \prop_get:NVNT \g__xeCJK_family_font_options_prop + \prop_get:NoNT \g__xeCJK_family_font_options_prop \l_xeCJK_family_tl \l__xeCJK_font_options_clist { \bool_lazy_or:nnT @@ -3174,7 +3716,7 @@ { \CJKfamilydefault/#1 } \l__xeCJK_sub_font_options_clist } { - \prop_get:NVN \g__xeCJK_family_font_options_prop + \prop_get:NoN \g__xeCJK_family_font_options_prop \l_xeCJK_family_tl \l__xeCJK_sub_font_options_clist \tl_set_eq:NN \l__xeCJK_sub_font_name_tl \l__xeCJK_font_name_tl } @@ -3190,8 +3732,8 @@ } } } -\cs_generate_variant:Nn \prop_get:NnN { Nx } -\cs_generate_variant:Nn \prop_get:NnNTF { Nx } +\cs_generate_variant:Nn \prop_get:NnN { Nx } +\prg_generate_conditional_variant:Nnn \prop_get:NnN { Nx } { TF } \keys_define:nn { xeCJK / options } { LoadFandol .bool_gset:N = \g__xeCJK_fandol_bool } \cs_new_protected_nopar:Npn \__xeCJK_load_fandol: @@ -3255,7 +3797,7 @@ \__xeCJK_warning:nxx { CJKfamilydefault-undefined } { \l__xeCJK_tmp_tl } { \CJKfamilydefault } } - \xeCJK_switch_family:n { \CJKfamilydefault } + \xeCJK_switch_family:x { \CJKfamilydefault } \bool_if:NT \g__xeCJK_math_bool { \xeCJK_set_mathfont: } } \__xeCJK_msg_new:nn { no-CJKfamily } @@ -3298,14 +3840,19 @@ } \cs_new_protected_nopar:Npn \__xeCJK_set_mathfont_aux: { - \tl_const:Nx \c__xeCJK_math_family_tl { \l__xeCJK_fontspec_family_tl } - \xeCJK_declare_mathfont:nn { \c__xeCJK_math_tl } { \c__xeCJK_math_family_tl } - \int_const:Nn \c_xeCJK_math_fam_int { \use:c { sym \c__xeCJK_math_tl } } - \clist_concat:NNN \g__xeCJK_math_chars_clist + \tl_const:Nx \c__xeCJK_math_family_tl + { \l__xeCJK_fontspec_family_tl } + \xeCJK_declare_mathfont:xx + { \c__xeCJK_math_tl } + { \c__xeCJK_math_family_tl } + \int_const:Nn \c_xeCJK_math_fam_int + { \use:c { sym \c__xeCJK_math_tl } } + \clist_gconcat:NNN \g__xeCJK_math_chars_clist \g__xeCJK_CJK_range_clist \g__xeCJK_FullLeft_range_clist - \clist_concat:NNN \g__xeCJK_math_chars_clist + \clist_gconcat:NNN \g__xeCJK_math_chars_clist \g__xeCJK_math_chars_clist \g__xeCJK_FullRight_range_clist - \xeCJK_gset_mathcode:Nn \g__xeCJK_math_chars_clist { \c_xeCJK_math_fam_int } + \xeCJK_gset_mathcode:Nn \g__xeCJK_math_chars_clist + { \c_xeCJK_math_fam_int } \xeCJK_set_mathfont_block: } \clist_new:N \g__xeCJK_math_chars_clist @@ -3323,12 +3870,14 @@ { \xeCJK_block_family:nn { \c__xeCJK_math_tl } {#1} \prop_get:NoNTF \g__xeCJK_fam_prop - { \l__xeCJK_fontspec_family_tl } \l__xeCJK_tmp_tl + \l__xeCJK_fontspec_family_tl \l__xeCJK_tmp_tl { \int_set:Nn \l__xeCJK_fam_int { \l__xeCJK_tmp_tl } } { - \xeCJK_declare_mathfont:nn - { \c__xeCJK_math_tl / #1 } { \l__xeCJK_fontspec_family_tl } - \__xeCJK_set_mathfont_block_aux:cn { sym \c__xeCJK_math_tl / #1 } {#1} + \xeCJK_declare_mathfont:xx + { \c__xeCJK_math_tl / #1 } + { \l__xeCJK_fontspec_family_tl } + \__xeCJK_set_mathfont_block_aux:cn + { sym \c__xeCJK_math_tl / #1 } {#1} } \xeCJK_gset_mathcode:cn { g__xeCJK_CJK/#1_range_clist } { \l__xeCJK_fam_int } } @@ -3350,8 +3899,10 @@ \SetSymbolFont {#1} { bold } { \c__xeCJK_encoding_tl } {#2} { \bfdefault } { \updefault } } - \prop_gput:Nxx \g__xeCJK_fam_prop {#2} { \exp_not:c { sym #1 } } + \prop_gput:Nnx \g__xeCJK_fam_prop {#2} { \exp_not:c { sym #1 } } } +\cs_generate_variant:Nn \prop_gput:Nnn { Nnx } +\cs_generate_variant:Nn \xeCJK_declare_mathfont:nn { xx } \cs_new_protected:Npn \xeCJK_declare_symbol_font:nnnnn #1 { \__xeCJK_declare_symbol_font:cnnnn { sym #1 } } \cs_new_protected:Npn \__xeCJK_declare_symbol_font:Nnnnn #1 @@ -3474,8 +4025,6 @@ { \xeCJK_no_break: \skip_horizontal:N \l__xeCJK_ccglue_skip } \cs_new_protected_nopar:Npn \__xeCJK_nobreak_ecglue: { \xeCJK_no_break: \skip_horizontal:N \l__xeCJK_ecglue_skip } -\cs_new_protected_nopar:Npn \__xeCJK_nobreak_hskip:n - { \xeCJK_no_break: \skip_horizontal:n } \cs_new_protected_nopar:Npn \__xeCJK_reset_shipout_skip: { \cs_set_eq:NN \__xeCJK_shipout_CJKglue: \CJKglue @@ -3493,8 +4042,8 @@ \cs_set_eq:NN \CJKglue \__xeCJK_shipout_CJKglue: \cs_set_eq:NN \CJKecglue \__xeCJK_shipout_CJKecglue: \cs_set_eq:NN \__xeCJK_punct_hskip:n \__xeCJK_shipout_punct_hskip:n - \cs_set_eq:NN - \__xeCJK_punct_breakable_kern:n \__xeCJK_shipout_punct_breakable_kern:n + \cs_set_eq:NN \__xeCJK_punct_breakable_kern:n + \__xeCJK_shipout_punct_breakable_kern:n \l__xeCJK_reset_shipout_skip_hook_tl } } @@ -3596,10 +4145,10 @@ } { \tl_set:Nx \l__xeCJK_current_coor_tl { \CJK@family/\curr@fontshape } - \prop_get:NVNTF \g__xeCJK_scale_family_prop + \prop_get:NoNTF \g__xeCJK_scale_family_prop \l__xeCJK_current_coor_tl \l_xeCJK_family_tl { - \xeCJK_switch_family:n { \l_xeCJK_family_tl } + \xeCJK_switch_family:o { \l_xeCJK_family_tl } \skip_zero:N \l__xeCJK_verb_exspace_skip } { @@ -3676,7 +4225,8 @@ } } \cs_new_protected_nopar:Npn \xeCJK_set_visible_space_font: { - \tl_set:Nx \l__xeCJK_current_coor_tl { xeCJK/space/\curr@fontshape/\f@size } + \tl_set:Nx \l__xeCJK_current_coor_tl + { xeCJK/space/\curr@fontshape/\f@size } \exp_after:wN \__xeCJK_set_visible_space_size:n \exp_after:wN { \dim_use:N \tex_fontdimen:D \c_two \tex_font:D } \xeCJK_font_gset_to_current:c { \l__xeCJK_current_coor_tl } @@ -3759,7 +4309,7 @@ } \__xeCJK_msg_new:nn { key-unknown } { - Sorry,~but~\l__keys_module_tl \ does~not~have~a~key~called~`#1'.\\\\ + Sorry,~but~xeCJK/options~does~not~have~a~key~called~`#1'.\\\\ The~key~`#1'~is~being~ignored. } \cs_new_nopar:Npn \CJKsymbol #1 {#1} @@ -3787,8 +4337,8 @@ WidowPenalty = \c_ten_thousand , NoBreakCS = { \footnote \footnotemark \nobreak } , KaiMingPunct = { ^^^^3002 ^^^^ff0e ^^^^ff1f ^^^^ff01 } , - LongPunct = { ^^^^2014 ^^^^2025 ^^^^2026 } , - MiddlePunct = { ^^^^2013 ^^^^2014 ^^^^2027 ^^^^00b7 ^^^^30fb ^^^^ff65 } , + LongPunct = { ^^^^2014 ^^^^2e3a ^^^^2025 ^^^^2026 } , + MiddlePunct = { ^^^^2013 ^^^^2014 ^^^^2e3a ^^^^2027 ^^^^00b7 ^^^^30fb ^^^^ff65 } , AllowBreakBetweenPuncts = false } \defaultCJKfontfeatures { Script = CJK } @@ -3863,7 +4413,7 @@ \cs_set_protected_nopar:Npx \hbar { { \mathchar - \int_eval:n { \symlegacymaths * \c_two_hundred_fifty_six + '26 } ~ + \int_eval:n { \symlegacymaths * 256 + '26 } ~ \mkern -9mu h } } \fi: @@ -4040,17 +4590,17 @@ \cs_new_protected_nopar:Npn \xeCJK@fontfamily #1 { \str_if_eq:nnTF {#1} { \familydefault } - { \xeCJK_switch_family:n { \CJKfamilydefault } } + { \xeCJK_switch_family:x { \CJKfamilydefault } } { \__xeCJK_update_family_aux: } } \cs_new_protected_nopar:Npn \__xeCJK_update_family_aux: { \str_case_x:nn { \f@family } { - { \rmdefault } { \xeCJK_switch_family:n { \CJKrmdefault } } - { \sfdefault } { \xeCJK_switch_family:n { \CJKsfdefault } } - { \ttdefault } { \xeCJK_switch_family:n { \CJKttdefault } } - { \familydefault } { \xeCJK_switch_family:n { \CJKfamilydefault } } + { \rmdefault } { \xeCJK_switch_family:x { \CJKrmdefault } } + { \sfdefault } { \xeCJK_switch_family:x { \CJKsfdefault } } + { \ttdefault } { \xeCJK_switch_family:x { \CJKttdefault } } + { \familydefault } { \xeCJK_switch_family:x { \CJKfamilydefault } } } } \cs_new_eq:NN \xeCJK@fix@penalty \fix@penalty @@ -4059,36 +4609,45 @@ \cs_new_protected_nopar:Npn \xeCJK@italiccorr { \int_compare:nNnTF \xetex_interchartokenstate:D > \c_zero + { \xeCJK_italic_correction: } + { \@@italiccorr } + } +\cs_new_protected_nopar:Npn \xeCJK_italic_correction: + { + \int_compare:nNnT \etex_lastnodetype:D = \c_twelve + { \__xeCJK_italic_correction: } + } +\cs_new_protected_nopar:Npn \__xeCJK_italic_correction: + { + \dim_case:nnF { \tex_lastkern:D } { - \xeCJK_if_last_node:nTF { default } - { - \xeCJK_remove_node: \@@italiccorr - { \xeCJK_make_node:n { default } } - } - { - \xeCJK_if_last_node:nTF { CJK } - { - \xeCJK_remove_node: \@@italiccorr - { \xeCJK_make_node:n { CJK } } \use:n - } - { - \xeCJK_if_last_node:nTF { CJK-space } - { - \xeCJK_remove_node: \@@italiccorr - { \xeCJK_make_node:n { CJK-space } } \use:n - } - { \@@italiccorr \use_none:n } - } - { - \exp_after:wN \exp_after:wN \exp_after:wN - \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN - \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN - \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN - \xeCJK_ignore_spaces:w - } - } + { \__xeCJK_node:n { default } } + { + \xeCJK_remove_node: \tex_italiccorrection:D + \xeCJK_make_node:n { default } + } + { \__xeCJK_node:n { CJK } } + { + \xeCJK_remove_node: \tex_italiccorrection:D + \xeCJK_make_node:n { CJK } + \__xeCJK_italic_correction_aux: + } + { \__xeCJK_node:n { CJK-space } } + { + \xeCJK_remove_node: \tex_italiccorrection:D + \xeCJK_make_node:n { CJK-space } + \__xeCJK_italic_correction_aux: + } } - { \@@italiccorr } + { \tex_italiccorrection:D } + } +\cs_new_protected_nopar:Npn \__xeCJK_italic_correction_aux: + { + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN + \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN + \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN + \xeCJK_ignore_spaces:w } \cs_new_eq:NN \g__xeCJK_xetex_allocator_int \xe@alloc@intercharclass \__xeCJK_after_end_preamble:n @@ -4098,7 +4657,9 @@ { \g__xeCJK_xetex_allocator_int } { \int_step_inline:nnnn - { \c__xeCJK_class_begin_int + \c_one } \c_one \g__xeCJK_xetex_allocator_int + { \c__xeCJK_class_begin_int + \c_one } + { \c_one } + { \g__xeCJK_xetex_allocator_int } { \seq_if_in:NnF \g__xeCJK_new_class_seq {#1} { \__xeCJK_set_others_toks:n {#1} } diff --git a/Master/texmf-dist/tex/xelatex/xecjk/xeCJKfntef.sty b/Master/texmf-dist/tex/xelatex/xecjk/xeCJKfntef.sty index 827bf5e5f01..f7c67505480 100644 --- a/Master/texmf-dist/tex/xelatex/xecjk/xeCJKfntef.sty +++ b/Master/texmf-dist/tex/xelatex/xecjk/xeCJKfntef.sty @@ -7,8 +7,8 @@ %% xeCJK.dtx (with options: `fntef') %% %% Copyright (C) 2007--2010 by Wenchang Sun <sunwch@nankai.edu.cn> -%% Copyright (C) 2009--2017 by Leo Liu <leoliu.pku@gmail.com> -%% Copyright (C) 2012--2017 by Qing Lee <sobenlee@gmail.com> +%% Copyright (C) 2009--2018 by Leo Liu <leoliu.pku@gmail.com> +%% Copyright (C) 2012--2018 by Qing Lee <sobenlee@gmail.com> %% ---------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -29,10 +29,10 @@ %% \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} -\GetIdInfo$Id: xeCJK.dtx 5a18688 2017-11-22 19:12:51 +0800 Qing Lee <sobenlee@gmail.com> $ +\GetIdInfo$Id: xeCJK.dtx 54327e6 2018-01-28 19:10:14 +0800 Qing Lee <sobenlee@gmail.com> $ {xeCJK font effect} \ProvidesExplPackage{xeCJKfntef} - {\ExplFileDate}{3.5.1}{\ExplFileDescription} + {\ExplFileDate}{3.6.0}{\ExplFileDescription} \PassOptionsToPackage { normalem } { ulem } \DeclareOption* { \PassOptionsToPackage { \CurrentOption } { ulem } } \ProcessOptions \scan_stop: @@ -70,7 +70,6 @@ \cs_set_eq:NN \__xeCJK_ulem_hskip_aux:n \xeCJK_ulem_hskip:n } { - \xeCJK_swap_cs:NN \__xeCJK_punct_kern:n \__xeCJK_ulem_punct_kern:n \xeCJK_swap_cs:NN \__xeCJK_punct_hskip:n \__xeCJK_ulem_punct_hskip:n \xeCJK_cs_clear:N \__xeCJK_ulem_skip_punct_begin: \xeCJK_cs_clear:N \__xeCJK_ulem_skip_punct_end: @@ -96,6 +95,8 @@ { \__xeCJK_ulem_glue:n \l__xeCJK_ecglue_skip } \cs_set_protected_nopar:Npn \xeCJK_space_glue: { \__xeCJK_ulem_glue:n \l__xeCJK_space_skip } + \cs_set_eq:NN \xeCJK_punct_node:N \use_none:n + \cs_set_eq:NN \xeCJK_if_last_punct:TF \use_ii:nn \keys_set:nn { xeCJK / options } { CheckFullRight = false , xCJKecglue = false } } @@ -247,7 +248,7 @@ \int_compare:nNnTF \etex_lastnodetype:D = \c_twelve { \__xeCJK_ulem_right_skip_kern: } { \__xeCJK_ulem_right_skip_glue: } - \box_use_clear:N \l__xeCJK_tmp_box + \box_use_drop:N \l__xeCJK_tmp_box } \cs_new_protected_nopar:Npn \__xeCJK_ulem_right_skip_kern: { @@ -303,18 +304,20 @@ \cs_new_protected_nopar:Npn \__xeCJK_ulem_skip_putbox: { \tl_if_empty:NF \UL@start - { \box_use_clear:N \UL@box } + { \box_use_drop:N \UL@box } } \cs_new_protected_nopar:Npn \__xeCJK_ulem_initial: { \__xeCJK_ulem_swap_cs:NN - \xeCJK_FullLeft_and_Default: \__xeCJK_ulem_FullLeft_and_Default: - \xeCJK_FullLeft_and_CJK: \__xeCJK_ulem_FullLeft_and_CJK: - \xeCJK_FullRight_and_Default: \__xeCJK_ulem_FullRight_and_Default: - \xeCJK_FullRight_and_CJK: \__xeCJK_ulem_FullRight_and_CJK: - \xeCJK_CJK_and_CJK:N \__xeCJK_ulem_CJK_and_CJK:N - \xeCJK_CJK_and_Boundary:w \__xeCJK_ulem_CJK_and_Boundary:w - \xeCJK@fix@penalty \__xeCJK_ulem_fix_penalty: + \xeCJK_FullLeft_and_Default: \__xeCJK_ulem_FullLeft_and_Default: + \xeCJK_FullLeft_and_CJK: \__xeCJK_ulem_FullLeft_and_CJK: + \xeCJK_FullLeft_and_Boundary: \__xeCJK_ulem_FullLeft_and_Boundary: + \xeCJK_FullRight_and_Default: \__xeCJK_ulem_FullRight_and_Default: + \xeCJK_FullRight_and_CJK: \__xeCJK_ulem_FullRight_and_CJK: + \xeCJK_FullRight_and_Boundary: \__xeCJK_ulem_FullRight_and_Boundary: + \xeCJK_CJK_and_CJK:N \__xeCJK_ulem_CJK_and_CJK:N + \xeCJK_CJK_and_Boundary:w \__xeCJK_ulem_CJK_and_Boundary:w + \xeCJK@fix@penalty \__xeCJK_ulem_fix_penalty: \__xeCJK_punct_breakable_kern:n \__xeCJK_ulem_punct_breakable_kern:n \__xeCJK_Default_and_FullLeft_glue:N \__xeCJK_ulem_Default_and_FullLeft_glue:N \__xeCJK_Default_and_FullRight_glue:N \__xeCJK_ulem_Default_and_FullRight_glue:N @@ -392,6 +395,7 @@ \xeCJK_class_group_end: \UL@stop \__xeCJK_ulem_ccglue: \UL@start \__xeCJK_ulem_class_group_begin: + \xeCJK_select_font: \CJKsymbol } { \__xeCJK_ulem_CJK_and_CJK:N } @@ -400,7 +404,6 @@ { \xeCJK_class_group_begin: \xeCJK_clear_Boundary_and_CJK_toks: - \xeCJK_select_font: } \cs_new_protected_nopar:Npn \__xeCJK_ulem_between_CJK_blocks:nnN #1#2 { @@ -425,8 +428,8 @@ { \UL@stop \__xeCJK_ulem_skip_punct_begin: - \__xeCJK_punct_glue:NN \c__xeCJK_left_tl {#1} - \__xeCJK_punct_offset:NN \c__xeCJK_left_tl {#1} + \__xeCJK_punct_glue:NN \c__xeCJK_left_tl #1 + \__xeCJK_punct_offset:NN \c__xeCJK_left_tl #1 \UL@start } { \__xeCJK_ulem_Default_and_FullLeft_glue:N #1 } @@ -437,7 +440,7 @@ { \UL@stop \__xeCJK_ulem_skip_punct_begin: - \__xeCJK_punct_glue:NN \c__xeCJK_left_tl {#1} + \__xeCJK_punct_glue:NN \c__xeCJK_left_tl #1 \UL@start } { \__xeCJK_ulem_Boundary_and_FullLeft_glue:N #1 } @@ -449,11 +452,12 @@ \xeCJK_class_group_end: \UL@stop \__xeCJK_ulem_skip_punct_begin: - \__xeCJK_ulem_ccglue: - \__xeCJK_punct_glue:NN \c__xeCJK_left_tl {#1} - \__xeCJK_punct_offset:NN \c__xeCJK_left_tl {#1} + \__xeCJK_ulem_punct_ccglue: + \__xeCJK_punct_glue:NN \c__xeCJK_left_tl #1 + \__xeCJK_punct_offset:NN \c__xeCJK_left_tl #1 \UL@start \__xeCJK_ulem_class_group_begin: + \xeCJK_select_punct_font: } { \__xeCJK_ulem_CJK_and_FullLeft_glue:N #1 } } @@ -463,16 +467,13 @@ { \UL@stop \__xeCJK_ulem_skip_punct_begin: - \__xeCJK_punct_if_long:NTF {#1} - { \__xeCJK_ulem_ccglue: } + \__xeCJK_punct_if_long:NTF #1 + { \xeCJK_allow_break: } + { \xeCJK_no_break: } + \__xeCJK_punct_if_middle:NT #1 { - \__xeCJK_punct_if_middle:NTF {#1} - { - \xeCJK_no_break: - \__xeCJK_punct_glue:NN \c__xeCJK_right_tl {#1} - \__xeCJK_punct_bound_rule:NN \c__xeCJK_left_tl {#1} - } - { \xeCJK_no_break: } + \__xeCJK_punct_glue:NN \c__xeCJK_right_tl #1 + \__xeCJK_punct_bound_rule:NN \c__xeCJK_left_tl #1 } \UL@start } @@ -483,8 +484,20 @@ \xeCJK_if_ulem_patch:TF { \xeCJK_class_group_end: - \__xeCJK_Default_and_FullRight_glue:N {#1} + \UL@stop + \__xeCJK_ulem_skip_punct_begin: + \__xeCJK_punct_if_long:NTF #1 + { \xeCJK_allow_break: } + { \xeCJK_no_break: } + \__xeCJK_punct_if_middle:NT #1 + { + \__xeCJK_ulem_punct_ccglue: + \__xeCJK_punct_glue:NN \c__xeCJK_right_tl #1 + \__xeCJK_punct_bound_rule:NN \c__xeCJK_left_tl #1 + } + \UL@start \__xeCJK_ulem_class_group_begin: + \xeCJK_select_punct_font: } { \__xeCJK_ulem_CJK_and_FullRight_glue:N #1 } } @@ -494,7 +507,7 @@ { \__xeCJK_punct_if_middle:NTF \g__xeCJK_last_punct_tl { - \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl \g__xeCJK_last_punct_tl + \xeCJK_get_punct_bounds:No \c__xeCJK_left_tl \g__xeCJK_last_punct_tl \__xeCJK_punct_bound_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl \xeCJK_class_group_end: \UL@stop \xeCJK_no_break: \__xeCJK_punct_glue:NN \c__xeCJK_left_tl \g__xeCJK_last_punct_tl @@ -506,12 +519,32 @@ } { \__xeCJK_ulem_FullLeft_and_Default: } } +\cs_new_protected_nopar:Npn \__xeCJK_ulem_FullLeft_and_Boundary: + { + \xeCJK_if_ulem_patch:TF + { + \__xeCJK_punct_if_middle:NTF \g__xeCJK_last_punct_tl + { + \xeCJK_get_punct_bounds:No \c__xeCJK_left_tl \g__xeCJK_last_punct_tl + \__xeCJK_punct_bound_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \xeCJK_class_group_end: \UL@stop \xeCJK_no_break: + \__xeCJK_punct_glue:NN \c__xeCJK_left_tl \g__xeCJK_last_punct_tl + } + { \xeCJK_class_group_end: \UL@stop } + \__xeCJK_ulem_skip_punct_end: + \xeCJK_no_break: + \UL@start + \tex_ignorespaces:D + } + { \__xeCJK_ulem_FullLeft_and_Boundary: } + } \cs_new_protected_nopar:Npn \__xeCJK_ulem_FullLeft_and_CJK: { \xeCJK_if_ulem_patch:TF { \xeCJK_FullLeft_and_Default: \__xeCJK_ulem_class_group_begin: + \xeCJK_select_font: } { \__xeCJK_ulem_FullLeft_and_CJK: } } @@ -529,6 +562,21 @@ } { \__xeCJK_ulem_FullRight_and_Default: } } +\cs_new_protected_nopar:Npn \__xeCJK_ulem_FullRight_and_Boundary: + { + \xeCJK_if_ulem_patch:TF + { + \__xeCJK_punct_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \xeCJK_class_group_end: + \UL@stop + \__xeCJK_punct_offset:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \__xeCJK_punct_glue:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl + \__xeCJK_ulem_skip_punct_end: + \UL@start + \tex_ignorespaces:D + } + { \__xeCJK_ulem_FullRight_and_Boundary: } + } \cs_new_protected_nopar:Npn \__xeCJK_ulem_FullRight_and_CJK: { \xeCJK_if_ulem_patch:TF @@ -538,10 +586,11 @@ \UL@stop \__xeCJK_punct_offset:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl \__xeCJK_punct_glue:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl - \__xeCJK_ulem_ccglue: + \__xeCJK_ulem_punct_ccglue: \__xeCJK_ulem_skip_punct_end: \UL@start \__xeCJK_ulem_class_group_begin: + \xeCJK_select_font: } { \__xeCJK_ulem_FullRight_and_CJK: } } @@ -551,15 +600,6 @@ { \xeCJK_ulem_hskip:n } { \__xeCJK_ulem_punct_hskip:n } } -\cs_new_protected_nopar:Npn \__xeCJK_ulem_punct_kern:n #1 - { - \xeCJK_if_ulem_patch:TF - { - \dim_compare:nNnF {#1} = \c_zero_dim - { \xeCJK_ulem_hskip:n {#1} } - } - { \__xeCJK_ulem_punct_kern:n {#1} } - } \cs_new_protected_nopar:Npn \__xeCJK_ulem_punct_breakable_kern:n #1 { \xeCJK_if_ulem_patch:TF @@ -567,6 +607,7 @@ \xeCJK_class_group_end: \UL@stop \xeCJK_ulem_hskip:n {#1} \UL@start \__xeCJK_ulem_class_group_begin: + \xeCJK_select_punct_font: } { \__xeCJK_ulem_punct_breakable_kern:n {#1} } } @@ -594,9 +635,11 @@ } \cs_new_protected_nopar:Npn \__xeCJK_ulem_ccglue: { { \skip_set_eq:NN \UL@skip \l__xeCJK_ccglue_skip \UL@leaders } } +\cs_new_protected_nopar:Npn \__xeCJK_ulem_punct_ccglue: + { \__xeCJK_punct_hskip:n { \l__xeCJK_ccglue_skip } } \cs_new_protected_nopar:Npn \xeCJK_ulem_group_begin: { - \xeCJK_leave_vmode: + \mode_leave_vertical: \c_group_begin_token } \cs_new_protected_nopar:Npn \xeCJK_ulem_group_end: @@ -608,7 +651,7 @@ { \__xeCJK_ulem_on:n { \xeCJK_ulem_left: #1 \xeCJK_ulem_right: } } \NewDocumentCommand \xeCJKfntefon { s t- s o } { - \xeCJK_leave_vmode: + \mode_leave_vertical: \xeCJK_ulem_boot:NNNn #1#2#3 {#4} \xeCJK_ulem_on:n } @@ -725,9 +768,9 @@ { \bool_lazy_or:nnT {#3} {#5} { \bool_set_false:c { l__xeCJK_#2_skip_bool } } - \IfBooleanT #4 + \bool_if:NT #4 { \bool_set_true:c { l__xeCJK_#2_subtract_bool } } - \IfNoValueF {#6} + \tl_if_novalue:nF {#6} { \keys_set:nn { xeCJK / options / #1 } {#6} } \bool_set_eq:Nc \l__xeCJK_ulem_skip_bool { l__xeCJK_#2_skip_bool } \bool_set_eq:Nc \l__xeCJK_ulem_hidden_bool { l__xeCJK_#2_hidden_bool } @@ -738,9 +781,9 @@ { \bool_lazy_or:nnT {#1} {#3} { \bool_set_false:N \l__xeCJK_ulem_skip_bool } - \IfBooleanT #2 + \bool_if:NT #2 { \bool_set_true:N \l__xeCJK_ulem_subtract_bool } - \IfNoValueF {#4} + \tl_if_novalue:nF {#4} { \keys_set:nn { xeCJK / options / ulem } {#4} } } \cs_new_protected_nopar:Npn \xeCJK_fntef_initial:n @@ -793,12 +836,6 @@ \color_group_end: } } -\cs_new_protected_nopar:Npn \xeCJK_leave_vmode: - { - \if_mode_vertical: - \exp_after:wN \tex_indent:D - \fi: - } \keys_define:nn { xeCJK / options } { underdot / symbol .tl_set:N = \l__xeCJK_udot_symbol_tl , @@ -930,7 +967,7 @@ } \cs_new_protected:Npn \__xeCJK_under_symbol_auxii:nnnnnn #1#2#3#4#5#6 { - \xeCJK_leave_vmode: + \mode_leave_vertical: \group_begin: \xeCJK_under_symbol_initial:nnnnn {#1} {#2} {#3} {#4} {#5} \__xeCJK_under_symbol_text_format:c { l__xeCJK_#2_text_format_tl } @@ -941,7 +978,7 @@ } \cs_new_protected:Npn \xeCJK_under_symbol_initial:nnnnn #1#2#3#4#5 { - \IfNoValueF {#3} + \tl_if_novalue:nF {#3} { \keys_set:nn { xeCJK / options / #1 } {#3} } \xeCJK_fntef_sbox:n {#5} \bool_if:NTF \l__xeCJK_fntef_bool @@ -1016,7 +1053,7 @@ } \NewEnviron { CJKfilltwosides* } [ 2 ] [ c ] { - \xeCJK_leave_vmode: + \mode_leave_vertical: \cs_set_eq:NN \CJKglue \xeCJK_fntef_hfilll: \tl_set:Nn \arraystretch { 1 } \cs_if_free:NF \extrarowheight @@ -1050,8 +1087,7 @@ } \cs_new_protected_nopar:Npn \xeCJK_fntef_hfilll: { \skip_horizontal:N \c__xeCJK_filll_skip } -\skip_new:N \c__xeCJK_filll_skip -\skip_set:Nn \c__xeCJK_filll_skip { \c_zero_dim plus 1 filll } +\skip_const:Nn \c__xeCJK_filll_skip { \c_zero_dim plus 1 filll } %% %% This package consists of the files xeCJK.dtx, %% full-stop.map, diff --git a/Master/texmf-dist/tex/xelatex/xecjk/xunicode-addon.sty b/Master/texmf-dist/tex/xelatex/xecjk/xunicode-addon.sty index a552e9929c0..b23c5ffde29 100644 --- a/Master/texmf-dist/tex/xelatex/xecjk/xunicode-addon.sty +++ b/Master/texmf-dist/tex/xelatex/xecjk/xunicode-addon.sty @@ -7,8 +7,8 @@ %% xeCJK.dtx (with options: `xunicode') %% %% Copyright (C) 2007--2010 by Wenchang Sun <sunwch@nankai.edu.cn> -%% Copyright (C) 2009--2017 by Leo Liu <leoliu.pku@gmail.com> -%% Copyright (C) 2012--2017 by Qing Lee <sobenlee@gmail.com> +%% Copyright (C) 2009--2018 by Leo Liu <leoliu.pku@gmail.com> +%% Copyright (C) 2012--2018 by Qing Lee <sobenlee@gmail.com> %% ---------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -29,10 +29,10 @@ %% \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} -\GetIdInfo$Id: xeCJK.dtx 5a18688 2017-11-22 19:12:51 +0800 Qing Lee <sobenlee@gmail.com> $ +\GetIdInfo$Id: xeCJK.dtx 54327e6 2018-01-28 19:10:14 +0800 Qing Lee <sobenlee@gmail.com> $ {addon file for xunicode} \ProvidesExplPackage{xunicode-addon} - {\ExplFileDate}{3.5.1}{\ExplFileDescription} + {\ExplFileDate}{3.6.0}{\ExplFileDescription} \bool_lazy_or:nnF { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: } diff --git a/Master/texmf-dist/tex/xelatex/xecjk/xunicode-extra.def b/Master/texmf-dist/tex/xelatex/xecjk/xunicode-extra.def index 2baaceb1e05..3cfa45114c5 100644 --- a/Master/texmf-dist/tex/xelatex/xecjk/xunicode-extra.def +++ b/Master/texmf-dist/tex/xelatex/xecjk/xunicode-extra.def @@ -7,8 +7,8 @@ %% xeCJK.dtx (with options: `xunextra') %% %% Copyright (C) 2007--2010 by Wenchang Sun <sunwch@nankai.edu.cn> -%% Copyright (C) 2009--2017 by Leo Liu <leoliu.pku@gmail.com> -%% Copyright (C) 2012--2017 by Qing Lee <sobenlee@gmail.com> +%% Copyright (C) 2009--2018 by Leo Liu <leoliu.pku@gmail.com> +%% Copyright (C) 2012--2018 by Qing Lee <sobenlee@gmail.com> %% ---------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -27,10 +27,10 @@ %% %% ---------------------------------------------------------------------- %% -\GetIdInfo$Id: xeCJK.dtx 5a18688 2017-11-22 19:12:51 +0800 Qing Lee <sobenlee@gmail.com> $ +\GetIdInfo$Id: xeCJK.dtx 54327e6 2018-01-28 19:10:14 +0800 Qing Lee <sobenlee@gmail.com> $ {extra definition for xunicode} \ProvidesExplFile{xunicode-extra.def} - {\ExplFileDate}{3.5.1}{\ExplFileDescription} + {\ExplFileDate}{3.6.0}{\ExplFileDescription} \DeclareUTFComposite\textsuperscript \DeclareUTFComposite\textsubscript \DeclareUTFEncodedAccent\textsbleftarrow{"20EE}{"20FF} |