diff options
Diffstat (limited to 'macros/xetex/latex/xecjk/xeCJK.dtx')
-rw-r--r-- | macros/xetex/latex/xecjk/xeCJK.dtx | 78 |
1 files changed, 62 insertions, 16 deletions
diff --git a/macros/xetex/latex/xecjk/xeCJK.dtx b/macros/xetex/latex/xecjk/xeCJK.dtx index cd08787254..d96a8eca04 100644 --- a/macros/xetex/latex/xecjk/xeCJK.dtx +++ b/macros/xetex/latex/xecjk/xeCJK.dtx @@ -194,7 +194,7 @@ Copyright and Licence %<*package|config|fntef|listings|xunicode|xunextra> %<!(config|xunextra)>\NeedsTeXFormat{LaTeX2e} %<!(config|xunextra)>\RequirePackage{expl3} -%<+!driver>\GetIdInfo$Id: xeCJK.dtx de49417 2022-06-04 19:40:54 +0800 Qing Lee <sobenlee@gmail.com> $ +%<+!driver>\GetIdInfo$Id: xeCJK.dtx 49800bb 2022-07-14 18:54:00 +0800 Qing Lee <sobenlee@gmail.com> $ %<package> {Typesetting CJK scripts with XeLaTeX} %<config> {Configuration file for xeCJK package} %<fntef> {xeCJK font effect} @@ -207,7 +207,7 @@ Copyright and Licence %<listings>\ProvidesExplPackage{xeCJK-listings} %<xunicode>\ProvidesExplPackage{xunicode-addon} %<xunextra>\ProvidesExplFile{xunicode-extra.def} -%<!driver> {\ExplFileDate}{3.8.9}{\ExplFileDescription} +%<!driver> {\ExplFileDate}{3.9.0}{\ExplFileDescription} %</package|config|fntef|listings|xunicode|xunextra> %<*driver> \documentclass{ctxdoc} @@ -287,7 +287,7 @@ Copyright and Licence % \changes{v3.8.0}{2020/02/09}{清理过时的兼容性补丁代码。} % \changes{v3.8.3}{2020/04/07}{删除 \texttt{\_nopar}。} % -% \CheckSum{10962} +% \CheckSum{11005} % \GetFileId{xeCJK.sty} % % \title{\bfseries\pkg{xeCJK} 宏包} @@ -1665,8 +1665,12 @@ Copyright and Licence { \ctex_disable_package:n { CJKfntef } } % \end{macrocode} % +% \changes{v3.9.0}{2022/07/08}{不直接依赖 \pkg{xparse} 和 \pkg{l3keys2e}。} +% % \begin{macrocode} -\RequirePackage { l3keys2e , xtemplate , xparse } +\cs_if_exist:NF \NewDocumentCommand + { \RequirePackage { xparse } } +\RequirePackage { xtemplate } % \end{macrocode} % % \subsection{内部工具} @@ -3288,7 +3292,7 @@ Copyright and Licence } { \token_if_space:NTF \l_peek_token - { { \xeCJK_make_node:n { default-space } } } + { \xeCJK_make_space_node: } { { \xeCJK_make_node:n { default } } } } } @@ -3337,7 +3341,7 @@ Copyright and Licence } { \token_if_space:NTF \l_peek_token - { { \xeCJK_make_node:n { default-space } } } + { \xeCJK_make_space_node: } { { \xeCJK_make_node:n { normalspace } } } } } @@ -3440,7 +3444,10 @@ Copyright and Licence % \begin{macrocode} \prg_new_conditional:Npnn \xeCJK_if_last_node:n #1 { p , T , F , TF } { - \if_dim:w \use:c { c_@@_#1_node_dim } = \tex_lastkern:D + \if_dim:w + \cs_if_exist_use:cTF { c_@@_#1_node_dim } + { = \tex_lastkern:D } + { \use:c { c_@@_#1_node_skip } = \tex_lastskip:D } \prg_return_true: \else: \prg_return_false: \fi: } % \end{macrocode} @@ -3450,7 +3457,7 @@ Copyright and Licence % \changes{v3.2.4}{2013/07/03}{尽量移除用作判断标志的 \tn{kern}。} % % \begin{macro}[int]{\xeCJK_declare_node:n,\xeCJK_make_node:n} -% 用于判断插入的各种 |kern|。 +% 用于判断插入的各种 |kern| 和 |glue|。 % \begin{macrocode} \cs_new_protected:Npn \xeCJK_declare_node:n #1 { @@ -3459,25 +3466,56 @@ Copyright and Licence { \dim_gset:cn } { \dim_const:cn } { c_@@_#1_node_dim } { \g_@@_node_int sp } } +\cs_new_protected:Npn \xeCJK_declare_glue_node:n #1 + { + \int_gincr:N \g_@@_node_int + \skip_if_exist:cTF { c_@@_#1_node_skip } + { \skip_gset:cn } { \skip_const:cn } + { c_@@_#1_node_skip } { \g_@@_node_int sp } + } \int_new:N \g_@@_node_int \int_gset:Nn \g_@@_node_int { 10 } \cs_new_protected:Npn \xeCJK_make_node:n #1 { \exp_args:Nc \@@_make_node:N { c_@@_#1_node_dim } } \cs_new:Npn \@@_node:n #1 { \use:c { c_@@_#1_node_dim } } +\cs_new:Npn \@@_gule_node:n #1 + { \use:c { c_@@_#1_node_skip } } \cs_new_protected:Npn \@@_make_node:N #1 { \tex_kern:D - #1 \tex_kern:D #1 } \cs_new_protected:Npn \xeCJK_remove_node: - { \tex_unkern:D \tex_unkern:D } + { + \int_compare:nNnTF \tex_lastnodetype:D = { 12 } + { \tex_unkern:D \tex_unkern:D } + { + \int_compare:nNnT \tex_lastnodetype:D = { 11 } + { \tex_unskip:D \tex_unskip:D } + } + } \xeCJK_declare_node:n { CJK } \xeCJK_declare_node:n { CJK-space } \xeCJK_declare_node:n { default } -\xeCJK_declare_node:n { default-space } \xeCJK_declare_node:n { CJK-widow } \xeCJK_declare_node:n { normalspace } +\xeCJK_declare_glue_node:n { default-space } +% \end{macrocode} +% \end{macro} +% +% \changes{v3.9.0}{2022/06/06}{修复西文的 character protrusion 功能。} +% +% \begin{macro}[int]{\xeCJK_make_space_node:} +% 用于判断插入空格之前的 node,默认为空,只有用户设置了 \opt{xCJKecglue} 选项才有意义。 +% 需要使用 |glue| 来标记,使用 |kern| 会影响 character protrusion 功能。 +% \begin{macrocode} +\cs_new_eq:NN \xeCJK_make_space_node: \prg_do_nothing: +\cs_new_protected:Npx \@@_make_space_node: + { + \tex_hskip:D - \@@_gule_node:n { default-space } + \tex_hskip:D \@@_gule_node:n { default-space } + } % \end{macrocode} % \end{macro} % @@ -3513,6 +3551,7 @@ Copyright and Licence { \bool_set_true:N \l_@@_xecglue_bool \cs_set_eq:NN \xeCJK_space_or_xecglue: \CJKecglue + \cs_set_eq:NN \xeCJK_make_space_node: \@@_make_space_node: \cs_set_eq:NN \xeCJK_check_for_xglue: \@@_check_for_xglue: \cs_set_eq:NN \xeCJK_check_for_ecglue: \@@_check_for_xecglue: \cs_set_eq:NN @@ -3523,6 +3562,7 @@ Copyright and Licence { \bool_set_false:N \l_@@_xecglue_bool \cs_set_eq:NN \xeCJK_space_or_xecglue: \xeCJK_space_glue: + \xeCJK_cs_clear:N \xeCJK_make_space_node: \xeCJK_cs_clear:N \xeCJK_check_for_xglue: \cs_set_eq:NN \xeCJK_check_for_ecglue: \@@_check_for_ecglue: \cs_set_eq:NN @@ -3535,6 +3575,7 @@ Copyright and Licence \cs_set_protected:Npn \CJKecglue {#1} \xeCJK_glue_to_skip:nN {#1} \l_@@_ecglue_skip \cs_set_eq:NN \xeCJK_space_or_xecglue: \CJKecglue + \cs_set_eq:NN \xeCJK_make_space_node: \@@_make_space_node: \cs_set_eq:NN \xeCJK_check_for_xglue: \@@_check_for_xglue: \cs_set_eq:NN \xeCJK_check_for_ecglue: \@@_check_for_xecglue: \cs_set_eq:NN @@ -3649,7 +3690,7 @@ Copyright and Licence { \@@_node:n { CJK } } { \xeCJK_remove_node: \xeCJK_make_node:n { CJK-space } } { \@@_node:n { default } } - { \xeCJK_remove_node: \xeCJK_make_node:n { default-space } } + { \xeCJK_remove_node: \xeCJK_make_space_node: } } \group_align_safe_begin: \token_if_macro:NTF \l_peek_token @@ -4619,7 +4660,7 @@ Copyright and Licence \xeCJK_get_punct_bounds:No \c_@@_right_tl \g_@@_last_punct_tl \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl \group_align_safe_begin: - \tl_case:NoTF \l_peek_token + \token_case_meaning:NoTF \l_peek_token { \l_@@_no_break_cs_case_tl } { \group_align_safe_end: @@ -4631,7 +4672,7 @@ Copyright and Licence \xeCJK_class_group_end: \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl } -\prg_generate_conditional_variant:Nnn \tl_case:Nn { No } { TF , F } +\prg_generate_conditional_variant:Nnn \token_case_meaning:Nn { No } { TF , F } % \end{macrocode} % \end{macro} % @@ -4930,13 +4971,13 @@ Copyright and Licence % l.10 \item % \end{verbatim} % 原因在于 \env{tabenum} 实际上是一个 \TeX 对齐环境(\tn{halign}),\tn{par} 在 -% 其中被重定义为 \tn{cr}。而在下面 \cs{tl_case:NnF} 的分支里有对 \tn{par} 的 +% 其中被重定义为 \tn{cr}。而在下面 \cs{token_case_meaning:NnF} 的分支里有对 \tn{par} 的 % \tn{ifx} 判断。解决办法是将判断用 \cs{group_align_safe_begin:} 和 % \cs{group_align_safe_end:} 包起来。或者改用原语 \cs{tex_par:D} 作为判断条件。 % \begin{macrocode} \cs_new_protected:Npn \xeCJK_check_single_cs:NNn #1#2#3 { - \tl_case:NoF \l_peek_token + \token_case_meaning:NoF \l_peek_token { \l_@@_check_single_cs_case_tl } { \use_iii:nnn } { \xeCJK_check_single_env:nnNn } @@ -8241,7 +8282,12 @@ Copyright and Licence % % 执行宏包选项,并载入 \pkg{fontspec} 宏包。 % \begin{macrocode} -\ProcessKeysOptions { xeCJK / options } +\cs_if_exist:NTF \ProcessKeyOptions + { \ProcessKeyOptions [ xeCJK / options ] } + { + \RequirePackage { l3keys2e } + \ProcessKeysOptions { xeCJK / options } + } \RequirePackage { fontspec } [ 2020/02/03 ] % \end{macrocode} % |