diff options
author | Karl Berry <karl@freefriends.org> | 2013-07-26 23:10:53 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-07-26 23:10:53 +0000 |
commit | 81f3a7b776ea8fe83f4dbbe5ebf2d78648af9497 (patch) | |
tree | ddb69942c2476f9e4046260ea9f11e01df130516 /Master/texmf-dist/source | |
parent | 70387bf1fd37feeb2be25de8b7b23d129b360c86 (diff) |
xecjk (26jul13)
git-svn-id: svn://tug.org/texlive/trunk@31290 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r-- | Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx | 1087 | ||||
-rw-r--r-- | Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins | 31 |
2 files changed, 881 insertions, 237 deletions
diff --git a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx index 9c6b13540ef..ce3deb0783f 100644 --- a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx +++ b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx @@ -17,13 +17,18 @@ CJK scripts easily. This package is licensed in LPPL. -This package consists of the file xeCJK.dtx +This package consists of the file xeCJK.dtx, + full-stop.map, + fullwidth-stop.map, + han-simp.map, + han-trad.map, and the derived files xeCJK.pdf, xeCJK.sty, xeCJK.cfg, xeCJK.ins, xeCJKfntef.sty, xeCJK-listings.sty, + xunicode-addon.sty, xeCJK-example-autofake.tex, xeCJK-example-fallback.tex, xeCJK-example-subCJKblock.tex, @@ -33,8 +38,12 @@ This package consists of the file xeCJK.dtx xeCJK-example-punctstyle.tex, xeCJK-example-verbatim.tex, xeCJK-example-IVS.tex, - xeCJK-example-listings.tex, and - README.txt. (this file). + xeCJK-example-listings.tex, + full-stop.tec, + fullwidth-stop.tec, + han-simp.tec, + han-trad.tec, and + README.txt (this file). If you are interested in the process of development you may observe @@ -81,7 +90,7 @@ CJK scripts fonts (TrueType or OpenType). \askforoverwritefalse \preamble -$Id: xeCJK.dtx 465 2013-07-06 10:30:24Z sobenlee $ +$Id: xeCJK.dtx 477 2013-07-25 22:15:20Z sobenlee $ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ ----------------------------------------------------------------- Author: @@ -109,13 +118,18 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \endpreamble \postamble - This package consists of the file xeCJK.dtx + This package consists of the file xeCJK.dtx, + full-stop.map, + fullwidth-stop.map, + han-simp.map, + han-trad.map, and the derived files xeCJK.pdf, xeCJK.sty, xeCJK.cfg, xeCJK.ins, xeCJKfntef.sty, xeCJK-listings.sty, + xunicode-addon.sty, xeCJK-example-autofake.tex, xeCJK-example-fallback.tex, xeCJK-example-subCJKblock.tex, @@ -125,7 +139,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ xeCJK-example-punctstyle.tex, xeCJK-example-verbatim.tex, xeCJK-example-IVS.tex, - xeCJK-example-listings.tex, and + xeCJK-example-listings.tex, + full-stop.tec, + fullwidth-stop.tec, + han-simp.tec, + han-trad.tec, and README.txt. \endpostamble \declarepreamble\emptypreamble @@ -140,6 +158,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \file{\jobname.sty}{\from{\jobname.dtx}{package}} \file{xeCJKfntef.sty}{\from{\jobname.dtx}{fntef}} \file{xeCJK-listings.sty}{\from{\jobname.dtx}{listings}} + \file{xunicode-addon.sty}{\from{\jobname.dtx}{xunicode}} \usepreamble\emptypreamble \usepostamble\emptypostamble \usedir{tex/xelatex/xecjk/config} @@ -165,18 +184,19 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %<*internal> \fi %</internal> -%<*driver|package|config|fntef|listings> +%<*driver|package|config|fntef|listings|xunicode> %<*!config> \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} %</!config> -\GetIdInfo$Id: xeCJK.dtx 465 2013-07-06 10:30:24Z sobenlee $ +\GetIdInfo$Id: xeCJK.dtx 477 2013-07-25 22:15:20Z sobenlee $ %<*driver|package> {Typesetting CJK scripts with XeLaTeX} %</driver|package> %<config> {Configuration file for xeCJK package} %<fntef> {xeCJK patch file for ulem/CJKfntef} %<listings> {xeCJK patch file for listings} +%<xunicode> {addon file for xunicode} %<*driver|config> \ProvidesExplFile %</driver|config> @@ -184,18 +204,19 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ {\ExplFileName.\ExplFileExtension} %</driver> %<config> {\ExplFileName.cfg} -%<package|fntef|listings>\ProvidesExplPackage +%<package|fntef|listings|xunicode>\ProvidesExplPackage %<package> {\ExplFileName} %<fntef> {xeCJKfntef} %<listings> {xeCJK-listings} - {\ExplFileDate}{3.2.4}{\ExplFileDescription} +%<xunicode> {xunicode-addon} + {\ExplFileDate}{3.2.5}{\ExplFileDescription} %<*driver> -\def\xeCJKversion{3.2.4} +\def\xeCJKversion{3.2.5} \let\xeCJKdate\ExplFileDate \let\xeCJKrevnum\ExplFileVersion \ExplSyntaxOff %</driver> -%</driver|package|config|fntef|listings> +%</driver|package|config|fntef|listings|xunicode> % %<*driver> \expandafter\let\csname ver@thumbpdf.sty\endcsname\fmtversion @@ -212,6 +233,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \setlist[optiondesc]{font=\mdseries\ttfamily,align=right,labelsep=.5em,leftmargin=4.5em} \def\PSKeyVal#1#2{\item[#1]\makebox[4em][l]{\meta{#2}}\ignorespaces} \setmainfont[Ligatures=TeX]{TeX Gyre Pagella} +\setmonofont{CMU Typewriter Text} \setCJKmainfont[BoldFont=Adobe Heiti Std,ItalicFont=Adobe Kaiti Std]{Adobe Song Std} \setCJKmonofont{Adobe Kaiti Std} \xeCJKDeclareSubCJKBlock{HKMD} { "FF65 } @@ -221,7 +243,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \setCJKmainfont[Ext-B]{SimSun-ExtB} \setCJKmainfont[Hangul]{Adobe Myungjo Std} \xeCJKsetup{PunctStyle=kaiming,KaiMingPunct+={:;}} -\def\MacroFont{\small\normalfont\ttfamily\xeCJKVerbAddon} +\def\MacroFont{\small\linespread{1}\normalfont\ttfamily} \def\XeTeX{\hologo{XeTeX}} \def\XeLaTeX{\hologo{XeLaTeX}} \def\LaTeX{\hologo{LaTeX}} @@ -249,20 +271,25 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \par \begingroup \CJKfontspec{Microsoft~YaHei} - \int_gzero:N \g_tmpa_int - \int_set:Nn \l_tmpa_int { \clist_count:c { c__xeCJK_#2_chars_clist } } - \noindent\hfill + \tl_clear:N \l_tmpa_tl + \int_zero:N \l_tmpa_int + \int_set:Nn \l_tmpb_int { \clist_count:c { c__xeCJK_#2_chars_clist } } + \clist_map_inline:cn { c__xeCJK_#2_chars_clist } + { + \int_incr:N \l_tmpa_int + \tl_put_right:Nx \l_tmpa_tl + { + \use_none:n ##1 & \tex_char:D ##1 \scan_stop: + \int_compare:nNnF \l_tmpa_int = \l_tmpb_int + { + \int_compare:nNnTF { \int_mod:nn \l_tmpa_int {#1} } = \c_zero + { \exp_not:N \\ \scan_stop: } { & } + } + } + } + \noindent\hfill\linespread{1}\selectfont \begin{tabular}{|*{#1}{>{\footnotesize\ttfamily U+}c|c|}} - \clist_map_inline:cn { c__xeCJK_#2_chars_clist } - { - \int_gincr:N \g_tmpa_int - \use_none:n ##1 & \tex_char:D ##1 \scan_stop: - \int_compare:nNnF \g_tmpa_int = \l_tmpa_int - { - \int_compare:nNnTF { \int_mod:nn \g_tmpa_int {#1} } = \c_zero - { \\ } { & } - } - } + \tl_use:N \l_tmpa_tl \end{tabular}\hfill\null \endgroup \par @@ -270,6 +297,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \ExplSyntaxOff \geometry{includemp,hmargin={0mm,15mm},vmargin=15mm,footskip=7mm} \makeatletter +\preto\IndexParms{\linespread{1}} \appto\GlossaryParms{% \def\@idxitem{\par\hangindent 2em}% \def\subitem{\@idxitem\hspace*{1em}}% @@ -285,6 +313,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \def\orvar{\textup{\textbar}} \def\defaultvar#1{\textbf{\textup{#1}}} \@addtoreset{CodelineNo}{section} +\def\gobblelineno{% + \addtocounter{CodelineNo}{\m@ne}\let\theCodelineNo\relax} \def\tokslink#1{\hyperlink{#1}{\ding{51}}} \makeatother \def\indexname{代码索引} @@ -305,9 +335,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %</driver> % \fi % -% \CheckSum{4803} +% \CheckSum{5213} % \changes{v3.1.0}{2012/11/13}{放弃对 \cs{outer} 宏的特殊处理。} % \changes{v3.1.1}{2012/12/07}{不再依赖 \pkg{xpatch} 宏包。} +% \changes{v3.2.2}{2013/06/01}{修正某些重音不能正确显示的问题。} % \changes{v3.2.3}{2013/06/07}{提供四个 TECkit 映射文件用于句号转换和简繁互换。} % \changes{v3.2.4}{2013/07/02}{遵循 \hologo{LaTeX3} 变量需要预先声明的原则。} % @@ -417,7 +448,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 设置为 |false| 则不载入配置文件。可以把将要在下文介绍到的对 \pkg{xeCJK} 的一些 % 设置(例如设置常用 CJK 字体、修改字符范围和定义新的标点输出格式等)保存到文件 % \texttt{xeCJK-\meta{name}.cfg}。然后把这个文件放在本地的 |TDS| 目录下的适当 -% 位置。使用 \TeX Live 的用户,可以新建下列目录,然后再把 +% 位置。使用 \TeX~Live 的用户,可以新建下列目录,然后再把 % \texttt{xeCJK-\meta{name}.cfg} 放在里面: % \begin{verbatim} % texlive/texmf-local/tex/xelatex/xecjk @@ -885,7 +916,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % |fc-list| 命令列出的信息很多,而且在安装字体较多的 Windows 系统上的输出将非 % 常庞大,如其中可能包含: -% \begin{verbatim}[formatcom=\fontspec{CMU Typewriter Text}\xeCJKVerbAddon] +% \begin{verbatim} % Times New Roman:style=cursiva,kurzíva,kursiv,Πλάγια,Italic, % Kursivoitu,Italique,Dőlt,Corsivo,Cursief,kursywa,Itálico,Курсив, % İtalik,Poševno,nghiêng,Etzana @@ -1229,11 +1260,12 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 调整文字间距以便于让 CJK 字符占的宽度等于西文等宽字体中两个空格的宽度。如果这两 % 个空格的宽度小于当前 CJK 正常文字的宽度,将对 CJK 字体进行适当地缩小。这有利于 % 等宽字体的代码对齐等情形。需要注意的是,\cs{xeCJKVerbAddon} 对 \pkg{xeCJK} 的内 -% 部进行了比较大的修改,使用它之后,关于标点符号的禁则将会丢失。所以不能单独使用,^^A -% 应该放在分组里限制其作用域,否则是无效的。当然它可以和其它关于代码抄录的宏包配 -% 合使用。例如,可以使用于 \package{fancyvrb} 宏包的 |formatcom| 选项。此时设置的 -% 西文字体应该确实是等宽的以保证对齐。若西文等宽字体发生变动(包括字体大小),则 -% 需要在其后面使用 \cs{xeCJKVerbAddon},重新计算间距的宽度。\cs{xeCJKOffVerbAddon} +% 部进行了比较大的修改,使用它之后,将禁止在 CJK 字符类之间自动换行,这与西文在 +% 抄录环境中的情况是一致的。所以不应该单独使用,应该放在分组里限制其作用域,否则 +% 是无效的。当然它可以和其它关于代码抄录的宏包配合使用。例如,可以使用于 +% \package{fancyvrb} 宏包的 \texttt{formatcom} 选项。此时设置的西文字体应该确实 +% 是等宽的以保证对齐。若西文等宽字体发生变动(包括字体大小),则需要在其后面使用 +% \cs{xeCJKVerbAddon},重新计算间距的宽度。\cs{xeCJKOffVerbAddon} % 用于在使用 \cs{xeCJKVerbAddon} 的环境中局部取消它的作用。由于 \package{listings} % 宏包有自己的代码对齐机制,所以 \cs{xeCJKVerbAddon} 在由 \pkg{listings} 定义的 % 代码环境中无效。 @@ -1323,32 +1355,43 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xetex_if_engine:F { \msg_critical:nn { xeCJK } { Require-XeTeX } } % \end{macrocode} % +% \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_@@_package_ext_tl } + { \prg_return_true: } { \prg_return_false: } + } +\tl_const:Nx \c_@@_package_ext_tl { \@pkgextension } +% \end{macrocode} +% \end{macro} +% % 下面这些 \pkg{CJK} 系列宏包不应该被使用。 % \begin{macrocode} \msg_new:nnn { xeCJK } { incompatible-package } { The~`#1'~package~and~xeCJK~are~incompatible.\\\\ - Please ~ \str_if_eq:nnTF {#1} { CJKnumb } - { load~it~after~xeCJK. } { do~not~use~it. } + Please~do~not~use~it. } -\clist_map_inline:nn { CJKnumb , CJKulem , CJKvert , CJKpunct , CJKutf8 , CJK } +\msg_new:nnn { xeCJK } { after-package } { - \@ifpackageloaded {#1} + The~`#1'~package~and~xeCJK~are~incompatible.\\\\ + Please~load~it~after~xeCJK. + } +\clist_map_inline:nn { CJKfntef , CJKnumb } + { + \xeCJK_if_package_loaded:nT {#1} + { \msg_error:nnn { xeCJK } { after-package } {#1} } + } +\clist_map_inline:nn { CJKulem , CJKvert , CJKpunct , CJKutf8 , CJK } + { + \xeCJK_if_package_loaded:nTF {#1} { \msg_error:nnn { xeCJK } { incompatible-package } {#1} } - { } + { \tl_const:cn { ver@ #1 . \c_@@_package_ext_tl } { 9999/99/99 } } } % \end{macrocode} % -% 禁止在 \pkg{xeCJK} 宏包后再载入 \pkg{CJK} 宏包,并使得 -% \pkg{CJKnumb} 和 \pkg{CJKfntef} 宏包可以使用。 -% \begin{macrocode} -\tl_gset:cn { ver@CJK.sty } { 9999/99/99 } -\tl_gset_eq:cc { ver@CJKutf8.sty } { ver@CJK.sty } -\tl_gset_eq:cc { ver@CJKvert.sty } { ver@CJK.sty } -\tl_gset_eq:cc { ver@CJKulem.sty } { ver@CJK.sty } -\tl_gset_eq:cc { ver@CJKpunct.sty } { ver@CJK.sty } -% \end{macrocode} -% % 应该使用较新版本的 \pkg{expl3} 宏包。 % \begin{macrocode} \msg_new:nnn { xeCJK } { l3-too-old } @@ -1389,17 +1432,17 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % % \begin{macro}[internal] -% {\@@_msg_new:nn ,\@@_error:n,\@@_error:nx,\@@_warning:nx,\@@_info:nx,\@@_info:nxx} +% {\@@_msg_new:nn ,\@@_error:n,\@@_error:nx,\@@_warning:nx,\@@_info:nxx} % 各种信息函数的缩略形式。 % \begin{macrocode} -\cs_new_protected_nopar:Npn \@@_msg_new:nn { \msg_new:nnn { xeCJK } } -\cs_new_protected_nopar:Npn \@@_error:n { \msg_error:nn { xeCJK } } -\cs_new_protected_nopar:Npn \@@_error:nx { \msg_error:nnx { xeCJK } } -\cs_new_protected_nopar:Npn \@@_warning:n { \msg_warning:nn { xeCJK } } -\cs_new_protected_nopar:Npn \@@_warning:nx { \msg_warning:nnx { xeCJK } } -\cs_new_protected_nopar:Npn \@@_warning:nxx { \msg_warning:nnxx { xeCJK } } -\cs_new_protected_nopar:Npn \@@_info:nx { \msg_info:nnx { xeCJK } } -\cs_new_protected_nopar:Npn \@@_info:nxx { \msg_info:nnxx { xeCJK } } +\cs_new_protected_nopar:Npn \@@_msg_new:nn { \msg_new:nnn { xeCJK } } +\cs_new_protected_nopar:Npn \@@_error:n { \msg_error:nn { xeCJK } } +\cs_new_protected_nopar:Npn \@@_error:nx { \msg_error:nnx { xeCJK } } +\cs_new_protected_nopar:Npn \@@_warning:n { \msg_warning:nn { xeCJK } } +\cs_new_protected_nopar:Npn \@@_warning:nx { \msg_warning:nnx { xeCJK } } +\cs_new_protected_nopar:Npn \@@_warning:nxx { \msg_warning:nnxx { xeCJK } } +\cs_new_protected_nopar:Npn \@@_warning:nxxx { \msg_warning:nnxxx { xeCJK } } +\cs_new_protected_nopar:Npn \@@_info:nxx { \msg_info:nnxx { xeCJK } } % \end{macrocode} % \end{macro} % @@ -1410,18 +1453,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \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_@@_package_ext_tl } - { \prg_return_true: } { \prg_return_false: } - } -\tl_const:Nx \c_@@_package_ext_tl { \@pkgextension } -% \end{macrocode} -% \end{macro} -% % \begin{macro}[internal] % {\@@_at_end_preamble:n,\@@_after_preamble:n,\@@_after_end_preamble:n} % 在 \cs{document} 前后加上各种钩子。 @@ -2522,7 +2553,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % & % & % & -% & \tokslink{def-bound} +% & \tokslink{ns-bound} % & \tokslink{def-IVS}\\ % |Boundary| % & \tokslink{bound-def} @@ -2531,7 +2562,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % & \tokslink{bound-fl-fr} % & \tokslink{bound-def} % & -% & \tokslink{bound-def} +% & \tokslink{bound-ns} % & % & \tokslink{def-IVS}\\ % |IVS| @@ -2550,7 +2581,12 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \begin{macro}[internal]{\xeCJK_class_group_begin:,\xeCJK_class_group_end:} % \begin{macrocode} -\cs_new_eq:NN \xeCJK_class_group_begin: \c_group_begin_token +\cs_new_protected_nopar:Npn \xeCJK_class_group_begin: + { + \c_group_begin_token + \bool_set_true:N \l_@@_CJK_group_bool + } +\bool_new:N \l_@@_CJK_group_bool \cs_new_eq:NN \xeCJK_class_group_end: \c_group_end_token % \end{macrocode} % \end{macro} @@ -2591,11 +2627,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \hypertarget{bound-def}{} % \begin{macrocode} -\clist_map_inline:nn { Default , HalfLeft , NormalSpace } +\clist_map_inline:nn { Default , HalfLeft } { \xeCJK_inter_class_toks:nnn { Boundary } {#1} { \xeCJK_Boundary_and_Default: } - \str_if_eq:nnF {#1} { NormalSpace } - { \xeCJK_app_inter_class_toks:nnn { CJK } {#1} { \CJKecglue } } + \xeCJK_app_inter_class_toks:nnn { CJK } {#1} { \CJKecglue } } % \end{macrocode} % @@ -2636,7 +2671,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \hypertarget{def-bound}{} % \begin{macrocode} -\clist_map_inline:nn { Default , HalfRight , NormalSpace } +\clist_map_inline:nn { Default , HalfRight } { \xeCJK_inter_class_toks:nnn {#1} { Boundary } { @@ -2649,8 +2684,58 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { { \xeCJK_make_node:n { default } } } } } - \str_if_eq:nnF {#1} { NormalSpace } - { \xeCJK_pre_inter_class_toks:nnn {#1} { CJK } { \CJKecglue } } + \xeCJK_pre_inter_class_toks:nnn {#1} { CJK } { \CJKecglue } + } +% \end{macrocode} +% +% \changes{v3.2.5}{2013/07/10} +% {修正 \texttt{CJK} 和 \texttt{NormalSpace} 字符类之间因为边界造成的间距不正确的问题。} +% +% \hypertarget{bound-ns}{} +% \begin{macrocode} +\xeCJK_inter_class_toks:nnn { Boundary } { NormalSpace } + { \xeCJK_Boundary_and_NormalSp: } +% \end{macrocode} +% +% \begin{macro}[internal]{\xeCJK_Boundary_and_NormalSp:} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \xeCJK_Boundary_and_NormalSp: + { + \bool_if:nTF + { + \l_@@_xecglue_bool && + \int_compare_p:nNn \etex_lastnodetype:D = \c_eleven && + \skip_if_eq_p:nn \tex_lastskip:D \c_xeCJK_space_skip_tl + } + { + \tex_unskip:D + \bool_if:nTF + { + \xeCJK_if_last_node_p:n { CJK } || + \xeCJK_if_last_node_p:n { CJK-space } + } + { \xeCJK_remove_node: \CJKecglue } { ~ } + } + { + \xeCJK_if_last_node:nT { CJK-space } + { \xeCJK_remove_node: \xeCJK_space_or_xecglue: } + } + } +% \end{macrocode} +% \end{macro} +% +% \hypertarget{ns-bound}{} +% \begin{macrocode} +\xeCJK_inter_class_toks:nnn { NormalSpace } { Boundary } + { + \int_gset_eq:NN \g_@@_spacefactor_int \tex_spacefactor:D + \peek_meaning_remove:NTF \tex_italiccorrection:D + { \tex_italiccorrection:D { \xeCJK_make_node:n { normalspace } } } + { + \token_if_space:NTF \l_peek_token + { { \xeCJK_make_node:n { default-space } } } + { { \xeCJK_make_node:n { normalspace } } } + } } % \end{macrocode} % @@ -2755,6 +2840,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_def_node:nn { default } { 13 sp } \xeCJK_def_node:nn { default-space } { 14 sp } \xeCJK_def_node:nn { CJK-nobreak } { 15 sp } +\xeCJK_def_node:nn { normalspace } { 16 sp } % \end{macrocode} % \end{macro} % @@ -3073,6 +3159,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \changes{v3.2.0}{2013/05/22}{当全角左标点前面是 \texttt{hlist}、\texttt{none}、 % \texttt{glue} 和 \texttt{penalty} 等节点时,压缩其左空白。} % \changes{v3.2.4}{2013/07/03}{细化边界与全角左标点之间是否压缩空白的判断。} +% \changes{v3.2.5}{2013/07/13}{细化全角左标点是否位于段首的判断。} +% \changes{v3.2.5}{2013/07/13}{增加对 \pkg{enumitem} 宏包修改的 \cs{item} 的判断。} % \cs{etex_lastnodetype:D} 为 $1$ 表示 hlist node,在这里用来判断是否位于段首。基于 % 正常情况下,\TeX 会在段落开头插入宽度为 \cs{parindent} 的水平盒子用于缩进。 % $-1$ 表示 empty list,常出现在盒子的起始位置,在段落前使用 \cs{noindent} 就 @@ -3083,21 +3171,48 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 则有 \cs{hfil}。$13$ 表示 penalty node,这里判断的目的是全角左标点出现在 \LaTeX % 列表环境的 \cs{item} 后面时,能对齐到边界。判断基于 \cs{item} 的内部定义 % \cs{@item} 对 \cs{everypar} 进行了修改,在这里起到影响作用的是 -% |\box\@labels \penalty\z@|。以上判断都比较粗略,暂时也没有想起更好的办法。 +% |\box\@labels \penalty\z@|。\package{enumitem} 宏包修改了 \env{description} +% 环境中使用的 \cs{item}(\cs{enit@postlabel@i}),在这里起到影响作用的是 +% |\penalty\z@ \hskip\labelsep|。以上判断都比较粗略,暂时也没有想起更好的办法。 % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_Boundary_and_FullLeft_glue:N #1 { \int_case:nnn { \etex_lastnodetype:D } { - { \c_one } { \@@_zero_glue: \use_none:n } + { \c_one } + { + \box_set_to_last:N \l_@@_tmp_box + \bool_if:nTF + { + \int_compare_p:nNn \etex_lastnodetype:D = \c_minus_one && + \dim_compare_p:nNn { \box_wd:N \l_@@_tmp_box } = \tex_parindent:D + } + { \box_use_clear:N \l_@@_tmp_box \use_none:n } + { \box_use_clear:N \l_@@_tmp_box \use:n } + } { \c_minus_one } { \use_none:n } { \c_eleven } { - \bool_if:nF + \bool_if:nTF { ! ( \skip_if_finite_p:n { \tex_lastskip:D } ) || \skip_if_eq_p:nn { \tex_lastskip:D } { 1 sp } } + { \use_none:n } + { + \skip_if_eq:nnTF { \tex_lastskip:D } { \labelsep } + { + \tex_unskip:D + \bool_if:nTF + { + \int_compare_p:nNn \etex_lastnodetype:D = \c_thirteen && + \int_compare_p:nNn \tex_lastpenalty:D = \c_zero + } + { \skip_horizontal:n { \labelsep } \use_none:n } + { \skip_horizontal:n { \labelsep } \use:n } + } + { \use:n } + } } { \c_thirteen } { @@ -3793,16 +3908,25 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \cs{XeTeXglyphbouds} 可以得到一个字符的左右边距,用于标点压缩。如果它不可用,则 % 在文档中只能使用 |plain| 这一标点格式原样输出标点。 % \begin{macrocode} -\@@_msg_new:nn { XeTeX-too-old } - { - \token_to_str:N \XeTeXglyphbounds \ is~not~defined.\\ - CJK~punctuation~kerning~will~not~be~available.\\\\ - You~have~to~update~XeTeX~to~the~version~0.9995.0~or~later. - } \cs_if_exist:NF \XeTeXglyphbounds { + \@@_msg_new:nn { XeTeX-too-old } + { + \token_to_str:N \XeTeXglyphbounds \ is~not~defined.\\ + CJK~punctuation~kerning~will~not~be~available.\\\\ + You~have~to~update~XeTeX~to~the~version~0.9995.0~or~later. + } \@@_error:n { XeTeX-too-old } - \@@_after_end_preamble:n { \xeCJKsetup { PunctStyle = plain } } + \AtEndOfPackage + { + \keys_define:nn { xeCJK / options } + { + PunctStyle / unknown .code:n = + { \@@_error:nx { punct-style-unknown } { \l_keys_value_tl } } + } + \seq_gclear:N \g_@@_punct_style_seq + \xeCJKsetup { PunctStyle = plain } + } } % \end{macrocode} % @@ -3933,10 +4057,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \tl_use:c { \@@_punct_dim_csname:nn {#1} {#2} } } \cs_new_nopar:Npn \@@_use_punct_dim:nnn #1#2#3 { \tl_use:c { \@@_punct_dim_csname:nnn {#1} {#2} {#3} } } -\cs_new_protected_nopar:Npn \@@_gset_punct_dim:nnx #1#2#3 - { \tl_const:cx { \@@_punct_dim_csname:nn {#1} {#2} } {#3} } -\cs_new_protected_nopar:Npn \@@_gset_punct_dim:nnnx #1#2#3#4 - { \tl_const:cx { \@@_punct_dim_csname:nnn {#1} {#2} {#3} } {#4} } +\cs_new_protected_nopar:Npn \@@_save_punct_dim:nnn #1#2#3 + { \tl_const:cx { \@@_punct_dim_csname:nn {#1} {#2} } { \dim_eval:n {#3} } } +\cs_new_protected_nopar:Npn \@@_save_punct_dim:nnnn #1#2#3#4 + { \tl_const:cx { \@@_punct_dim_csname:nnn {#1} {#2} {#3} } { \dim_eval:n {#4} } } % \end{macrocode} % % \changes{v3.1.0}{2012/11/14}{使用 \pkg{xtemplate} 宏包的机制来组织标点符号的处理。} @@ -4053,7 +4177,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } } } - \@@_gset_punct_dim:nnnx { glue } {#1} {#2} + \@@_save_punct_dim:nnnn { glue } {#1} {#2} { \dim_max:nn { \l_@@_margin_minimum_dim } @@ -4148,24 +4272,21 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \cs_new_protected_nopar:Npn \xeCJK_punct_kerning_process:NN #1#2 { - \@@_gset_punct_dim:nnnx { kern } {#1} {#2} + \@@_save_punct_dim:nnnn { kern } {#1} {#2} { - \dim_eval:n + \bool_if:nTF { - \bool_if:nTF - { - \l_@@_enabled_global_setting_bool && - \tl_if_exist_p:c { g_@@_punct/kern/#1/#2/tl } - } - { \tl_use:c { g_@@_punct/kern/#1/#2/tl } } - { - \bool_if:NTF \l_@@_enabled_kerning_bool - { \@@_calc_kerning_margin:NN {#1} {#2} } - { \@@_original_kerning_margin:NN {#1} {#2} } - } - - ( \@@_use_punct_dim:nnn { bound } \c_@@_right_tl {#1} ) - - ( \@@_use_punct_dim:nnn { bound } \c_@@_left_tl {#2} ) + \l_@@_enabled_global_setting_bool && + \tl_if_exist_p:c { g_@@_punct/kern/#1/#2/tl } } + { \tl_use:c { g_@@_punct/kern/#1/#2/tl } } + { + \bool_if:NTF \l_@@_enabled_kerning_bool + { \@@_calc_kerning_margin:NN {#1} {#2} } + { \@@_original_kerning_margin:NN {#1} {#2} } + } + - ( \@@_use_punct_dim:nnn { bound } \c_@@_right_tl {#1} ) + - ( \@@_use_punct_dim:nnn { bound } \c_@@_left_tl {#2} ) } } % \end{macrocode} @@ -4301,14 +4422,14 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c_@@_punct_style_plain_tl { - \@@_gset_punct_dim:nnnx { glue } {#1} {#2} { \c_zero_dim } - \@@_gset_punct_dim:nnnx { bound } \c_@@_left_tl {#2} { \c_zero_dim } - \@@_gset_punct_dim:nnnx { bound } \c_@@_right_tl {#2} { \c_zero_dim } + \@@_save_punct_dim:nnnn { glue } {#1} {#2} { \c_zero_dim } + \@@_save_punct_dim:nnnn { bound } \c_@@_left_tl {#2} { \c_zero_dim } + \@@_save_punct_dim:nnnn { bound } \c_@@_right_tl {#2} { \c_zero_dim } } { { \xeCJK_select_font: \xeCJK_calc_punct_dimen:f {#2} } \@@_punct_if_long:NTF {#2} - { \@@_gset_punct_dim:nnnx { glue } {#1} {#2} { \c_zero_dim } } + { \@@_save_punct_dim:nnnn { glue } {#1} {#2} { \c_zero_dim } } { \UseInstance { xeCJK / punctuation } { \l_xeCJK_punct_style_tl } {#1} {#2} { } @@ -4325,22 +4446,22 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \cs_new_protected_nopar:Npn \xeCJK_calc_punct_dimen:N #1 { - \@@_gset_punct_dim:nnnx { bound } \c_@@_left_tl {#1} + \@@_save_punct_dim:nnnn { bound } \c_@@_left_tl {#1} { \xeCJK_glyph_bounds:NN \c_one {#1} } - \@@_gset_punct_dim:nnnx { bound } \c_@@_right_tl {#1} + \@@_save_punct_dim:nnnn { bound } \c_@@_right_tl {#1} { \xeCJK_glyph_bounds:NN \c_three {#1} } \dim_set:Nn \l_@@_tmp_dim { ( \@@_use_punct_dim:nnn { bound } \c_@@_left_tl {#1} ) + ( \@@_use_punct_dim:nnn { bound } \c_@@_right_tl {#1} ) } - \@@_gset_punct_dim:nnx { width } {#1} - { \dim_use:N \etex_fontcharwd:D \tex_font:D \xeCJK_token_value_charcode:N #1 } - \@@_gset_punct_dim:nnx { dimen } {#1} - { \dim_eval:n { \@@_use_punct_dim:nn { width } {#1} - \l_@@_tmp_dim } } + \@@_save_punct_dim:nnn { width } {#1} + { \etex_fontcharwd:D \tex_font:D \xeCJK_token_value_charcode:N #1 } + \@@_save_punct_dim:nnn { dimen } {#1} + { \@@_use_punct_dim:nn { width } {#1} - \l_@@_tmp_dim } \@@_punct_if_long:NT {#1} { - \@@_gset_punct_dim:nnnx { kern } {#1} {#1} + \@@_save_punct_dim:nnnn { kern } {#1} {#1} { \bool_if:nTF { @@ -4348,7 +4469,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \str_if_eq_p:nn {#1} { ^^^^2026 } } { \c_zero_dim } - { - \dim_use:N \l_@@_tmp_dim } + { - \l_@@_tmp_dim } } } } @@ -4375,7 +4496,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \tl_if_exist:cF { \@@_punct_dim_csname:nnn { kern } {#1} {#2} } { \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c_@@_punct_style_plain_tl - { \@@_gset_punct_dim:nnnx { kern } {#1} {#2} { \c_zero_dim } } + { \@@_save_punct_dim:nnnn { kern } {#1} {#2} { \c_zero_dim } } { \UseInstance { xeCJK / punctuation } { \l_xeCJK_punct_style_tl } { } {#1} {#2} @@ -4423,8 +4544,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \IfInstanceExistTF { xeCJK / punctuation } {#1} { \@@_warning:nx { punct-style-already-defined } {#1} } - { \seq_gput_right:Nn \g_@@_punct_style_seq {#1} } - \DeclareInstance { xeCJK / punctuation } {#1} { basic } {#2} + { \seq_gput_right:Nx \g_@@_punct_style_seq {#1} } + \exp_args:Nnx \DeclareInstance { xeCJK / punctuation } {#1} { basic } {#2} } \seq_new:N \g_@@_punct_style_seq \@@_msg_new:nn { punct-style-already-defined } @@ -4442,7 +4563,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \NewDocumentCommand \xeCJKEditPunctStyle { > { \TrimSpaces } m m } { \IfInstanceExistTF { xeCJK / punctuation } {#1} - { \EditInstance { xeCJK / punctuation } {#1} {#2} } + { \exp_args:Nnx \EditInstance { xeCJK / punctuation } {#1} {#2} } { \@@_error:nx { punct-style-unknown } {#1} } } \@onlypreamble \xeCJKEditPunctStyle @@ -4553,11 +4674,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \str_if_eq_x:nnTF { \CJKfamilydefault } { \l_xeCJK_family_tl } { - \use:x - { - \msg_warning:nnnnn { xeCJK } { missing-glyph } - { \l_@@_fallback_family_tl } {#1} { \int_to_hexadecimal:n { `#1 } } - } + \@@_warning:nxxx { missing-glyph } + { \l_@@_fallback_family_tl } {#1} + { \int_to_hexadecimal:n { `#1 } } \@@_fallback_save_CJKsymbol:N {#1} } { @@ -5232,7 +5351,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \prop_gput:Nxx \g_@@_family_name_prop {#1} {#2} \cs_gset_protected_nopar:cpx { \@@_family_nfss_csname:n {#1} } { - \tl_set:Nx \exp_not:N \f@encoding { \c_@@_encoding_tl } + \exp_not:N \fontencoding { \c_@@_encoding_tl } \tl_set:Nx \exp_not:N \f@family {#2} \exp_not:N \selectfont } @@ -5689,48 +5808,51 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 不破坏标点禁则,增加值 \texttt{env+}。} % % \begin{macro}{Verb} +% \changes{v3.2.5}{2013/07/25}{微调定义。} % 如果设置为 \texttt{env},则只在 \LaTeX 的抄录环境里使用 \cs{xeCJKVerbAddon},^^A % 而不包括 \cs{verb}。对当前使用环境的判断基于在标准 \LaTeX 的坏境定义里使用 % \cs{begingroup} 和 \cs{endgroup} 来分组。 % \begin{macrocode} +\int_new:N \l_@@_verb_case_int \keys_define:nn { xeCJK / options } { - Verb .choice: , - Verb / true .code:n = { \int_set_eq:NN \l_@@_verb_case_int \c_zero } , - Verb / env .code:n = { \int_set_eq:NN \l_@@_verb_case_int \c_one } , - Verb / env+ .code:n = { \int_set_eq:NN \l_@@_verb_case_int \c_two } , - Verb / false .code:n = { \int_set_eq:NN \l_@@_verb_case_int \c_three } , - Verb .default:n = { env } + Verb .choices:nn = + { true , env , env+ , false } + { \int_set_eq:NN \l_@@_verb_case_int \l_keys_choice_int } , + Verb .default:n = { env } } -\int_new:N \l_@@_verb_case_int -\@@_after_preamble:n +\cs_new_protected_nopar:Npn \@@_verb_font_hook: { - \tl_put_right:Nn \verbatim@font - { - \if_case:w \l_@@_verb_case_int + \if_case:w \l_@@_verb_case_int + \or: + \cs_set_eq:NN \CJKglue \@@_zero_glue: + \cs_set_eq:NN \CJKecglue \@@_zero_glue: + \or: + \int_compare:nNnTF \etex_currentgrouptype:D = \c_fourteen + { \xeCJKVerbAddon } + { \cs_set_eq:NN \CJKglue \@@_zero_glue: \cs_set_eq:NN \CJKecglue \@@_zero_glue: - \or: - \int_compare:nNnTF \etex_currentgrouptype:D = \c_fourteen - { \xeCJKVerbAddon } - { - \cs_set_eq:NN \CJKglue \@@_zero_glue: - \cs_set_eq:NN \CJKecglue \@@_zero_glue: - } - \or: - \int_compare:nNnT \etex_currentgrouptype:D = \c_fourteen - { \xeCJKVerbAddon } - \fi: - } + } + \or: + \int_compare:nNnT \etex_currentgrouptype:D = \c_fourteen + { \xeCJKVerbAddon } + \fi: + } +\@@_after_preamble:n + { + \cs_set_protected_nopar:Npx \verbatim@font + { \exp_not:o { \verbatim@font } \@@_verb_font_hook: } } % \end{macrocode} % \end{macro} % -% \begin{macro}{\xeCJKVerbAddon,\xeCJKOffVerbAddon} +% \begin{macro}{\xeCJKOffVerbAddon,\xeCJKVerbAddon} % \changes{v3.1.0}{2012/11/19}{新增 \cs{xeCJKVerbAddon} 用于抄录环境中的间距调整。} % \changes{v3.2.3}{2013/06/04} % {新增 \cs{xeCJKOffVerbAddon} 用于局部取消 \cs{xeCJKOffVerbAddon} 的影响;并解决 % 跨页使用时影响到页眉页脚的问题。} +% \changes{v3.2.5}{2013/07/13}{禁止自动换行,与西文一致。} % \cs{xeCJKVerbAddon} 进行了比较大的调整,应该只在分组环境里使用。为了方便调整间距 % 以利于对齐,这里只把字符分成了两类,并且在 CJK 类与边界(空格)之间也插入 % \cs{CJKecglue}。当然,这样做之后,关于标点符号的禁则就没有了。 @@ -5769,7 +5891,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \@@_reset_char_class:n { HalfLeft } \@@_reset_char_class:n { HalfLeft } \@@_reset_char_class:n { NormalSpace } - \skip_set:Nn \tex_rightskip:D { \skip_use:N \tex_rightskip:D } \exp_not:c { bool_set_ \bool_if:NTF \l_@@_xecglue_bool { true } { false } :N } \l_@@_xecglue_bool @@ -5789,15 +5910,23 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \tex_the:D \tex_output:D } \xeCJKsetup { xCJKecglue = false } - \cs_set_protected_nopar:Npn \CJKglue - { \skip_horizontal:N \l_@@_verb_exspace_skip } - \cs_set_protected_nopar:Npn \CJKecglue - { \skip_horizontal:n { 0.5 \l_@@_verb_exspace_skip } } - \cs_set_eq:NN \xeCJK_check_for_glue: \CJKecglue - \cs_set_eq:NN \xeCJK_ignore_spaces:w \CJKecglue - \skip_set:Nn \tex_rightskip:D { \c_zero_dim plus 1 fil } } + \skip_if_eq:nnTF { \l_@@_verb_exspace_skip } { \c_zero_skip } + { + \xeCJK_cs_clear:N \CJKglue + \xeCJK_cs_clear:N \CJKecglue + } + { + \cs_set_eq:NN \CJKglue \@@_verb_ccglue: + \cs_set_eq:NN \CJKecglue \@@_verb_ecglue: + } + \cs_set_eq:NN \xeCJK_check_for_glue: \CJKecglue + \cs_set_eq:NN \xeCJK_ignore_spaces:w \CJKecglue } +\cs_new_protected_nopar:Npn \@@_verb_ccglue: + { \xeCJK_no_break: \skip_horizontal:N \l_@@_verb_exspace_skip } +\cs_new_protected_nopar:Npn \@@_verb_ecglue: + { \xeCJK_no_break: \skip_horizontal:n { 0.5 \l_@@_verb_exspace_skip } } \cs_new_protected_nopar:Npn \@@_reset_char_class:n #1 { \int_set:Nn \l_@@_tmp_int { \xeCJK_class_num:n {#1} } @@ -5873,8 +6002,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \fp_set:Nn \l_@@_scale_factor_fp { #1 / #2 } \@@_warning:nxx { scale-factor } - { \fp_eval:n { round - ( \l_@@_scale_factor_fp , 2 ) } } - { \fp_eval:n { round + ( #2 / #1 , 2 ) } } + { \fp_eval:n { round - ( \l_@@_scale_factor_fp , 4 ) } } + { \fp_eval:n { round + ( #2 / #1 , 4 ) } } \xeCJK_add_font_features:Nnx \c_true_bool { } { Scale = { \fp_use:N \l_@@_scale_factor_fp } } \prop_gput:NVV \g_@@_scale_family_prop @@ -5894,26 +6023,46 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % +% \begin{macro}[internal]{\xeCJK_visible_space:} +% \changes{v3.2.5}{2013/07/13}{可视空格考虑传统 \TeX 字体的情况。} +% 如果文档不使用 \texttt{EU1} 作为默认字体编码,那么默认的打字机字体族很可能是 +% 传统的 \TeX 字体,这时可视空格按照 \texttt{OT1} 编码传统一般就是字体中的 |\char32|。 +% 这里加入 \cs{scan_stop:} 的目的是强制发生状态转移。这样当空格出现在 CJK 文字 +% 后面时,使字体回到西文,保证在当前西文字体而不是在 CJK 字体中检查有没有 |U+2423|。 +% \begin{macrocode} +\cs_new_protected_nopar:Npn \xeCJK_visible_space: + { + \bool_if:NT \l_@@_CJK_group_bool { \scan_stop: } + \xeCJK_glyph_if_exist:NTF { ^^^^2423 } + { ^^^^2423 } + { + \int_compare:nNnTF { \XeTeXfonttype \tex_font:D } = \c_zero + { + \str_if_eq_x:nnTF { \f@family } { \ttdefault } + { \c_catcode_other_space_tl } + { \textvisiblespace } + } + { \xeCJK_visible_space_fallback: } + } + } +\AtEndOfPackage + { \cs_gset_eq:NN \fontspec_visible_space: \xeCJK_visible_space: } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[internal]{\xeCJK_visible_space_fallback:} -% \changes{v3.1.0}{2012/11/19}{调整 \pkg{fontspec} 的后备可视空格符号,以便于使用 -% 时对齐。} +% \changes{v3.1.0}{2012/11/19} +% {调整 \pkg{fontspec} 的后备可视空格符号,以便于使用时对齐。} % \pkg{fontspec} 使用 |lmtt| 字体中的可视空格符号(|U+2423|)作为当前字体中相应符号 % 的后备。但是 |lmtt| 的字体大小未必与当前字体匹配。因此,我们在这里做一些调整,以 -% 保证使用后备可视空格符号时,也能保证对齐。这里加入 \cs{scan_stop:} 的目的是强制 -% 发生状态转移。这样当空格出现在 CJK 文字后面时,使字体回到西文,以便让 -% \pkg{fontspec} 在当前西文字体而不是在 CJK 字体中检查有没有 |U+2423|。 +% 保证使用后备可视空格符号时,也能保证对齐。 % \begin{macrocode} \cs_new_protected_nopar:Npn \xeCJK_visible_space_fallback: { { \cs_if_exist_use:cF { xeCJK/space/\curr@fontshape/\f@size } { \xeCJK_set_visible_space_font: } - \textvisiblespace + ^^^^2423 } } -\AtEndOfPackage - { - \tl_put_left:Nn \fontspec_visible_space: { \scan_stop: } - \cs_gset_eq:NN \fontspec_visible_space_fallback: \xeCJK_visible_space_fallback: - } % \end{macrocode} % \end{macro} % @@ -5930,7 +6079,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } \cs_new_protected_nopar:Npn \@@_set_visible_space_size:n #1 { - \tl_set:Nx \f@encoding { \g_fontspec_encoding_tl } + \fontencoding { \g_fontspec_encoding_tl } \tl_set:Nx \f@family { lmtt } \selectfont \dim_compare:nNnF {#1} = { \tex_fontdimen:D \c_two \tex_font:D } @@ -6066,10 +6215,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \defaultCJKfontfeatures { Script = CJK } % \end{macrocode} % -% 执行宏包选项,并载入 \pkg{fontspec} 宏包。 +% 执行宏包选项,并载入 \pkg{fontspec} 宏包和 \pkg{xunicode-addon}。 % \begin{macrocode} \ProcessKeysOptions { xeCJK / options } \RequirePackage { fontspec } [ 2011/09/13 ] +\RequirePackage { xunicode-addon } % \end{macrocode} % % \begin{macro}[internal,var]{\c_@@_encoding_tl} @@ -6108,7 +6258,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \tl_if_exist:NF \CJKttdefault { \tl_gset:Nn \CJKttdefault { tt } } \tl_new:N \l_@@_family_default_init_tl \cs_new_eq:NN \@@_family_default_wrap:n \use:n -\tl_gset:Nx \l_@@_family_default_init_tl +\tl_set:Nx \l_@@_family_default_init_tl { \exp_not:N \@@_family_default_wrap:n { @@ -6192,71 +6342,87 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \subsection{兼容性修补} % -% \begin{macro}[internal]{\nobreakspace} -% \changes{v3.1.2}{2013/01/01} -% {修正非 \cs{UTFencname} 编码下面 \pkg{xunicode} 重定义的 \cs{nobreakspace} 会失效的问题。} -% 按照 \pkg{xunicode} 的设计,使用 \cs{DeclareUTFcharacter} 定义符号命令时,如果命令 -% 已经存在,那么它会检查它是否是“健壮”的。如果是,则什么也不做;否则使用 -% \cs{DeclareTextCommand} 来重定义它,实际意义与原来相同,原来的定义保存在名为 -% |?-\cs| 的宏中。这里的主要问题是 \pkg{xunicode} 的健壮性检查对像 \cs{nobreakspace} -% 这种原本由 \cs{DeclareRobustCommand} 定义的命令返回结果是“假”,因而重定义它。 -% 如果编码发生变化,使用 \cs{nobreakspace} 时,\textsf{NFSS} 就会报错。 -% 按照 \textsf{NFSS} 的机制,我们用 \cs{ProvideTextCommandDefault} 对未声明的编码给出 -% 默认定义即可避免报错。其实 \pkg{xunicode} 重定义 \cs{nobreakspace} 的方式并不恰当。因为 -% 在 \LaTeXe 中,\cs{nobreakspace} 原本并不是由 \cs{DeclareTextCommand} 或 -% \cs{DeclareTextSymbol} 来定义,这样按照 \pkg{xunicode} 的实现方式,\cs{nobreakspace} -% 永远都不会输出 |\char"00A0|。要想让 \cs{nobreakspace} 在 \cs{UTFencname} 编码下面输出 -% |\char"00A0|,除非在 \pkg{xunicode} 载入\textbf{前}用 \cs{DeclareTextCommandDefault} 重新定义它: +% \begin{macro}[internal]{\(} +% \changes{v3.2.5}{2013/07/25} +% {解决汉字后紧跟 \cs{(}\texttt{...}\cs{)} 形式的行内数学公式时,不能加入间距的问题。} +% \cs{(} 的在 \LaTeXe 中的定义是 % \begin{verbatim} -% \DeclareTextCommandDefault\nobreakspace{\leavevmode\nobreak\ } +% \def\({\relax\ifmmode\@badmath\else$\fi} % \end{verbatim} -% 这样我们也就不需要再做下面的处理。另外,如果作者使用名字 |?\cs| 来保存原来的定义 -% 的话,也不需要下面的处理。因为下面实际上是定义了一个名为 |?\nobreakspace| 的宏作为 -% 未声明编码的默认定义。但是作者使用了 |?-\cs|,不知道这是有意为之还是一个疏忽。 -% \begin{macrocode} -\cs_if_exist:cT { ? - \token_to_str:N \nobreakspace } +% 这个定义最开始的 \cs{relax} 是为了防止 \cs{(} 出现在表格单元格的开始位置时,模式 +% 判断不正确(因为 \TeX 会先看单元格中第一个不可展的非空格记号是否是 \cs{omit} 或 \cs{noalign})。^^A +% 但是它会造成一个边界,使 \pkg{xeCJK} 不能看到 \cs{relax} 后面出现的 |$|,从而不能 +% 加入间距\footnote{\url{http://tex.stackexchange.com/q/124773}}。使用 \hologo{eTeX} +% 的 \cs{protected} 来定义它,可以不需要 \cs{relax},或者将 \cs{relax} 改成 +% \cs{scan_align_safe_stop:},都可以避免这些情况。同时 \pkg{fixltx2e}中还使用了 +% |\MakeRobust\(|,我们需要小心处理。 +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_math_robust:N #1 + { \exp_args:NNc \@@_math_robust:NN #1 { \cs_to_str:N #1 ~ } } +\cs_new_protected_nopar:Npn \@@_math_robust:NN #1#2 { - \exp_args:NNv \ProvideTextCommandDefault \nobreakspace - { ? - \token_to_str:N \nobreakspace } + \bool_if:nT + { + \str_if_eq_x_p:nn + { \token_get_replacement_spec:N #1 } + { \exp_not:n { \x@protect #1 \protect #2 } } && + \exp_args:Nf \tl_if_empty_p:n { \token_get_arg_spec:N #2 } && + \exp_args:No \tl_if_head_eq_meaning_p:nN {#2} \scan_stop: + } + { \cs_gset_protected_nopar:Npx #1 { \scan_align_safe_stop: \tl_tail:N #2 } } } +\@@_math_robust:N \( +\@@_math_robust:N \) % \end{macrocode} % \end{macro} % -% \begin{macro}[internal]{\xeCJK@text@composite} -% \changes{v3.2.2}{2013/06/01}{修正某些重音不能正确显示的问题。} -% 这里修改的目的是让 |\'{\^e}| 等直接展开成在 \pkg{xunicode} 中由下面定义的 -% |\char"1EBF\relax|,也就是让这些定义生效: +% \begin{macro}[internal]{\[} +% \changes{v3.2.5}{2013/07/25}{解决 \pkg{fixltx2e} 和 \pkg{amsthm} 的冲突。} +% 当 \pkg{amsmath} 没有在 \pkg{amsthm} 之前被调用时,\pkg{amsthm} 会展开 \cs{[}, +% 并用 |$| 作为参数定界记号,相关代码为 % \begin{verbatim} -% \DeclareUTFcomposite[\UTFencname]{x1EBF}{\'}{\^e} +% \def\@tempa#1$#2#3\@nil{% +% \def\[{#1$#2\def\@currenvir{displaymath}#3}% +% }% +% \expandafter\@tempa\[\@nil % \end{verbatim} -% 按照 \pkg{source2e} 中 \cs{@text@composite} 的定义,目前 \pkg{xunicode} 对这种三个 -% 记号组合的定义不会起作用。|\'{\^e}| 将会被展开成 |\char"00EA\relax\char"0301\relax| -% 这种组合字符。由于中间的 \cs{relax} 会造成状态转移,按照 \pkg{xeCJK} 的机制,就会 -% 插入 \texttt{kern},最终破坏了 \XeTeX 将两个字符正确的组合起来。除此之外,还可以 -% 将 \pkg{xunicode} 中所有 \cs{char} 数字后面的 \cs{relax} 全部改成普通空格,这样就 -% 不会留下多余的 \cs{relax}。或者使用 \texttt{lowercase} 技巧,直接由 \texttt{Unicode} -% 得到实际字符,而不需要通过 \cs{char}。但是,如果在 \pkg{xeCJK} 中修改的话,还要 -% \cs{ReloadXunicode} 才会起作用。需要注意的是,如果原来字体中缺少 \'{\^e} 这个字符, -% 但是有 \^e 这个字符的话,|\'{\^e}| 会输出为 \^e,现在则是留下一个空白。 +% 而 \pkg{fixltx2e} 中使用了 |\MakeRobust\[|,使得将 \cs{[} 展开一次的内容中并 +% 不直接含有 |$|,从而造成了 \texttt{Runaway argument?} 的错误。可以在 \pkg{amsthm} +% 之前引入 \pkg{amsmath},避免出现这个错误。我们下面用 \hologo{eTeX} 的 \cs{protected} +% 来定义它。当然,如果之后只使用 \pkg{amsthm},那么 \cs{[} 会被修改,将不再是^^A +% “健壮”的了。这也是上面 \cs{@@_math_robust:NN} 中还使用 \cs{scan_align_safe_stop:} 的原因。 % \begin{macrocode} -\cs_new_nopar:Npn \xeCJK@text@composite #1#2#3 \@text@composite +\bool_if:nF { - \str_if_eq:nnTF {#3} { \@empty } - { \orig@text@composite #1#2#3 \@text@composite } - { \@@_text_composite:Nnw #1#2#3 } + \xeCJK_if_package_loaded_p:n { amsmath } || + \xeCJK_if_package_loaded_p:n { amsthm } } -\cs_new_nopar:Npn \@@_text_composite:Nnw #1#2 \@empty { - \tl_if_empty:nTF {#2} - { \orig@text@composite #1 \@empty \@text@composite } - { \cs_if_exist_use:cF { \token_to_str:N #1 - \token_to_str:N #2 } } + \@@_math_robust:N \[ + \@@_math_robust:N \] } -\cs_new_eq:NN \orig@text@composite \@text@composite -\cs_set_eq:NN \@text@composite \xeCJK@text@composite % \end{macrocode} % \end{macro} % +% \begin{macro}[internal]{\nobreakspace} +% \changes{v3.1.2}{2013/01/01} +% {修正非 \cs{UTFencname} 编码下面 \pkg{xunicode} 重定义的 \cs{nobreakspace} 会失效的问题。} +% \changes{v3.2.5}{2013/07/18}{恢复 \cs{nobreakspace} 的原始定义。} +% 空格在 \TeX 中是特殊的记号,似乎不应该把它定义为字体中的符号(\texttt{U+00A0})。 +% \begin{macrocode} +\UndeclareTextCommand \nobreakspace { \UTFencname } +\RenewDocumentCommand \nobreakspace { } { \leavevmode \nobreak \ } +% \end{macrocode} +% \end{macro} +% +% 当符号命令紧跟在 CJK 字符类后面时,强制发生状态转移,使字体回到西文状态。 +% \begin{macrocode} +\AtBeginUTFCommand { \bool_if:NT \l_@@_CJK_group_bool { \scan_stop: } } +% \end{macrocode} +% % \changes{v3.1.1}{2012/12/13}{对于与 \pkg{xltxtra} 的冲突给出错误警告。} +% 比较老版本的 \pkg{realscripts} 定义了 \cs{dim_max:nn} 和 \cs{dim_min:nn},这与 +% 新版本的 \pkg{expl3} 冲突。 % \begin{macrocode} \@@_msg_new:nn { conflict-package } { @@ -6319,7 +6485,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macro} % % \newbox\xeCJKtmpbox -% \setbox\xeCJKtmpbox\vbox\bgroup +% \setbox\xeCJKtmpbox\vbox\bgroup\gobblelineno % \begin{macrocode} %<@@=> % \end{macrocode}\egroup @@ -6388,7 +6554,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \setbox\xeCJKtmpbox\vbox\bgroup +% \setbox\xeCJKtmpbox\vbox\bgroup\gobblelineno % \begin{macrocode} %<@@=xeCJK> % \end{macrocode}\egroup @@ -6457,7 +6623,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \textquoteleft \textquoteright \textquotedblleft \textquotedblright } { - \cs_gset_nopar:Npx #1 + \cs_gset_protected_nopar:Npx #1 { \@@_group_begin: \makexeCJKinactive \exp_not:o {#1} \@@_group_end: } } \tl_put_left:Nn \tipaencoding { \makexeCJKinactive } @@ -6679,7 +6845,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \setbox\xeCJKtmpbox\vbox\bgroup +% \setbox\xeCJKtmpbox\vbox\bgroup\gobblelineno % \begin{macrocode} %<@@=> % \end{macrocode}\egroup @@ -6696,7 +6862,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \setbox\xeCJKtmpbox\vbox\bgroup +% \setbox\xeCJKtmpbox\vbox\bgroup\gobblelineno % \begin{macrocode} %<@@=xeCJK> % \end{macrocode}\egroup @@ -6724,6 +6890,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_FullRight_and_CJK: \@@_ulem_FullRight_and_CJK: \xeCJK_CJK_and_CJK:N \@@_ulem_CJK_and_CJK:N \xeCJK_Boundary_and_Default: \@@_ulem_Boundary_and_Default: + \xeCJK_Boundary_and_NormalSp: \@@_ulem_Boundary_and_NormalSp: \xeCJK@fix@penalty \@@_ulem_fix_penalty: \@@_punct_hskip:n \@@_ulem_punct_hskip:n \@@_CJK_and_Boundary_aux: \@@_ulem_CJK_and_Boundary_aux: @@ -6793,6 +6960,18 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % +% +% \begin{macro}[internal]{\@@_ulem_Boundary_and_NormalSp:} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_ulem_Boundary_and_NormalSp: + { + \xeCJK_if_ulem_patch:TF + { \xeCJK_if_last_node:nT { CJK-space } { \xeCJK_remove_node: \c_space_tl } } + { \@@_ulem_Boundary_and_NormalSp: } + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[internal]{\@@_ulem_CJK_and_Boundary_aux:} % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_ulem_CJK_and_Boundary_aux: @@ -7619,6 +7798,452 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %</listings> % \end{macrocode} % +% \setbox\xeCJKtmpbox\vbox\bgroup\gobblelineno +% \begin{macrocode} +%<@@=xunadd> +% \end{macrocode}\egroup +% +% \subsection{\pkg{xunicode-addon}} +% +% \changes{v3.2.5}{2012/07/18} +% {增加小宏包 \pkg{xunicode-addon},为 \pkg{xunicode} 提供判断字符是否存在的功能。} +% +% \begin{macrocode} +%<*xunicode> +% \end{macrocode} +% +% \pkg{xunicode} 对编码相关的符号命令的定义中用的是诸如 |\char"0022\relax| 的形式。 +% 例如 \cs{textbar} 被展开为 |\char"007C\relax|。并且诸如下述的定义是无效的: +% \begin{verbatim} +% \DeclareUTFcomposite[\UTFencname]{x1EBF}{\'}{\^e} +% \end{verbatim} +% 我们在这里做的修改是把符号命令定义为实际的字符并且使上述定义生效。另外在使用 +% 这些符号命令的时候,先判断当前字体中是否存在对应的字符,如果不存在,则使用这 +% 些符号命令的默认设置。 +% +% \begin{macrocode} +\pdftex_if_engine:T + { + \msg_new:nnnn { xunicode-addon } { cannot-use-pdftex } + { This~package~requires~either~XeTeX~or~LuaTeX~to~function.} + { + You~must~change~your~typesetting~engine~to,~e.g.,\\ + "xelatex"~or~"lualatex"~instead~of~plain~"latex"~or~"pdflatex". + } + \msg_critical:nn { xunicode-addon } { cannot-use-pdftex } + } +\RequirePackage { xparse } +% \end{macrocode} +% +% 宏包选项是编码的名字。 +% +% \begin{macrocode} +\clist_new:N \g_@@_encname_clist +\DeclareOption* + { \clist_gput_left:NV \g_@@_encname_clist \CurrentOption } +\ProcessOptions \scan_stop: +\tl_if_exist:NT \UTFencname + { \clist_gput_left:Nx \g_@@_encname_clist { \UTFencname } } +% \end{macrocode} +% +% 若 \pkg{xunicode} 已经被调用,则在宏包结束的时候,重新设置 \cs{UTFencname} +% 对应的编码命令。否则设置 \cs{UTFencname},如果使用的是 \hologo{LuaLaTeX},则 +% 需要作一些设置,使得 \pkg{xunicode} 可用。 +% +% \begin{macrocode} +\@ifpackageloaded { xunicode } { } + { + \clist_get:NNF \g_@@_encname_clist \UTFencname + { + \xetex_if_engine:TF + { \tl_set:Nn \UTFencname { EU1 } } + { \tl_set:Nn \UTFencname { EU2 } } + \clist_set_eq:NN \g_@@_encname_clist \UTFencname + } + \xetex_if_engine:TF + { \RequirePackage { xunicode } } + { + \cs_set_eq:NN \@@_tmp:w \XeTeXpicfile + \cs_set_eq:NN \XeTeXpicfile \prg_do_nothing: + \RequirePackage { xunicode } + \cs_set_eq:NN \XeTeXpicfile \@@_tmp:w + } + } +\AtEndOfPackage { \ReloadXunicode { \g_@@_encname_clist } } +% \end{macrocode} +% +% \begin{macro}[internal]{\ReloadXunicode} +% 参数可以是多个编码,设置这些编码对应的命令。如果编码没有预先声明,则给出 +% 一个错误警告。 +% \begin{macrocode} +\RenewDocumentCommand \ReloadXunicode { m } + { + \clist_set:Nx \l_@@_encname_clist {#1} + \clist_remove_duplicates:N \l_@@_encname_clist + \use:x + { + \bool_if:NT \l__kernel_expl_bool { \ExplSyntaxOff } + \char_set_catcode_letter:n { 64 } + \@@_reload:N \exp_not:N \l_@@_encname_clist + \char_set_catcode:nn { 64 } { \char_value_catcode:n { 64 } } + \bool_if:NT \l__kernel_expl_bool { \ExplSyntaxOn } + } + } +\cs_new_protected:Npn \@@_reload:N #1 + { + \cs_set_eq:NN \@@_tmp:w \iftipaonetoken + \cs_set_eq:NN \iftipaonetoken \scan_stop: + \clist_map_inline:Nn #1 + { + \cs_if_exist:cTF { T@ ##1 } + { + \tl_set:Nx \UTFencname {##1} + \clist_gput_right:Nx \g_@@_encname_clist {##1} + \file_input:n { xunicode.sty } + } + { \msg_error:nnn { xunicode-addon } { encoding-unknown } {##1} } + } + \cs_set_eq:NN \iftipaonetoken \@@_tmp:w + \clist_gremove_duplicates:N \g_@@_encname_clist + } +\clist_new:N \l_@@_encname_clist +\msg_new:nnnn { xunicode-addon } { encoding-unknown } + {Encoding~scheme~"#1"~unknown.} + { + You~may~use \\\\ + \token_to_str:N \usepackage [ #1 , \encodingdefault ] {fontenc} \\\\ + before~xunicode-addon~or~xunicode. + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal,pTF]{\@@_glyph_if_exist:n} +% 判断字符在当前字体中是否存在。 +% \begin{macrocode} +\prg_new_conditional:Npnn \@@_glyph_if_exist:n #1 { p , T , F , TF } + { + \etex_iffontchar:D \tex_font:D \etex_numexpr:D #1 \scan_stop: + \prg_return_true: \else: \prg_return_false: \fi: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\UndeclareUTFcharacter} +% 取消编码 |#1| 下的符号命令 |#3|。 +% \begin{macrocode} +\RenewDocumentCommand \UndeclareUTFcharacter { O { \UTFencname } m m } + { + \@@_if_csname:nTF {#3} + { \UndeclareTextCommand {#3} } + { \exp_args:Nc \UndeclareTextCommand { \tl_to_str:n {#3} } } + {#1} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\UndeclareUTFcomposite} +% 取消编码 |#1| 下的复合符号命令 |#3{#4}|。 +% \begin{macrocode} +\RenewDocumentCommand \UndeclareUTFcomposite { O { \UTFencname } m m m } + { + \@@_if_csname:nTF {#3} + { \@@_undeclare_composite:Nnnn #3 } + { \exp_args:Nc \@@_undeclare_composite:Nnnn { \tl_to_str:n {#3} } } + {#1} {#4} {#2} + } +\cs_new_protected:Npn \@@_undeclare_composite:Nnnn #1#2#3#4 + { \cs_undefine:c { \token_to_str:c {#2} \token_to_str:N #1 - \tl_to_str:n {#3} } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_if_csname:nTF} +% 判断 |#1| 是否可以作为控制序列的名字。这是因为 \pkg{xunicide} 使用了下面的定义。 +% \begin{verbatim} +% \DeclareUTFcharacter[\UTFencname]{x0149}{'n} +% \end{verbatim} +% \begin{macrocode} +\prg_new_conditional:Npnn \@@_if_csname:n #1 { TF } + { + \tl_if_single_token:nTF {#1} + { + \if_predicate:w + \bool_if_p:n { \token_if_cs_p:N #1 || \token_if_active_p:N #1 } + \prg_return_true: \else: \prg_return_false: \fi: + } + { \prg_return_false: } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\DeclareUTFcharacter} +% 定义编码 |#1| 下的符号命令 |#3|,其对应符号的 Unicode 是 |#2|。 +% \begin{macrocode} +\RenewDocumentCommand \DeclareUTFcharacter { O { \UTFencname } m m } + { + \@@_if_csname:nTF {#3} + { \@@_declare_character:Nnn #3 } + { \exp_args:Nc \@@_declare_character:Nnn { \tl_to_str:n {#3} } } + {#1} {#2} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_declare_character:Nnn} +% 通过 \texttt{lowercase} 技巧,直接由 Unicode |#3| 得到编码 |#2| 下的符号命令 +% |#1| 对应的实际字符。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_character:Nnn #1#2#3 + { + \@@_provide_text_command_default:N #1 + \group_begin: + \char_set_lccode:nn { `0 } { \@@_check_slot:n {#3} } + \tl_to_lowercase:n + { + \group_end: + \@@_declare_character:NNxn 0 + } + #1 { \token_to_str:N #1 } {#2} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_provide_text_command_default:N} +% 如果控制序列 |#1| 已经存在,但不是符号命令,\pkg{xunicode} 会将它定义为 +% \cs{UTFencname} 编码下的符号命令。但是编码被转换之后,再使用这些控制序列, +% \pkg{NFSS} 就会报错。为此需要给出这些符号命令的默认定义,与原来的意义相同。 +% 这些命令包括 +% \begin{verbatim} +% \nobreakspace macro:->\protect \nobreakspace +% \copyright macro:->\protect \copyright +% \AA macro:->\r A +% \aa macro:->\r a +% \textrhookopeno \long macro:->\textrethookbelow {\textopeno } +% \hbar macro:->{\mathchar '26\mkern -9muh} +% \textaolig macro:->{a\kern -.25em o} +% \end{verbatim} +% 影响比较大的是 \cs{nobreakspace}、\cs{copyright} 和 \cs{hbar}。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_provide_text_command_default:N #1 + { + \bool_if:nF + { + \cs_if_exist_p:c { ? \token_to_str:N #1 } || + \cs_if_free_p:c { ? - \token_to_str:N #1 } + } + { \exp_args:NNv \ProvideTextCommandDefault #1 { ? - \token_to_str:N #1 } } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_declare_character:NNnn} +% 使用编码 |#4| 下的符号命令 |#2| 的时候先判断它对应的实际字符 |#1| 在当前字体中 +% 是否存在。如果不存在则转换到 \cs{DeclareTextSymbolDefault} 中设置的编码或者使用 +% \cs{Declare\-Text\-Command\-Default} 中设置的命令。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_character:NNnn #1#2#3#4 + { \DeclareTextCommand #2 {#4} { \@@_text_character:nN {#3} {#1} } } +\cs_new_protected:Npn \@@_text_character:nN #1#2 + { + \tl_use:N \l_@@_begin_hook_tl + \@@_glyph_if_exist:nTF { `#2 } + {#2} { \cs_if_exist_use:cF { ? #1 } {#2} } + \tl_use:N \l_@@_end_hook_tl + } +\cs_generate_variant:Nn \@@_declare_character:NNnn { NNx } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_check_slot:n} +% \pkg{xunicode} 中使用的 Unicode 格式是诸如 |x0022| 的形式,这就需要一些转换。 +% \begin{macrocode} +\cs_new_nopar:Npn \@@_check_slot:n #1 + { + \int_eval:n + { + \tl_if_head_eq_charcode:nNTF {#1} x + { " \use_none:n #1 } {#1} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\DeclareUTFcomposite} +% 设置编码 |#1| 下的符号命令 |#3| 与它的参数 |#4| 的复合对应的符号的 Unicode 是 |#2|。 +% \begin{macrocode} +\RenewDocumentCommand \DeclareUTFcomposite { O { \UTFencname } m m m } + { + \@@_if_csname:nTF {#3} + { \@@_declare_composite:Nnnn #3 } + { \exp_args:Nc \@@_declare_composite:Nnnn { \tl_to_str:n {#3} } } + {#1} {#4} {#2} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_declare_composite:Nnnn} +% 这里使用 \cs{tex_afterassignment:D} 是因为 \pkg{xunicode} 有如下的定义。 +% \begin{verbatim} +% \DeclareUTFcomposite[\UTFencname]{x02E8\char"02E5}{\tonebar}{25} +% \DeclareUTFcomposite[\UTFencname]{x02E5\char"02E8}{\tonebar}{52} +% \end{verbatim} +% 但是这个定义原本就是无效的,|\tonebar{25}| 和 |\tonebar{2}| 的定义一样。 +% 对复合符号命令的定义用的是 \cs{chardef},这有利于下面字符是否存在的判断。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_composite:Nnnn #1#2#3#4 + { + \tex_afterassignment:D \use_none_delimit_by_q_stop:w + \@@_chardef:cn + { \token_to_str:c {#2} \token_to_str:N #1 - \tl_to_str:n {#3} } + { \@@_check_slot:n {#4} } + \q_stop + } +\cs_new_protected:Npn \@@_chardef:Nn #1#2 + { \tex_chardef:D #1 = \etex_numexpr:D #2 \scan_stop: } +\cs_generate_variant:Nn \@@_chardef:Nn { c } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\DeclareEncodedCompositeCharacter} +% |#1| 是编码,|#2| 是重音命令,|#3| 是组合重音符号的 Unicode,|#4| 是基本重音符号 +% 的 Unicode。当 |#2| 的参数为空时,输出 |#4|,否则是 |#2| 与 |#3| 的组合。 +% \begin{macrocode} +\RenewDocumentCommand \DeclareEncodedCompositeCharacter { m m m m } + { + \@@_if_csname:nTF {#2} + { \@@_declare_accent:Nnnn #2 } + { \exp_args:Nc \@@_declare_accent:Nnnn { \tl_to_str:n {#2} } } + {#1} {#3} {#4} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\DeclareEncodedCompositeAccents} +% |#1| 是编码,|#2| 是重音命令,|#3| 和 |#4| 都是组合重音的 Unicode。当 |#2| 的 +% 参数为空时,输出 |#3|,否则是 |#2| 与 |#4| 的组合。 +% \begin{macrocode} +\RenewDocumentCommand \DeclareEncodedCompositeAccents { m m m m } + { + \@@_if_csname:nTF {#2} + { \@@_declare_accent:Nnnn #2 } + { \exp_args:Nc \@@_declare_accent:Nnnn { \tl_to_str:n {#2} } } + {#1} {#4} {#3} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_declare_accent:Nnnn} +% 通过 \texttt{lowercase} 技巧,直接由重音符号的 Unicode 得到实际字符。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_accent:Nnnn #1#2#3#4 + { + \group_begin: + \char_set_lccode:nn { `3 } { "#3 } + \char_set_lccode:nn { `4 } { \tl_if_blank:nTF {#4} { "#3 } { "#4 } } + \tl_to_lowercase:n + { + \group_end: + \@@_declare_accent:NNNxxn 3 4 + } + #1 { \token_to_str:c {#2} } { \token_to_str:N #1 } {#2} + } +\cs_new_protected:Npn \@@_declare_accent:NNNnnn #1#2#3#4#5#6 + { + \DeclareTextCommand #3 {#6} + { \@@_text_composite:nnNNn {#4} {#5} {#1} {#2} } + } +\cs_generate_variant:Nn \@@_declare_accent:NNNnnn { NNNxx } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_text_composite:nnNNn} +% 若重音命令 |#2| 与它的参数 |#5| 的复合已经由 \cs{DeclareUTFcomposite} 设置, +% 并且在当前字体中存在该字符,则直接使用。否则使用组合命令。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_text_composite:nnNNn #1#2#3#4#5 + { + \tl_use:N \l_@@_begin_hook_tl + \cs_if_exist:cTF { #1#2 - \tl_to_str:n {#5} } + { + \token_if_chardef:cTF { #1#2 - \tl_to_str:n {#5} } + { + \@@_glyph_if_exist:nTF { \use:c { #1#2 - \tl_to_str:n {#5} } } + { \use:c { #1#2 - \tl_to_str:n {#5} } } + { \@@_add_accent:nnNN {#5} {#2} #3#4 } + } + { \use:c { #1#2 - \tl_to_str:n {#5} } } + } + { \@@_add_accent:nnNN {#5} {#2} #3#4 } + \tl_use:N \l_@@_end_hook_tl + } +\cs_generate_variant:Nn \token_if_chardef:NTF { c } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_add_accent:nnNN} +% 若组合重音符号的 |#3| 和基本重音符号 |#4| 在当前字体中都不存在,则转换到 +% \cs{Declare\-Text\-Accent\-Default} 设置的编码或者使用 +% \cs{DeclareTextCommandDefault} 中设置的命令。\texttt{0.9999} 版以前的 \XeTeX +% 需要设置 \cs{XeTeXinputnormalization} 为 $1$,才能使用字体中由基础字符和组合符号 +% 对应的实际字符;而 \texttt{0.9999} 版以后的 \XeTeX 默认就启用这个功能,^^A +% \cs{XeTeXinputnormalization} 似乎是无效的,怀疑是使用 HarfBuzz 库替代 ICU 进行 +% 字体排版的缘故\footnote{\url{http://tug.org/pipermail/xetex/2013-July/024579.html}}。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_add_accent:nnNN #1#2#3#4 + { + \tl_if_blank:nTF {#1} + { + \@@_glyph_if_exist:nTF { `#4 } + {#4} + { + \cs_if_exist_use:cTF { ? #2 } + { {#1} } {#4} + } + } + { + \@@_glyph_if_exist:nTF { `#3 } + { #1#3 } + { + \@@_glyph_if_exist:nTF { `#4 } + { \add@accent { `#4 } {#1} } + { + \cs_if_exist_use:cTF { ? #2 } + { {#1} } {#1} + } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\AtBeginUTFCommand,\AtEndUTFCommand} +% 在符号命令前后使用的钩子。 +% \begin{macrocode} +\NewDocumentCommand \AtBeginUTFCommand { s +m } + { + \IfBooleanTF {#1} + { \tl_set:Nn \l_@@_begin_hook_tl {#2} } + { \tl_put_right:Nn \l_@@_begin_hook_tl {#2} } + } +\NewDocumentCommand \AtEndUTFCommand { s +m } + { + \IfBooleanTF {#1} + { \tl_set:Nn \l_@@_end_hook_tl {#2} } + { \tl_put_right:Nn \l_@@_end_hook_tl {#2} } + } +\tl_new:N \l_@@_begin_hook_tl +\tl_new:N \l_@@_end_hook_tl +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</xunicode> +% \end{macrocode} +% +% \setbox\xeCJKtmpbox\vbox\bgroup\gobblelineno +% \begin{macrocode} +%<@@=xeCJK> +% \end{macrocode}\egroup +% % \subsection{\pkg{xeCJK.cfg}} % % \begin{macrocode} diff --git a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins index 07bc870be41..4285ca1f382 100644 --- a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins +++ b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins @@ -6,7 +6,7 @@ %% %% xeCJK.dtx (with options: `install') %% -%% $Id: xeCJK.dtx 465 2013-07-06 10:30:24Z sobenlee $ +%% $Id: xeCJK.dtx 477 2013-07-25 22:15:20Z sobenlee $ %% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% ----------------------------------------------------------------- %% Author: @@ -37,7 +37,7 @@ \askforoverwritefalse \preamble -$Id: xeCJK.dtx 465 2013-07-06 10:30:24Z sobenlee $ +$Id: xeCJK.dtx 477 2013-07-25 22:15:20Z sobenlee $ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ ----------------------------------------------------------------- Author: @@ -65,13 +65,18 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \endpreamble \postamble - This package consists of the file xeCJK.dtx + This package consists of the file xeCJK.dtx, + full-stop.map, + fullwidth-stop.map, + han-simp.map, + han-trad.map, and the derived files xeCJK.pdf, xeCJK.sty, xeCJK.cfg, xeCJK.ins, xeCJKfntef.sty, xeCJK-listings.sty, + xunicode-addon.sty, xeCJK-example-autofake.tex, xeCJK-example-fallback.tex, xeCJK-example-subCJKblock.tex, @@ -81,7 +86,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ xeCJK-example-punctstyle.tex, xeCJK-example-verbatim.tex, xeCJK-example-IVS.tex, - xeCJK-example-listings.tex, and + xeCJK-example-listings.tex, + full-stop.tec, + fullwidth-stop.tec, + han-simp.tec, + han-trad.tec, and README.txt. \endpostamble \declarepreamble\emptypreamble @@ -96,6 +105,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \file{\jobname.sty}{\from{\jobname.dtx}{package}} \file{xeCJKfntef.sty}{\from{\jobname.dtx}{fntef}} \file{xeCJK-listings.sty}{\from{\jobname.dtx}{listings}} + \file{xunicode-addon.sty}{\from{\jobname.dtx}{xunicode}} \usepreamble\emptypreamble \usepostamble\emptypostamble \usedir{tex/xelatex/xecjk/config} @@ -118,13 +128,18 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \endbatchfile %% -%% This package consists of the file xeCJK.dtx +%% This package consists of the file xeCJK.dtx, +%% full-stop.map, +%% fullwidth-stop.map, +%% han-simp.map, +%% han-trad.map, %% and the derived files xeCJK.pdf, %% xeCJK.sty, %% xeCJK.cfg, %% xeCJK.ins, %% xeCJKfntef.sty, %% xeCJK-listings.sty, +%% xunicode-addon.sty, %% xeCJK-example-autofake.tex, %% xeCJK-example-fallback.tex, %% xeCJK-example-subCJKblock.tex, @@ -134,7 +149,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% xeCJK-example-punctstyle.tex, %% xeCJK-example-verbatim.tex, %% xeCJK-example-IVS.tex, -%% xeCJK-example-listings.tex, and +%% xeCJK-example-listings.tex, +%% full-stop.tec, +%% fullwidth-stop.tec, +%% han-simp.tec, +%% han-trad.tec, and %% README.txt. %% %% End of file `xeCJK.ins'. |