From 28cc09b54af171dce05705d0b62d544848b3a8ca Mon Sep 17 00:00:00 2001 From: Qing Lee Date: Mon, 3 Sep 2012 02:18:08 +0000 Subject: [PATCH] =?UTF-8?q?xeCJK=20=E4=BF=AE=E6=94=B9=20\xeCJKsetcharclass?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E5=BE=97=E5=AE=83=E4=B8=8E=E6=97=A7=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E8=A1=8C=E4=B8=BA=E4=B8=80=E8=87=B4=EF=BC=88?= =?UTF-8?q?=E6=80=BB=E6=98=AF=E9=87=8D=E7=BD=AE=E6=A0=87=E7=82=B9=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7=E7=9A=84=E5=AD=97=E7=AC=A6=E7=B1=BB=EF=BC=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CTAN 版本提升为 3.0.8。 --- xeCJK/xeCJK.dtx | 407 ++++++++++++++++++++++++++---------------------- 1 file changed, 222 insertions(+), 185 deletions(-) diff --git a/xeCJK/xeCJK.dtx b/xeCJK/xeCJK.dtx index f6e14787..a635e44c 100644 --- a/xeCJK/xeCJK.dtx +++ b/xeCJK/xeCJK.dtx @@ -133,18 +133,26 @@ $URL$ % %<*driver|package> \NeedsTeXFormat{LaTeX2e} +\RequirePackage{expl3} +\GetIdInfo$Id$ + {package for typesetting CJK scripts with XeLaTeX} %<*driver> -\ProvidesFile{xeCJK.dtx} +\ProvidesExplFile + {\ExplFileName.\ExplFileExtension} +% +%\ProvidesExplPackage +% {\ExplFileName} + {\ExplFileDate}{3.0.8}{\ExplFileDescription} +%<*driver> +\ExplSyntaxOff % -\RequirePackage{expl3} % % %<*driver> -\documentclass{l3doc} +\documentclass[full]{l3doc} \hypersetup{pdfstartview=FitH} \usepackage{xeCJK} \fvset{formatcom=\CJKfixedspacing} -\usepackage{metalogo} \linespread{1.1} \setlist{nosep} \setmainfont[Ligatures=TeX]{TeX Gyre Pagella} @@ -159,10 +167,13 @@ $URL$ \setCJKmainfont[Hangul]{Adobe Myungjo Std} \xeCJKsetup{PunctStyle=kaiming,KaiMingPunct+={:;}} \def\MacroFont{\small\normalfont\ttfamily\punctstyle{plain}} +\def\XeTeX{\hologo{XeTeX}} +\def\XeLaTeX{\hologo{XeLaTeX}} +\def\LaTeX{\hologo{LaTeX}} \parindent=2em \AtBeginDocument{\DeleteShortVerb{\"}\MakeShortVerb{\|}} \def\contentsname{目录} -\def\email#1{\href{mailto:#1}{\path{#1}}} +\DeclareUrlCommand\email{\def\UrlLeft##1\UrlRight{\href{mailto:##1}{##1}}} \addtolength{\voffset}{-5\baselineskip} \addtolength\textheight{8\baselineskip} \makeatletter @@ -183,23 +194,18 @@ $URL$ \markboth{\indexname}{\indexname} 斜体的数字表示对应项说明所在的页码,下划线的数字表示定义所在的代码行号,而直立体的 数字表示对应项使用时所在的行号。} -% -%<*driver|package> -\GetIdInfo$Id$ - {package for typesetting CJK scripts with XeLaTeX} -% -%<*driver> \begin{document} \DocInput{\jobname.dtx} \end{document} % % \fi % +% \CheckSum{3061} % \DoNotIndex{\T,\F,\C,\J,\K,\O,\U,\Z,\E,\R,\M,\A,\Y,\R,\;,\t,\c,\:,\\,\@} -% \GetFileInfo{\jobname.sty} +% \GetFileInfo{\jobname.dtx} % % \title{\bfseries\pkg{xeCJK} 宏包} -% \author{\texttt{ctex.org}\thanks{\url{http://www.ctex.org}}} +% \author{\href{http://www.ctex.org}{ctex.org}} % \date{\filedate\qquad\fileversion} % \maketitle % @@ -221,7 +227,7 @@ $URL$ % \pkg{xeCJK} 使用了 \XeTeX 的一些最新特性,需要 \XeTeX{} |0.9995.0 [2009/06/29]| 以 % 后的版本。\pkg{xeCJK} 的依赖 \LaTeX~3 项目的 \pkg{expl3},\pkg{xparse} 和 % \pkg{l3keys2e} 宏包,并依赖 \pkg{fontspec}^^A -% \footnote{\url{http://mirrors.ctan.org/macros/latex/contrib/fontspec}} +% \footnote{\url{http://mirrors.ctan.org/macros/latex/contrib/fontspec/}} % 宏包来调用系统字体。个别兼容性功能需要 \pkg{CJK} 宏包的支持。 % % \pkg{xeCJK} 的原始作者是孙文昌,2009 年 5 月起宏包被收入 @@ -590,7 +596,10 @@ $URL$ % \begin{verbatim} % \defaultCJKfontfeatures{Scale=0.962216} % \end{verbatim} -% 可以将全部 CJK 字体缩小为 |0.962216|。 +% 可以将全部 CJK 字体缩小为 |0.962216|。\pkg{xeCJK} 宏包的初始化设置是 +% \begin{verbatim} +% \defaultCJKfontfeatures{Script=CJK} +% \end{verbatim} % \end{function} % % \begin{function}{\addCJKfontfeatures} @@ -686,7 +695,7 @@ $URL$ % |SimSun| 的备用字体。 % \end{function} % -% \subsubsection{\texorpdfstring{\XeTeX}{XeTeX} 的字体名查找} +% \subsubsection{\XeTeX 的字体名查找} % \label{subsubsec:fontsearch} % % 由于在 \pkg{fontspec} 宏包文档中缺少关于如何查看 \XeTeX{} 可用字体名的说明, @@ -769,7 +778,8 @@ $URL$ % % \begin{function}[EXP]{\xeCJKDeclareSubCJKBlock} % \begin{syntax} -% \cs{xeCJKDeclareSubCJKBlock} \Arg{block} \Arg{block range} +% \cs{xeCJKDeclareSubCJKBlock} \Arg{block} \Arg{block range} +% \cs{xeCJKDeclareSubCJKBlock*} \Arg{block} \Arg{block range} % \end{syntax} % 其中 \meta{block range} 是逗号列表,可以是 CJK 字符的 |Unicode| 范围,也可以是单个字符 % 的 |Unicode|。例如 @@ -799,39 +809,43 @@ $URL$ % |\xeCJKDeclareSubCJKBlock| 应该在声明所有的 CJK 字体族之前使用。如果有某个 CJK 字 % 体族没有设置 \meta{block} 选项,将使用 |\CJKfamilydefault| 的 \meta{block} 选项 % 作为该 CJK 字体族的 \meta{block} 选项。如果希望在使用某 CJK 字体族时,不在 CJK 主 -% 分区与 \meta{block} 之间切换字体,可以使用 \meta{block}|=*| 选项。 +% 分区与 \meta{block} 之间切换字体,可以使用 \meta{block}|=*| 选项。带星号的命令除了 +% 设置 CJK 子分区以外,还重置标点符号所属的字符类。 % % \begin{function}{\xeCJKCancelSubCJKBlock} % \begin{syntax} -% \cs{xeCJKCancelSubCJKBlock} \Arg{block1,block2,...} +% \cs{xeCJKCancelSubCJKBlock} \Arg{block1,block2,...} +% \cs{xeCJKCancelSubCJKBlock*} \Arg{block1,block2,...} % \end{syntax} -% 在文档中取消对 |CJK| 分区的声明。 +% 在文档中取消对 |CJK| 分区的声明。带星号的命令还重置标点符号所属的字符类。 % \end{function} % % \begin{function}{\xeCJKRestoreSubCJKBlock} % \begin{syntax} -% \cs{xeCJKRestoreSubCJKBlock} \Arg{block1,block2,...} +% \cs{xeCJKRestoreSubCJKBlock} \Arg{block1,block2,...} +% \cs{xeCJKRestoreSubCJKBlock*} \Arg{block1,block2,...} % \end{syntax} -% 在文档中恢复对 |CJK| 分区的声明。 +% 在文档中恢复对 |CJK| 分区的声明。带星号的命令还重置标点符号所属的字符类。 % \end{function} % % \subsection{设置 CJK 字符范围} % % \begin{function}[EXP]{\xeCJKDeclareCharClass} % \begin{syntax} -% \cs{xeCJKDeclareCharClass} \Arg{class} \Arg{class range} +% \cs{xeCJKDeclareCharClass} \Arg{class} \Arg{class range} +% \cs{xeCJKDeclareCharClass*} \Arg{class} \Arg{class range} % \end{syntax} % \meta{class range} 的格式和 \ref{subsec:block} 节的 \meta{block range} 相同。 % \meta{class} 的有效值见源代码(第 \ref{sec:xeCJK-class-set} 节)。\pkg{xeCJK} 已 -% 经支持 |Unicode| 中所有 CJK 文字和标点。一般来说,不要轻易改变字符类别。 +% 经支持 |Unicode| 中所有 CJK 文字和标点。一般来说,不要轻易改变字符类别。带星号的 +% 命令除了设置字符类别以外,为了确保标点处理的正确性,还重置标点符号所属的字符类。 % \end{function} % % \begin{function}[EXP]{\xeCJKResetPunctClass} % \begin{syntax} % \cs{xeCJKResetPunctClass} % \end{syntax} -% 用于重置标点符号所属的字符类。使用 |\xeCJKDeclareCharClass| 更改字符类别之后,为 -% 了确保标点处理的正确性,应该在它之后使用 |\xeCJKResetPunctClass|。 +% 用于重置标点符号所属的字符类。 % \end{function} % % \begin{function}{\normalspacedchars} @@ -884,6 +898,9 @@ $URL$ %\end{documentation} % % +% \StopEventually{} +% +% %\begin{implementation} % % \section{\pkg{xeCJK} 代码实现} @@ -892,10 +909,6 @@ $URL$ %<*package> % \end{macrocode} % -% \begin{macrocode} -\ProvidesExplPackage{\ExplFileName}{\ExplFileDate}{3.0.7}{\ExplFileDescription} -% \end{macrocode} -% % \subsection{运行环境检查} % % \pkg{xeCJK} 必须使用 \XeTeX 引擎的支持。 @@ -979,7 +992,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_no_break:} % \begin{macrocode} -\cs_new_protected:Nn \xeCJK_no_break: { \tex_penalty:D \c_ten_thousand } +\cs_new_protected_nopar:Npn \xeCJK_no_break: { \tex_penalty:D \c_ten_thousand } % \end{macrocode} % \end{macro} % @@ -990,11 +1003,11 @@ $URL$ \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 +\cs_new_protected:Npn \xeCJK_AtEndPreamble:n #1 { \tl_gput_right:Nn \g_xeCJK_at_end_preamble_hook {#1} } -\cs_new:Nn \xeCJK_AfterPreamble:n +\cs_new_protected:Npn \xeCJK_AfterPreamble:n #1 { \tl_gput_right:Nn \g_xeCJK_after_preamble_hook {#1} } -\cs_new:Nn \xeCJK_AfterEndPreamble:n +\cs_new_protected:Npn \xeCJK_AfterEndPreamble:n #1 { \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: } @@ -1015,7 +1028,7 @@ $URL$ \tl_to_lowercase:n { \group_end: - \prg_new_conditional:Nnn \xeCJK_if_outer_macro:c { p , T , F , TF } + \prg_new_conditional:Npnn \xeCJK_if_outer_macro:c #1 { p , T , F , TF } { \exp_last_unbraced:Nf \xeCJK_if_outer_macro_aux:w { \cs_meaning:c {#1} } OUZER ~ MAYRO ; \q_stop @@ -1034,7 +1047,8 @@ $URL$ % \end{macro} % % \begin{macro}[TF,internal]{\xeCJK_peek_catcode_ignore_spaces:N} -% 对 \pkg{l3token} 打的补丁,使 |\xeCJK_peek_catcode_ignore_spaces:NTF| 可用于 |\outer| 宏。 +% 对 \pkg{l3token} 打的补丁,使 \cs{xeCJK_peek_catcode_ignore_spaces:NTF} 可 +% 用于 \cs{outer} 宏。 % \begin{macrocode} \token_new:Nn \l_xeCJK_peek_search_token { ? } \cs_new_protected:Npn \xeCJK_peek_catcode_ignore_spaces:NTF #1#2#3 @@ -1074,7 +1088,7 @@ $URL$ % \begin{macro}[pTF,internal]{\xeCJK_if_blank_x:n} % 判断是否为空或者仅含一个空格。 % \begin{macrocode} -\prg_new_conditional:Nnn \xeCJK_if_blank_x:n { p , T , F , TF } +\prg_new_conditional:Npnn \xeCJK_if_blank_x:n #1 { p , T , F , TF } { \if_int_compare:w \pdftex_strcmp:D { \c_empty_tl } {#1} = \c_zero \prg_return_true: @@ -1086,6 +1100,18 @@ $URL$ % \end{macrocode} % \end{macro} % +% \begin{macro}[pTF,internal]{\xeCJK_if_package_loaded:n} +% 判断宏包是否载入,可用于文档中。 +% \begin{macrocode} +\prg_new_conditional:Npnn \xeCJK_if_package_loaded:n #1 { p , T , F , TF } + { + \tl_if_exist:cTF { ver@ #1 . \c_xeCJK_pkg_extension_tl } + { \prg_return_true: } { \prg_return_false: } + } +\tl_const:Nx \c_xeCJK_pkg_extension_tl { \@pkgextension } +% \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} @@ -1165,7 +1191,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_new_class:n,\g_xeCJK_class_seq} % 新建一个字符类别。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_new_class:n +\cs_new_protected_nopar:Npn \xeCJK_new_class:n #1 { \exp_args:Nc \newXeTeXintercharclass { xeCJK_#1_class } \clist_gclear_new:c { g_xeCJK_#1_range_clist } @@ -1197,41 +1223,46 @@ $URL$ { \clist_gclear_new:c { g_xeCJK_#1_range_clist } } \clist_new:N \g_xeCJK_CJK_class_clist \prop_new:N \g_xeCJK_CJK_class_prop -\cs_new_nopar:Nn \xeCJK_save_CJK_class:n +\cs_new_protected_nopar:Npn \xeCJK_save_CJK_class:n #1 { \clist_gput_right:Nx \g_xeCJK_CJK_class_clist {#1} \prop_gput:Nvx \g_xeCJK_CJK_class_prop { xeCJK_#1_class } {#1} } \cs_generate_variant:Nn \prop_gput:Nnn { Nvx } -\clist_map_inline:nn { CJK, FullLeft, FullRight } { \xeCJK_save_CJK_class:n {#1} } +\clist_map_function:nN { CJK, FullLeft, FullRight } \xeCJK_save_CJK_class:n % \end{macrocode} % \end{macro} % % \begin{macro}[internal]{\xeCJK_class_num:n} % |#1| 为字符类别名称,用于取得字符类别对应的编号。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_class_num:n { \tl_use:c { xeCJK_#1_class } } +\cs_new_nopar:Npn \xeCJK_class_num:n #1 { \tl_use:c { xeCJK_#1_class } } % \end{macrocode} % \end{macro} % % \begin{macro}{\xeCJKDeclareCharClass} -% \begin{macro}[aux]{\xeCJK_setcharclass_aux:Nn} +% \begin{macro}[aux]{\xeCJK_set_char_class_aux:Nn} % 用于设置字符所属的类别,|#1| 为类别名称,|#2| 为字符的 |Unicode|,相邻字符用 % 半角逗号隔开,支持类似 |"1100 -> "11FF| 起止范围的使用方式。 % \begin{macrocode} -\NewDocumentCommand \xeCJKDeclareCharClass { > { \TrimSpaces } m m } +\NewDocumentCommand \xeCJKDeclareCharClass { s > { \TrimSpaces } m m } + { + \xeCJK_declare_char_class:nn {#2} {#3} + \IfBooleanT {#1} { \xeCJKResetPunctClass } + } +\cs_new_protected_nopar:Npn \xeCJK_declare_char_class:nn #1#2 { \clist_gput_right:cx { g_xeCJK_#1_range_clist } {#2} \clist_map_inline:xn {#2} { \str_if_eq_x:nnF {##1} { -> } { - \xeCJK_setcharclass_aux:Nn \xeCJKsetcharclass {##1} + \xeCJK_set_char_class_aux:Nn \xeCJK_set_char_class:nnn {##1} { \xeCJK_class_num:n {#1} } } } } -\NewDocumentCommand \xeCJK_setcharclass_aux:Nn +\NewDocumentCommand \xeCJK_set_char_class_aux:Nn { m > { \SplitArgument { 1 } { -> } } m } { #1 #2 } \cs_generate_variant:Nn \clist_map_inline:nn { x } % \end{macrocode} @@ -1241,15 +1272,18 @@ $URL$ % \begin{macro}[internal]{\xeCJKsetcharclass} % |#1| 和 |#2| 为字符类别起止的 |Unicode|,|#3| 为类别名称对应编号。 % \begin{macrocode} -\NewDocumentCommand \xeCJKsetcharclass { m m m } +\NewDocumentCommand \xeCJKsetcharclass { s m m m } + { + \xeCJK_set_char_class:nnn {#2} {#3} {#4} + \IfBooleanF {#1} { \xeCJKResetPunctClass } + } +\cs_new_protected_nopar:Npn \xeCJK_set_char_class:nnn #1#2#3 { \xeCJK_check_num_range:nnNN {#1} {#2} \l_xeCJK_tmpa_int \l_xeCJK_tmpb_int \int_set:Nn \l_xeCJK_tmpc_int {#3} \prop_if_in:NVTF \g_xeCJK_CJK_class_prop \l_xeCJK_tmpc_int - { \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_xeCJK_tmpa_int + { \loop \char_set_catcode_other:n \l_xeCJK_tmpa_int } + { \loop } \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 @@ -1260,7 +1294,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_check_num_range:nnNN} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_check_num_range:nnNN +\cs_new_protected_nopar:Npn \xeCJK_check_num_range:nnNN #1#2#3#4 { \bool_if:nTF { \xeCJK_if_blank_x_p:n {#1} || \xeCJK_if_blank_x_p:n {#2} } { @@ -1280,18 +1314,18 @@ $URL$ % \begin{macrocode} \NewDocumentCommand \xeCJKResetPunctClass { } { - \xeCJKDeclareCharClass { HalfLeft } + \xeCJK_declare_char_class:nn { HalfLeft } { "28 , "2D , "5B , "60 , "7B } - \xeCJKDeclareCharClass { HalfRight } + \xeCJK_declare_char_class:nn { HalfRight } { "21 , "22 , "25 , "27 , "29 , "2C , "2E , "3A , "3B , "3F , "5D , "7D , } - \xeCJKDeclareCharClass { FullLeft } + \xeCJK_declare_char_class:nn { FullLeft } { "2018 , "201C , "2116 , "3008 , "300A , "300C , "300E , "3010 , "3012 , "3014 , "3016 , "3018 , "301A , "301D , "3036 , "E76C , "FE59 , "FE5B , "FE5D , "FE5F , "FE60 , "FE69 , "FE6B , "FF03 , "FF04 , "FF08 , "FF20 , "FF3B , "FF5B , "FFE0 , "FFE1 , "FFE5 , "FFE6 , } - \xeCJKDeclareCharClass { FullRight } + \xeCJK_declare_char_class:nn { FullRight } { "00B7 , "2019 , "201D , "2014 , "2025 , "2026 , "2030 , "2500 , "3001 , "3002 , "3005 , "3006 , "3009 , "300B , "300D , "300F , "3011 , "3015 , @@ -1310,7 +1344,7 @@ $URL$ % % \hypertarget{CJKcharclass}{设置 CJK 文字的范围}。 % \begin{macrocode} -\xeCJKDeclareCharClass { CJK } +\xeCJK_declare_char_class:nn { CJK } { % \end{macrocode} % \begin{itemize} @@ -1460,19 +1494,20 @@ $URL$ % \end{macrocode} % \end{macro} % -% \begin{macro}[internal]{\xeCJK_inter_class_toks:nnn,\xeCJK_inter_class_toks:nnc} +% \begin{macro}[internal] +% {\xeCJK_inter_class_toks:nnn,\xeCJK_inter_class_toks:nnc,\xeCJK_inter_class_toks:nnx} % 在相邻类别之间插入内容。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_inter_class_toks:nnn +\cs_new_protected_nopar:Npn \xeCJK_inter_class_toks:nnn #1#2#3 { \XeTeXinterchartoks \xeCJK_class_num:n {#1} \xeCJK_class_num:n {#2} = {#3} } -\cs_generate_variant:Nn \xeCJK_inter_class_toks:nnn { nnc } +\cs_generate_variant:Nn \xeCJK_inter_class_toks:nnn { nnc , nnx } % \end{macrocode} % \end{macro} % % \begin{macro}[internal]{\xeCJK_get_inter_class_toks:nn} % 取出相邻类别之间的内容。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_get_inter_class_toks:nn +\cs_new_nopar:Npn \xeCJK_get_inter_class_toks:nn #1#2 { \tex_the:D \XeTeXinterchartoks \xeCJK_class_num:n {#1} \xeCJK_class_num:n {#2} } % \end{macrocode} % \end{macro} @@ -1480,7 +1515,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_clear_inter_class_toks:nn} % 清除相邻类别之间的内容。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_clear_inter_class_toks:nn +\cs_new_protected_nopar:Npn \xeCJK_clear_inter_class_toks:nn #1#2 { \xeCJK_inter_class_toks:nnn {#1} {#2} { \c_empty_tl } } % \end{macrocode} % \end{macro} @@ -1488,13 +1523,10 @@ $URL$ % \begin{macro}[internal]{\xeCJK_pre_inter_class_toks:nnn} % 在相邻类别之间已有的内容前增加内容。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_pre_inter_class_toks:nnn +\cs_new_protected_nopar:Npn \xeCJK_pre_inter_class_toks:nnn #1#2#3 { - \use:x - { - \xeCJK_inter_class_toks:nnn {#1} {#2} - { \exp_not:n {#3} \xeCJK_get_inter_class_toks:nn {#1} {#2} } - } + \xeCJK_inter_class_toks:nnx {#1} {#2} + { \exp_not:n {#3} \xeCJK_get_inter_class_toks:nn {#1} {#2} } } % \end{macrocode} % \end{macro} @@ -1502,13 +1534,10 @@ $URL$ % \begin{macro}[internal]{\xeCJK_app_inter_class_toks:nnn,\xeCJK_app_inter_class_toks:nnc} % 在相邻类别之间已有的内容后追加内容。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_app_inter_class_toks:nnn +\cs_new_protected_nopar:Npn \xeCJK_app_inter_class_toks:nnn #1#2#3 { - \use:x - { - \xeCJK_inter_class_toks:nnn {#1} {#2} - { \xeCJK_get_inter_class_toks:nn {#1} {#2} \exp_not:n {#3} } - } + \xeCJK_inter_class_toks:nnx {#1} {#2} + { \xeCJK_get_inter_class_toks:nn {#1} {#2} \exp_not:n {#3} } } \cs_generate_variant:Nn \xeCJK_app_inter_class_toks:nnn { nnc } % \end{macrocode} @@ -1517,13 +1546,10 @@ $URL$ % \begin{macro}[internal]{\xeCJK_copy_inter_class_toks:nnnn} % 将 |#3| 和 |#4| 之间的内容复制到 |#1| 和 |#2| 之间。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_copy_inter_class_toks:nnnn +\cs_new_protected_nopar:Npn \xeCJK_copy_inter_class_toks:nnnn #1#2#3#4 { - \use:x - { - \xeCJK_inter_class_toks:nnn {#1} {#2} - { \xeCJK_get_inter_class_toks:nn {#3} {#4} } - } + \xeCJK_inter_class_toks:nnx {#1} {#2} + { \xeCJK_get_inter_class_toks:nn {#3} {#4} } } % \end{macrocode} % \end{macro} @@ -1531,7 +1557,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_clear_CJK_toks:} % 清除边界与 CJK 文字、全角左右标点之间的内容。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_clear_CJK_toks: +\cs_new_protected_nopar:Npn \xeCJK_clear_CJK_toks: { \clist_map_inline:Nn \g_xeCJK_CJK_class_clist { \xeCJK_clear_inter_class_toks:nn { Boundary } {##1} } @@ -1687,7 +1713,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_Boundary_and_CJK:,\xeCJK_check_for_glue:} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_Boundary_and_CJK: +\cs_new_protected_nopar:Npn \xeCJK_Boundary_and_CJK: { { \xeCJK_check_for_glue: } \c_group_begin_token @@ -1695,7 +1721,7 @@ $URL$ \xeCJK_select_font: \CJKsymbol } -\cs_new_nopar:Nn \xeCJK_check_for_glue: +\cs_new_protected_nopar:Npn \xeCJK_check_for_glue: { \bool_if:nTF { \xeCJK_if_last_node_p:n { CJK } || \xeCJK_if_last_node_p:n { CJK_space } } @@ -1765,7 +1791,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_CJK_and_CJK:N} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_CJK_and_CJK:N { \CJKglue \CJKsymbol {#1} } +\cs_new_protected_nopar:Npn \xeCJK_CJK_and_CJK:N #1 { \CJKglue \CJKsymbol {#1} } % \end{macrocode} % \end{macro} % @@ -1809,7 +1835,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_punct_rule:n} % 用于抹去标点符号的左/右空白。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_punct_rule:n +\cs_new_protected_nopar:Npn \xeCJK_punct_rule:n #1 { \tex_vrule:D \@width \dim_eval:c { \l_xeCJK_punct_coor_tl/rule/#1 } @@ -1822,7 +1848,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_punct_glue:n} % 根据所选的标点处理方式在标点符号左/右增加的空白。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_punct_glue:n +\cs_new_protected_nopar:Npn \xeCJK_punct_glue:n #1 { \skip_horizontal:n { @@ -1837,7 +1863,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_punct_kern:n} % 相邻两个标点之间的间距。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_punct_kern:n +\cs_new_protected_nopar:Npn \xeCJK_punct_kern:n #1 { \tex_kern:D \dim_eval:c { \l_xeCJK_punct_coor_tl/kern/#1 } } % \end{macrocode} % \end{macro} @@ -1850,7 +1876,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_before_FullLeft:N} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_before_FullLeft:N +\cs_new_protected_nopar:Npn \xeCJK_before_FullLeft:N #1 { \tl_set:Nx \l_xeCJK_lastpunct_tl {#1} \xeCJK_punct_rule:n { l/#1 } @@ -1861,7 +1887,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_after_FullRight:} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_after_FullRight: +\cs_new_protected_nopar:Npn \xeCJK_after_FullRight: { \xeCJK_get_punct_bounds:nV { r } \l_xeCJK_lastpunct_tl \xeCJK_punct_rule:n { r/\l_xeCJK_lastpunct_tl } @@ -1872,7 +1898,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_CJK_and_FullLeft:N} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_CJK_and_FullLeft:N +\cs_new_protected_nopar:Npn \xeCJK_CJK_and_FullLeft:N #1 { \xeCJK_get_punct_bounds:nN { l } {#1} \int_compare:nNnF \etex_lastnodetype:D = \c_one @@ -1889,7 +1915,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_CJK_and_FullRight:N} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_CJK_and_FullRight:N +\cs_new_protected_nopar:Npn \xeCJK_CJK_and_FullRight:N #1 { \xeCJK_get_punct_bounds:nN { r } {#1} \xeCJK_punct_if_long:NTF {#1} \CJKglue @@ -1909,7 +1935,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_FullLeft_and_FullLeft:N} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_FullLeft_and_FullLeft:N +\cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_FullLeft:N #1 { \xeCJK_no_break: \xeCJK_get_punct_bounds:nN { l } {#1} @@ -1922,7 +1948,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_FullLeft_and_FullRight:N} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_FullLeft_and_FullRight:N +\cs_new_protected_nopar:Npn \xeCJK_FullLeft_and_FullRight:N #1 { \xeCJK_no_break: \xeCJK_get_punct_bounds:nN { r } {#1} @@ -1937,7 +1963,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_FullRight_and_FullLeft:N} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_FullRight_and_FullLeft:N +\cs_new_protected_nopar:Npn \xeCJK_FullRight_and_FullLeft:N #1 { \xeCJK_punct_rule:n { r/\l_xeCJK_lastpunct_tl } \xeCJK_get_punct_bounds:nN { l } {#1} @@ -1951,7 +1977,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_FullRight_and_FullRight:N} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_FullRight_and_FullRight:N +\cs_new_protected_nopar:Npn \xeCJK_FullRight_and_FullRight:N #1 { \xeCJK_punct_rule:n { r/\l_xeCJK_lastpunct_tl } \xeCJK_get_punct_bounds:nN { r } {#1} @@ -1966,7 +1992,7 @@ $URL$ % % \begin{macro}[pTF,internal]{\xeCJK_if_last_node:n} % \begin{macrocode} - \prg_new_conditional:Nnn \xeCJK_if_last_node:n { p , T , F , TF } + \prg_new_conditional:Npnn \xeCJK_if_last_node:n #1 { p , T , F , TF } { \if_dim:w \dim_use:c { c_xeCJK_#1_node_dim } = \tex_lastkern:D \prg_return_true: \else: \prg_return_false: \fi: @@ -1977,13 +2003,13 @@ $URL$ % \begin{macro}[internal]{\xeCJK_def_node:nn,\xeCJK_make_node:n} % 用于判断插入的各种 |kern|。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_def_node:nn +\cs_new_protected_nopar:Npn \xeCJK_def_node:nn #1#2 { \dim_if_exist:cTF { c_xeCJK_#1_node_dim } { \dim_gset:cn } { \dim_const:cn } { c_xeCJK_#1_node_dim } {#2} } -\cs_new_protected_nopar:Nn \xeCJK_make_node:n +\cs_new_protected_nopar:Npn \xeCJK_make_node:n #1 { \tex_kern:D - \dim_use:c { c_xeCJK_#1_node_dim } \tex_kern:D \dim_use:c { c_xeCJK_#1_node_dim } @@ -2071,7 +2097,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_ignore_spaces:,\xeCJK_peek_math:} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_ignore_spaces: +\cs_new_protected_nopar:Npn \xeCJK_ignore_spaces: { \peek_catcode:NTF \c_space_token { @@ -2096,7 +2122,7 @@ $URL$ } } } -\cs_new_nopar:Nn \xeCJK_peek_math: +\cs_new_protected_nopar:Npn \xeCJK_peek_math: { \peek_catcode:NTF \c_space_token { @@ -2158,7 +2184,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_checksingle:N,\xeCJK_checksingle:NN,\xeCJK_checksingle:NNN} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_checksingle:N +\cs_new_protected_nopar:Npn \xeCJK_checksingle:N #1 { \peek_catcode:NTF \c_catcode_other_token { \xeCJK_checksingle:NN {#1} } @@ -2166,7 +2192,7 @@ $URL$ \bool_if:nTF { ! ( \xeCJK_if_outer_macro_p:c { l_peek_token } ) && - \xeCJK_if_blank_x_p:n { \token_get_arg_spec:c { l_peek_token } } && + \xeCJK_if_blank_x_p:n { \token_get_arg_spec:c { l_peek_token } } && \exp_args:NNc \exp_args:No \tl_if_single_token_p:n { l_peek_token } && \exp_args:NNc \exp_after:wN \token_if_other_p:N { l_peek_token } } @@ -2174,7 +2200,7 @@ $URL$ { \xeCJK_checksingle_save_CJKsymbol:N {#1} } } } -\cs_new_nopar:Nn \xeCJK_checksingle:NN +\cs_new_protected_nopar:Npn \xeCJK_checksingle:NN #1#2 { \peek_catcode:NTF \c_catcode_other_token { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2 } @@ -2207,7 +2233,7 @@ $URL$ { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2 } } } -\cs_new_nopar:Nn \xeCJK_checksingle:NNN +\cs_new_protected_nopar:Npn \xeCJK_checksingle:NNN #1#2#3 { \bool_if:nTF { @@ -2222,7 +2248,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_checksingle_env:NNN,\xeCJK_checksingle_env:NNNNn} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_checksingle_env:NNN +\cs_new_protected_nopar:Npn \xeCJK_checksingle_env:NNN #1#2#3 { \peek_catcode_remove:NTF \c_math_toggle_token { @@ -2240,7 +2266,7 @@ $URL$ } } } -\cs_new_nopar:Nn \xeCJK_checksingle_env:NNNNn +\cs_new_protected_nopar:Npn \xeCJK_checksingle_env:NNNNn #1#2#3#4#5 { \clist_if_in:NnTF \g_xeCJK_inline_env_clist {#5} { \xeCJK_checksingle_save_CJKsymbol:N {#1} #2#3 } @@ -2288,12 +2314,12 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_erase_CJKsymbol:, \xeCJK_restore_CJKsymbol:} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_erase_CJKsymbol: +\cs_new_protected_nopar:Npn \xeCJK_erase_CJKsymbol: { \cs_gset_eq:NN \CJKsymbol_Block \CJKsymbol \cs_gset_eq:NN \CJKsymbol \prg_do_nothing: } -\cs_new_nopar:Nn \xeCJK_restore_CJKsymbol: +\cs_new_protected_nopar:Npn \xeCJK_restore_CJKsymbol: { \cs_gset_eq:NN \CJKsymbol \CJKsymbol_Block \CJKsymbol @@ -2304,8 +2330,11 @@ $URL$ % \begin{macro}{\xeCJKDeclareSubCJKBlock} % 声明 CJK 子区范围,|#1| 为自定义名称,|#2| 为子区的 |Unicode| 范围。 % \begin{macrocode} -\NewDocumentCommand \xeCJKDeclareSubCJKBlock { m m } - { \xeCJKDeclareSubCharClass { CJK } {#1} {#2} } +\NewDocumentCommand \xeCJKDeclareSubCJKBlock { s m m } + { + \xeCJKDeclareSubCharClass { CJK } {#2} {#3} + \IfBooleanT {#1} { \xeCJKResetPunctClass } + } \@onlypreamble \xeCJKDeclareSubCJKBlock % \end{macrocode} % \end{macro} @@ -2314,30 +2343,32 @@ $URL$ % 取消和恢复对 CJK 子区的声明。 % \begin{macrocode} \bool_new:N \l_xeCJK_sub_cancel_bool -\NewDocumentCommand \xeCJKCancelSubCJKBlock { m } +\NewDocumentCommand \xeCJKCancelSubCJKBlock { s m } { \bool_if:NF \l_xeCJK_sub_cancel_bool { \bool_set_true:N \l_xeCJK_sub_cancel_bool - \xeCJK_sub_restore_or_cancel:n {#1} + \xeCJK_sub_restore_or_cancel:n {#2} + \IfBooleanT {#1} { \xeCJKResetPunctClass } } } -\NewDocumentCommand \xeCJKRestoreSubCJKBlock { m } +\NewDocumentCommand \xeCJKRestoreSubCJKBlock { s m } { \bool_if:NT \l_xeCJK_sub_cancel_bool { \bool_set_false:N \l_xeCJK_sub_cancel_bool - \xeCJK_sub_restore_or_cancel:n {#1} + \xeCJK_sub_restore_or_cancel:n {#2} + \IfBooleanT {#1} { \xeCJKResetPunctClass } } } -\cs_new_nopar:Nn \xeCJK_sub_restore_or_cancel:n +\cs_new_protected_nopar:Npn \xeCJK_sub_restore_or_cancel:n #1 { \clist_map_inline:xn {#1} { \cs_if_free:cTF { xeCJK_ CJK/##1 _class } { \xeCJK_error:nx { SubBlock-undefined } {##1} } { - \xeCJKDeclareCharClass + \xeCJK_declare_char_class:nn { CJK \bool_if:NF \l_xeCJK_sub_cancel_bool { /##1 } } { \tl_use:c { g_xeCJK_CJK/##1_range_clist } } } @@ -2364,7 +2395,7 @@ $URL$ \xeCJK_new_sub_key:n {#2} \xeCJK_UL_subclass_patch:nn {#1} {#2} } - \xeCJKDeclareCharClass { #1/#2 } {#3} + \xeCJK_declare_char_class:nn { #1/#2 } {#3} } \@onlypreamble \xeCJKDeclareSubCharClass % \end{macrocode} @@ -2372,7 +2403,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_set_sub_class_toks:nn} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_set_sub_class_toks:nn +\cs_new_protected_nopar:Npn \xeCJK_set_sub_class_toks:nn #1#2 { \clist_map_inline:Nn \g_xeCJK_base_class_clist { @@ -2416,7 +2447,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_UL_subclass_patch:nn} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_UL_subclass_patch:nn +\cs_new_protected_nopar:Npn \xeCJK_UL_subclass_patch:nn #1#2 { \tl_put_right:Nn \xeCJK_UL_subclass_patch_tl { @@ -2518,7 +2549,7 @@ $URL$ { \cs_set_eq:NN \xeCJK_punct_nobreak: \xeCJK_zero_glue: } \NewDocumentCommand \xeCJKnobreakbetweenpuncts { } { \cs_set_eq:NN \xeCJK_punct_nobreak: \xeCJK_no_break: } -\cs_new_protected_nopar:Nn \xeCJK_zero_glue: { \skip_horizontal:N \c_zero_skip } +\cs_new_protected_nopar:Npn \xeCJK_zero_glue: { \skip_horizontal:N \c_zero_skip } % \end{macrocode} % \end{macro} % @@ -2532,20 +2563,20 @@ $URL$ \tl_new:c { l_xeCJK_#1_punct_tl } \prop_new:c { l_xeCJK_#1_punct_prop } } -\cs_new_nopar:Nn \xeCJK_set_special_punct:nn +\cs_new_protected_nopar:Npn \xeCJK_set_special_punct:nn #1#2 { \tl_set:cx { l_xeCJK_#1_punct_tl } {#2} \prop_clear:c { l_xeCJK_#1_punct_prop } \tl_map_inline:cn { l_xeCJK_#1_punct_tl } { \prop_put:cnn { l_xeCJK_#1_punct_prop } {##1} { } } } -\cs_new_nopar:Nn \xeCJK_add_special_punct:nn +\cs_new_protected_nopar:Npn \xeCJK_add_special_punct:nn #1#2 { \tl_put_right:cx { l_xeCJK_#1_punct_tl } {#2} \tl_map_inline:cn { l_xeCJK_#1_punct_tl } { \prop_put:cnn { l_xeCJK_#1_punct_prop } {##1} { } } } -\cs_new_nopar:Nn \xeCJK_sub_special_punct:nn +\cs_new_protected_nopar:Npn \xeCJK_sub_special_punct:nn #1#2 { \tl_map_inline:xn {#2} { @@ -2577,7 +2608,7 @@ $URL$ % 决定添加的左/右空白。全角方式直接添加标点的实际左/右空白;半角方式添加标点左右空白 % 中的最小值;开明方式与半角相同,只在开明标点再增加实际左/右空白的一半。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_get_punct_bounds:nN +\cs_new_protected_nopar:Npn \xeCJK_get_punct_bounds:nN #1#2 { \tl_if_exist:cF { \l_xeCJK_punct_coor_tl/rule/#1/#2 } { @@ -2689,12 +2720,12 @@ $URL$ % \xeCJK_punct_if_long:N,\xeCJK_punct_if_middle:N, % \xeCJK_punct_if_mixedwidth:N} % \begin{macrocode} -\prg_new_conditional:Nnn \xeCJK_punct_if_right:N { p , T , F , TF } +\prg_new_conditional:Npnn \xeCJK_punct_if_right:N #1 { p , T , F , TF } { \tl_if_exist:cTF { \l_xeCJK_punct_coor_tl/glue/r/#1 } \prg_return_true: \prg_return_false: } -\prg_new_conditional:Nnn \xeCJK_punct_if_both_left_right:NN { p , T , F , TF } +\prg_new_conditional:Npnn \xeCJK_punct_if_both_left_right:NN #1#2 { p , T , F , TF } { \bool_if:nTF { @@ -2705,10 +2736,10 @@ $URL$ } \prg_return_true: \prg_return_false: } -\cs_generate_variant:Nn \prg_new_conditional:Nnn { c } +\cs_generate_variant:Nn \prg_new_conditional:Npnn { c } \clist_map_inline:Nn \g_xeCJK_special_ps_clist { - \prg_new_conditional:cnn { xeCJK_punct_if_#1:N } { p , T , F , TF } + \prg_new_conditional:cpnn { xeCJK_punct_if_#1:N } ##1 { p , T , F , TF } { \prop_if_in:cnTF { l_xeCJK_#1_punct_prop } {##1} \prg_return_true: \prg_return_false: @@ -2721,7 +2752,7 @@ $URL$ % 标点挤压。行末半角方式,相邻标点不挤压;全角方式,相邻两个标点占 1.5 汉字宽度, % 半角、开明和 CCT 方式相邻标点占一个汉字宽度。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_get_kern:NN +\cs_new_protected_nopar:Npn \xeCJK_get_kern:NN #1#2 { \tl_if_exist:cF { \l_xeCJK_punct_coor_tl/kern/#1-#2 } { @@ -2735,7 +2766,7 @@ $URL$ \tl_gset:cV { \l_xeCJK_punct_coor_tl/kern/#1-#2 } \l_xeCJK_tmpa_dim } } -\cs_new_nopar:Nn \xeCJK_calc_kern:NN +\cs_new_protected_nopar:Npn \xeCJK_calc_kern:NN #1#2 { \tl_if_eq:NNTF \l_xeCJK_punctstyle_tl \c_xeCJK_ps_marginkerning_tl { @@ -2794,7 +2825,7 @@ $URL$ % |#3| 和 |#4| 为相邻的两个标点,|#2| 为要确定的相邻两个标点总共占的宽度,|#1| 是 % 尺寸寄存器,用于记录根据所占宽度计算得出的相邻两个标点间距。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_calc_kern:NnNN +\cs_new_protected_nopar:Npn \xeCJK_calc_kern:NnNN #1#2#3#4 { \dim_set:Nn #1 { @@ -2815,7 +2846,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_get_punct_dimen:N} % 返回标点的左右空白和实际尺寸。对于破折号,计算两标点之间的空白,保证它中间不被断开。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_get_punct_dimen:N +\cs_new_protected_nopar:Npn \xeCJK_get_punct_dimen:N #1 { \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 @@ -2847,7 +2878,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_get_glyph_bounds:nNN} % 用 |\XeTeXglyphbounds| 计算标点的上下左右空白。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_get_glyph_bounds:nNN +\cs_new_protected_nopar:Npn \xeCJK_get_glyph_bounds:nNN #1#2#3 { \dim_set:Nn #3 { @@ -2915,7 +2946,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_fallback_testsymbol:N} % 测试当前字体中是否存在当前字符,如存在则直接输出,否则启用后备字体。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_fallback_testsymbol:N +\cs_new_protected_nopar:Npn \xeCJK_fallback_testsymbol:N #1 { \font_glyph_if_exist:NnTF \tex_font:D {`#1} { \xeCJK_fallback_save_CJKsymbol:N {#1} } @@ -2950,7 +2981,7 @@ $URL$ { \xeCJK_set_family_fallback:nnn {#1} {#2} {#3} } { \xeCJK_set_family:nnn { #1/FallBack } {#2} {#3} } } -\cs_new_nopar:Nn \xeCJK_set_family_fallback:nnn +\cs_new_protected_nopar:Npn \xeCJK_set_family_fallback:nnn #1#2#3 { \group_begin: \tl_set:Nx \l_xeCJK_family_fb_tl {#1} @@ -3028,7 +3059,7 @@ $URL$ % 用于定义 CJK 子区字体和备用字体的选项。 % \begin{macrocode} \clist_new:N \g_xeCJK_sub_key_clist -\cs_new_nopar:Nn \xeCJK_new_sub_key:n +\cs_new_protected_nopar:Npn \xeCJK_new_sub_key:n #1 { \clist_gput_right:Nx \g_xeCJK_sub_key_clist {#1} \keys_define:nn { xeCJK / features } @@ -3059,7 +3090,7 @@ $URL$ } } \cs_generate_variant:Nn \xeCJK_new_sub_key:n { x } -\cs_new_nopar:Nn \xeCJK_get_sub_features:nn +\cs_new_protected_nopar:Npn \xeCJK_get_sub_features:nn #1#2 { \tl_set:Nx \l_xeCJK_tmpa_tl {#2} \clist_clear:N \l_xeCJK_sub_fontfeat_clist @@ -3086,7 +3117,7 @@ $URL$ % \begin{macro}[aux] % {\xeCJK_gobble_brace:N,\xeCJK_get_sub_features:nn,\xeCJK_get_sub_features_aux:n} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_gobble_brace:N +\cs_new_protected_nopar:Npn \xeCJK_gobble_brace:N #1 { \exp_args:No \tl_if_head_is_group:nT #1 { @@ -3094,7 +3125,7 @@ $URL$ \xeCJK_gobble_brace:N #1 } } -\cs_new_nopar:Npn \xeCJK_get_sub_features_aux:n [#1] #2 +\cs_new_protected_nopar:Npn \xeCJK_get_sub_features_aux:n [#1] #2 { \clist_set:Nx \l_xeCJK_sub_fontfeat_clist {#1} \tl_set:Nx \l_xeCJK_sub_fontname_tl {#2} @@ -3113,7 +3144,7 @@ $URL$ % SlantedFeatures, BoldSlantedFeatures} % 调用字体的属性声明,同 \pkg{fontspec} 宏包。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_map_features_id:n +\cs_new_nopar:Npn \xeCJK_map_features_id:n #1 { \prop_get:Nn \g_xeCJK_features_id_prop {#1} } \prop_new:N \g_xeCJK_features_id_prop \prop_put:Nnn \g_xeCJK_features_id_prop { bf } { Bold } @@ -3171,7 +3202,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_set_init:} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_set_init: +\cs_new_protected_nopar:Npn \xeCJK_set_init: { \tl_clear:N \l_xeCJK_monoscale_tl \int_gincr:N \g_xeCJK_fontspec_int @@ -3199,7 +3230,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_set_family:nnn} % 设置一个 CJK 新字体族,与 |\newfontfamily| 类似,增加 |FallBack| 选项。 % \begin{macrocode} -\cs_new_protected_nopar:Nn \xeCJK_set_family:nnn +\cs_new_protected_nopar:Npn \xeCJK_set_family:nnn #1#2#3 { \group_begin: \xeCJK_set_init: @@ -3235,7 +3266,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_check_family:n} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_check_family:n +\cs_new_protected_nopar:Npn \xeCJK_check_family:n #1 { \prop_get:NnNT \g_xeCJK_family_prop {#1} \l_xeCJK_tmpa_tl { @@ -3250,12 +3281,12 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_add_font:nn,\xeCJK_add_font_if_new:nn} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_add_font:nn +\cs_new_protected_nopar:Npn \xeCJK_add_font:nn #1#2 { \prop_put:Nxx \l_xeCJK_add_font_prop { \xeCJK_map_features_id:n {#1} Font } {#2} } -\cs_new_nopar:Nn \xeCJK_add_font_if_new:nn +\cs_new_protected_nopar:Npn \xeCJK_add_font_if_new:nn #1#2 { \prop_put_if_new:Nxx \l_xeCJK_add_font_prop { \xeCJK_map_features_id:n {#1} Font } {#2} @@ -3275,12 +3306,12 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_add_fake_bold:n,\xeCJK_add_fake_slant:n} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_add_fake_bold:n +\cs_new_protected_nopar:Npn \xeCJK_add_fake_bold:n #1 { \clist_put_left:cx { l_xeCJK_fontfeat_#1_clist } { FakeBold = { \fp_use:N \l_xeCJK_EmboldenFactor_fp } } } -\cs_new_nopar:Nn \xeCJK_add_fake_slant:n +\cs_new_protected_nopar:Npn \xeCJK_add_fake_slant:n #1 { \clist_put_left:cx { l_xeCJK_fontfeat_#1_clist } { FakeSlant = { \fp_use:N \l_xeCJK_SlantFactor_fp } } @@ -3290,9 +3321,9 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_parse_features:,\xeCJK_parse_features:n} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_parse_features: +\cs_new_protected_nopar:Npn \xeCJK_parse_features: { \prop_map_inline:Nn \g_xeCJK_features_id_prop { \xeCJK_parse_features:n {##1} } } -\cs_new_nopar:Nn \xeCJK_parse_features:n +\cs_new_protected_nopar:Npn \xeCJK_parse_features:n #1 { \xeCJK_if_font_select:nTF {#1} { @@ -3320,12 +3351,12 @@ $URL$ % % \begin{macro}[pTF,internal]{\xeCJK_if_font_select:n,\xeCJK_if_it_or_sl:n} % \begin{macrocode} -\prg_new_conditional:Nnn \xeCJK_if_font_select:n { p, T, F, TF } +\prg_new_conditional:Npnn \xeCJK_if_font_select:n #1 { p, T, F, TF } { \exp_args:Nc \xeCJK_if_blank_x:nTF { l_xeCJK_fontname_#1_tl } \prg_return_false: \prg_return_true: } -\prg_new_conditional:Nnn \xeCJK_if_it_or_sl:n { p, T, F, TF } +\prg_new_conditional:Npnn \xeCJK_if_it_or_sl:n #1 { p, T, F, TF } { \bool_if:nTF { \str_if_eq_x_p:nn { it } {#1} || \str_if_eq_x_p:nn { sl } {#1} } \prg_return_true: \prg_return_false: @@ -3335,7 +3366,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_set_fake:n} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_set_fake:n +\cs_new_protected_nopar:Npn \xeCJK_set_fake:n #1 { \str_if_eq_x:nnTF {#1} { bf } { \bool_if:NT \l_xeCJK_AutoFakeBold_bool { \xeCJK_add_fake_bold:n {#1} } } @@ -3364,7 +3395,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_map_it_sl:n} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_map_it_sl:n +\cs_new_protected_nopar:Npn \xeCJK_map_it_sl:n #1 { \xeCJK_if_map_font_select:nT {#1} { @@ -3378,14 +3409,14 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_get_map_font:n} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_get_map_font:n +\cs_new_nopar:Npn \xeCJK_get_map_font:n #1 { \tl_use:c { l_xeCJK_fontname_\str_if_eq_x:nnTF {#1} {it} {sl} {it} _tl } } % \end{macrocode} % \end{macro} % % \begin{macro}[pTF,internal]{\xeCJK_if_map_font_select:n} % \begin{macrocode} -\prg_new_conditional:Nnn \xeCJK_if_map_font_select:n { p, T, F, TF } +\prg_new_conditional:Npnn \xeCJK_if_map_font_select:n #1 { p, T, F, TF } { \xeCJK_if_blank_x:nTF { \xeCJK_get_map_font:n {#1} } \prg_return_false: \prg_return_true: @@ -3395,7 +3426,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_pass_features:} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_pass_features: +\cs_new_protected_nopar:Npn \xeCJK_pass_features: { \prop_map_inline:Nn \g_xeCJK_features_id_prop { @@ -3424,7 +3455,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_save_family_info:} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_save_family_info: +\cs_new_protected_nopar:Npn \xeCJK_save_family_info: { \group_begin: \clist_map_inline:Nn \g_xeCJK_CJK_subclass_clist @@ -3441,7 +3472,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_add_sub_block:} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_add_sub_block: +\cs_new_protected_nopar:Npn \xeCJK_add_sub_block: { \clist_remove_duplicates:N \l_xeCJK_sub_key_clist \clist_map_inline:Nn \l_xeCJK_sub_key_clist @@ -3489,7 +3520,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_copy_family:nn} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_copy_family:nn +\cs_new_protected_nopar:Npn \xeCJK_copy_family:nn #1#2 { \xeCJK_family_if_exist:xT {#2} { @@ -3509,9 +3540,9 @@ $URL$ % 缓存当前字体的原始格式,以加速编译。 % \begin{macrocode} \tl_set:Nn \l_xeCJK_font_coor_tl { xeCJK/\xeCJK@family/\f@series/\f@shape/\f@size } -\cs_new_nopar:Nn \xeCJK_select_font: +\cs_new_protected_nopar:Npn \xeCJK_select_font: { - \cs_if_exist_use:cF \l_xeCJK_font_coor_tl + \cs_if_exist_use:cF { \l_xeCJK_font_coor_tl } { \tl_set:Nx \l_xeCJK_current_coor_tl \l_xeCJK_font_coor_tl \xeCJK_family_if_exist:xTF { \xeCJK@family } @@ -3521,7 +3552,7 @@ $URL$ } } \cs_new_eq:NN \xeCJK@setfont \xeCJK_select_font: -\cs_new_nopar:Nn \xeCJK_switch_font:nn +\cs_new_protected_nopar:Npn \xeCJK_switch_font:nn #1#2 { \str_if_eq_x:nnF {#1} {#2} { @@ -3547,7 +3578,7 @@ $URL$ % % \begin{macro}[TF,internal]{\xeCJK_family_if_exist:x} % \begin{macrocode} -\prg_new_protected_conditional:Nnn \xeCJK_family_if_exist:x { T, F, TF } +\prg_new_protected_conditional:Npnn \xeCJK_family_if_exist:x #1 { T, F, TF } { \cs_if_free:cTF { xeCJK/family/#1 } { \prg_return_false: } @@ -3632,6 +3663,7 @@ $URL$ \clist_new:N \g_xeCJK_default_features_clist \NewDocumentCommand \defaultCJKfontfeatures { m } { \clist_gset:Nn \g_xeCJK_default_features_clist {#1} } +\defaultCJKfontfeatures { Script = CJK } \@onlypreamble \defaultCJKfontfeatures \NewDocumentCommand \addCJKfontfeatures { m } { @@ -3760,7 +3792,7 @@ $URL$ % % \begin{macro}[internal]{\xeCJK_set_mathfont:} % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_set_mathfont: +\cs_new_protected_nopar:Npn \xeCJK_set_mathfont: { \xeCJK_family_if_exist:xTF \c_xeCJK_math_tl { \tl_set:Nx \l_xeCJK_tmpa_tl \c_xeCJK_math_tl } @@ -3779,7 +3811,7 @@ $URL$ { \clist_map_inline:cn { g_xeCJK_##1_range_clist } { - \xeCJK_setcharclass_aux:Nn \xeCJKsetmathcode {####1} + \xeCJK_set_char_class_aux:Nn \xeCJKsetmathcode {####1} \mathalpha \c_xeCJK_math_tl } } @@ -3823,7 +3855,7 @@ $URL$ \xeCJK_set_monoscale: \addCJKfontfeatures { Scale = \fp_use:N \g_xeCJK_monoscale_fp } } -\cs_new_nopar:Nn \xeCJK_set_monoscale: +\cs_new_protected_nopar:Npn \xeCJK_set_monoscale: { \group_begin: \fontfamily \ttdefault \selectfont @@ -3837,7 +3869,7 @@ $URL$ % \begin{macro}{\setCJKmonoexspace} % \begin{macrocode} \NewDocumentCommand \setCJKmonoexspace { } { \xeCJK_set_monoexspace: } -\cs_new_nopar:Nn \xeCJK_set_monoexspace: +\cs_new_protected_nopar:Npn \xeCJK_set_monoexspace: { \group_begin: \fontfamily \ttdefault \selectfont @@ -3921,19 +3953,19 @@ $URL$ { \msg_redirect_module:nnn { xeCJK } { warning } { info } \msg_redirect_module:nnn { xeCJK } { info } { none } - \cs_if_exist:cF { ver@fontspec.sty } + \xeCJK_if_package_loaded:nF { fontspec } { \PassOptionsToPackage { quiet } { fontspec } } }, silent .code:n = { \msg_redirect_module:nnn { xeCJK } { warning } { none } \msg_redirect_module:nnn { xeCJK } { info } { none } - \cs_if_exist:cF { ver@fontspec.sty } + \xeCJK_if_package_loaded:nF { fontspec } { \PassOptionsToPackage { silent } { fontspec } } }, unknown .code:n = { - \cs_if_exist:cTF { ver@fontspec.sty } + \xeCJK_if_package_loaded:nTF { fontspec } { \xeCJK_error:nx { key-unknown } { \l_keys_key_tl } } { \PassOptionsToPackage { \l_keys_key_tl } { fontspec } } }, @@ -4014,7 +4046,7 @@ $URL$ % \begin{macro}[internal]{\punctstyle, \xeCJKplainchr} % \begin{macrocode} \NewDocumentCommand \punctstyle { m } { \xeCJKsetup { PunctStyle = {#1} } } -\cs_new_nopar:Npn \xeCJKplainchr { \punctstyle { plain } } +\NewDocumentCommand \xeCJKplainchr { } { \punctstyle { plain } } % \end{macrocode} % \end{macro} % @@ -4030,7 +4062,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_fix_itcorr:} % 修复倾斜校正。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_fix_itcorr: +\cs_new_protected_nopar:Npn \xeCJK_fix_itcorr: { \scan_stop: \xeCJK_if_last_node:nTF { default } @@ -4066,7 +4098,7 @@ $URL$ } } } -\cs_new_nopar:Nn \xeCJK_set_others_toks:n +\cs_new_protected_nopar:Npn \xeCJK_set_others_toks:n #1 { \int_set:Nn \xeCJK_Others_class {#1} \clist_map_inline:Nn \g_xeCJK_CJK_class_clist @@ -4096,7 +4128,7 @@ $URL$ % \begin{macro}[internal]{\xeCJK_patch:Nnn} % 给已有宏内容前后附加补丁。 % \begin{macrocode} -\cs_new_nopar:Nn \xeCJK_patch:Nnn +\cs_new_protected_nopar:Npn \xeCJK_patch:Nnn #1#2#3 { \tl_put_left:Nn #1 {#2} \tl_put_right:Nn #1 {#3} } % \end{macrocode} % \end{macro} @@ -4118,15 +4150,15 @@ $URL$ } \xeCJK_patch:Nnn \tipaencoding { \makexeCJKinactive } { } \cs_set_eq:NN \xeCJK_aux_r \r - \cs_set_nopar:Npn \r #1 { { \makexeCJKinactive \xeCJK_aux_r {#1} } } - \@ifpackageloaded { pifont } + \cs_set_protected_nopar:Npn \r #1 { { \makexeCJKinactive \xeCJK_aux_r {#1} } } + \xeCJK_if_package_loaded:nT { pifont } { \RenewDocumentCommand \Pifont { m } { \fontencoding {U} \fontfamily {#1} \fontseries {m} \fontshape {n} \selectfont \makexeCJKinactive } - } { } + } } \cs_new_eq:NN \xeCJK_group_begin: \group_begin: \cs_new_eq:NN \xeCJK_group_end: \group_end: @@ -4136,7 +4168,11 @@ $URL$ % \begin{macrocode} \xeCJK_AfterEndPreamble:n { - \cs_if_exist:cT { ver@hyperref.sty } + \bool_if:nT + { + \xeCJK_if_package_loaded_p:n { hyperref } && + \tl_if_exist_p:N \pdfstringdefPreHook + } { \tl_put_right:Nn \pdfstringdefPreHook { @@ -4162,7 +4198,7 @@ $URL$ \NewDocumentCommand \xeCJKcaption { o m } { \IfValueT {#1} { \XeTeXdefaultencoding "#1" } - \cs_set_nopar:Nx \xeCJK_reset_at_catcode: + \cs_set_nopar:Npx \xeCJK_reset_at_catcode: { \exp_not:n { \char_set_catcode:nn { `\@ } } { \char_value_catcode:n { `\@ } } @@ -4178,17 +4214,17 @@ $URL$ % \begin{macro}[internal] % {\xeCJK_ULprepunctchar:n, \xeCJK_ULpostpunctchar:n, \xeCJK_ULroutines:} % \begin{macrocode} -\cs_new_protected_nopar:Nn \xeCJK_ULprepunctchar:n +\cs_new_protected_nopar:Npn \xeCJK_ULprepunctchar:n #1 { { \makexeCJKinactive \CJKpunctsymbol {#1} \xeCJK_no_break: } \tex_ignorespaces:D } -\cs_new_protected_nopar:Nn \xeCJK_ULpostpunctchar:n +\cs_new_protected_nopar:Npn \xeCJK_ULpostpunctchar:n #1 { { \makexeCJKinactive \CJKpunctsymbol {#1} } \xeCJK_ignorespaces: } -\cs_new_protected_nopar:Nn \xeCJK_ULroutines: +\cs_new_protected_nopar:Npn \xeCJK_ULroutines: { \xeCJK_inter_class_toks:nnn { Default } { CJK } { \CJKecglue \CJKsymbol } \xeCJK_inter_class_toks:nnn { HalfLeft } { CJK } { \CJKsymbol } @@ -4214,12 +4250,12 @@ $URL$ { \cs_set_eq:NN \xeCJK_UL_CJKsymbol \CJKsymbol \cs_set_eq:NN \xeCJK_UL_CJKpunctsymbol \CJKpunctsymbol - \cs_set_nopar:Npn \CJKsymbol #1 + \cs_set_protected_nopar:Npn \CJKsymbol #1 { { \xeCJK_select_font: \xeCJK_UL_CJKsymbol {#1} } { \xeCJK_make_node:n { CJK } } \xeCJK_ignorespaces: } - \cs_set_nopar:Npn \CJKpunctsymbol #1 + \cs_set_protected_nopar:Npn \CJKpunctsymbol #1 { { \xeCJK_select_font: \xeCJK_UL_CJKpunctsymbol {#1} } } \xeCJK_ULroutines: } @@ -4237,8 +4273,9 @@ $URL$ \bool_if:NT \g_xeCJK_number_bool { \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 + \cs_set_protected_nopar:Npn \CJKaddEncHook #1#2 + { \cs_set_nopar:cpn { xeCJK_enc_#1 } {#2} } + \cs_set_protected_nopar:Npn \Unicode #1#2 { \tex_char:D \int_eval:n { (#1) * \c_two_hundred_fifty_six + (#2) } } \RequirePackage { CJKnumb } \use:c { xeCJK_enc_\CJK@UnicodeEnc }