summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-11-23 22:46:32 +0000
committerKarl Berry <karl@freefriends.org>2012-11-23 22:46:32 +0000
commit4472c1a09891d886ecdc6dd3fbfa39e66ef55ff7 (patch)
tree0235845fbcfde75dc2d3b817a8cf2a7a047e201c /Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty
parente59dc86d50620df70414da4bd434219b46137fc9 (diff)
xecjk (23nov12)
git-svn-id: svn://tug.org/texlive/trunk@28348 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty')
-rw-r--r--Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty3090
1 files changed, 1659 insertions, 1431 deletions
diff --git a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty
index c229af4412c..f6876df0358 100644
--- a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty
+++ b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty
@@ -6,7 +6,7 @@
%%
%% xeCJK.dtx (with options: `package')
%%
-%% $Id: xeCJK.dtx 358 2012-10-27 11:52:01Z sobenlee $
+%% $Id: xeCJK.dtx 368 2012-11-23 04:55:23Z sobenlee $
%% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $
%% -----------------------------------------------------------------
%% Author:
@@ -31,11 +31,11 @@
%%
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
-\GetIdInfo$Id: xeCJK.dtx 358 2012-10-27 11:52:01Z sobenlee $
- {package for typesetting CJK scripts with XeLaTeX}
+\GetIdInfo$Id: xeCJK.dtx 368 2012-11-23 04:55:23Z sobenlee $
+ {Typesetting CJK scripts with XeLaTeX}
\ProvidesExplPackage
{\ExplFileName}
- {\ExplFileDate}{3.0.10}{\ExplFileDescription}
+ {\ExplFileDate}{3.1.0}{\ExplFileDescription}
\msg_new:nnn { xeCJK } { Require-XeTeX }
{
The~xeCJK~package~requires~XeTeX~to~function.\\\\
@@ -46,106 +46,116 @@
\xetex_if_engine:F { \msg_critical:nn { xeCJK } { Require-XeTeX } }
\msg_new:nnn { xeCJK } { l3-too-old }
{
- Support~package~'expl3'~too~old. \\\\
+ Support~package~'#1'~too~old. \\\\
Please~update~an~up~to~date~version~of~the~bundles\\\\
'l3kernel'~and~'l3packages'\\\\
using~your~TeX~package~manager~or~from~CTAN.\\
- Loading~xeCJK~will~abort!
- }
-\@ifpackagelater { expl3 } { 2012/09/10 } { }
- { \msg_critical:nn { xeCJK } { l3-too-old } }
-\RequirePackage{xparse}
-\RequirePackage{l3keys2e}
-\msg_new:nnn { xeCJK } { XeTeX-too-old }
- {
- \token_to_str:N \XeTeXglyphbounds \ is~not~defined.\\\\
- You~have~to~update~XeTeX~to~the~version~0.9995.0~or~later.
- }
-\cs_if_free:NT \XeTeXglyphbounds
- {
- \msg_error:nn { xeCJK } { XeTeX-too-old }
- \AtEndOfPackage { \__xeCJK_AfterPreamble:n { \punctstyle { plain } } }
- }
+ \str_if_eq:nnT {#1} { expl3 } { Loading~xeCJK~will~abort! }
+ }
+\@ifpackagelater { expl3 } { 2012/11/10 } { }
+ { \msg_critical:nnn { xeCJK } { l3-too-old } { expl3 } }
+\RequirePackage { xtemplate }
+\@ifpackagelater { xtemplate } { 2012/11/10 } { }
+ { \msg_error:nnn { xeCJK } { l3-too-old } { xtemplate } }
+\RequirePackage { xparse , l3keys2e }
+\RequirePackage { xpatch }
+\tl_new:N \l__xeCJK_tmpa_tl
+\tl_new:N \l__xeCJK_tmpb_tl
\int_new:N \l__xeCJK_tmpa_int
\int_new:N \l__xeCJK_tmpb_int
\int_new:N \l__xeCJK_tmpc_int
-\dim_new:N \l__xeCJK_tmpa_dim
-\dim_new:N \l__xeCJK_tmpb_dim
-\dim_new:N \l__xeCJK_tmpc_dim
-\tl_new:N \l__xeCJK_tmpa_tl
-\tl_new:N \l__xeCJK_tmpb_tl
+\box_new:N \l__xeCJK_tmp_box
+\dim_new:N \l__xeCJK_tmp_dim
+\skip_new:N \g__xeCJK_tmp_skip
+\prop_new:N \l__xeCJK_tmp_prop
\clist_new:N \l__xeCJK_tmpa_clist
\clist_new:N \l__xeCJK_tmpb_clist
-\clist_new:N \l__xeCJK_tmpc_clist
+\cs_new_protected_nopar:Npn \__xeCJK_msg_new:nn { \msg_new:nnn { xeCJK } }
+\cs_new_protected_nopar:Npn \__xeCJK_error:n { \msg_error:nn { xeCJK } }
+\cs_new_protected_nopar:Npn \__xeCJK_error:nx { \msg_error:nnx { xeCJK } }
+\cs_new_protected_nopar:Npn \__xeCJK_warning:n { \msg_warning:nn { xeCJK } }
+\cs_new_protected_nopar:Npn \__xeCJK_warning:nx { \msg_warning:nnx { xeCJK } }
+\cs_new_protected_nopar:Npn \__xeCJK_warning:nxx { \msg_warning:nnxx { xeCJK } }
+\cs_new_protected_nopar:Npn \__xeCJK_info:nx { \msg_info:nnx { 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 }
\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
-\cs_new_protected:Npn \__xeCJK_AtEndPreamble:n #1
+\cs_new_protected:Npn \__xeCJK_at_end_preamble:n #1
{ \tl_gput_right:Nn \g__xeCJK_at_end_preamble_hook_tl {#1} }
-\cs_new_protected:Npn \__xeCJK_AfterPreamble:n #1
+\cs_new_protected:Npn \__xeCJK_after_preamble:n #1
{ \tl_gput_right:Nn \g__xeCJK_after_preamble_hook_tl {#1} }
-\cs_new_protected:Npn \__xeCJK_AfterEndPreamble:n #1
+\cs_new_protected:Npn \__xeCJK_after_end_preamble:n #1
{ \tl_gput_right:Nn \g__xeCJK_after_end_preamble_hook_tl {#1} }
-\AtBeginDocument { \g__xeCJK_after_preamble_hook_tl }
-\tl_put_left:Nn \document { \group_end: \g__xeCJK_at_end_preamble_hook_tl \group_begin: }
-\tl_put_right:Nn \document { \g__xeCJK_after_end_preamble_hook_tl \tex_ignorespaces:D }
-\group_begin:
-\char_set_lccode:nn { `\Z } { `\t }
-\char_set_lccode:nn { `\Y } { `\c }
-\char_set_lccode:nn { `\; } { `\: }
-\char_set_lccode:nn { `\/ } { `\\ }
-\tl_map_inline:nn { \T \F \C \J \K } { \char_set_lccode:nn { `#1 } { `#1 } }
-\tl_map_function:nN { \O \U \Z \E \R \M \A \Y \R \; \/ } \char_set_catcode_other:N
-\tl_to_lowercase:n
+\AtEndPreamble { \g__xeCJK_at_end_preamble_hook_tl }
+\AfterPreamble { \g__xeCJK_after_preamble_hook_tl }
+\AfterEndPreamble { \g__xeCJK_after_end_preamble_hook_tl }
+\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
+ { \__xeCJK_tl_remove_outer_braces:w #1 \q_stop }
+\cs_new:Npn \__xeCJK_tl_remove_outer_braces:w #1 \q_stop
{
- \group_end:
- \prg_new_conditional:Npnn \xeCJK_if_outer_macro:c #1 { p , T , F , TF }
+ \bool_if:nTF { \tl_if_single_p:n {#1} && \tl_if_head_is_group_p:n {#1} }
+ { \__xeCJK_tl_remove_outer_braces:w #1 \q_stop }
+ { \tl_trim_spaces:n {#1} }
+ }
+\cs_new_protected:Npn \xeCJK_cs_add:Nnn #1#2#3
+ {
+ \tl_if_empty:nTF {#3}
+ { \tl_if_empty:nTF {#2} { \use_ii:nn } { \xpretocmd {#1} {#2} } }
{
- \exp_last_unbraced:Nf \__xeCJK_if_outer_macro_aux:w
- { \cs_meaning:c {#1} } OUZER ~ MAYRO ; \q_stop
+ \tl_if_empty:nTF {#2} { \xapptocmd {#1} {#3} }
+ { \xpretocmd {#1} {#2} { \xapptocmd {#1} {#3} } { \use_ii:nn } }
}
- \cs_new_nopar:Npn \__xeCJK_if_outer_macro_aux:w #1 OUZER ~ MAYRO ; #2 \q_stop
+ { \__xeCJK_info:nxx { patch-cmd } { \token_to_str:N #1 } { succeeded } }
+ { \__xeCJK_warning:nxx { patch-cmd } { \token_to_str:N #1 } { failed } }
+ }
+\cs_new_protected:Npn \xeCJK_cs_patch:Nnn #1#2#3
+ {
+ \xpatchcmd {#1} {#2} {#3}
+ { \__xeCJK_info:nxx { patch-cmd } { \token_to_str:N #1 } { succeeded } }
+ { \__xeCJK_warning:nxx { patch-cmd } { \token_to_str:N #1 } { failed } }
+ }
+\__xeCJK_msg_new:nn { patch-cmd } { Patching~'#1'~#2! }
+\cs_new_eq:NN \xeCJK_cs_clear:N \tl_clear:N
+\cs_new_eq:NN \xeCJK_cs_gclear:N \tl_gclear:N
+\cs_new_protected:Npn \xeCJK_swap_cs:NN #1#2
+ {
+ \cs_set_eq:NN \__xeCJK_swap_cs_aux:w #1
+ \cs_set_eq:NN #1 #2
+ \cs_set_eq:NN #2 \__xeCJK_swap_cs_aux:w
+ \cs_undefine:N \__xeCJK_swap_cs_aux:w
+ }
+\cs_new_protected_nopar:Npn \xeCJK_font_gset_to_current:c #1
+ {
+ \exp_after:wN \cs_gset_eq:NN
+ \cs:w #1 \exp_after:wN \cs_end: \tex_the:D \tex_font:D
+ }
+\prg_new_conditional:Npnn \xeCJK_glyph_if_exist:N #1 { p , T , F , TF }
+ {
+ \etex_iffontchar:D \tex_font:D `#1 \exp_stop_f:
+ \prg_return_true: \else: \prg_return_false: \fi:
+ }
+\tl_const:Nn \c_xeCJK_space_skip_tl
+ {
+ \skip_if_eq:nnTF \tex_spaceskip:D \c_zero_skip
{
- \if_cs_exist:w c__xeCJK_prefix_#1_aux_tl \cs_end:
- \prg_return_true: \else: \prg_return_false: \fi:
+ \tex_fontdimen:D \c_two \tex_font:D
+ plus \tex_fontdimen:D \c_three \tex_font:D
+ minus \tex_fontdimen:D \c_four \tex_font:D
}
- \tl_new:c { c__xeCJK_prefix_/_aux_tl }
- \tl_new:c { c__xeCJK_prefix_/long/_aux_tl }
- \tl_new:c { c__xeCJK_prefix_/protected/_aux_tl }
- \tl_new:c { c__xeCJK_prefix_/protected/long/_aux_tl }
- }
-\token_new:Nn \l__xeCJK_peek_search_token { ? }
-\cs_new_protected:Npn \xeCJK_peek_catcode_ignore_spaces:NTF #1#2#3
- {
- \cs_set_eq:NN \l__xeCJK_peek_search_token #1 \prg_do_nothing:
- \tl_set:Nn \__xeCJK_peek_true:w { \group_align_safe_end: #2 }
- \tl_set:Nn \__xeCJK_peek_false:w { \group_align_safe_end: #3 }
- \group_align_safe_begin:
- \peek_after:Nw \__xeCJK_peek_ignore_spaces_execute_branches:
- }
-\cs_new_protected:Npn \xeCJK_peek_catcode_ignore_spaces:NT #1#2
- { \xeCJK_peek_catcode_ignore_spaces:NTF #1 {#2} { } }
-\cs_new_protected:Npn \xeCJK_peek_catcode_ignore_spaces:NF #1#2
- { \xeCJK_peek_catcode_ignore_spaces:NTF #1 { } {#2} }
-\cs_new_nopar:Npn \__xeCJK_peek_ignore_spaces_execute_branches:
- {
- \if_meaning:w \l_peek_token \c_space_token
- \tex_afterassignment:D \__xeCJK_peek_ignore_spaces_execute_branches_aux:
- \exp_after:wN \cs_set_eq:NN \exp_after:wN \__xeCJK_peek_tmp:w
- \else:
- \exp_after:wN \__xeCJK_peek_execute_branches_catcode:
- \fi:
+ { \tex_spaceskip:D }
}
-\cs_new_protected_nopar:Npn \__xeCJK_peek_ignore_spaces_execute_branches_aux:
- { \peek_after:Nw \__xeCJK_peek_ignore_spaces_execute_branches: }
-\cs_new_nopar:Npn \__xeCJK_peek_execute_branches_catcode:
+\cs_new_protected_nopar:Npn \xeCJK_glue_to_skip:nN #1#2
{
- \if_catcode:w \exp_not:N \l_peek_token \exp_not:N \l__xeCJK_peek_search_token
- \exp_after:wN \__xeCJK_peek_true:w
- \else:
- \exp_after:wN \__xeCJK_peek_false:w
- \fi:
+ \hbox_set:Nn \l__xeCJK_tmp_box
+ { #1 \skip_gset_eq:NN \g__xeCJK_tmp_skip \tex_lastskip:D }
+ \skip_set_eq:NN #2 \g__xeCJK_tmp_skip
}
\prg_new_conditional:Npnn \xeCJK_if_blank_x:n #1 { p , T , F , TF }
{
@@ -158,90 +168,158 @@
}
\prg_new_conditional:Npnn \xeCJK_if_package_loaded:n #1 { p , T , F , TF }
{
- \tl_if_exist:cTF { ver@ #1 . \c__xeCJK_pkg_extension_tl }
- { \prg_return_true: } { \prg_return_false: }
+ \tl_if_exist:cTF { ver@ #1 . \c__xeCJK_package_ext_tl }
+ { \prg_return_true: }
+ { \prg_return_false: }
}
-\tl_const:Nx \c__xeCJK_pkg_extension_tl { \@pkgextension }
-\cs_new_nopar:Npn \__xeCJK_msg_new:nn { \msg_new:nnn { xeCJK } }
-\cs_new_nopar:Npn \__xeCJK_error:n { \msg_error:nn { xeCJK } }
-\cs_new_nopar:Npn \__xeCJK_error:nx { \msg_error:nnx { xeCJK } }
-\cs_new_nopar:Npn \__xeCJK_warning:n { \msg_warning:nn { xeCJK } }
-\cs_new_nopar:Npn \__xeCJK_warning:nx { \msg_warning:nnx { xeCJK } }
-\cs_new_nopar:Npn \__xeCJK_warning:nxx { \msg_warning:nnxx { xeCJK } }
-\cs_new_nopar:Npn \__xeCJK_info:nx { \msg_info:nnx { xeCJK } }
-\cs_new_nopar:Npn \__xeCJK_info:nxx { \msg_info:nnxx { xeCJK } }
+\tl_const:Nx \c__xeCJK_package_ext_tl { \@pkgextension }
+\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 } }
+\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} }
\keys_define:nn { xeCJK / options }
{
- xeCJKactive .choice:,
+ xeCJKactive .choice: ,
xeCJKactive / true .code:n = { \makexeCJKactive } ,
xeCJKactive / false .code:n = { \makexeCJKinactive } ,
- xeCJKactive .default:n = { true },
+ xeCJKactive .default:n = { true }
}
\NewDocumentCommand \makexeCJKactive { } { \XeTeXinterchartokenstate = \c_one }
\NewDocumentCommand \makexeCJKinactive { } { \XeTeXinterchartokenstate = \c_zero }
\char_set_catcode_ignore:n { "FEFF }
-\int_const:Nn \c__xeCJK_Default_class_int { 0 }
-\int_const:Nn \c__xeCJK_CJK_class_int { 1 }
-\int_const:Nn \c__xeCJK_FullLeft_class_int { 2 }
-\int_const:Nn \c__xeCJK_FullRight_class_int { 3 }
-\int_const:Nn \c__xeCJK_Boundary_class_int { 255 }
-\cs_new_protected_nopar:Npn \__xeCJK_new_class:n #1
+\int_const:Nn \c__xeCJK_Default_class_int { \c_zero }
+\int_const:Nn \c__xeCJK_CJK_class_int { \c_one }
+\int_const:Nn \c__xeCJK_FullLeft_class_int { \c_two }
+\int_const:Nn \c__xeCJK_FullRight_class_int { \c_three }
+\int_const:Nn \c__xeCJK_Boundary_class_int { \c_two_hundred_fifty_five }
+\cs_new_protected_nopar:Npn \xeCJK_new_class:n #1
{
\exp_args:Nc \newXeTeXintercharclass { c__xeCJK_#1_class_int }
\clist_gclear_new:c { g__xeCJK_#1_range_clist }
\seq_gput_right:Nv \g__xeCJK_class_seq { c__xeCJK_#1_class_int }
}
\seq_new:N \g__xeCJK_class_seq
-\__xeCJK_new_class:n { HalfLeft }
-\__xeCJK_new_class:n { HalfRight }
-\__xeCJK_new_class:n { NormalSpace }
-\clist_set:Nn \g__xeCJK_base_class_clist
- {
- Default, CJK, FullLeft, FullRight, Boundary,
- HalfLeft, HalfRight, NormalSpace
- }
-\clist_map_inline:Nn \g__xeCJK_base_class_clist
+\xeCJK_new_class:n { HalfLeft }
+\xeCJK_new_class:n { HalfRight }
+\xeCJK_new_class:n { NormalSpace }
+\clist_const:Nn \c__xeCJK_HalfLeft_chars_clist
+ { "28 , "2D , "5B , "60 , "7B }
+\clist_const:Nn \c__xeCJK_HalfRight_chars_clist
+ { "21 , "22 , "25 , "27 , "29 , "2C , "2E , "3A , "3B , "3F , "5D , "7D }
+\clist_const:Nn \c__xeCJK_NormalSpace_chars_clist { "2F }
+\clist_const:Nn \c__xeCJK_FullLeft_chars_clist
+ {
+ "2018 , "201C , "2116 , "3008 , "300A , "300C , "300E , "3010 , "3012 ,
+ "3014 , "3016 , "3018 , "301A , "301D , "3036 , "E76C , "FE59 , "FE5B ,
+ "FE5D , "FE5F , "FE60 , "FE69 , "FE6B , "FF03 , "FF04 , "FF08 , "FF20 ,
+ "FF3B , "FF5B , "FFE0 , "FFE1 , "FFE5 , "FFE6
+ }
+\clist_const:Nn \c__xeCJK_FullRight_chars_clist
+ {
+ "00B7 , "2019 , "201D , "2014 , "2015 , "2025 , "2026 , "2030 , "2500 ,
+ "3001 , "3002 , "3005 , "3006 , "3009 , "300B , "300D , "300F , "3011 ,
+ "3015 , "3017 , "3019 , "301B , "301E , "301F , "3041 , "3043 , "3045 ,
+ "3047 , "3049 , "3063 , "3083 , "3085 , "3087 , "308E , "309B , "309C ,
+ "309D , "309E , "30A1 , "30A3 , "30A5 , "30A7 , "30A9 , "30C3 , "30E3 ,
+ "30E5 , "30E7 , "30EE , "30F5 , "30F6 , "30FB , "30FC , "30FD , "30FE ,
+ "FE50 , "FE51 , "FE52 , "FE54 , "FE55 , "FE56 , "FE57 , "FE5A , "FE5C ,
+ "FE5E , "FE6A , "FF01 , "FF05 , "FF09 , "FF0C , "FF0E , "FF1A , "FF1B ,
+ "FF1F , "FF3D , "FF5D , "FF61 , "FF63 , "FF64 , "FF65 , "FF67 , "FF68 ,
+ "FF69 , "FF6A , "FF6B , "FF6C , "FF6D , "FF6E , "FF6F , "FF70 , "FF9E ,
+ "FF9F
+ }
+\clist_const:Nn \c__xeCJK_CJK_chars_clist
+ {
+ "1100 -> "11FF ,
+ "2E80 -> "2EFF ,
+ "2F00 -> "2FDF ,
+ "2FF0 -> "2FFF ,
+ "3000 -> "303F ,
+ "3040 -> "309F ,
+ "30A0 -> "30FF ,
+ "3100 -> "312F ,
+ "3130 -> "318F ,
+ "3190 -> "319F ,
+ "31A0 -> "31BF ,
+ "31C0 -> "31EF ,
+ "31F0 -> "31FF ,
+ "3200 -> "32FF ,
+ "3300 -> "33FF ,
+ "3400 -> "4DBF ,
+ "4DC0 -> "4DFF ,
+ "4E00 -> "9FFF ,
+ "A000 -> "A48F ,
+ "A490 -> "A4CF ,
+ "A960 -> "A97F ,
+ "AC00 -> "D7AF ,
+ "B000 -> "B0FF ,
+ "D7B0 -> "D7FF ,
+ "F900 -> "FAFF ,
+ "FE30 -> "FE4F ,
+ "FF00 -> "FFEF ,
+ "20000 -> "2A6DF ,
+ "2A700 -> "2B73F ,
+ "2B740 -> "2B81F ,
+ "2F800 -> "2FA1F
+ }
+\seq_new:N \g__xeCJK_base_class_seq
+\seq_gset_split:Nnn \g__xeCJK_base_class_seq { , }
+ {
+ Default , CJK , FullLeft , FullRight , Boundary ,
+ HalfLeft , HalfRight , NormalSpace
+ }
+\seq_map_inline:Nn \g__xeCJK_base_class_seq
{ \clist_gclear_new:c { g__xeCJK_#1_range_clist } }
-\clist_new:N \g__xeCJK_CJK_class_clist
+\seq_new:N \g__xeCJK_CJK_class_seq
\prop_new:N \g__xeCJK_CJK_class_prop
\cs_new_protected_nopar:Npn \__xeCJK_save_CJK_class:n #1
{
- \clist_gput_right:Nx \g__xeCJK_CJK_class_clist {#1}
- \prop_gput:Nvx \g__xeCJK_CJK_class_prop { c__xeCJK_#1_class_int } {#1}
+ \seq_gput_right:Nn \g__xeCJK_CJK_class_seq {#1}
+ \prop_gput:Nvn \g__xeCJK_CJK_class_prop { c__xeCJK_#1_class_int } {#1}
+ }
+\cs_generate_variant:Nn \prop_gput:Nnn { Nvn }
+\clist_map_function:nN { CJK , FullLeft , FullRight } \__xeCJK_save_CJK_class:n
+\cs_new_nopar:Npn \xeCJK_class_num:n #1 { \use:c { c__xeCJK_#1_class_int } }
+\cs_new_nopar:Npn \xeCJK_value_class:n #1
+ { \XeTeXcharclass \etex_numexpr:D #1 \scan_stop: }
+\prg_new_conditional:Npnn \xeCJK_if_same_class:NN #1#2 { p , T , F , TF }
+ {
+ \if_int_compare:w \xeCJK_value_class:n {`#1} = \xeCJK_value_class:n {`#2}
+ \prg_return_true: \else: \prg_return_false: \fi:
}
-\cs_generate_variant:Nn \prop_gput:Nnn { Nvx }
-\clist_map_function:nN { CJK, FullLeft, FullRight } \__xeCJK_save_CJK_class:n
-\cs_new_nopar:Npn \__xeCJK_class_num:n #1 { \tl_use:c { c__xeCJK_#1_class_int } }
\NewDocumentCommand \xeCJKDeclareCharClass { s > { \TrimSpaces } m m }
{
- \__xeCJK_declare_char_class:nn {#2} {#3}
+ \xeCJK_declare_char_class:nx {#2} {#3}
\IfBooleanT {#1} { \xeCJKResetPunctClass }
}
-\cs_new_protected_nopar:Npn \__xeCJK_declare_char_class:nn #1#2
+\cs_new_protected_nopar:Npn \xeCJK_declare_char_class:nn #1#2
{
- \clist_gput_right:cx { g__xeCJK_#1_range_clist } {#2}
- \clist_map_inline:xn {#2}
+ \clist_set:Nn \l__xeCJK_tmpa_clist {#2}
+ \clist_gconcat:ccN
+ { g__xeCJK_#1_range_clist } { g__xeCJK_#1_range_clist } \l__xeCJK_tmpa_clist
+ \clist_map_inline:Nn \l__xeCJK_tmpa_clist
{
- \str_if_eq_x:nnF {##1} { -> }
+ \str_if_eq:nnF {##1} { -> }
{
- \__xeCJK_set_char_class_aux:Nn \__xeCJK_set_char_class:nnn {##1}
- { \__xeCJK_class_num:n {#1} }
+ \__xeCJK_set_char_class_aux:Nnw \xeCJK_set_char_class:nnn {##1}
+ { \xeCJK_class_num:n {#1} }
}
}
}
-\NewDocumentCommand \__xeCJK_set_char_class_aux:Nn
+\NewDocumentCommand \__xeCJK_set_char_class_aux:Nnw
{ m > { \SplitArgument { 1 } { -> } } m } { #1 #2 }
-\cs_generate_variant:Nn \clist_map_inline:nn { x }
+\cs_generate_variant:Nn \clist_gconcat:NNN { cc }
+\cs_generate_variant:Nn \xeCJK_declare_char_class:nn { nx , nV }
\NewDocumentCommand \xeCJKsetcharclass { s m m m }
{
- \__xeCJK_set_char_class:nnn {#2} {#3} {#4}
+ \xeCJK_set_char_class:nnn {#2} {#3} {#4}
\IfBooleanF {#1} { \xeCJKResetPunctClass }
}
-\cs_new_protected_nopar:Npn \__xeCJK_set_char_class:nnn #1#2#3
+\cs_new_protected_nopar:Npn \xeCJK_set_char_class:nnn #1#2#3
{
\__xeCJK_check_num_range:nnNN {#1} {#2} \l__xeCJK_tmpa_int \l__xeCJK_tmpb_int
\int_set:Nn \l__xeCJK_tmpc_int {#3}
- \prop_if_in:NVTF \g__xeCJK_CJK_class_prop \l__xeCJK_tmpc_int
+ \prop_get:NVNTF \g__xeCJK_CJK_class_prop \l__xeCJK_tmpc_int \l__xeCJK_tmpa_tl
{ \cs_set_eq:NN \__xeCJK_set_char_catcode:n \char_set_catcode_other:n }
{ \cs_set_eq:NN \__xeCJK_set_char_catcode:n \use_none:n }
\xeCJK_int_until_do:nn { \l__xeCJK_tmpa_int > \l__xeCJK_tmpb_int }
@@ -251,16 +329,6 @@
\int_incr:N \l__xeCJK_tmpa_int
}
}
-\cs_new_protected:Npn \xeCJK_int_until_do:nn #1#2
- {
- \__xeCJK_int_until_do_aux:wn \use_none:n
- { \reverse_if:N \if_int_compare:w #1#2 }
- }
-\cs_new_protected:Npn \__xeCJK_int_until_do_aux:wn \use_none:n #1
- {
- #1 \exp_after:wN \__xeCJK_int_until_do_aux:wn \fi:
- \use_none:n {#1}
- }
\cs_new_protected_nopar:Npn \__xeCJK_check_num_range:nnNN #1#2#3#4
{
\bool_if:nTF { \xeCJK_if_blank_x_p:n {#1} || \xeCJK_if_blank_x_p:n {#2} }
@@ -273,532 +341,466 @@
\int_set:Nn #4 { \int_max:nn {#1} { \IfNoValueTF {#2} {#1} {#2} } }
}
}
-\NewDocumentCommand \xeCJKResetPunctClass { }
+\cs_new_protected_nopar:Npn \__xeCJK_set_char_class_eq:nn #1#2
{
- \__xeCJK_declare_char_class:nn { HalfLeft }
- { "28 , "2D , "5B , "60 , "7B }
- \__xeCJK_declare_char_class:nn { HalfRight }
- { "21 , "22 , "25 , "27 , "29 , "2C , "2E , "3A , "3B , "3F , "5D , "7D , }
- \__xeCJK_declare_char_class:nn { FullLeft }
- {
- "2018 , "201C , "2116 , "3008 , "300A , "300C , "300E , "3010 , "3012 ,
- "3014 , "3016 , "3018 , "301A , "301D , "3036 , "E76C , "FE59 , "FE5B ,
- "FE5D , "FE5F , "FE60 , "FE69 , "FE6B , "FF03 , "FF04 , "FF08 , "FF20 ,
- "FF3B , "FF5B , "FFE0 , "FFE1 , "FFE5 , "FFE6 ,
- }
- \__xeCJK_declare_char_class:nn { FullRight }
- {
- "00B7 , "2019 , "201D , "2014 , "2015 , "2025 , "2026 , "2030 , "2500 ,
- "3001 , "3002 , "3005 , "3006 , "3009 , "300B , "300D , "300F , "3011 ,
- "3015 , "3017 , "3019 , "301B , "301E , "301F , "3041 , "3043 , "3045 ,
- "3047 , "3049 , "3063 , "3083 , "3085 , "3087 , "308E , "309B , "309C ,
- "309D , "309E , "30A1 , "30A3 , "30A5 , "30A7 , "30A9 , "30C3 , "30E3 ,
- "30E5 , "30E7 , "30EE , "30F5 , "30F6 , "30FB , "30FC , "30FD , "30FE ,
- "FE50 , "FE51 , "FE52 , "FE54 , "FE55 , "FE56 , "FE57 , "FE5A , "FE5C ,
- "FE5E , "FE6A , "FF01 , "FF05 , "FF09 , "FF0C , "FF0E , "FF1A , "FF1B ,
- "FF1F , "FF3D , "FF5D , "FF61 , "FF63 , "FF64 , "FF65 , "FF67 , "FF68 ,
- "FF69 , "FF6A , "FF6B , "FF6C , "FF6D , "FF6E , "FF6F , "FF70 , "FF9E ,
- "FF9F ,
- }
- }
-\__xeCJK_declare_char_class:nn { CJK }
- {
- "1100 -> "11FF ,
- "2E80 -> "2EFF ,
- "2F00 -> "2FDF ,
- "2FF0 -> "2FFF ,
- "3000 -> "303F ,
- "3040 -> "309F ,
- "30A0 -> "30FF ,
- "3100 -> "312F ,
- "3130 -> "318F ,
- "3190 -> "319F ,
- "31A0 -> "31BF ,
- "31C0 -> "31EF ,
- "31F0 -> "31FF ,
- "3200 -> "32FF ,
- "3300 -> "33FF ,
- "3400 -> "4DBF ,
- "4DC0 -> "4DFF ,
- "4E00 -> "9FFF ,
- "A000 -> "A48F ,
- "A490 -> "A4CF ,
- "A960 -> "A97F ,
- "AC00 -> "D7AF ,
- "B000 -> "B0FF ,
- "D7B0 -> "D7FF ,
- "F900 -> "FAFF ,
- "FE30 -> "FE4F ,
- "FF00 -> "FFEF ,
- "20000 -> "2A6DF ,
- "2A700 -> "2B73F ,
- "2B740 -> "2B81F ,
- "2F800 -> "2FA1F ,
- }
-\xeCJKResetPunctClass
+ \int_set:Nn \l__xeCJK_tmpa_int { \xeCJK_class_num:n {#1} }
+ \clist_map_inline:cn { c__xeCJK_#2_chars_clist }
+ { \XeTeXcharclass ##1 = \l__xeCJK_tmpa_int }
+ }
\NewDocumentCommand \normalspacedchars { m }
{
- \tl_map_inline:nn {#1}
- { \XeTeXcharclass `##1 = \__xeCJK_class_num:n { NormalSpace } }
+ \tl_map_inline:xn {#1}
+ { \XeTeXcharclass `##1 = \xeCJK_class_num:n { NormalSpace } }
}
-\normalspacedchars{/}
-\cs_new_protected_nopar:Npn \__xeCJK_inter_class_toks:nnn #1#2#3
- { \XeTeXinterchartoks \__xeCJK_class_num:n {#1} \__xeCJK_class_num:n {#2} = {#3} }
-\cs_generate_variant:Nn \__xeCJK_inter_class_toks:nnn { nnc , nnx }
-\cs_new_nopar:Npn \__xeCJK_get_inter_class_toks:nn #1#2
- { \tex_the:D \XeTeXinterchartoks \__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} { \c_empty_tl } }
-\cs_new_protected_nopar:Npn \__xeCJK_pre_inter_class_toks:nnn #1#2#3
+\cs_generate_variant:Nn \tl_map_inline:nn { x }
+\NewDocumentCommand \xeCJKResetPunctClass { }
{
- \__xeCJK_inter_class_toks:nnx {#1} {#2}
- { \exp_not:n {#3} \__xeCJK_get_inter_class_toks:nn {#1} {#2} }
+ \xeCJK_declare_char_class:nV { HalfLeft } \c__xeCJK_HalfLeft_chars_clist
+ \xeCJK_declare_char_class:nV { HalfRight } \c__xeCJK_HalfRight_chars_clist
+ \xeCJK_declare_char_class:nV { FullLeft } \c__xeCJK_FullLeft_chars_clist
+ \xeCJK_declare_char_class:nV { FullRight } \c__xeCJK_FullRight_chars_clist
}
-\cs_new_protected_nopar:Npn \__xeCJK_app_inter_class_toks:nnn #1#2#3
+\NewDocumentCommand \xeCJKResetCharClass { }
{
- \__xeCJK_inter_class_toks:nnx {#1} {#2}
- { \__xeCJK_get_inter_class_toks:nn {#1} {#2} \exp_not:n {#3} }
+ \xeCJK_declare_char_class:nV { CJK } \c__xeCJK_CJK_chars_clist
+ \xeCJK_declare_char_class:nV { NormalSpace } \c__xeCJK_NormalSpace_chars_clist
+ \xeCJKResetPunctClass
}
-\cs_generate_variant:Nn \__xeCJK_app_inter_class_toks:nnn { nnc }
-\cs_new_protected_nopar:Npn \__xeCJK_copy_inter_class_toks:nnnn #1#2#3#4
+\xeCJKResetCharClass
+\cs_new_protected_nopar:Npn \xeCJK_inter_class_toks:nnn #1#2#3
+ { \XeTeXinterchartoks \xeCJK_class_num:n {#1} ~ \xeCJK_class_num:n {#2} = {#3} }
+\cs_generate_variant:Nn \xeCJK_inter_class_toks:nnn { nnc , nnx }
+\cs_new_nopar:Npn \xeCJK_get_inter_class_toks:nn #1#2
+ { \tex_the:D \XeTeXinterchartoks \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
{
- \__xeCJK_inter_class_toks:nnx {#1} {#2}
- { \__xeCJK_get_inter_class_toks:nn {#3} {#4} }
+ \xeCJK_inter_class_toks:nnx {#1} {#2}
+ { \exp_not:n {#3} \xeCJK_get_inter_class_toks:nn {#1} {#2} }
}
-\cs_new_protected_nopar:Npn \__xeCJK_clear_CJK_toks:
+\cs_generate_variant:Nn \xeCJK_pre_inter_class_toks:nnn { nnx }
+\cs_new_protected_nopar:Npn \xeCJK_app_inter_class_toks:nnn #1#2#3
{
- \clist_map_inline:Nn \g__xeCJK_CJK_class_clist
- { \__xeCJK_clear_inter_class_toks:nn { Boundary } {##1} }
+ \xeCJK_inter_class_toks:nnx {#1} {#2}
+ { \xeCJK_get_inter_class_toks:nn {#1} {#2} \exp_not:n {#3} }
}
-\clist_map_inline:nn { Default, HalfLeft, HalfRight, NormalSpace }
+\cs_generate_variant:Nn \xeCJK_app_inter_class_toks:nnn { nnc , nnx }
+\cs_new_protected_nopar:Npn \xeCJK_copy_inter_class_toks:nnnn #1#2#3#4
{
- \clist_map_inline:nn { CJK, FullLeft, FullRight }
+ \xeCJK_inter_class_toks:nnx {#1} {#2}
+ { \xeCJK_get_inter_class_toks:nn {#3} {#4} }
+ }
+\cs_new_protected_nopar:Npn \xeCJK_replace_inter_class_toks:nnnn #1#2#3#4
+ {
+ \tl_set:Nx \l__xeCJK_tmpa_tl { \xeCJK_get_inter_class_toks:nn {#1} {#2} }
+ \tl_replace_all:Nnn \l__xeCJK_tmpa_tl {#3} {#4}
+ \xeCJK_inter_class_toks:nnx {#1} {#2} { \exp_not:V \l__xeCJK_tmpa_tl }
+ }
+\cs_new_protected_nopar:Npn \xeCJK_clear_Boundary_and_CJK_toks:
+ { \seq_map_function:NN \g__xeCJK_CJK_class_seq \__xeCJK_clear_Boundary_and_CJK_toks:n }
+\cs_new_protected_nopar:Npn \__xeCJK_clear_Boundary_and_CJK_toks:n #1
+ { \xeCJK_clear_inter_class_toks:nn { Boundary } {#1} }
+\cs_new_eq:NN \xeCJK_class_group_begin: \c_group_begin_token
+\cs_new_eq:NN \xeCJK_class_group_end: \c_group_end_token
+\clist_map_inline:nn { Default , HalfLeft , HalfRight , NormalSpace }
+ {
+ \clist_map_inline:nn { CJK , FullLeft , FullRight }
{
- \__xeCJK_inter_class_toks:nnn {#1} {##1}
+ \xeCJK_inter_class_toks:nnn {#1} {##1}
{
- \c_group_begin_token
+ \xeCJK_class_group_begin:
\xeCJK_select_font:
- \__xeCJK_clear_inter_class_toks:nn {#1} {##1}
- \__xeCJK_clear_CJK_toks:
+ \xeCJK_clear_inter_class_toks:nn {#1} {##1}
+ \xeCJK_clear_Boundary_and_CJK_toks:
}
- \__xeCJK_inter_class_toks:nnn {##1} {#1} { \c_group_end_token }
+ \xeCJK_inter_class_toks:nnn {##1} {#1} { \xeCJK_class_group_end: }
}
- \__xeCJK_app_inter_class_toks:nnn {#1} { CJK } { \CJKsymbol }
- \clist_map_inline:nn { FullLeft, FullRight }
- { \__xeCJK_app_inter_class_toks:nnc {#1} {##1} { xeCJK_CJK_and_##1:N } }
+ \xeCJK_app_inter_class_toks:nnn {#1} { CJK } { \CJKsymbol }
+ \clist_map_inline:nn { FullLeft , FullRight }
+ { \xeCJK_app_inter_class_toks:nnc {#1} {##1} { xeCJK_CJK_and_##1:N } }
}
-\clist_map_inline:nn { Default, HalfLeft, NormalSpace }
+\clist_map_inline:nn { Default , HalfLeft , NormalSpace }
{
- \__xeCJK_inter_class_toks:nnn { Boundary } {#1}
+ \xeCJK_inter_class_toks:nnn { Boundary } {#1}
{
\bool_if:nTF
{
\l__xeCJK_xecglue_bool &&
- \int_compare_p:nNn \etex_lastnodetype:D = \c_eleven &&
- \skip_if_eq_p:nn \tex_lastskip:D \l__xeCJK_space_glue_tl
+ \skip_if_eq_p:nn \tex_lastskip:D \c_xeCJK_space_skip_tl
}
{
\tex_unskip:D
\bool_if:nTF
- { \xeCJK_if_last_node_p:n { CJK } || \xeCJK_if_last_node_p:n { CJK_space } }
+ {
+ \xeCJK_if_last_node_p:n { CJK } ||
+ \xeCJK_if_last_node_p:n { CJK-space }
+ }
{ \CJKecglue } { \c_space_token }
}
{
\xeCJK_if_last_node:nTF { CJK } { \CJKecglue }
- { \xeCJK_if_last_node:nT { CJK_space } { \__xeCJK_space_or_xecglue: } }
+ { \xeCJK_if_last_node:nT { CJK-space } { \__xeCJK_space_or_xecglue: } }
}
}
- \str_if_eq_x:nnF {#1} { NormalSpace }
- { \__xeCJK_app_inter_class_toks:nnn { CJK } {#1} { \CJKecglue } }
+ \str_if_eq:nnF {#1} { NormalSpace }
+ { \xeCJK_app_inter_class_toks:nnn { CJK } {#1} { \CJKecglue } }
}
-\clist_map_inline:nn { Default, HalfRight, NormalSpace }
+\clist_map_inline:nn { Default , HalfRight , NormalSpace }
{
- \__xeCJK_inter_class_toks:nnn {#1} { Boundary }
+ \xeCJK_inter_class_toks:nnn {#1} { Boundary }
{
- \peek_catcode:NTF \c_space_token
- { { \xeCJK_make_node:n { default_space } } }
- { { \xeCJK_make_node:n { default } } }
+ \peek_meaning_remove:NTF \/
+ { \/ { \xeCJK_make_node:n { default } } }
+ {
+ \token_if_space:NTF \l_peek_token
+ { { \xeCJK_make_node:n { default-space } } }
+ { { \xeCJK_make_node:n { default } } }
+ }
}
- \str_if_eq_x:nnF {#1} { NormalSpace }
- { \__xeCJK_pre_inter_class_toks:nnn {#1} { CJK } { \CJKecglue } }
+ \str_if_eq:nnF {#1} { NormalSpace }
+ { \xeCJK_pre_inter_class_toks:nnn {#1} { CJK } { \CJKecglue } }
}
-\__xeCJK_inter_class_toks:nnn { Boundary } { CJK } { \xeCJK_Boundary_and_CJK: }
-\cs_new_protected_nopar:Npn \xeCJK_Boundary_and_CJK:
+\xeCJK_inter_class_toks:nnn { Boundary } { CJK }
{
- { \__xeCJK_check_for_glue: }
- \c_group_begin_token
- \__xeCJK_clear_CJK_toks:
+ { \xeCJK_check_for_glue: }
+ \xeCJK_class_group_begin:
+ \xeCJK_clear_Boundary_and_CJK_toks:
\xeCJK_select_font:
\CJKsymbol
}
-\cs_new_protected_nopar:Npn \__xeCJK_check_for_glue:
+\cs_new_protected_nopar:Npn \xeCJK_check_for_glue:
{
\bool_if:nTF
- { \xeCJK_if_last_node_p:n { CJK } || \xeCJK_if_last_node_p:n { CJK_space } }
+ { \xeCJK_if_last_node_p:n { CJK } || \xeCJK_if_last_node_p:n { CJK-space } }
{ \CJKglue }
{
\bool_if:nTF
{
\xeCJK_if_last_node_p:n { default } ||
- \int_compare_p:nNn \etex_lastnodetype:D = \c_ten ||
- \xeCJK_if_last_node_p:n { default_itcorr }
+ \int_compare_p:nNn \etex_lastnodetype:D = \c_ten
}
{ \CJKecglue }
{
\bool_if:nT
{
\l__xeCJK_xecglue_bool &&
- \int_compare_p:nNn \etex_lastnodetype:D = \c_eleven &&
- ( \skip_if_eq_p:nn \tex_lastskip:D \l__xeCJK_space_glue_tl ||
- \dim_compare_p:nNn \tex_lastskip:D = \l__xeCJK_ecglue_dim )
+ ( \skip_if_eq_p:nn \tex_lastskip:D \c_xeCJK_space_skip_tl ||
+ \skip_if_eq_p:nn \tex_lastskip:D \l__xeCJK_ecglue_skip )
}
{
\tex_unskip:D
\bool_if:nTF
{
- \xeCJK_if_last_node_p:n { default_space } ||
+ \xeCJK_if_last_node_p:n { default-space } ||
\int_compare_p:nNn \etex_lastnodetype:D = \c_ten ||
- \xeCJK_if_last_node_p:n { default } ||
- \xeCJK_if_last_node_p:n { default_itcorr }
+ \xeCJK_if_last_node_p:n { default }
}
{ \CJKecglue }
{
\bool_if:nTF
{
\xeCJK_if_last_node_p:n { CJK } ||
- \xeCJK_if_last_node_p:n { CJK_space }
+ \xeCJK_if_last_node_p:n { CJK-space }
}
- { \bool_if:NTF \l__xeCJK_space_bool \c_space_token \CJKglue }
+ { \bool_if:NTF \l__xeCJK_reserve_space_bool \c_space_token \CJKglue }
{ \c_space_token }
}
}
}
}
}
-\tl_set:Nn \l__xeCJK_space_glue_tl
+ \prg_new_conditional:Npnn \xeCJK_if_last_node:n #1 { p , T , F , TF }
+ {
+ \if_dim:w \use:c { c__xeCJK_#1_node_dim } = \tex_lastkern:D
+ \prg_return_true: \else: \prg_return_false: \fi:
+ }
+\cs_new_protected_nopar:Npn \xeCJK_def_node:nn #1#2
+ {
+ \dim_if_exist:cTF { c__xeCJK_#1_node_dim }
+ { \dim_gset:cn } { \dim_const:cn }
+ { c__xeCJK_#1_node_dim } {#2}
+ }
+\cs_new_protected_nopar:Npn \xeCJK_make_node:n #1
+ {
+ \tex_kern:D - \use:c { c__xeCJK_#1_node_dim }
+ \tex_kern:D \use:c { c__xeCJK_#1_node_dim }
+ }
+\xeCJK_def_node:nn { CJK } { 11 sp }
+\xeCJK_def_node:nn { CJK-space } { 12 sp }
+\xeCJK_def_node:nn { default } { 13 sp }
+\xeCJK_def_node:nn { default-space } { 14 sp }
+\keys_define:nn { xeCJK / options }
+ { CJKglue .code:n = { \cs_set_protected:Npn \CJKglue {#1} } }
+\keys_define:nn { xeCJK / options }
+ {
+ CJKecglue .code:n =
+ {
+ \cs_set_protected:Npn \CJKecglue {#1}
+ \xeCJK_glue_to_skip:nN \CJKecglue \l__xeCJK_ecglue_skip
+ } ,
+ xCJKecglue .choice: ,
+ xCJKecglue / true .code:n =
+ {
+ \bool_set_true:N \l__xeCJK_xecglue_bool
+ \cs_set_eq:NN \__xeCJK_space_or_xecglue: \CJKecglue
+ } ,
+ xCJKecglue / false .code:n =
+ {
+ \bool_set_false:N \l__xeCJK_xecglue_bool
+ \cs_set_eq:NN \__xeCJK_space_or_xecglue: \c_space_token
+ } ,
+ xCJKecglue / unknown .code:n =
+ {
+ \bool_set_true:N \l__xeCJK_xecglue_bool
+ \cs_set_protected:Npn \CJKecglue {#1}
+ \xeCJK_glue_to_skip:nN \CJKecglue \l__xeCJK_ecglue_skip
+ \cs_set_eq:NN \__xeCJK_space_or_xecglue: \CJKecglue
+ } ,
+ xCJKecglue .default:n = { true }
+ }
+\skip_new:N \l__xeCJK_ecglue_skip
+\bool_new:N \l__xeCJK_xecglue_bool
+\keys_define:nn { xeCJK / options }
{
- \tex_fontdimen:D \c_two \tex_font:D
- \@plus \tex_fontdimen:D \c_three \tex_font:D
- \@minus \tex_fontdimen:D \c_four \tex_font:D
+ CJKspace .bool_set:N = \l__xeCJK_reserve_space_bool ,
+ space .meta:n = { CJKspace = true } ,
+ nospace .meta:n = { CJKspace = false }
}
-\__xeCJK_inter_class_toks:nnn { CJK } { Boundary }
+\xeCJK_inter_class_toks:nnn { CJK } { Boundary }
{
- \c_group_end_token
+ \xeCJK_class_group_end:
{ \xeCJK_make_node:n { CJK } }
- \xeCJK_ignorespaces:
+ \xeCJK_ignore_spaces:w
+ }
+\cs_new_protected_nopar:Npn \xeCJK_ignore_spaces:w
+ {
+ \peek_catcode:NTF \c_space_token
+ {
+ \xeCJK_if_last_node:nT { CJK }
+ { \tex_unkern:D \tex_unkern:D { \xeCJK_make_node:n { CJK-space } } }
+ \peek_catcode_ignore_spaces:NTF \c_math_toggle_token
+ { \__xeCJK_space_or_xecglue: }
+ {
+ \bool_if:nT
+ {
+ \token_if_macro_p:N \l_peek_token ||
+ ( \l__xeCJK_reserve_space_bool &&
+ \token_if_other_p:N \l_peek_token )
+ }
+ { \__xeCJK_space_or_xecglue: }
+ }
+ }
+ {
+ \token_if_math_toggle:NTF \l_peek_token
+ { \CJKecglue }
+ { \cs_if_exist:NF \l_peek_token \exp_not:N }
+ }
}
-\__xeCJK_inter_class_toks:nnn { CJK } { CJK } { \xeCJK_CJK_and_CJK:N }
+\cs_new_eq:NN \xeCJK_ignorespaces: \xeCJK_ignore_spaces:w
+\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} }
-\clist_map_inline:nn { FullLeft, FullRight }
+\clist_map_inline:nn { FullLeft , FullRight }
{
- \__xeCJK_inter_class_toks:nnn { Boundary } {#1}
+ \xeCJK_inter_class_toks:nnn { Boundary } {#1}
{
- \c_group_begin_token
- \__xeCJK_clear_CJK_toks:
+ \xeCJK_class_group_begin:
+ \xeCJK_clear_Boundary_and_CJK_toks:
\xeCJK_select_font:
\use:c { xeCJK_CJK_and_#1:N }
}
- \__xeCJK_inter_class_toks:nnn {#1} { CJK } { \CJKsymbol }
- \__xeCJK_inter_class_toks:nnn {#1} { Boundary } { \c_group_end_token \tex_ignorespaces:D }
}
-\clist_map_inline:Nn \g__xeCJK_base_class_clist
+\xeCJK_inter_class_toks:nnn { FullLeft } { Boundary }
+ { \xeCJK_class_group_end: \tex_ignorespaces:D }
+\xeCJK_inter_class_toks:nnn { FullRight } { Boundary }
+ { \xeCJK_class_group_end: \CJKglue \tex_ignorespaces:D }
+\xeCJK_inter_class_toks:nnn { FullLeft } { CJK } { \CJKsymbol }
+\xeCJK_inter_class_toks:nnn { FullRight } { CJK } { \CJKglue \CJKsymbol }
+\seq_map_inline:Nn \g__xeCJK_base_class_seq
{
\bool_if:nF
- { \str_if_eq_x_p:nn {#1} { FullLeft } || \str_if_eq_x_p:nn {#1} { FullRight } }
+ { \str_if_eq_p:nn {#1} { FullLeft } || \str_if_eq_p:nn {#1} { FullRight } }
{
- \__xeCJK_pre_inter_class_toks:nnn { FullLeft } {#1} { \xeCJK_no_break: }
- \__xeCJK_pre_inter_class_toks:nnn { FullRight } {#1} { \xeCJK_after_FullRight: }
+ \xeCJK_pre_inter_class_toks:nnn { FullLeft } {#1} { \xeCJK_after_FullLeft: }
+ \xeCJK_pre_inter_class_toks:nnn { FullRight } {#1} { \xeCJK_after_FullRight: }
}
}
-\clist_map_inline:nn { CJK, FullLeft, FullRight }
+\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 } }
+ \clist_map_inline:nn { FullLeft , FullRight }
+ { \xeCJK_inter_class_toks:nnc {#1} {##1} { xeCJK_#1_and_##1:N } }
}
-\cs_new_protected_nopar:Npn \__xeCJK_punct_rule:n #1
+\cs_new_protected_nopar:Npn \__xeCJK_punct_rule:NN #1#2
{
\tex_vrule:D
- \@width \dim_eval:c { \l__xeCJK_punct_coor_tl/rule/#1 }
- \@depth \c_zero_dim
- \@height \c_zero_dim \scan_stop:
+ 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_glue:n #1
+\cs_new_protected_nopar:Npn \__xeCJK_punct_glue:NN #1#2
{
\skip_horizontal:n
{
- \dim_eval:c { \l__xeCJK_punct_coor_tl/glue/#1 }
- \@plus \dim_eval:n { ( \tl_use:c { \l__xeCJK_punct_coor_tl/glue/#1 } ) /4 }
- \@minus \dim_eval:n { ( \tl_use:c { \l__xeCJK_punct_coor_tl/glue/#1 } ) /2 }
+ \__xeCJK_use_punct_dim:nnn { glue } {#1} {#2}
+ minus \dim_eval:n { ( \__xeCJK_use_punct_dim:nnn { glue } {#1} {#2} ) / \c_two }
}
}
-\cs_new_protected_nopar:Npn \__xeCJK_punct_kern:n #1
- { \tex_kern:D \dim_eval:c { \l__xeCJK_punct_coor_tl/kern/#1 } }
-\cs_generate_variant:Nn \dim_eval:n { c }
-\cs_new_protected_nopar:Npn \xeCJK_before_FullLeft:N #1
+\cs_new_protected_nopar:Npn \__xeCJK_punct_kern:NN #1#2
+ { \tex_kern:D \__xeCJK_use_punct_dim:nnn { kern } {#1} {#2} }
+\tl_new:N \g__xeCJK_last_punct_tl
+\cs_new_protected_nopar:Npn \xeCJK_after_FullLeft:
{
- \tl_set:Nx \l__xeCJK_lastpunct_tl {#1}
- \__xeCJK_punct_rule:n { l/#1 }
- \CJKpunctsymbol {#1}
+ \xeCJK_no_break:
+ \__xeCJK_punct_if_middle:NT \g__xeCJK_last_punct_tl
+ {
+ \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl \g__xeCJK_last_punct_tl
+ \__xeCJK_punct_glue:NN \c__xeCJK_left_tl \g__xeCJK_last_punct_tl
+ \__xeCJK_punct_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl
+ \xeCJK_no_break:
+ }
}
\cs_new_protected_nopar:Npn \xeCJK_after_FullRight:
{
- \xeCJK_get_punct_bounds:nV { r } \l__xeCJK_lastpunct_tl
- \__xeCJK_punct_rule:n { r/\l__xeCJK_lastpunct_tl }
- \__xeCJK_punct_glue:n { r/\l__xeCJK_lastpunct_tl }
+ \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl
+ \__xeCJK_punct_rule:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl
+ \__xeCJK_punct_glue:NN \c__xeCJK_right_tl \g__xeCJK_last_punct_tl
}
\cs_new_protected_nopar:Npn \xeCJK_CJK_and_FullLeft:N #1
{
- \xeCJK_get_punct_bounds:nN { l } {#1}
+ \xeCJK_get_punct_bounds:NN \c__xeCJK_left_tl {#1}
\int_compare:nNnF \etex_lastnodetype:D = \c_one
- { \__xeCJK_punct_glue:n { l/#1 } }
- \xeCJK_before_FullLeft:N {#1}
- \__xeCJK_punct_if_middle:NT {#1}
- {
- \__xeCJK_punct_rule:n { lr/#1 }
- \__xeCJK_punct_glue:n { l/#1 }
- }
+ { \__xeCJK_CJK_FullLeft_glue: \__xeCJK_punct_glue:NN \c__xeCJK_left_tl {#1} }
+ \tl_gset:Nx \g__xeCJK_last_punct_tl {#1}
+ \__xeCJK_punct_rule:NN \c__xeCJK_left_tl {#1}
+ \CJKpunctsymbol {#1}
}
+\cs_new_protected_nopar:Npn \__xeCJK_CJK_FullLeft_glue: { \CJKglue }
\cs_new_protected_nopar:Npn \xeCJK_CJK_and_FullRight:N #1
{
- \xeCJK_get_punct_bounds:nN { r } {#1}
- \__xeCJK_punct_if_long:NTF {#1} \CJKglue
+ \xeCJK_get_punct_bounds:NN \c__xeCJK_right_tl {#1}
+ \__xeCJK_punct_if_long:NTF {#1}
+ { \CJKglue }
{
\xeCJK_no_break:
\__xeCJK_punct_if_middle:NT {#1}
{
- \__xeCJK_punct_glue:n { r/#1 }
- \__xeCJK_punct_rule:n { lr/#1 }
+ \__xeCJK_punct_glue:NN \c__xeCJK_right_tl {#1}
+ \__xeCJK_punct_rule:NN \c__xeCJK_left_tl {#1}
}
}
- \tl_gset:Nx \l__xeCJK_lastpunct_tl {#1}
+ \tl_gset:Nx \g__xeCJK_last_punct_tl {#1}
\CJKpunctsymbol {#1}
}
\cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_FullLeft:N #1
{
\xeCJK_no_break:
- \xeCJK_get_punct_bounds:nN { l } {#1}
- \xeCJK_calc_kern:VN \l__xeCJK_lastpunct_tl {#1}
- \__xeCJK_punct_kern:n { \l__xeCJK_lastpunct_tl - #1 }
- \xeCJK_before_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}
}
\cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_FullRight:N #1
{
\xeCJK_no_break:
- \xeCJK_get_punct_bounds:nN { r } {#1}
- \xeCJK_calc_kern:VN \l__xeCJK_lastpunct_tl {#1}
- \__xeCJK_punct_kern:n { \l__xeCJK_lastpunct_tl - #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:
- \tl_set:Nx \l__xeCJK_lastpunct_tl {#1}
\CJKpunctsymbol {#1}
}
\cs_new_protected_nopar:Npn \xeCJK_FullRight_and_FullLeft:N #1
{
- \__xeCJK_punct_rule:n { r/\l__xeCJK_lastpunct_tl }
- \xeCJK_get_punct_bounds:nN { l } {#1}
- \xeCJK_calc_kern:VN \l__xeCJK_lastpunct_tl {#1}
- \__xeCJK_punct_kern:n { \l__xeCJK_lastpunct_tl - #1 }
- \__xeCJK_punct_nobreak:
- \xeCJK_before_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}
+ \__xeCJK_punct_break:
+ \CJKpunctsymbol {#1}
+ }
\cs_new_protected_nopar:Npn \xeCJK_FullRight_and_FullRight:N #1
{
- \__xeCJK_punct_rule:n { r/\l__xeCJK_lastpunct_tl }
- \xeCJK_get_punct_bounds:nN { r } {#1}
- \xeCJK_calc_kern:VN \l__xeCJK_lastpunct_tl {#1}
- \__xeCJK_punct_kern:n { \l__xeCJK_lastpunct_tl - #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:
- \tl_set:Nx \l__xeCJK_lastpunct_tl {#1}
\CJKpunctsymbol {#1}
}
- \prg_new_conditional:Npnn \xeCJK_if_last_node:n #1 { p , T , F , TF }
- {
- \if_dim:w \dim_use:c { c__xeCJK_#1_node_dim } = \tex_lastkern:D
- \prg_return_true: \else: \prg_return_false: \fi:
- }
-\cs_new_protected_nopar:Npn \xeCJK_def_node:nn #1#2
- {
- \dim_if_exist:cTF { c__xeCJK_#1_node_dim }
- { \dim_gset:cn } { \dim_const:cn }
- { c__xeCJK_#1_node_dim } {#2}
- }
-\cs_new_protected_nopar:Npn \xeCJK_make_node:n #1
- {
- \tex_kern:D - \dim_use:c { c__xeCJK_#1_node_dim }
- \tex_kern:D \dim_use:c { c__xeCJK_#1_node_dim }
- }
-\xeCJK_def_node:nn { CJK } { 11 sp }
-\xeCJK_def_node:nn { CJK_space } { 12 sp }
-\xeCJK_def_node:nn { default } { 13 sp }
-\xeCJK_def_node:nn { default_space } { 14 sp }
-\xeCJK_def_node:nn { default_itcorr } { 15 sp }
-\keys_define:nn { xeCJK / options }
- { CJKglue .code:n = { \cs_set_protected:Npn \CJKglue {#1} } }
\keys_define:nn { xeCJK / options }
{
- CJKecglue .code:n =
- {
- \cs_set_protected:Npn \CJKecglue {#1}
- \settowidth \l__xeCJK_ecglue_dim \CJKecglue
- },
- xCJKecglue .choice:,
- xCJKecglue / true .code:n =
- {
- \bool_set_true:N \l__xeCJK_xecglue_bool
- \cs_set_eq:NN \__xeCJK_space_or_xecglue: \CJKecglue
- },
- xCJKecglue / false .code:n =
- {
- \bool_set_false:N \l__xeCJK_xecglue_bool
- \cs_set_eq:NN \__xeCJK_space_or_xecglue: \c_space_token
- },
- xCJKecglue / unknown .code:n =
- {
- \bool_set_true:N \l__xeCJK_xecglue_bool
- \cs_set_protected:Npn \CJKecglue {#1}
- \settowidth \l__xeCJK_ecglue_dim \CJKecglue
- \cs_set_eq:NN \__xeCJK_space_or_xecglue: \CJKecglue
- },
- xCJKecglue .default:n = { true } ,
- }
-\dim_new:N \l__xeCJK_ecglue_dim
-\bool_new:N \l__xeCJK_xecglue_bool
-\keys_define:nn { xeCJK / options }
- {
- CJKspace .choice:,
- CJKspace / true .code:n = { \CJKspace },
- CJKspace / false .code:n = { \CJKnospace },
- CJKspace .default:n = { true },
- space .meta:n = { CJKspace = true },
- nospace .meta:n = { CJKspace = false },
- }
-\NewDocumentCommand \CJKspace { }
- {
- \bool_set_true:N \l__xeCJK_space_bool
- \cs_set_eq:NN \xeCJK_ignorespaces: \__xeCJK_peek_math:
- }
-\NewDocumentCommand \CJKnospace { }
- {
- \bool_set_false:N \l__xeCJK_space_bool
- \cs_set_eq:NN \xeCJK_ignorespaces: \__xeCJK_ignore_spaces:
- }
-\cs_new_protected_nopar:Npn \__xeCJK_ignore_spaces:
- {
- \peek_catcode:NTF \c_space_token
- {
- \xeCJK_if_last_node:nT { CJK }
- { \tex_unkern:D \tex_unkern:D { \xeCJK_make_node:n { CJK_space } } }
- \xeCJK_peek_catcode_ignore_spaces:NTF \c_math_toggle_token
- { \__xeCJK_space_or_xecglue: }
- {
- \bool_if:nT
- {
- \xeCJK_if_outer_macro_p:c { l_peek_token } ||
- \token_if_cs_p:c { l_peek_token }
- }
- { \__xeCJK_space_or_xecglue: }
- }
- }
- {
- \xeCJK_if_outer_macro:cF { l_peek_token }
- {
- \token_if_math_toggle:cTF { l_peek_token } \CJKecglue
- { \cs_if_exist:cF { l_peek_token } \exp_not:N }
- }
- }
- }
-\cs_new_protected_nopar:Npn \__xeCJK_peek_math:
- {
- \peek_catcode:NTF \c_space_token
- {
- \xeCJK_if_last_node:nT { CJK }
- { \tex_unkern:D \tex_unkern:D { \xeCJK_make_node:n { CJK_space } } }
- \xeCJK_peek_catcode_ignore_spaces:NF \c_space_token
- { \__xeCJK_space_or_xecglue: }
- }
- {
- \xeCJK_if_outer_macro:cF { l_peek_token }
- {
- \token_if_math_toggle:cTF { l_peek_token } \CJKecglue
- { \cs_if_exist:cF { l_peek_token } \exp_not:N }
- }
- }
- }
-\keys_define:nn { xeCJK / options }
- {
- CheckSingle .choice:,
- CheckSingle / true .code:n = { \xeCJKenablechecksingle },
- CheckSingle / false .code:n = { \xeCJKdisablechecksingle },
- CheckSingle .default:n = { true },
- CJKchecksingle .meta:n = { CheckSingle = true } ,
+ CheckSingle .choice: ,
+ CheckSingle / true .code:n = { \xeCJKenablechecksingle } ,
+ CheckSingle / false .code:n = { \xeCJKdisablechecksingle } ,
+ CheckSingle .default:n = { true } ,
+ CJKchecksingle .meta:n = { CheckSingle = true }
}
-\bool_new:N \l__xeCJK_checksingle_bool
+\bool_new:N \l__xeCJK_check_single_bool
\NewDocumentCommand \xeCJKenablechecksingle { }
{
- \bool_if:NF \l__xeCJK_checksingle_bool
+ \bool_if:NF \l__xeCJK_check_single_bool
{
- \bool_set_true:N \l__xeCJK_checksingle_bool
- \cs_set_eq:NN \__xeCJK_checksingle_save_CJKsymbol:N \xeCJK_CJK_and_CJK:N
- \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \xeCJK_checksingle:N
+ \bool_set_true:N \l__xeCJK_check_single_bool
+ \cs_set_eq:NN \__xeCJK_check_single_save:N \xeCJK_CJK_and_CJK:N
+ \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \xeCJK_check_single:Nw
}
}
\NewDocumentCommand \xeCJKdisablechecksingle { }
{
- \bool_if:NT \l__xeCJK_checksingle_bool
+ \bool_if:NT \l__xeCJK_check_single_bool
{
- \bool_set_false:N \l__xeCJK_checksingle_bool
- \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \__xeCJK_checksingle_save_CJKsymbol:N
+ \bool_set_false:N \l__xeCJK_check_single_bool
+ \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \__xeCJK_check_single_save:N
}
}
-\cs_new_protected_nopar:Npn \xeCJK_checksingle:N #1
+\cs_new_protected_nopar:Npn \xeCJK_check_single:Nw #1
{
\peek_catcode:NTF \c_catcode_other_token
- { \xeCJK_checksingle:NN {#1} }
+ { \xeCJK_check_single:NNw {#1} }
{
\bool_if:nTF
{
- ! ( \xeCJK_if_outer_macro_p:c { l_peek_token } ) &&
- \xeCJK_if_blank_x_p:n { \token_get_arg_spec:c { l_peek_token } } &&
- \exp_args:NNc \exp_args:No \tl_if_single_token_p:n { l_peek_token } &&
- \exp_args:NNc \exp_after:wN \token_if_other_p:N { l_peek_token }
+ \xeCJK_if_blank_x_p:n { \token_get_arg_spec:N \l_peek_token } &&
+ \exp_args:No \tl_if_single_token_p:n \l_peek_token &&
+ \exp_after:wN \token_if_other_p:N \l_peek_token
}
- { \xeCJK_checksingle:NN {#1} }
- { \__xeCJK_checksingle_save_CJKsymbol:N {#1} }
+ { \xeCJK_check_single:NNw {#1} }
+ { \__xeCJK_check_single_save:N {#1} }
}
}
-\cs_new_protected_nopar:Npn \xeCJK_checksingle:NN #1#2
+\cs_new_protected_nopar:Npn \xeCJK_check_single:NNw #1#2
{
\peek_catcode:NTF \c_catcode_other_token
- { \__xeCJK_checksingle_save_CJKsymbol:N {#1} #2 }
+ { \__xeCJK_check_single_save:N {#1} #2 }
{
\bool_if:nTF
{
- ! ( \xeCJK_if_outer_macro_p:c { l_peek_token } ) &&
- ( \token_if_space_p:c { l_peek_token } ||
- \token_if_math_toggle_p:c { l_peek_token } ||
- \token_if_cs_p:c { l_peek_token } )
+ \token_if_space_p:N \l_peek_token ||
+ \token_if_math_toggle_p:N \l_peek_token ||
+ \token_if_cs_p:N \l_peek_token
}
{
- \bool_if:nTF { \token_if_space_p:c { l_peek_token } }
+ \bool_if:nTF { \token_if_space_p:N \l_peek_token }
{
- \xeCJK_peek_catcode_ignore_spaces:NTF \c_catcode_other_token
- { \__xeCJK_checksingle_save_CJKsymbol:N {#1} #2 \c_space_token }
+ \peek_catcode_ignore_spaces:NTF \c_catcode_other_token
+ { \__xeCJK_check_single_save:N {#1} #2 \c_space_token }
{
\bool_if:nTF
{
- ! ( \xeCJK_if_outer_macro_p:c { l_peek_token } ) &&
- ( \token_if_math_toggle_p:c { l_peek_token } ||
- \token_if_cs_p:c { l_peek_token } )
+ \token_if_math_toggle_p:N \l_peek_token ||
+ \token_if_cs_p:N \l_peek_token
}
- { \xeCJK_checksingle:NNN {#1} {#2} \c_space_token }
- { \__xeCJK_checksingle_save_CJKsymbol:N {#1} #2 \c_space_token }
+ { \xeCJK_check_single:NNNw {#1} {#2} \c_space_token }
+ { \__xeCJK_check_single_save:N {#1} #2 \c_space_token }
}
}
- { \xeCJK_checksingle:NNN {#1} {#2} { } }
+ { \xeCJK_check_single:NNNw {#1} {#2} { } }
}
- { \__xeCJK_checksingle_save_CJKsymbol:N {#1} #2 }
+ { \__xeCJK_check_single_save:N {#1} #2 }
}
}
-\cs_new_protected_nopar:Npn \xeCJK_checksingle:NNN #1#2#3
+\cs_new_protected_nopar:Npn \xeCJK_check_single:NNNw #1#2#3
{
\bool_if:nTF
{
@@ -806,30 +808,30 @@
\token_if_eq_meaning_p:NN \l_peek_token \[ % \]
}
{ \CJKsymbol {#1} \xeCJK_no_break: #2 }
- { \xeCJK_checksingle_env:NNN {#1} {#2} {#3} }
+ { \xeCJK_check_single_env:NNNw {#1} {#2} {#3} }
}
-\cs_new_protected_nopar:Npn \xeCJK_checksingle_env:NNN #1#2#3
+\cs_new_protected_nopar:Npn \xeCJK_check_single_env:NNNw #1#2#3
{
\peek_catcode_remove:NTF \c_math_toggle_token
{
\peek_catcode:NTF \c_math_toggle_token
{ \CJKsymbol {#1} \xeCJK_no_break: #2 \c_math_toggle_token }
- { \__xeCJK_checksingle_save_CJKsymbol:N {#1} #2#3 \c_math_toggle_token }
+ { \__xeCJK_check_single_save:N {#1} #2#3 \c_math_toggle_token }
}
{
\peek_meaning_remove:NTF \begin
- { \xeCJK_checksingle_env:NNNNn {#1} {#2} {#3} \begin }
+ { \xeCJK_check_single_env:NNNNn {#1} {#2} {#3} \begin }
{
\peek_meaning_remove:NTF \end
- { \xeCJK_checksingle_env:NNNNn {#1} {#2} {#3} \end }
- { \__xeCJK_checksingle_save_CJKsymbol:N {#1} #2#3 }
+ { \xeCJK_check_single_env:NNNNn {#1} {#2} {#3} \end }
+ { \__xeCJK_check_single_save:N {#1} #2#3 }
}
}
}
-\cs_new_protected_nopar:Npn \xeCJK_checksingle_env:NNNNn #1#2#3#4#5
+\cs_new_protected_nopar:Npn \xeCJK_check_single_env:NNNNn #1#2#3#4#5
{
\clist_if_in:NnTF \g__xeCJK_inline_env_clist {#5}
- { \__xeCJK_checksingle_save_CJKsymbol:N {#1} #2#3 }
+ { \__xeCJK_check_single_save:N {#1} #2#3 }
{ \CJKsymbol {#1} \xeCJK_no_break: #2 }
\scan_stop: #4 {#5}
}
@@ -840,33 +842,19 @@
{
\clist_gput_right:Nx \g__xeCJK_inline_env_clist {#1}
\clist_gremove_duplicates:N \g__xeCJK_inline_env_clist
- },
+ } ,
InlineEnv- .code:n =
{
\clist_map_inline:xn {#1}
{ \clist_gremove_all:Nn \g__xeCJK_inline_env_clist {##1} }
- },
- }
-\cs_generate_variant:Nn \token_if_cs_p:N { c }
-\cs_generate_variant:Nn \token_if_space_p:N { c }
-\cs_generate_variant:Nn \token_get_arg_spec:N { c }
-\cs_generate_variant:Nn \token_if_math_toggle_p:N { c }
-\cs_generate_variant:Nn \token_if_math_toggle:NTF { c }
-\tl_new:N \__xeCJK_UL_subclass_patch_tl
-\clist_new:N \g__xeCJK_CJK_subclass_clist
-\cs_new_protected_nopar:Npn \__xeCJK_erase_CJKsymbol:
- {
- \cs_gset_eq:NN \CJKsymbol_Block \CJKsymbol
- \cs_gset_eq:NN \CJKsymbol \prg_do_nothing:
- }
-\cs_new_protected_nopar:Npn \__xeCJK_restore_CJKsymbol:
- {
- \cs_gset_eq:NN \CJKsymbol \CJKsymbol_Block
- \CJKsymbol
+ }
}
-\NewDocumentCommand \xeCJKDeclareSubCJKBlock { s m m }
+\cs_generate_variant:Nn \clist_map_inline:nn { x }
+\seq_new:N \g__xeCJK_CJK_sub_class_seq
+\NewDocumentCommand \xeCJKDeclareSubCJKBlock
+ { s > { \TrimSpaces } m > { \TrimSpaces } m }
{
- \xeCJKDeclareSubCharClass { CJK } {#2} {#3}
+ \xeCJK_declare_sub_char_class:nxx { CJK } {#2} {#3}
\IfBooleanT {#1} { \xeCJKResetPunctClass }
}
\@onlypreamble \xeCJKDeclareSubCJKBlock
@@ -876,7 +864,7 @@
\bool_if:NF \l__xeCJK_sub_cancel_bool
{
\bool_set_true:N \l__xeCJK_sub_cancel_bool
- \__xeCJK_sub_restore_or_cancel:n {#2}
+ \__xeCJK_sub_restore_or_cancel:x {#2}
\IfBooleanT {#1} { \xeCJKResetPunctClass }
}
}
@@ -885,482 +873,620 @@
\bool_if:NT \l__xeCJK_sub_cancel_bool
{
\bool_set_false:N \l__xeCJK_sub_cancel_bool
- \__xeCJK_sub_restore_or_cancel:n {#2}
+ \__xeCJK_sub_restore_or_cancel:x {#2}
\IfBooleanT {#1} { \xeCJKResetPunctClass }
}
}
\cs_new_protected_nopar:Npn \__xeCJK_sub_restore_or_cancel:n #1
{
- \clist_map_inline:xn {#1}
+ \clist_map_inline:nn {#1}
{
\int_if_exist:cTF { c__xeCJK_ CJK/##1 _class_int }
{
- \__xeCJK_declare_char_class:nn
+ \xeCJK_declare_char_class:nx
{ CJK \bool_if:NF \l__xeCJK_sub_cancel_bool { /##1 } }
{ \tl_use:c { g__xeCJK_CJK/##1_range_clist } }
}
{ \__xeCJK_error:nx { SubBlock-undefined } {##1} }
}
}
+\cs_generate_variant:Nn \__xeCJK_sub_restore_or_cancel:n { x }
\__xeCJK_msg_new:nn { SubBlock-undefined }
{
The~CJK~sub~block~'#1'~is~undefined.\\\\
Try~to~use~\token_to_str:N \xeCJKDeclareSubCJKBlock \
to~declare~it.
}
-\NewDocumentCommand \xeCJKDeclareSubCharClass
- { > { \TrimSpaces } m > { \TrimSpaces } m m }
+\cs_new_protected_nopar:Npn \xeCJK_declare_sub_char_class:nnn #1#2#3
{
\int_if_exist:cF { c__xeCJK_ #1/#2 _class_int }
{
- \__xeCJK_new_class:n { #1/#2 }
+ \xeCJK_new_class:n { #1/#2 }
\__xeCJK_set_sub_class_toks:nn {#1} {#2}
\__xeCJK_new_sub_key:n {#2}
- \__xeCJK_UL_subclass_patch:nn {#1} {#2}
}
- \__xeCJK_declare_char_class:nn { #1/#2 } {#3}
+ \xeCJK_declare_char_class:nn { #1/#2 } {#3}
}
-\@onlypreamble \xeCJKDeclareSubCharClass
+\cs_generate_variant:Nn \xeCJK_declare_sub_char_class:nnn { nxx }
\cs_new_protected_nopar:Npn \__xeCJK_set_sub_class_toks:nn #1#2
{
- \clist_map_inline:Nn \g__xeCJK_base_class_clist
+ \seq_map_inline:Nn \g__xeCJK_base_class_seq
{
- \__xeCJK_copy_inter_class_toks:nnnn { #1/#2 } {##1} {#1} {##1}
- \__xeCJK_copy_inter_class_toks:nnnn {##1} { #1/#2 } {##1} {#1}
- \str_if_eq_x:nnTF {##1} { CJK }
+ \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } {##1} {#1} {##1}
+ \xeCJK_copy_inter_class_toks:nnnn {##1} { #1/#2 } {##1} {#1}
+ \str_if_eq:nnTF {##1} { CJK }
{
- \__xeCJK_pre_inter_class_toks:nnn {##1} { #1/#2 }
+ \xeCJK_pre_inter_class_toks:nnn {##1} { #1/#2 }
{ \__xeCJK_switch_font:nn {#1} {#2} }
}
{
- \__xeCJK_pre_inter_class_toks:nnn {##1} { #1/#2 }
- { \__xeCJK_erase_CJKsymbol: }
- \__xeCJK_app_inter_class_toks:nnn {##1} { #1/#2 }
- { \__xeCJK_switch_font:nn {#1} {#2} \__xeCJK_restore_CJKsymbol: }
+ \xeCJK_replace_inter_class_toks:nnnn {##1} { #1/#2 }
+ { \CJKsymbol }
+ { \__xeCJK_switch_font:nn {#1} {#2} \CJKsymbol }
}
}
- \__xeCJK_copy_inter_class_toks:nnnn { #1/#2 } { #1/#2 } {#1} {#1}
- \clist_if_empty:NF \g__xeCJK_CJK_subclass_clist
+ \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } { #1/#2 } {#1} {#1}
+ \seq_map_inline:Nn \g__xeCJK_CJK_sub_class_seq
{
- \clist_map_inline:Nn \g__xeCJK_CJK_subclass_clist
- {
- \__xeCJK_copy_inter_class_toks:nnnn { #1/#2 } { #1/##1 } {#1} {#1}
- \__xeCJK_copy_inter_class_toks:nnnn { #1/##1 } { #1/#2 } {#1} {#1}
- \__xeCJK_pre_inter_class_toks:nnn { #1/#2 } { #1/##1 }
- { \__xeCJK_switch_font:nn {#2} {##1} }
- \__xeCJK_pre_inter_class_toks:nnn { #1/##1 } { #1/#2 }
- { \__xeCJK_switch_font:nn {##1} {#2} }
- }
+ \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } { #1/##1 } {#1} {#1}
+ \xeCJK_copy_inter_class_toks:nnnn { #1/##1 } { #1/#2 } {#1} {#1}
+ \xeCJK_pre_inter_class_toks:nnn { #1/#2 } { #1/##1 }
+ { \__xeCJK_switch_font:nn {#2} {##1} }
+ \xeCJK_pre_inter_class_toks:nnn { #1/##1 } { #1/#2 }
+ { \__xeCJK_switch_font:nn {##1} {#2} }
}
- \clist_gput_right:Nn \g__xeCJK_CJK_subclass_clist {#2}
+ \seq_gput_right:Nn \g__xeCJK_CJK_sub_class_seq {#2}
\__xeCJK_save_CJK_class:n { #1/#2 }
- \clist_map_inline:nn { CJK, FullLeft, FullRight }
+ \clist_map_inline:nn { CJK , FullLeft , FullRight }
{
- \__xeCJK_pre_inter_class_toks:nnn { #1/#2 } {##1}
+ \xeCJK_pre_inter_class_toks:nnn { #1/#2 } {##1}
{ \__xeCJK_switch_font:nn {#2} {#1} }
}
}
-\cs_new_protected_nopar:Npn \__xeCJK_UL_subclass_patch:nn #1#2
+\__xeCJK_msg_new:nn { XeTeX-too-old }
{
- \tl_put_right:Nn \__xeCJK_UL_subclass_patch_tl
- {
- \clist_map_inline:nn { Default, HalfLeft, HalfRight }
- {
- \str_if_eq_x:nnTF {##1} { HalfLeft }
- { \__xeCJK_inter_class_toks:nnn {#1} { #1/#2 } { \CJKecglue \CJKsymbol } }
- { \__xeCJK_inter_class_toks:nnn {#1} { #1/#2 } { \CJKsymbol } }
- \__xeCJK_inter_class_toks:nnn { Boundary } { #1/#2 }
- {
- \__xeCJK_erase_CJKsymbol:
- \xeCJK_Boundary_and_CJK:
- \__xeCJK_switch_font:nn {#1} {#2}
- \__xeCJK_restore_CJKsymbol:
- }
- }
- }
- }
-\clist_new:N \g__xeCJK_punctstyle_clist
-\clist_set:Nn \g__xeCJK_punctstyle_clist
- { CCT , halfwidth , fullwidth , marginkerning , mixedwidth , plain }
-\clist_map_inline:Nn \g__xeCJK_punctstyle_clist
- { \tl_const:cn { c__xeCJK_ps_#1_tl } {#1} }
-\cs_generate_variant:Nn \keys_define:nn { nx }
-\keys_define:nn { xeCJK / options }
- {
- PunctStyle .choice_code:n =
- {
- \tl_set:Nx \l_xeCJK_punctstyle_tl { \l_keys_choice_tl }
- \tl_if_eq:NNT \l_xeCJK_punctstyle_tl \c__xeCJK_ps_plain_tl
- { \xeCJKallowbreakbetweenpuncts }
- },
- }
-\keys_define:nx { xeCJK / options }
- { PunctStyle .generate_choices:n = { \exp_not:V \g__xeCJK_punctstyle_clist } }
-\keys_define:nn { xeCJK / options }
- {
- PunctStyle / banjiao .meta:n = { PunctStyle = halfwidth },
- PunctStyle / quanjiao .meta:n = { PunctStyle = fullwidth },
- PunctStyle / kaiming .meta:n = { PunctStyle = mixedwidth },
- PunctStyle / hangmobanjiao .meta:n = { PunctStyle = marginkerning },
- PunctStyle / unknown .code:n =
- { \__xeCJK_error:nx { PunctStyle-undefined } \l_keys_value_tl },
+ \token_to_str:N \XeTeXglyphbounds \ is~not~defined.\\
+ CJK~punctuation~kerning~will~not~be~available.\\\\
+ You~have~to~update~XeTeX~to~the~version~0.9995.0~or~later.
}
-\__xeCJK_msg_new:nn { PunctStyle-undefined }
+\cs_if_exist:NF \XeTeXglyphbounds
{
- Punctstyle~"#1"~is~not~available. \\\\
- You~can~only~use~one~of\\\\
- "\g__xeCJK_punctstyle_clist".\\
+ \__xeCJK_error:n { XeTeX-too-old }
+ \__xeCJK_after_end_preamble:n { \xeCJKsetup { PunctStyle = plain } }
}
+\NewDocumentCommand \xeCJKsetwidth { m m }
+ { \tl_map_inline:xn {#1} { \tl_gset:cn { g__xeCJK_punct_width/##1/tl } {#2} } }
+\NewDocumentCommand \xeCJKsetkern { m m m }
+ { \tl_gset:cn { g__xeCJK_punct/kern/#1/#2/tl } {#3} }
+\tl_const:Nn \c__xeCJK_left_tl { left }
+\tl_const:Nn \c__xeCJK_right_tl { right }
\keys_define:nn { xeCJK / options }
{
- AllowBreakBetweenPuncts .choice:,
- AllowBreakBetweenPuncts / true .code:n = { \xeCJKallowbreakbetweenpuncts },
- AllowBreakBetweenPuncts / false .code:n = { \xeCJKnobreakbetweenpuncts },
- AllowBreakBetweenPuncts .default:n = { true },
- KaiMingPunct .code:n = { \__xeCJK_set_special_punct:nn { mixedwidth } {#1} },
- KaiMingPunct+ .code:n = { \__xeCJK_add_special_punct:nn { mixedwidth } {#1} },
- KaiMingPunct- .code:n = { \__xeCJK_sub_special_punct:nn { mixedwidth } {#1} },
- LongPunct .code:n = { \__xeCJK_set_special_punct:nn { long } {#1} },
- LongPunct+ .code:n = { \__xeCJK_add_special_punct:nn { long } {#1} },
- LongPunct- .code:n = { \__xeCJK_sub_special_punct:nn { long } {#1} },
- MiddlePunct+ .code:n = { \__xeCJK_add_special_punct:nn { middle } {#1} },
- MiddlePunct .code:n = { \__xeCJK_set_special_punct:nn { middle } {#1} },
- MiddlePunct- .code:n = { \__xeCJK_sub_special_punct:nn { middle } {#1} },
- PunctWidth .tl_gset:N = \g__xeCJK_punct_width_tl ,
- }
-\NewDocumentCommand \xeCJKallowbreakbetweenpuncts { }
- { \cs_set_eq:NN \__xeCJK_punct_nobreak: \__xeCJK_zero_glue: }
-\NewDocumentCommand \xeCJKnobreakbetweenpuncts { }
- { \cs_set_eq:NN \__xeCJK_punct_nobreak: \xeCJK_no_break: }
-\cs_new_protected_nopar:Npn \__xeCJK_zero_glue: { \skip_horizontal:N \c_zero_skip }
-\clist_set:Nn \g__xeCJK_special_ps_clist { mixedwidth , long , middle }
-\clist_map_inline:Nn \g__xeCJK_special_ps_clist
- {
- \tl_new:c { l__xeCJK_#1_punct_tl }
- \prop_new:c { l__xeCJK_#1_punct_prop }
- }
+ AllowBreakBetweenPuncts .choice: ,
+ AllowBreakBetweenPuncts / true .code:n =
+ { \cs_set_eq:NN \__xeCJK_punct_break: \xeCJK_allow_break: } ,
+ AllowBreakBetweenPuncts / false .code:n =
+ { \cs_set_eq:NN \__xeCJK_punct_break: \xeCJK_no_break: } ,
+ AllowBreakBetweenPuncts .default:n = { true } ,
+ KaiMingPunct .code:n = { \__xeCJK_set_special_punct:nn { mixed_width } {#1} } ,
+ KaiMingPunct+ .code:n = { \__xeCJK_add_special_punct:nn { mixed_width } {#1} } ,
+ KaiMingPunct- .code:n = { \__xeCJK_sub_special_punct:nn { mixed_width } {#1} } ,
+ LongPunct .code:n = { \__xeCJK_set_special_punct:nn { long } {#1} } ,
+ LongPunct+ .code:n = { \__xeCJK_add_special_punct:nn { long } {#1} } ,
+ LongPunct- .code:n = { \__xeCJK_sub_special_punct:nn { long } {#1} } ,
+ MiddlePunct .code:n = { \__xeCJK_set_special_punct:nn { middle } {#1} } ,
+ MiddlePunct+ .code:n = { \__xeCJK_add_special_punct:nn { middle } {#1} } ,
+ MiddlePunct- .code:n = { \__xeCJK_sub_special_punct:nn { middle } {#1} } ,
+ PunctWidth .tl_gset:N = \g__xeCJK_punct_width_tl
+ }
+\clist_new:N \g__xeCJK_special_punct_clist
+\clist_gset:Nn \g__xeCJK_special_punct_clist { mixed_width , long , middle }
+\cs_new_nopar:Npn \__xeCJK_special_punct_seq:n #1 { g__xeCJK_special_punct_#1_seq }
+\cs_new_nopar:Npn \__xeCJK_special_punct_tl:nN #1#2 { g__xeCJK_special_punct_#1_#2_tl }
+\clist_map_inline:Nn \g__xeCJK_special_punct_clist
+ { \seq_new:c { \__xeCJK_special_punct_seq:n {#1} } }
\cs_new_protected_nopar:Npn \__xeCJK_set_special_punct:nn #1#2
{
- \tl_set:cx { l__xeCJK_#1_punct_tl } {#2}
- \prop_clear:c { l__xeCJK_#1_punct_prop }
- \tl_map_inline:cn { l__xeCJK_#1_punct_tl }
- { \prop_put:cnn { l__xeCJK_#1_punct_prop } {##1} { } }
+ \seq_map_inline:cn { \__xeCJK_special_punct_seq:n {#1} }
+ { \cs_undefine:c { \__xeCJK_special_punct_tl:nN {#1} {##1} } }
+ \seq_gclear:c { \__xeCJK_special_punct_seq:n {#1} }
+ \tl_map_inline:xn {#2}
+ {
+ \tl_new:c { \__xeCJK_special_punct_tl:nN {#1} {##1} }
+ \seq_gput_right:cn { \__xeCJK_special_punct_seq:n {#1} } {##1}
+ }
}
\cs_new_protected_nopar:Npn \__xeCJK_add_special_punct:nn #1#2
{
- \tl_put_right:cx { l__xeCJK_#1_punct_tl } {#2}
- \tl_map_inline:cn { l__xeCJK_#1_punct_tl }
- { \prop_put:cnn { l__xeCJK_#1_punct_prop } {##1} { } }
+ \tl_map_inline:xn {#2}
+ {
+ \seq_if_in:cnF { \__xeCJK_special_punct_seq:n {#1} } {##1}
+ {
+ \tl_new:c { \__xeCJK_special_punct_tl:nN {#1} {##1} }
+ \seq_gput_right:cn { \__xeCJK_special_punct_seq:n {#1} } {##1}
+ }
+ }
}
\cs_new_protected_nopar:Npn \__xeCJK_sub_special_punct:nn #1#2
{
\tl_map_inline:xn {#2}
{
- \tl_remove_all:cn { l__xeCJK_#1_punct_tl } {##1}
- \prop_remove:cn { l__xeCJK_#1_punct_prop } {##1}
+ \cs_undefine:c { \__xeCJK_special_punct_tl:nN {#1} {##1} }
+ \seq_gremove_all:cn { \__xeCJK_special_punct_seq:n {#1} } {##1}
}
}
-\cs_generate_variant:Nn \tl_map_inline:nn { x }
-\cs_generate_variant:Nn \dim_set:Nn { Nc }
-\cs_generate_variant:Nn \dim_add:Nn { Nc }
-\cs_generate_variant:Nn \dim_min:nn { cc }
-\cs_new_protected_nopar:Npn \xeCJK_dim_set_max:Nn #1#2
- { \dim_set:Nn #1 { \dim_max:nn {#1} {#2} } }
-\cs_new_protected_nopar:Npn \xeCJK_dim_set_min:Nn #1#2
- { \dim_set:Nn #1 { \dim_min:nn {#1} {#2} } }
-\tl_set:Nn \l__xeCJK_punct_coor_tl { \l_xeCJK_font_coor_tl/\l_xeCJK_punctstyle_tl }
-\cs_new_protected_nopar:Npn \xeCJK_get_punct_bounds:nN #1#2
- {
- \tl_if_exist:cF { \l__xeCJK_punct_coor_tl/rule/#1/#2 }
- {
- \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c__xeCJK_ps_plain_tl
+\prg_new_conditional:Npnn \__xeCJK_punct_if_right:N #1 { p , T , F , TF }
+ {
+ \if_int_compare:w \xeCJK_value_class:n {`#1} = \xeCJK_class_num:n { FullRight }
+ \prg_return_true: \else: \prg_return_false: \fi:
+ }
+\cs_generate_variant:Nn \prg_new_conditional:Npnn { c }
+\clist_map_inline:Nn \g__xeCJK_special_punct_clist
+ {
+ \prg_new_conditional:cpnn { __xeCJK_punct_if_#1:N } ##1 { p , T , F , TF }
+ {
+ \if_cs_exist:w \__xeCJK_special_punct_tl:nN {#1} {##1} \cs_end:
+ \prg_return_true: \else: \prg_return_false: \fi:
+ }
+ }
+\cs_new_nopar:Npn \__xeCJK_punct_dim_csname:nn #1#2
+ { g__\l_xeCJK_current_font_tl/\l_xeCJK_punct_style_tl/#1/#2/tl }
+\cs_new_nopar:Npn \__xeCJK_punct_dim_csname:nnn
+ { \__xeCJK_punct_dim_csname:nnnn { \l_xeCJK_punct_style_tl } }
+\cs_new_nopar:Npn \__xeCJK_punct_dim_csname:nnnn #1#2#3#4
+ { g__\l_xeCJK_current_font_tl/#1/#2/#3/#4/tl }
+\cs_new_nopar:Npn \__xeCJK_use_punct_dim:nn #1#2
+ { \tl_use:c { \__xeCJK_punct_dim_csname:nn {#1} {#2} } }
+\cs_new_nopar:Npn \__xeCJK_use_punct_dim:nnn #1#2#3
+ { \tl_use:c { \__xeCJK_punct_dim_csname:nnn {#1} {#2} {#3} } }
+\cs_new_protected_nopar:Npn \__xeCJK_gset_punct_dim:nnx #1#2#3
+ { \tl_gset:cx { \__xeCJK_punct_dim_csname:nn {#1} {#2} } {#3} }
+\cs_new_protected_nopar:Npn \__xeCJK_gset_punct_dim:nnnx #1#2#3#4
+ { \tl_gset:cx { \__xeCJK_punct_dim_csname:nnn {#1} {#2} {#3} } {#4} }
+\cs_new_protected_nopar:Npn \__xeCJK_gset_punct_dim:nnnnx #1#2#3#4#5
+ { \tl_gset:cx { \__xeCJK_punct_dim_csname:nnnn {#1} {#2} {#3} {#4} } {#5} }
+\DeclareObjectType { xeCJK / punctuation } { 3 }
+\DeclareTemplateInterface { xeCJK / punctuation } { basic } { 3 }
+ {
+ enabled-global-setting : boolean = true ,
+ fixed-punct-width : length = \c_max_dim ,
+ fixed-punct-ratio : real = \c_one_fp ,
+ mixed-punct-width : length = \KeyValue { fixed-punct-width } ,
+ mixed-punct-ratio : real = \KeyValue { fixed-punct-ratio } ,
+ middle-punct-width : length = \KeyValue { fixed-punct-width } ,
+ middle-punct-ratio : real = \KeyValue { fixed-punct-ratio } ,
+ fixed-margin-width : length = \c_max_dim ,
+ fixed-margin-ratio : real = \c_one_fp ,
+ mixed-margin-width : length = \KeyValue { fixed-margin-width } ,
+ mixed-margin-ratio : real = \KeyValue { fixed-margin-ratio } ,
+ middle-margin-width : length = \KeyValue { fixed-margin-width } ,
+ middle-margin-ratio : real = \KeyValue { fixed-margin-ratio } ,
+ add-min-bound-to-margin : boolean = false ,
+ optimize-margin : boolean = false ,
+ margin-minimum : length = \c_zero_dim ,
+ enabled-kerning : boolean = true ,
+ min-bound-to-kerning : boolean = false ,
+ kerning-total-width : length = \c_max_dim ,
+ kerning-total-ratio : real = 0.75 ,
+ optimize-kerning : boolean = false ,
+ same-align-margin : length = \c_max_dim ,
+ same-align-ratio : real = \c_zero_fp ,
+ different-align-margin : length = \c_max_dim ,
+ different-align-ratio : real = \c_zero_fp ,
+ kerning-margin-width : length = \c_max_dim ,
+ kerning-margin-ratio : real = \c_one_fp ,
+ kerning-margin-minimum : length = \c_zero_dim
+ }
+\DeclareTemplateCode { xeCJK / punctuation } { basic } { 3 }
+ {
+ enabled-global-setting = \l__xeCJK_enabled_global_setting_bool ,
+ fixed-punct-width = \l__xeCJK_fixed_punct_width_dim ,
+ fixed-punct-ratio = \l__xeCJK_fixed_punct_ratio_fp ,
+ mixed-punct-width = \l__xeCJK_mixed_punct_width_dim ,
+ mixed-punct-ratio = \l__xeCJK_mixed_punct_ratio_fp ,
+ middle-punct-width = \l__xeCJK_middle_punct_width_dim ,
+ middle-punct-ratio = \l__xeCJK_middle_punct_ratio_fp ,
+ fixed-margin-width = \l__xeCJK_fixed_margin_width_dim ,
+ fixed-margin-ratio = \l__xeCJK_fixed_margin_ratio_fp ,
+ mixed-margin-width = \l__xeCJK_mixed_margin_width_dim ,
+ mixed-margin-ratio = \l__xeCJK_mixed_margin_ratio_fp ,
+ middle-margin-width = \l__xeCJK_middle_margin_width_dim ,
+ middle-margin-ratio = \l__xeCJK_middle_margin_ratio_fp ,
+ add-min-bound-to-margin = \l__xeCJK_add_min_bound_to_margin_bool ,
+ optimize-margin = \l__xeCJK_optimize_margin_bool ,
+ margin-minimum = \l__xeCJK_margin_minimum_dim ,
+ enabled-kerning = \l__xeCJK_enabled_kerning_bool ,
+ min-bound-to-kerning = \l__xeCJK_min_bound_to_kerning_bool ,
+ kerning-total-width = \l__xeCJK_kerning_total_width_dim ,
+ kerning-total-ratio = \l__xeCJK_kerning_total_ratio_fp ,
+ optimize-kerning = \l__xeCJK_optimize_kerning_bool ,
+ same-align-margin = \l__xeCJK_same_align_margin_dim ,
+ same-align-ratio = \l__xeCJK_same_align_ratio_fp ,
+ different-align-margin = \l__xeCJK_different_align_margin_dim ,
+ different-align-ratio = \l__xeCJK_different_align_ratio_fp ,
+ kerning-margin-width = \l__xeCJK_kerning_margin_width_dim ,
+ kerning-margin-ratio = \l__xeCJK_kerning_margin_ratio_fp ,
+ kerning-margin-minimum = \l__xeCJK_kerning_margin_minimum_dim
+ }
+ {
+ \AssignTemplateKeys
+ \tl_if_blank:nTF {#3}
+ { \xeCJK_punct_margin_process:NN {#1} {#2} }
+ { \xeCJK_punct_kerning_process:NN {#2} {#3} }
+ }
+\cs_new_protected_nopar:Npn \xeCJK_punct_margin_process:NN #1#2
+ {
+ \tl_set:Nx \l__xeCJK_tmpa_tl { \__xeCJK_use_punct_dim:nnn { bound } {#1} {#2} }
+ \tl_set:Nx \l__xeCJK_tmpb_tl
+ {
+ \__xeCJK_use_punct_dim:nnn { bound }
+ { \xeCJK_reverse:nnn {#1} \c__xeCJK_left_tl \c__xeCJK_right_tl } {#2}
+ }
+ \dim_set:Nn \l__xeCJK_tmp_dim
+ {
+ \bool_if:NTF \l__xeCJK_enabled_global_setting_bool
{
- \tl_set:NV \l__xeCJK_tmpa_tl \c_zero_dim
- \tl_gset_eq:cN { \l__xeCJK_punct_coor_tl/glue/#1/#2 } \l__xeCJK_tmpa_tl
- \tl_gset_eq:cN { \l__xeCJK_punct_coor_tl/rule/#1/#2 } \l__xeCJK_tmpa_tl
- \tl_gset_eq:cN { \l__xeCJK_punct_coor_tl/rule/lr/#2 } \l__xeCJK_tmpa_tl
- \tl_gset_eq:cN { \l__xeCJK_punct_coor_tl/bound/#1/#2 } \l__xeCJK_tmpa_tl
- \tl_gset_eq:cN { \l__xeCJK_punct_coor_tl/bound/lr/#2 } \l__xeCJK_tmpa_tl
+ \cs_if_exist_use:cTF { g__xeCJK_punct_width/#2/tl }
+ { \use_none:n }
+ {
+ \xeCJK_if_blank_x:nTF \g__xeCJK_punct_width_tl
+ { \use:n }
+ { \g__xeCJK_punct_width_tl \use_none:n }
+ }
}
+ { \use:n }
{
- \tl_if_exist:cF { \l__xeCJK_punct_coor_tl/bound/#1/#2 }
- { { \xeCJK_select_font: \xeCJK_calc_punct_dimen:N {#2} } }
- \__xeCJK_punct_if_long:NTF {#2}
+ \__xeCJK_punct_if_middle:NTF {#2}
+ { \__xeCJK_punct_width_or_ratio:nN { middle } {#2} }
{
- \dim_zero:N \l__xeCJK_tmpa_dim
- \dim_zero:N \l__xeCJK_tmpb_dim
- \dim_zero:N \l__xeCJK_tmpc_dim
+ \__xeCJK_punct_if_mixed_width:NTF {#2}
+ { \__xeCJK_punct_width_or_ratio:nN { mixed } {#2} }
+ { \__xeCJK_punct_width_or_ratio:nN { fixed } {#2} }
}
+ }
+ }
+ \__xeCJK_gset_punct_dim:nnnx { glue } {#1} {#2}
+ {
+ \dim_max:nn
+ { \l__xeCJK_margin_minimum_dim }
+ {
+ \dim_compare:nNnTF \l__xeCJK_tmp_dim < \c_max_dim
{
- \dim_set:Nc \l__xeCJK_tmpa_dim { \l__xeCJK_punct_coor_tl/bound/#1/#2 }
- \dim_set:Nc \l__xeCJK_tmpb_dim
- { \l__xeCJK_punct_coor_tl/bound/\str_if_eq_x:nnTF {#1} lrl/#2 }
- \dim_set:Nn \l__xeCJK_tmpc_dim
+ \__xeCJK_punct_if_middle:NTF {#2}
{
- \cs_if_exist_use:cF { g__xeCJK_punct_width/#2 }
- {
- \xeCJK_if_blank_x:nTF \g__xeCJK_punct_width_tl
- { \c_zero_dim } { \g__xeCJK_punct_width_tl }
- }
+ (
+ \l__xeCJK_tmp_dim - ( \__xeCJK_use_punct_dim:nn { dimen } {#2} )
+ ) / \c_two
}
- \__xeCJK_punct_if_middle:NTF {#2}
{
- \dim_set:Nn \l__xeCJK_tmpc_dim
+ \bool_if:NTF \l__xeCJK_optimize_margin_bool
+ { \dim_max:nn { \dim_min:nn \l__xeCJK_tmpa_tl \l__xeCJK_tmpb_tl } }
+ { \use:n }
{
- \dim_compare:nNnTF \l__xeCJK_tmpc_dim > \c_zero_dim
- { \l__xeCJK_tmpc_dim }
- {
- \tl_case:Nnn \l_xeCJK_punctstyle_tl
- {
- \c__xeCJK_ps_halfwidth_tl { .5 em }
- \c__xeCJK_ps_mixedwidth_tl { .5 em }
- \c__xeCJK_ps_CCT_tl { .7 em }
- \c__xeCJK_ps_fullwidth_tl { 1 em }
- }
- { 1 em }
- }
- - ( \tl_use:c { \l__xeCJK_punct_coor_tl/dimen/#2 } )
- }
- \dim_compare:nNnTF \l__xeCJK_tmpc_dim > \c_zero_dim
- { \dim_set:Nn \l__xeCJK_tmpc_dim { .5 \l__xeCJK_tmpc_dim } }
- {
- \dim_set:Nn \l__xeCJK_tmpc_dim
- { \dim_min:nn \l__xeCJK_tmpa_dim \l__xeCJK_tmpb_dim }
+ \l__xeCJK_tmp_dim - ( \l__xeCJK_tmpb_tl )
+ - ( \__xeCJK_use_punct_dim:nn { dimen } {#2} )
}
}
+ }
+ {
+ \bool_if:NTF \l__xeCJK_optimize_margin_bool
+ { \dim_min:nn { \l__xeCJK_tmpa_tl } }
+ { \use:n }
{
- \dim_compare:nNnTF \l__xeCJK_tmpc_dim > \c_zero_dim
+ \__xeCJK_punct_if_middle:NTF {#2}
{
- \dim_set:Nn \l__xeCJK_tmpc_dim
+ \dim_compare:nNnTF \l__xeCJK_middle_margin_width_dim < \c_max_dim
+ { \l__xeCJK_middle_margin_width_dim }
{
- \l__xeCJK_tmpc_dim - \l__xeCJK_tmpb_dim
- - ( \tl_use:c { \l__xeCJK_punct_coor_tl/dimen/#2 } )
+ \fp_use:N \l__xeCJK_middle_margin_ratio_fp
+ \etex_dimexpr:D
+ ( \l__xeCJK_tmpa_tl + \l__xeCJK_tmpb_tl ) / \c_two
+ \scan_stop:
}
}
{
- \dim_set:Nn \l__xeCJK_tmpc_dim
- { \dim_min:nn \l__xeCJK_tmpa_dim \l__xeCJK_tmpb_dim }
- \tl_case:Nnn \l_xeCJK_punctstyle_tl
- {
- \c__xeCJK_ps_halfwidth_tl { \prg_do_nothing: }
- \c__xeCJK_ps_mixedwidth_tl
- {
- \__xeCJK_punct_if_mixedwidth:NT {#2}
- {
- \dim_add:Nn \l__xeCJK_tmpc_dim { .5 \l__xeCJK_tmpa_dim }
- \xeCJK_dim_set_min:Nn \l__xeCJK_tmpc_dim \l__xeCJK_tmpa_dim
- }
- }
- \c__xeCJK_ps_CCT_tl
- {
- \__xeCJK_punct_if_mixedwidth:NTF {#2}
- { \dim_add:Nn \l__xeCJK_tmpc_dim { .5 \l__xeCJK_tmpa_dim } }
- { \dim_add:Nn \l__xeCJK_tmpc_dim { .3 \l__xeCJK_tmpa_dim } }
- \xeCJK_dim_set_min:Nn \l__xeCJK_tmpc_dim \l__xeCJK_tmpa_dim
- }
- }
- { \dim_set_eq:NN \l__xeCJK_tmpc_dim \l__xeCJK_tmpa_dim }
+ \__xeCJK_punct_if_mixed_width:NTF {#2}
+ { \__xeCJK_margin_width_or_ratio:n { mixed } }
+ { \__xeCJK_margin_width_or_ratio:n { fixed } }
}
}
- \xeCJK_dim_set_max:Nn \l__xeCJK_tmpc_dim \c_zero_dim
}
- \tl_gset:cx { \l__xeCJK_punct_coor_tl/rule/#1/#2 }
- { - \dim_use:N \l__xeCJK_tmpa_dim }
- \tl_gset:cx { \l__xeCJK_punct_coor_tl/rule/lr/#2 }
- { - \dim_use:N \l__xeCJK_tmpb_dim }
- \tl_gset:cV { \l__xeCJK_punct_coor_tl/glue/#1/#2 } \l__xeCJK_tmpc_dim
}
}
}
-\cs_generate_variant:Nn \xeCJK_get_punct_bounds:nN { nV }
-\NewDocumentCommand \xeCJKsetwidth { m m }
- { \tl_map_inline:xn {#1} { \tl_gset:cn { g__xeCJK_punct_width/##1 } {#2} } }
-\prg_new_conditional:Npnn \__xeCJK_punct_if_right:N #1 { p , T , F , TF }
- {
- \tl_if_exist:cTF { \l__xeCJK_punct_coor_tl/glue/r/#1 }
- \prg_return_true: \prg_return_false:
- }
-\prg_new_conditional:Npnn \__xeCJK_punct_if_both_left_right:NN #1#2 { p , T , F , TF }
+\cs_new_nopar:Npn \__xeCJK_punct_width_or_ratio:nN #1#2
{
- \bool_if:nTF
+ \dim_compare:nNnTF { \use:c { l__xeCJK_#1_punct_width_dim } } < \c_max_dim
+ { \use:c { l__xeCJK_#1_punct_width_dim } }
{
- ( \tl_if_exist_p:c { \l__xeCJK_punct_coor_tl/glue/r/#1 } &&
- \tl_if_exist_p:c { \l__xeCJK_punct_coor_tl/glue/r/#2 } ) ||
- ( \tl_if_exist_p:c { \l__xeCJK_punct_coor_tl/glue/l/#1 } &&
- \tl_if_exist_p:c { \l__xeCJK_punct_coor_tl/glue/l/#2 } )
+ \fp_compare:nNnTF { \use:c { l__xeCJK_#1_punct_ratio_fp } } = \c_zero_fp
+ { \c_max_dim }
+ {
+ \fp_use:c { l__xeCJK_#1_punct_ratio_fp }
+ \etex_dimexpr:D \__xeCJK_use_punct_dim:nn { width } {#2} \scan_stop:
+ }
}
- \prg_return_true: \prg_return_false:
}
-\cs_generate_variant:Nn \prg_new_conditional:Npnn { c }
-\clist_map_inline:Nn \g__xeCJK_special_ps_clist
+\cs_new_nopar:Npn \__xeCJK_margin_width_or_ratio:n #1
{
- \prg_new_conditional:cpnn { __xeCJK_punct_if_#1:N } ##1 { p , T , F , TF }
+ \dim_compare:nNnTF { \use:c { l__xeCJK_#1_margin_width_dim } } < \c_max_dim
+ { \use:c { l__xeCJK_#1_margin_width_dim } }
{
- \prop_if_in:cnTF { l__xeCJK_#1_punct_prop } {##1}
- \prg_return_true: \prg_return_false:
+ \fp_use:c { l__xeCJK_#1_margin_ratio_fp }
+ \etex_dimexpr:D \l__xeCJK_tmpa_tl \scan_stop:
}
+ \bool_if:NT \l__xeCJK_add_min_bound_to_margin_bool
+ { + \dim_min:nn \l__xeCJK_tmpa_tl \l__xeCJK_tmpb_tl }
}
-\cs_new_protected_nopar:Npn \xeCJK_calc_kern:NN #1#2
+\cs_new_protected_nopar:Npn \xeCJK_punct_kerning_process:NN #1#2
{
- \tl_if_exist:cF { \l__xeCJK_punct_coor_tl/kern/#1-#2 }
+ \__xeCJK_gset_punct_dim:nnnx { kern } {#1} {#2}
{
- \dim_zero:N \l__xeCJK_tmpa_dim
- \tl_if_eq:NNF \l_xeCJK_punctstyle_tl \c__xeCJK_ps_plain_tl
+ \dim_eval:n
{
- \tl_if_exist:cTF { g__xeCJK_punct/kern/#1-#2 }
- { \dim_set:Nc \l__xeCJK_tmpa_dim { g__xeCJK_punct/kern/#1-#2 } }
- { \__xeCJK_calc_kern:NNN \l__xeCJK_tmpa_dim {#1} {#2} }
+ \bool_if:nTF
+ {
+ \l__xeCJK_enabled_global_setting_bool &&
+ \tl_if_exist_p:c { g__xeCJK_punct/kern/#1/#2/tl }
+ }
+ { \tl_use:c { g__xeCJK_punct/kern/#1/#2/tl } }
+ {
+ \bool_if:NTF \l__xeCJK_enabled_kerning_bool
+ { \__xeCJK_calc_kerning_margin:NN {#1} {#2} }
+ { \__xeCJK_original_kerning_margin:NN {#1} {#2} }
+ }
+ - ( \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_right_tl {#1} )
+ - ( \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_left_tl {#2} )
}
- \tl_gset:cV { \l__xeCJK_punct_coor_tl/kern/#1-#2 } \l__xeCJK_tmpa_dim
}
}
-\cs_new_protected_nopar:Npn \__xeCJK_calc_kern:NNN #1#2#3
+\cs_new_nopar:Npn \__xeCJK_original_kerning_margin:NN #1#2
{
- \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c__xeCJK_ps_marginkerning_tl
+ \dim_eval:n
{
- \dim_zero:N #1
- \__xeCJK_punct_if_right:NT {#2}
- { \dim_add:Nc #1 { \l__xeCJK_punct_coor_tl/bound/r/#2 } }
- \__xeCJK_punct_if_right:NF {#3}
- { \dim_add:Nc #1 { \l__xeCJK_punct_coor_tl/bound/l/#3 } }
+ \__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
+ {
+ \dim_max:nn
+ { \l__xeCJK_kerning_margin_minimum_dim }
{
- \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c__xeCJK_ps_fullwidth_tl
- { \dim_set:Nn #1 { \xeCJK_calc_kern:nNN { 1.5 em } {#2} {#3} } }
+ \bool_if:NTF \l__xeCJK_min_bound_to_kerning_bool
+ { \__xeCJK_punct_min_bound:NN {#1} {#2} }
{
- \__xeCJK_punct_if_both_left_right:NNTF {#2} {#3}
- {
- \__xeCJK_punct_if_mixedwidth:NT {#2}
- {
- \dim_set:Nn #1 { \xeCJK_calc_kern:nNN { 1 em } {#2} {#3} }
- \dim_compare:nNnT #1 < { .1 em }
- { \dim_set:Nc #1 { \l__xeCJK_punct_coor_tl/bound/l/#2 } }
- }
- }
+ \bool_if:NTF \l__xeCJK_optimize_kerning_bool
+ { \dim_max:nn { \__xeCJK_punct_min_bound:NN {#1} {#2} } }
+ { \use:n }
{
- \bool_if:nTF
- {
- \__xeCJK_punct_if_mixedwidth_p:N {#2} &&
- ! ( \tl_if_eq_p:NN \l_xeCJK_punctstyle_tl \c__xeCJK_ps_halfwidth_tl )
- }
- {
- \dim_set:Nn #1 { \tl_use:c { \l__xeCJK_punct_coor_tl/glue/r/#2 } }
- \dim_set:Nn #1 { .7 #1 }
- }
+ \dim_compare:nNnTF \l__xeCJK_kerning_total_width_dim < \c_max_dim
+ { \__xeCJK_calc_kerning_margin:nNN \l__xeCJK_kerning_total_width_dim }
{
- \dim_set:Nn #1 { \xeCJK_calc_kern:nNN { 1 em } {#2} {#3} }
- \dim_compare:nNnT #1 < { .1 em }
+ \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 } }
+ }
{
- \dim_set:Nn #1
+ \__xeCJK_calc_kerning_margin:nNN
{
- \dim_max:nn
- {
- \dim_min:cc
- { \l__xeCJK_punct_coor_tl/bound/l/#2 }
- { \l__xeCJK_punct_coor_tl/bound/r/#2 }
- }
- {
- \dim_min:cc
- { \l__xeCJK_punct_coor_tl/bound/l/#3 }
- { \l__xeCJK_punct_coor_tl/bound/r/#3 }
- }
+ \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}
}
}
- \bool_if:nT
- { \__xeCJK_punct_if_long_p:N {#2} || \__xeCJK_punct_if_long_p:N {#3} }
- { \xeCJK_dim_set_max:Nn #1 { .1 em } }
}
- \xeCJK_dim_set_max:Nn #1 \c_zero_dim
}
-\cs_generate_variant:Nn \xeCJK_calc_kern:NN { V }
-\cs_new_protected_nopar:Npn \xeCJK_calc_kern:nNN #1#2#3
+\cs_new_nopar:Npn \__xeCJK_kerning_width_or_ratio:nNN #1#2#3
+ {
+ \dim_compare:nNnTF { \use:c { l__xeCJK_#1_align_margin_dim } } < \c_max_dim
+ { \use:c { l__xeCJK_#1_align_margin_dim } \use_none:nn }
+ {
+ \fp_compare:nNnTF { \use:c { l__xeCJK_#1_align_ratio_fp } } = \c_zero_fp
+ { \use:n }
+ { \fp_use:c { l__xeCJK_#1_align_ratio_fp } \use_ii:nn }
+ }
+ {
+ \dim_compare:nNnTF \l__xeCJK_kerning_margin_width_dim < \c_max_dim
+ { \l__xeCJK_kerning_margin_width_dim \use_none:n }
+ { \fp_use:N \l__xeCJK_kerning_margin_ratio_fp \use:n }
+ }
+ { \etex_dimexpr:D \__xeCJK_original_kerning_margin:NN {#2} {#3} \scan_stop: }
+ }
+\cs_new_nopar:Npn \__xeCJK_punct_min_bound:NN #1#2
+ {
+ \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} }
+ }
+ {
+ \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} }
+ }
+ }
+\cs_new_nopar:Npn \__xeCJK_calc_kerning_margin:nNN #1#2#3
{
\dim_eval:n
{
- #1
- - \tl_use:c { \l__xeCJK_punct_coor_tl/
- \__xeCJK_punct_if_right:NTF {#2} { bound } { glue } /l/#2 }
- - \tl_use:c { \l__xeCJK_punct_coor_tl/
- \__xeCJK_punct_if_right:NTF {#3} { glue } { bound } /r/#3 }
- - \tl_use:c { \l__xeCJK_punct_coor_tl/dimen/#2 }
- - \tl_use:c { \l__xeCJK_punct_coor_tl/dimen/#3 }
- \__xeCJK_punct_if_both_left_right:NNT {#2} {#3}
- { + \tl_use:c { \l__xeCJK_punct_coor_tl/rule/lr/#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
+\cs_new_protected_nopar:Npn \xeCJK_get_punct_bounds:NN #1#2
{
- \tl_gset:cx { \l__xeCJK_punct_coor_tl/bound/l/#1 }
- { \xeCJK_glyph_bounds:nN { left } {#1} }
- \tl_gset:cx { \l__xeCJK_punct_coor_tl/bound/r/#1 }
- { \xeCJK_glyph_bounds:nN { right } {#1} }
- \tl_gset:cx { \l__xeCJK_punct_coor_tl/bound/lr/#1 }
+ \tl_if_exist:cF { \__xeCJK_punct_dim_csname:nnn { glue } {#1} {#2} }
{
- \dim_eval:n
+ \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c__xeCJK_punct_style_plain_tl
{
- ( \tl_use:c { \l__xeCJK_punct_coor_tl/bound/l/#1 } ) +
- ( \tl_use:c { \l__xeCJK_punct_coor_tl/bound/r/#1 } )
+ \__xeCJK_gset_punct_dim:nnnx { glue } {#1} {#2} { \c_zero_dim }
+ \__xeCJK_gset_punct_dim:nnnx { bound } \c__xeCJK_left_tl {#2} { \c_zero_dim }
+ \__xeCJK_gset_punct_dim:nnnx { bound } \c__xeCJK_right_tl {#2} { \c_zero_dim }
}
- }
- \tl_gset:cx { \l__xeCJK_punct_coor_tl/dimen/#1 }
- {
- \dim_eval:n
{
- ( \etex_fontcharwd:D \tex_font:D `#1 ) -
- ( \tl_use:c { \l__xeCJK_punct_coor_tl/bound/lr/#1 } )
+ { \xeCJK_select_font: \xeCJK_calc_punct_dimen:f {#2} }
+ \__xeCJK_punct_if_long:NTF {#2}
+ { \__xeCJK_gset_punct_dim:nnnx { glue } {#1} {#2} { \c_zero_dim } }
+ {
+ \UseInstance { xeCJK / punctuation }
+ { \l_xeCJK_punct_style_tl } {#1} {#2} { }
+ }
}
}
- \bool_if:nT
+ }
+\cs_new_protected_nopar:Npn \xeCJK_calc_punct_dimen:N #1
+ {
+ \__xeCJK_gset_punct_dim:nnnx { bound } \c__xeCJK_left_tl {#1}
+ { \xeCJK_glyph_bounds:NN \c_one {#1} }
+ \__xeCJK_gset_punct_dim:nnnx { bound } \c__xeCJK_right_tl {#1}
+ { \xeCJK_glyph_bounds:NN \c_three {#1} }
+ \dim_set:Nn \l__xeCJK_tmp_dim
{
- \__xeCJK_punct_if_long_p:N {#1} &&
- ! ( \str_if_eq_x_p:nn {#1} { ^^^^2025 } || \str_if_eq_x_p:nn {#1} { ^^^^2026 } )
+ ( \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_left_tl {#1} ) +
+ ( \__xeCJK_use_punct_dim:nnn { bound } \c__xeCJK_right_tl {#1} )
}
+ \__xeCJK_gset_punct_dim:nnx { width } {#1}
+ { \dim_use:N \etex_fontcharwd:D \tex_font:D `#1 }
+ \__xeCJK_gset_punct_dim:nnx { dimen } {#1}
+ { \dim_eval:n { \__xeCJK_use_punct_dim:nn { width } {#1} - \l__xeCJK_tmp_dim } }
+ \__xeCJK_punct_if_long:NT {#1}
{
- \clist_map_inline:Nn \g__xeCJK_punctstyle_clist
+ \seq_map_inline:Nn \g__xeCJK_punct_style_seq
{
- \str_if_eq_x:nnF \c__xeCJK_ps_plain_tl {##1}
+ \__xeCJK_gset_punct_dim:nnnnx {##1} { kern } {#1} {#1}
{
- \tl_gset:cx { \l_xeCJK_font_coor_tl/##1/kern/#1-#1 }
- { - \tl_use:c { \l__xeCJK_punct_coor_tl/bound/lr/#1 } }
+ \bool_if:nTF
+ {
+ \str_if_eq_p:nn {#1} { ^^^^2025 } ||
+ \str_if_eq_p:nn {#1} { ^^^^2026 }
+ }
+ { \c_zero_dim }
+ { - \dim_use:N \l__xeCJK_tmp_dim }
}
}
}
}
-\cs_new_protected_nopar:Npn \xeCJK_glyph_bounds:nN #1#2
+\cs_generate_variant:Nn \xeCJK_calc_punct_dimen:N { f }
+\cs_new_nopar:Npn \xeCJK_glyph_bounds:NN #1#2
+ { \dim_use:N \XeTeXglyphbounds #1 ~ \XeTeXcharglyph `#2 \exp_stop_f: }
+\cs_new_protected_nopar:Npn \xeCJK_get_punct_kerning:NN #1#2
{
- \dim_eval:n
+ \tl_if_exist:cF { \__xeCJK_punct_dim_csname:nnn { kern } {#1} {#2} }
+ {
+ \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c__xeCJK_punct_style_plain_tl
+ { \__xeCJK_gset_punct_dim:nnnx { kern } {#1} {#2} { \c_zero_dim } }
+ {
+ \UseInstance { xeCJK / punctuation }
+ { \l_xeCJK_punct_style_tl } { } {#1} {#2}
+ }
+ }
+ }
+\cs_generate_variant:Nn \xeCJK_get_punct_kerning:NN { o }
+\keys_define:nn { xeCJK / options }
+ {
+ PunctStyle .choice: ,
+ PunctStyle .default:n = { quanjiao } ,
+ PunctStyle / halfwidth .meta:n = { PunctStyle = banjiao } ,
+ PunctStyle / fullwidth .meta:n = { PunctStyle = quanjiao } ,
+ PunctStyle / mixedwidth .meta:n = { PunctStyle = kaiming } ,
+ PunctStyle / marginkerning .meta:n = { PunctStyle = hangmobanjiao } ,
+ PunctStyle / plain .code:n =
+ { \tl_set_eq:NN \l_xeCJK_punct_style_tl \c__xeCJK_punct_style_plain_tl } ,
+ PunctStyle / unknown .code:n =
{
- \XeTeXglyphbounds
- \str_case_x:nnn {#1}
- {
- { left } { \c_one } { top } { \c_two }
- { right } { \c_three } { bottom } { \c_four }
- }
- { \c_three }
- \int_eval:n { \XeTeXcharglyph `#2 }
+ \IfInstanceExistTF { xeCJK / punctuation } { \l_keys_value_tl }
+ { \tl_set:Nx \l_xeCJK_punct_style_tl { \l_keys_value_tl } }
+ { \__xeCJK_error:nx { punct-style-unknown } { \l_keys_value_tl } }
}
}
-\NewDocumentCommand \xeCJKsetkern { m m m }
- { \tl_gset:cn { g__xeCJK_punct/kern/#1-#2 } {#3} }
+\tl_const:Nn \c__xeCJK_punct_style_plain_tl { plain }
+\__xeCJK_msg_new:nn { punct-style-unknown }
+ {
+ Punctuation~style~"#1"~is~unknown. \\\\
+ The~available~styles~are~listed~as~follow.\\\\
+ "plain,~\seq_use:Nnnn \g__xeCJK_punct_style_seq { ~and~ } { ,~ } { ,~and~ }".\\
+ }
+\NewDocumentCommand \xeCJKDeclarePunctStyle { > { \TrimSpaces } m m }
+ {
+ \IfInstanceExistTF { xeCJK / punctuation } {#1}
+ { \__xeCJK_warning:nx { punct-style-already-defined } {#1} }
+ { \seq_gput_right:Nn \g__xeCJK_punct_style_seq {#1} }
+ \DeclareInstance { xeCJK / punctuation } {#1} { basic } {#2}
+ }
+\seq_new:N \g__xeCJK_punct_style_seq
+\__xeCJK_msg_new:nn { punct-style-already-defined }
+ {
+ Punctuation~style~"#1"~is~already~defined!. \\\\
+ The~existing~style~of~"#1"~will~be~overwritten.\\
+ }
+\@onlypreamble \xeCJKDeclarePunctStyle
+\NewDocumentCommand \xeCJKEditPunctStyle { > { \TrimSpaces } m m }
+ {
+ \IfInstanceExistTF { xeCJK / punctuation } {#1}
+ { \EditInstance { xeCJK / punctuation } {#1} {#2} }
+ { \__xeCJK_error:nx { punct-style-unknown } {#1} }
+ }
+\@onlypreamble \xeCJKEditPunctStyle
+\xeCJKDeclarePunctStyle { quanjiao } { }
+\xeCJKDeclarePunctStyle { hangmobanjiao } { enabled-kerning = false }
+\xeCJKDeclarePunctStyle { banjiao }
+ {
+ fixed-punct-ratio = 0.5 ,
+ optimize-margin = true ,
+ kerning-total-ratio = 0.5 ,
+ optimize-kerning = true
+ }
+\xeCJKDeclarePunctStyle { kaiming }
+ {
+ fixed-punct-ratio = 0.5 ,
+ mixed-punct-ratio = 0.8 ,
+ optimize-margin = true ,
+ kerning-total-ratio = 0.5 ,
+ optimize-kerning = true
+ }
+\xeCJKDeclarePunctStyle { CCT }
+ {
+ fixed-punct-ratio = 0.7 ,
+ optimize-margin = true ,
+ kerning-total-ratio = 0.6 ,
+ optimize-kerning = true
+ }
\keys_define:nn { xeCJK / options }
{
- AutoFallBack .choice:,
- AutoFallBack / true .code:n = { \xeCJKenablefallback },
- AutoFallBack / false .code:n = { \xeCJKdisablefallback },
- AutoFallBack .default:n = { true },
- fallback .meta:n = { AutoFallBack = true },
+ AutoFallBack .choice: ,
+ AutoFallBack / true .code:n = { \xeCJKenablefallback } ,
+ AutoFallBack / false .code:n = { \xeCJKdisablefallback } ,
+ AutoFallBack .default:n = { true } ,
+ fallback .meta:n = { AutoFallBack = true }
}
-\bool_new:N \l__xeCJK_fallback_bool
\NewDocumentCommand \xeCJKenablefallback { }
{
\bool_if:NF \l__xeCJK_fallback_bool
{
\bool_set_true:N \l__xeCJK_fallback_bool
\cs_set_eq:NN \__xeCJK_fallback_save_CJKsymbol:N \CJKsymbol
- \cs_set_eq:NN \CJKsymbol \xeCJK_fallback_testsymbol:N
+ \cs_set_eq:NN \CJKsymbol \xeCJK_fallback_test_glyph:N
}
}
\NewDocumentCommand \xeCJKdisablefallback { }
@@ -1371,105 +1497,107 @@
\cs_set_eq:NN \CJKsymbol \__xeCJK_fallback_save_CJKsymbol:N
}
}
-\cs_new_protected_nopar:Npn \xeCJK_fallback_testsymbol:N #1
+\bool_new:N \l__xeCJK_fallback_bool
+\cs_new_protected_nopar:Npn \xeCJK_fallback_test_glyph:N #1
{
- \font_glyph_if_exist:NnTF \tex_font:D {`#1}
+ \xeCJK_glyph_if_exist:NTF {#1}
{ \__xeCJK_fallback_save_CJKsymbol:N {#1} }
+ { { \xeCJK_fallback_loop:Nn {#1} { \l_xeCJK_family_tl/FallBack } } }
+ }
+\cs_new_protected_nopar:Npn \xeCJK_fallback_loop:Nn #1#2
+ {
+ \xeCJK_family_if_exist:xTF {#2}
{
- \xeCJK_family_if_exist:xTF { \l_xeCJK_family_tl/FallBack }
- { {
- \tl_put_right:Nn \l_xeCJK_family_tl { /FallBack }
- \xeCJK_select_font:
- \xeCJK_fallback_testsymbol:N {#1}
- } }
- {
- \__xeCJK_warning:nx { fallback } {#1}
- \__xeCJK_fallback_save_CJKsymbol:N {#1}
- }
+ \xeCJK_select_font:x {#2}
+ \xeCJK_glyph_if_exist:NTF {#1}
+ { \__xeCJK_fallback_save_CJKsymbol:N {#1} }
+ { \xeCJK_fallback_loop:Nn {#1} { #2/FallBack } }
+ }
+ {
+ \__xeCJK_warning:nxx { fallback } {#1} {#2}
+ \__xeCJK_fallback_save_CJKsymbol:N {#1}
}
}
\__xeCJK_msg_new:nn { fallback }
{
- CJKfamily~'\l_xeCJK_family_tl'~
- ( \prop_get:NV \g__xeCJK_family_prop \l_xeCJK_family_tl )~
+ CJKfamily~'#2'~
+ ( \prop_get:No \g__xeCJK_family_font_name_prop {#2} )~
does~not~contain~glyph~'#1'~(U+\int_to_hexadecimal:n {`#1}).\\
}
+\cs_generate_variant:Nn \prop_get:Nn { No }
\NewDocumentCommand \setCJKfallbackfamilyfont { m O{} m }
{
- \exp_args:Nx \tl_if_in:nnTF {#3} { , }
- { \xeCJK_set_family_fallback:xnn {#1} {#2} {#3} }
- { \xeCJK_set_family:xnn { #1/FallBack } {#2} {#3} }
+ \clist_set:Nx \l__xeCJK_tmpa_clist {#3}
+ \int_compare:nNnTF { \clist_count:N \l__xeCJK_tmpa_clist } > \c_one
+ { \xeCJK_set_family_fallback:xxN {#1} {#2} \l__xeCJK_tmpa_clist }
+ { \xeCJK_set_family:xxx { #1/FallBack } {#2} {#3} }
}
-\cs_new_protected_nopar:Npn \xeCJK_set_family_fallback:xnn #1#2#3
+\cs_new_protected_nopar:Npn \xeCJK_set_family_fallback:nnN #1#2#3
{
\group_begin:
- \tl_set:Nx \l__xeCJK_family_fb_tl {#1}
- \prop_get:NVNF \g__xeCJK_family_prop \l__xeCJK_family_fb_tl \l__xeCJK_fontname_tl
- { \tl_clear:N \l__xeCJK_fontname_tl }
- \clist_map_inline:xn {#3}
- {
- \tl_put_right:Nn \l__xeCJK_family_fb_tl { /FallBack }
- \__xeCJK_get_sub_features:nn \l__xeCJK_family_fb_tl {##1}
- \clist_put_left:cx { l__xeCJK_ \l__xeCJK_family_fb_tl _fontfeat_clist } {#2}
- \xeCJK_set_family:xcc \l__xeCJK_family_fb_tl
- { l__xeCJK_ \l__xeCJK_family_fb_tl _fontfeat_clist }
- { l__xeCJK_ \l__xeCJK_family_fb_tl _fontname_tl }
+ \tl_set:Nn \l__xeCJK_fallback_family_tl {#1}
+ \prop_get:NVNF \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
+ {
+ \tl_put_right:Nn \l__xeCJK_fallback_family_tl { /FallBack }
+ \__xeCJK_get_sub_features:Vn \l__xeCJK_fallback_family_tl {##1}
+ \clist_put_left:cn
+ { l__xeCJK_ \l__xeCJK_fallback_family_tl _font_options_clist } {#2}
+ \xeCJK_set_family:Vvv \l__xeCJK_fallback_family_tl
+ { l__xeCJK_ \l__xeCJK_fallback_family_tl _font_options_clist }
+ { l__xeCJK_ \l__xeCJK_fallback_family_tl _font_name_tl }
}
\group_end:
}
-\bool_new:N \g__xeCJK_AutoFakeBold_bool
-\bool_new:N \g__xeCJK_AutoFakeSlant_bool
-\fp_new:N \g__xeCJK_EmboldenFactor_fp
-\fp_new:N \g__xeCJK_SlantFactor_fp
+\cs_generate_variant:Nn \xeCJK_set_family_fallback:nnN { xx }
+\bool_new:N \g__xeCJK_auto_fake_bold_bool
+\bool_new:N \g__xeCJK_auto_fake_slant_bool
+\fp_new:N \g__xeCJK_embolden_factor_fp
+\fp_new:N \g__xeCJK_slant_factor_fp
\keys_define:nn { xeCJK / options }
{
- AutoFakeBold .choice:,
- AutoFakeBold / true .code:n =
- { \bool_set_true:N \g__xeCJK_AutoFakeBold_bool },
- AutoFakeBold / false .code:n =
- { \bool_set_false:N \g__xeCJK_AutoFakeBold_bool },
+ AutoFakeBold .choices:nn = { true , false }
+ { \use:c { bool_gset_ \l_keys_choice_tl :N } \g__xeCJK_auto_fake_bold_bool } ,
AutoFakeBold / unknown .code:n =
{
- \bool_set_true:N \g__xeCJK_AutoFakeBold_bool
- \fp_set:Nn \g__xeCJK_EmboldenFactor_fp { \l_keys_value_tl }
- },
- AutoFakeBold .default:n = { true },
- AutoFakeSlant .choice:,
- AutoFakeSlant / true .code:n =
- { \bool_set_true:N \g__xeCJK_AutoFakeSlant_bool },
- AutoFakeSlant / false .code:n =
- { \bool_set_false:N \g__xeCJK_AutoFakeSlant_bool },
+ \bool_gset_true:N \g__xeCJK_auto_fake_bold_bool
+ \fp_gset:Nn \g__xeCJK_embolden_factor_fp { \l_keys_value_tl }
+ } ,
+ AutoFakeBold .default:n = { true } ,
+ AutoFakeSlant .choices:nn = { true , false }
+ { \use:c { bool_gset_ \l_keys_choice_tl :N } \g__xeCJK_auto_fake_slant_bool } ,
AutoFakeSlant / unknown .code:n =
{
- \bool_set_true:N \g__xeCJK_AutoFakeSlant_bool
- \fp_set:Nn \g__xeCJK_SlantFactor_fp { \l_keys_value_tl }
- },
- AutoFakeSlant .default:n = { true },
- EmboldenFactor .fp_set:N = \g__xeCJK_EmboldenFactor_fp,
- SlantFactor .fp_set:N = \g__xeCJK_SlantFactor_fp,
- BoldFont .meta:n = { AutoFakeBold = true },
- boldfont .meta:n = { AutoFakeBold = true },
- SlantFont .meta:n = { AutoFakeSlant = true },
- slantfont .meta:n = { AutoFakeSlant = true },
- }
-\cs_generate_variant:Nn \keys_set_known:nnN { nx }
-\clist_new:N \g__xeCJK_sub_key_clist
+ \bool_gset_true:N \g__xeCJK_auto_fake_slant_bool
+ \fp_gset:Nn \g__xeCJK_slant_factor_fp { \l_keys_value_tl }
+ } ,
+ AutoFakeSlant .default:n = { true } ,
+ EmboldenFactor .fp_gset:N = \g__xeCJK_embolden_factor_fp ,
+ SlantFactor .fp_gset:N = \g__xeCJK_slant_factor_fp ,
+ BoldFont .meta:n = { AutoFakeBold = true } ,
+ boldfont .meta:n = { AutoFakeBold = true } ,
+ SlantFont .meta:n = { AutoFakeSlant = true } ,
+ slantfont .meta:n = { AutoFakeSlant = true }
+ }
+\seq_new:N \g__xeCJK_sub_key_seq
\cs_new_protected_nopar:Npn \__xeCJK_new_sub_key:n #1
{
- \clist_gput_right:Nx \g__xeCJK_sub_key_clist {#1}
+ \seq_gput_right:Nn \g__xeCJK_sub_key_seq {#1}
\keys_define:nn { xeCJK / features }
{
#1 .code:n =
{
- \xeCJK_if_blank_x:nTF {##1}
+ \tl_if_blank:nTF {##1}
{
\bool_set_false:c { l__xeCJK_copy_#1_bool }
\bool_set_false:c { l__xeCJK_add_#1_bool }
- \tl_put_right:Nx \l__xeCJK_family_aux_tl { /#1 }
+ \tl_put_right:Nn \l__xeCJK_family_name_tl { /#1 }
}
{
- \clist_put_right:Nx \l__xeCJK_sub_key_clist {#1}
- \str_if_eq_x:nnTF {##1} *
+ \seq_put_right:Nn \l__xeCJK_sub_key_seq {#1}
+ \str_if_eq:nnTF {##1} { * }
{
\bool_set_true:c { l__xeCJK_copy_#1_bool }
\bool_set_false:c { l__xeCJK_add_#1_bool }
@@ -1480,48 +1608,42 @@
\__xeCJK_get_sub_features:nn {#1} {##1}
}
}
- },
- #1 .default:n = \c_empty_tl,
+ } ,
+ #1 .default:n = { }
}
}
\cs_generate_variant:Nn \__xeCJK_new_sub_key:n { x }
\cs_new_protected_nopar:Npn \__xeCJK_get_sub_features:nn #1#2
{
- \tl_set:Nx \l__xeCJK_tmpa_tl {#2}
- \clist_clear:N \l__xeCJK_sub_fontfeat_clist
- \__xeCJK_gobble_brace:N \l__xeCJK_tmpa_tl
- \exp_args:No \tl_if_head_eq_charcode:nNTF \l__xeCJK_tmpa_tl [ % ]
+ \tl_set:Nx \l__xeCJK_tmpa_tl { \xeCJK_tl_remove_outer_braces:n {#2} }
+ \clist_clear:N \l__xeCJK_sub_font_options_clist
+ \tl_if_head_eq_meaning:VNTF \l__xeCJK_tmpa_tl [ % ]
{
- \exp_after:wN \__xeCJK_get_sub_features_aux:n \l__xeCJK_tmpa_tl \c_empty_tl
- \xeCJK_if_blank_x:nT \l__xeCJK_sub_fontname_tl
+ \exp_after:wN \__xeCJK_get_sub_features:wn \l__xeCJK_tmpa_tl \c_empty_tl
+ \tl_if_blank:VT \l__xeCJK_sub_font_name_tl
{
- \tl_set:Nx \l__xeCJK_sub_fontname_tl \l__xeCJK_tmpa_tl
- \clist_clear:N \l__xeCJK_sub_fontfeat_clist
+ \tl_set_eq:NN \l__xeCJK_sub_font_name_tl \l__xeCJK_tmpa_tl
+ \clist_clear:N \l__xeCJK_sub_font_options_clist
}
}
- { \tl_set:Nx \l__xeCJK_sub_fontname_tl \l__xeCJK_tmpa_tl }
- \xeCJK_if_blank_x:nTF \l__xeCJK_sub_fontname_tl
- { \tl_set:Nx \l__xeCJK_sub_fontname_tl \l__xeCJK_fontname_tl }
- { \tl_replace_all:Nnx \l__xeCJK_sub_fontname_tl * \l__xeCJK_fontname_tl }
- \clist_set:cx { l__xeCJK_#1_fontfeat_clist } \l__xeCJK_sub_fontfeat_clist
- \tl_set:cx { l__xeCJK_#1_fontname_tl } \l__xeCJK_sub_fontname_tl
- }
-\cs_new_protected_nopar:Npn \__xeCJK_gobble_brace:N #1
- {
- \exp_args:No \tl_if_head_is_group:nT #1
- {
- \exp_last_unbraced:NNo \tl_set:Nn #1 #1
- \__xeCJK_gobble_brace:N #1
- }
+ { \tl_set_eq:NN \l__xeCJK_sub_font_name_tl \l__xeCJK_tmpa_tl }
+ \tl_if_blank:VTF \l__xeCJK_sub_font_name_tl
+ { \tl_set_eq:NN \l__xeCJK_sub_font_name_tl \l__xeCJK_font_name_tl }
+ { \tl_replace_all:NnV \l__xeCJK_sub_font_name_tl { * } \l__xeCJK_font_name_tl }
+ \clist_set_eq:cN { l__xeCJK_#1_font_options_clist } \l__xeCJK_sub_font_options_clist
+ \tl_set_eq:cN { l__xeCJK_#1_font_name_tl } \l__xeCJK_sub_font_name_tl
}
-\cs_new_protected_nopar:Npn \__xeCJK_get_sub_features_aux:n [#1] #2
+\cs_new_protected_nopar:Npn \__xeCJK_get_sub_features:wn [#1] #2
{
- \clist_set:Nx \l__xeCJK_sub_fontfeat_clist {#1}
- \tl_set:Nx \l__xeCJK_sub_fontname_tl {#2}
+ \clist_set:Nn \l__xeCJK_sub_font_options_clist {#1}
+ \str_if_eq:nnTF {#2} { \c_empty_tl }
+ { \tl_set_eq:NN \l__xeCJK_sub_font_name_tl \c_empty_tl }
+ { \tl_set:Nn \l__xeCJK_sub_font_name_tl {#2} }
}
+\cs_generate_variant:Nn \__xeCJK_get_sub_features:nn { V }
+\cs_generate_variant:Nn \tl_if_head_eq_meaning:nNTF { V }
+\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV }
\__xeCJK_new_sub_key:n { FallBack }
-\cs_new_nopar:Npn \__xeCJK_map_features_id:n #1
- { \prop_get:Nn \g__xeCJK_features_id_prop {#1} }
\prop_new:N \g__xeCJK_features_id_prop
\prop_put:Nnn \g__xeCJK_features_id_prop { bf } { Bold }
\prop_put:Nnn \g__xeCJK_features_id_prop { it } { Italic }
@@ -1532,282 +1654,278 @@
{
\keys_define:nn { xeCJK / features }
{
- #2Font .tl_set_x:c = { l__xeCJK_fontname_#1_tl },
- #2Features .tl_set_x:c = { l__xeCJK_fontfeat_#1_clist } ,
+ #2Font .tl_set:c = { l__xeCJK_font_name_#1_tl } ,
+ #2Features .clist_set:c = { l__xeCJK_font_feat_#1_clist }
}
}
\keys_define:nn { xeCJK / features }
{
- AutoFakeBold .choice:,
+ AutoFakeBold .choice: ,
AutoFakeBold / false .code:n =
- { \bool_set_false:N \l__xeCJK_AutoFakeBold_bool },
+ { \bool_set_false:N \l__xeCJK_auto_fake_bold_bool } ,
AutoFakeBold / unknown .code:n =
{
- \bool_set_true:N \l__xeCJK_AutoFakeBold_bool
- \fp_set:Nn \l__xeCJK_EmboldenFactor_fp { \l_keys_value_tl }
- },
- AutoFakeBold .default:n = { \g__xeCJK_EmboldenFactor_fp },
- AutoFakeSlant .choice:,
+ \bool_set_true:N \l__xeCJK_auto_fake_bold_bool
+ \fp_set:Nn \l__xeCJK_embolden_factor_fp { \l_keys_value_tl }
+ } ,
+ AutoFakeBold .default:n = { \g__xeCJK_embolden_factor_fp } ,
+ AutoFakeSlant .choice: ,
AutoFakeSlant / false .code:n =
- { \bool_set_false:N \l__xeCJK_AutoFakeSlant_bool },
+ { \bool_set_false:N \l__xeCJK_auto_fake_slant_bool } ,
AutoFakeSlant / unknown .code:n =
{
- \bool_set_true:N \l__xeCJK_AutoFakeSlant_bool
- \fp_set:Nn \l__xeCJK_SlantFactor_fp { \l_keys_value_tl }
- },
- AutoFakeSlant .default:n = { \g__xeCJK_SlantFactor_fp },
- Mono .choice:,
- Mono / Exspace .code:n =
- {
- \xeCJK_set_monoexspace:
- \tl_clear:N \l__xeCJK_monoscale_tl
- },
- Mono / Scale .code:n =
- {
- \xeCJK_set_monoscale:
- \tl_set:Nx \l__xeCJK_monoscale_tl { Scale = { \fp_use:N \g__xeCJK_monoscale_fp } }
- }
+ \bool_set_true:N \l__xeCJK_auto_fake_slant_bool
+ \fp_set:Nn \l__xeCJK_slant_factor_fp { \l_keys_value_tl }
+ } ,
+ AutoFakeSlant .default:n = { \g__xeCJK_slant_factor_fp }
}
-\cs_new_protected_nopar:Npn \__xeCJK_set_init:
+\cs_new_protected_nopar:Npn \__xeCJK_set_family_initial:
{
- \cs_set_eq:NN \CJKfamily \use_none:n
- \tl_clear:N \l__xeCJK_monoscale_tl
- \int_gincr:N \g__xeCJK_fontspec_int
+ \__xeCJK_gobble_CJKfamily:
+ \int_gincr:N \g__xeCJK_family_int
\prop_clear:N \l__xeCJK_add_font_prop
\prop_map_inline:Nn \g__xeCJK_features_id_prop
{
- \tl_clear:c { l__xeCJK_fontname_##1_tl }
- \clist_clear:c { l__xeCJK_fontfeat_##1_clist }
+ \tl_clear:c { l__xeCJK_font_name_##1_tl }
+ \clist_clear:c { l__xeCJK_font_feat_##1_clist }
}
- \clist_clear:N \l__xeCJK_pass_features_clist
- \clist_clear:N \l__xeCJK_sub_key_clist
- \clist_map_inline:Nn \g__xeCJK_sub_key_clist
+ \clist_clear:N \l__xeCJK_fontspec_options_clist
+ \seq_clear:N \l__xeCJK_sub_key_seq
+ \seq_map_inline:Nn \g__xeCJK_sub_key_seq
{
\bool_set_false:c { l__xeCJK_copy_##1_bool }
\bool_set_false:c { l__xeCJK_add_##1_bool }
}
- \bool_set_eq:NN \l__xeCJK_AutoFakeBold_bool \g__xeCJK_AutoFakeBold_bool
- \bool_set_eq:NN \l__xeCJK_AutoFakeSlant_bool \g__xeCJK_AutoFakeSlant_bool
- \fp_set_eq:NN \l__xeCJK_EmboldenFactor_fp \g__xeCJK_EmboldenFactor_fp
- \fp_set_eq:NN \l__xeCJK_SlantFactor_fp \g__xeCJK_SlantFactor_fp
+ \bool_set_eq:NN \l__xeCJK_auto_fake_bold_bool \g__xeCJK_auto_fake_bold_bool
+ \bool_set_eq:NN \l__xeCJK_auto_fake_slant_bool \g__xeCJK_auto_fake_slant_bool
+ \fp_set_eq:NN \l__xeCJK_embolden_factor_fp \g__xeCJK_embolden_factor_fp
+ \fp_set_eq:NN \l__xeCJK_slant_factor_fp \g__xeCJK_slant_factor_fp
}
-\cs_new_protected_nopar:Npn \xeCJK_set_family:xnn #1#2#3
+\int_new:N \g__xeCJK_family_int
+\cs_new_protected_nopar:Npn \xeCJK_set_family:nnn #1#2#3
{
\group_begin:
- \__xeCJK_set_init:
- \tl_set:Nx \l__xeCJK_family_aux_tl {#1}
- \clist_set:Nx \l__xeCJK_fontoptions_clist {#2}
- \tl_set:Nx \l__xeCJK_fontname_tl {#3}
- \keys_set_known:nxN { xeCJK / features }
- { \g__xeCJK_default_features_clist, #2 } \l__xeCJK_pass_features_clist
+ \__xeCJK_set_family_initial:
+ \tl_set:Nn \l__xeCJK_family_name_tl {#1}
+ \clist_set:Nn \l__xeCJK_font_options_clist {#2}
+ \tl_set:Nn \l__xeCJK_font_name_tl {#3}
+ \clist_concat:NNN \l__xeCJK_font_features_clist
+ \g__xeCJK_default_features_clist \l__xeCJK_font_options_clist
+ \__xeCJK_remove_duplicate_keys:N \l__xeCJK_font_features_clist
+ \keys_set_known:nVN { xeCJK / features }
+ \l__xeCJK_font_features_clist \l__xeCJK_fontspec_options_clist
\__xeCJK_parse_features:
\__xeCJK_pass_features:
- \__xeCJK_check_family:V \l__xeCJK_family_aux_tl
- \cs_gset_protected_nopar:cpx { __xeCJK/family/\l__xeCJK_family_aux_tl }
+ \__xeCJK_check_family:V \l__xeCJK_family_name_tl
+ \__xeCJK_gset_family_cs:x { \l__xeCJK_family_name_tl }
+ \__xeCJK_save_family_info:
+ \__xeCJK_set_sub_block_family:
+ \group_end:
+ }
+\cs_generate_variant:Nn \xeCJK_set_family:nnn { Vnn , xxx , Vvv }
+\cs_new_protected_nopar:Npn \__xeCJK_remove_duplicate_keys:N #1
+ {
+ \prop_clear:N \l__xeCJK_tmp_prop
+ \keyval_parse:NNV \__xeCJK_prop_put_aux:n \__xeCJK_prop_put_aux:nn #1
+ \clist_clear:N #1
+ \prop_map_inline:Nn \l__xeCJK_tmp_prop
+ {
+ \tl_if_blank:nTF {##2}
+ { \clist_put_right:Nn #1 {##1} }
+ { \clist_put_right:Nn #1 { ##1 = {##2} } }
+ }
+ }
+\cs_generate_variant:Nn \keyval_parse:NNn { NNV }
+\cs_new_protected_nopar:Npn \__xeCJK_prop_put_aux:n #1
+ { \prop_put:Nnn \l__xeCJK_tmp_prop {#1} { } }
+\cs_new_protected_nopar:Npn \__xeCJK_prop_put_aux:nn #1#2
+ { \prop_put:Nnn \l__xeCJK_tmp_prop {#1} {#2} }
+\cs_new_protected_nopar:Npn \__xeCJK_gset_family_cs:x #1
+ {
+ \cs_gset_protected_nopar:cpx { \__xeCJK_family_csname:n {#1} }
{
\group_begin:
- \exp_not:n { \cs_set_eq:NN \CJKfamily \use_none:n }
+ \__xeCJK_gobble_CJKfamily:
\exp_not:n { \fontspec_set_family:Nnn \l__xeCJK_fontspec_family_tl }
- { \l__xeCJK_pass_features_clist } { \l__xeCJK_fontname_tl }
- \prop_gput:NnV \exp_not:N \g__xeCJK_family_name_prop
- { \l__xeCJK_family_aux_tl } \exp_not:N \l__xeCJK_fontspec_family_tl
- \cs_gset_protected_nopar:cpx { __xeCJK/family/\l__xeCJK_family_aux_tl }
- \exp_not:n
- { {
- \exp_not:N \fontencoding { \c__xeCJK_encoding_tl }
- \exp_not:N \fontfamily { \l__xeCJK_fontspec_family_tl }
- \exp_not:N \selectfont
- } }
+ { \exp_not:V \l__xeCJK_fontspec_options_clist }
+ { \exp_not:V \l__xeCJK_font_name_tl }
+ \__xeCJK_gset_family_nfss_cs:xx {#1} { \exp_not:N \l__xeCJK_fontspec_family_tl }
\group_end:
}
- \__xeCJK_save_family_info:
- \__xeCJK_add_sub_block:
- \group_end:
}
-\cs_generate_variant:Nn \xeCJK_set_family:xnn { xcc }
\cs_new_protected_nopar:Npn \__xeCJK_check_family:n #1
{
- \prop_get:NnNT \g__xeCJK_family_prop {#1} \l__xeCJK_tmpa_tl
+ \prop_get:NnNT \g__xeCJK_family_font_name_prop {#1} \l__xeCJK_tmpa_tl
{
- \prop_gpop:NnNT \g__xeCJK_family_name_prop {#1} \l__xeCJK_tmpa_tl { }
- \__xeCJK_warning:nxx { CJKfamily-redef } {#1} \l__xeCJK_tmpa_tl
+ \prop_gpop:NnNT \g__xeCJK_family_name_prop {#1} \l__xeCJK_tmpa_tl
+ { \cs_undefine:c { \__xeCJK_family_nfss_csname:n {#1} } }
+ \__xeCJK_warning:nxx { CJKfamily-redef } {#1} { \l__xeCJK_tmpa_tl }
}
}
\cs_generate_variant:Nn \__xeCJK_check_family:n { V }
-\__xeCJK_msg_new:nn { CJKfamily-redef } { Redefining~CJKfamily~`#1'~(#2). }
+\__xeCJK_msg_new:nn { CJKfamily-redef }
+ { Redefining~CJKfamily~`\__xeCJK_msg_family_map:n {#1}'~(#2). }
\cs_new_protected_nopar:Npn \__xeCJK_add_font:nn #1#2
- {
- \prop_put:Nxx \l__xeCJK_add_font_prop
- { \__xeCJK_map_features_id:n {#1} Font } {#2}
- }
+ { \prop_put:Nnn \l__xeCJK_add_font_prop { #1 Font } {#2} }
\cs_new_protected_nopar:Npn \__xeCJK_add_font_if_new:nn #1#2
- {
- \prop_put_if_new:Nxx \l__xeCJK_add_font_prop
- { \__xeCJK_map_features_id:n {#1} Font } {#2}
- }
-\cs_generate_variant:Nn \__xeCJK_add_font:nn { nx, nc, nV, nv }
-\cs_generate_variant:Nn \__xeCJK_add_font_if_new:nn { nx, nc, nV, nv }
-\cs_generate_variant:Nn \prop_put:Nnn { Nxx }
-\cs_generate_variant:Nn \prop_get:Nn { NV }
-\cs_generate_variant:Nn \prop_get:NnNF { Nx }
-\cs_generate_variant:Nn \prop_if_in:NnF { Nx }
-\cs_generate_variant:Nn \prop_put_if_new:Nnn { Nxx }
+ { \prop_put_if_new:Nnn \l__xeCJK_add_font_prop { #1 Font } {#2} }
+\cs_generate_variant:Nn \__xeCJK_add_font:nn { nx , nV , nv }
+\cs_generate_variant:Nn \__xeCJK_add_font_if_new:nn { nx , nV , nv }
\cs_new_protected_nopar:Npn \__xeCJK_add_fake_bold:n #1
{
- \clist_put_left:cx { l__xeCJK_fontfeat_#1_clist }
- { FakeBold = { \fp_use:N \l__xeCJK_EmboldenFactor_fp } }
+ \clist_put_left:cx { l__xeCJK_font_feat_#1_clist }
+ { FakeBold = { \fp_use:N \l__xeCJK_embolden_factor_fp } }
}
\cs_new_protected_nopar:Npn \__xeCJK_add_fake_slant:n #1
{
- \clist_put_left:cx { l__xeCJK_fontfeat_#1_clist }
- { FakeSlant = { \fp_use:N \l__xeCJK_SlantFactor_fp } }
+ \clist_put_left:cx { l__xeCJK_font_feat_#1_clist }
+ { FakeSlant = { \fp_use:N \l__xeCJK_slant_factor_fp } }
}
\cs_new_protected_nopar:Npn \__xeCJK_parse_features:
- { \prop_map_inline:Nn \g__xeCJK_features_id_prop { \__xeCJK_parse_features:n {##1} } }
-\cs_new_protected_nopar:Npn \__xeCJK_parse_features:n #1
+ { \prop_map_function:NN \g__xeCJK_features_id_prop \__xeCJK_parse_features:nn }
+\cs_new_protected_nopar:Npn \__xeCJK_parse_features:nn #1#2
{
\__xeCJK_if_font_select:nTF {#1}
{
- \__xeCJK_add_font:nv {#1} { l__xeCJK_fontname_#1_tl }
+ \__xeCJK_add_font:nv {#2} { l__xeCJK_font_name_#1_tl }
\__xeCJK_if_it_or_sl:nTF {#1}
{
- \__xeCJK_if_font_select:nF {bf#1}
- { \__xeCJK_add_font_if_new:nv {bf#1} { l__xeCJK_fontname_#1_tl } }
+ \__xeCJK_if_font_select:nF { bf #1 }
+ { \__xeCJK_add_font_if_new:nv {#2} { l__xeCJK_font_name_#1_tl } }
}
{
- \str_if_eq_x:nnT {#1} {bf}
+ \str_if_eq:nnT {#1} { bf }
{
- \clist_map_inline:nn { it , sl }
- {
- \__xeCJK_if_font_select:nF {bf##1}
- { \__xeCJK_add_font:nV {bf##1} \l__xeCJK_fontname_bf_tl }
- }
+ \__xeCJK_if_font_select:nF { bfit }
+ { \__xeCJK_add_font:nV { BoldItalic } \l__xeCJK_font_name_bf_tl }
+ \__xeCJK_if_font_select:nF { bfsl }
+ { \__xeCJK_add_font:nV { BoldSlanted } \l__xeCJK_font_name_bf_tl }
}
}
}
- { \__xeCJK_set_fake:n {#1} }
+ { \__xeCJK_set_fake_font:nn {#1} {#2} }
}
-\prg_new_conditional:Npnn \__xeCJK_if_font_select:n #1 { p, T, F, TF }
+\prg_new_conditional:Npnn \__xeCJK_if_font_select:n #1 { p , T , F , TF }
{
- \exp_args:Nc \xeCJK_if_blank_x:nTF { l__xeCJK_fontname_#1_tl }
- \prg_return_false: \prg_return_true:
+ \tl_if_blank:vTF { l__xeCJK_font_name_#1_tl }
+ { \prg_return_false: } { \prg_return_true: }
}
-\prg_new_conditional:Npnn \__xeCJK_if_it_or_sl:n #1 { p, T, F, TF }
+\prg_new_conditional:Npnn \__xeCJK_if_it_or_sl:n #1 { p , T , F , TF }
{
- \bool_if:nTF { \str_if_eq_x_p:nn { it } {#1} || \str_if_eq_x_p:nn { sl } {#1} }
- \prg_return_true: \prg_return_false:
+ \if_predicate:w
+ \bool_if_p:n { \str_if_eq_p:nn { it } {#1} || \str_if_eq_p:nn { sl } {#1} }
+ \prg_return_true: \else: \prg_return_false: \fi:
}
-\cs_new_protected_nopar:Npn \__xeCJK_set_fake:n #1
+\cs_generate_variant:Nn \tl_if_blank:nTF { v }
+\cs_new_protected_nopar:Npn \__xeCJK_set_fake_font:nn #1#2
{
- \str_if_eq_x:nnTF {#1} { bf }
- { \bool_if:NT \l__xeCJK_AutoFakeBold_bool { \__xeCJK_add_fake_bold:n {#1} } }
+ \str_if_eq:nnTF {#1} { bf }
+ { \bool_if:NT \l__xeCJK_auto_fake_bold_bool { \__xeCJK_add_fake_bold:n {#1} } }
{
- \bool_if:NTF \l__xeCJK_AutoFakeSlant_bool
+ \bool_if:NTF \l__xeCJK_auto_fake_slant_bool
{
\bool_if:nT
- { \__xeCJK_if_it_or_sl_p:n {#1} ||
- ( \str_if_eq_x_p:nn {#1} {bfit} && ! ( \__xeCJK_if_font_select_p:n {it} ) ) ||
- ( \str_if_eq_x_p:nn {#1} {bfsl} && ! ( \__xeCJK_if_font_select_p:n {sl} ) )
+ { \__xeCJK_if_it_or_sl_p:n {#1}
+ || ( \str_if_eq_p:nn {#1} { bfit }
+ && ! ( \__xeCJK_if_font_select_p:n { it } ) )
+ || ( \str_if_eq_p:nn {#1} { bfsl }
+ && ! ( \__xeCJK_if_font_select_p:n { sl } ) )
}
{ \__xeCJK_add_fake_slant:n {#1} }
}
- { \__xeCJK_if_it_or_sl:nT {#1} { \__xeCJK_map_it_sl:n {#1} } }
+ { \__xeCJK_if_it_or_sl:nT {#1} { \__xeCJK_map_it_sl:nn {#1} {#2} } }
\bool_if:nT
- { \l__xeCJK_AutoFakeBold_bool
+ { \l__xeCJK_auto_fake_bold_bool
&& ! ( \__xeCJK_if_it_or_sl_p:n {#1} )
- && ! ( \__xeCJK_if_font_select_p:n {bf} )
+ && ! ( \__xeCJK_if_font_select_p:n { bf } )
}
{ \__xeCJK_add_fake_bold:n {#1} }
}
- \__xeCJK_add_font_if_new:nn {#1} *
+ \__xeCJK_add_font_if_new:nn {#2} { * }
}
-\cs_new_protected_nopar:Npn \__xeCJK_map_it_sl:n #1
+\cs_new_protected_nopar:Npn \__xeCJK_map_it_sl:nn #1#2
{
\__xeCJK_if_map_font_select:nT {#1}
{
- \__xeCJK_add_font:nx {#1} { \__xeCJK_get_map_font:n {#1} }
- \__xeCJK_if_font_select:nF {bf#1}
- { \__xeCJK_add_font_if_new:nx {bf#1} { \__xeCJK_get_map_font:n {#1} } }
+ \__xeCJK_add_font:nx {#2} { \__xeCJK_get_map_font:n {#1} }
+ \__xeCJK_if_font_select:nF { bf #1 }
+ { \__xeCJK_add_font_if_new:nx { Bold #2 } { \__xeCJK_get_map_font:n {#1} } }
}
}
\cs_new_nopar:Npn \__xeCJK_get_map_font:n #1
- { \tl_use:c { l__xeCJK_fontname_\str_if_eq_x:nnTF {#1} {it} {sl} {it} _tl } }
-\prg_new_conditional:Npnn \__xeCJK_if_map_font_select:n #1 { p, T, F, TF }
+ { \exp_not:v { l__xeCJK_font_name_ \xeCJK_reverse:nnn {#1} { it } { sl } _tl } }
+\prg_new_conditional:Npnn \__xeCJK_if_map_font_select:n #1 { p , T , F , TF }
{
\xeCJK_if_blank_x:nTF { \__xeCJK_get_map_font:n {#1} }
- \prg_return_false: \prg_return_true:
+ { \prg_return_false: } { \prg_return_true: }
}
\cs_new_protected_nopar:Npn \__xeCJK_pass_features:
{
\prop_map_inline:Nn \g__xeCJK_features_id_prop
{
- \clist_if_empty:cF { l__xeCJK_fontfeat_##1_clist }
+ \clist_if_empty:cF { l__xeCJK_font_feat_##1_clist }
{
- \clist_put_right:Nx \l__xeCJK_pass_features_clist
- { ##2Features = { \tl_use:c { l__xeCJK_fontfeat_##1_clist } } }
+ \clist_put_right:Nx \l__xeCJK_fontspec_options_clist
+ { ##2Features = { \exp_not:v { l__xeCJK_font_feat_##1_clist } } }
}
}
\prop_map_inline:Nn \l__xeCJK_add_font_prop
- { \clist_put_right:Nx \l__xeCJK_pass_features_clist { ##1 = { ##2 } } }
- \xeCJK_if_blank_x:nF \l__xeCJK_monoscale_tl
- { \clist_put_left:Nx \l__xeCJK_pass_features_clist \l__xeCJK_monoscale_tl }
+ { \clist_put_right:Nn \l__xeCJK_fontspec_options_clist { ##1 = { ##2 } } }
}
-\prop_new:N \g__xeCJK_family_prop
\prop_new:N \g__xeCJK_family_name_prop
-\prop_new:N \g__xeCJK_family_options_prop
+\prop_new:N \g__xeCJK_family_font_name_prop
+\prop_new:N \g__xeCJK_family_font_options_prop
\cs_new_protected_nopar:Npn \__xeCJK_save_family_info:
{
\group_begin:
- \clist_map_inline:Nn \g__xeCJK_CJK_subclass_clist
+ \seq_map_inline:Nn \g__xeCJK_CJK_sub_class_seq
+ { \clist_remove_all:Nn \l__xeCJK_font_options_clist {##1} }
+ \prop_gput:NVV \g__xeCJK_family_font_name_prop
+ \l__xeCJK_family_name_tl \l__xeCJK_font_name_tl
+ \prop_gput:NVV \g__xeCJK_family_font_options_prop
+ \l__xeCJK_family_name_tl \l__xeCJK_font_options_clist
+ \group_end:
+ }
+\cs_new_protected_nopar:Npn \__xeCJK_set_sub_block_family:
+ {
+ \seq_map_inline:Nn \l__xeCJK_sub_key_seq
{
- \clist_remove_all:Nn \l__xeCJK_fontoptions_clist {##1}
- \clist_remove_all:Nn \l__xeCJK_fontoptions_clist { ##1 = }
+ \tl_set:Nx \l__xeCJK_sub_family_tl { \l__xeCJK_family_name_tl/##1 }
+ \bool_if:cT { l__xeCJK_copy_##1_bool } { \__xeCJK_copy_sub_family:n {##1} }
+ \bool_if:cT { l__xeCJK_add_##1_bool }
+ {
+ \xeCJK_set_family:Vvv \l__xeCJK_sub_family_tl
+ { l__xeCJK_##1_font_options_clist } { l__xeCJK_##1_font_name_tl }
+ }
}
- \prop_gput:NVV \g__xeCJK_family_prop \l__xeCJK_family_aux_tl \l__xeCJK_fontname_tl
- \prop_gput:NVV \g__xeCJK_family_options_prop \l__xeCJK_family_aux_tl \l__xeCJK_fontoptions_clist
- \group_end:
}
-\cs_new_protected_nopar:Npn \__xeCJK_add_sub_block:
+\cs_new_protected_nopar:Npn \__xeCJK_copy_sub_family:n #1
{
- \clist_remove_duplicates:N \l__xeCJK_sub_key_clist
- \clist_map_inline:Nn \l__xeCJK_sub_key_clist
+ \__xeCJK_check_family:V \l__xeCJK_sub_family_tl
+ \prop_get:NVNT \g__xeCJK_family_font_name_prop
+ \l__xeCJK_family_name_tl \l__xeCJK_tmpa_tl
{
- \tl_set:Nx \l__xeCJK_sub_family_tl { \l__xeCJK_family_aux_tl/##1 }
- \bool_if:cT { l__xeCJK_copy_##1_bool }
+ \prop_gput:NVV \g__xeCJK_family_font_name_prop
+ \l__xeCJK_sub_family_tl \l__xeCJK_tmpa_tl
+ }
+ \prop_get:NVNT \g__xeCJK_family_font_options_prop
+ \l__xeCJK_family_name_tl \l__xeCJK_tmpa_clist
+ {
+ \clist_remove_all:Nn \l__xeCJK_tmpa_clist { #1 = * }
+ \prop_gput:NVV \g__xeCJK_family_font_options_prop
+ \l__xeCJK_sub_family_tl \l__xeCJK_tmpa_clist
+ }
+ \cs_gset_protected_nopar:cpx { \__xeCJK_family_csname:n { \l__xeCJK_sub_family_tl } }
+ {
+ \xeCJK_family_if_exist:xT { \l__xeCJK_family_name_tl }
{
- \__xeCJK_check_family:V \l__xeCJK_sub_family_tl
- \prop_get:NVNT \g__xeCJK_family_prop \l__xeCJK_family_aux_tl \l__xeCJK_tmpa_tl
- { \prop_gput:NVV \g__xeCJK_family_prop \l__xeCJK_sub_family_tl \l__xeCJK_tmpa_tl }
- \prop_get:NVNT \g__xeCJK_family_options_prop \l__xeCJK_family_aux_tl \l__xeCJK_tmpa_clist
- {
- \clist_remove_all:Nn \l__xeCJK_tmpa_clist { ##1 = * }
- \prop_gput:NVV \g__xeCJK_family_options_prop \l__xeCJK_sub_family_tl \l__xeCJK_tmpa_clist
- }
- \cs_gset_protected_nopar:cpx { __xeCJK/family/\l__xeCJK_sub_family_tl }
+ \prop_get:NnNT \exp_not:N \g__xeCJK_family_name_prop
+ { \l__xeCJK_family_name_tl } \exp_not:N \l__xeCJK_tmpa_tl
{
- \xeCJK_family_if_exist:xT { \l__xeCJK_family_aux_tl }
- {
- \prop_get:NnNT \exp_not:N \g__xeCJK_family_name_prop
- { \l__xeCJK_family_aux_tl } \exp_not:N \l__xeCJK_tmpa_tl
- {
- \prop_gput:NnV \exp_not:N \g__xeCJK_family_name_prop
- { \l__xeCJK_sub_family_tl } \exp_not:N \l__xeCJK_tmpa_tl
- \cs_gset_protected_nopar:cpx { __xeCJK/family/\l__xeCJK_sub_family_tl }
- \exp_not:n
- { {
- \exp_not:N \fontencoding { \c__xeCJK_encoding_tl }
- \exp_not:N \fontfamily { \l__xeCJK_tmpa_tl }
- \exp_not:N \selectfont
- } }
- }
- }
+ \__xeCJK_gset_family_nfss_cs:xx
+ { \l__xeCJK_sub_family_tl } { \exp_not:N \l__xeCJK_tmpa_tl }
}
}
- \bool_if:cT { l__xeCJK_add_##1_bool }
- {
- \xeCJK_set_family:xcc \l__xeCJK_sub_family_tl
- { l__xeCJK_##1_fontfeat_clist } { l__xeCJK_##1_fontname_tl }
- }
}
}
\cs_new_protected_nopar:Npn \__xeCJK_copy_family:nn #1#2
@@ -1815,55 +1933,93 @@
\xeCJK_family_if_exist:xT {#2}
{
\tl_map_inline:nn
- { \g__xeCJK_family_prop \g__xeCJK_family_options_prop \g__xeCJK_family_name_prop }
- { \prop_get:NnNT ##1 {#2} \l__xeCJK_tmpa_tl { \prop_gput:NnV ##1 {#1} \l__xeCJK_tmpa_tl } }
- \cs_gset_eq:cc { __xeCJK/family/#1 } { __xeCJK/family/#2 }
+ {
+ \g__xeCJK_family_name_prop
+ \g__xeCJK_family_font_name_prop
+ \g__xeCJK_family_font_options_prop
+ }
+ {
+ \prop_get:NnNT ##1 {#2} \l__xeCJK_tmpa_tl
+ { \prop_gput:NnV ##1 {#1} \l__xeCJK_tmpa_tl }
+ }
+ \cs_gset_eq:cc
+ { \__xeCJK_family_nfss_csname:n {#1} }
+ { \__xeCJK_family_nfss_csname:n {#2} }
}
}
\cs_generate_variant:Nn \__xeCJK_copy_family:nn { xx }
-\tl_set:Nn \l_xeCJK_font_coor_tl { __xeCJK/\l_xeCJK_family_tl/\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 { \l_xeCJK_family_tl } }
+\cs_new_nopar:Npn \__xeCJK_font_csname:n #1 { xeCJK/#1/\f@series/\f@shape/\f@size }
\cs_new_protected_nopar:Npn \xeCJK_select_font:
{
- \cs_if_exist_use:cF { \l_xeCJK_font_coor_tl }
+ \cs_if_exist_use:cF { \l_xeCJK_current_font_tl }
+ {
+ \tl_set:Nx \l__xeCJK_current_coor_tl { \l_xeCJK_current_font_tl }
+ \__xeCJK_family_use:x { \l_xeCJK_family_tl }
+ \xeCJK_font_gset_to_current:c { \l__xeCJK_current_coor_tl }
+ }
+ }
+\cs_new_protected_nopar:Npn \xeCJK_select_font:x #1
+ {
+ \cs_if_exist_use:cF { \__xeCJK_font_csname:n {#1} }
{
- \tl_set:Nx \l__xeCJK_current_coor_tl \l_xeCJK_font_coor_tl
- \cs_if_exist_use:cT { __xeCJK/family/\l_xeCJK_family_tl }
- { \exp_last_unbraced:NNV \cs_gset_eq:cN \l__xeCJK_current_coor_tl \tex_font:D }
+ \tl_set:Nx \l__xeCJK_current_coor_tl { \__xeCJK_font_csname:n {#1} }
+ \__xeCJK_family_use:x {#1}
+ \xeCJK_font_gset_to_current:c { \l__xeCJK_current_coor_tl }
}
}
\cs_new_eq:NN \xeCJK@setfont \xeCJK_select_font:
\cs_new_protected_nopar:Npn \__xeCJK_switch_font:nn #1#2
{
- \str_if_eq_x:nnF {#1} {#2}
+ \str_if_eq:nnF {#1} {#2}
{
\__xeCJK_info:nxx { CJK-block } {#1} {#2}
- \tl_remove_all:Nn \l_xeCJK_family_tl { /#1 }
- \str_if_eq_x:nnF {#2} { CJK }
+ \str_if_eq:nnTF {#2} { CJK }
+ { \xeCJK_select_font: }
+ { \__xeCJK_block_select_font:n {#2} }
+ }
+ }
+\__xeCJK_msg_new:nn { CJK-block } { Switch~from~block~'#1'~to~'#2'. }
+\cs_new_protected_nopar:Npn \__xeCJK_block_select_font:n #1
+ {
+ \cs_if_exist_use:cF { \__xeCJK_font_csname:n { \l_xeCJK_family_tl/#1 } }
+ {
+ \tl_set:Nx \l__xeCJK_current_coor_tl
+ { \__xeCJK_font_csname:n { \l_xeCJK_family_tl/#1 } }
+ \xeCJK_family_if_exist:xF { \l_xeCJK_family_tl/#1 }
{
- \tl_set:Nx \l__xeCJK_tmpa_tl \l_xeCJK_family_tl
- \tl_put_right:Nx \l_xeCJK_family_tl { /#2 }
- \xeCJK_family_if_exist:xF \l_xeCJK_family_tl
+ \__xeCJK_copy_family:xx { \l_xeCJK_family_tl/#1 }
{
- \xeCJK_family_if_exist:xTF { \CJKfamilydefault/#2 }
- { \__xeCJK_copy_family:xx \l_xeCJK_family_tl { \CJKfamilydefault/#2 } }
- { \__xeCJK_copy_family:xx \l_xeCJK_family_tl \l__xeCJK_tmpa_tl }
+ \cs_if_exist:cTF { \__xeCJK_family_csname:n { \CJKfamilydefault/#1 } }
+ { \CJKfamilydefault/#1 } { \l_xeCJK_family_tl }
}
}
+ \__xeCJK_family_use:x { \l_xeCJK_family_tl/#1 }
+ \xeCJK_font_gset_to_current:c { \l__xeCJK_current_coor_tl }
}
- \xeCJK_select_font:
}
-\__xeCJK_msg_new:nn { CJK-block } { Switch~from~block~'#1'~to~'#2'. }
-\prg_new_protected_conditional:Npnn \xeCJK_family_if_exist:x #1 { T, F, TF }
+\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_if_free:cTF { __xeCJK/family/#1 }
- { \prg_return_false: }
+ \prop_gput:Nxx \g__xeCJK_family_name_prop {#1} {#2}
+ \cs_gset_protected_nopar:cpx { \__xeCJK_family_nfss_csname:n {#1} }
{
- \prop_get:NxNF \g__xeCJK_family_name_prop {#1} \l__xeCJK_family_name_tl
- { \use:c { __xeCJK/family/#1 } }
- \prg_return_true:
+ \exp_not:N \fontencoding { \c__xeCJK_encoding_tl }
+ \exp_not:N \fontfamily {#2}
+ \exp_not:N \selectfont
}
}
-\cs_generate_variant:Nn \prop_get:NnNTF { Nx }
+\cs_generate_variant:Nn \prop_gput:Nnn { Nxx }
+\prg_new_protected_conditional:Npnn \xeCJK_family_if_exist:x #1 { T , F , TF }
+ {
+ \cs_if_exist:cTF { \__xeCJK_family_nfss_csname:n {#1} }
+ { \use_i:nn }
+ { \cs_if_exist_use:cTF { \__xeCJK_family_csname:n {#1} } }
+ { \prg_return_true: } { \prg_return_false: }
+ }
\NewDocumentCommand \CJKfamily { t+ t- m }
{
\xeCJK_if_blank_x:nTF {#3}
@@ -1878,39 +2034,37 @@
{
\tl_set:Nx \l_xeCJK_family_tl {#3}
\tl_set_eq:NN \xeCJK@family \l_xeCJK_family_tl
- \IfBooleanT {#1} { \use:c { __xeCJK/family/#3 } }
+ \IfBooleanT {#1} { \__xeCJK_family_use:x {#3} }
}
{ \__xeCJK_family_unknown_warning:x {#3} }
}
}
\tex_ignorespaces:D
}
+\tl_new:N \l_xeCJK_family_tl
+\tl_set:Nn \l_xeCJK_family_tl { \CJKfamilydefault }
+\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
{
\xeCJK_family_if_exist:xTF {#1}
- { \use:c { __xeCJK/family/#1 } }
+ { \__xeCJK_family_use:x {#1} }
{ \__xeCJK_family_unknown_warning:x {#1} }
}
-\cs_new_protected_nopar:Npn \__xeCJK_family_unknown_warning:x #1
+\cs_new_protected_nopar:Npn \__xeCJK_family_unknown_warning:n #1
{
- \seq_if_in:NxF \g__xeCJK_unknown_family_seq {#1}
+ \seq_if_in:NnF \g__xeCJK_unknown_family_seq {#1}
{
- \seq_gput_right:Nx \g__xeCJK_unknown_family_seq {#1}
+ \seq_gput_right:Nn \g__xeCJK_unknown_family_seq {#1}
\__xeCJK_warning:nx { CJKfamily-Unknown } {#1}
}
}
+\cs_generate_variant:Nn \__xeCJK_family_unknown_warning:n { x }
\seq_new:N \g__xeCJK_unknown_family_seq
\__xeCJK_msg_new:nn { CJKfamily-Unknown }
{
- Unknown~CJK~family~'
- \str_case_x:nnn {#1}
- {
- \CJKrmdefault { \token_to_str:N \CJKrmdefault }
- \CJKsfdefault { \token_to_str:N \CJKsfdefault }
- \CJKttdefault { \token_to_str:N \CJKttdefault }
- }
- {#1}
- '~is~ignored.\\\\
+ Unknown~CJK~family~`\__xeCJK_msg_family_map:n {#1}'~is~being~ignored.\\\\
Try~to~use~
\str_case_x:nnn {#1}
{
@@ -1921,149 +2075,113 @@
{ \token_to_str:N \setCJKfamilyfont {#1} }
[...]{...}~to~define~it.
}
+\cs_new_nopar:Npn \__xeCJK_msg_family_map:n #1
+ {
+ \str_case_x:nnn {#1}
+ {
+ \CJKrmdefault { \token_to_str:N \CJKrmdefault }
+ \CJKsfdefault { \token_to_str:N \CJKsfdefault }
+ \CJKttdefault { \token_to_str:N \CJKttdefault }
+ }
+ {#1}
+ }
+\NewDocumentCommand \setCJKmainfont { O{} m }
+ { \xeCJK_set_family:xxx { \CJKrmdefault } {#1} {#2} }
+\cs_new_eq:NN \setCJKromanfont \setCJKmainfont
+\NewDocumentCommand \setCJKsansfont { O{} m }
+ { \xeCJK_set_family:xxx { \CJKsfdefault } {#1} {#2} }
+\NewDocumentCommand \setCJKmonofont { O{} m }
+ { \xeCJK_set_family:xxx { \CJKttdefault } {#1} {#2} }
+\@onlypreamble \setCJKmainfont
+\@onlypreamble \setCJKmathfont
+\@onlypreamble \setCJKsansfont
+\@onlypreamble \setCJKmonofont
+\@onlypreamble \setCJKromanfont
\NewDocumentCommand \setCJKfamilyfont { m O{} m }
- { \xeCJK_set_family:xnn {#1} {#2} {#3} }
+ { \xeCJK_set_family:xxx {#1} {#2} {#3} }
\NewDocumentCommand \newCJKfontfamily { o m O{} m }
{
- \tl_set:Nx \l__xeCJK_family_aux_tl { \IfNoValueTF {#1} { \cs_to_str:N #2 } {#1} }
- \xeCJK_set_family:xnn \l__xeCJK_family_aux_tl {#3} {#4}
- \cs_new_protected_nopar:Npx #2 { \exp_not:N \CJKfamily { \l__xeCJK_family_aux_tl } }
+ \tl_set:Nx \l__xeCJK_tmpa_tl { \IfNoValueTF {#1} { \cs_to_str:N #2 } {#1} }
+ \cs_new_protected_nopar:Npx #2 { \CJKfamily { \l__xeCJK_tmpa_tl } }
+ \xeCJK_set_family:xxx { \l__xeCJK_tmpa_tl } {#3} {#4}
}
-\int_new:N \g__xeCJK_fontspec_int
-\int_gdecr:N \g__xeCJK_fontspec_int
\NewDocumentCommand \CJKfontspec { O{} m }
{
- \tl_set:Nx \l__xeCJK_CJKfontspec_id_tl { CJKfontspec/#1/#2/id }
- \cs_if_free:cT \l__xeCJK_CJKfontspec_id_tl
+ \xeCJK_fontspec:xx {#1} {#2}
+ \tex_ignorespaces:D
+ }
+\cs_new_protected_nopar:Npn \xeCJK_fontspec:nn #1#2
+ {
+ \tl_set:Nx \l__xeCJK_tmpa_tl { \tl_to_str:n { CJKfontspec/#1/#2/id } }
+ \tl_if_exist:cF { \l__xeCJK_tmpa_tl }
{
- \int_gincr:N \g__xeCJK_fontspec_int
- \tl_gset:Nx \g__xeCJK_family_spec_tl
- { CJKfontspec ( \int_use:N \g__xeCJK_fontspec_int ) }
- \xeCJK_set_family:xnn \g__xeCJK_family_spec_tl {#1} {#2}
- \tl_gset:cx \l__xeCJK_CJKfontspec_id_tl \g__xeCJK_family_spec_tl
+ \tl_set:Nx \l__xeCJK_tmpb_tl
+ { CJKfontspec ( \int_eval:n { \g__xeCJK_family_int + \c_one } ) }
+ \tl_gset_eq:cN { \l__xeCJK_tmpa_tl } \l__xeCJK_tmpb_tl
+ \xeCJK_set_family:Vnn \l__xeCJK_tmpb_tl {#1} {#2}
}
- \exp_args:Nv \CJKfamily \l__xeCJK_CJKfontspec_id_tl
- \tex_ignorespaces:D
+ \exp_args:Nc \CJKfamily { \l__xeCJK_tmpa_tl }
}
+\cs_generate_variant:Nn \xeCJK_fontspec:nn { VV , xx }
\clist_new:N \g__xeCJK_default_features_clist
\NewDocumentCommand \defaultCJKfontfeatures { m }
{ \clist_gset:Nn \g__xeCJK_default_features_clist {#1} }
-\defaultCJKfontfeatures { Script = CJK }
\@onlypreamble \defaultCJKfontfeatures
\NewDocumentCommand \addCJKfontfeatures { m }
{
- \prop_if_in:NVTF \g__xeCJK_family_prop \l_xeCJK_family_tl
+ \xeCJK_add_font_features:x {#1}
+ \tex_ignorespaces:D
+ }
+\cs_new_eq:NN \addCJKfontfeature \addCJKfontfeatures
+\cs_new_protected_nopar:Npn \xeCJK_add_font_features:n #1
+ {
+ \prop_get:NVNTF \g__xeCJK_family_font_name_prop \l_xeCJK_family_tl \l__xeCJK_tmpa_tl
{
- \group_begin:
- \clist_set:Nx \l__xeCJK_tmpa_clist {#1}
- \prop_get:NVN \g__xeCJK_family_prop \l_xeCJK_family_tl \l__xeCJK_tmpa_tl
- \clist_map_inline:Nn \g__xeCJK_CJK_subclass_clist
+ \clist_set:Nn \l__xeCJK_tmpa_clist {#1}
+ \seq_map_function:NN
+ \g__xeCJK_CJK_sub_class_seq \__xeCJK_parse_sub_class_features:n
+ \prop_get:NVNT \g__xeCJK_family_font_options_prop
+ \l_xeCJK_family_tl \l__xeCJK_tmpb_clist
{
- \clist_if_in:NnT \l__xeCJK_tmpa_clist {##1}
- {
- \clist_remove_all:Nn \l__xeCJK_tmpa_clist {##1}
- \prop_get:NxNF \g__xeCJK_family_prop { \l_xeCJK_family_tl/##1 } \l__xeCJK_tmpb_tl
- {
- \prop_get:NxNF \g__xeCJK_family_prop
- { \CJKfamilydefault/##1 } \l__xeCJK_tmpb_tl
- { \tl_set:Nx \l__xeCJK_tmpb_tl \l__xeCJK_tmpa_tl }
- }
- \clist_set:Nx \l__xeCJK_tmpa_clist
- { ##1 = { [ \l__xeCJK_tmpa_clist ] { \l__xeCJK_tmpb_tl } } }
- \clist_map_break:
- }
+ \clist_concat:NNN
+ \l__xeCJK_tmpa_clist \l__xeCJK_tmpb_clist \l__xeCJK_tmpa_clist
}
- \prop_get:NVNF \g__xeCJK_family_options_prop \l_xeCJK_family_tl \l__xeCJK_tmpb_clist
- { \clist_clear:N \l__xeCJK_tmpb_clist }
- \clist_clear:N \l__xeCJK_tmpc_clist
- \clist_map_inline:Nn \l__xeCJK_tmpb_clist
- {
- \clist_if_in:NnF \l__xeCJK_tmpa_clist {##1}
- { \clist_put_right:Nn \l__xeCJK_tmpc_clist {##1} }
- }
- \clist_put_left:NV \l__xeCJK_tmpa_clist \l__xeCJK_tmpc_clist
- \use:x
- { \group_end: \CJKfontspec [ \l__xeCJK_tmpa_clist ] { \l__xeCJK_tmpa_tl } }
+ \xeCJK_fontspec:VV \l__xeCJK_tmpa_clist \l__xeCJK_tmpa_tl
}
{ \__xeCJK_warning:n { addCJKfontfeature-ignored } }
- \tex_ignorespaces:D
}
-\cs_new_eq:NN \addCJKfontfeature \addCJKfontfeatures
+\cs_generate_variant:Nn \xeCJK_add_font_features:n { x }
\__xeCJK_msg_new:nn { addCJKfontfeature-ignored }
{
\token_to_str:N \addCJKfontfeature (s)~ignored.\\\\
It~cannot~be~used~with~a~font~that~wasn't~selected~by~xeCJK.
}
-\NewDocumentCommand \setCJKmainfont { O{} m }
- { \xeCJK_set_family:xnn \CJKrmdefault {#1} {#2} }
-\cs_new_eq:NN \setCJKromanfont \setCJKmainfont
-\NewDocumentCommand \setCJKsansfont { O{} m }
- { \xeCJK_set_family:xnn \CJKsfdefault {#1} {#2} }
-\tl_if_exist:NF \CJKrmdefault { \tl_set:Nn \CJKrmdefault { rm } }
-\tl_if_exist:NF \CJKsfdefault { \tl_set:Nn \CJKsfdefault { sf } }
-\tl_if_exist:NF \CJKttdefault { \tl_set:Nn \CJKttdefault { tt } }
-\tl_if_exist:NF \CJKfamilydefault { \tl_set:Nn \CJKfamilydefault { \CJKrmdefault } }
-\tl_new:c { __xeCJK/family/\CJKfamilydefault }
-\AtEndOfPackage
- {
- \etex_protected:D \tl_put_right:Nn \normalfont { \CJKfamily \CJKfamilydefault }
- \etex_protected:D \tl_put_right:Nn \rmfamily { \CJKfamily \CJKrmdefault }
- \etex_protected:D \tl_put_right:Nn \sffamily { \CJKfamily \CJKsfdefault }
- \etex_protected:D \tl_put_right:Nn \ttfamily { \CJKfamily \CJKttdefault }
- \cs_set_eq:NN \reset@font \normalfont
- }
-\@onlypreamble \setCJKmainfont
-\@onlypreamble \setCJKmathfont
-\@onlypreamble \setCJKsansfont
-\@onlypreamble \setCJKmonofont
-\@onlypreamble \setCJKromanfont
-\NewDocumentCommand \setCJKmathfont { O{} m }
- { \xeCJK_set_family:xnn \c__xeCJK_math_tl {#1} {#2} }
-\tl_const:Nn \c__xeCJK_math_tl { CJKmath }
-\keys_define:nn { xeCJK / options } { CJKmath .bool_gset:N = \g__xeCJK_math_bool }
-\NewDocumentCommand \xeCJKsetmathcode { m m m m }
- {
- \__xeCJK_check_num_range:nnNN {#1} {#2} \l__xeCJK_tmpa_int \l__xeCJK_tmpb_int
- \int_set:Nn \l__xeCJK_tmpc_int { \__xeCJK_math_type:n {#3} }
- \int_set:Nn \l_tmpa_int { \use:c { sym #4 } }
- \xeCJK_int_until_do:nn { \l__xeCJK_tmpa_int > \l__xeCJK_tmpb_int }
- {
- \XeTeXmathcode \l__xeCJK_tmpa_int = \l__xeCJK_tmpc_int \l_tmpa_int \l__xeCJK_tmpa_int
- \int_incr:N \l__xeCJK_tmpa_int
- }
- }
-\cs_new_eq:NN \__xeCJK_math_type:n \mathchar@type
-\cs_new_protected_nopar:Npn \xeCJK_set_mathfont:
+\cs_new_protected_nopar:Npn \__xeCJK_parse_sub_class_features:n #1
{
- \xeCJK_family_if_exist:xTF \c__xeCJK_math_tl
- { \tl_set:Nx \l__xeCJK_tmpa_tl \c__xeCJK_math_tl }
+ \clist_if_in:NnT \l__xeCJK_tmpa_clist {#1}
{
- \xeCJK_family_if_exist:xTF \CJKfamilydefault
- { \tl_set:Nx \l__xeCJK_tmpa_tl \CJKfamilydefault }
- { \tl_set_eq:NN \l__xeCJK_tmpa_tl \q_no_value }
- }
- \prop_get:NVNT \g__xeCJK_family_name_prop \l__xeCJK_tmpa_tl \l__xeCJK_math_family_tl
- {
- \DeclareSymbolFont \c__xeCJK_math_tl \c__xeCJK_encoding_tl
- \l__xeCJK_math_family_tl \mddefault \shapedefault
- \SetSymbolFont \c__xeCJK_math_tl { bold } \c__xeCJK_encoding_tl
- \l__xeCJK_math_family_tl \bfdefault \shapedefault
- \clist_map_inline:nn { CJK, FullLeft, FullRight }
+ \clist_remove_all:Nn \l__xeCJK_tmpa_clist {#1}
+ \prop_get:NoNF \g__xeCJK_family_font_name_prop
+ { \l_xeCJK_family_tl/#1 } \l__xeCJK_tmpb_tl
{
- \clist_map_inline:cn { g__xeCJK_##1_range_clist }
- {
- \__xeCJK_set_char_class_aux:Nn \xeCJKsetmathcode {####1}
- \mathalpha \c__xeCJK_math_tl
- }
+ \prop_get:NxNF \g__xeCJK_family_font_name_prop
+ { \CJKfamilydefault/#1 } \l__xeCJK_tmpb_tl
+ { \tl_set_eq:NN \l__xeCJK_tmpb_tl \l__xeCJK_tmpa_tl }
}
+ \clist_set:Nx \l__xeCJK_tmpa_clist
+ { #1 = { [ \exp_not:V \l__xeCJK_tmpa_clist ] { \exp_not:V \l__xeCJK_tmpb_tl } } }
+ \clist_map_break:
}
}
-\__xeCJK_AtEndPreamble:n
+\cs_generate_variant:Nn \prop_get:NnNF { Nx }
+\__xeCJK_at_end_preamble:n
{
- \normalfont
- \prop_if_empty:NTF \g__xeCJK_family_prop
+ \prop_if_empty:NTF \g__xeCJK_family_font_name_prop
{ \__xeCJK_warning:n { no-CJKfamily } }
- { \bool_if:NT \g__xeCJK_math_bool { \xeCJK_set_mathfont: } }
+ {
+ \CJKfamily { \CJKfamilydefault }
+ \bool_if:NT \g__xeCJK_math_bool { \xeCJK_set_mathfont: }
+ }
}
\__xeCJK_msg_new:nn { no-CJKfamily }
{
@@ -2072,140 +2190,223 @@
\token_to_str:N \xeCJKmainfont[...]{...}\\\\
in~the~preamble~to~declare~the~main~CJKfamily.\\
}
-\fp_new:N \g__xeCJK_monoscale_fp
-\fp_set_eq:NN \g__xeCJK_monoscale_fp \c_one_fp
-\dim_new:N \g__xeCJK_exspace_dim
-\NewDocumentCommand \setCJKmonoscale { }
+\keys_define:nn { xeCJK / options } { CJKmath .bool_gset:N = \g__xeCJK_math_bool }
+\NewDocumentCommand \setCJKmathfont { O{} m }
+ { \xeCJK_set_family:xxx { \c__xeCJK_math_tl } {#1} {#2} }
+\tl_const:Nn \c__xeCJK_math_tl { CJKmath }
+\cs_new_protected_nopar:Npn \xeCJK_set_mathfont:
{
- \CJKflexiblespacing
- \xeCJK_set_monoscale:
- \addCJKfontfeatures { Scale = \fp_use:N \g__xeCJK_monoscale_fp }
+ \xeCJK_family_if_exist:xTF { \c__xeCJK_math_tl }
+ { \tl_set:Nx \l__xeCJK_tmpa_tl { \c__xeCJK_math_tl } }
+ {
+ \xeCJK_family_if_exist:xTF { \CJKfamilydefault }
+ { \tl_set:Nx \l__xeCJK_tmpa_tl { \CJKfamilydefault } }
+ { \use_none:nnnnn }
+ }
+ \prop_get:NVNT \g__xeCJK_family_name_prop \l__xeCJK_tmpa_tl \l__xeCJK_tmpb_tl
+ {
+ \tl_const:Nx \c__xeCJK_math_family_tl { \l__xeCJK_tmpb_tl }
+ \DeclareSymbolFont \c__xeCJK_math_tl
+ \c__xeCJK_encoding_tl \c__xeCJK_math_family_tl \mddefault \shapedefault
+ \SetSymbolFont \c__xeCJK_math_tl { bold }
+ \c__xeCJK_encoding_tl \c__xeCJK_math_family_tl \bfdefault \shapedefault
+ \int_const:Nn \c_xeCJK_math_fam_int { \use:c { sym \c__xeCJK_math_tl } }
+ \clist_concat:NNN
+ \l__xeCJK_tmpa_clist \c__xeCJK_CJK_chars_clist \c__xeCJK_FullLeft_chars_clist
+ \clist_concat:NNN
+ \l__xeCJK_tmpa_clist \l__xeCJK_tmpa_clist \c__xeCJK_FullRight_chars_clist
+ \clist_map_inline:Nn \l__xeCJK_tmpa_clist
+ {
+ \__xeCJK_set_char_class_aux:Nnw \xeCJK_gset_mathcode:nnnn {##1}
+ { \c_seven } { \c_xeCJK_math_fam_int }
+ }
+ }
}
-\cs_new_protected_nopar:Npn \xeCJK_set_monoscale:
+\cs_new_protected_nopar:Npn \xeCJK_gset_mathcode:nnnn #1#2#3#4
{
- \group_begin:
- \fontfamily \ttdefault \selectfont
- \fp_gset:Nn \g__xeCJK_monoscale_fp
- { \dim_to_fp:n { \c_two \tex_fontdimen:D \c_two \tex_font:D } / ( \f@size ) }
- \group_end:
+ \__xeCJK_check_num_range:nnNN {#1} {#2} \l__xeCJK_tmpa_int \l__xeCJK_tmpb_int
+ \xeCJK_int_until_do:nn { \l__xeCJK_tmpa_int > \l__xeCJK_tmpb_int }
+ {
+ \tex_global:D \XeTeXmathcode \l__xeCJK_tmpa_int = #3 ~ #4 \l__xeCJK_tmpa_int
+ \int_incr:N \l__xeCJK_tmpa_int
+ }
}
-\NewDocumentCommand \setCJKmonoexspace { } { \xeCJK_set_monoexspace: }
-\cs_new_protected_nopar:Npn \xeCJK_set_monoexspace:
+\NewDocumentCommand \xeCJKVerbAddon { }
{
- \group_begin:
- \fontfamily \ttdefault \selectfont
- \dim_gset:Nn \g__xeCJK_exspace_dim
- {
- \c_two \tex_fontdimen:D \c_two \tex_font:D
- - \fp_to_dim:n { \g__xeCJK_monoscale_fp * ( \f@size ) }
- }
- \group_end:
+ \int_compare:nNnF \etex_currentgrouplevel:D = \c_zero
+ {
+ \__xeCJK_set_verb_exspace:
+ \bool_if:NF \l__xeCJK_verb_addon_bool
+ {
+ \bool_set_true:N \l__xeCJK_verb_addon_bool
+ \__xeCJK_set_char_class_eq:nn { CJK } { FullLeft }
+ \__xeCJK_set_char_class_eq:nn { CJK } { FullRight }
+ \__xeCJK_set_char_class_eq:nn { Default } { HalfLeft }
+ \__xeCJK_set_char_class_eq:nn { Default } { HalfRight }
+ \__xeCJK_set_char_class_eq:nn { Default } { NormalSpace }
+ \xeCJKsetup { xCJKecglue = false }
+ \cs_set_protected_nopar:Npn \CJKglue
+ { \skip_horizontal:N \g__xeCJK_verb_exspace_skip }
+ \cs_set_protected_nopar:Npn \CJKecglue
+ { \skip_horizontal:N 0.5 \g__xeCJK_verb_exspace_skip }
+ \cs_set_eq:NN \xeCJK_check_for_glue: \CJKecglue
+ \cs_set_eq:NN \xeCJK_ignore_spaces:w \CJKecglue
+ \skip_set:Nn \tex_rightskip:D { \c_zero_dim plus 1 fil }
+ }
+ }
}
-\NewDocumentCommand \CJKfixedspacing { }
+\bool_new:N \l__xeCJK_verb_addon_bool
+\cs_new_eq:NN \CJKfixedspacing \xeCJKVerbAddon
+\__xeCJK_after_preamble:n
+ { \xeCJK_cs_add:Nnn \verbatim@font { } { \xeCJKVerbAddon } }
+\cs_new_protected_nopar:Npn \__xeCJK_set_verb_exspace:
{
- \bool_if:NF \l__xeCJK_fixed_spacing_bool
+ \tl_if_exist:cTF { xeCJK/verb/\curr@fontshape/\f@size }
+ {
+ \skip_gset:Nn \g__xeCJK_verb_exspace_skip
+ { \tl_use:c { xeCJK/verb/\curr@fontshape/\f@size } }
+ }
{
- \bool_set_true:N \l__xeCJK_fixed_spacing_bool
- \tl_set_eq:NN \l__xeCJK_flexible_punctstyle_tl \l_xeCJK_punctstyle_tl
- \bool_set_eq:NN \l__xeCJK_fixed_xecglue_bool \l__xeCJK_xecglue_bool
- \cs_set_eq:NN \__xeCJK_flexible_ecglue: \CJKecglue
- \cs_set_eq:NN \__xeCJK_flexible_cjkglue: \CJKglue
- \xeCJK_set_monoexspace:
- \xeCJKsetup
+ \skip_gset:Nn \g__xeCJK_verb_exspace_skip
{
- PunctStyle = plain ,
- CJKglue = { \skip_horizontal:N \g__xeCJK_exspace_dim } ,
- CJKecglue = { \skip_horizontal:n { .5\g__xeCJK_exspace_dim } } ,
- xCJKecglue = false ,
+ \dim_max:nn
+ { \c_zero_dim }
+ { \c_two \tex_fontdimen:D \c_two \tex_font:D - \f@size pt }
}
+ \tl_gset:cV { xeCJK/verb/\curr@fontshape/\f@size } \g__xeCJK_verb_exspace_skip
}
}
-\NewDocumentCommand \CJKflexiblespacing { }
+\skip_new:N \g__xeCJK_verb_exspace_skip
+\cs_new_protected_nopar:Npn \xeCJK_visible_space_fallback:
+ { {
+ \cs_if_exist_use:cF { xeCJK/space/\curr@fontshape/\f@size }
+ { \xeCJK_set_visible_space_font: }
+ \textvisiblespace
+ } }
+\AtEndOfPackage
{
- \bool_if:NT \l__xeCJK_fixed_spacing_bool
+ \xeCJK_cs_add:Nnn \fontspec_visible_space: { \scan_stop: } { }
+ \cs_gset_eq:NN \fontspec_visible_space_fallback: \xeCJK_visible_space_fallback:
+ }
+\cs_new_protected_nopar:Npn \xeCJK_set_visible_space_font:
+ {
+ \tl_set:Nx \l__xeCJK_current_coor_tl { xeCJK/space/\curr@fontshape/\f@size }
+ \dim_set:Nn \l__xeCJK_tmp_dim { \tex_fontdimen:D \c_two \tex_font:D }
+ \fontencoding { \g_fontspec_encoding_tl }
+ \fontfamily { lmtt }
+ \selectfont
+ \dim_compare:nNnF \l__xeCJK_tmp_dim = { \tex_fontdimen:D \c_two \tex_font:D }
{
- \bool_set_false:N \l__xeCJK_fixed_spacing_bool
- \exp_args:Nx \xeCJKsetup
+ \fontsize
{
- PunctStyle = { \l__xeCJK_flexible_punctstyle_tl } ,
- CJKglue = { \exp_not:o { \__xeCJK_flexible_cjkglue: } } ,
- CJKecglue = { \exp_not:o { \__xeCJK_flexible_ecglue: } } ,
- xCJKecglue = { \bool_if:NTF \l__xeCJK_fixed_xecglue_bool { true } { false } } ,
+ \dim_eval:n
+ {
+ \f@size pt * \dim_ratio:nn
+ { \l__xeCJK_tmp_dim } { \tex_fontdimen:D \c_two \tex_font:D }
+ }
}
+ { \f@baselineskip }
+ \selectfont
}
+ \xeCJK_font_gset_to_current:c { \l__xeCJK_current_coor_tl }
}
-\bool_new:N \l__xeCJK_fixed_spacing_bool
-\__xeCJK_AfterPreamble:n { \tl_put_right:Nn \verbatim@font \CJKfixedspacing }
-\NewDocumentCommand \setCJKmonofont { s t+ O{} m }
+\keys_define:nn { xeCJK / options }
{
- \IfBooleanTF {#1}
- { \xeCJK_set_family:xnn \CJKttdefault { Mono = Scale, #3 } {#4} }
+ LocalConfig .choice: ,
+ LocalConfig / false .code:n =
+ { \bool_gset_false:N \g__xeCJK_config_bool } ,
+ LocalConfig / true .code:n =
{
- \IfBooleanTF {#2}
- { \xeCJK_set_family:xnn \CJKttdefault { Mono = Exspace, #3 } {#4} }
- { \xeCJK_set_family:xnn \CJKttdefault {#3} {#4} }
- }
+ \bool_gset_true:N \g__xeCJK_config_bool
+ \tl_gset:Nn \g__xeCJK_config_name_tl { xeCJK }
+ } ,
+ LocalConfig / unknown .code:n =
+ {
+ \bool_gset_true:N \g__xeCJK_config_bool
+ \tl_gset:Nx \g__xeCJK_config_name_tl { xeCJK - \l_keys_value_tl }
+ } ,
+ LocalConfig .default:n = { true }
+ }
+\tl_new:N \g__xeCJK_config_name_tl
+\bool_new:N \g__xeCJK_config_bool
+\keys_define:nn { xeCJK / options }
+ {
+ CJKnumber .bool_gset:N = \g__xeCJK_number_bool ,
+ indentfirst .bool_gset:N = \g__xeCJK_indent_bool ,
+ normalindentfirst .meta:n = { indentfirst = false }
}
-\bool_new:N \g__xeCJK_indent_bool
\keys_define:nn { xeCJK / options }
{
- CJKnumber .bool_set:N = \g__xeCJK_number_bool ,
- indentfirst .bool_set:N = \g__xeCJK_indent_bool ,
- normalindentfirst .meta:n = { indentfirst = false } ,
quiet .code:n =
{
\msg_redirect_module:nnn { xeCJK } { warning } { info }
\msg_redirect_module:nnn { xeCJK } { info } { none }
\xeCJK_if_package_loaded:nF { fontspec }
{ \PassOptionsToPackage { quiet } { fontspec } }
- },
+ } ,
silent .code:n =
{
\msg_redirect_module:nnn { xeCJK } { warning } { none }
\msg_redirect_module:nnn { xeCJK } { info } { none }
\xeCJK_if_package_loaded:nF { fontspec }
{ \PassOptionsToPackage { silent } { fontspec } }
- },
+ } ,
unknown .code:n =
{
\xeCJK_if_package_loaded:nTF { fontspec }
{ \__xeCJK_error:nx { key-unknown } { \l_keys_key_tl } }
{ \PassOptionsToPackage { \l_keys_key_tl } { fontspec } }
- },
+ }
}
\__xeCJK_msg_new:nn { key-unknown }
{
Sorry,~but~\l__keys_module_tl \ does~not~have~a~key~called~'#1'.\\\\
The~key~'#1'~is~being~ignored.
}
+\cs_new_nopar:Npn \CJKsymbol #1 {#1}
+\cs_new_nopar:Npn \CJKpunctsymbol #1 {#1}
\keys_set:nn { xeCJK / options }
{
- CJKglue = { \skip_horizontal:n { \c_zero_skip \@plus .08\baselineskip } } ,
+ CJKglue = { \skip_horizontal:n { \c_zero_dim plus 0.08 \tex_baselineskip:D } } ,
CJKecglue = \c_space_token ,
xCJKecglue = false ,
CheckSingle = false ,
CJKspace = false ,
CJKmath = false ,
+ CJKnumber = false ,
xeCJKactive = true ,
+ LocalConfig = true ,
indentfirst = true ,
- EmboldenFactor = 4 ,
- SlantFactor = .167 ,
+ EmboldenFactor = 4 ,
+ SlantFactor = 0.167 ,
PunctStyle = quanjiao ,
KaiMingPunct = { ^^^^3002 ^^^^ff0e ^^^^ff1f ^^^^ff01 } ,
LongPunct = { ^^^^2014 ^^^^2015 ^^^^2500 ^^^^2025 ^^^^2026 } ,
MiddlePunct = { ^^^^2014 ^^^^2015 ^^^^2500 ^^^^00b7 ^^^^30fb ^^^^ff65 } ,
- AllowBreakBetweenPuncts = false ,
+ AllowBreakBetweenPuncts = false
}
-\cs_new_nopar:Npn \CJKsymbol #1 {#1}
-\cs_new_nopar:Npn \CJKpunctsymbol #1 {#1}
+\defaultCJKfontfeatures { Script = CJK }
\ProcessKeysOptions { xeCJK / options }
\RequirePackage { fontspec } [ 2011/09/13 ]
\tl_const:Nx \c__xeCJK_encoding_tl { \g_fontspec_encoding_tl }
-\bool_if:NT \g__xeCJK_indent_bool
+\bool_if:NT \g__xeCJK_indent_bool { \RequirePackage { indentfirst } }
+\keys_define:nn { xeCJK / options }
+ {
+ LocalConfig .code:n = { \__xeCJK_warning:nx { option-invalid } { \l_keys_key_tl } } ,
+ CJKnumber .code:n = { \__xeCJK_warning:nx { option-invalid } { \l_keys_key_tl } } ,
+ indentfirst .code:n = { \__xeCJK_warning:nx { option-invalid } { \l_keys_key_tl } }
+ }
+\__xeCJK_msg_new:nn { option-invalid }
{
- \cs_set_eq:NN \@afterindentfalse \@afterindenttrue
- \@afterindenttrue
+ The~`#1'~option~only~can~be~set~in~the~optional~argument~to~the\\
+ \token_to_str:N \usepackage \ command~when~xeCJK~is~being~loaded.\\\\
+ Please~do~not~set~it~via~the~\token_to_str:N \xeCJKsetup \ command.
}
+\tl_if_exist:NF \CJKrmdefault { \tl_gset:Nn \CJKrmdefault { rm } }
+\tl_if_exist:NF \CJKsfdefault { \tl_gset:Nn \CJKsfdefault { sf } }
+\tl_if_exist:NF \CJKttdefault { \tl_gset:Nn \CJKttdefault { tt } }
+\tl_if_exist:NF \CJKfamilydefault { \tl_gset:Nn \CJKfamilydefault { \CJKrmdefault } }
+\tl_new:c { \__xeCJK_family_csname:n { \CJKfamilydefault } }
\NewDocumentCommand \xeCJKsetup { m }
{
\keys_set:nn { xeCJK / options } {#1}
@@ -2216,28 +2417,59 @@
\NewDocumentCommand \xeCJKsetslantfactor { m }
{ \xeCJKsetup { SlantFactor = {#1} } }
\NewDocumentCommand \punctstyle { m } { \xeCJKsetup { PunctStyle = {#1} } }
-\NewDocumentCommand \xeCJKplainchr { } { \punctstyle { plain } }
+\NewDocumentCommand \xeCJKplainchr { } { \xeCJKsetup { PunctStyle = plain } }
\NewDocumentCommand \CJKsetecglue { m } { \xeCJKsetup { CJKecglue = {#1} } }
\cs_new_eq:NN \xeCJKsetecglue \CJKsetecglue
-\cs_new_protected_nopar:Npn \__xeCJK_fix_itcorr:
+\NewDocumentCommand \CJKspace { } { \xeCJKsetup { CJKspace = true } }
+\NewDocumentCommand \CJKnospace { } { \xeCJKsetup { CJKspace = false } }
+\NewDocumentCommand \xeCJKallowbreakbetweenpuncts { }
+ { \xeCJKsetup { AllowBreakBetweenPuncts = true } }
+\NewDocumentCommand \xeCJKnobreakbetweenpuncts { }
+ { \xeCJKsetup { AllowBreakBetweenPuncts = false } }
+\xeCJK_cs_add:Nnn \rmfamily { \CJKfamily { \CJKrmdefault } } { }
+\xeCJK_cs_add:Nnn \sffamily { \CJKfamily { \CJKsfdefault } } { }
+\xeCJK_cs_add:Nnn \ttfamily { \CJKfamily { \CJKttdefault } } { }
+\xeCJK_cs_add:Nnn \normalfont { \CJKfamily { \CJKfamilydefault } } { }
+\cs_set_eq:NN \reset@font \normalfont
+\xeCJK_cs_add:Nnn \fontspec_init: { \__xeCJK_gobble_CJKfamily: } { }
+\cs_new_eq:NN \xeCJK@fix@penalty \fix@penalty
+\xeCJK_cs_patch:Nnn \xeCJK@fix@penalty \@@italiccorr \xeCJK@patch@italiccorr
+\xeCJK_cs_patch:Nnn \sw@slant \fix@penalty \xeCJK@fix@penalty
+\cs_new_protected_nopar:Npn \xeCJK@patch@italiccorr
{
- \scan_stop:
- \xeCJK_if_last_node:nTF { default }
+ \int_compare:nNnTF \XeTeXinterchartokenstate > \c_zero
{
- \tex_unkern:D \tex_unkern:D
- \__xeCJK_itcorr_aux
- { \xeCJK_make_node:n { default_itcorr } }
+ \xeCJK_if_last_node:nTF { default }
+ {
+ \tex_unkern:D \tex_unkern:D \@@italiccorr
+ { \xeCJK_make_node:n { default } }
+ }
+ {
+ \xeCJK_if_last_node:nTF { CJK }
+ {
+ \tex_unkern:D \tex_unkern:D \@@italiccorr
+ { \xeCJK_make_node:n { CJK } } \use:n
+ }
+ {
+ \xeCJK_if_last_node:nTF { CJK-space }
+ {
+ \tex_unkern:D \tex_unkern:D \@@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_itcorr_aux }
- }
-\cs_new_eq:NN \__xeCJK_itcorr_aux \/
-\cs_set_protected_nopar:Npn \/
- {
- \int_compare:nNnTF \XeTeXinterchartokenstate > \c_zero
- { \__xeCJK_fix_itcorr: } { \__xeCJK_itcorr_aux }
+ { \@@italiccorr }
}
-\cs_set_eq:NN \@@italiccorr \/
-\__xeCJK_AfterEndPreamble:n
+\__xeCJK_after_end_preamble:n
{
\int_compare:nNnF
{ \c_three + ( \seq_count:N \g__xeCJK_class_seq ) } = \xe@alloc@intercharclass
@@ -2252,32 +2484,30 @@
\cs_new_protected_nopar:Npn \__xeCJK_set_others_toks:n #1
{
\int_set:Nn \c__xeCJK_Others_class_int {#1}
- \clist_map_inline:Nn \g__xeCJK_CJK_class_clist
- {
- \__xeCJK_copy_inter_class_toks:nnnn {##1} { Others } {##1} { NormalSpace }
- \__xeCJK_copy_inter_class_toks:nnnn { Others } {##1} { NormalSpace } {##1}
- \exp_args:Nnnx \__xeCJK_app_inter_class_toks:nnn {##1} { Others }
- { \__xeCJK_get_inter_class_toks:nn { Default } { Others } }
- \exp_args:Nnnx \__xeCJK_pre_inter_class_toks:nnn { Others } {##1}
- { \__xeCJK_get_inter_class_toks:nn { Others } { Default } }
+ \seq_map_inline:Nn \g__xeCJK_CJK_class_seq
+ {
+ \xeCJK_copy_inter_class_toks:nnnn {##1} { Others } {##1} { NormalSpace }
+ \xeCJK_copy_inter_class_toks:nnnn { Others } {##1} { NormalSpace } {##1}
+ \xeCJK_app_inter_class_toks:nnx {##1} { Others }
+ { \xeCJK_get_inter_class_toks:nn { Default } { Others } }
+ \xeCJK_pre_inter_class_toks:nnx { Others } {##1}
+ { \xeCJK_get_inter_class_toks:nn { Others } { Default } }
\xeCJK_if_blank_x:nT
- { \__xeCJK_get_inter_class_toks:nn { Others } { Boundary } }
+ { \xeCJK_get_inter_class_toks:nn { Others } { Boundary } }
{
- \__xeCJK_copy_inter_class_toks:nnnn
+ \xeCJK_copy_inter_class_toks:nnnn
{ Others } { Boundary } { Default } { Boundary }
}
\xeCJK_if_blank_x:nT
- { \__xeCJK_get_inter_class_toks:nn { Boundary } { Others } }
+ { \xeCJK_get_inter_class_toks:nn { Boundary } { Others } }
{
- \__xeCJK_copy_inter_class_toks:nnnn
+ \xeCJK_copy_inter_class_toks:nnnn
{ Boundary } { Others } { Boundary } { Default }
}
}
}
-\int_new:N \c__xeCJK_Others_class_int
-\cs_new_protected_nopar:Npn \__xeCJK_patch:Nnn #1#2#3
- { \tl_put_left:Nn #1 {#2} \tl_put_right:Nn #1 {#3} }
-\__xeCJK_AfterPreamble:n
+\cs_new_eq:NN \c__xeCJK_Others_class_int \l__xeCJK_tmpa_int
+\__xeCJK_after_preamble:n
{
\tl_map_inline:nn
{
@@ -2285,123 +2515,121 @@
\textquoteleft \textquoteright \textquotedblleft \textquotedblright
}
{
- \__xeCJK_patch:Nnn #1
- { \__xeCJK_group_begin: \makexeCJKinactive }
- { \__xeCJK_group_end: }
+ \xeCJK_cs_add:Nnn #1
+ { \__xeCJK_group_begin: \makexeCJKinactive } { \__xeCJK_group_end: }
}
- \__xeCJK_patch:Nnn \tipaencoding { \makexeCJKinactive } { }
- \cs_set_eq:NN \__xeCJK_aux_r \r
- \cs_set_protected_nopar:Npn \r #1 { { \makexeCJKinactive \__xeCJK_aux_r {#1} } }
+ \xeCJK_cs_add:Nnn \tipaencoding { \makexeCJKinactive } { }
+ \cs_new_eq:NN \__xeCJK_aux_r:n \r
+ \cs_set_nopar:Npn \r #1 { { \makexeCJKinactive \__xeCJK_aux_r:n {#1} } }
\xeCJK_if_package_loaded:nT { pifont }
- {
- \RenewDocumentCommand \Pifont { m }
- { \makexeCJKinactive \usefont {U} {#1} {m} {n} }
- }
+ { \xeCJK_cs_add:Nnn \Pifont { \makexeCJKinactive } { } }
}
\cs_new_eq:NN \__xeCJK_group_begin: \group_begin:
\cs_new_eq:NN \__xeCJK_group_end: \group_end:
-\__xeCJK_AfterEndPreamble:n
+\__xeCJK_after_end_preamble:n
{
- \bool_if:nT
- {
- \xeCJK_if_package_loaded_p:n { hyperref } &&
- \tl_if_exist_p:N \pdfstringdefPreHook
- }
+ \xeCJK_if_package_loaded:nT { hyperref }
{
\tl_gput_right:Nn \pdfstringdefPreHook
{
- \cs_set_eq:NN \makexeCJKinactive \prg_do_nothing:
- \cs_set_eq:NN \__xeCJK_group_begin: \prg_do_nothing:
- \cs_set_eq:NN \__xeCJK_group_end: \prg_do_nothing:
- \cs_set_eq:NN \CJKfamily \use_none:n
+ \__xeCJK_gobble_CJKfamily:
+ \xeCJK_cs_clear:N \makexeCJKinactive
+ \xeCJK_cs_clear:N \__xeCJK_group_begin:
+ \xeCJK_cs_clear:N \__xeCJK_group_end:
}
}
}
-\tl_set:cn { ver@CJK.sty } { 2100/01/01 }
-\cs_if_free:NT \CJK@ifundefined
+\__xeCJK_after_end_preamble:n
+ {
+ \bool_if:nT
+ { \xeCJK_if_package_loaded_p:n { cprotect } && \cs_if_exist_p:N \icprotect }
+ { \exp_after:wN \tex_let:D \cs:w cprotect \cs_end: \icprotect }
+ }
+\tl_set:cn { ver@CJK.sty } { 9999/99/99 }
+\tl_set_eq:cc { ver@CJKpunct.sty } { ver@CJK.sty }
+\cs_if_exist:NF \CJK@ifundefined
{ \cs_set_eq:NN \CJK@ifundefined \cs_if_free:NTF }
\NewDocumentCommand \xeCJKcaption { o m }
{
\IfNoValueF {#1} { \XeTeXdefaultencoding "#1" }
- \cs_set_nopar:Npx \__xeCJK_reset_at_catcode:
+ \use:x
{
- \exp_not:n { \char_set_catcode:nn { `\@ } }
- { \char_value_catcode:n { `\@ } }
+ \char_set_catcode_letter:n { 64 }
+ \file_input:n { #2.cpx }
+ \char_set_catcode:nn { 64 } { \char_value_catcode:n { 64 } }
}
- \char_set_catcode_letter:N \@
- \file_input:n { #2.cpx }
- \__xeCJK_reset_at_catcode:
\XeTeXdefaultencoding "UTF-8"
}
-\cs_new_protected_nopar:Npn \xeCJK_ULprepunctchar:n #1
- {
- { \makexeCJKinactive \CJKpunctsymbol {#1} \xeCJK_no_break: }
- \tex_ignorespaces:D
- }
-\cs_new_protected_nopar:Npn \xeCJK_ULpostpunctchar:n #1
- {
- { \makexeCJKinactive \CJKpunctsymbol {#1} }
- \xeCJK_ignorespaces:
- }
-\cs_new_protected_nopar:Npn \xeCJK_ULroutines:
+\cs_new_protected_nopar:Npn \xeCJK_hook_for_ulem:
{
- \__xeCJK_inter_class_toks:nnn { Default } { CJK } { \CJKecglue \CJKsymbol }
- \__xeCJK_inter_class_toks:nnn { HalfLeft } { CJK } { \CJKsymbol }
- \__xeCJK_inter_class_toks:nnn { HalfRight } { CJK } { \CJKecglue \CJKsymbol }
- \__xeCJK_inter_class_toks:nnn { Boundary } { CJK } { \xeCJK_Boundary_and_CJK: }
- \clist_map_inline:nn { Default, HalfLeft, HalfRight, Boundary }
+ \bool_if:NF \l__xeCJK_ulem_hook_used_bool
{
- \__xeCJK_inter_class_toks:nnn {##1} { FullLeft } { \xeCJK_ULprepunctchar:n }
- \__xeCJK_inter_class_toks:nnn {##1} { FullRight } { \xeCJK_ULpostpunctchar:n }
+ \bool_set_true:N \l__xeCJK_ulem_hook_used_bool
+ \xeCJK_cs_clear:N \__xeCJK_CJK_FullLeft_glue:
+ \cs_set_protected_nopar:Npn \__xeCJK_FullLeft_ulem_hook: { { \CJKglue } }
+ \xeCJK_swap_cs:NN \CJKsymbol \__xeCJK_ulem_CJKsymbol:N
+ \xeCJK_swap_cs:NN \CJKpunctsymbol \__xeCJK_ulem_CJKpunctsymbol:N
}
- \__xeCJK_UL_subclass_patch_tl
}
-\__xeCJK_AfterPreamble:n
+\bool_new:N \l__xeCJK_ulem_hook_used_bool
+\__xeCJK_after_preamble:n
{
- \cs_if_exist:NT \UL@hook
+ \xeCJK_if_package_loaded:nT { ulem }
{
- \addto@hook \UL@hook
+ \xeCJK_cs_gclear:N \__xeCJK_FullLeft_ulem_hook:
+ \xeCJK_pre_inter_class_toks:nnn { Boundary } { FullLeft }
+ { \__xeCJK_FullLeft_ulem_hook: }
+ \cs_if_exist:NTF \XeTeX@CJKfntef@hook
{
- \cs_set_eq:NN \__xeCJK_UL_CJKsymbol \CJKsymbol
- \cs_set_eq:NN \__xeCJK_UL_CJKpunctsymbol \CJKpunctsymbol
- \cs_set_protected_nopar:Npn \CJKsymbol #1
- {
- { \xeCJK_select_font: \__xeCJK_UL_CJKsymbol {#1} }
- { \xeCJK_make_node:n { CJK } } \xeCJK_ignorespaces:
- }
- \cs_set_protected_nopar:Npn \CJKpunctsymbol #1
- { { \xeCJK_select_font: \__xeCJK_UL_CJKpunctsymbol {#1} } }
- \xeCJK_ULroutines:
+ \xeCJK_cs_gclear:N \CJKf@global
+ \AtBeginEnvironment
+ { CJKfilltwosides } { \cs_set_eq:NN \CJKglue \tex_hfil:D }
+ \cs_set_protected_nopar:Npn \XeTeX@CJKfntef@hook
+ { \xeCJK_select_font: \makexeCJKinactive }
}
- }
- \cs_if_exist:NT \XeTeX@CJKfntef@hook
- {
- \cs_set_nopar:Npn \XeTeX@CJKfntef@hook
- { \xeCJK_select_font: \makexeCJKinactive }
+ { \RequirePackage { CJKulem } }
+ \addto@hook \UL@hook { \xeCJK_hook_for_ulem: }
}
}
+\cs_new_protected_nopar:Npn \__xeCJK_ulem_CJKsymbol:N #1
+ {
+ { \__xeCJK_ulem_CJKsymbol:N {#1} }
+ { \xeCJK_make_node:n { CJK } } \xeCJK_ignore_spaces:w
+ }
+\cs_new_protected_nopar:Npn \__xeCJK_ulem_CJKpunctsymbol:N #1
+ { { \__xeCJK_ulem_CJKpunctsymbol:N {#1} } \tex_ignorespaces:D }
\bool_if:NT \g__xeCJK_number_bool
{
\tl_set:Nn \CJK@UnicodeEnc { UTF8 }
- \cs_set_protected_nopar:Npn \CJKaddEncHook #1#2
- { \cs_set_nopar:cpn { __xeCJK_enc_#1 } {#2} }
+ \cs_set_protected:Npn \CJKaddEncHook #1#2
+ { \cs_set:cpn { __xeCJK_enc_#1_hook: } {#2} }
\cs_set_protected_nopar:Npn \Unicode #1#2
- { \tex_char:D \int_eval:n { (#1) * \c_two_hundred_fifty_six + (#2) } }
+ { \tex_char:D \etex_numexpr:D (#1) * \c_two_hundred_fifty_six + (#2) \scan_stop: }
\RequirePackage { CJKnumb }
- \cs_if_exist_use:cT { __xeCJK_enc_\CJK@UnicodeEnc } { }
- \tl_set:Nx \CJK@tenthousand { ^^^^4e07 }
- \tl_set:Nx \CJK@hundredmillion { ^^^^4ebf }
+ \cs_if_exist_use:c { __xeCJK_enc_ \CJK@UnicodeEnc _hook: }
+ \tl_set:Nn \CJK@tenthousand { \Unicode { 78 } { 7 } }
+ \tl_set:Nn \CJK@hundredmillion { \Unicode { 78 } { 191 } }
+ }
+\bool_if:NT \g__xeCJK_config_bool
+ {
+ \tl_const:Nn \c__xeCJK_config_ext_tl { cfg }
+ \@onefilewithoptions
+ { \g__xeCJK_config_name_tl } [ ] [ ] { \c__xeCJK_config_ext_tl }
}
%%
%% This package consists of the file xeCJK.dtx
%% and the derived files xeCJK.pdf,
%% xeCJK.sty,
+%% xeCJK.cfg,
%% xeCJK.ins,
%% xeCJK-example-autofake.tex,
%% xeCJK-example-fallback.tex,
%% xeCJK-example-subCJKblock.tex,
%% xeCJK-example-CJKecglue.tex,
-%% xeCJK-example-checksingle.tex and
+%% xeCJK-example-checksingle.tex,
+%% xeCJK-example-CJKfntef.tex,
+%% xeCJK-example-punctstyle.tex,
+%% xeCJK-example-verbatim.tex, and
%% README.txt.
%%
%% End of file `xeCJK.sty'.