summaryrefslogtreecommitdiff
path: root/macros/xetex/latex/xecjk/xeCJK.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/xetex/latex/xecjk/xeCJK.dtx')
-rw-r--r--macros/xetex/latex/xecjk/xeCJK.dtx78
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}
%