diff options
9 files changed, 990 insertions, 808 deletions
diff --git a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-CJKecglue.tex b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-CJKecglue.tex index 477049325d2..ef8a3b62299 100644 --- a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-CJKecglue.tex +++ b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-CJKecglue.tex @@ -6,7 +6,7 @@ %% %% xeCJK.dtx (with options: `ex-ecglue') %% -%% $Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +%% $Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ %% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% ----------------------------------------------------------------- %% Author: diff --git a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-autofake.tex b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-autofake.tex index 472546bd3b1..bf52fd28ead 100644 --- a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-autofake.tex +++ b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-autofake.tex @@ -6,7 +6,7 @@ %% %% xeCJK.dtx (with options: `ex-autofake') %% -%% $Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +%% $Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ %% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% ----------------------------------------------------------------- %% Author: diff --git a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-checksingle.tex b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-checksingle.tex index d1e6be31b2c..0c8766ad1e9 100644 --- a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-checksingle.tex +++ b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-checksingle.tex @@ -6,7 +6,7 @@ %% %% xeCJK.dtx (with options: `ex-single') %% -%% $Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +%% $Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ %% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% ----------------------------------------------------------------- %% Author: diff --git a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-fallback.tex b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-fallback.tex index 3e612d908e1..8ddc4ea3790 100644 --- a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-fallback.tex +++ b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-fallback.tex @@ -6,7 +6,7 @@ %% %% xeCJK.dtx (with options: `ex-fallback') %% -%% $Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +%% $Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ %% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% ----------------------------------------------------------------- %% Author: diff --git a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-subCJKblock.tex b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-subCJKblock.tex index fb086d93b84..4bf68423861 100644 --- a/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-subCJKblock.tex +++ b/Master/texmf-dist/doc/xelatex/xecjk/example/xeCJK-example-subCJKblock.tex @@ -6,7 +6,7 @@ %% %% xeCJK.dtx (with options: `ex-block') %% -%% $Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +%% $Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ %% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% ----------------------------------------------------------------- %% Author: diff --git a/Master/texmf-dist/doc/xelatex/xecjk/xeCJK.pdf b/Master/texmf-dist/doc/xelatex/xecjk/xeCJK.pdf Binary files differindex 935d6460b9a..d5d1ec0d0a4 100644 --- a/Master/texmf-dist/doc/xelatex/xecjk/xeCJK.pdf +++ b/Master/texmf-dist/doc/xelatex/xecjk/xeCJK.pdf diff --git a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx index 479609c2674..0dff701f6bc 100644 --- a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx +++ b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx @@ -70,7 +70,7 @@ CJK scripts fonts (TrueType or OpenType). \askforoverwritefalse \preamble -$Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +$Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ ----------------------------------------------------------------- Author: @@ -133,7 +133,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % %<*driver|package> \NeedsTeXFormat{LaTeX2e} -%<driver>\ProvidesFile{xeCJK.dtx} +%<*driver> +\ProvidesFile{xeCJK.dtx} +%</driver> \RequirePackage{expl3} %</driver|package> % @@ -175,9 +177,15 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \@addtoreset{CodelineNo}{section} \def\tokslink#1{\hyperlink{#1}{\ding{51}}} \makeatother +\def\indexname{代码索引} +\IndexPrologue{% + \section*{\indexname} + \markboth{\indexname}{\indexname} + 斜体的数字表示对应项说明所在的页码,下划线的数字表示定义所在的代码行号,而直立体的 + 数字表示对应项使用时所在的行号。} %</driver> %<*driver|package> -\GetIdInfo$Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +\GetIdInfo$Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ {package for typesetting CJK scripts with XeLaTeX} %</driver|package> %<*driver> @@ -884,44 +892,35 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{\ExplFileName}{\ExplFileDate}{3.0.6}{\ExplFileDescription} +\ProvidesExplPackage{\ExplFileName}{\ExplFileDate}{3.0.7}{\ExplFileDescription} % \end{macrocode} % -% \begin{macro}[aux] -% {\xeCJK_msg_new:nn ,\xeCJK_error:n,\xeCJK_error:nx, -% \xeCJK_warning:nx,\xeCJK_info:nx,\xeCJK_info:nxx} -% \begin{macrocode} -\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 } } -% \end{macrocode} -% \end{macro} +% \subsection{运行环境检查} % % \pkg{xeCJK} 必须使用 \XeTeX 引擎的支持。 % \begin{macrocode} -\xeCJK_msg_new:nn { Require-XeTeX } +\msg_new:nnn { xeCJK } { Require-XeTeX } { The~xeCJK~package~requires~XeTeX~to~function.\\\\ You~must~change~your~typesetting~engine~to~"xelatex" \\ - instead~of~plain~"latex"~or~"pdflatex"~or~"lualatex". + instead~of~plain~"latex"~or~"pdflatex"~or~"lualatex".\\ + Loading~xeCJK~will~abort! } \xetex_if_engine:F { \msg_critical:nn { xeCJK } { Require-XeTeX } } % \end{macrocode} % +% 应该使用较新版本的 \pkg{expl3} 宏包。 % \begin{macrocode} -\xeCJK_msg_new:nn { l3-too-old } +\msg_new:nnn { xeCJK } { l3-too-old } { Support~package~'expl3'~too~old. \\\\ Please~update~an~up~to~date~version~of~the~bundles\\\\ 'l3kernel'~and~'l3packages'\\\\ - using~your~TeX~package~manager~or~from~CTAN. + using~your~TeX~package~manager~or~from~CTAN.\\ + Loading~xeCJK~will~abort! } -\@ifpackagelater { expl3 } { 2012/02/19 } { } { \xeCJK_error:n { l3-too-old } } +\@ifpackagelater { expl3 } { 2012/07/16 } { } + { \msg_critical:nn { xeCJK } { l3-too-old } } % \end{macrocode} % % \begin{macrocode} @@ -931,25 +930,182 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % |\XeTeXglyphbouds| 可以得到一个字符的左右边距,用于标点压缩。 % \begin{macrocode} -\xeCJK_msg_new:nn { XeTeX-too-old } +\msg_new:nnn { xeCJK } { XeTeX-too-old } { \token_to_str:N \XeTeXglyphbounds\c_space_tl is~not~defined.\\\\ You~have~to~update~XeTeX~to~the~version~0.9995.0~or~later. } \cs_if_free:NT \XeTeXglyphbounds { - \xeCJK_error:n { XeTeX-too-old } - \AtBeginDocument { \punctstyle { plain } } + \msg_error:nn { xeCJK } { XeTeX-too-old } + \AtEndOfPackage { \xeCJK_AfterPreamble:n { \punctstyle { plain } } } } % \end{macrocode} % -% 抑制 |BOM|。 +% \subsection{内部工具} +% +% 分配临时变量。 +% \begin{macro}[internal,var]{\l_xeCJK_tmpa_int,\l_xeCJK_tmpb_int,\l_xeCJK_tmpc_int} % \begin{macrocode} -\char_set_catcode_ignore:n { "FEFF } +\int_new:N \l_xeCJK_tmpa_int +\int_new:N \l_xeCJK_tmpb_int +\int_new:N \l_xeCJK_tmpc_int +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal,var]{\l_xeCJK_tmpa_dim,\l_xeCJK_tmpb_dim,\l_xeCJK_tmpc_dim} +% \begin{macrocode} +\dim_new:N \l_xeCJK_tmpa_dim +\dim_new:N \l_xeCJK_tmpb_dim +\dim_new:N \l_xeCJK_tmpc_dim +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal,var]{\l_xeCJK_tmpa_tl,\l_xeCJK_tmpb_tl} +% \begin{macrocode} +\tl_new:N \l_xeCJK_tmpa_tl +\tl_new:N \l_xeCJK_tmpb_tl +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal,var]{\l_xeCJK_tmpa_clist,\l_xeCJK_tmpb_clist,\l_xeCJK_tmpc_clist} +% \begin{macrocode} +\clist_new:N \l_xeCJK_tmpa_clist +\clist_new:N \l_xeCJK_tmpb_clist +\clist_new:N \l_xeCJK_tmpc_clist +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal] +% {\xeCJK_AtEndPreamble:n,\xeCJK_AfterPreamble:n,\xeCJK_AfterEndPreamble:n} +% 在 |\document| 前后加上各种钩子。 +% \begin{macrocode} +\tl_new:N \g_xeCJK_at_end_preamble_hook +\tl_new:N \g_xeCJK_after_preamble_hook +\tl_new:N \g_xeCJK_after_end_preamble_hook +\cs_new:Nn \xeCJK_AtEndPreamble:n + { \tl_gput_right:Nn \g_xeCJK_at_end_preamble_hook {#1} } +\cs_new:Nn \xeCJK_AfterPreamble:n + { \tl_gput_right:Nn \g_xeCJK_after_preamble_hook {#1} } +\cs_new:Nn \xeCJK_AfterEndPreamble:n + { \tl_gput_right:Nn \g_xeCJK_after_end_preamble_hook {#1} } +\AtBeginDocument { \g_xeCJK_after_preamble_hook } +\tl_put_left:Nn \document { \group_end: \g_xeCJK_at_end_preamble_hook \group_begin: } +\tl_put_right:Nn \document { \g_xeCJK_after_end_preamble_hook \tex_ignorespaces:D } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[pTF,internal]{\xeCJK_if_outer_macro:c} +% 判断是否是 |\outer| 宏,输入的是控制序列的名字。 +% \begin{macrocode} +\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 + { + \group_end: + \prg_new_conditional:Nnn \xeCJK_if_outer_macro:c { p , T , F , TF } + { + \exp_last_unbraced:Nf \xeCJK_if_outer_macro_aux:w + { \cs_meaning:c {#1} } OUZER ~ MAYRO ; \q_stop + } + \cs_new_nopar:Npn \xeCJK_if_outer_macro_aux:w #1 OUZER ~ MAYRO ; #2 \q_stop + { + \if_cs_exist:w c_xeCJK_prefix_ #1 _aux_tl \cs_end: + \prg_return_true: \else: \prg_return_false: \fi: + } + \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 } + } % \end{macrocode} +% \end{macro} +% +% \begin{macro}[TF,internal]{\xeCJK_peek_catcode_ignore_spaces:N} +% 对 \pkg{l3token} 打的补丁,使 |\xeCJK_peek_catcode_ignore_spaces:NTF| 可用于 |\outer| 宏。 +% \begin{macrocode} +\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 + \cs_set:Npx \xeCJK_peek_true:w + { + \exp_not:N \group_align_safe_end: + \exp_not:n {#2} + } + \cs_set:Npx \xeCJK_peek_false:w + { + \exp_not:N \group_align_safe_end: + \exp_not:n {#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:Nn \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: + } +\cs_new_protected_nopar:Nn \xeCJK_peek_ignore_spaces_execute_branches_aux: + { \peek_after:Nw \xeCJK_peek_ignore_spaces_execute_branches: } +\cs_new_nopar:Nn \xeCJK_peek_execute_branches_catcode: + { + \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: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[pTF,internal]{\xeCJK_tl_if_blank:x} +% 判断是否为空或者仅含一个空格。 +% \begin{macrocode} +\prg_new_conditional:Nnn \xeCJK_tl_if_blank:x { p , T , F , TF } + { + \if_int_compare:w \pdftex_strcmp:D { \c_empty_tl } {#1} = \c_zero + \prg_return_true: + \else: + \if_int_compare:w \pdftex_strcmp:D { \c_space_tl } {#1} = \c_zero + \prg_return_true: \else: \prg_return_false: \fi: + \fi: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal] +% {\xeCJK_msg_new:nn ,\xeCJK_error:n,\xeCJK_error:nx, +% \xeCJK_warning:nx,\xeCJK_info:nx,\xeCJK_info:nxx} +% 各种信息函数的缩略形式。 +% \begin{macrocode} +\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 } } +% \end{macrocode} +% \end{macro} +% +% \subsection{功能开关} % % \begin{macro}{xeCJKactive} -% \pkg{xeCJK} 功能开关。 % \begin{macrocode} \keys_define:nn { xeCJK / options } { @@ -968,6 +1124,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % +% 抑制 |BOM|。 +% \begin{macrocode} +\char_set_catcode_ignore:n { "FEFF } +% \end{macrocode} +% % \subsection{字符类别设定}\label{sec:xeCJK-class-set} % % \pkg{xeCJK} 需要以下字符类别用于字符输出。其中 |Default|、|CJK|、|FullLeft|、 @@ -1054,20 +1215,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \begin{macro}[pTF,internal]{\tl_if_blank:x} -% \begin{macrocode} -\prg_set_conditional:Nnn \tl_if_blank:x { p , T , F , TF } - { - \if_int_compare:w \pdftex_strcmp:D { \c_empty_tl } {#1} = \c_zero - \prg_return_true: - \else: - \if_int_compare:w \pdftex_strcmp:D { \c_space_tl } {#1} = \c_zero - \prg_return_true: \else: \prg_return_false: \fi: - \fi: - } -% \end{macrocode} -% \end{macro} -% % \begin{macro}{\xeCJKDeclareCharClass} % \begin{macro}[aux]{\xeCJK_setcharclass_aux:Nn} % 用于设置字符所属的类别,|#1| 为类别名称,|#2| 为字符的 |Unicode|,相邻字符用 @@ -1078,7 +1225,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \clist_gput_right:cx { g_xeCJK_#1_range_clist } {#2} \clist_map_inline:xn {#2} { - \str_if_eq:xxF {##1} { -> } + \str_if_eq_x:nnF {##1} { -> } { \xeCJK_setcharclass_aux:Nn \xeCJKsetcharclass {##1} { \xeCJK_class_num:n {#1} } @@ -1097,16 +1244,16 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \NewDocumentCommand \xeCJKsetcharclass { m m m } { - \xeCJK_check_num_range:nnNN {#1} {#2} \l_tmpa_int \l_tmpb_int - \int_set:Nn \l_tmpc_int {#3} - \prop_if_in:NVTF \g_xeCJK_CJK_class_prop \l_tmpc_int + \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 { \cs_set_eq:NN \xeCJK_set_catcode:n \char_set_catcode_other:n } { \cs_set_eq:NN \xeCJK_set_catcode:n \use_none:n } \loop - \xeCJK_set_catcode:n \l_tmpa_int - \XeTeXcharclass \l_tmpa_int = \l_tmpc_int - \if_int_compare:w \l_tmpa_int < \l_tmpb_int - \int_incr:N \l_tmpa_int + \xeCJK_set_catcode:n \l_xeCJK_tmpa_int + \XeTeXcharclass \l_xeCJK_tmpa_int = \l_xeCJK_tmpc_int + \if_int_compare:w \l_xeCJK_tmpa_int < \l_xeCJK_tmpb_int + \int_incr:N \l_xeCJK_tmpa_int \repeat } % \end{macrocode} @@ -1116,9 +1263,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \cs_new_nopar:Nn \xeCJK_check_num_range:nnNN { - \bool_if:nTF { \tl_if_blank_p:x {#1} || \tl_if_blank_p:x {#2} } + \bool_if:nTF { \xeCJK_tl_if_blank_p:x {#1} || \xeCJK_tl_if_blank_p:x {#2} } { - \int_set:Nn #3 { \tl_if_blank:xTF {#1} {#2} {#1} } + \int_set:Nn #3 { \xeCJK_tl_if_blank:xTF {#1} {#2} {#1} } \int_set_eq:NN #3 #4 } { @@ -1515,18 +1662,15 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \tex_unskip:D \bool_if:nTF - { - \int_compare_p:nNn \tex_lastkern:D = \c_one || - \int_compare_p:nNn \tex_lastkern:D = \c_two - } + { \xeCJK_if_last_node_p:n { CJK } || \xeCJK_if_last_node_p:n { CJK_space } } { \CJKecglue } { \c_space_token } } { - \int_compare:nNnTF \tex_lastkern:D = \c_one { \CJKecglue } - { \int_compare:nNnT \tex_lastkern:D = \c_two \xeCJK_space_or_xecglue: } + \xeCJK_if_last_node:nTF { CJK } { \CJKecglue } + { \xeCJK_if_last_node:nT { CJK_space } { \xeCJK_space_or_xecglue: } } } } - \str_if_eq:xxF {#1} { NormalSpace } + \str_if_eq_x:nnF {#1} { NormalSpace } { \xeCJK_app_inter_class_toks:nnn { CJK } {#1} { \CJKecglue } } } % \end{macrocode} @@ -1538,9 +1682,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_inter_class_toks:nnn {#1} { Boundary } { \peek_catcode:NTF \c_space_token - { { \xeCJK_default_space_kern: } } { { \xeCJK_default_kern: } } + { { \xeCJK_make_node:n { default_space } } } + { { \xeCJK_make_node:n { default } } } } - \str_if_eq:xxF {#1} { NormalSpace } + \str_if_eq_x:nnF {#1} { NormalSpace } { \xeCJK_pre_inter_class_toks:nnn {#1} { CJK } { \CJKecglue } } } % \end{macrocode} @@ -1550,64 +1695,60 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_inter_class_toks:nnn { Boundary } { CJK } { \xeCJK_Boundary_and_CJK: } % \end{macrocode} % -% \begin{macro}[internal]{\xeCJK_Boundary_and_CJK:} +% \begin{macro}[internal]{\xeCJK_Boundary_and_CJK:,\xeCJK_check_for_glue:} % \begin{macrocode} \cs_new_nopar:Nn \xeCJK_Boundary_and_CJK: { - { - \bool_if:nTF - { - \int_compare_p:nNn \tex_lastkern:D = \c_one || - \int_compare_p:nNn \tex_lastkern:D = \c_two - } - { \CJKglue } - { - \bool_if:nTF - { - \int_compare_p:nNn \tex_lastkern:D = \c_three || - \int_compare_p:nNn \etex_lastnodetype:D = \c_ten || - ( \int_compare_p:nNn \etex_lastnodetype:D = \c_twelve && - \g_xeCJK_itcorr_bool ) - } - { \CJKecglue } - { - \bool_if:nT - { - \l_xeCJK_xecglue_bool && - \int_compare_p:nNn \etex_lastnodetype:D = \c_eleven && - ( \skip_if_eq_p:nn \tex_lastskip:D \l_xeCJK_space_glue_tl || - \int_compare_p:nNn \tex_lastskip:D = \l_xeCJK_ecglue_dim ) - } - { - \skip_set_eq:NN \l_tmpa_skip \tex_lastskip:D - \tex_unskip:D - \bool_if:nTF - { - \int_compare_p:nNn \tex_lastkern:D = \c_four || - \int_compare_p:nNn \etex_lastnodetype:D = \c_ten || - \int_compare_p:nNn \tex_lastkern:D = \c_three || - \g_xeCJK_itcorr_bool - } - { \CJKecglue } - { - \bool_if:nT - { - ! ( \int_compare_p:nNn \tex_lastkern:D = \c_one ) || - ! ( \int_compare_p:nNn \tex_lastkern:D = \c_two ) || - \l_xeCJK_space_bool - } - { \skip_horizontal:N \l_tmpa_skip } - } - } - } - } - \bool_gset_false:N \g_xeCJK_itcorr_bool - } + { \xeCJK_check_for_glue: } \c_group_begin_token \xeCJK_clear_CJK_toks: \xeCJK_select_font: \CJKsymbol } +\cs_new_nopar:Nn \xeCJK_check_for_glue: + { + \bool_if:nTF + { \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 } + } + { \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 ) + } + { + \tex_unskip:D + \bool_if:nTF + { + \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 } + } + { \CJKecglue } + { + \bool_if:nTF + { + \xeCJK_if_last_node_p:n { CJK } || + \xeCJK_if_last_node_p:n { CJK_space } + } + { \bool_if:NTF \l_xeCJK_space_bool \c_space_token \CJKglue } + { \c_space_token } + } + } + } + } + } \tl_set:Nn \l_xeCJK_space_glue_tl { \tex_fontdimen:D \c_two \tex_font:D @@ -1622,7 +1763,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_inter_class_toks:nnn { CJK } { Boundary } { \c_group_end_token - { \xeCJK_CJK_kern: } + { \xeCJK_make_node:n { CJK } } \xeCJK_ignorespaces: } % \end{macrocode} @@ -1658,7 +1799,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \clist_map_inline:Nn \g_xeCJK_base_class_clist { \bool_if:nF - { \str_if_eq_p:xx {#1} { FullLeft } || \str_if_eq_p:xx {#1} { FullRight } } + { \str_if_eq_x_p:nn {#1} { FullLeft } || \str_if_eq_x_p:nn {#1} { FullRight } } { \xeCJK_pre_inter_class_toks:nnn { FullLeft } {#1} { \nobreak } \xeCJK_pre_inter_class_toks:nnn { FullRight } {#1} { \xeCJK_after_FullRight: } @@ -1696,8 +1837,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \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 } + \@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 } } } % \end{macrocode} @@ -1833,22 +1974,42 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \begin{macro}[internal] -% {\xeCJK_CJK_kern:,\xeCJK_CJK_space_kern:, -% \xeCJK_default_kern:, \xeCJK_default_space_kern:} +% \begin{macro}[pTF,internal]{\xeCJK_if_last_node:n} +% \begin{macrocode} + \prg_new_conditional:Nnn \xeCJK_if_last_node:n { 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: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\xeCJK_def_node:nn,\xeCJK_make_node:n} % 用于判断插入的各种 |kern|。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_CJK_kern: { \tex_kern:D -1 sp \tex_kern:D 1 sp } -\cs_new_nopar:Nn \xeCJK_CJK_space_kern: { \tex_kern:D -2 sp \tex_kern:D 2 sp } -\cs_new_nopar:Nn \xeCJK_default_kern: { \tex_kern:D -3 sp \tex_kern:D 3 sp } -\cs_new_nopar:Nn \xeCJK_default_space_kern: { \tex_kern:D -4 sp \tex_kern:D 4 sp } +\cs_new_nopar:Nn \xeCJK_def_node:nn + { + \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:Nn \xeCJK_make_node:n + { + \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 } % \end{macrocode} % \end{macro} % % \begin{macro}{CJKglue} % CJK 文字之间插入的 |glue|。 % \begin{macrocode} -\keys_define:nn { xeCJK / options } { CJKglue .tl_set_x:N = \CJKglue } +\keys_define:nn { xeCJK / options } { CJKglue .tl_set:N = \CJKglue } % \end{macrocode} % \end{macro} % @@ -1859,7 +2020,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { CJKecglue .code:n = { - \cs_set:Npx \CJKecglue {#1} + \cs_set:Npn \CJKecglue {#1} \settowidth \l_xeCJK_ecglue_dim \CJKecglue }, xCJKecglue .choice:, @@ -1876,7 +2037,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ xCJKecglue / unknown .code:n = { \bool_set_true:N \l_xeCJK_xecglue_bool - \cs_set:Npx \CJKecglue {#1} + \cs_set:Npn \CJKecglue {#1} \settowidth \l_xeCJK_ecglue_dim \CJKecglue \cs_set_eq:NN \xeCJK_space_or_xecglue: \CJKecglue }, @@ -1924,9 +2085,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \peek_catcode:NTF \c_space_token { - \int_compare:nNnT \tex_lastkern:D = \c_one - { \tex_unkern:D \tex_unkern:D { \xeCJK_CJK_space_kern: } } - \peek_catcode_ignore_spaces:NTF \c_math_toggle_token + \xeCJK_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 @@ -1949,9 +2110,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \peek_catcode:NTF \c_space_token { - \int_compare:nNnT \tex_lastkern:D = \c_one - { \tex_unkern:D \tex_unkern:D { \xeCJK_CJK_space_kern: } } - \peek_catcode_ignore_spaces:NF \c_space_token { \xeCJK_space_or_xecglue: } + \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 } @@ -1967,7 +2129,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \subsection{段末孤字处理} % % \begin{macro}{CheckSingle} -% \begin{macro}[aux]{CheckSingleglue} % 孤字处理功能选项。 % \begin{macrocode} \keys_define:nn { xeCJK / options } @@ -1977,11 +2138,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ CheckSingle / false .code:n = { \xeCJKdisablechecksingle }, CheckSingle .default:n = { true }, CJKchecksingle .meta:n = { CheckSingle = true } , - CheckSingleglue .tl_set_x:N = { \CJKchecksingleglue }, } % \end{macrocode} % \end{macro} -% \end{macro} % % \begin{macro}[internal]{\xeCJKenablechecksingle,\xeCJKdisablechecksingle} % 孤字处理功能开关。 @@ -1993,9 +2152,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \bool_set_true:N \l_xeCJK_checksingle_bool \cs_set_eq:NN \xeCJK_checksingle_save_CJKsymbol:N \xeCJK_CJK_and_CJK:N - \cs_set_eq:NN \xeCJK_checksingle_save_CJKglue \CJKglue \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \xeCJK_checksingle:N - \cs_set_nopar:Npn \CJKglue { \CJKchecksingleglue } } } \NewDocumentCommand \xeCJKdisablechecksingle { } @@ -2003,7 +2160,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \bool_if:NT \l_xeCJK_checksingle_bool { \bool_set_false:N \l_xeCJK_checksingle_bool - \cs_set_eq:NN \CJKglue \xeCJK_checksingle_save_CJKglue \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \xeCJK_checksingle_save_CJKsymbol:N } } @@ -2043,7 +2199,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \bool_if:nTF { \token_if_space_p:c { l_peek_token } } { - \peek_catcode_ignore_spaces:NTF \c_catcode_other_token + \xeCJK_peek_catcode_ignore_spaces:NTF \c_catcode_other_token { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2 \c_space_token } { \bool_if:nTF @@ -2131,54 +2287,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \cs_generate_variant:Nn \token_if_math_toggle:NTF { c } % \end{macrocode} % -% \begin{macro}[pTF,internal]{\xeCJK_if_outer_macro:c} -% 判断是否是 |\outer| 宏,输入的是控制序列的名字。 -% \begin{macrocode} -\group_begin: -\char_set_lccode:nn { `\; } { `\: } -\char_set_lccode:nn { `\Z } { `\t } -\char_set_lccode:nn { `\Y } { `\c } -\char_set_lccode:nn { `\T } { `\T } -\char_set_lccode:nn { `\F } { `\F } -\tl_map_function:nN { O U Z E R M A Y R ; } \char_set_catcode_other:N -\tl_to_lowercase:n - { - \group_end: - \prg_new_conditional:Nnn \xeCJK_if_outer_macro:c { p, T , F , TF } - { - \exp_last_unbraced:Nf \xeCJK_if_outer_macro_aux:w - \cs_meaning:c {#1} OUZER ~ MAYRO ; \q_stop - } - \cs_new_nopar:Npn \xeCJK_if_outer_macro_aux:w #1 OUZER ~ MAYRO ; #2 \q_stop - { - \prg_case_str:xxn { #1 ~ } - { - { \token_to_str:N \ } { \prg_return_true: } - { \token_to_str:N \long \token_to_str:N \ } { \prg_return_true: } - { \token_to_str:N \protected \token_to_str:N \ } { \prg_return_true: } - { \token_to_str:N \protected \token_to_str:N \long \token_to_str:N \ } - { \prg_return_true: } - } - { \prg_return_false: } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[pTF,internal]{\xeCJK_if_eq_meaning:cN} -% 对 \pkg{l3token} 打的补丁,使 |\peek_catcode_ignore_spaces:NTF| 等可用于 |\outer| 宏。 -% \begin{macrocode} -\tl_replace_once:Nnn \peek_ignore_spaces_execute_branches: - { \token_if_eq_meaning:NNTF \l_peek_token } - { \xeCJK_if_eq_meaning:cNTF { l_peek_token } } -\prg_new_conditional:Nnn \xeCJK_if_eq_meaning:cN { p , T , F , TF } - { - \exp_args:Nc \if_meaning:w {#1} #2 - \prg_return_true: \else: \prg_return_false: \fi: - } -% \end{macrocode} -% \end{macro} -% % \subsection{增加 CJK 子分区} % % \begin{macro}[internal]{\xeCJK_UL_subclass_patch_tl,\g_xeCJK_CJK_subclass_clist} @@ -2241,7 +2349,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \xeCJKDeclareCharClass { CJK \bool_if:NF \l_xeCJK_sub_cancel_bool { /##1 } } - { \clist_use:c { g_xeCJK_CJK/##1_range_clist } } + { \tl_use:c { g_xeCJK_CJK/##1_range_clist } } } } } @@ -2280,7 +2388,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } {##1} {#1} {##1} \xeCJK_copy_inter_class_toks:nnnn {##1} { #1/#2 } {##1} {#1} - \str_if_eq:xxTF {##1} { CJK } + \str_if_eq_x:nnTF {##1} { CJK } { \xeCJK_pre_inter_class_toks:nnn {##1} { #1/#2 } { \xeCJK_switch_font:nn {#1} {#2} } @@ -2324,7 +2432,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \clist_map_inline:nn { Default, HalfLeft, HalfRight } { - \str_if_eq:xxTF {##1} { HalfLeft } + \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 } @@ -2353,42 +2461,27 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \begin{macro}[internal]{\keys_choices_generate:V, .generate_choices:V} +% \begin{macro}[internal]{\keys_define:nx} % \begin{macrocode} -\cs_generate_variant:Nn \keys_choices_generate:n { V } -\cs_new_protected:cpn { \c_keys_props_root_tl .generate_choices:V } #1 - { \keys_choices_generate:V {#1} } +\cs_generate_variant:Nn \keys_define:nn { nx } % \end{macrocode} % \end{macro} % -% \begin{macro} -% {PunctStyle, AllowBreakBetweenPuncts, KaiMingPunct, -% LongPunct, MiddlePunct,PunctWidth} -% 相关选项声明。 +% \begin{macro}{PunctStyle} % \begin{macrocode} \keys_define:nn { xeCJK / options } { - AllowBreakBetweenPuncts .choice:, - AllowBreakBetweenPuncts / true .code:n = { \xeCJKallowbreakbetweenpuncts }, - AllowBreakBetweenPuncts / false .code:n = { \xeCJKnobreakbetweenpuncts }, - AllowBreakBetweenPuncts .default:n = { true }, - KaiMingPunct .code:n = { \xeCJK_set_special_punct:nn { mixedwidth } {#1} }, - KaiMingPunct+ .code:n = { \xeCJK_add_special_punct:nn { mixedwidth } {#1} }, - KaiMingPunct- .code:n = { \xeCJK_sub_special_punct:nn { mixedwidth } {#1} }, - LongPunct .code:n = { \xeCJK_set_special_punct:nn { long } {#1} }, - LongPunct+ .code:n = { \xeCJK_add_special_punct:nn { long } {#1} }, - LongPunct- .code:n = { \xeCJK_sub_special_punct:nn { long } {#1} }, - MiddlePunct+ .code:n = { \xeCJK_add_special_punct:nn { middle } {#1} }, - MiddlePunct .code:n = { \xeCJK_set_special_punct:nn { middle } {#1} }, - MiddlePunct- .code:n = { \xeCJK_sub_special_punct:nn { middle } {#1} }, - PunctWidth .tl_gset:N = \g_xeCJK_punct_width_tl , PunctStyle .choice_code:n = { \tl_set:Nx \l_xeCJK_punctstyle_tl { \l_keys_choice_tl } \tl_if_eq:NNT \l_xeCJK_punctstyle_tl \c_xeCJK_ps_plain_tl - { \xeCJKallowbreakbetweenpuncts } + { \xeCJKallowbreakbetweenpuncts } }, - PunctStyle .generate_choices:V = \g_xeCJK_punctstyle_clist, + } +\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 }, @@ -2405,6 +2498,30 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % +% \begin{macro} +% {AllowBreakBetweenPuncts, KaiMingPunct, LongPunct, MiddlePunct,PunctWidth} +% 相关选项声明。 +% \begin{macrocode} +\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 , + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[internal]{\xeCJKallowbreakbetweenpuncts, \xeCJKnobreakbetweenpuncts} % \begin{macrocode} \NewDocumentCommand \xeCJKallowbreakbetweenpuncts { } @@ -2443,7 +2560,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \tl_map_inline:xn {#2} { \tl_remove_all:cn { l_xeCJK_#1_punct_tl } {##1} - \prop_del:cn { l_xeCJK_#1_punct_prop } {##1} + \prop_remove:cn { l_xeCJK_#1_punct_prop } {##1} } } \cs_generate_variant:Nn \tl_map_inline:nn { x } @@ -2485,31 +2602,31 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { { \xeCJK_select_font: \xeCJK_get_punct_dimen:N {#2} } } \xeCJK_punct_if_long:NTF {#2} { - \dim_zero:N \l_tmpa_dim - \dim_zero:N \l_tmpb_dim - \dim_zero:N \l_tmpc_dim + \dim_zero:N \l_xeCJK_tmpa_dim + \dim_zero:N \l_xeCJK_tmpb_dim + \dim_zero:N \l_xeCJK_tmpc_dim } { - \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/#1/#2 } - \dim_set:Nc \l_tmpb_dim - { \l_xeCJK_punct_coor_tl/bound/\str_if_eq:xxTF {#1} lrl/#2 } - \dim_set:Nn \l_tmpc_dim + \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 { \cs_if_exist_use:cF { g_xeCJK_punct_width/#2 } { - \tl_if_blank:xTF \g_xeCJK_punct_width_tl + \xeCJK_tl_if_blank:xTF \g_xeCJK_punct_width_tl { \c_zero_dim } { \g_xeCJK_punct_width_tl } } } \xeCJK_punct_if_middle:NTF {#2} { - \dim_set:Nn \l_tmpc_dim + \dim_set:Nn \l_xeCJK_tmpc_dim { - \dim_compare:nNnTF \l_tmpc_dim > \c_zero_dim - { \l_tmpc_dim } + \dim_compare:nNnTF \l_xeCJK_tmpc_dim > \c_zero_dim + { \l_xeCJK_tmpc_dim } { - \prg_case_tl:Nnn \l_xeCJK_punctstyle_tl + \tl_case:Nnn \l_xeCJK_punctstyle_tl { \c_xeCJK_ps_halfwidth_tl { .5 em } \c_xeCJK_ps_mixedwidth_tl { .5 em } @@ -2520,49 +2637,49 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } - \tl_use:c { \l_xeCJK_punct_coor_tl/dimen/#2 } } - \dim_set:Nn \l_tmpc_dim { .5 \l_tmpc_dim } + \dim_set:Nn \l_xeCJK_tmpc_dim { .5 \l_xeCJK_tmpc_dim } } { - \dim_compare:nNnTF \l_tmpc_dim > \c_zero_dim + \dim_compare:nNnTF \l_xeCJK_tmpc_dim > \c_zero_dim { - \dim_set:Nn \l_tmpc_dim + \dim_set:Nn \l_xeCJK_tmpc_dim { - \l_tmpc_dim - \l_tmpb_dim + \l_xeCJK_tmpc_dim - \l_xeCJK_tmpb_dim - \tl_use:c { \l_xeCJK_punct_coor_tl/dimen/#2 } } } { - \dim_set_eq:NN \l_tmpc_dim \l_tmpa_dim - \dim_set_min:Nn \l_tmpc_dim \l_tmpb_dim - \prg_case_tl:Nnn \l_xeCJK_punctstyle_tl + \dim_set_eq:NN \l_xeCJK_tmpc_dim \l_xeCJK_tmpa_dim + \dim_set_min:Nn \l_xeCJK_tmpc_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_tmpc_dim { .5 \l_tmpa_dim } - \dim_set_min:Nn \l_tmpc_dim \l_tmpa_dim + \dim_add:Nn \l_xeCJK_tmpc_dim { .5 \l_xeCJK_tmpa_dim } + \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_tmpc_dim { .5 \l_tmpa_dim } } - { \dim_add:Nn \l_tmpc_dim { .3 \l_tmpa_dim } } - \dim_set_min:Nn \l_tmpc_dim \l_tmpa_dim + { \dim_add:Nn \l_xeCJK_tmpc_dim { .5 \l_xeCJK_tmpa_dim } } + { \dim_add:Nn \l_xeCJK_tmpc_dim { .3 \l_xeCJK_tmpa_dim } } + \dim_set_min:Nn \l_xeCJK_tmpc_dim \l_xeCJK_tmpa_dim } } - { \dim_set_eq:NN \l_tmpc_dim \l_tmpa_dim } + { \dim_set_eq:NN \l_xeCJK_tmpc_dim \l_xeCJK_tmpa_dim } } } - \dim_set_max:Nn \l_tmpc_dim \c_zero_dim + \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_tmpa_dim } + { - \dim_use:N \l_xeCJK_tmpa_dim } \tl_gset:cx { \l_xeCJK_punct_coor_tl/rule/m/#2 } - { - \dim_use:N \l_tmpb_dim } - \tl_gset:cV { \l_xeCJK_punct_coor_tl/glue/#1/#2 } \l_tmpc_dim + { - \dim_use:N \l_xeCJK_tmpb_dim } + \tl_gset:cV { \l_xeCJK_punct_coor_tl/glue/#1/#2 } \l_xeCJK_tmpc_dim } } } @@ -2618,14 +2735,14 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \tl_if_exist:cF { \l_xeCJK_punct_coor_tl/kern/#1-#2 } { - \dim_zero:N \l_tmpa_dim + \dim_zero:N \l_xeCJK_tmpa_dim \tl_if_eq:NNF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_plain_tl { \tl_if_exist:cTF { g_xeCJK_punct/kern/#1-#2 } - { \dim_set:Nc \l_tmpa_dim { g_xeCJK_punct/kern/#1-#2 } } + { \dim_set:Nc \l_xeCJK_tmpa_dim { g_xeCJK_punct/kern/#1-#2 } } { \xeCJK_calc_kern:NN {#1} {#2} } } - \tl_gset:cV { \l_xeCJK_punct_coor_tl/kern/#1-#2 } \l_tmpa_dim + \tl_gset:cV { \l_xeCJK_punct_coor_tl/kern/#1-#2 } \l_xeCJK_tmpa_dim } } \cs_new_nopar:Nn \xeCJK_calc_kern:NN @@ -2633,21 +2750,21 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_marginkerning_tl { \xeCJK_punct_if_right:NT {#1} - { \dim_add:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } } + { \dim_add:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } } \xeCJK_punct_if_right:NF {#2} - { \dim_add:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } } + { \dim_add:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } } } { \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_fullwidth_tl - { \xeCJK_calc_kern:NnNN \l_tmpa_dim { 1.5 em } {#1} {#2} } + { \xeCJK_calc_kern:NnNN \l_xeCJK_tmpa_dim { 1.5 em } {#1} {#2} } { \xeCJK_punct_if_both_left_right:NNTF {#1} {#2} { \xeCJK_punct_if_mixedwidth:NT {#1} { - \xeCJK_calc_kern:NnNN \l_tmpa_dim { 1 em } {#1} {#2} - \dim_compare:nNnT \l_tmpa_dim < { .1 em } - { \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } } + \xeCJK_calc_kern:NnNN \l_xeCJK_tmpa_dim { 1 em } {#1} {#2} + \dim_compare:nNnT \l_xeCJK_tmpa_dim < { .1 em } + { \dim_set:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } } } } { @@ -2657,27 +2774,27 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ ! ( \tl_if_eq_p:NN \l_xeCJK_punctstyle_tl \c_xeCJK_ps_halfwidth_tl ) } { - \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/glue/r/#1 } - \dim_set:Nn \l_tmpa_dim { .7 \l_tmpa_dim } + \dim_set:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/glue/r/#1 } + \dim_set:Nn \l_xeCJK_tmpa_dim { .7 \l_xeCJK_tmpa_dim } } { - \xeCJK_calc_kern:NnNN \l_tmpa_dim { 1 em } {#1} {#2} - \dim_compare:nNnT \l_tmpa_dim < { .1 em } + \xeCJK_calc_kern:NnNN \l_xeCJK_tmpa_dim { 1 em } {#1} {#2} + \dim_compare:nNnT \l_xeCJK_tmpa_dim < { .1 em } { - \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } - \dim_set_min:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } - \dim_set:Nc \l_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } - \dim_set_min:Nc \l_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/r/#2 } - \dim_set_max:Nn \l_tmpa_dim \l_tmpb_dim + \dim_set:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } + \dim_set_min:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } + \dim_set:Nc \l_xeCJK_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } + \dim_set_min:Nc \l_xeCJK_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/r/#2 } + \dim_set_max:Nn \l_xeCJK_tmpa_dim \l_xeCJK_tmpb_dim } } } } \bool_if:nT { \xeCJK_punct_if_long_p:N {#1} || \xeCJK_punct_if_long_p:N {#2} } - { \dim_set_max:Nn \l_tmpa_dim { .1 em } } + { \dim_set_max:Nn \l_xeCJK_tmpa_dim { .1 em } } } - \dim_set_max:Nn \l_tmpa_dim \c_zero_dim + \dim_set_max:Nn \l_xeCJK_tmpa_dim \c_zero_dim } \cs_generate_variant:Nn \xeCJK_get_kern:NN { V } % \end{macrocode} @@ -2710,26 +2827,26 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \cs_new_nopar:Nn \xeCJK_get_punct_dimen:N { - \xeCJK_get_glyph_bounds:nNN { left } {#1} \l_tmpa_dim - \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/l/#1 } \l_tmpa_dim - \dim_set_eq:NN \l_tmpb_dim \l_tmpa_dim - \xeCJK_get_glyph_bounds:nNN { right } {#1} \l_tmpa_dim - \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/r/#1 } \l_tmpa_dim - \dim_add:Nn \l_tmpb_dim \l_tmpa_dim + \xeCJK_get_glyph_bounds:nNN { left } {#1} \l_xeCJK_tmpa_dim + \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/l/#1 } \l_xeCJK_tmpa_dim + \dim_set_eq:NN \l_xeCJK_tmpb_dim \l_xeCJK_tmpa_dim + \xeCJK_get_glyph_bounds:nNN { right } {#1} \l_xeCJK_tmpa_dim + \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/r/#1 } \l_xeCJK_tmpa_dim + \dim_add:Nn \l_xeCJK_tmpb_dim \l_xeCJK_tmpa_dim \tl_gset:cx { \l_xeCJK_punct_coor_tl/dimen/#1 } - { \dim_eval:n { \etex_fontcharwd:D \tex_font:D `#1 - \l_tmpb_dim } } + { \dim_eval:n { \etex_fontcharwd:D \tex_font:D `#1 - \l_xeCJK_tmpb_dim } } \bool_if:nT { \xeCJK_punct_if_long_p:N {#1} && - ! ( \str_if_eq_p:xx {#1} { … } || \str_if_eq_p:xx {#1} { ‥ } ) + ! ( \str_if_eq_x_p:nn {#1} { … } || \str_if_eq_x_p:nn {#1} { ‥ } ) } { \clist_map_inline:Nn \g_xeCJK_punctstyle_clist { - \str_if_eq:xxF \c_xeCJK_ps_plain_tl {##1} + \str_if_eq_x:nnF \c_xeCJK_ps_plain_tl {##1} { \tl_gset:cx { \l_xeCJK_font_coor_tl/##1/kern/#1-#1 } - { - \dim_use:N \l_tmpb_dim } + { - \dim_use:N \l_xeCJK_tmpb_dim } } } } @@ -2745,10 +2862,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \dim_set:Nn #3 { \XeTeXglyphbounds - \prg_case_str:xxn {#1} + \str_case_x:nnn {#1} { - { left } { \c_one } { top } { \c_two } - { right } { \c_three } { bottom } { \c_four } + { left } { \c_one } { top } { \c_two } + { right } { \c_three } { bottom } { \c_four } } { \c_three } \int_eval:n { \XeTeXcharglyph `#2 } @@ -2813,7 +2930,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \font_glyph_if_exist:NnTF \tex_font:D {`#1} { \xeCJK_fallback_save_CJKsymbol:N {#1} } { - \xeCJK_family_if_exist:nTF { \xeCJK@family/FallBack } + \xeCJK_family_if_exist:xTF { \xeCJK@family/FallBack } { { \tl_put_right:Nn \xeCJK@family { /FallBack } \xeCJK_select_font: @@ -2928,7 +3045,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { #1 .code:n = { - \tl_if_blank:xTF {##1} + \xeCJK_tl_if_blank:xTF {##1} { \bool_set_false:c { l_xeCJK_copy_#1_bool } \bool_set_false:c { l_xeCJK_add_#1_bool } @@ -2936,7 +3053,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } { \clist_put_right:Nx \l_xeCJK_sub_key_clist {#1} - \str_if_eq:xxTF {##1} * + \str_if_eq_x:nnTF {##1} * { \bool_set_true:c { l_xeCJK_copy_#1_bool } \bool_set_false:c { l_xeCJK_add_#1_bool } @@ -2954,20 +3071,20 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \cs_generate_variant:Nn \xeCJK_new_sub_key:n { x } \cs_new_nopar:Nn \xeCJK_get_sub_features:nn { - \tl_set:Nx \l_tmpa_tl {#2} + \tl_set:Nx \l_xeCJK_tmpa_tl {#2} \clist_clear:N \l_xeCJK_sub_fontfeat_clist - \xeCJK_gobble_brace:N \l_tmpa_tl - \exp_args:No \tl_if_head_eq_charcode:nNTF \l_tmpa_tl [ % ] + \xeCJK_gobble_brace:N \l_xeCJK_tmpa_tl + \exp_args:No \tl_if_head_eq_charcode:nNTF \l_xeCJK_tmpa_tl [ % ] { - \exp_after:wN \xeCJK_get_sub_features_aux:n \l_tmpa_tl \c_empty_tl - \tl_if_blank:xT \l_xeCJK_sub_fontname_tl + \exp_after:wN \xeCJK_get_sub_features_aux:n \l_xeCJK_tmpa_tl \c_empty_tl + \xeCJK_tl_if_blank:xT \l_xeCJK_sub_fontname_tl { - \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_tmpa_tl + \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_xeCJK_tmpa_tl \clist_clear:N \l_xeCJK_sub_fontfeat_clist } } - { \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_tmpa_tl } - \tl_if_blank:xTF \l_xeCJK_sub_fontname_tl + { \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_xeCJK_tmpa_tl } + \xeCJK_tl_if_blank:xTF \l_xeCJK_sub_fontname_tl { \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_xeCJK_fontname_tl } { \tl_replace_all:Nnx \l_xeCJK_sub_fontname_tl * \l_xeCJK_fontname_tl } \clist_set:cx { l_xeCJK_#1_fontfeat_clist } \l_xeCJK_sub_fontfeat_clist @@ -3001,15 +3118,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \begin{macro}[internal]{.clist_set_x:N,.clist_set_x:c} -% \begin{macrocode} -\cs_set_protected:cpn { \c_keys_props_root_tl .clist_set_x:N } #1 - { \keys_variable_set:NnN #1 { clist } x } -\cs_set_protected:cpn { \c_keys_props_root_tl .clist_set_x:c } #1 - { \keys_variable_set:cnN {#1} { clist } x } -% \end{macrocode} -% \end{macro} -% % \begin{macro}[internal]{\g_xeCJK_features_id_prop, BoldFont, ItalicFont, BoldItalicFont, % SlantedFont, BoldSlantedFont,BoldFeatures, ItalicFeatures, BoldItalicFeatures, % SlantedFeatures, BoldSlantedFeatures} @@ -3027,8 +3135,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \keys_define:nn { xeCJK / features } { - #2Font .tl_set_x:c = { l_xeCJK_fontname_#1_tl }, - #2Features .clist_set_x:c = { l_xeCJK_fontfeat_#1_clist } , + #2Font .tl_set_x:c = { l_xeCJK_fontname_#1_tl }, + #2Features .tl_set_x:c = { l_xeCJK_fontfeat_#1_clist } , } } % \end{macrocode} @@ -3139,10 +3247,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \cs_new_nopar:Nn \xeCJK_check_family:n { - \prop_get:NnNT \g_xeCJK_family_prop {#1} \l_tmpa_tl + \prop_get:NnNT \g_xeCJK_family_prop {#1} \l_xeCJK_tmpa_tl { - \prop_gpop:NnNT \g_xeCJK_family_name_prop {#1} \l_tmpa_tl { } - \xeCJK_warning:nxx { CJKfamily-redef } {#1} \l_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 } } \cs_generate_variant:Nn \xeCJK_check_family:n { V } @@ -3205,7 +3313,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \xeCJK_add_font_if_new:nv {bf#1} { l_xeCJK_fontname_#1_tl } } } { - \str_if_eq:xxT {#1} {bf} + \str_if_eq_x:nnT {#1} {bf} { \clist_map_inline:nn { it , sl } { @@ -3224,12 +3332,12 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \prg_new_conditional:Nnn \xeCJK_if_font_select:n { p, T, F, TF } { - \exp_args:Nc - \tl_if_blank:xTF { l_xeCJK_fontname_#1_tl } \prg_return_false: \prg_return_true: + \exp_args:Nc \xeCJK_tl_if_blank:xTF { l_xeCJK_fontname_#1_tl } + \prg_return_false: \prg_return_true: } \prg_new_conditional:Nnn \xeCJK_if_it_or_sl:n { p, T, F, TF } { - \bool_if:nTF { \str_if_eq_p:xx { it } {#1} || \str_if_eq_p:xx { sl } {#1} } + \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: } % \end{macrocode} @@ -3239,15 +3347,15 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \cs_new_nopar:Nn \xeCJK_set_fake:n { - \str_if_eq:xxTF {#1} { bf } + \str_if_eq_x:nnTF {#1} { bf } { \bool_if:NT \l_xeCJK_AutoFakeBold_bool { \xeCJK_add_fake_bold:n {#1} } } { \bool_if:NTF \l_xeCJK_AutoFakeSlant_bool { \bool_if:nT { \xeCJK_if_it_or_sl_p:n {#1} || - ( \str_if_eq_p:xx {#1} {bfit} && ! ( \xeCJK_if_font_select_p:n {it} ) ) || - ( \str_if_eq_p:xx {#1} {bfsl} && ! ( \xeCJK_if_font_select_p:n {sl} ) ) + ( \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_add_fake_slant:n {#1} } } @@ -3281,7 +3389,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macro}[internal]{\xeCJK_get_map_font:n} % \begin{macrocode} \cs_new_nopar:Nn \xeCJK_get_map_font:n - { \tl_use:c { l_xeCJK_fontname_\str_if_eq:xxTF {#1} {it} {sl} {it} _tl } } + { \tl_use:c { l_xeCJK_fontname_\str_if_eq_x:nnTF {#1} {it} {sl} {it} _tl } } % \end{macrocode} % \end{macro} % @@ -3289,7 +3397,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \prg_new_conditional:Nnn \xeCJK_if_map_font_select:n { p, T, F, TF } { - \tl_if_blank:xTF { \xeCJK_get_map_font:n {#1} } + \xeCJK_tl_if_blank:xTF { \xeCJK_get_map_font:n {#1} } \prg_return_false: \prg_return_true: } % \end{macrocode} @@ -3304,12 +3412,12 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \clist_if_empty:cF { l_xeCJK_fontfeat_##1_clist } { \clist_put_right:Nx \l_xeCJK_pass_features_clist - { ##2Features = { \clist_use:c { l_xeCJK_fontfeat_##1_clist } } } + { ##2Features = { \tl_use:c { l_xeCJK_fontfeat_##1_clist } } } } } \prop_map_inline:Nn \l_xeCJK_add_font_prop { \clist_put_right:Nx \l_xeCJK_pass_features_clist { ##1 = { ##2 } } } - \tl_if_blank:xF \l_xeCJK_monoscale_tl + \xeCJK_tl_if_blank:xF \l_xeCJK_monoscale_tl { \clist_put_right:Nx \l_xeCJK_pass_features_clist \l_xeCJK_monoscale_tl } } % \end{macrocode} @@ -3352,27 +3460,27 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \bool_if:cT { l_xeCJK_copy_##1_bool } { \xeCJK_check_family:V \l_xeCJK_sub_family_tl - \prop_get:NVNT \g_xeCJK_family_prop \l_xeCJK_family_tl \l_tmpa_tl - { \prop_gput:NVV \g_xeCJK_family_prop \l_xeCJK_sub_family_tl \l_tmpa_tl } - \prop_get:NVNT \g_xeCJK_family_options_prop \l_xeCJK_family_tl \l_tmpa_clist + \prop_get:NVNT \g_xeCJK_family_prop \l_xeCJK_family_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_tl \l_xeCJK_tmpa_clist { - \clist_remove_all:Nn \l_tmpa_clist { ##1 = * } - \prop_gput:NVV \g_xeCJK_family_options_prop \l_xeCJK_sub_family_tl \l_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 } { - \xeCJK_family_if_exist:nT { \l_xeCJK_family_tl } + \xeCJK_family_if_exist:xT { \l_xeCJK_family_tl } { \prop_get:NnNT \exp_not:N \g_xeCJK_family_name_prop - { \l_xeCJK_family_tl } \exp_not:N \l_tmpa_tl + { \l_xeCJK_family_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_tmpa_tl + { \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 { \g_fontspec_encoding_tl } - \exp_not:N \fontfamily { \l_tmpa_tl } + \exp_not:N \fontfamily { \l_xeCJK_tmpa_tl } \exp_not:N \selectfont } } } @@ -3393,11 +3501,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \cs_new_nopar:Nn \xeCJK_copy_family:nn { - \xeCJK_family_if_exist:nT {#2} + \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_tmpa_tl { \prop_gput:NnV ##1 {#1} \l_tmpa_tl } } + { \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 } } } @@ -3417,25 +3525,25 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \tl_set:Nx \l_xeCJK_current_coor_tl \l_xeCJK_font_coor_tl \cs_if_exist_use:cT { xeCJK/family/\xeCJK@family } - { \exp_last_unbraced:NNV \cs_gset_eq:cN \l_xeCJK_current_coor_tl \font@name } + { \exp_last_unbraced:NNV \cs_gset_eq:cN \l_xeCJK_current_coor_tl \tex_font:D } } } \cs_new_eq:NN \xeCJK@setfont \xeCJK_select_font: \cs_new_nopar:Nn \xeCJK_switch_font:nn { - \str_if_eq:xxF {#1} {#2} + \str_if_eq_x:nnF {#1} {#2} { \xeCJK_info:nxx { CJK-block } {#1} {#2} \tl_remove_all:Nn \xeCJK@family { /#1 } - \str_if_eq:xxF {#2} { CJK } + \str_if_eq_x:nnF {#2} { CJK } { - \tl_set:Nx \l_tmpa_tl \xeCJK@family + \tl_set:Nx \l_xeCJK_tmpa_tl \xeCJK@family \tl_put_right:Nx \xeCJK@family { /#2 } - \xeCJK_family_if_exist:nF \xeCJK@family + \xeCJK_family_if_exist:xF \xeCJK@family { - \xeCJK_family_if_exist:nTF { \CJKfamilydefault/#2 } + \xeCJK_family_if_exist:xTF { \CJKfamilydefault/#2 } { \xeCJK_copy_family:xx \xeCJK@family { \CJKfamilydefault/#2 } } - { \xeCJK_copy_family:xx \xeCJK@family \l_tmpa_tl } + { \xeCJK_copy_family:xx \xeCJK@family \l_xeCJK_tmpa_tl } } } } @@ -3445,9 +3553,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \begin{macro}[TF,internal]{\xeCJK_family_if_exist:n} +% \begin{macro}[TF,internal]{\xeCJK_family_if_exist:x} % \begin{macrocode} -\prg_new_protected_conditional:Nnn \xeCJK_family_if_exist:n { T, F, TF } +\prg_new_protected_conditional:Nnn \xeCJK_family_if_exist:x { T, F, TF } { \cs_if_free:cTF { xeCJK/family/#1 } \prg_return_false: { @@ -3463,22 +3571,23 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \NewDocumentCommand \CJKfamily { m } { - \xeCJK_family_if_exist:nTF {#1} + \xeCJK_family_if_exist:xTF {#1} { \tl_set:Nx \xeCJK@family {#1} } { - \cs_if_free:cT { xeCJK_warned_aux_#1 } + \seq_if_in:NxF \g_xeCJK_unknown_family_seq {#1} { + \seq_gput_right:Nx \g_xeCJK_unknown_family_seq {#1} \xeCJK_warning:nx { CJKfamily-Unknown } {#1} - \tl_new:c { xeCJK_warned_aux_#1 } } } \tex_ignorespaces:D } +\seq_new:N \g_xeCJK_unknown_family_seq \xeCJK_msg_new:nn { CJKfamily-Unknown } { Unknown~CJK~family~'#1'~is~ignored.\\\\ Try~to~use~ - \prg_case_str:xxn {#1} + \str_case_x:nnn {#1} { \CJKrmdefault { \token_to_str:N \setCJKmainfont } \CJKsfdefault { \token_to_str:N \setCJKsansfont } @@ -3534,35 +3643,35 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \prop_if_in:NVTF \g_xeCJK_family_prop \xeCJK@family { \group_begin: - \clist_set:Nx \l_tmpa_clist {#1} - \prop_get:NVN \g_xeCJK_family_prop \xeCJK@family \l_tmpa_tl + \clist_set:Nx \l_xeCJK_tmpa_clist {#1} + \prop_get:NVN \g_xeCJK_family_prop \xeCJK@family \l_xeCJK_tmpa_tl \clist_map_inline:Nn \g_xeCJK_CJK_subclass_clist { - \clist_if_in:NnT \l_tmpa_clist {##1} + \clist_if_in:NnT \l_xeCJK_tmpa_clist {##1} { - \clist_remove_all:Nn \l_tmpa_clist {##1} - \prop_get:NxNF \g_xeCJK_family_prop { \xeCJK@family/##1 } \l_tmpb_tl + \clist_remove_all:Nn \l_xeCJK_tmpa_clist {##1} + \prop_get:NxNF \g_xeCJK_family_prop { \xeCJK@family/##1 } \l_xeCJK_tmpb_tl { \prop_get:NxNF \g_xeCJK_family_prop - { \CJKfamilydefault/##1 } \l_tmpb_tl - { \tl_set:Nx \l_tmpb_tl \l_tmpa_tl } + { \CJKfamilydefault/##1 } \l_xeCJK_tmpb_tl + { \tl_set:Nx \l_xeCJK_tmpb_tl \l_xeCJK_tmpa_tl } } - \clist_set:Nx \l_tmpa_clist - { ##1 = { [ \l_tmpa_clist ] { \l_tmpb_tl } } } + \clist_set:Nx \l_xeCJK_tmpa_clist + { ##1 = { [ \l_xeCJK_tmpa_clist ] { \l_xeCJK_tmpb_tl } } } \clist_map_break: } } - \prop_get:NVNF \g_xeCJK_family_options_prop \xeCJK@family \l_tmpb_clist - { \clist_clear:N \l_tmpb_clist } - \clist_clear:N \l_tmpc_clist - \clist_map_inline:Nn \l_tmpb_clist + \prop_get:NVNF \g_xeCJK_family_options_prop \xeCJK@family \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_tmpa_clist {##1} - { \clist_put_right:Nn \l_tmpc_clist {##1} } + \clist_if_in:NnF \l_xeCJK_tmpa_clist {##1} + { \clist_put_right:Nn \l_xeCJK_tmpc_clist {##1} } } - \clist_put_left:NV \l_tmpa_clist \l_tmpc_clist + \clist_put_left:NV \l_xeCJK_tmpa_clist \l_xeCJK_tmpc_clist \use:x - { \group_end: \exp_not:N \CJKfontspec [ \l_tmpa_clist ] { \l_tmpa_tl } } + { \group_end: \exp_not:N \CJKfontspec [ \l_xeCJK_tmpa_clist ] { \l_xeCJK_tmpa_tl } } } { \xeCJK_warning:n { addCJKfontfeature-ignored } } \tex_ignorespaces:D @@ -3610,6 +3719,17 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } % \end{macrocode} % +% 为了保证 CJK 数学字体的正确设置,应在导言区内设置 CJK 字体。 +% \begin{macrocode} +\@onlypreamble \setCJKmainfont +\@onlypreamble \setCJKmathfont +\@onlypreamble \setCJKsansfont +\@onlypreamble \setCJKmonofont +\@onlypreamble \setCJKromanfont +% \end{macrocode} +% +% \subsection{数学字体设置} +% % \begin{macro}{\setCJKmathfont} % 设置 CJK 数学字体。 % \begin{macrocode} @@ -3630,73 +3750,67 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \NewDocumentCommand \xeCJKsetmathcode { m m m m } { - \xeCJK_check_num_range:nnNN {#1} {#2} \l_tmpa_int \l_tmpb_int - \int_set:Nn \l_tmpc_int { \xeCJK_math_type:n {#3} } + \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} } \loop - \XeTeXmathcode \l_tmpa_int = \l_tmpc_int \use:c { sym #4 } \l_tmpa_int - \if_int_compare:w \l_tmpa_int < \l_tmpb_int - \int_incr:N \l_tmpa_int + \XeTeXmathcode + \l_xeCJK_tmpa_int = \l_xeCJK_tmpc_int \use:c { sym #4 } \l_xeCJK_tmpa_int + \if_int_compare:w \l_xeCJK_tmpa_int < \l_xeCJK_tmpb_int + \int_incr:N \l_xeCJK_tmpa_int \repeat } -\cs_set_eq:NN \xeCJK_math_type:n \mathchar@type +\cs_new_eq:NN \xeCJK_math_type:n \mathchar@type % \end{macrocode} % \end{macro} % -% 当没有设置 CJK 数学字体时,使用 |\CJKfamilydefault| 作为数学字体。 +% \begin{macro}[internal]{\xeCJK_set_mathfont:} % \begin{macrocode} -\tl_put_left:Nn \document +\cs_new_nopar:Nn \xeCJK_set_mathfont: { - \group_end: - \normalfont - \prop_if_empty:NTF \g_xeCJK_family_prop - { \xeCJK_warning:n { no-CJKfamily } } + \xeCJK_family_if_exist:xTF \c_xeCJK_math_tl + { \tl_set:Nx \l_xeCJK_tmpa_tl \c_xeCJK_math_tl } { - \bool_if:NT \g_xeCJK_math_bool + \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 \g_fontspec_encoding_tl + \l_xeCJK_math_family_tl \mddefault \shapedefault + \SetSymbolFont \c_xeCJK_math_tl { bold } \g_fontspec_encoding_tl + \l_xeCJK_math_family_tl \bfdefault \shapedefault + \clist_map_inline:nn { CJK, FullLeft, FullRight } { - \xeCJK_family_if_exist:nTF \c_xeCJK_math_tl - { \tl_set:Nx \l_tmpa_tl \c_xeCJK_math_tl } + \clist_map_inline:cn { g_xeCJK_##1_range_clist } { - \xeCJK_family_if_exist:nTF \CJKfamilydefault - { \tl_set:Nx \l_tmpa_tl \CJKfamilydefault } - { \tl_set_eq:NN \l_tmpa_tl \q_no_value } - } - \prop_get:NVNT \g_xeCJK_family_name_prop \l_tmpa_tl \l_xeCJK_math_family_tl - { - \DeclareSymbolFont \c_xeCJK_math_tl \g_fontspec_encoding_tl - \l_xeCJK_math_family_tl \mddefault \shapedefault - \SetSymbolFont \c_xeCJK_math_tl { bold } \g_fontspec_encoding_tl - \l_xeCJK_math_family_tl \bfdefault \shapedefault - \clist_map_inline:nn { CJK, FullLeft, FullRight } - { - \clist_map_inline:cn { g_xeCJK_#1_range_clist } - { - \xeCJK_setcharclass_aux:Nn \xeCJKsetmathcode {##1} - \mathalpha \c_xeCJK_math_tl - } - } + \xeCJK_setcharclass_aux:Nn \xeCJKsetmathcode {####1} + \mathalpha \c_xeCJK_math_tl } } } - \group_begin: + } +% \end{macrocode} +% \end{macro} +% +% 当没有设置 CJK 数学字体时,使用 |\CJKfamilydefault| 作为数学字体。 +% \begin{macrocode} +\xeCJK_AtEndPreamble:n + { + \normalfont + \prop_if_empty:NTF \g_xeCJK_family_prop + { \xeCJK_warning:n { no-CJKfamily } } + { \bool_if:NT \g_xeCJK_math_bool { \xeCJK_set_mathfont: } } } \xeCJK_msg_new:nn { no-CJKfamily } { It~seems~that~you~have~not~declare~a~CJKfamily.\\ If~you~want~to~use~xeCJK~in~the~right~way,~you~should~use\\\\ - \token_to_str:N~\xeCJKmainfont[...]{...}\\\\ + \token_to_str:N \xeCJKmainfont[...]{...}\\\\ in~the~preamble~to~declare~the~main~CJKfamily.\\ } % \end{macrocode} % -% 为了保证 CJK 数学字体的正确设置,应在导言区内设置 CJK 字体。 -% \begin{macrocode} -\@onlypreamble \setCJKmainfont -\@onlypreamble \setCJKmathfont -\@onlypreamble \setCJKsansfont -\@onlypreamble \setCJKmonofont -\@onlypreamble \setCJKromanfont -% \end{macrocode} -% % \subsection{处理等宽字体和抄录环境} % % \begin{macro}[internal,var]{\g_xeCJK_monoscale_fp,\g_xeCJK_exspace_dim} @@ -3718,9 +3832,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \group_begin: \fontfamily \ttdefault \selectfont - \fp_gset_from_dim:Nn \g_xeCJK_monoscale_fp - { \c_two \tex_fontdimen:D \c_two \tex_font:D } - \fp_gdiv:Nn \g_xeCJK_monoscale_fp \f@size + \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: } % \end{macrocode} @@ -3776,7 +3889,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } } \bool_new:N \l_xeCJK_fixed_spacing_bool -\AtBeginDocument { \tl_put_right:Nn \verbatim@font \CJKfixedspacing } +\xeCJK_AfterPreamble:n { \tl_put_right:Nn \verbatim@font \CJKfixedspacing } % \end{macrocode} % \end{macro} % @@ -3844,7 +3957,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { CJKglue = { \skip_horizontal:n { \c_zero_skip \@plus .08\baselineskip } } , CJKecglue = \c_space_token , - CheckSingleglue = \CJKglue , xCJKecglue = false , CheckSingle = false , CJKspace = false , @@ -3895,9 +4007,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \begin{macro}[internal]{\xeCJKsetemboldenfactor, \xeCJKsetslantfactor} % \begin{macrocode} -\NewDocumentCommand \xeCJKsetEmboldenFactor { m } +\NewDocumentCommand \xeCJKsetemboldenfactor { m } { \xeCJKsetup { EmboldenFactor = {#1} } } -\NewDocumentCommand \xeCJKsetSlantFactor { m } +\NewDocumentCommand \xeCJKsetslantfactor { m } { \xeCJKsetup { SlantFactor = {#1} } } % \end{macrocode} % \end{macro} @@ -3918,40 +4030,44 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \subsection{兼容性修补} % -% \begin{macro}[internal]{\/} +% \begin{macro}[internal]{\xeCJK_fix_itcorr:} % 修复倾斜校正。 % \begin{macrocode} -\cs_new_eq:NN \xeCJK_itcorr_aux \/ -\bool_new:N \g_xeCJK_itcorr_bool -\cs_set_protected_nopar:Npn \/ +\cs_new_nopar:Nn \xeCJK_fix_itcorr: { \scan_stop: - \int_compare:nNnT \tex_lastkern:D = \c_three + \xeCJK_if_last_node:nTF { default } { \tex_unkern:D \tex_unkern:D - \bool_gset_true:N \g_xeCJK_itcorr_bool + \xeCJK_itcorr_aux + { \xeCJK_make_node:n { default_itcorr } } } - \xeCJK_itcorr_aux + { \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 } } \cs_set_eq:NN \@@italiccorr \/ % \end{macrocode} % \end{macro} % -% \begin{macro}[internal] -% {\xeCJK_compatibility_hook:,\xeCJK_set_others_toks:n,\xeCJK_Others_class} +% \begin{macro}[internal]{\xeCJK_set_others_toks:n,\xeCJK_Others_class} % 简单处理与同样使用 |\XeTeXinterchartoks| 机制的宏包的兼容问题。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_compatibility_hook: +\xeCJK_AfterEndPreamble:n { \int_compare:nNnF - { \c_three + \seq_length:N \g_xeCJK_class_seq } = \xe@alloc@intercharclass + { \c_three + \seq_count:N \g_xeCJK_class_seq } = \xe@alloc@intercharclass { - \int_set_eq:NN \l_tmpa_int \c_three - \int_until_do:nNnn \l_tmpa_int = \xe@alloc@intercharclass + \int_set_eq:NN \l_xeCJK_tmpa_int \c_three + \int_until_do:nNnn \l_xeCJK_tmpa_int = \xe@alloc@intercharclass { - \int_incr:N \l_tmpa_int - \seq_if_in:NVF \g_xeCJK_class_seq \l_tmpa_int - { \xeCJK_set_others_toks:n \l_tmpa_int } + \int_incr:N \l_xeCJK_tmpa_int + \seq_if_in:NVF \g_xeCJK_class_seq \l_xeCJK_tmpa_int + { \xeCJK_set_others_toks:n \l_xeCJK_tmpa_int } } } } @@ -3979,7 +4095,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } } \int_new:N \xeCJK_Others_class -\tl_put_right:Nn \document { \xeCJK_compatibility_hook: \tex_ignorespaces:D } % \end{macrocode} % \end{macro} % @@ -3994,7 +4109,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 单独处理宽度有分歧的几个标点:包括省略号、破折号、间隔号、引号等中西文混用的 % 符号, 保证其命令形式输出的是西文字体。并对一些编码的符号宏包做特殊处理。 % \begin{macrocode} -\AtBeginDocument +\xeCJK_AfterPreamble:n { \tl_map_inline:nn { @@ -4073,7 +4188,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % 对 \pkg{ulem} 宏包打补丁,以支持 \pkg{CJKfntef} 宏包。 % \begin{macrocode} -\AtBeginDocument +\xeCJK_AfterPreamble:n { \cs_if_exist:NT \UL@hook { @@ -4084,7 +4199,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \cs_set_nopar:Npn \CJKsymbol #1 { { \xeCJK_select_font: \xeCJK_UL_CJKsymbol {#1} } - \xeCJK_CJK_kern: \xeCJK_ignorespaces: + \xeCJK_make_node:n { CJK } \xeCJK_ignorespaces: } \cs_set_nopar:Npn \CJKpunctsymbol #1 { { \xeCJK_select_font: \xeCJK_UL_CJKpunctsymbol {#1} } } @@ -4106,7 +4221,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \tl_set:Nn \CJK@UnicodeEnc { UTF8 } \cs_set_nopar:Npn \CJKaddEncHook #1#2 { \cs_set_nopar:cpn { xeCJK_enc_#1 } {#2} } \cs_set_nopar:Npn \Unicode #1#2 - { \tex_char:D \int_eval:n { #1 * \c_two_hundred_fifty_six + #2 } } + { \tex_char:D \int_eval:n { (#1) * \c_two_hundred_fifty_six + (#2) } } \RequirePackage { CJKnumb } \use:c { xeCJK_enc_\CJK@UnicodeEnc } \tl_set:Nn \CJK@tenthousand { 万 } @@ -4118,6 +4233,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %</package> % \end{macrocode} % +% % \section{例子} % % \subsection{\pkg{xeCJK-example-autofake.tex}} @@ -4371,6 +4487,7 @@ x^2+y^2 % % \end{implementation} % +% \PrintIndex % \Finale % \endinput diff --git a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins index 5953014e7df..09819f516d8 100644 --- a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins +++ b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins @@ -6,7 +6,7 @@ %% %% xeCJK.dtx (with options: `batchfile') %% -%% $Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +%% $Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ %% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% ----------------------------------------------------------------- %% Author: @@ -35,7 +35,7 @@ \askforoverwritefalse \preamble -$Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +$Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ ----------------------------------------------------------------- Author: diff --git a/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty b/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty index 90bf31d5444..98b6c613b88 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 343 2012-05-21 05:59:17Z sobenlee $ +%% $Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ %% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% ----------------------------------------------------------------- %% Author: @@ -31,45 +31,144 @@ %% \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} -\GetIdInfo$Id: xeCJK.dtx 343 2012-05-21 05:59:17Z sobenlee $ +\GetIdInfo$Id: xeCJK.dtx 351 2012-07-20 05:30:58Z sobenlee $ {package for typesetting CJK scripts with XeLaTeX} -\ProvidesExplPackage{\ExplFileName}{\ExplFileDate}{3.0.6}{\ExplFileDescription} -\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 } } -\xeCJK_msg_new:nn { Require-XeTeX } +\ProvidesExplPackage{\ExplFileName}{\ExplFileDate}{3.0.7}{\ExplFileDescription} +\msg_new:nnn { xeCJK } { Require-XeTeX } { The~xeCJK~package~requires~XeTeX~to~function.\\\\ You~must~change~your~typesetting~engine~to~"xelatex" \\ - instead~of~plain~"latex"~or~"pdflatex"~or~"lualatex". + instead~of~plain~"latex"~or~"pdflatex"~or~"lualatex".\\ + Loading~xeCJK~will~abort! } \xetex_if_engine:F { \msg_critical:nn { xeCJK } { Require-XeTeX } } -\xeCJK_msg_new:nn { l3-too-old } +\msg_new:nnn { xeCJK } { l3-too-old } { Support~package~'expl3'~too~old. \\\\ Please~update~an~up~to~date~version~of~the~bundles\\\\ 'l3kernel'~and~'l3packages'\\\\ - using~your~TeX~package~manager~or~from~CTAN. + using~your~TeX~package~manager~or~from~CTAN.\\ + Loading~xeCJK~will~abort! } -\@ifpackagelater { expl3 } { 2012/02/19 } { } { \xeCJK_error:n { l3-too-old } } +\@ifpackagelater { expl3 } { 2012/07/16 } { } + { \msg_critical:nn { xeCJK } { l3-too-old } } \RequirePackage{xparse} \RequirePackage{l3keys2e} -\xeCJK_msg_new:nn { XeTeX-too-old } +\msg_new:nnn { xeCJK } { XeTeX-too-old } { \token_to_str:N \XeTeXglyphbounds\c_space_tl is~not~defined.\\\\ You~have~to~update~XeTeX~to~the~version~0.9995.0~or~later. } \cs_if_free:NT \XeTeXglyphbounds { - \xeCJK_error:n { XeTeX-too-old } - \AtBeginDocument { \punctstyle { plain } } + \msg_error:nn { xeCJK } { XeTeX-too-old } + \AtEndOfPackage { \xeCJK_AfterPreamble:n { \punctstyle { plain } } } + } +\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 +\clist_new:N \l_xeCJK_tmpa_clist +\clist_new:N \l_xeCJK_tmpb_clist +\clist_new:N \l_xeCJK_tmpc_clist +\tl_new:N \g_xeCJK_at_end_preamble_hook +\tl_new:N \g_xeCJK_after_preamble_hook +\tl_new:N \g_xeCJK_after_end_preamble_hook +\cs_new:Nn \xeCJK_AtEndPreamble:n + { \tl_gput_right:Nn \g_xeCJK_at_end_preamble_hook {#1} } +\cs_new:Nn \xeCJK_AfterPreamble:n + { \tl_gput_right:Nn \g_xeCJK_after_preamble_hook {#1} } +\cs_new:Nn \xeCJK_AfterEndPreamble:n + { \tl_gput_right:Nn \g_xeCJK_after_end_preamble_hook {#1} } +\AtBeginDocument { \g_xeCJK_after_preamble_hook } +\tl_put_left:Nn \document { \group_end: \g_xeCJK_at_end_preamble_hook \group_begin: } +\tl_put_right:Nn \document { \g_xeCJK_after_end_preamble_hook \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 + { + \group_end: + \prg_new_conditional:Nnn \xeCJK_if_outer_macro:c { p , T , F , TF } + { + \exp_last_unbraced:Nf \xeCJK_if_outer_macro_aux:w + { \cs_meaning:c {#1} } OUZER ~ MAYRO ; \q_stop + } + \cs_new_nopar:Npn \xeCJK_if_outer_macro_aux:w #1 OUZER ~ MAYRO ; #2 \q_stop + { + \if_cs_exist:w c_xeCJK_prefix_ #1 _aux_tl \cs_end: + \prg_return_true: \else: \prg_return_false: \fi: + } + \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 } } -\char_set_catcode_ignore:n { "FEFF } +\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 + \cs_set:Npx \xeCJK_peek_true:w + { + \exp_not:N \group_align_safe_end: + \exp_not:n {#2} + } + \cs_set:Npx \xeCJK_peek_false:w + { + \exp_not:N \group_align_safe_end: + \exp_not:n {#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:Nn \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: + } +\cs_new_protected_nopar:Nn \xeCJK_peek_ignore_spaces_execute_branches_aux: + { \peek_after:Nw \xeCJK_peek_ignore_spaces_execute_branches: } +\cs_new_nopar:Nn \xeCJK_peek_execute_branches_catcode: + { + \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: + } +\prg_new_conditional:Nnn \xeCJK_tl_if_blank:x { p , T , F , TF } + { + \if_int_compare:w \pdftex_strcmp:D { \c_empty_tl } {#1} = \c_zero + \prg_return_true: + \else: + \if_int_compare:w \pdftex_strcmp:D { \c_space_tl } {#1} = \c_zero + \prg_return_true: \else: \prg_return_false: \fi: + \fi: + } +\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 } } \keys_define:nn { xeCJK / options } { xeCJKactive .choice:, @@ -79,6 +178,7 @@ } \NewDocumentCommand \makexeCJKactive { } { \XeTeXinterchartokenstate = \c_one } \NewDocumentCommand \makexeCJKinactive { } { \XeTeXinterchartokenstate = \c_zero } +\char_set_catcode_ignore:n { "FEFF } \int_const:Nn \xeCJK_Default_class { 0 } \int_const:Nn \xeCJK_CJK_class { 1 } \int_const:Nn \xeCJK_FullLeft_class { 2 } @@ -111,21 +211,12 @@ \cs_generate_variant:Nn \prop_gput:Nnn { Nvx } \clist_map_inline:nn { CJK, FullLeft, FullRight } { \xeCJK_save_CJK_class:n {#1} } \cs_new_nopar:Nn \xeCJK_class_num:n { \tl_use:c { xeCJK_#1_class } } -\prg_set_conditional:Nnn \tl_if_blank:x { p , T , F , TF } - { - \if_int_compare:w \pdftex_strcmp:D { \c_empty_tl } {#1} = \c_zero - \prg_return_true: - \else: - \if_int_compare:w \pdftex_strcmp:D { \c_space_tl } {#1} = \c_zero - \prg_return_true: \else: \prg_return_false: \fi: - \fi: - } \NewDocumentCommand \xeCJKDeclareCharClass { > { \TrimSpaces } m m } { \clist_gput_right:cx { g_xeCJK_#1_range_clist } {#2} \clist_map_inline:xn {#2} { - \str_if_eq:xxF {##1} { -> } + \str_if_eq_x:nnF {##1} { -> } { \xeCJK_setcharclass_aux:Nn \xeCJKsetcharclass {##1} { \xeCJK_class_num:n {#1} } @@ -137,23 +228,23 @@ \cs_generate_variant:Nn \clist_map_inline:nn { x } \NewDocumentCommand \xeCJKsetcharclass { m m m } { - \xeCJK_check_num_range:nnNN {#1} {#2} \l_tmpa_int \l_tmpb_int - \int_set:Nn \l_tmpc_int {#3} - \prop_if_in:NVTF \g_xeCJK_CJK_class_prop \l_tmpc_int + \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 { \cs_set_eq:NN \xeCJK_set_catcode:n \char_set_catcode_other:n } { \cs_set_eq:NN \xeCJK_set_catcode:n \use_none:n } \loop - \xeCJK_set_catcode:n \l_tmpa_int - \XeTeXcharclass \l_tmpa_int = \l_tmpc_int - \if_int_compare:w \l_tmpa_int < \l_tmpb_int - \int_incr:N \l_tmpa_int + \xeCJK_set_catcode:n \l_xeCJK_tmpa_int + \XeTeXcharclass \l_xeCJK_tmpa_int = \l_xeCJK_tmpc_int + \if_int_compare:w \l_xeCJK_tmpa_int < \l_xeCJK_tmpb_int + \int_incr:N \l_xeCJK_tmpa_int \repeat } \cs_new_nopar:Nn \xeCJK_check_num_range:nnNN { - \bool_if:nTF { \tl_if_blank_p:x {#1} || \tl_if_blank_p:x {#2} } + \bool_if:nTF { \xeCJK_tl_if_blank_p:x {#1} || \xeCJK_tl_if_blank_p:x {#2} } { - \int_set:Nn #3 { \tl_if_blank:xTF {#1} {#2} {#1} } + \int_set:Nn #3 { \xeCJK_tl_if_blank:xTF {#1} {#2} {#1} } \int_set_eq:NN #3 #4 } { @@ -305,18 +396,15 @@ { \tex_unskip:D \bool_if:nTF - { - \int_compare_p:nNn \tex_lastkern:D = \c_one || - \int_compare_p:nNn \tex_lastkern:D = \c_two - } + { \xeCJK_if_last_node_p:n { CJK } || \xeCJK_if_last_node_p:n { CJK_space } } { \CJKecglue } { \c_space_token } } { - \int_compare:nNnTF \tex_lastkern:D = \c_one { \CJKecglue } - { \int_compare:nNnT \tex_lastkern:D = \c_two \xeCJK_space_or_xecglue: } + \xeCJK_if_last_node:nTF { CJK } { \CJKecglue } + { \xeCJK_if_last_node:nT { CJK_space } { \xeCJK_space_or_xecglue: } } } } - \str_if_eq:xxF {#1} { NormalSpace } + \str_if_eq_x:nnF {#1} { NormalSpace } { \xeCJK_app_inter_class_toks:nnn { CJK } {#1} { \CJKecglue } } } \clist_map_inline:nn { Default, HalfRight, NormalSpace } @@ -324,68 +412,65 @@ \xeCJK_inter_class_toks:nnn {#1} { Boundary } { \peek_catcode:NTF \c_space_token - { { \xeCJK_default_space_kern: } } { { \xeCJK_default_kern: } } + { { \xeCJK_make_node:n { default_space } } } + { { \xeCJK_make_node:n { default } } } } - \str_if_eq:xxF {#1} { NormalSpace } + \str_if_eq_x: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_nopar:Nn \xeCJK_Boundary_and_CJK: { - { - \bool_if:nTF - { - \int_compare_p:nNn \tex_lastkern:D = \c_one || - \int_compare_p:nNn \tex_lastkern:D = \c_two - } - { \CJKglue } - { - \bool_if:nTF - { - \int_compare_p:nNn \tex_lastkern:D = \c_three || - \int_compare_p:nNn \etex_lastnodetype:D = \c_ten || - ( \int_compare_p:nNn \etex_lastnodetype:D = \c_twelve && - \g_xeCJK_itcorr_bool ) - } - { \CJKecglue } - { - \bool_if:nT - { - \l_xeCJK_xecglue_bool && - \int_compare_p:nNn \etex_lastnodetype:D = \c_eleven && - ( \skip_if_eq_p:nn \tex_lastskip:D \l_xeCJK_space_glue_tl || - \int_compare_p:nNn \tex_lastskip:D = \l_xeCJK_ecglue_dim ) - } - { - \skip_set_eq:NN \l_tmpa_skip \tex_lastskip:D - \tex_unskip:D - \bool_if:nTF - { - \int_compare_p:nNn \tex_lastkern:D = \c_four || - \int_compare_p:nNn \etex_lastnodetype:D = \c_ten || - \int_compare_p:nNn \tex_lastkern:D = \c_three || - \g_xeCJK_itcorr_bool - } - { \CJKecglue } - { - \bool_if:nT - { - ! ( \int_compare_p:nNn \tex_lastkern:D = \c_one ) || - ! ( \int_compare_p:nNn \tex_lastkern:D = \c_two ) || - \l_xeCJK_space_bool - } - { \skip_horizontal:N \l_tmpa_skip } - } - } - } - } - \bool_gset_false:N \g_xeCJK_itcorr_bool - } + { \xeCJK_check_for_glue: } \c_group_begin_token \xeCJK_clear_CJK_toks: \xeCJK_select_font: \CJKsymbol } +\cs_new_nopar:Nn \xeCJK_check_for_glue: + { + \bool_if:nTF + { \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 } + } + { \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 ) + } + { + \tex_unskip:D + \bool_if:nTF + { + \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 } + } + { \CJKecglue } + { + \bool_if:nTF + { + \xeCJK_if_last_node_p:n { CJK } || + \xeCJK_if_last_node_p:n { CJK_space } + } + { \bool_if:NTF \l_xeCJK_space_bool \c_space_token \CJKglue } + { \c_space_token } + } + } + } + } + } \tl_set:Nn \l_xeCJK_space_glue_tl { \tex_fontdimen:D \c_two \tex_font:D @@ -395,7 +480,7 @@ \xeCJK_inter_class_toks:nnn { CJK } { Boundary } { \c_group_end_token - { \xeCJK_CJK_kern: } + { \xeCJK_make_node:n { CJK } } \xeCJK_ignorespaces: } \xeCJK_inter_class_toks:nnn { CJK } { CJK } { \xeCJK_CJK_and_CJK:N } @@ -415,7 +500,7 @@ \clist_map_inline:Nn \g_xeCJK_base_class_clist { \bool_if:nF - { \str_if_eq_p:xx {#1} { FullLeft } || \str_if_eq_p:xx {#1} { FullRight } } + { \str_if_eq_x_p:nn {#1} { FullLeft } || \str_if_eq_x_p:nn {#1} { FullRight } } { \xeCJK_pre_inter_class_toks:nnn { FullLeft } {#1} { \nobreak } \xeCJK_pre_inter_class_toks:nnn { FullRight } {#1} { \xeCJK_after_FullRight: } @@ -438,8 +523,8 @@ \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 } + \@plus \dim_eval:n { ( \tl_use:c { \l_xeCJK_punct_coor_tl/glue/#1 } ) /4 } + \@minus \dim_eval:n { ( \tl_use:c { \l_xeCJK_punct_coor_tl/glue/#1 } ) /2 } } } \cs_new_nopar:Nn \xeCJK_punct_kern:n @@ -521,16 +606,33 @@ \tl_set:Nx \l_xeCJK_lastpunct_tl {#1} \CJKpunctsymbol {#1} } -\cs_new_nopar:Nn \xeCJK_CJK_kern: { \tex_kern:D -1 sp \tex_kern:D 1 sp } -\cs_new_nopar:Nn \xeCJK_CJK_space_kern: { \tex_kern:D -2 sp \tex_kern:D 2 sp } -\cs_new_nopar:Nn \xeCJK_default_kern: { \tex_kern:D -3 sp \tex_kern:D 3 sp } -\cs_new_nopar:Nn \xeCJK_default_space_kern: { \tex_kern:D -4 sp \tex_kern:D 4 sp } -\keys_define:nn { xeCJK / options } { CJKglue .tl_set_x:N = \CJKglue } + \prg_new_conditional:Nnn \xeCJK_if_last_node:n { 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_nopar:Nn \xeCJK_def_node:nn + { + \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:Nn \xeCJK_make_node:n + { + \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 .tl_set:N = \CJKglue } \keys_define:nn { xeCJK / options } { CJKecglue .code:n = { - \cs_set:Npx \CJKecglue {#1} + \cs_set:Npn \CJKecglue {#1} \settowidth \l_xeCJK_ecglue_dim \CJKecglue }, xCJKecglue .choice:, @@ -547,7 +649,7 @@ xCJKecglue / unknown .code:n = { \bool_set_true:N \l_xeCJK_xecglue_bool - \cs_set:Npx \CJKecglue {#1} + \cs_set:Npn \CJKecglue {#1} \settowidth \l_xeCJK_ecglue_dim \CJKecglue \cs_set_eq:NN \xeCJK_space_or_xecglue: \CJKecglue }, @@ -578,9 +680,9 @@ { \peek_catcode:NTF \c_space_token { - \int_compare:nNnT \tex_lastkern:D = \c_one - { \tex_unkern:D \tex_unkern:D { \xeCJK_CJK_space_kern: } } - \peek_catcode_ignore_spaces:NTF \c_math_toggle_token + \xeCJK_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 @@ -603,9 +705,10 @@ { \peek_catcode:NTF \c_space_token { - \int_compare:nNnT \tex_lastkern:D = \c_one - { \tex_unkern:D \tex_unkern:D { \xeCJK_CJK_space_kern: } } - \peek_catcode_ignore_spaces:NF \c_space_token { \xeCJK_space_or_xecglue: } + \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 } @@ -622,7 +725,6 @@ CheckSingle / false .code:n = { \xeCJKdisablechecksingle }, CheckSingle .default:n = { true }, CJKchecksingle .meta:n = { CheckSingle = true } , - CheckSingleglue .tl_set_x:N = { \CJKchecksingleglue }, } \bool_new:N \l_xeCJK_checksingle_bool \NewDocumentCommand \xeCJKenablechecksingle { } @@ -631,9 +733,7 @@ { \bool_set_true:N \l_xeCJK_checksingle_bool \cs_set_eq:NN \xeCJK_checksingle_save_CJKsymbol:N \xeCJK_CJK_and_CJK:N - \cs_set_eq:NN \xeCJK_checksingle_save_CJKglue \CJKglue \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \xeCJK_checksingle:N - \cs_set_nopar:Npn \CJKglue { \CJKchecksingleglue } } } \NewDocumentCommand \xeCJKdisablechecksingle { } @@ -641,7 +741,6 @@ \bool_if:NT \l_xeCJK_checksingle_bool { \bool_set_false:N \l_xeCJK_checksingle_bool - \cs_set_eq:NN \CJKglue \xeCJK_checksingle_save_CJKglue \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \xeCJK_checksingle_save_CJKsymbol:N } } @@ -676,7 +775,7 @@ { \bool_if:nTF { \token_if_space_p:c { l_peek_token } } { - \peek_catcode_ignore_spaces:NTF \c_catcode_other_token + \xeCJK_peek_catcode_ignore_spaces:NTF \c_catcode_other_token { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2 \c_space_token } { \bool_if:nTF @@ -748,42 +847,6 @@ \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 } -\group_begin: -\char_set_lccode:nn { `\; } { `\: } -\char_set_lccode:nn { `\Z } { `\t } -\char_set_lccode:nn { `\Y } { `\c } -\char_set_lccode:nn { `\T } { `\T } -\char_set_lccode:nn { `\F } { `\F } -\tl_map_function:nN { O U Z E R M A Y R ; } \char_set_catcode_other:N -\tl_to_lowercase:n - { - \group_end: - \prg_new_conditional:Nnn \xeCJK_if_outer_macro:c { p, T , F , TF } - { - \exp_last_unbraced:Nf \xeCJK_if_outer_macro_aux:w - \cs_meaning:c {#1} OUZER ~ MAYRO ; \q_stop - } - \cs_new_nopar:Npn \xeCJK_if_outer_macro_aux:w #1 OUZER ~ MAYRO ; #2 \q_stop - { - \prg_case_str:xxn { #1 ~ } - { - { \token_to_str:N \ } { \prg_return_true: } - { \token_to_str:N \long \token_to_str:N \ } { \prg_return_true: } - { \token_to_str:N \protected \token_to_str:N \ } { \prg_return_true: } - { \token_to_str:N \protected \token_to_str:N \long \token_to_str:N \ } - { \prg_return_true: } - } - { \prg_return_false: } - } - } -\tl_replace_once:Nnn \peek_ignore_spaces_execute_branches: - { \token_if_eq_meaning:NNTF \l_peek_token } - { \xeCJK_if_eq_meaning:cNTF { l_peek_token } } -\prg_new_conditional:Nnn \xeCJK_if_eq_meaning:cN { p , T , F , TF } - { - \exp_args:Nc \if_meaning:w {#1} #2 - \prg_return_true: \else: \prg_return_false: \fi: - } \tl_new:N \xeCJK_UL_subclass_patch_tl \clist_new:N \g_xeCJK_CJK_subclass_clist \cs_new_nopar:Nn \xeCJK_erase_CJKsymbol: @@ -825,7 +888,7 @@ { \xeCJKDeclareCharClass { CJK \bool_if:NF \l_xeCJK_sub_cancel_bool { /##1 } } - { \clist_use:c { g_xeCJK_CJK/##1_range_clist } } + { \tl_use:c { g_xeCJK_CJK/##1_range_clist } } } } } @@ -854,7 +917,7 @@ { \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } {##1} {#1} {##1} \xeCJK_copy_inter_class_toks:nnnn {##1} { #1/#2 } {##1} {#1} - \str_if_eq:xxTF {##1} { CJK } + \str_if_eq_x:nnTF {##1} { CJK } { \xeCJK_pre_inter_class_toks:nnn {##1} { #1/#2 } { \xeCJK_switch_font:nn {#1} {#2} } @@ -893,7 +956,7 @@ { \clist_map_inline:nn { Default, HalfLeft, HalfRight } { - \str_if_eq:xxTF {##1} { HalfLeft } + \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 } @@ -911,32 +974,20 @@ { CCT , halfwidth , fullwidth , marginkerning , mixedwidth , plain } \clist_map_inline:Nn \g_xeCJK_punctstyle_clist { \tl_const:cn { c_xeCJK_ps_#1_tl } {#1} } -\cs_generate_variant:Nn \keys_choices_generate:n { V } -\cs_new_protected:cpn { \c_keys_props_root_tl .generate_choices:V } #1 - { \keys_choices_generate:V {#1} } +\cs_generate_variant:Nn \keys_define:nn { nx } \keys_define:nn { xeCJK / options } { - AllowBreakBetweenPuncts .choice:, - AllowBreakBetweenPuncts / true .code:n = { \xeCJKallowbreakbetweenpuncts }, - AllowBreakBetweenPuncts / false .code:n = { \xeCJKnobreakbetweenpuncts }, - AllowBreakBetweenPuncts .default:n = { true }, - KaiMingPunct .code:n = { \xeCJK_set_special_punct:nn { mixedwidth } {#1} }, - KaiMingPunct+ .code:n = { \xeCJK_add_special_punct:nn { mixedwidth } {#1} }, - KaiMingPunct- .code:n = { \xeCJK_sub_special_punct:nn { mixedwidth } {#1} }, - LongPunct .code:n = { \xeCJK_set_special_punct:nn { long } {#1} }, - LongPunct+ .code:n = { \xeCJK_add_special_punct:nn { long } {#1} }, - LongPunct- .code:n = { \xeCJK_sub_special_punct:nn { long } {#1} }, - MiddlePunct+ .code:n = { \xeCJK_add_special_punct:nn { middle } {#1} }, - MiddlePunct .code:n = { \xeCJK_set_special_punct:nn { middle } {#1} }, - MiddlePunct- .code:n = { \xeCJK_sub_special_punct:nn { middle } {#1} }, - PunctWidth .tl_gset:N = \g_xeCJK_punct_width_tl , PunctStyle .choice_code:n = { \tl_set:Nx \l_xeCJK_punctstyle_tl { \l_keys_choice_tl } \tl_if_eq:NNT \l_xeCJK_punctstyle_tl \c_xeCJK_ps_plain_tl - { \xeCJKallowbreakbetweenpuncts } + { \xeCJKallowbreakbetweenpuncts } }, - PunctStyle .generate_choices:V = \g_xeCJK_punctstyle_clist, + } +\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 }, @@ -950,6 +1001,23 @@ You~can~only~use~one~of\\\\ "\g_xeCJK_punctstyle_clist".\\ } +\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 { } @@ -979,7 +1047,7 @@ \tl_map_inline:xn {#2} { \tl_remove_all:cn { l_xeCJK_#1_punct_tl } {##1} - \prop_del:cn { l_xeCJK_#1_punct_prop } {##1} + \prop_remove:cn { l_xeCJK_#1_punct_prop } {##1} } } \cs_generate_variant:Nn \tl_map_inline:nn { x } @@ -1002,31 +1070,31 @@ { { \xeCJK_select_font: \xeCJK_get_punct_dimen:N {#2} } } \xeCJK_punct_if_long:NTF {#2} { - \dim_zero:N \l_tmpa_dim - \dim_zero:N \l_tmpb_dim - \dim_zero:N \l_tmpc_dim + \dim_zero:N \l_xeCJK_tmpa_dim + \dim_zero:N \l_xeCJK_tmpb_dim + \dim_zero:N \l_xeCJK_tmpc_dim } { - \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/#1/#2 } - \dim_set:Nc \l_tmpb_dim - { \l_xeCJK_punct_coor_tl/bound/\str_if_eq:xxTF {#1} lrl/#2 } - \dim_set:Nn \l_tmpc_dim + \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 { \cs_if_exist_use:cF { g_xeCJK_punct_width/#2 } { - \tl_if_blank:xTF \g_xeCJK_punct_width_tl + \xeCJK_tl_if_blank:xTF \g_xeCJK_punct_width_tl { \c_zero_dim } { \g_xeCJK_punct_width_tl } } } \xeCJK_punct_if_middle:NTF {#2} { - \dim_set:Nn \l_tmpc_dim + \dim_set:Nn \l_xeCJK_tmpc_dim { - \dim_compare:nNnTF \l_tmpc_dim > \c_zero_dim - { \l_tmpc_dim } + \dim_compare:nNnTF \l_xeCJK_tmpc_dim > \c_zero_dim + { \l_xeCJK_tmpc_dim } { - \prg_case_tl:Nnn \l_xeCJK_punctstyle_tl + \tl_case:Nnn \l_xeCJK_punctstyle_tl { \c_xeCJK_ps_halfwidth_tl { .5 em } \c_xeCJK_ps_mixedwidth_tl { .5 em } @@ -1037,49 +1105,49 @@ } - \tl_use:c { \l_xeCJK_punct_coor_tl/dimen/#2 } } - \dim_set:Nn \l_tmpc_dim { .5 \l_tmpc_dim } + \dim_set:Nn \l_xeCJK_tmpc_dim { .5 \l_xeCJK_tmpc_dim } } { - \dim_compare:nNnTF \l_tmpc_dim > \c_zero_dim + \dim_compare:nNnTF \l_xeCJK_tmpc_dim > \c_zero_dim { - \dim_set:Nn \l_tmpc_dim + \dim_set:Nn \l_xeCJK_tmpc_dim { - \l_tmpc_dim - \l_tmpb_dim + \l_xeCJK_tmpc_dim - \l_xeCJK_tmpb_dim - \tl_use:c { \l_xeCJK_punct_coor_tl/dimen/#2 } } } { - \dim_set_eq:NN \l_tmpc_dim \l_tmpa_dim - \dim_set_min:Nn \l_tmpc_dim \l_tmpb_dim - \prg_case_tl:Nnn \l_xeCJK_punctstyle_tl + \dim_set_eq:NN \l_xeCJK_tmpc_dim \l_xeCJK_tmpa_dim + \dim_set_min:Nn \l_xeCJK_tmpc_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_tmpc_dim { .5 \l_tmpa_dim } - \dim_set_min:Nn \l_tmpc_dim \l_tmpa_dim + \dim_add:Nn \l_xeCJK_tmpc_dim { .5 \l_xeCJK_tmpa_dim } + \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_tmpc_dim { .5 \l_tmpa_dim } } - { \dim_add:Nn \l_tmpc_dim { .3 \l_tmpa_dim } } - \dim_set_min:Nn \l_tmpc_dim \l_tmpa_dim + { \dim_add:Nn \l_xeCJK_tmpc_dim { .5 \l_xeCJK_tmpa_dim } } + { \dim_add:Nn \l_xeCJK_tmpc_dim { .3 \l_xeCJK_tmpa_dim } } + \dim_set_min:Nn \l_xeCJK_tmpc_dim \l_xeCJK_tmpa_dim } } - { \dim_set_eq:NN \l_tmpc_dim \l_tmpa_dim } + { \dim_set_eq:NN \l_xeCJK_tmpc_dim \l_xeCJK_tmpa_dim } } } - \dim_set_max:Nn \l_tmpc_dim \c_zero_dim + \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_tmpa_dim } + { - \dim_use:N \l_xeCJK_tmpa_dim } \tl_gset:cx { \l_xeCJK_punct_coor_tl/rule/m/#2 } - { - \dim_use:N \l_tmpb_dim } - \tl_gset:cV { \l_xeCJK_punct_coor_tl/glue/#1/#2 } \l_tmpc_dim + { - \dim_use:N \l_xeCJK_tmpb_dim } + \tl_gset:cV { \l_xeCJK_punct_coor_tl/glue/#1/#2 } \l_xeCJK_tmpc_dim } } } @@ -1115,14 +1183,14 @@ { \tl_if_exist:cF { \l_xeCJK_punct_coor_tl/kern/#1-#2 } { - \dim_zero:N \l_tmpa_dim + \dim_zero:N \l_xeCJK_tmpa_dim \tl_if_eq:NNF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_plain_tl { \tl_if_exist:cTF { g_xeCJK_punct/kern/#1-#2 } - { \dim_set:Nc \l_tmpa_dim { g_xeCJK_punct/kern/#1-#2 } } + { \dim_set:Nc \l_xeCJK_tmpa_dim { g_xeCJK_punct/kern/#1-#2 } } { \xeCJK_calc_kern:NN {#1} {#2} } } - \tl_gset:cV { \l_xeCJK_punct_coor_tl/kern/#1-#2 } \l_tmpa_dim + \tl_gset:cV { \l_xeCJK_punct_coor_tl/kern/#1-#2 } \l_xeCJK_tmpa_dim } } \cs_new_nopar:Nn \xeCJK_calc_kern:NN @@ -1130,21 +1198,21 @@ \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_marginkerning_tl { \xeCJK_punct_if_right:NT {#1} - { \dim_add:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } } + { \dim_add:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } } \xeCJK_punct_if_right:NF {#2} - { \dim_add:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } } + { \dim_add:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } } } { \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_fullwidth_tl - { \xeCJK_calc_kern:NnNN \l_tmpa_dim { 1.5 em } {#1} {#2} } + { \xeCJK_calc_kern:NnNN \l_xeCJK_tmpa_dim { 1.5 em } {#1} {#2} } { \xeCJK_punct_if_both_left_right:NNTF {#1} {#2} { \xeCJK_punct_if_mixedwidth:NT {#1} { - \xeCJK_calc_kern:NnNN \l_tmpa_dim { 1 em } {#1} {#2} - \dim_compare:nNnT \l_tmpa_dim < { .1 em } - { \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } } + \xeCJK_calc_kern:NnNN \l_xeCJK_tmpa_dim { 1 em } {#1} {#2} + \dim_compare:nNnT \l_xeCJK_tmpa_dim < { .1 em } + { \dim_set:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } } } } { @@ -1154,27 +1222,27 @@ ! ( \tl_if_eq_p:NN \l_xeCJK_punctstyle_tl \c_xeCJK_ps_halfwidth_tl ) } { - \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/glue/r/#1 } - \dim_set:Nn \l_tmpa_dim { .7 \l_tmpa_dim } + \dim_set:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/glue/r/#1 } + \dim_set:Nn \l_xeCJK_tmpa_dim { .7 \l_xeCJK_tmpa_dim } } { - \xeCJK_calc_kern:NnNN \l_tmpa_dim { 1 em } {#1} {#2} - \dim_compare:nNnT \l_tmpa_dim < { .1 em } + \xeCJK_calc_kern:NnNN \l_xeCJK_tmpa_dim { 1 em } {#1} {#2} + \dim_compare:nNnT \l_xeCJK_tmpa_dim < { .1 em } { - \dim_set:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } - \dim_set_min:Nc \l_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } - \dim_set:Nc \l_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } - \dim_set_min:Nc \l_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/r/#2 } - \dim_set_max:Nn \l_tmpa_dim \l_tmpb_dim + \dim_set:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/l/#1 } + \dim_set_min:Nc \l_xeCJK_tmpa_dim { \l_xeCJK_punct_coor_tl/bound/r/#1 } + \dim_set:Nc \l_xeCJK_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/l/#2 } + \dim_set_min:Nc \l_xeCJK_tmpb_dim { \l_xeCJK_punct_coor_tl/bound/r/#2 } + \dim_set_max:Nn \l_xeCJK_tmpa_dim \l_xeCJK_tmpb_dim } } } } \bool_if:nT { \xeCJK_punct_if_long_p:N {#1} || \xeCJK_punct_if_long_p:N {#2} } - { \dim_set_max:Nn \l_tmpa_dim { .1 em } } + { \dim_set_max:Nn \l_xeCJK_tmpa_dim { .1 em } } } - \dim_set_max:Nn \l_tmpa_dim \c_zero_dim + \dim_set_max:Nn \l_xeCJK_tmpa_dim \c_zero_dim } \cs_generate_variant:Nn \xeCJK_get_kern:NN { V } \cs_new_nopar:Nn \xeCJK_calc_kern:NnNN @@ -1194,26 +1262,26 @@ } \cs_new_nopar:Nn \xeCJK_get_punct_dimen:N { - \xeCJK_get_glyph_bounds:nNN { left } {#1} \l_tmpa_dim - \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/l/#1 } \l_tmpa_dim - \dim_set_eq:NN \l_tmpb_dim \l_tmpa_dim - \xeCJK_get_glyph_bounds:nNN { right } {#1} \l_tmpa_dim - \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/r/#1 } \l_tmpa_dim - \dim_add:Nn \l_tmpb_dim \l_tmpa_dim + \xeCJK_get_glyph_bounds:nNN { left } {#1} \l_xeCJK_tmpa_dim + \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/l/#1 } \l_xeCJK_tmpa_dim + \dim_set_eq:NN \l_xeCJK_tmpb_dim \l_xeCJK_tmpa_dim + \xeCJK_get_glyph_bounds:nNN { right } {#1} \l_xeCJK_tmpa_dim + \tl_gset:cV { \l_xeCJK_punct_coor_tl/bound/r/#1 } \l_xeCJK_tmpa_dim + \dim_add:Nn \l_xeCJK_tmpb_dim \l_xeCJK_tmpa_dim \tl_gset:cx { \l_xeCJK_punct_coor_tl/dimen/#1 } - { \dim_eval:n { \etex_fontcharwd:D \tex_font:D `#1 - \l_tmpb_dim } } + { \dim_eval:n { \etex_fontcharwd:D \tex_font:D `#1 - \l_xeCJK_tmpb_dim } } \bool_if:nT { \xeCJK_punct_if_long_p:N {#1} && - ! ( \str_if_eq_p:xx {#1} { … } || \str_if_eq_p:xx {#1} { ‥ } ) + ! ( \str_if_eq_x_p:nn {#1} { … } || \str_if_eq_x_p:nn {#1} { ‥ } ) } { \clist_map_inline:Nn \g_xeCJK_punctstyle_clist { - \str_if_eq:xxF \c_xeCJK_ps_plain_tl {##1} + \str_if_eq_x:nnF \c_xeCJK_ps_plain_tl {##1} { \tl_gset:cx { \l_xeCJK_font_coor_tl/##1/kern/#1-#1 } - { - \dim_use:N \l_tmpb_dim } + { - \dim_use:N \l_xeCJK_tmpb_dim } } } } @@ -1223,10 +1291,10 @@ \dim_set:Nn #3 { \XeTeXglyphbounds - \prg_case_str:xxn {#1} + \str_case_x:nnn {#1} { - { left } { \c_one } { top } { \c_two } - { right } { \c_three } { bottom } { \c_four } + { left } { \c_one } { top } { \c_two } + { right } { \c_three } { bottom } { \c_four } } { \c_three } \int_eval:n { \XeTeXcharglyph `#2 } @@ -1265,7 +1333,7 @@ \font_glyph_if_exist:NnTF \tex_font:D {`#1} { \xeCJK_fallback_save_CJKsymbol:N {#1} } { - \xeCJK_family_if_exist:nTF { \xeCJK@family/FallBack } + \xeCJK_family_if_exist:xTF { \xeCJK@family/FallBack } { { \tl_put_right:Nn \xeCJK@family { /FallBack } \xeCJK_select_font: @@ -1350,7 +1418,7 @@ { #1 .code:n = { - \tl_if_blank:xTF {##1} + \xeCJK_tl_if_blank:xTF {##1} { \bool_set_false:c { l_xeCJK_copy_#1_bool } \bool_set_false:c { l_xeCJK_add_#1_bool } @@ -1358,7 +1426,7 @@ } { \clist_put_right:Nx \l_xeCJK_sub_key_clist {#1} - \str_if_eq:xxTF {##1} * + \str_if_eq_x:nnTF {##1} * { \bool_set_true:c { l_xeCJK_copy_#1_bool } \bool_set_false:c { l_xeCJK_add_#1_bool } @@ -1376,20 +1444,20 @@ \cs_generate_variant:Nn \xeCJK_new_sub_key:n { x } \cs_new_nopar:Nn \xeCJK_get_sub_features:nn { - \tl_set:Nx \l_tmpa_tl {#2} + \tl_set:Nx \l_xeCJK_tmpa_tl {#2} \clist_clear:N \l_xeCJK_sub_fontfeat_clist - \xeCJK_gobble_brace:N \l_tmpa_tl - \exp_args:No \tl_if_head_eq_charcode:nNTF \l_tmpa_tl [ % ] + \xeCJK_gobble_brace:N \l_xeCJK_tmpa_tl + \exp_args:No \tl_if_head_eq_charcode:nNTF \l_xeCJK_tmpa_tl [ % ] { - \exp_after:wN \xeCJK_get_sub_features_aux:n \l_tmpa_tl \c_empty_tl - \tl_if_blank:xT \l_xeCJK_sub_fontname_tl + \exp_after:wN \xeCJK_get_sub_features_aux:n \l_xeCJK_tmpa_tl \c_empty_tl + \xeCJK_tl_if_blank:xT \l_xeCJK_sub_fontname_tl { - \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_tmpa_tl + \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_xeCJK_tmpa_tl \clist_clear:N \l_xeCJK_sub_fontfeat_clist } } - { \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_tmpa_tl } - \tl_if_blank:xTF \l_xeCJK_sub_fontname_tl + { \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_xeCJK_tmpa_tl } + \xeCJK_tl_if_blank:xTF \l_xeCJK_sub_fontname_tl { \tl_set:Nx \l_xeCJK_sub_fontname_tl \l_xeCJK_fontname_tl } { \tl_replace_all:Nnx \l_xeCJK_sub_fontname_tl * \l_xeCJK_fontname_tl } \clist_set:cx { l_xeCJK_#1_fontfeat_clist } \l_xeCJK_sub_fontfeat_clist @@ -1409,10 +1477,6 @@ \tl_set:Nx \l_xeCJK_sub_fontname_tl {#2} } \xeCJK_new_sub_key:n { FallBack } -\cs_set_protected:cpn { \c_keys_props_root_tl .clist_set_x:N } #1 - { \keys_variable_set:NnN #1 { clist } x } -\cs_set_protected:cpn { \c_keys_props_root_tl .clist_set_x:c } #1 - { \keys_variable_set:cnN {#1} { clist } x } \cs_new_nopar:Nn \xeCJK_map_features_id:n { \prop_get:Nn \g_xeCJK_features_id_prop { #1 } } \prop_new:N \g_xeCJK_features_id_prop @@ -1425,8 +1489,8 @@ { \keys_define:nn { xeCJK / features } { - #2Font .tl_set_x:c = { l_xeCJK_fontname_#1_tl }, - #2Features .clist_set_x:c = { l_xeCJK_fontfeat_#1_clist } , + #2Font .tl_set_x:c = { l_xeCJK_fontname_#1_tl }, + #2Features .tl_set_x:c = { l_xeCJK_fontfeat_#1_clist } , } } \keys_define:nn { xeCJK / features } @@ -1516,10 +1580,10 @@ \cs_generate_variant:Nn \xeCJK_set_family:nnn { ncc } \cs_new_nopar:Nn \xeCJK_check_family:n { - \prop_get:NnNT \g_xeCJK_family_prop {#1} \l_tmpa_tl + \prop_get:NnNT \g_xeCJK_family_prop {#1} \l_xeCJK_tmpa_tl { - \prop_gpop:NnNT \g_xeCJK_family_name_prop {#1} \l_tmpa_tl { } - \xeCJK_warning:nxx { CJKfamily-redef } {#1} \l_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 } } \cs_generate_variant:Nn \xeCJK_check_family:n { V } @@ -1564,7 +1628,7 @@ { \xeCJK_add_font_if_new:nv {bf#1} { l_xeCJK_fontname_#1_tl } } } { - \str_if_eq:xxT {#1} {bf} + \str_if_eq_x:nnT {#1} {bf} { \clist_map_inline:nn { it , sl } { @@ -1578,25 +1642,25 @@ } \prg_new_conditional:Nnn \xeCJK_if_font_select:n { p, T, F, TF } { - \exp_args:Nc - \tl_if_blank:xTF { l_xeCJK_fontname_#1_tl } \prg_return_false: \prg_return_true: + \exp_args:Nc \xeCJK_tl_if_blank:xTF { l_xeCJK_fontname_#1_tl } + \prg_return_false: \prg_return_true: } \prg_new_conditional:Nnn \xeCJK_if_it_or_sl:n { p, T, F, TF } { - \bool_if:nTF { \str_if_eq_p:xx { it } {#1} || \str_if_eq_p:xx { sl } {#1} } + \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: } \cs_new_nopar:Nn \xeCJK_set_fake:n { - \str_if_eq:xxTF {#1} { bf } + \str_if_eq_x:nnTF {#1} { bf } { \bool_if:NT \l_xeCJK_AutoFakeBold_bool { \xeCJK_add_fake_bold:n {#1} } } { \bool_if:NTF \l_xeCJK_AutoFakeSlant_bool { \bool_if:nT { \xeCJK_if_it_or_sl_p:n {#1} || - ( \str_if_eq_p:xx {#1} {bfit} && ! ( \xeCJK_if_font_select_p:n {it} ) ) || - ( \str_if_eq_p:xx {#1} {bfsl} && ! ( \xeCJK_if_font_select_p:n {sl} ) ) + ( \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_add_fake_slant:n {#1} } } @@ -1620,10 +1684,10 @@ } } \cs_new_nopar:Nn \xeCJK_get_map_font:n - { \tl_use:c { l_xeCJK_fontname_\str_if_eq:xxTF {#1} {it} {sl} {it} _tl } } + { \tl_use:c { l_xeCJK_fontname_\str_if_eq_x:nnTF {#1} {it} {sl} {it} _tl } } \prg_new_conditional:Nnn \xeCJK_if_map_font_select:n { p, T, F, TF } { - \tl_if_blank:xTF { \xeCJK_get_map_font:n {#1} } + \xeCJK_tl_if_blank:xTF { \xeCJK_get_map_font:n {#1} } \prg_return_false: \prg_return_true: } \cs_new_nopar:Nn \xeCJK_pass_features: @@ -1633,12 +1697,12 @@ \clist_if_empty:cF { l_xeCJK_fontfeat_##1_clist } { \clist_put_right:Nx \l_xeCJK_pass_features_clist - { ##2Features = { \clist_use:c { l_xeCJK_fontfeat_##1_clist } } } + { ##2Features = { \tl_use:c { l_xeCJK_fontfeat_##1_clist } } } } } \prop_map_inline:Nn \l_xeCJK_add_font_prop { \clist_put_right:Nx \l_xeCJK_pass_features_clist { ##1 = { ##2 } } } - \tl_if_blank:xF \l_xeCJK_monoscale_tl + \xeCJK_tl_if_blank:xF \l_xeCJK_monoscale_tl { \clist_put_right:Nx \l_xeCJK_pass_features_clist \l_xeCJK_monoscale_tl } } \prop_new:N \g_xeCJK_family_prop @@ -1665,27 +1729,27 @@ \bool_if:cT { l_xeCJK_copy_##1_bool } { \xeCJK_check_family:V \l_xeCJK_sub_family_tl - \prop_get:NVNT \g_xeCJK_family_prop \l_xeCJK_family_tl \l_tmpa_tl - { \prop_gput:NVV \g_xeCJK_family_prop \l_xeCJK_sub_family_tl \l_tmpa_tl } - \prop_get:NVNT \g_xeCJK_family_options_prop \l_xeCJK_family_tl \l_tmpa_clist + \prop_get:NVNT \g_xeCJK_family_prop \l_xeCJK_family_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_tl \l_xeCJK_tmpa_clist { - \clist_remove_all:Nn \l_tmpa_clist { ##1 = * } - \prop_gput:NVV \g_xeCJK_family_options_prop \l_xeCJK_sub_family_tl \l_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 } { - \xeCJK_family_if_exist:nT { \l_xeCJK_family_tl } + \xeCJK_family_if_exist:xT { \l_xeCJK_family_tl } { \prop_get:NnNT \exp_not:N \g_xeCJK_family_name_prop - { \l_xeCJK_family_tl } \exp_not:N \l_tmpa_tl + { \l_xeCJK_family_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_tmpa_tl + { \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 { \g_fontspec_encoding_tl } - \exp_not:N \fontfamily { \l_tmpa_tl } + \exp_not:N \fontfamily { \l_xeCJK_tmpa_tl } \exp_not:N \selectfont } } } @@ -1701,11 +1765,11 @@ } \cs_new_nopar:Nn \xeCJK_copy_family:nn { - \xeCJK_family_if_exist:nT {#2} + \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_tmpa_tl { \prop_gput:NnV ##1 {#1} \l_tmpa_tl } } + { \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 } } } @@ -1717,32 +1781,32 @@ { \tl_set:Nx \l_xeCJK_current_coor_tl \l_xeCJK_font_coor_tl \cs_if_exist_use:cT { xeCJK/family/\xeCJK@family } - { \exp_last_unbraced:NNV \cs_gset_eq:cN \l_xeCJK_current_coor_tl \font@name } + { \exp_last_unbraced:NNV \cs_gset_eq:cN \l_xeCJK_current_coor_tl \tex_font:D } } } \cs_new_eq:NN \xeCJK@setfont \xeCJK_select_font: \cs_new_nopar:Nn \xeCJK_switch_font:nn { - \str_if_eq:xxF {#1} {#2} + \str_if_eq_x:nnF {#1} {#2} { \xeCJK_info:nxx { CJK-block } {#1} {#2} \tl_remove_all:Nn \xeCJK@family { /#1 } - \str_if_eq:xxF {#2} { CJK } + \str_if_eq_x:nnF {#2} { CJK } { - \tl_set:Nx \l_tmpa_tl \xeCJK@family + \tl_set:Nx \l_xeCJK_tmpa_tl \xeCJK@family \tl_put_right:Nx \xeCJK@family { /#2 } - \xeCJK_family_if_exist:nF \xeCJK@family + \xeCJK_family_if_exist:xF \xeCJK@family { - \xeCJK_family_if_exist:nTF { \CJKfamilydefault/#2 } + \xeCJK_family_if_exist:xTF { \CJKfamilydefault/#2 } { \xeCJK_copy_family:xx \xeCJK@family { \CJKfamilydefault/#2 } } - { \xeCJK_copy_family:xx \xeCJK@family \l_tmpa_tl } + { \xeCJK_copy_family:xx \xeCJK@family \l_xeCJK_tmpa_tl } } } } \xeCJK_select_font: } \xeCJK_msg_new:nn { CJK-block } { Switch~from~block~'#1'~to~'#2'. } -\prg_new_protected_conditional:Nnn \xeCJK_family_if_exist:n { T, F, TF } +\prg_new_protected_conditional:Nnn \xeCJK_family_if_exist:x { T, F, TF } { \cs_if_free:cTF { xeCJK/family/#1 } \prg_return_false: { @@ -1752,22 +1816,23 @@ } \NewDocumentCommand \CJKfamily { m } { - \xeCJK_family_if_exist:nTF {#1} + \xeCJK_family_if_exist:xTF {#1} { \tl_set:Nx \xeCJK@family {#1} } { - \cs_if_free:cT { xeCJK_warned_aux_#1 } + \seq_if_in:NxF \g_xeCJK_unknown_family_seq {#1} { + \seq_gput_right:Nx \g_xeCJK_unknown_family_seq {#1} \xeCJK_warning:nx { CJKfamily-Unknown } {#1} - \tl_new:c { xeCJK_warned_aux_#1 } } } \tex_ignorespaces:D } +\seq_new:N \g_xeCJK_unknown_family_seq \xeCJK_msg_new:nn { CJKfamily-Unknown } { Unknown~CJK~family~'#1'~is~ignored.\\\\ Try~to~use~ - \prg_case_str:xxn {#1} + \str_case_x:nnn {#1} { \CJKrmdefault { \token_to_str:N \setCJKmainfont } \CJKsfdefault { \token_to_str:N \setCJKsansfont } @@ -1811,35 +1876,35 @@ \prop_if_in:NVTF \g_xeCJK_family_prop \xeCJK@family { \group_begin: - \clist_set:Nx \l_tmpa_clist {#1} - \prop_get:NVN \g_xeCJK_family_prop \xeCJK@family \l_tmpa_tl + \clist_set:Nx \l_xeCJK_tmpa_clist {#1} + \prop_get:NVN \g_xeCJK_family_prop \xeCJK@family \l_xeCJK_tmpa_tl \clist_map_inline:Nn \g_xeCJK_CJK_subclass_clist { - \clist_if_in:NnT \l_tmpa_clist {##1} + \clist_if_in:NnT \l_xeCJK_tmpa_clist {##1} { - \clist_remove_all:Nn \l_tmpa_clist {##1} - \prop_get:NxNF \g_xeCJK_family_prop { \xeCJK@family/##1 } \l_tmpb_tl + \clist_remove_all:Nn \l_xeCJK_tmpa_clist {##1} + \prop_get:NxNF \g_xeCJK_family_prop { \xeCJK@family/##1 } \l_xeCJK_tmpb_tl { \prop_get:NxNF \g_xeCJK_family_prop - { \CJKfamilydefault/##1 } \l_tmpb_tl - { \tl_set:Nx \l_tmpb_tl \l_tmpa_tl } + { \CJKfamilydefault/##1 } \l_xeCJK_tmpb_tl + { \tl_set:Nx \l_xeCJK_tmpb_tl \l_xeCJK_tmpa_tl } } - \clist_set:Nx \l_tmpa_clist - { ##1 = { [ \l_tmpa_clist ] { \l_tmpb_tl } } } + \clist_set:Nx \l_xeCJK_tmpa_clist + { ##1 = { [ \l_xeCJK_tmpa_clist ] { \l_xeCJK_tmpb_tl } } } \clist_map_break: } } - \prop_get:NVNF \g_xeCJK_family_options_prop \xeCJK@family \l_tmpb_clist - { \clist_clear:N \l_tmpb_clist } - \clist_clear:N \l_tmpc_clist - \clist_map_inline:Nn \l_tmpb_clist + \prop_get:NVNF \g_xeCJK_family_options_prop \xeCJK@family \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_tmpa_clist {##1} - { \clist_put_right:Nn \l_tmpc_clist {##1} } + \clist_if_in:NnF \l_xeCJK_tmpa_clist {##1} + { \clist_put_right:Nn \l_xeCJK_tmpc_clist {##1} } } - \clist_put_left:NV \l_tmpa_clist \l_tmpc_clist + \clist_put_left:NV \l_xeCJK_tmpa_clist \l_xeCJK_tmpc_clist \use:x - { \group_end: \exp_not:N \CJKfontspec [ \l_tmpa_clist ] { \l_tmpa_tl } } + { \group_end: \exp_not:N \CJKfontspec [ \l_xeCJK_tmpa_clist ] { \l_xeCJK_tmpa_tl } } } { \xeCJK_warning:n { addCJKfontfeature-ignored } } \tex_ignorespaces:D @@ -1868,68 +1933,66 @@ \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:nnn \c_xeCJK_math_tl {#1} {#2} } \tl_const:Nn \c_xeCJK_math_tl { CJKmath } \keys_define:nn { xeCJK / options } { CJKmath .bool_gset:N = \g_xeCJK_math_bool } \NewDocumentCommand \xeCJKsetmathcode { m m m m } { - \xeCJK_check_num_range:nnNN {#1} {#2} \l_tmpa_int \l_tmpb_int - \int_set:Nn \l_tmpc_int { \xeCJK_math_type:n {#3} } + \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} } \loop - \XeTeXmathcode \l_tmpa_int = \l_tmpc_int \use:c { sym #4 } \l_tmpa_int - \if_int_compare:w \l_tmpa_int < \l_tmpb_int - \int_incr:N \l_tmpa_int + \XeTeXmathcode + \l_xeCJK_tmpa_int = \l_xeCJK_tmpc_int \use:c { sym #4 } \l_xeCJK_tmpa_int + \if_int_compare:w \l_xeCJK_tmpa_int < \l_xeCJK_tmpb_int + \int_incr:N \l_xeCJK_tmpa_int \repeat } -\cs_set_eq:NN \xeCJK_math_type:n \mathchar@type -\tl_put_left:Nn \document +\cs_new_eq:NN \xeCJK_math_type:n \mathchar@type +\cs_new_nopar:Nn \xeCJK_set_mathfont: { - \group_end: - \normalfont - \prop_if_empty:NTF \g_xeCJK_family_prop - { \xeCJK_warning:n { no-CJKfamily } } + \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 } + { \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 { - \bool_if:NT \g_xeCJK_math_bool + \DeclareSymbolFont \c_xeCJK_math_tl \g_fontspec_encoding_tl + \l_xeCJK_math_family_tl \mddefault \shapedefault + \SetSymbolFont \c_xeCJK_math_tl { bold } \g_fontspec_encoding_tl + \l_xeCJK_math_family_tl \bfdefault \shapedefault + \clist_map_inline:nn { CJK, FullLeft, FullRight } { - \xeCJK_family_if_exist:nTF \c_xeCJK_math_tl - { \tl_set:Nx \l_tmpa_tl \c_xeCJK_math_tl } + \clist_map_inline:cn { g_xeCJK_##1_range_clist } { - \xeCJK_family_if_exist:nTF \CJKfamilydefault - { \tl_set:Nx \l_tmpa_tl \CJKfamilydefault } - { \tl_set_eq:NN \l_tmpa_tl \q_no_value } - } - \prop_get:NVNT \g_xeCJK_family_name_prop \l_tmpa_tl \l_xeCJK_math_family_tl - { - \DeclareSymbolFont \c_xeCJK_math_tl \g_fontspec_encoding_tl - \l_xeCJK_math_family_tl \mddefault \shapedefault - \SetSymbolFont \c_xeCJK_math_tl { bold } \g_fontspec_encoding_tl - \l_xeCJK_math_family_tl \bfdefault \shapedefault - \clist_map_inline:nn { CJK, FullLeft, FullRight } - { - \clist_map_inline:cn { g_xeCJK_#1_range_clist } - { - \xeCJK_setcharclass_aux:Nn \xeCJKsetmathcode {##1} - \mathalpha \c_xeCJK_math_tl - } - } + \xeCJK_setcharclass_aux:Nn \xeCJKsetmathcode {####1} + \mathalpha \c_xeCJK_math_tl } } } - \group_begin: + } +\xeCJK_AtEndPreamble:n + { + \normalfont + \prop_if_empty:NTF \g_xeCJK_family_prop + { \xeCJK_warning:n { no-CJKfamily } } + { \bool_if:NT \g_xeCJK_math_bool { \xeCJK_set_mathfont: } } } \xeCJK_msg_new:nn { no-CJKfamily } { It~seems~that~you~have~not~declare~a~CJKfamily.\\ If~you~want~to~use~xeCJK~in~the~right~way,~you~should~use\\\\ - \token_to_str:N~\xeCJKmainfont[...]{...}\\\\ + \token_to_str:N \xeCJKmainfont[...]{...}\\\\ in~the~preamble~to~declare~the~main~CJKfamily.\\ } -\@onlypreamble \setCJKmainfont -\@onlypreamble \setCJKmathfont -\@onlypreamble \setCJKsansfont -\@onlypreamble \setCJKmonofont -\@onlypreamble \setCJKromanfont \fp_new:N \g_xeCJK_monoscale_fp \dim_new:N \g_xeCJK_exspace_dim \NewDocumentCommand \setCJKmonoscale { } @@ -1942,9 +2005,8 @@ { \group_begin: \fontfamily \ttdefault \selectfont - \fp_gset_from_dim:Nn \g_xeCJK_monoscale_fp - { \c_two \tex_fontdimen:D \c_two \tex_font:D } - \fp_gdiv:Nn \g_xeCJK_monoscale_fp \f@size + \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: } \NewDocumentCommand \setCJKmonoexspace { } { \xeCJK_set_monoexspace: } @@ -1990,7 +2052,7 @@ } } \bool_new:N \l_xeCJK_fixed_spacing_bool -\AtBeginDocument { \tl_put_right:Nn \verbatim@font \CJKfixedspacing } +\xeCJK_AfterPreamble:n { \tl_put_right:Nn \verbatim@font \CJKfixedspacing } \NewDocumentCommand \setCJKmonofont { s t+ O{} m } { \IfBooleanTF {#1} @@ -2035,7 +2097,6 @@ { CJKglue = { \skip_horizontal:n { \c_zero_skip \@plus .08\baselineskip } } , CJKecglue = \c_space_token , - CheckSingleglue = \CJKglue , xCJKecglue = false , CheckSingle = false , CJKspace = false , @@ -2064,38 +2125,43 @@ \keys_set:nn { xeCJK / options } {#1} \tex_ignorespaces:D } -\NewDocumentCommand \xeCJKsetEmboldenFactor { m } +\NewDocumentCommand \xeCJKsetemboldenfactor { m } { \xeCJKsetup { EmboldenFactor = {#1} } } -\NewDocumentCommand \xeCJKsetSlantFactor { m } +\NewDocumentCommand \xeCJKsetslantfactor { m } { \xeCJKsetup { SlantFactor = {#1} } } \NewDocumentCommand \punctstyle { m } { \xeCJKsetup { PunctStyle = {#1} } } \cs_new_nopar:Npn \xeCJKplainchr { \punctstyle { plain } } \NewDocumentCommand \CJKsetecglue { m } { \xeCJKsetup { CJKecglue = {#1} } } \cs_new_eq:NN \xeCJKsetecglue \CJKsetecglue -\cs_new_eq:NN \xeCJK_itcorr_aux \/ -\bool_new:N \g_xeCJK_itcorr_bool -\cs_set_protected_nopar:Npn \/ +\cs_new_nopar:Nn \xeCJK_fix_itcorr: { \scan_stop: - \int_compare:nNnT \tex_lastkern:D = \c_three + \xeCJK_if_last_node:nTF { default } { \tex_unkern:D \tex_unkern:D - \bool_gset_true:N \g_xeCJK_itcorr_bool + \xeCJK_itcorr_aux + { \xeCJK_make_node:n { default_itcorr } } } - \xeCJK_itcorr_aux + { \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 } } \cs_set_eq:NN \@@italiccorr \/ -\cs_new_nopar:Nn \xeCJK_compatibility_hook: +\xeCJK_AfterEndPreamble:n { \int_compare:nNnF - { \c_three + \seq_length:N \g_xeCJK_class_seq } = \xe@alloc@intercharclass + { \c_three + \seq_count:N \g_xeCJK_class_seq } = \xe@alloc@intercharclass { - \int_set_eq:NN \l_tmpa_int \c_three - \int_until_do:nNnn \l_tmpa_int = \xe@alloc@intercharclass + \int_set_eq:NN \l_xeCJK_tmpa_int \c_three + \int_until_do:nNnn \l_xeCJK_tmpa_int = \xe@alloc@intercharclass { - \int_incr:N \l_tmpa_int - \seq_if_in:NVF \g_xeCJK_class_seq \l_tmpa_int - { \xeCJK_set_others_toks:n \l_tmpa_int } + \int_incr:N \l_xeCJK_tmpa_int + \seq_if_in:NVF \g_xeCJK_class_seq \l_xeCJK_tmpa_int + { \xeCJK_set_others_toks:n \l_xeCJK_tmpa_int } } } } @@ -2123,10 +2189,9 @@ } } \int_new:N \xeCJK_Others_class -\tl_put_right:Nn \document { \xeCJK_compatibility_hook: \tex_ignorespaces:D } \cs_new_nopar:Nn \xeCJK_patch:Nnn { \tl_put_left:Nn #1 {#2} \tl_put_right:Nn #1 {#3} } -\AtBeginDocument +\xeCJK_AfterPreamble:n { \tl_map_inline:nn { @@ -2185,7 +2250,7 @@ } \xeCJK_UL_subclass_patch_tl } -\AtBeginDocument +\xeCJK_AfterPreamble:n { \cs_if_exist:NT \UL@hook { @@ -2196,7 +2261,7 @@ \cs_set_nopar:Npn \CJKsymbol #1 { { \xeCJK_select_font: \xeCJK_UL_CJKsymbol {#1} } - \xeCJK_CJK_kern: \xeCJK_ignorespaces: + \xeCJK_make_node:n { CJK } \xeCJK_ignorespaces: } \cs_set_nopar:Npn \CJKpunctsymbol #1 { { \xeCJK_select_font: \xeCJK_UL_CJKpunctsymbol {#1} } } @@ -2214,7 +2279,7 @@ \tl_set:Nn \CJK@UnicodeEnc { UTF8 } \cs_set_nopar:Npn \CJKaddEncHook #1#2 { \cs_set_nopar:cpn { xeCJK_enc_#1 } {#2} } \cs_set_nopar:Npn \Unicode #1#2 - { \tex_char:D \int_eval:n { #1 * \c_two_hundred_fifty_six + #2 } } + { \tex_char:D \int_eval:n { (#1) * \c_two_hundred_fifty_six + (#2) } } \RequirePackage { CJKnumb } \use:c { xeCJK_enc_\CJK@UnicodeEnc } \tl_set:Nn \CJK@tenthousand { 万 } |