texlive[55443] Master/texmf-dist: xecjk (6jun20)

commits+karl at tug.org commits+karl at tug.org
Sat Jun 6 23:13:36 CEST 2020


Revision: 55443
          http://tug.org/svn/texlive?view=revision&revision=55443
Author:   karl
Date:     2020-06-06 23:13:35 +0200 (Sat, 06 Jun 2020)
Log Message:
-----------
xecjk (6jun20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/xelatex/xecjk/xeCJK.pdf
    trunk/Master/texmf-dist/doc/xelatex/xecjk/xunicode-symbols.pdf
    trunk/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx
    trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty
    trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg
    trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty
    trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJKfntef.sty
    trunk/Master/texmf-dist/tex/xelatex/xecjk/xunicode-addon.sty
    trunk/Master/texmf-dist/tex/xelatex/xecjk/xunicode-extra.def

Modified: trunk/Master/texmf-dist/doc/xelatex/xecjk/xeCJK.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/xelatex/xecjk/xunicode-symbols.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx
===================================================================
--- trunk/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx	2020-06-06 21:13:17 UTC (rev 55442)
+++ trunk/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx	2020-06-06 21:13:35 UTC (rev 55443)
@@ -194,7 +194,7 @@
 %<*package|config|fntef|listings|xunicode|xunextra>
 %<!(config|xunextra)>\NeedsTeXFormat{LaTeX2e}
 %<!(config|xunextra)>\RequirePackage{expl3}
-%<+!driver>\GetIdInfo$Id: xeCJK.dtx b971c22 2020-05-01 21:10:43 +0800 Qing Lee <sobenlee at gmail.com> $
+%<+!driver>\GetIdInfo$Id: xeCJK.dtx 94baac7 2020-06-06 23:21:05 +0800 Qing Lee <sobenlee at gmail.com> $
 %<package>  {Typesetting CJK scripts with XeLaTeX}
 %<config>  {Configuration file for xeCJK package}
 %<fntef>  {xeCJK font effect}
@@ -207,17 +207,18 @@
 %<listings>\ProvidesExplPackage{xeCJK-listings}
 %<xunicode>\ProvidesExplPackage{xunicode-addon}
 %<xunextra>\ProvidesExplFile{xunicode-extra.def}
-%<!driver>  {\ExplFileDate}{3.8.3}{\ExplFileDescription}
+%<!driver>  {\ExplFileDate}{3.8.4}{\ExplFileDescription}
 %</package|config|fntef|listings|xunicode|xunextra>
 %<*driver>
 \documentclass{ctxdoc}
+\usepackage{xeCJKfntef}
 \xeCJKDeclareSubCJKBlock{SP} { "2E3A , "301C , "30A0 , "FF65 }
 \xeCJKDeclareSubCJKBlock{Ext-B} { "20000 -> "2A6DF }
 \xeCJKDeclareSubCJKBlock{Hangul}
   { "1100 -> "11FF, "3130 -> "318F, "A960 -> "A97F, "AC00 -> "D7AF }
-\setCJKmainfont[SP, Language=Chinese Simplified]{Source Han Serif}
+\setCJKmainfont[SP, Language=Chinese Simplified]{Source Han Serif SC}
 \setCJKmainfont[Ext-B]{SimSun-ExtB}
-\setCJKmainfont[Hangul, Script=Hangul, Language=Korean]{Source Han Serif}
+\setCJKmainfont[Hangul, Script=Hangul, Language=Korean]{Source Han Serif K}
 \newlist{psopt}{description}{3}
 \setlist[psopt]{%
   font=\mdseries\ttfamily, align=right,
@@ -233,7 +234,7 @@
   {
     \par
     \begingroup
-    \CJKfontspec[Language=Chinese ~ Simplified]{Source ~ Han ~ Serif}
+    \CJKfontspec[Language=Chinese ~ Simplified]{Source ~ Han ~ Serif ~ SC}
     \tl_clear:N \l_tmpa_tl
     \int_zero:N \l_tmpa_int
     \tl_set:Nx \l_tmpb_tl { \tl_to_str:n { c__xeCJK_#2_chars_clist } }
@@ -286,7 +287,7 @@
 % \changes{v3.8.0}{2020/02/09}{清理过时的兼容性补丁代码。}
 % \changes{v3.8.3}{2020/04/07}{删除 \texttt{\_nopar}。}
 %
-% \CheckSum{10799}
+% \CheckSum{10884}
 % \GetFileId{xeCJK.sty}
 %
 % \title{\bfseries\pkg{xeCJK} 宏包}
@@ -1822,11 +1823,13 @@
 % \end{macro}
 %
 % \begin{macro}[int]{\xeCJK_font_gset_to_current:N}
+% \changes{v3.8.4}{2020/06/04}{不缓存 \tn{nullfont}。}
 % |#1| 是控制序列的名字,令它等于当前字体命令。
 %    \begin{macrocode}
-\cs_new_protected:Npn \xeCJK_font_gset_to_current:N #1
-  { \exp_after:wN \cs_gset_eq:NN \exp_after:wN #1 \tex_the:D \tex_font:D }
-\cs_generate_variant:Nn \xeCJK_font_gset_to_current:N { c }
+\cs_new_protected:Npn \xeCJK_font_gset_to_current:N
+  { \exp_after:wN \@@_font_gset_to_current_aux:NN \tex_the:D \tex_font:D }
+\cs_new_protected:Npn \@@_font_gset_to_current_aux:NN #1#2
+  { \cs_if_eq:NNF #1 \tex_nullfont:D { \cs_gset_eq:NN #2#1 } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3184,6 +3187,7 @@
         \xeCJK_select_font:
         \xeCJK_clear_inter_class_toks:nn {#1} { CJK }
         \xeCJK_clear_Boundary_and_CJK_toks:
+        \xeCJK_fallback_symbol:NN
         \CJKsymbol
       }
     \xeCJK_inter_class_toks:nnn { CJK } {#1} { \xeCJK_class_group_end: }
@@ -3331,6 +3335,7 @@
     \xeCJK_class_group_begin:
     \xeCJK_clear_Boundary_and_CJK_toks:
     \xeCJK_select_font:
+    \xeCJK_fallback_symbol:NN
     \CJKsymbol
   }
 %    \end{macrocode}
@@ -3654,7 +3659,11 @@
 % \begin{macro}[int]{\xeCJK_CJK_and_CJK:N}
 %    \begin{macrocode}
 \cs_new_protected:Npn \xeCJK_CJK_and_CJK:N
-  { \CJKglue \CJKsymbol }
+  {
+    \CJKglue
+    \xeCJK_fallback_symbol:NN
+    \CJKsymbol
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3661,9 +3670,17 @@
 % \hypertarget{fl-fr-others}{}
 %    \begin{macrocode}
 \xeCJK_inter_class_toks:nnn { FullLeft }  { CJK }
-  { \xeCJK_FullLeft_and_CJK: \CJKsymbol }
+  {
+    \xeCJK_FullLeft_and_CJK:
+    \xeCJK_fallback_symbol:NN
+    \CJKsymbol
+  }
 \xeCJK_inter_class_toks:nnn { FullRight } { CJK }
-  { \xeCJK_FullRight_and_CJK: \CJKsymbol }
+  {
+    \xeCJK_FullRight_and_CJK:
+    \xeCJK_fallback_symbol:NN
+    \CJKsymbol
+  }
 \seq_map_inline:Nn \g_@@_non_CJK_class_seq
   {
     \clist_map_inline:nn { FullLeft , FullRight }
@@ -4046,6 +4063,7 @@
     \xeCJK_clear_Boundary_and_CJK_toks:
     \tl_gset:Nn \g_@@_last_punct_tl {#2}
     \@@_punct_rule:NN \c_@@_left_tl #2
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #2
   }
 \cs_new_protected:Npn \@@_Default_and_FullLeft_glue:N #1
@@ -4062,6 +4080,7 @@
     \tl_gset:Nn \g_@@_last_punct_tl {#1}
     \@@_punct_rule:NN \c_@@_left_tl #1
     \@@_select_punct_font:
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #1
   }
 \cs_new_protected:Npn \@@_CJK_and_FullLeft_glue:N #1
@@ -4083,6 +4102,7 @@
     \xeCJK_clear_Boundary_and_CJK_toks:
     \tl_gset:Nn \g_@@_last_punct_tl {#1}
     \@@_punct_rule:NN \c_@@_left_tl #1
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #1
   }
 %    \end{macrocode}
@@ -4452,6 +4472,7 @@
     \xeCJK_get_punct_kerning:oN \g_@@_last_punct_tl #1
     \@@_punct_kern:NN \g_@@_last_punct_tl #1
     \tl_gset:Nn \g_@@_last_punct_tl {#1}
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #1
   }
 %    \end{macrocode}
@@ -4478,6 +4499,7 @@
     \xeCJK_get_punct_kerning:oN \g_@@_last_punct_tl #1
     \xeCJK_punct_kern:NN \g_@@_last_punct_tl #1
     \tl_gset:Nn \g_@@_last_punct_tl {#1}
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #1
   }
 %    \end{macrocode}
@@ -4536,7 +4558,11 @@
 %
 % \begin{macro}[int]{\xeCJK_FullRight_symbol:N}
 %    \begin{macrocode}
-\cs_new:Npn \xeCJK_FullRight_symbol:N { \CJKpunctsymbol }
+\cs_new_protected:Npn \xeCJK_FullRight_symbol:N
+  {
+    \xeCJK_fallback_punct_symbol:NN
+    \CJKpunctsymbol
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -5064,8 +5090,11 @@
           }
           {
             \xeCJK_replace_inter_class_toks:nnnn {##1} { #1/#2 }
-              { \CJKsymbol }
-              { \@@_switch_font:nn {#1} {#2} \CJKsymbol }
+              { \xeCJK_fallback_symbol:NN }
+              {
+                \@@_switch_font:nn {#1} {#2}
+                \xeCJK_fallback_symbol:NN
+              }
           }
       }
     \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } { #1/#2 } {#1} {#1}
@@ -5271,7 +5300,7 @@
 % 一些用于记录的辅助函数。
 %    \begin{macrocode}
 \cs_new:Npn \@@_punct_csname:n #1
-  { c_@@_\l_xeCJK_current_font_tl/\l_xeCJK_punct_style_tl/#1/tl }
+  { c_@@_\l_xeCJK_current_punct_font_tl/\l_xeCJK_punct_style_tl/#1/tl }
 \cs_new:Npn \@@_use_punct_dim:nN #1#2
   { \use:c { \@@_punct_csname:n { dim/#1/#2 } } }
 \cs_new:Npn \@@_use_punct_dim:nNN #1#2#3
@@ -5446,6 +5475,7 @@
   {
     \group_begin:
       \xeCJK_select_punct_font:
+      \xeCJK_fallback_punct_symbol:NN
       \xeCJK_calc_punct_dimen:N #2
     \group_end:
     \dim_set:Nn \l_@@_bound_dim
@@ -6093,6 +6123,8 @@
 %
 % \subsection{后备字体}
 %
+% \changes{v3.8.4}{2020/05/31}{重构后备字体的实现,修正标点符号无后备字体的问题。}
+%
 % \begin{macro}{AutoFallBack}
 % 后备字体的宏包选项声明。
 %    \begin{macrocode}
@@ -6101,16 +6133,18 @@
     AutoFallBack .choice: ,
     AutoFallBack / true  .code:n =
       {
-        \cs_if_eq:NNF \CJKsymbol \xeCJK_fallback_test_glyph:N
-          {
-            \cs_set_eq:NN \@@_fallback_save_CJKsymbol:N \CJKsymbol
-            \cs_set_eq:NN \CJKsymbol \xeCJK_fallback_test_glyph:N
-          }
+        \cs_set_eq:NN \xeCJK_fallback_symbol:NN
+                      \@@_fallback_symbol:NN
+        \cs_set_eq:NN \xeCJK_fallback_punct_symbol:NN
+                      \@@_fallback_punct_symbol:NN
+        \cs_set_eq:NN \xeCJK_clear_fallback_font:
+                      \@@_clear_fallback_font:
       } ,
     AutoFallBack / false .code:n =
       {
-        \cs_if_eq:NNT \CJKsymbol \xeCJK_fallback_test_glyph:N
-          { \cs_set_eq:NN \CJKsymbol \@@_fallback_save_CJKsymbol:N }
+        \xeCJK_cs_clear:N \xeCJK_fallback_symbol:NN
+        \xeCJK_cs_clear:N \xeCJK_fallback_punct_symbol:NN
+        \xeCJK_cs_clear:N \xeCJK_clear_fallback_font:
       } ,
     AutoFallBack      .default:n = { true } ,
     fallback             .meta:n = { AutoFallBack = true }
@@ -6118,45 +6152,57 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[int]{\xeCJK_fallback_test_glyph:N}
+% \begin{macro}[int]{\xeCJK_fallback_symbol:NN,\xeCJK_fallback_punct_symbol:NN}
 % 测试当前字体中是否存在当前字符,如存在则直接输出,否则启用后备字体。
 %    \begin{macrocode}
-\cs_new_protected:Npn \xeCJK_fallback_test_glyph:N #1
+\cs_new_protected:Npn \@@_fallback_symbol:NN #1#2
   {
-    \xeCJK_glyph_if_exist:NTF #1
-      { \@@_fallback_save_CJKsymbol:N #1 }
+    \xeCJK_reset_fallback_font:
+    \xeCJK_glyph_if_exist:NF #2
+      { \@@_fallback_symbol_aux:NN }
+    #1#2
+  }
+\cs_new_protected:Npn \@@_fallback_punct_symbol:NN #1#2
+  {
+    \xeCJK_reset_fallback_font:
+    \xeCJK_glyph_if_exist:NF #2
+      { \@@_fallback_punct_symbol_aux:NN }
+    #1#2
+  }
+\cs_new_eq:NN \xeCJK_fallback_symbol:NN       \prg_do_nothing:
+\cs_new_eq:NN \xeCJK_fallback_punct_symbol:NN \prg_do_nothing:
+\cs_new_protected:Npn \@@_fallback_symbol_aux:NN
+  {
+    \@@_fallback_symbol_aux:nnNN
+      { \CJK at family }
+      { \l_xeCJK_family_tl }
+  }
+\cs_new_protected:Npn \@@_fallback_punct_symbol_aux:NN
+  {
+    \@@_fallback_symbol_aux:nnNN
+      { \CJK at punctfamily }
+      { \l_xeCJK_punct_family_tl }
+  }
+\cs_new_protected:Npn \@@_fallback_symbol_aux:nnNN
+  {
+    \cs_set_protected:Npx \xeCJK_reset_fallback_font:
       {
-        \group_begin:
-          \xeCJK_aftergroup_reset_Boundary:N #1
-          \tl_set_eq:NN \l_@@_fallback_family_tl \l_xeCJK_family_tl
-          \xeCJK_fallback_loop:No #1 { \l_xeCJK_family_tl/FallBack }
-        \group_end:
+        \tex_the:D \tex_font:D
+        \xeCJK_clear_fallback_font:
       }
+    \exp_args:Nxx \@@_fallback_loop:nnNN
   }
+\cs_new_protected:Npn \@@_clear_fallback_font:
+  { \cs_set_eq:NN \xeCJK_reset_fallback_font: \prg_do_nothing: }
+\cs_new_eq:NN \xeCJK_reset_fallback_font: \prg_do_nothing:
+\cs_new_eq:NN \xeCJK_clear_fallback_font: \prg_do_nothing:
 %    \end{macrocode}
 % \end{macro}
 %
 % \changes{v3.5.1}{2017/11/16}{修正 fallback 字体后无法忽略空格的错误。}
-%
-% \begin{macro}[int]{\xeCJK_aftergroup_reset_Boundary:N}
-% 在分组中暂时清空 |#1| 与边界的 toks,分组后恢复。
-%    \begin{macrocode}
-\cs_new_protected:Npn \xeCJK_aftergroup_reset_Boundary:N #1
-  {
-    \tl_set:Nx \l_@@_tmp_tl
-      { \tex_the:D \tex_XeTeXcharclass:D `#1 ~ \xeCJK_class_num:n { Boundary } }
-    \tl_gset:Nx \g_@@_aftergroup_Boundary_tl
-      { \tex_the:D \tex_XeTeXinterchartoks:D \l_@@_tmp_tl }
-    \tex_XeTeXinterchartoks:D \l_@@_tmp_tl = { \prg_do_nothing: }
-    \group_insert_after:N \g_@@_aftergroup_Boundary_tl
-  }
-\tl_new:N \g_@@_aftergroup_Boundary_tl
-%    \end{macrocode}
-% \end{macro}
-%
 % \changes{v3.2.12}{2014/05/12}{更新 \cs{int_to_Hex:n}。}
 %
-% \begin{macro}[int]{\xeCJK_fallback_loop:Nn}
+% \begin{macro}[int]{\@@_fallback_loop:nnNN}
 % \changes{v3.1.0}{2012/11/19}{调整备用字体的循环方式。}
 % \changes{v3.2.4}{2013/06/30}
 % {使 \tn{CJKfamilydefault} 的 \texttt{FallBack} 设置全局可用。}
@@ -6163,37 +6209,86 @@
 % 循环测试后备字体是否包含字符 |#1|。若后备字体中存在该字符或者再没有后备字体,则
 % 结束循环。当前字体族没有备用字体时,使用 \tn{CJKfamilydefault} 的设置。
 %    \begin{macrocode}
-\cs_new_protected:Npn \xeCJK_fallback_loop:Nn #1#2
+\cs_new_protected:Npn \@@_fallback_loop:nnNN
   {
+    \cs_set_eq:NN \@@_fallback_loop:TF \use_i:nn
+    \@@_fallback_loop:nnnNN { FallBack }
+  }
+\cs_generate_variant:Nn \@@_fallback_loop:Nn { Nx }
+\cs_new_protected:Npn \@@_fallback_loop:nnnNN #1#2#3
+  {
+    \xeCJK_select_fallback_font:nnn {#1} {#2} {#3}
+    \@@_fallback_loop:TF
+      { \@@_fallback_loop_aux:nnnNN }
+      { \@@_fallback_missing_glyph:nnnNN }
+      {#1} {#2} {#3}
+  }
+\cs_new_protected:Npn \@@_fallback_loop_aux:nnnNN #1#2#3#4#5
+  {
+    \xeCJK_glyph_if_exist:NF #5
+      { \@@_fallback_loop:nnnNN { #1/FallBack } {#2} {#3} }
+    #4#5
+  }
+\cs_new_protected:Npn \@@_fallback_missing_glyph:nnnNN #1#2#3#4#5
+  {
+    \@@_warning:nxxx { missing-glyph } {#1} {#2} {#5}
+    #4#5
+  }
+\cs_new_protected:Npn \xeCJK_select_fallback_font:nnn #1#2
+  {
+    \@@_select_fallback_font:cnnn
+      { \@@_font_csname:n { #2/#1 } } {#1} {#2}
+  }
+\cs_new_protected:Npn \@@_select_fallback_font:Nnnn #1
+  {
+    \cs_if_exist:NF #1
+      { \@@_fallback_font_initial:NNnnn }
+    #1 \use_none:nnn
+  }
+\cs_generate_variant:Nn \@@_select_fallback_font:Nnnn { c }
+\cs_new_protected:Npn \@@_fallback_font_initial:NNnnn #1#2#3#4#5
+  {
+    \xeCJK_family_if_exist:nTF { #5/#3 }
+      { \@@_font_initial:Nn #1 { #5/#3 } }
+      { \@@_fallback_font_initial_auxi:Nnnn #1 {#5} {#3} {#4} }
+    #1
+  }
+\cs_new_protected:Npn \@@_fallback_font_initial_auxi:Nnnn #1
+  {
+    \exp_args:NNx \@@_fallback_font_initial_auxii:Nnnnn
+      #1 { \CJKfamilydefault }
+  }
+\cs_new_protected:Npn \@@_fallback_font_initial_auxii:Nnnnn #1#2#3
+  {
+    \str_if_eq:nnTF {#2} {#3}
+      { \@@_fallback_loop_end:Nnnn }
+      { \@@_fallback_font_initial_auxiii:Nnnn }
+      #1 {#2}
+  }
+\cs_new_protected:Npn \@@_fallback_font_initial_auxiii:Nnnn #1#2
+  {
     \xeCJK_family_if_exist:nTF {#2}
-      {
-        \tl_set:Nn \l_xeCJK_family_tl {#2}
-        \tl_set_eq:NN \CJK at family \l_@@_fontspec_family_tl
-        \xeCJK_select_font:
-        \xeCJK_glyph_if_exist:NTF #1
-          { \@@_fallback_save_CJKsymbol:N #1 }
-          { \xeCJK_fallback_loop:No #1 { \l_xeCJK_family_tl/FallBack } }
-      }
-      {
-        \str_if_eq:eeTF { \CJKfamilydefault } { \l_@@_fallback_family_tl }
-          {
-            \@@_warning:nxxx { missing-glyph }
-              { \l_xeCJK_family_tl } {#1}
-              { \int_to_Hex:n { `#1 } }
-            \@@_fallback_save_CJKsymbol:N #1
-          }
-          {
-            \tl_set:Nx \l_@@_fallback_family_tl { \CJKfamilydefault }
-            \xeCJK_fallback_loop:Nn #1 { \l_@@_fallback_family_tl }
-          }
-      }
+      { \@@_fallback_font_initial_auxiv:Nnnn }
+      { \@@_fallback_loop_end:Nnnn }
+      #1 {#2}
   }
-\cs_generate_variant:Nn \xeCJK_fallback_loop:Nn { No }
+\cs_new_protected:Npn \@@_fallback_font_initial_auxiv:Nnnn #1#2#3#4
+  {
+    \@@_font_initial:Nn #1 {#2}
+    \exp_args:Nc \@@_fallback_font_initial_auxiii:Nnnn
+      { \@@_font_csname:n { #4/#3/FallBack } }
+      { #2/FallBack } { #3/FallBack } {#4}
+  }
+\cs_new_eq:NN \@@_fallback_loop:TF \use_i:nn
+\cs_new_protected:Npn \@@_fallback_loop_end:Nnnn #1#2#3#4
+  { \cs_gset_eq:NN #1 \@@_fallback_loop_end: }
+\cs_new_protected:Npn \@@_fallback_loop_end:
+  { \cs_set_eq:NN \@@_fallback_loop:TF \use_ii:nn }
 \@@_msg_new:nn { missing-glyph }
   {
-    CJKfamily~`\@@_msg_family_map:n {#1}'~
-    ( \prop_item:Nn \g_@@_family_font_name_prop {#1} )~
-    does~not~contain~glyph~`#2'~(U+#3).\\
+    CJKfamily~`\@@_msg_family_map:n {#2}'~(#1)~
+    does~not~contain~glyph~`#3'~
+    ( U + \int_to_Hex:n { `#3 } )~\msg_line_context:.
   }
 %    \end{macrocode}
 % \end{macro}
@@ -6657,6 +6752,7 @@
   }
 \cs_new_protected:Npn \@@_select_font:Nn #1#2
   {
+    \xeCJK_clear_fallback_font:
     \cs_if_exist:NF #1 { \@@_font_initial:Nn #1 {#2} }
     #1
   }
@@ -6697,6 +6793,8 @@
 \tl_new:N \CJK at punctfamily
 \tl_new:N \l_xeCJK_punct_family_tl
 \tl_new:N \l_xeCJK_current_punct_font_tl
+\tl_set:Nn \CJK at punctfamily { \CJK at family }
+\tl_set:Nn \l_xeCJK_punct_family_tl { \l_xeCJK_family_tl }
 \tl_set:No \l_xeCJK_current_punct_font_tl
   { \@@_font_csname:n { \CJK at punctfamily } }
 \cs_new_eq:NN \@@_select_font: \prg_do_nothing:
@@ -6739,6 +6837,7 @@
   }
 \cs_new_protected:Npn \@@_select_font:Nnn #1#2#3
   {
+    \xeCJK_clear_fallback_font:
     \cs_if_exist:NF #1
       { \@@_block_font_initial:Nnn #1 {#2} {#3} }
     #1
@@ -6893,8 +6992,8 @@
     PunctFamily .value_required:n = { true } ,
     PunctFamily / false   .code:n =
       {
-        \tl_clear:N \l_xeCJK_punct_family_tl
-        \tl_clear:N \CJK at punctfamily
+        \tl_set:Nn \CJK at punctfamily { \CJK at family }
+        \tl_set:Nn \l_xeCJK_punct_family_tl { \l_xeCJK_family_tl }
         \xeCJK_cs_clear:N \@@_select_font:
         \xeCJK_cs_clear:N \@@_select_punct_font:
         \cs_set_eq:NN \xeCJK_select_punct_font: \xeCJK_select_font:
@@ -8030,8 +8129,8 @@
 %
 % \begin{macro}[int]{\CJKsymbol, \CJKpunctsymbol}
 %    \begin{macrocode}
-\cs_new:Npn \CJKsymbol      #1 {#1}
-\cs_new:Npn \CJKpunctsymbol #1 {#1}
+\cs_new_eq:NN \CJKsymbol      \use:n
+\cs_new_eq:NN \CJKpunctsymbol \use:n
 %    \end{macrocode}
 % \end{macro}
 %
@@ -9397,6 +9496,7 @@
         \UL at stop \@@_ulem_ccglue: \UL at start
         \@@_ulem_class_group_begin:
         \xeCJK_select_font:
+        \xeCJK_fallback_symbol:NN
         \CJKsymbol
       }
       { \@@_ulem_CJK_and_CJK:N }
@@ -9425,11 +9525,13 @@
         \xeCJK_class_group_begin:
         \xeCJK_clear_Boundary_and_CJK_toks:
         \@@_switch_font:nn {#1} {#2}
+        \xeCJK_fallback_symbol:NN
         \CJKsymbol
       }
       {
         \skip_horizontal:N \l_@@_ccglue_skip
         \@@_switch_font:nn {#1} {#2}
+        \xeCJK_fallback_symbol:NN
         \CJKsymbol
       }
   }

Modified: trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty
===================================================================
--- trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty	2020-06-06 21:13:17 UTC (rev 55442)
+++ trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty	2020-06-06 21:13:35 UTC (rev 55443)
@@ -29,10 +29,10 @@
 %% 
 \NeedsTeXFormat{LaTeX2e}
 \RequirePackage{expl3}
-\GetIdInfo$Id: xeCJK.dtx b971c22 2020-05-01 21:10:43 +0800 Qing Lee <sobenlee at gmail.com> $
+\GetIdInfo$Id: xeCJK.dtx 94baac7 2020-06-06 23:21:05 +0800 Qing Lee <sobenlee at gmail.com> $
   {xeCJK patch file for listings}
 \ProvidesExplPackage{xeCJK-listings}
-  {\ExplFileDate}{3.8.3}{\ExplFileDescription}
+  {\ExplFileDate}{3.8.4}{\ExplFileDescription}
 \DeclareOption* { \PassOptionsToPackage { \CurrentOption } { xeCJK } }
 \ProcessOptions \scan_stop:
 \RequirePackage { xeCJK }

Modified: trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg
===================================================================
--- trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg	2020-06-06 21:13:17 UTC (rev 55442)
+++ trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.cfg	2020-06-06 21:13:35 UTC (rev 55443)
@@ -6,10 +6,10 @@
 %%
 %% xeCJK.dtx  (with options: `config')
 %% 
-\GetIdInfo$Id: xeCJK.dtx b971c22 2020-05-01 21:10:43 +0800 Qing Lee <sobenlee at gmail.com> $
+\GetIdInfo$Id: xeCJK.dtx 94baac7 2020-06-06 23:21:05 +0800 Qing Lee <sobenlee at gmail.com> $
   {Configuration file for xeCJK package}
 \ProvidesExplFile{\ExplFileName.cfg}
-  {\ExplFileDate}{3.8.3}{\ExplFileDescription}
+  {\ExplFileDate}{3.8.4}{\ExplFileDescription}
 
 %% 
 %%

Modified: trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty
===================================================================
--- trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty	2020-06-06 21:13:17 UTC (rev 55442)
+++ trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJK.sty	2020-06-06 21:13:35 UTC (rev 55443)
@@ -29,10 +29,10 @@
 %% 
 \NeedsTeXFormat{LaTeX2e}
 \RequirePackage{expl3}
-\GetIdInfo$Id: xeCJK.dtx b971c22 2020-05-01 21:10:43 +0800 Qing Lee <sobenlee at gmail.com> $
+\GetIdInfo$Id: xeCJK.dtx 94baac7 2020-06-06 23:21:05 +0800 Qing Lee <sobenlee at gmail.com> $
   {Typesetting CJK scripts with XeLaTeX}
 \ProvidesExplPackage{\ExplFileName}
-  {\ExplFileDate}{3.8.3}{\ExplFileDescription}
+  {\ExplFileDate}{3.8.4}{\ExplFileDescription}
 \msg_new:nnn { xeCJK } { Require-XeTeX }
   {
     The~xeCJK~package~requires~XeTeX~to~function.\\\\
@@ -173,9 +173,10 @@
     \cs_set_eq:NN #2 \__xeCJK_swap_cs_aux:w
     \cs_undefine:N \__xeCJK_swap_cs_aux:w
   }
-\cs_new_protected:Npn \xeCJK_font_gset_to_current:N #1
-  { \exp_after:wN \cs_gset_eq:NN \exp_after:wN #1 \tex_the:D \tex_font:D }
-\cs_generate_variant:Nn \xeCJK_font_gset_to_current:N { c }
+\cs_new_protected:Npn \xeCJK_font_gset_to_current:N
+  { \exp_after:wN \__xeCJK_font_gset_to_current_aux:NN \tex_the:D \tex_font:D }
+\cs_new_protected:Npn \__xeCJK_font_gset_to_current_aux:NN #1#2
+  { \cs_if_eq:NNF #1 \tex_nullfont:D { \cs_gset_eq:NN #2#1 } }
 \prg_new_conditional:Npnn \xeCJK_glyph_if_exist:N #1 { p , T , F , TF }
   {
     \tex_iffontchar:D \tex_font:D `#1 \exp_stop_f:
@@ -771,6 +772,7 @@
         \xeCJK_select_font:
         \xeCJK_clear_inter_class_toks:nn {#1} { CJK }
         \xeCJK_clear_Boundary_and_CJK_toks:
+        \xeCJK_fallback_symbol:NN
         \CJKsymbol
       }
     \xeCJK_inter_class_toks:nnn { CJK } {#1} { \xeCJK_class_group_end: }
@@ -876,6 +878,7 @@
     \xeCJK_class_group_begin:
     \xeCJK_clear_Boundary_and_CJK_toks:
     \xeCJK_select_font:
+    \xeCJK_fallback_symbol:NN
     \CJKsymbol
   }
 \cs_new_protected:Npn \xeCJK_check_for_glue:
@@ -1131,11 +1134,23 @@
 \xeCJK_inter_class_toks:nnn { CJK } { CJK }
   { \xeCJK_CJK_and_CJK:N }
 \cs_new_protected:Npn \xeCJK_CJK_and_CJK:N
-  { \CJKglue \CJKsymbol }
+  {
+    \CJKglue
+    \xeCJK_fallback_symbol:NN
+    \CJKsymbol
+  }
 \xeCJK_inter_class_toks:nnn { FullLeft }  { CJK }
-  { \xeCJK_FullLeft_and_CJK: \CJKsymbol }
+  {
+    \xeCJK_FullLeft_and_CJK:
+    \xeCJK_fallback_symbol:NN
+    \CJKsymbol
+  }
 \xeCJK_inter_class_toks:nnn { FullRight } { CJK }
-  { \xeCJK_FullRight_and_CJK: \CJKsymbol }
+  {
+    \xeCJK_FullRight_and_CJK:
+    \xeCJK_fallback_symbol:NN
+    \CJKsymbol
+  }
 \seq_map_inline:Nn \g__xeCJK_non_CJK_class_seq
   {
     \clist_map_inline:nn { FullLeft , FullRight }
@@ -1387,6 +1402,7 @@
     \xeCJK_clear_Boundary_and_CJK_toks:
     \tl_gset:Nn \g__xeCJK_last_punct_tl {#2}
     \__xeCJK_punct_rule:NN \c__xeCJK_left_tl #2
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #2
   }
 \cs_new_protected:Npn \__xeCJK_Default_and_FullLeft_glue:N #1
@@ -1398,6 +1414,7 @@
     \tl_gset:Nn \g__xeCJK_last_punct_tl {#1}
     \__xeCJK_punct_rule:NN \c__xeCJK_left_tl #1
     \__xeCJK_select_punct_font:
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #1
   }
 \cs_new_protected:Npn \__xeCJK_CJK_and_FullLeft_glue:N #1
@@ -1414,6 +1431,7 @@
     \xeCJK_clear_Boundary_and_CJK_toks:
     \tl_gset:Nn \g__xeCJK_last_punct_tl {#1}
     \__xeCJK_punct_rule:NN \c__xeCJK_left_tl #1
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #1
   }
 \cs_new_protected:Npn \__xeCJK_Boundary_and_FullLeft_glue:N #1
@@ -1686,6 +1704,7 @@
     \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl #1
     \__xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl #1
     \tl_gset:Nn \g__xeCJK_last_punct_tl {#1}
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #1
   }
 \cs_new_protected:Npn \xeCJK_FullLeft_and_FullRight:N #1
@@ -1702,6 +1721,7 @@
     \xeCJK_get_punct_kerning:oN \g__xeCJK_last_punct_tl #1
     \xeCJK_punct_kern:NN \g__xeCJK_last_punct_tl #1
     \tl_gset:Nn \g__xeCJK_last_punct_tl {#1}
+    \xeCJK_fallback_punct_symbol:NN
     \CJKpunctsymbol #1
   }
 \cs_new_protected:Npn \xeCJK_FullRight_and_FullRight:N #1
@@ -1741,7 +1761,11 @@
       } ,
     CheckFullRight      .default:n = { true }
   }
-\cs_new:Npn \xeCJK_FullRight_symbol:N { \CJKpunctsymbol }
+\cs_new_protected:Npn \xeCJK_FullRight_symbol:N
+  {
+    \xeCJK_fallback_punct_symbol:NN
+    \CJKpunctsymbol
+  }
 \cs_new_protected:Npn \xeCJK_check_FullRight:
   {
     \xeCJK_get_punct_bounds:No \c__xeCJK_right_tl \g__xeCJK_last_punct_tl
@@ -2086,8 +2110,11 @@
           }
           {
             \xeCJK_replace_inter_class_toks:nnnn {##1} { #1/#2 }
-              { \CJKsymbol }
-              { \__xeCJK_switch_font:nn {#1} {#2} \CJKsymbol }
+              { \xeCJK_fallback_symbol:NN }
+              {
+                \__xeCJK_switch_font:nn {#1} {#2}
+                \xeCJK_fallback_symbol:NN
+              }
           }
       }
     \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } { #1/#2 } {#1} {#1}
@@ -2242,7 +2269,7 @@
       }
   }
 \cs_new:Npn \__xeCJK_punct_csname:n #1
-  { c__xeCJK_\l_xeCJK_current_font_tl/\l_xeCJK_punct_style_tl/#1/tl }
+  { c__xeCJK_\l_xeCJK_current_punct_font_tl/\l_xeCJK_punct_style_tl/#1/tl }
 \cs_new:Npn \__xeCJK_use_punct_dim:nN #1#2
   { \use:c { \__xeCJK_punct_csname:n { dim/#1/#2 } } }
 \cs_new:Npn \__xeCJK_use_punct_dim:nNN #1#2#3
@@ -2400,6 +2427,7 @@
   {
     \group_begin:
       \xeCJK_select_punct_font:
+      \xeCJK_fallback_punct_symbol:NN
       \xeCJK_calc_punct_dimen:N #2
     \group_end:
     \dim_set:Nn \l__xeCJK_bound_dim
@@ -2902,73 +2930,143 @@
     AutoFallBack .choice: ,
     AutoFallBack / true  .code:n =
       {
-        \cs_if_eq:NNF \CJKsymbol \xeCJK_fallback_test_glyph:N
-          {
-            \cs_set_eq:NN \__xeCJK_fallback_save_CJKsymbol:N \CJKsymbol
-            \cs_set_eq:NN \CJKsymbol \xeCJK_fallback_test_glyph:N
-          }
+        \cs_set_eq:NN \xeCJK_fallback_symbol:NN
+                      \__xeCJK_fallback_symbol:NN
+        \cs_set_eq:NN \xeCJK_fallback_punct_symbol:NN
+                      \__xeCJK_fallback_punct_symbol:NN
+        \cs_set_eq:NN \xeCJK_clear_fallback_font:
+                      \__xeCJK_clear_fallback_font:
       } ,
     AutoFallBack / false .code:n =
       {
-        \cs_if_eq:NNT \CJKsymbol \xeCJK_fallback_test_glyph:N
-          { \cs_set_eq:NN \CJKsymbol \__xeCJK_fallback_save_CJKsymbol:N }
+        \xeCJK_cs_clear:N \xeCJK_fallback_symbol:NN
+        \xeCJK_cs_clear:N \xeCJK_fallback_punct_symbol:NN
+        \xeCJK_cs_clear:N \xeCJK_clear_fallback_font:
       } ,
     AutoFallBack      .default:n = { true } ,
     fallback             .meta:n = { AutoFallBack = true }
   }
-\cs_new_protected:Npn \xeCJK_fallback_test_glyph:N #1
+\cs_new_protected:Npn \__xeCJK_fallback_symbol:NN #1#2
   {
-    \xeCJK_glyph_if_exist:NTF #1
-      { \__xeCJK_fallback_save_CJKsymbol:N #1 }
+    \xeCJK_reset_fallback_font:
+    \xeCJK_glyph_if_exist:NF #2
+      { \__xeCJK_fallback_symbol_aux:NN }
+    #1#2
+  }
+\cs_new_protected:Npn \__xeCJK_fallback_punct_symbol:NN #1#2
+  {
+    \xeCJK_reset_fallback_font:
+    \xeCJK_glyph_if_exist:NF #2
+      { \__xeCJK_fallback_punct_symbol_aux:NN }
+    #1#2
+  }
+\cs_new_eq:NN \xeCJK_fallback_symbol:NN       \prg_do_nothing:
+\cs_new_eq:NN \xeCJK_fallback_punct_symbol:NN \prg_do_nothing:
+\cs_new_protected:Npn \__xeCJK_fallback_symbol_aux:NN
+  {
+    \__xeCJK_fallback_symbol_aux:nnNN
+      { \CJK at family }
+      { \l_xeCJK_family_tl }
+  }
+\cs_new_protected:Npn \__xeCJK_fallback_punct_symbol_aux:NN
+  {
+    \__xeCJK_fallback_symbol_aux:nnNN
+      { \CJK at punctfamily }
+      { \l_xeCJK_punct_family_tl }
+  }
+\cs_new_protected:Npn \__xeCJK_fallback_symbol_aux:nnNN
+  {
+    \cs_set_protected:Npx \xeCJK_reset_fallback_font:
       {
-        \group_begin:
-          \xeCJK_aftergroup_reset_Boundary:N #1
-          \tl_set_eq:NN \l__xeCJK_fallback_family_tl \l_xeCJK_family_tl
-          \xeCJK_fallback_loop:No #1 { \l_xeCJK_family_tl/FallBack }
-        \group_end:
+        \tex_the:D \tex_font:D
+        \xeCJK_clear_fallback_font:
       }
+    \exp_args:Nxx \__xeCJK_fallback_loop:nnNN
   }
-\cs_new_protected:Npn \xeCJK_aftergroup_reset_Boundary:N #1
+\cs_new_protected:Npn \__xeCJK_clear_fallback_font:
+  { \cs_set_eq:NN \xeCJK_reset_fallback_font: \prg_do_nothing: }
+\cs_new_eq:NN \xeCJK_reset_fallback_font: \prg_do_nothing:
+\cs_new_eq:NN \xeCJK_clear_fallback_font: \prg_do_nothing:
+\cs_new_protected:Npn \__xeCJK_fallback_loop:nnNN
   {
-    \tl_set:Nx \l__xeCJK_tmp_tl
-      { \tex_the:D \tex_XeTeXcharclass:D `#1 ~ \xeCJK_class_num:n { Boundary } }
-    \tl_gset:Nx \g__xeCJK_aftergroup_Boundary_tl
-      { \tex_the:D \tex_XeTeXinterchartoks:D \l__xeCJK_tmp_tl }
-    \tex_XeTeXinterchartoks:D \l__xeCJK_tmp_tl = { \prg_do_nothing: }
-    \group_insert_after:N \g__xeCJK_aftergroup_Boundary_tl
+    \cs_set_eq:NN \__xeCJK_fallback_loop:TF \use_i:nn
+    \__xeCJK_fallback_loop:nnnNN { FallBack }
   }
-\tl_new:N \g__xeCJK_aftergroup_Boundary_tl
-\cs_new_protected:Npn \xeCJK_fallback_loop:Nn #1#2
+\cs_generate_variant:Nn \__xeCJK_fallback_loop:Nn { Nx }
+\cs_new_protected:Npn \__xeCJK_fallback_loop:nnnNN #1#2#3
   {
+    \xeCJK_select_fallback_font:nnn {#1} {#2} {#3}
+    \__xeCJK_fallback_loop:TF
+      { \__xeCJK_fallback_loop_aux:nnnNN }
+      { \__xeCJK_fallback_missing_glyph:nnnNN }
+      {#1} {#2} {#3}
+  }
+\cs_new_protected:Npn \__xeCJK_fallback_loop_aux:nnnNN #1#2#3#4#5
+  {
+    \xeCJK_glyph_if_exist:NF #5
+      { \__xeCJK_fallback_loop:nnnNN { #1/FallBack } {#2} {#3} }
+    #4#5
+  }
+\cs_new_protected:Npn \__xeCJK_fallback_missing_glyph:nnnNN #1#2#3#4#5
+  {
+    \__xeCJK_warning:nxxx { missing-glyph } {#1} {#2} {#5}
+    #4#5
+  }
+\cs_new_protected:Npn \xeCJK_select_fallback_font:nnn #1#2
+  {
+    \__xeCJK_select_fallback_font:cnnn
+      { \__xeCJK_font_csname:n { #2/#1 } } {#1} {#2}
+  }
+\cs_new_protected:Npn \__xeCJK_select_fallback_font:Nnnn #1
+  {
+    \cs_if_exist:NF #1
+      { \__xeCJK_fallback_font_initial:NNnnn }
+    #1 \use_none:nnn
+  }
+\cs_generate_variant:Nn \__xeCJK_select_fallback_font:Nnnn { c }
+\cs_new_protected:Npn \__xeCJK_fallback_font_initial:NNnnn #1#2#3#4#5
+  {
+    \xeCJK_family_if_exist:nTF { #5/#3 }
+      { \__xeCJK_font_initial:Nn #1 { #5/#3 } }
+      { \__xeCJK_fallback_font_initial_auxi:Nnnn #1 {#5} {#3} {#4} }
+    #1
+  }
+\cs_new_protected:Npn \__xeCJK_fallback_font_initial_auxi:Nnnn #1
+  {
+    \exp_args:NNx \__xeCJK_fallback_font_initial_auxii:Nnnnn
+      #1 { \CJKfamilydefault }
+  }
+\cs_new_protected:Npn \__xeCJK_fallback_font_initial_auxii:Nnnnn #1#2#3
+  {
+    \str_if_eq:nnTF {#2} {#3}
+      { \__xeCJK_fallback_loop_end:Nnnn }
+      { \__xeCJK_fallback_font_initial_auxiii:Nnnn }
+      #1 {#2}
+  }
+\cs_new_protected:Npn \__xeCJK_fallback_font_initial_auxiii:Nnnn #1#2
+  {
     \xeCJK_family_if_exist:nTF {#2}
-      {
-        \tl_set:Nn \l_xeCJK_family_tl {#2}
-        \tl_set_eq:NN \CJK at family \l__xeCJK_fontspec_family_tl
-        \xeCJK_select_font:
-        \xeCJK_glyph_if_exist:NTF #1
-          { \__xeCJK_fallback_save_CJKsymbol:N #1 }
-          { \xeCJK_fallback_loop:No #1 { \l_xeCJK_family_tl/FallBack } }
-      }
-      {
-        \str_if_eq:eeTF { \CJKfamilydefault } { \l__xeCJK_fallback_family_tl }
-          {
-            \__xeCJK_warning:nxxx { missing-glyph }
-              { \l_xeCJK_family_tl } {#1}
-              { \int_to_Hex:n { `#1 } }
-            \__xeCJK_fallback_save_CJKsymbol:N #1
-          }
-          {
-            \tl_set:Nx \l__xeCJK_fallback_family_tl { \CJKfamilydefault }
-            \xeCJK_fallback_loop:Nn #1 { \l__xeCJK_fallback_family_tl }
-          }
-      }
+      { \__xeCJK_fallback_font_initial_auxiv:Nnnn }
+      { \__xeCJK_fallback_loop_end:Nnnn }
+      #1 {#2}
   }
-\cs_generate_variant:Nn \xeCJK_fallback_loop:Nn { No }
+\cs_new_protected:Npn \__xeCJK_fallback_font_initial_auxiv:Nnnn #1#2#3#4
+  {
+    \__xeCJK_font_initial:Nn #1 {#2}
+    \exp_args:Nc \__xeCJK_fallback_font_initial_auxiii:Nnnn
+      { \__xeCJK_font_csname:n { #4/#3/FallBack } }
+      { #2/FallBack } { #3/FallBack } {#4}
+  }
+\cs_new_eq:NN \__xeCJK_fallback_loop:TF \use_i:nn
+\cs_new_protected:Npn \__xeCJK_fallback_loop_end:Nnnn #1#2#3#4
+  { \cs_gset_eq:NN #1 \__xeCJK_fallback_loop_end: }
+\cs_new_protected:Npn \__xeCJK_fallback_loop_end:
+  { \cs_set_eq:NN \__xeCJK_fallback_loop:TF \use_ii:nn }
 \__xeCJK_msg_new:nn { missing-glyph }
   {
-    CJKfamily~`\__xeCJK_msg_family_map:n {#1}'~
-    ( \prop_item:Nn \g__xeCJK_family_font_name_prop {#1} )~
-    does~not~contain~glyph~`#2'~(U+#3).\\
+    CJKfamily~`\__xeCJK_msg_family_map:n {#2}'~(#1)~
+    does~not~contain~glyph~`#3'~
+    ( U + \int_to_Hex:n { `#3 } )~\msg_line_context:.
   }
 \NewDocumentCommand \setCJKfallbackfamilyfont { m o m }
   {
@@ -3310,6 +3408,7 @@
   }
 \cs_new_protected:Npn \__xeCJK_select_font:Nn #1#2
   {
+    \xeCJK_clear_fallback_font:
     \cs_if_exist:NF #1 { \__xeCJK_font_initial:Nn #1 {#2} }
     #1
   }
@@ -3333,6 +3432,8 @@
 \tl_new:N \CJK at punctfamily
 \tl_new:N \l_xeCJK_punct_family_tl
 \tl_new:N \l_xeCJK_current_punct_font_tl
+\tl_set:Nn \CJK at punctfamily { \CJK at family }
+\tl_set:Nn \l_xeCJK_punct_family_tl { \l_xeCJK_family_tl }
 \tl_set:No \l_xeCJK_current_punct_font_tl
   { \__xeCJK_font_csname:n { \CJK at punctfamily } }
 \cs_new_eq:NN \__xeCJK_select_font: \prg_do_nothing:
@@ -3357,6 +3458,7 @@
   }
 \cs_new_protected:Npn \__xeCJK_select_font:Nnn #1#2#3
   {
+    \xeCJK_clear_fallback_font:
     \cs_if_exist:NF #1
       { \__xeCJK_block_font_initial:Nnn #1 {#2} {#3} }
     #1
@@ -3479,8 +3581,8 @@
     PunctFamily .value_required:n = { true } ,
     PunctFamily / false   .code:n =
       {
-        \tl_clear:N \l_xeCJK_punct_family_tl
-        \tl_clear:N \CJK at punctfamily
+        \tl_set:Nn \CJK at punctfamily { \CJK at family }
+        \tl_set:Nn \l_xeCJK_punct_family_tl { \l_xeCJK_family_tl }
         \xeCJK_cs_clear:N \__xeCJK_select_font:
         \xeCJK_cs_clear:N \__xeCJK_select_punct_font:
         \cs_set_eq:NN \xeCJK_select_punct_font: \xeCJK_select_font:
@@ -4319,8 +4421,8 @@
     Sorry,~but~xeCJK/options~does~not~have~a~key~called~`#1'.\\\\
     The~key~`#1'~is~being~ignored.
   }
-\cs_new:Npn \CJKsymbol      #1 {#1}
-\cs_new:Npn \CJKpunctsymbol #1 {#1}
+\cs_new_eq:NN \CJKsymbol      \use:n
+\cs_new_eq:NN \CJKpunctsymbol \use:n
 \keys_set:nn { xeCJK / options }
   {
     CJKglue         = { \skip_horizontal:n { \c_zero_dim plus 0.08 \tex_baselineskip:D } } ,

Modified: trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJKfntef.sty
===================================================================
--- trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJKfntef.sty	2020-06-06 21:13:17 UTC (rev 55442)
+++ trunk/Master/texmf-dist/tex/xelatex/xecjk/xeCJKfntef.sty	2020-06-06 21:13:35 UTC (rev 55443)
@@ -29,10 +29,10 @@
 %% 
 \NeedsTeXFormat{LaTeX2e}
 \RequirePackage{expl3}
-\GetIdInfo$Id: xeCJK.dtx b971c22 2020-05-01 21:10:43 +0800 Qing Lee <sobenlee at gmail.com> $
+\GetIdInfo$Id: xeCJK.dtx 94baac7 2020-06-06 23:21:05 +0800 Qing Lee <sobenlee at gmail.com> $
   {xeCJK font effect}
 \ProvidesExplPackage{xeCJKfntef}
-  {\ExplFileDate}{3.8.3}{\ExplFileDescription}
+  {\ExplFileDate}{3.8.4}{\ExplFileDescription}
 \PassOptionsToPackage { normalem } { ulem }
 \DeclareOption* { \PassOptionsToPackage { \CurrentOption } { ulem } }
 \ProcessOptions \scan_stop:
@@ -394,6 +394,7 @@
         \UL at stop \__xeCJK_ulem_ccglue: \UL at start
         \__xeCJK_ulem_class_group_begin:
         \xeCJK_select_font:
+        \xeCJK_fallback_symbol:NN
         \CJKsymbol
       }
       { \__xeCJK_ulem_CJK_and_CJK:N }
@@ -412,11 +413,13 @@
         \xeCJK_class_group_begin:
         \xeCJK_clear_Boundary_and_CJK_toks:
         \__xeCJK_switch_font:nn {#1} {#2}
+        \xeCJK_fallback_symbol:NN
         \CJKsymbol
       }
       {
         \skip_horizontal:N \l__xeCJK_ccglue_skip
         \__xeCJK_switch_font:nn {#1} {#2}
+        \xeCJK_fallback_symbol:NN
         \CJKsymbol
       }
   }

Modified: trunk/Master/texmf-dist/tex/xelatex/xecjk/xunicode-addon.sty
===================================================================
--- trunk/Master/texmf-dist/tex/xelatex/xecjk/xunicode-addon.sty	2020-06-06 21:13:17 UTC (rev 55442)
+++ trunk/Master/texmf-dist/tex/xelatex/xecjk/xunicode-addon.sty	2020-06-06 21:13:35 UTC (rev 55443)
@@ -29,10 +29,10 @@
 %% 
 \NeedsTeXFormat{LaTeX2e}
 \RequirePackage{expl3}
-\GetIdInfo$Id: xeCJK.dtx b971c22 2020-05-01 21:10:43 +0800 Qing Lee <sobenlee at gmail.com> $
+\GetIdInfo$Id: xeCJK.dtx 94baac7 2020-06-06 23:21:05 +0800 Qing Lee <sobenlee at gmail.com> $
   {addon file for xunicode}
 \ProvidesExplPackage{xunicode-addon}
-  {\ExplFileDate}{3.8.3}{\ExplFileDescription}
+  {\ExplFileDate}{3.8.4}{\ExplFileDescription}
 \bool_lazy_or:nnF
   { \sys_if_engine_xetex_p: }
   { \sys_if_engine_luatex_p: }

Modified: trunk/Master/texmf-dist/tex/xelatex/xecjk/xunicode-extra.def
===================================================================
--- trunk/Master/texmf-dist/tex/xelatex/xecjk/xunicode-extra.def	2020-06-06 21:13:17 UTC (rev 55442)
+++ trunk/Master/texmf-dist/tex/xelatex/xecjk/xunicode-extra.def	2020-06-06 21:13:35 UTC (rev 55443)
@@ -27,10 +27,10 @@
 %% 
 %% ----------------------------------------------------------------------
 %% 
-\GetIdInfo$Id: xeCJK.dtx b971c22 2020-05-01 21:10:43 +0800 Qing Lee <sobenlee at gmail.com> $
+\GetIdInfo$Id: xeCJK.dtx 94baac7 2020-06-06 23:21:05 +0800 Qing Lee <sobenlee at gmail.com> $
   {extra definition for xunicode}
 \ProvidesExplFile{xunicode-extra.def}
-  {\ExplFileDate}{3.8.3}{\ExplFileDescription}
+  {\ExplFileDate}{3.8.4}{\ExplFileDescription}
 \DeclareUTFSymbol\texthyphenationpoint{"2027}
 \DeclareUTFSymbol\texttwoemdash{"2E3A}
 \DeclareUTFComposite\textsuperscript



More information about the tex-live-commits mailing list.