From 4909c173ce26f3b8abbb198131d4c2846918c8b0 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 15 Nov 2013 00:12:39 +0000 Subject: xecjk git-svn-id: svn://tug.org/texlive/trunk@32149 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx | 690 ++++++++++++++++------- Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins | 4 +- 2 files changed, 491 insertions(+), 203 deletions(-) (limited to 'Master/texmf-dist/source/xelatex/xecjk') diff --git a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx index 61cc1e1a36b..a2c2c38fafe 100644 --- a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx +++ b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.dtx @@ -90,7 +90,7 @@ CJK scripts fonts (TrueType or OpenType). \askforoverwritefalse \preamble -$Id: xeCJK.dtx 510 2013-08-15 23:20:17Z sobenlee $ +$Id: xeCJK.dtx 525 2013-11-11 06:32:00Z sobenlee $ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ ----------------------------------------------------------------- Author: @@ -189,7 +189,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} % -\GetIdInfo$Id: xeCJK.dtx 510 2013-08-15 23:20:17Z sobenlee $ +\GetIdInfo$Id: xeCJK.dtx 525 2013-11-11 06:32:00Z sobenlee $ %<*driver|package> {Typesetting CJK scripts with XeLaTeX} % @@ -209,10 +209,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % {xeCJKfntef} % {xeCJK-listings} % {xunicode-addon} - {\ExplFileDate}{3.2.6}{\ExplFileDescription} + {\ExplFileDate}{3.2.7}{\ExplFileDescription} %<*driver> -\def\xeCJKversion{3.2.6} -\let\xeCJKdate\ExplFileDate \let\xeCJKrevnum\ExplFileVersion \ExplSyntaxOff % @@ -335,7 +333,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \fi % -% \CheckSum{5262} % \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}{修正某些重音不能正确显示的问题。} @@ -343,10 +340,12 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \changes{v3.2.4}{2013/07/02}{遵循 \hologo{LaTeX3} 变量需要预先声明的原则。} % \changes{v3.2.6}{2013/07/29}{\texttt{case} 类函数的用法与 \hologo{LaTeX3} 同步。} % +% \CheckSum{5446} +% \GetFileInfo{\jobname.dtx} % % \title{\bfseries\pkg{xeCJK} 宏包} % \author{\href{http://www.ctex.org}{ctex.org}} -% \date{\xeCJKdate\qquad\xeCJKversion\thanks{\ctexkitrev{\xeCJKrevnum}.}} +% \date{\filedate\qquad\fileversion\thanks{\ctexkitrev{\xeCJKrevnum}.}} % \maketitle % % \tableofcontents @@ -366,8 +365,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{enumerate} % % \pkg{xeCJK} 使用了 \XeTeX 的一些最新特性,需要 \XeTeX{} |0.9995.0 [2009/06/29]| 以 -% 后的版本。\pkg{xeCJK} 依赖 \hologo{LaTeX3} 项目的宏包套件 \package{l3kernel} 和 -% \package{l3packages}。\pkg{xeCJK} 还需要通过 \package{fontspec} 宏包来调用系统字 +% 后的版本。\pkg{xeCJK} 依赖 \package{everypage} 和 \hologo{LaTeX3} 项目的宏包套件 +% \package{l3kernel} 和 \package{l3packages} 。 +% \pkg{xeCJK} 还需要通过 \package{fontspec} 宏包来调用系统字 % 体。将在 \ref{subsec:opts}~节介绍的功能选项 |indentfirst| 选项需要 % \package{indentfirst} 宏包的支持。\pkg{xeCJK} 会自动根据需要载入这些宏包。 % @@ -487,7 +487,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % CJKmath = \meta{\TFF} % \end{syntax} % 是否支持在数学环境中直接输入 CJK 字符。使用这个选项后,可以直接在数学环境中 -% 输出 CJK 字符。 +% 输出 CJK 字符。\pkg{url} 宏包将一个 URL 放在一个特殊的数学环境中排版,所以如果在 +% \cs{path} 等命令的路径参数中含有汉字,则需要启用这个选项,路径中的汉字才能显示。 % \end{function} % % \begin{function}{CJKglue} @@ -653,6 +654,13 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \cs{xeCJKsetwidth}。 % \end{function} % +% \begin{function}[EXP,added=2013-08-22]{PunctBoundWidth} +% \begin{syntax} +% PunctBoundWidth = \Arg{length} +% \end{syntax} +% 与以上选项类似,但设置的是标点符号出现在行首/尾时的宽度。 +% \end{function} +% % \begin{function}{AllowBreakBetweenPuncts} % \begin{syntax} % AllowBreakBetweenPuncts = \meta{\TFF} @@ -988,7 +996,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \cs{xeCJKDeclareSubCJKBlock*} \Arg{block} \Arg{block range} % \end{syntax} % 其中 \meta{block range} 是逗号列表,可以是 CJK 字符的 |Unicode| 范围,也可以是单个字符 -% 的 |Unicode|。例如 +% 的 |Unicode|。例如\strut +% \end{function} % \begin{verbatim} % { `中 -> `文 , "3400 -> "4DBF , "5000 -> "7000 , `汉 , `字 , "3500 } % \end{verbatim} @@ -1002,8 +1011,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 就声明了 |SPUA| 和 |Ext-B| 这两个个子分区。同时在 \ref{subsec:fontset} 节介绍的 % CJK 字体设置命令的 \meta{font features} 里新建了 |SPUA| 和 |Ext-B| 这两个选项。 % 新建的这两个选项的使用方法跟 \ref{subsec:fontset} 介绍的 |FallBack| 类似。可以 -% 通过它们来设置字体。\strut -% \end{function} +% 通过它们来设置字体。 % % 例如,可以使用 % \begin{verbatim} @@ -1067,22 +1075,25 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \pkg{xeCJK} 对标点符号的输出宽度的调整是通过调整其左边或右边的空白宽度来实现的。 % 按照目前的处理方式,对于位于左边的标点符号(如左引号),\pkg{xeCJK} 只能调整它 % 左边的空白;对于位于右边的标点符号(如右引号),\pkg{xeCJK} 只能调整它右边的空 -% 白;对于居中的标点符号,则调整其左右空白,以保证其居中。 +% 白;对于居中的标点符号,则调整其左右空白,以保证其居中。对于标点符号的相关设置, +% 只能在导言区中进行。 % % \subsubsection{设置特定标点符号的宽度和间距} % \label{subsec:punct} % % 这里的设置可用于除 |plain| 以外的所有标点处理格式。 % -% \begin{function}[EXP]{\xeCJKsetwidth} +% \begin{function}[EXP,updated=2013-08-22]{\xeCJKsetwidth} % \begin{syntax} -% \cs{xeCJKsetwidth} \Arg{标点列表} \Arg{length} +% \cs{xeCJKsetwidth} \Arg{标点列表} \Arg{length} +% \cs{xeCJKsetwidth*} \Arg{标点列表} \Arg{length} % \end{syntax} % \meta{标点列表}可以是单个标点,也可以是多个标点。例如, % \begin{verbatim} % \xeCJKsetwidth{。?}{0.7em} % \end{verbatim} -% 将设置句号和问号所占的宽度为 |0.7 em|。 +% 将设置句号和问号所占的宽度为 |0.7 em|。带星号的命令,设置标点符号出现在行首/尾 +% 时的宽度。 % \end{function} % % \begin{function}[EXP]{\xeCJKsetkern} @@ -1100,14 +1111,14 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \subsubsection{定义标点符号处理格式} % \label{subsec:punctstyle} % -% \begin{function}[EXP,added=2012-11-10]{\xeCJKDeclarePunctStyle} +% \begin{function}[EXP,updated=2013-08-22]{\xeCJKDeclarePunctStyle} % \begin{syntax} % \cs{xeCJKDeclarePunctStyle} \Arg{style} \Arg{options} % \end{syntax} % 定义新的标点符号处理格式,已经存在的同名格式将被覆盖。可以设置的选项将在下面介绍。 % \end{function} % -% \begin{function}[EXP,added=2012-11-10]{\xeCJKEditPunctStyle} +% \begin{function}[EXP,updated=2013-08-22]{\xeCJKEditPunctStyle} % \begin{syntax} % \cs{xeCJKEditPunctStyle} \Arg{style} \Arg{options} % \end{syntax} @@ -1118,12 +1129,12 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 型,右边则是相关说明。某些选项之间是互斥的,具有优先级关系。要使下一级的选项有 % 效,则需要先禁用上一级的设置:对于 \meta{boolean} 类型的选项,将其设置为 |false|, % 对于 \meta{length} 类型的选项,将其设置为 \cs{maxdimen},而对于 \meta{real} 类型 -% 的选项,将其设置为 |0|。 +% 的选项,将其设置为 |nan|。 % % \begin{optiondesc} % \PSKeyVal{enabled-global-setting}{boolean} -% 是否使用 \cs{xeCJKsetup} 的 |PunctWidth| 选项和 \cs{xeCJKsetwidth}、 -% \cs{xeCJKsetkern} 的设置。默认值是 |true|。 +% 是否使用 \cs{xeCJKsetup} 的 |PunctWidth|、|PunctBoundWidth| 选项和 +% \cs{xeCJKsetwidth}、\cs{xeCJKsetkern} 的设置。默认值是 |true|。 % \end{optiondesc} % % \begin{optiondesc} @@ -1151,7 +1162,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \PSKeyVal{fixed-margin-width}{length} % 设置标点的左/右空白宽度。默认值是 \cs{maxdimen}。 % \PSKeyVal{fixed-margin-ratio}{real} -% 设置标点的左/右空白宽度与字体中该标点的相应实际边界宽度的比例。默认值是 |1.0|。 +% 设置标点的左/右空白宽度与字体中该标点的相应实际边界宽度的比例。默认值是~|1.0|。 % \PSKeyVal{mixed-margin-width}{length} % 设置句末标点的左/右空白宽度。默认值是与 |fixed-margin-width| 的值相同。 % \PSKeyVal{mixed-margin-ratio}{real} @@ -1163,6 +1174,22 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 默认值是与 |fixed-margin-ratio| 的值相同。 % \end{optiondesc} % +% 下面选项设置标点符号出现在行首或者行尾时的宽度或比例。 +% +% \begin{optiondesc} +% \PSKeyVal{bound-punct-width}{length} +% 设置标点符号出现在行首/尾时的宽度。默认值是 \cs{maxdimen}。 +% \PSKeyVal{bound-punct-ratio}{real} +% 设置标点符号出现在行首/尾时的输出宽度与实际宽度的比例。默认值是 |nan|。 +% \PSKeyVal{bound-margin-width}{length} +% 设置标点符号出现在行首/尾时的左/右空白宽度。默认值是 \cs{maxdimen}。 +% \PSKeyVal{bound-margin-ratio}{real} +% 设置标点符号出现在行首/尾时的左/右空白宽度与相应实际边界宽度的比例。默认值是 |0|。 +% \PSKeyVal{enabled-hanging}{boolean} +% 当以上选项的计算结果得到的宽度小于标点符号的实际边界宽度时,是否允许标点符号 +% 悬挂出页面边界。默认值是 |false|。 +% \end{optiondesc} +% % \begin{optiondesc} % \PSKeyVal{add-min-bound-to-margin}{boolean} % 是否在以上计算结果的基础上再加上标点的左右实际边界宽度中的最小值。这个选项 @@ -1201,11 +1228,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \PSKeyVal{same-align-margin}{length} % 前后两个标点位于同侧时,它们之间的空白宽度。默认值是 \cs{maxdimen}。 % \PSKeyVal{same-align-ratio}{real} -% 前后两个标点位于同侧时,它们之间的空白宽度与实际输出宽度的比例。默认值是 |0|。 +% 前后两个标点位于同侧时,它们之间的空白宽度与实际输出宽度的比例。默认值是~|nan|。 % \PSKeyVal{different-align-margin}{length} % 前后两个标点位于异侧时,它们之间的空白宽度。默认值是 \cs{maxdimen}。 % \PSKeyVal{different-align-ratio}{real} -% 前后两个标点位于异侧时,它们之间的空白宽度与实际输出宽度的比例。默认值是 |0|。 +% 前后两个标点位于异侧时,它们之间的空白宽度与实际输出宽度的比例。默认值是~|nan|。 % \PSKeyVal{kerning-margin-width}{length} % 设置前后两个标点之间的空白宽度。默认值是 \cs{maxdimen}。 % \PSKeyVal{kerning-margin-ratio}{real} @@ -1230,13 +1257,15 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{verbatim} % \xeCJKDeclarePunctStyle { mine } % { -% fixed-punct-ratio = 0 , +% fixed-punct-ratio = nan , % fixed-margin-width = 0 pt , % mixed-margin-width = \maxdimen , % mixed-margin-ratio = 0.5 , % middle-margin-width = \maxdimen , % middle-margin-ratio = 0.5 , % add-min-bound-to-margin = true , +% bound-punct-width = 0 em , +% enabled-hanging = true , % min-bound-to-kerning = true , % kerning-margin-minimum = 0.1 em % } @@ -1246,9 +1275,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \xeCJKsetup{PunctStyle=mine} % \end{verbatim} % 在文档中使用这个格式。它的意义是:使用标点符号的实际左右边界中的最小值作为其左/右 -% 空白的宽度,对于句末标点和居中标点,再加上实际边界空白的一半;使用相邻两个标点的 -% 实际边界中的较小值作为它们之间的空白宽度,并且最小的空白宽度是 |0.1 em|。 -% 再例如,使用 +% 空白的宽度,对于句末标点和居中标点,再加上实际边界空白的一半;当标点出现在行首或 +% 行尾时宽度为零,允许悬挂出页面边界;使用相邻两个标点的实际边界中的较小值作为它们 +% 之间的空白宽度,并且最小的空白宽度是 |0.1 em|。再例如,使用 % \begin{verbatim} % \xeCJKEditPunctStyle { hangmobanjiao } { enabled-global-setting = false } % \end{verbatim} @@ -1280,6 +1309,16 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 前面介绍的 |CheckFullRight| 选项,则不需要再用此命令。 % \end{function} % +% \begin{function}[added=2013-11-09]{\xeCJKShipoutHook} +% \pkg{xeCJK} 在正文中的一些特殊设置(汉字下加点、在 \env{verbatim} 或 +% \env{lstlisting} 环境中分页)可能会影响到 \TeX 的输出例行程序(output routine) +% 中的内容(比如页眉和页脚)。\cs{xeCJKShipoutHook} 用于恢复正文中的普通设置。 +% \pkg{xeCJK} 已经处理了页眉和页脚的情况,其它的就需要根据情况自行调用。 +% 比如若使用 \pkg{eso-pic} 或者 \pkg{atbegshi} 实现文字水印,并且正文中使用了 +% 以上所列的特殊形式,就需要在命令 \cs{AtBeginShipout} 的参数的最前面使用 +% \cs{xeCJKShipoutHook}。 +% \end{function} +% % \section{已知问题和兼容性} % % \XeTeX 在配置文件 \file{unicode-letters.tex} 中将所有 CJK 表意文字的 \cs{catcode} @@ -1419,6 +1458,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \RequirePackage { xparse , l3keys2e } % \end{macrocode} % +% \begin{macrocode} +\RequirePackage { everypage } +% \end{macrocode} +% % \subsection{内部工具} % % 分配临时变量。 @@ -1490,6 +1533,29 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % +% \changes{v3.2.7}{2013/11/09}{使用 \pkg{everypage} 往 \cs{shipout} 盒子里加钩子。} +% +% \begin{macro}{\xeCJKShipoutHook} +% 在 \cs{shipout} 盒子里加钩子,可以影响到页眉页脚。\cs{AtBeginDvi} 将参数保存在 +% 盒子中,而 \pkg{atbegshi} 的 \cs{AtBeginShipout} 在 \cs{shipout} 盒子构建好之后 +% 才起作用,所以它们都影响不到页眉页脚。 +% \begin{macrocode} +\AddEverypageHook { \xeCJKShipoutHook } +\NewDocumentCommand \xeCJKShipoutHook { } + { + \bool_if:NF \l_@@_shipout_hook_bool + { + \bool_set_true:N \l_@@_shipout_hook_bool + \tl_use:N \l_@@_shipout_hook_tl + } + } +\cs_new_protected:Npn \@@_add_to_shipout:n #1 + { \tl_put_right:Nn \l_@@_shipout_hook_tl {#1} } +\tl_new:N \l_@@_shipout_hook_tl +\bool_new:N \l_@@_shipout_hook_bool +% \end{macrocode} +% \end{macro} +% % \begin{macro}[internal]{\xeCJK_reverse:nnn} % |#1| 为 |#2| 或 |#3|,若 |#1| 和 |#2| 相等,则返回 |#3|,否则返回 |#2|。 % \begin{macrocode} @@ -1893,7 +1959,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % (Ideographic Variation Selectors)\footnote{\url{http://www.unicode.org/reports/tr37/}} % 需要 \XeTeX\ |0.9999.0| 以上的版本^^A % \footnote{\url{http://tug.org/pipermail/xetex/2013-March/024118.html}}和相关字体的支持。 -% \begin{center}\xeCJKsetup{PunctStyle=plain} +% \begin{center}\xeCJKsetup{PunctStyle=hangmobanjiao} % \begin{tabular}{cll} % \toprule % 类别 & 说明 & 例子 \\ \midrule @@ -2319,6 +2385,17 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macro} % % \changes{v3.2.3}{2013/06/08}{不再改变 CJK 字符类的 \cs{catcode}。} +% \changes{v3.2.7}{2013/08/29}{修正 \file{unicode-letters.tex} 中谚文符号 +% \cs{catcode} 不准的问题。} +% \begin{macrocode} +\int_set:Nn \l_@@_begin_int { "AC00 } +\int_set:Nn \l_@@_end_int { "D7A3 } +\xeCJK_int_until_do:nn { \l_@@_begin_int > \l_@@_end_int } + { + \char_set_catcode_letter:n { \l_@@_begin_int } + \int_incr:N \l_@@_begin_int + } +% \end{macrocode} % % \begin{macro}[internal]{\xeCJK_set_char_class:nnn} % \changes{v3.1.1}{2012/12/05}{在文档中设置字符类别时不重复设置 \cs{catcode}。} @@ -3046,20 +3123,45 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } % \end{macrocode} % +% \begin{macro}[internal]{\@@_punct_bound_rule:NN} +% 用于抹去标点符号的全部左/右空白。 +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_punct_bound_rule:NN #1#2 + { + \tex_vrule:D + width - \@@_use_punct_dim:nnn { bound } {#1} {#2} + depth \c_zero_dim + height \c_zero_dim \scan_stop: + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[internal]{\@@_punct_rule:NN} -% 用于抹去标点符号的左/右空白。 +% 用于减少标点符号的左/右空白。 % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_punct_rule:NN #1#2 { \tex_vrule:D - width - \@@_use_punct_dim:nnn { bound } {#1} {#2} + width \@@_use_punct_dim:nnn { rule } {#1} {#2} depth \c_zero_dim height \c_zero_dim \scan_stop: } % \end{macrocode} % \end{macro} % +% \begin{macro}[internal]{\@@_punct_offset:NN} +% 经过以上 \cs{vrule} 处理后,标点输出边界与实际边界的距离。 +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_punct_offset:NN #1#2 + { \@@_punct_kern:n { - \@@_use_punct_dim:nnn { offset } {#1} {#2} } } +\cs_new_protected_nopar:Npn \@@_punct_kern:n #1 + { \tex_kern:D #1 \exp_stop_f: } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[internal]{\@@_punct_glue:NN} +% \changes{v3.2.7}{2013/08/23} +% {标点符号左/右空白的伸展值不超过原始边界,收缩值不小于另一侧边界。} % 根据所选的标点处理方式在标点符号左/右增加的空白。 % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_punct_glue:NN #1#2 @@ -3067,7 +3169,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \@@_punct_hskip:n { \@@_use_punct_dim:nnn { glue } {#1} {#2} - minus \dim_eval:n { ( \@@_use_punct_dim:nnn { glue } {#1} {#2} ) / \c_two } + plus \@@_use_punct_dim:nnn { plus } {#1} {#2} + minus \@@_use_punct_dim:nnn { minus } {#1} {#2} } } \cs_new_eq:NN \@@_punct_hskip:n \skip_horizontal:n @@ -3078,7 +3181,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 相邻两个标点之间的间距。 % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_punct_kern:NN #1#2 - { \tex_kern:D \@@_use_punct_dim:nnn { kern } {#1} {#2} } + { \tex_kern:D \@@_use_punct_dim:nnn { kern } {#1} {#2} \exp_stop_f: } % \end{macrocode} % \end{macro} % @@ -3095,7 +3198,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \@@_punct_if_middle:NTF \g_@@_last_punct_tl { - \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl + \@@_punct_bound_rule:NN \c_@@_right_tl \g_@@_last_punct_tl \xeCJK_no_break: \@@_punct_glue:NN \c_@@_left_tl \g_@@_last_punct_tl } @@ -3111,7 +3214,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \@@_punct_if_middle:NTF \g_@@_last_punct_tl { - \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl + \@@_punct_bound_rule:NN \c_@@_right_tl \g_@@_last_punct_tl \xeCJK_class_group_end: \xeCJK_no_break: \@@_punct_glue:NN \c_@@_left_tl \g_@@_last_punct_tl } @@ -3127,6 +3230,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \cs_new_protected_nopar:Npn \xeCJK_FullRight_and_CJK: { \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl + \@@_punct_offset:NN \c_@@_right_tl \g_@@_last_punct_tl \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl \CJKglue } @@ -3139,6 +3243,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl \xeCJK_class_group_end: + \@@_punct_offset:NN \c_@@_right_tl \g_@@_last_punct_tl \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl } % \end{macrocode} @@ -3159,7 +3264,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \CJKpunctsymbol {#2} } \cs_new_protected_nopar:Npn \@@_Default_and_FullLeft_glue:N #1 - { \@@_punct_glue:NN \c_@@_left_tl {#1} } + { + \@@_punct_glue:NN \c_@@_left_tl {#1} + \@@_punct_offset:NN \c_@@_left_tl {#1} + } % \end{macrocode} % \end{macro} % @@ -3174,7 +3282,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \CJKpunctsymbol {#1} } \cs_new_protected_nopar:Npn \@@_CJK_and_FullLeft_glue:N #1 - { \CJKglue \@@_punct_glue:NN \c_@@_left_tl {#1} } + { + \CJKglue + \@@_punct_glue:NN \c_@@_left_tl {#1} + \@@_punct_offset:NN \c_@@_left_tl {#1} + } % \end{macrocode} % \end{macro} % @@ -3184,6 +3296,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \xeCJK_get_punct_bounds:NN \c_@@_left_tl {#1} \@@_Boundary_and_FullLeft_glue:N {#1} + \@@_punct_offset:NN \c_@@_left_tl {#1} \xeCJK_class_group_begin: \xeCJK_select_font: \xeCJK_clear_Boundary_and_CJK_toks: @@ -3229,7 +3342,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \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_minus_one } { \@@_zero_glue: \use_none:n } { \c_eleven } { \bool_if:nTF @@ -3237,7 +3350,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ ! ( \skip_if_finite_p:n { \tex_lastskip:D } ) || \skip_if_eq_p:nn { \tex_lastskip:D } { 1 sp } } - { \use_none:n } + { \@@_zero_glue: \use_none:n } { \skip_if_eq:nnTF { \tex_lastskip:D } { \labelsep } { @@ -3282,8 +3395,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_clear_inter_class_toks:nn {#1} { FullRight } \xeCJK_clear_Boundary_and_CJK_toks: \tl_gset:Nx \g_@@_last_punct_tl {#2} - \@@_punct_if_middle:NT {#2} - { \@@_punct_rule:NN \c_@@_left_tl {#2} } \xeCJK_FullRight_symbol:N {#2} } % \end{macrocode} @@ -3299,8 +3410,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_select_font: \xeCJK_clear_Boundary_and_CJK_toks: \tl_gset:Nx \g_@@_last_punct_tl {#1} - \@@_punct_if_middle:NT {#1} - { \@@_punct_rule:NN \c_@@_left_tl {#1} } \xeCJK_FullRight_symbol:N {#1} } % \end{macrocode} @@ -3313,8 +3422,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_get_punct_bounds:NN \c_@@_right_tl {#1} \@@_CJK_and_FullRight_glue:N {#1} \tl_gset:Nx \g_@@_last_punct_tl {#1} - \@@_punct_if_middle:NT {#1} - { \@@_punct_rule:NN \c_@@_left_tl {#1} } \xeCJK_FullRight_symbol:N {#1} } % \end{macrocode} @@ -3328,9 +3435,13 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \@@_punct_if_long:NTF {#1} { \CJKglue } { - \xeCJK_no_break: - \@@_punct_if_middle:NT {#1} - { \@@_punct_glue:NN \c_@@_right_tl {#1} } + \@@_punct_if_middle:NTF {#1} + { + \xeCJK_no_break: + \@@_punct_glue:NN \c_@@_right_tl {#1} + \@@_punct_bound_rule:NN \c_@@_left_tl {#1} + } + { \xeCJK_no_break: } } } \cs_new_eq:NN \@@_Default_and_FullRight_glue:N \@@_CJK_and_FullRight_glue:N @@ -3392,20 +3503,19 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \changes{v3.2.4}{2013/07/06} % {使用 \texttt{AllowBreakBetweenPuncts} 时,相应标点符号仍能与边界对齐。} +% \changes{v3.2.7}{2013/08/23} +% {处理 \texttt{AllowBreakBetweenPuncts} 与 \pkg{xeCJKfntef} 的兼容问题。} % % \begin{macro}[internal]{\@@_punct_breakable_kern:NN} % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_punct_breakable_kern:NN #1#2 { \@@_punct_rule:NN \c_@@_right_tl #1 - \@@_punct_hskip:n - { - \@@_use_punct_dim:nnn { kern } {#1} {#2} + - \@@_use_punct_dim:nnn { bound } { \c_@@_right_tl } {#1} + - \@@_use_punct_dim:nnn { bound } { \c_@@_left_tl } {#2} - } + \@@_punct_breakable_kern:n + { \@@_use_punct_dim:nnn { break_kern } {#1} {#2} } \@@_punct_rule:NN \c_@@_left_tl #2 } +\cs_new_eq:NN \@@_punct_breakable_kern:n \skip_horizontal:n % \end{macrocode} % \end{macro} % @@ -3467,6 +3577,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \xeCJK_get_punct_bounds:NN \c_@@_right_tl \g_@@_last_punct_tl \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl + \@@_punct_offset:NN \c_@@_right_tl \g_@@_last_punct_tl \group_align_safe_begin: \tl_case:NoTF \l_peek_token { \l_@@_no_break_cs_case_tl } @@ -3608,6 +3719,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \begin{macro}[internal]{\xeCJK_check_single:NNw} % \changes{v3.1.1}{2012/12/04}{改进定义,减少使用 \texttt{peek} 函数的次数。} +% \changes{v3.2.7}{2013/08/30}{与 \cs{CJKspace} 兼容。} % 使用 \cs{group_align_safe_begin:} 和 \cs{group_align_safe_end:} 是为了防止在表格 % 里面报错。 % \begin{macrocode} @@ -3616,7 +3728,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_peek_catcode_ignore_spaces:NTF \c_catcode_letter_token { \bool_if:NTF \l_@@_peek_ignore_spaces_bool - { \@@_check_single_space:NN #1#2 } + { + \bool_if:NTF \l_@@_reserve_space_bool + { \@@_check_single_save:N #1 #2 ~ } + { \@@_check_single_space:NN #1#2 } + } { \@@_check_single_save:N #1 #2 } } { @@ -3951,6 +4067,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \subsection{标点处理} % +% \changes{v3.2.7}{2013/08/22}{实现自定义行首/尾标点符号宽度功能。} +% % \cs{XeTeXglyphbouds} 可以得到一个字符的左右边距,用于标点压缩。如果它不可用,则 % 在文档中只能使用 |plain| 这一标点格式原样输出标点。 % \begin{macrocode} @@ -3979,8 +4097,19 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macro}{\xeCJKsetwidth} % 手动设置参数中的标点符号的宽度。 % \begin{macrocode} -\NewDocumentCommand \xeCJKsetwidth { m m } - { \tl_map_inline:xn {#1} { \tl_gset:cn { g_@@_punct_width/##1/tl } {#2} } } +\NewDocumentCommand \xeCJKsetwidth { s m m } + { + \IfBooleanTF {#1} + { + \tl_map_inline:xn {#2} + { \tl_gset:cn { g_@@_punct_bound_width/##1/tl } {#3} } + } + { + \tl_map_inline:xn {#2} + { \tl_gset:cn { g_@@_punct_width/##1/tl } {#3} } + } + } +\@onlypreamble \xeCJKsetwidth \cs_generate_variant:Nn \tl_map_inline:nn { x } % \end{macrocode} % \end{macro} @@ -3990,6 +4119,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \NewDocumentCommand \xeCJKsetkern { m m m } { \tl_gset:cn { g_@@_punct/kern/#1/#2/tl } {#3} } +\@onlypreamble \xeCJKsetkern % \end{macrocode} % \end{macro} % @@ -4001,7 +4131,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macro} % % \begin{macro} -% {AllowBreakBetweenPuncts, KaiMingPunct, LongPunct, MiddlePunct,PunctWidth} +% {AllowBreakBetweenPuncts,KaiMingPunct,LongPunct, +% MiddlePunct,PunctWidth,PunctBoundWidth} % 相关选项声明。 % \begin{macrocode} \keys_define:nn { xeCJK / options } @@ -4027,7 +4158,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ MiddlePunct .code:n = { \@@_set_special_punct:nn { middle } {#1} } , MiddlePunct+ .code:n = { \@@_add_special_punct:nn { middle } {#1} } , MiddlePunct- .code:n = { \@@_sub_special_punct:nn { middle } {#1} } , - PunctWidth .tl_gset:N = \g_@@_punct_width_tl + PunctWidth .tl_gset:N = \g_@@_punct_width_tl , + PunctBoundWidth .tl_gset:N = \g_@@_punct_bound_width_tl , + PunctWidth .value_required: , + PunctBoundWidth .value_required: } \bool_new:N \l_@@_punct_breakable_bool % \end{macrocode} @@ -4095,14 +4229,12 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \cs_new_nopar:Npn \@@_punct_dim_csname:nn #1#2 { c__\l_xeCJK_current_font_tl/\l_xeCJK_punct_style_tl/#1/#2/tl } -\cs_new_nopar:Npn \@@_punct_dim_csname:nnn - { \@@_punct_dim_csname:nnnn { \l_xeCJK_punct_style_tl } } -\cs_new_nopar:Npn \@@_punct_dim_csname:nnnn #1#2#3#4 - { c__\l_xeCJK_current_font_tl/#1/#2/#3/#4/tl } +\cs_new_nopar:Npn \@@_punct_dim_csname:nnn #1#2#3 + { c__\l_xeCJK_current_font_tl/\l_xeCJK_punct_style_tl/#1/#2/#3/tl } \cs_new_nopar:Npn \@@_use_punct_dim:nn #1#2 - { \tl_use:c { \@@_punct_dim_csname:nn {#1} {#2} } } + { \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} } } + { \use:c { \@@_punct_dim_csname:nnn {#1} {#2} {#3} } } \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 @@ -4113,11 +4245,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % 定义标点处理模板。 % \begin{macrocode} -\DeclareObjectType { xeCJK / punctuation } { \c_three } +\DeclareObjectType { xeCJK / punctuation } { \c_zero } % \end{macrocode} % % \begin{macrocode} -\DeclareTemplateInterface { xeCJK / punctuation } { basic } { \c_three } +\DeclareTemplateInterface { xeCJK / punctuation } { basic } { \c_zero } { enabled-global-setting : boolean = true , fixed-punct-width : length = \c_max_dim , @@ -4132,6 +4264,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ mixed-margin-ratio : real = \KeyValue { fixed-margin-ratio } , middle-margin-width : length = \KeyValue { fixed-margin-width } , middle-margin-ratio : real = \KeyValue { fixed-margin-ratio } , + bound-punct-width : length = \c_max_dim , + bound-punct-ratio : real = \c_nan_fp , + bound-margin-width : length = \c_max_dim , + bound-margin-ratio : real = \c_zero_fp , + enabled-hanging : boolean = false , add-min-bound-to-margin : boolean = false , optimize-margin : boolean = false , margin-minimum : length = \c_zero_dim , @@ -4141,9 +4278,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ kerning-total-ratio : real = 0.75 , optimize-kerning : boolean = false , same-align-margin : length = \c_max_dim , - same-align-ratio : real = \c_zero_fp , + same-align-ratio : real = \c_nan_fp , different-align-margin : length = \c_max_dim , - different-align-ratio : real = \c_zero_fp , + different-align-ratio : real = \c_nan_fp , kerning-margin-width : length = \c_max_dim , kerning-margin-ratio : real = \c_one_fp , kerning-margin-minimum : length = \c_zero_dim @@ -4151,7 +4288,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % % \begin{macrocode} -\DeclareTemplateCode { xeCJK / punctuation } { basic } { \c_three } +\DeclareTemplateCode { xeCJK / punctuation } { basic } { \c_zero } { enabled-global-setting = \l_@@_enabled_global_setting_bool , fixed-punct-width = \l_@@_fixed_punct_width_dim , @@ -4166,6 +4303,11 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ mixed-margin-ratio = \l_@@_mixed_margin_ratio_fp , middle-margin-width = \l_@@_middle_margin_width_dim , middle-margin-ratio = \l_@@_middle_margin_ratio_fp , + bound-punct-width = \l_@@_bound_punct_width_dim , + bound-punct-ratio = \l_@@_bound_punct_ratio_fp , + bound-margin-width = \l_@@_bound_margin_width_dim , + bound-margin-ratio = \l_@@_bound_margin_ratio_fp , + enabled-hanging = \l_@@_enabled_hanging_bool , add-min-bound-to-margin = \l_@@_add_min_bound_to_margin_bool , optimize-margin = \l_@@_optimize_margin_bool , margin-minimum = \l_@@_margin_minimum_dim , @@ -4182,24 +4324,73 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ kerning-margin-ratio = \l_@@_kerning_margin_ratio_fp , kerning-margin-minimum = \l_@@_kerning_margin_minimum_dim } + { \AssignTemplateKeys } +% \end{macrocode} +% +% \begin{macro}[internal]{\xeCJK_get_punct_bounds:NN} +% |#1| 为 \cs{c_@@_left_tl} 或 \cs{c_@@_right_tl},|#2| 为标点符号。 +% \begin{macrocode} +\cs_new_protected_nopar:Npn \xeCJK_get_punct_bounds:NN #1#2 { - \AssignTemplateKeys - \tl_if_blank:nTF {#3} - { \xeCJK_punct_margin_process:NN {#1} {#2} } - { \xeCJK_punct_kerning_process:NN {#2} {#3} } + \tl_if_exist:cF { \@@_punct_dim_csname:nnn { glue } {#1} {#2} } + { + \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c_@@_punct_style_plain_tl + { + \@@_save_punct_dim:nnnn { rule } {#1} {#2} { \c_zero_dim } + \@@_save_punct_dim:nnnn { glue } {#1} {#2} { \c_zero_dim } + \@@_save_punct_dim:nnnn { plus } {#1} {#2} { \c_zero_dim } + \@@_save_punct_dim:nnnn { minus } {#1} {#2} { \c_zero_dim } + \@@_save_punct_dim:nnnn { offset } {#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} } + \dim_set:Nn \l_@@_bound_dim + { \@@_use_punct_dim:nnn { bound } {#1} {#2} } + \dim_set:Nn \l_@@_reverse_bound_dim + { + \@@_use_punct_dim:nnn { bound } + { \xeCJK_reverse:nnn {#1} \c_@@_left_tl \c_@@_right_tl } + {#2} + } + \UseInstance { xeCJK / punctuation } { \l_xeCJK_punct_style_tl } + \xeCJK_punct_margin_process:NN {#1} {#2} + \xeCJK_punct_offset_process:NN {#1} {#2} + } + } } +\dim_new:N \l_@@_bound_dim +\dim_new:N \l_@@_reverse_bound_dim % \end{macrocode} +% \end{macro} % -% \begin{macro}[internal]{\xeCJK_punct_margin_process:NN} +% \begin{macro}[internal]{\xeCJK_get_punct_kerning:NN} +% 标点挤压。 % \begin{macrocode} -\cs_new_protected_nopar:Npn \xeCJK_punct_margin_process:NN #1#2 +\cs_new_protected_nopar:Npn \xeCJK_get_punct_kerning:NN #1#2 { - \dim_set:Nn \l_@@_bound_dim { \@@_use_punct_dim:nnn { bound } {#1} {#2} } - \dim_set:Nn \l_@@_reverse_bound_dim + \tl_if_exist:cF { \@@_punct_dim_csname:nnn { kern } {#1} {#2} } { - \@@_use_punct_dim:nnn { bound } - { \xeCJK_reverse:nnn {#1} \c_@@_left_tl \c_@@_right_tl } {#2} + \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c_@@_punct_style_plain_tl + { + \@@_save_punct_dim:nnnn { kern } {#1} {#2} { \c_zero_dim } + \@@_save_punct_dim:nnnn { break_kern } {#1} {#2} { \c_zero_dim } + } + { + \UseInstance { xeCJK / punctuation } { \l_xeCJK_punct_style_tl } + \xeCJK_punct_kerning_process:NN {#1} {#2} + } } + } +\cs_generate_variant:Nn \xeCJK_get_punct_kerning:NN { o } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\xeCJK_punct_margin_process:NN} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \xeCJK_punct_margin_process:NN #1#2 + { \dim_set:Nn \l_@@_tmp_dim { \bool_if:NTF \l_@@_enabled_global_setting_bool @@ -4207,7 +4398,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \cs_if_exist_use:cTF { g_@@_punct_width/#2/tl } { \use_none:n } { - \xeCJK_if_blank_x:nTF \g_@@_punct_width_tl + \tl_if_empty:NTF \g_@@_punct_width_tl { \use:n } { \g_@@_punct_width_tl \use_none:n } } @@ -4223,7 +4414,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } } } - \@@_save_punct_dim:nnnn { glue } {#1} {#2} + \dim_set:Nn \l_@@_tmp_dim { \dim_max:nn { \l_@@_margin_minimum_dim } @@ -4274,12 +4465,88 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ } } } + \@@_save_punct_dim:nnnn { glue } {#1} {#2} { \l_@@_tmp_dim } + \@@_save_punct_dim:nnnn { plus } {#1} {#2} + { + \dim_max:nn { \c_zero_dim } + { + \@@_punct_if_middle:NTF {#2} + { + ( \@@_use_punct_dim:nn { width } {#2} - + \@@_use_punct_dim:nn { dimen } {#2} ) / \c_two + - \l_@@_tmp_dim + } + { \l_@@_bound_dim - \l_@@_tmp_dim } + } + } + \@@_save_punct_dim:nnnn { minus } {#1} {#2} + { + \dim_max:nn { \c_zero_dim } + { + \@@_punct_if_middle:NTF {#2} + { .5 \l_@@_tmp_dim } + { \l_@@_tmp_dim - \l_@@_reverse_bound_dim } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\xeCJK_punct_offset_process:NN} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \xeCJK_punct_offset_process:NN #1#2 + { + \dim_set:Nn \l_@@_tmp_dim + { + \bool_if:NTF \l_@@_enabled_global_setting_bool + { + \cs_if_exist_use:cTF { g_@@_punct_bound_width/#2/tl } + { \use_none:n } + { + \tl_if_empty:NTF \g_@@_punct_bound_width_tl + { \use:n } + { \g_@@_punct_bound_width_tl \use_none:n } + } + } + { \use:n } + { \@@_punct_width_or_ratio:nN { bound } {#2} } + } + \dim_set:Nn \l_@@_tmp_dim + { + \bool_if:NTF \l_@@_enabled_hanging_bool + { \use:n } + { \dim_max:nn { \l_@@_margin_minimum_dim } } + { + \dim_compare:nNnTF \l_@@_tmp_dim < \c_max_dim + { + \@@_punct_if_middle:NTF {#2} + { + \l_@@_tmp_dim + - ( \@@_use_punct_dim:nnn { glue } {#1} {#2} ) + - ( \@@_use_punct_dim:nn { dimen } {#2} ) + } + { + \l_@@_tmp_dim - \l_@@_reverse_bound_dim + - ( \@@_use_punct_dim:nn { dimen } {#2} ) + } + } + { + \bool_if:NTF \l_@@_optimize_margin_bool + { \dim_min:nn { \l_@@_bound_dim } } + { \use:n } + { \@@_margin_width_or_ratio:n { bound } } + } + } + } + \@@_save_punct_dim:nnnn { offset } {#1} {#2} { \l_@@_tmp_dim } + \@@_save_punct_dim:nnnn { rule } {#1} {#2} + { - \l_@@_bound_dim + \l_@@_tmp_dim } } -\dim_new:N \l_@@_bound_dim -\dim_new:N \l_@@_reverse_bound_dim % \end{macrocode} % \end{macro} % +% \changes{v3.2.7}{2013/08/25}{标点宽度设置禁用比例选项的值改为 \texttt{nan}。} +% % \begin{macro}[internal]{\@@_punct_width_or_ratio:nN} % \begin{macrocode} \cs_new_nopar:Npn \@@_punct_width_or_ratio:nN #1#2 @@ -4287,7 +4554,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \dim_compare:nNnTF { \use:c { l_@@_#1_punct_width_dim } } < \c_max_dim { \use:c { l_@@_#1_punct_width_dim } } { - \fp_compare:nNnTF { \use:c { l_@@_#1_punct_ratio_fp } } = \c_zero_fp + \fp_compare:nNnTF { \use:c { l_@@_#1_punct_ratio_fp } } ? \c_zero_fp { \c_max_dim } { \fp_use:c { l_@@_#1_punct_ratio_fp } @@ -4318,7 +4585,7 @@ $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 { - \@@_save_punct_dim:nnnn { kern } {#1} {#2} + \dim_set:Nn \l_@@_tmp_dim { \bool_if:nTF { @@ -4331,8 +4598,24 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \@@_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} ) + } + \@@_save_punct_dim:nnnn { kern } {#1} {#2} + { + \l_@@_tmp_dim + - ( \@@_use_punct_dim:nnn { bound } \c_@@_right_tl {#1} ) + - ( \@@_use_punct_dim:nnn { bound } \c_@@_left_tl {#2} ) + } + \@@_punct_if_right:NF {#2} + { + \@@_punct_if_right:NT {#1} + { + \@@_save_punct_dim:nnnn { break_kern } {#1} {#2} + { + \l_@@_tmp_dim + - ( \@@_use_punct_dim:nnn { offset } \c_@@_right_tl {#1} ) + - ( \@@_use_punct_dim:nnn { offset } \c_@@_left_tl {#2} ) + } + } } } % \end{macrocode} @@ -4373,7 +4656,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \dim_compare:nNnTF \l_@@_kerning_total_width_dim < \c_max_dim { \@@_calc_kerning_margin:nNN \l_@@_kerning_total_width_dim } { - \fp_compare:nNnTF \l_@@_kerning_total_ratio_fp = \c_zero_fp + \fp_compare:nNnTF \l_@@_kerning_total_ratio_fp ? \c_zero_fp { \xeCJK_if_same_class:NNTF {#1} {#2} { \@@_kerning_width_or_ratio:nNN { same } } @@ -4403,18 +4686,17 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \cs_new_nopar:Npn \@@_kerning_width_or_ratio:nNN #1#2#3 { \dim_compare:nNnTF { \use:c { l_@@_#1_align_margin_dim } } < \c_max_dim - { \use:c { l_@@_#1_align_margin_dim } \use_none:nn } - { - \fp_compare:nNnTF { \use:c { l_@@_#1_align_ratio_fp } } = \c_zero_fp - { \use:n } - { \fp_use:c { l_@@_#1_align_ratio_fp } \use_ii:nn } - } + { \use:c { l_@@_#1_align_margin_dim } } { - \dim_compare:nNnTF \l_@@_kerning_margin_width_dim < \c_max_dim - { \l_@@_kerning_margin_width_dim \use_none:n } - { \fp_use:N \l_@@_kerning_margin_ratio_fp \use:n } + \fp_compare:nNnTF { \use:c { l_@@_#1_align_ratio_fp } } ? \c_zero_fp + { + \dim_compare:nNnTF \l_@@_kerning_margin_width_dim < \c_max_dim + { \l_@@_kerning_margin_width_dim \use_none:n } + { \fp_use:N \l_@@_kerning_margin_ratio_fp \use:n } + } + { \fp_use:c { l_@@_#1_align_ratio_fp } \use:n } + { \etex_dimexpr:D \@@_original_kerning_margin:NN {#2} {#3} \scan_stop: } } - { \etex_dimexpr:D \@@_original_kerning_margin:NN {#2} {#3} \scan_stop: } } % \end{macrocode} % \end{macro} @@ -4459,33 +4741,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \begin{macro}[internal]{\xeCJK_get_punct_bounds:NN} -% |#1| 为 \cs{c_@@_left_tl} 或 \cs{c_@@_right_tl},|#2| 为标点符号。 -% \begin{macrocode} -\cs_new_protected_nopar:Npn \xeCJK_get_punct_bounds:NN #1#2 - { - \tl_if_exist:cF { \@@_punct_dim_csname:nnn { glue } {#1} {#2} } - { - \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c_@@_punct_style_plain_tl - { - \@@_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} - { \@@_save_punct_dim:nnnn { glue } {#1} {#2} { \c_zero_dim } } - { - \UseInstance { xeCJK / punctuation } - { \l_xeCJK_punct_style_tl } {#1} {#2} { } - } - } - } - } -% \end{macrocode} -% \end{macro} -% % \begin{macro}[internal]{\xeCJK_calc_punct_dimen:N} % 计算标点的左右实际边距和实际尺寸。对于破折号,计算两标点之间的空白,保证它中间 % 不被断开。 @@ -4509,11 +4764,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \@@_save_punct_dim:nnnn { kern } {#1} {#1} { - \bool_if:nTF - { - \str_if_eq_p:nn {#1} { ^^^^2025 } || - \str_if_eq_p:nn {#1} { ^^^^2026 } - } + \str_case:nnTF {#1} + { { ^^^^2025 } { } { ^^^^2026 } { } } { \c_zero_dim } { - \l_@@_tmp_dim } } @@ -4534,25 +4786,6 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \begin{macro}[internal]{\xeCJK_get_punct_kerning:NN} -% 标点挤压。 -% \begin{macrocode} -\cs_new_protected_nopar:Npn \xeCJK_get_punct_kerning:NN #1#2 - { - \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 - { \@@_save_punct_dim:nnnn { kern } {#1} {#2} { \c_zero_dim } } - { - \UseInstance { xeCJK / punctuation } - { \l_xeCJK_punct_style_tl } { } {#1} {#2} - } - } - } -\cs_generate_variant:Nn \xeCJK_get_punct_kerning:NN { o } -% \end{macrocode} -% \end{macro} -% % \begin{macro}{PunctStyle} % \begin{macrocode} \keys_define:nn { xeCJK / options } @@ -5026,7 +5259,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \cs_gset_protected_nopar:cpx { \@@_family_csname:n {#1} } { \group_begin: - \exp_not:n { \cs_set_eq:NN \@@_update_family:n \use_none:nn } + \exp_not:n { \cs_set_eq:NN \@@_update_family:nn \use_none:nn } \exp_not:n { \fontspec_set_family:Nnn \l_@@_fontspec_family_tl } { \exp_not:V \l_@@_fontspec_options_clist } { \exp_not:V \l_@@_font_name_tl } @@ -5670,6 +5903,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \begin{macro}[internal]{\xeCJK_set_mathfont:} % \changes{v3.2.6}{2013/08/01}{设置粗体时先检查对应字体是否存在。} +% \changes{v3.2.7}{2013/11/09}{将 CJK 字符的数学归类由 $7$ 改为 $0$,解决汉字路径的问题。} % 当没有设置 CJK 数学字体时,使用 \cs{CJKfamilydefault} 作为数学字体。 % \begin{macrocode} \cs_new_protected_nopar:Npn \xeCJK_set_mathfont: @@ -5700,7 +5934,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \clist_map_inline:Nn \l_@@_tmp_clist { \@@_set_char_class_aux:Nnw \xeCJK_gset_mathcode:nnnn {##1} - { \c_seven } { \c_xeCJK_math_fam_int } + { \c_zero } { \c_xeCJK_math_fam_int } } } } @@ -5826,13 +6060,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \cs_set_eq:NN \xeCJK_CJK_and_Boundary:w \@@_verb_boundary:w } } - \tex_output:D \exp_after:wN \exp_after:wN \exp_after:wN - { - \exp_after:wN \exp_after:wN - \exp_after:wN \xeCJKOffVerbAddon - \exp_after:wN \use:n - \tex_the:D \tex_output:D - } + \@@_add_to_shipout:n { \xeCJKOffVerbAddon } \xeCJKsetup { xCJKecglue = false } } \skip_if_eq:nnTF { \l_@@_verb_exspace_skip } { \c_zero_skip } @@ -6268,6 +6496,24 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % % \subsection{兼容性修补} % +% \begin{macro}[internal]{\@@_update_url_font:,\Url@MathSetup} +% \changes{v3.2.7}{2013/11/09}{使通过 \cs{UrlFont} 等命令设置的 CJK 字体生效。} +% 使通过 \cs{urlstyle} 或者 \cs{UrlFont} 设置的路径中使用的 CJK 字体生效。 +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_update_url_font: + { + \group_begin: \xeCJK_select_font: \exp_after:wN \group_end: + \exp_after:wN \tex_textfont:D \exp_after:wN \c_xeCJK_math_fam_int + \tex_the:D \tex_font:D + } +\@@_after_end_preamble:n + { + \bool_if:nT { \g_@@_math_bool && \cs_if_exist_p:N \Url@MathSetup } + { \tl_put_right:Nn \Url@MathSetup { \@@_update_url_font: } } + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[internal]{\fontspec_setup_maths:,\mathrm} % \changes{v3.2.6}{2013/08/02}{为 \cs{mathrm} 减少一个可能的数学字体族。} % 如果没有设置 \cs{setboldmathrm},即 \cs{g_fontspec_bfmathrm_tl} 为空,那么 @@ -6878,7 +7124,9 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \xeCJK_Boundary_and_Default: \@@_ulem_Boundary_and_Default: \xeCJK_Boundary_and_NormalSp: \@@_ulem_Boundary_and_NormalSp: \xeCJK@fix@penalty \@@_ulem_fix_penalty: + \@@_punct_kern:n \@@_ulem_punct_kern:n \@@_punct_hskip:n \@@_ulem_punct_hskip:n + \@@_punct_breakable_kern:n \@@_ulem_punct_breakable_kern:n \@@_CJK_and_Boundary_aux: \@@_ulem_CJK_and_Boundary_aux: \@@_Default_and_FullLeft_glue:N \@@_ulem_Default_and_FullLeft_glue:N \@@_Default_and_FullRight_glue:N \@@_ulem_Default_and_FullRight_glue:N @@ -7042,6 +7290,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \UL@stop \@@_ulem_skip_punct_begin: \@@_punct_glue:NN \c_@@_left_tl {#1} + \@@_punct_offset:NN \c_@@_left_tl {#1} \UL@start } { \@@_ulem_Default_and_FullLeft_glue:N #1 } @@ -7057,7 +7306,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \UL@stop \@@_ulem_skip_punct_begin: - \int_compare:nNnF \etex_lastnodetype:D = \c_one + \int_compare:nNnTF \etex_lastnodetype:D = \c_one + { \@@_zero_glue: } { \@@_punct_glue:NN \c_@@_left_tl {#1} } \UL@start } @@ -7077,6 +7327,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \@@_ulem_skip_punct_begin: \@@_ulem_ccglue: \@@_punct_glue:NN \c_@@_left_tl {#1} + \@@_punct_offset:NN \c_@@_left_tl {#1} \UL@start \@@_ulem_class_group_begin: } @@ -7096,9 +7347,13 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \@@_punct_if_long:NTF {#1} { \@@_ulem_ccglue: } { - \xeCJK_no_break: - \@@_punct_if_middle:NT {#1} - { \@@_punct_glue:NN \c_@@_right_tl {#1} } + \@@_punct_if_middle:NTF {#1} + { + \xeCJK_no_break: + \@@_punct_glue:NN \c_@@_right_tl {#1} + \@@_punct_bound_rule:NN \c_@@_left_tl {#1} + } + { \xeCJK_no_break: } } \UL@start } @@ -7132,7 +7387,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \@@_punct_if_middle:NTF \g_@@_last_punct_tl { \xeCJK_get_punct_bounds:NN \c_@@_left_tl \g_@@_last_punct_tl - \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl + \@@_punct_bound_rule:NN \c_@@_right_tl \g_@@_last_punct_tl \xeCJK_class_group_end: \UL@stop \xeCJK_no_break: \@@_punct_glue:NN \c_@@_left_tl \g_@@_last_punct_tl } @@ -7171,6 +7426,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl \xeCJK_class_group_end: \UL@stop + \@@_punct_offset:NN \c_@@_right_tl \g_@@_last_punct_tl \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl \@@_ulem_skip_punct_end: \UL@start @@ -7189,6 +7445,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl \xeCJK_class_group_end: \UL@stop + \@@_punct_offset:NN \c_@@_right_tl \g_@@_last_punct_tl \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl \@@_ulem_ccglue: \@@_ulem_skip_punct_end: @@ -7211,6 +7468,32 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % +% \begin{macro}[internal]{\@@_ulem_punct_kern:n} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_ulem_punct_kern:n + { + \xeCJK_if_ulem_patch:TF + { \@@_ulem_hskip:n } + { \@@_ulem_punct_kern:n } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\@@_ulem_punct_breakable_kern:n} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_ulem_punct_breakable_kern:n #1 + { + \xeCJK_if_ulem_patch:TF + { + \xeCJK_class_group_end: + \UL@stop \@@_ulem_hskip:n {#1} \UL@start + \@@_ulem_class_group_begin: + } + { \@@_ulem_punct_breakable_kern:n {#1} } + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[internal]{\@@_ulem_glue:n,\@@_ulem_ccglue:,\@@_ulem_hskip:n} % 在下划线状态下的分别代替 \cs{CJKglue} 等。 % \begin{macrocode} @@ -7241,14 +7524,14 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ { \UL@stop \@@_ulem_restore_CJK_and_Boundary: } \CJK@preUnderdot \@@_make_under_symbol:n { \CJK@underdotSkip } - \cs_gset_eq:NN \@@_save_under_dot_CJKsymbol:N \CJKsymbol + \cs_gset_eq:NN \@@_save_under_CJKsymbol:N \CJKsymbol \cs_set_eq:NN \CJKsymbol \@@_under_CJKsymbol:N - \@@_restore_output_CJKsymbol: + \@@_restore_shipout_CJKsymbol: \bool_if:NT \l_@@_ulem_hook_used_bool { \UL@start } #1 \bool_if:NT \l_@@_ulem_hook_used_bool { \UL@stop } - \cs_set_eq:NN \CJKsymbol \@@_save_under_dot_CJKsymbol:N - \tex_output:D \exp_after:wN { \l_@@_underdot_output_tl } + \cs_set_eq:NN \CJKsymbol \@@_save_under_CJKsymbol:N + \tl_clear:N \l_@@_fntef_shipout_tl \CJK@postUnderdot \bool_if:NT \l_@@_ulem_hook_used_bool { \@@_ulem_restore_CJK_and_Boundary: \UL@start } @@ -7274,9 +7557,10 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \group_begin: \hbox_set:Nn \CJK@underdotBox {#2} \@@_make_under_symbol:n {#1} - \cs_gset_eq:NN \@@_save_under_dot_CJKsymbol:N \CJKsymbol + \cs_set_eq:NN \@@_save_under_CJKsymbol:N \CJKsymbol \cs_set_eq:NN \CJKsymbol \@@_under_CJKsymbol:N - \@@_restore_output_CJKsymbol: + \@@_restore_shipout_CJKsymbol: + \tl_clear:N \l_@@_underdot_shipout_tl #3 \group_end: \tex_ignorespaces:D @@ -7284,23 +7568,26 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \end{macrocode} % \end{macro} % -% \begin{macro}[internal]{\@@_restore_output_CJKsymbol:} +% \begin{macro}[internal]{\@@_restore_shipout_CJKsymbol:} % \changes{v3.2.3}{2013/06/04}{解决 \cs{CJKunderdot} 跨页使用时影响到页眉页脚的问题。} % \cs{CJKunderdot} 中对 \cs{CJKsymbol} 的修改会影响到页眉和页脚,需要小心处理。 % \begin{macrocode} -\cs_new_protected:Npn \@@_restore_output_CJKsymbol: +\cs_new_protected:Npn \@@_restore_shipout_CJKsymbol: { - \tl_set:Nx \l_@@_underdot_output_tl - { \exp_after:wN \exp_not:n \tex_the:D \tex_output:D } - \tex_output:D \exp_after:wN + \tl_set:Nn \l_@@_fntef_shipout_tl { - \exp_after:wN \cs_set_eq:NN - \exp_after:wN \CJKsymbol - \exp_after:wN \@@_save_under_dot_CJKsymbol:N - \l_@@_underdot_output_tl + \l_@@_underdot_shipout_tl + \cs_set_eq:NN \CJKsymbol \@@_save_under_CJKsymbol:N } } -\tl_new:N \l_@@_underdot_output_tl +\tl_new:N \l_@@_fntef_shipout_tl +\tl_new:N \l_@@_underdot_shipout_tl +\tl_set:Nn \l_@@_underdot_shipout_tl + { + \cs_set_eq:NN \CJKf@global \scan_stop: + \int_zero:N \CJK@nest \CJK@postUnderdot + } +\@@_add_to_shipout:n { \l_@@_fntef_shipout_tl } % \end{macrocode} % \end{macro} % @@ -7314,7 +7601,7 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ \skip_vertical:n {#1} \hbox_to_zero:n { - \tex_kern:D - \box_wd:N \l_@@_tmp_box + \tex_kern:D \box_wd:N \l_@@_tmp_box \tex_hss:D \box_use:N \CJK@underdotBox \tex_hss:D } \tex_vss:D @@ -7327,10 +7614,8 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_under_CJKsymbol:N #1 { - \@@_save_under_dot_CJKsymbol:N {#1} - \hbox_overlap_left:n { \box_use:N \g_@@_under_symbol_box } - { \xeCJK_make_node:n { CJK } } - \xeCJK_ignore_spaces:w + \hbox_overlap_right:n { \box_use:N \g_@@_under_symbol_box } + \xeCJK_no_break: \@@_save_under_CJKsymbol:N {#1} } % \end{macrocode} % \end{macro} @@ -7426,22 +7711,15 @@ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ % 和页脚的影响。} % 为使代码行号结果正确,需要在 \cs{lst@numberstyle} 中恢复 \cs{XeTeXinterchartoks}。 % 在 \texttt{listings} 环境中换页时,对 \cs{XeTeXinterchartoks} 的修改会影响到 -% 页眉和页脚,需要在 \cs{output} 中恢复成正常定义。这里使用 \cs{use:n} 是为了在 -% \cs{tex_output:D} 中不增加额外的分组。加入 \cs{tex_noindent:D} 是为了防止汉字 -% 出现在首行的时候可能会产生额外空行。 +% 页眉和页脚,需要在 \cs{shipout} 盒子中恢复成正常定义。加入 \cs{tex_noindent:D} +% 是为了防止汉字出现在首行的时候可能会产生额外空行。 % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_listings_initial_hook: { \tex_noindent:D \bool_gset_false:N \g_@@_listings_IVS_bool \tl_put_left:Nn \lst@numberstyle { \l_@@_restore_listings_toks_tl } - \tex_output:D \exp_after:wN \exp_after:wN \exp_after:wN - { - \exp_after:wN \exp_after:wN - \exp_after:wN \l_@@_restore_listings_toks_tl - \exp_after:wN \use:n - \tex_the:D \tex_output:D - } + \@@_add_to_shipout:n { \l_@@_restore_listings_toks_tl } \lst@ifbreaklines \cs_set_eq:NN \@@_listings_CJK_toks: \@@_listings_breaklines_toks: \fi: @@ -8627,7 +8905,7 @@ x^2+y^2 \begin{document} -\section{\textsf{xeCJKfntef} 的简单测试文件} +\section{\textsf{xeCJKfntef} 的\CJKunderdot{简单测试文件}} \CJKunderline{汉 字}\CJKunderline{加下划线} \varCJKunderline{汉字}\varCJKunderline{加下划线} @@ -8673,11 +8951,14 @@ x^2+y^2 % % \begin{macrocode} \documentclass{article} +\usepackage[draft,columns=1,margin=false,headings=false]{typogrid} \usepackage{xeCJK} +\usepackage{xeCJKfntef} \setCJKmainfont{SimSun} +\xeCJKsetup{AllowBreakBetweenPuncts} \xeCJKDeclarePunctStyle { mine } { - fixed-punct-ratio = 0 , + fixed-punct-ratio = nan , fixed-margin-width = 0 pt , mixed-margin-width = \maxdimen , mixed-margin-ratio = 0.5 , @@ -8685,8 +8966,11 @@ x^2+y^2 middle-margin-ratio = 0.5 , add-min-bound-to-margin = true , min-bound-to-kerning = true , - kerning-margin-minimum = 0.1 em + kerning-margin-minimum = 0.1 em , + bound-punct-width = 0 em , + enabled-hanging = true } +\xeCJKDeclarePunctStyle { JIS } { bound-punct-ratio = .5 } \begin{document} \setlength\parindent{2em} @@ -8694,18 +8978,22 @@ x^2+y^2 \texttt{------ #1 ------}\par\xeCJKsetup{PunctStyle=#1}\showtexts\par} \newcommand\showtexts{% +《第一回\quad 甄士隐梦幻识通灵\quad 贾雨村风尘怀闺秀》\\ +《第一回\quad 甄士隐梦幻识通灵\quad 贾雨村风尘怀闺秀》 + 列位看官:你道此书从何而来?说起根由,虽近荒唐,细按则深有趣味。待在下将此来历注明,方使阅者了然不惑。 -原来女娲氏炼石补天之时,于大荒山无稽崖炼成高经十二丈、方经二十四丈顽石三万六千五百零一块。娲皇氏只用了三万六千五百块,只单单剩了一块未用,便弃在此山青埂峰下。谁知此石自经煆炼之后,灵性已通,因见众石俱得补天,独自己无材不堪入选,遂自怨自叹,日夜悲号惭愧。 +\CJKunderline*{原来女娲氏炼石补天之时,于大荒山无稽崖炼成高经十二丈、方经二十四丈顽石三万六千五百零一块。娲皇氏只用了三万六千五百块,只单单剩了一块未用,便弃在此山青埂峰下。谁知此石自经煆炼之后,灵性已通,因见众石俱得补天,独自己无材不堪入选,遂自怨自叹,日夜悲号惭愧。} 一日,正当嗟悼之际,俄见一僧一道远远而来,生得骨格不凡,丰神迥别,说说笑笑,来至峰下,坐于石边,高谈快论:先是说些云山雾海、神仙玄幻之事,后便说到红尘中荣华富贵。此石听了,不觉打动凡心,也想要到人间去享一享这荣华富贵,但自恨粗蠢,不得已,便口吐人言,向那僧道说道:“大师,弟子蠢物,不能见礼了!适闻二位谈那人世间荣耀繁华,心切慕之。弟子质虽粗蠢,性却稍通,况见二师仙形道体,定非凡品,必有补天济世之材,利物济人之德。如蒙发一点慈心,携带弟子得入红尘,在那富贵场中,温柔乡里受享几年,自当永佩洪恩,万劫不忘也!”二仙师听毕,齐憨笑道:“善哉,善哉!那红尘中有却有些乐事,但不能永远依恃;况又有‘美中不足,好事多磨’八个字紧相连属,瞬息间则又乐极悲生,人非物换,究竟是到头一梦,万境归空,倒不如不去的好。”这石凡心已炽,那里听得进这话去,乃复苦求再四。二仙知不可强制,乃叹道:“此亦静极思动,无中生有之数也!既如此,我们便携你去受享受享,只是到不得意时,切莫后悔!”石道:“自然,自然。”那僧又道:“若说你性灵,却又如此质蠢,并更无奇贵之处。如此也只好踮脚而已。也罢!我如今大施佛法,助你助,待劫终之日,复还本质,以了此案。你道好否?”石头听了,感谢不尽。那僧便念咒书符,大展幻术,将一块大石登时变成一块鲜明莹洁的美玉,且又缩成扇坠大小的可佩可拿。那僧托于掌上,笑道:“形体倒也是个宝物了!还只没有实在的好处,须得再镌上数字,使人一见便知是奇物方妙。然后好携你到那昌明隆盛之邦、诗礼簪缨之族、花柳繁华地、温柔富贵乡去安身乐业。”石头听了,喜不能禁,乃问:“不知赐了弟子那哪几件奇处?又不知携了弟子到何地方?望乞明示,使弟子不惑。”那僧笑道:“你且莫问,日后自然明白的。”说着,便袖了这石,同那道人飘然而去,竟不知投奔何方何舍。 \hfill -——曹雪芹《红楼梦》} +——曹雪芹《红楼梦》\unskip\unkern} \showexample{mine} \showexample{quanjiao} +\showexample{JIS} \showexample{banjiao} \showexample{CCT} \showexample{kaiming} diff --git a/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins b/Master/texmf-dist/source/xelatex/xecjk/xeCJK.ins index 70a8176ed79..ed3e6954415 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 510 2013-08-15 23:20:17Z sobenlee $ +%% $Id: xeCJK.dtx 525 2013-11-11 06:32:00Z sobenlee $ %% $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ %% ----------------------------------------------------------------- %% Author: @@ -37,7 +37,7 @@ \askforoverwritefalse \preamble -$Id: xeCJK.dtx 510 2013-08-15 23:20:17Z sobenlee $ +$Id: xeCJK.dtx 525 2013-11-11 06:32:00Z sobenlee $ $URL: https://ctex-kit.googlecode.com/svn/trunk/xeCJK/xeCJK.dtx $ ----------------------------------------------------------------- Author: -- cgit v1.2.3