summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-07-26 23:10:53 +0000
committerKarl Berry <karl@freefriends.org>2013-07-26 23:10:53 +0000
commit81f3a7b776ea8fe83f4dbbe5ebf2d78648af9497 (patch)
treeddb69942c2476f9e4046260ea9f11e01df130516 /Master/texmf-dist/source
parent70387bf1fd37feeb2be25de8b7b23d129b360c86 (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.dtx1087
-rw-r--r--Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins31
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'.