diff options
Diffstat (limited to 'language/chinese/ctex')
-rw-r--r-- | language/chinese/ctex/ctex.dtx | 488 | ||||
-rw-r--r-- | language/chinese/ctex/ctex.pdf | bin | 1214489 -> 1149510 bytes |
2 files changed, 311 insertions, 177 deletions
diff --git a/language/chinese/ctex/ctex.dtx b/language/chinese/ctex/ctex.dtx index a1af5c1bf5..81488b12ef 100644 --- a/language/chinese/ctex/ctex.dtx +++ b/language/chinese/ctex/ctex.dtx @@ -443,7 +443,7 @@ Copyright and Licence %<class|style|ctexcap|ctexhook|ctexpatch>\NeedsTeXFormat{LaTeX2e} %<class>\input{ctexbackend.cfg} %<class|style|ctexcap|ctexhook|ctexpatch>\RequirePackage{expl3} -%<+!driver>\GetIdInfo$Id: ctex.dtx 07425fe 2021-03-14 16:43:36 +0800 Xiangdong Zeng <xdzeng96@gmail.com> $ +%<+!driver>\GetIdInfo$Id: ctex.dtx 6604451 2021-06-20 17:08:49 +0800 Qing Lee <sobenlee@gmail.com> $ %<ctex> {Chinese adapter in LaTeX (CTEX)} %<ctex>\ProvidesExplPackage{\ExplFileName} %<ctexsize> {Chinese font size definition (CTEX)} @@ -530,7 +530,7 @@ Copyright and Licence %<founder>\ProvidesExplFile{ctex-fontset-founder.def} %<ubuntu> {Ubuntu fonts definition (CTEX)} %<ubuntu>\ProvidesExplFile{ctex-fontset-ubuntu.def} -%<!driver> {\ExplFileDate}{2.5.6}{\ExplFileDescription} +%<!driver> {\ExplFileDate}{2.5.7}{\ExplFileDescription} %</!(fd|ctexspa|dict|backend)> %<c19&rm>\ProvidesFile{c19rm.fd}% %<c19&sf>\ProvidesFile{c19sf.fd}% @@ -548,10 +548,10 @@ Copyright and Licence %<backend>\ProvidesFile{ctexbackend.cfg}% %<dict&theorem&GBK>\ProvidesDictionary{translator-theorem-dictionary}{ChineseGBK}% %<dict&theorem&UTF8>\ProvidesDictionary{translator-theorem-dictionary}{ChineseUTF8}% -%<fd> [2021/03/14 v2.5.6 Chinese font definition (CTEX)] -%<ctexspa> [2021/03/14 v2.5.6 Space info for CJKpunct (CTEX)] -%<backend> [2021/03/14 v2.5.6 Backend configuration file (CTEX)] -%<dict&theorem> [2021/03/14 v2.5.6 Chinese translation for theorem name (CTEX)] +%<fd> [2021/06/20 v2.5.7 Chinese font definition (CTEX)] +%<ctexspa> [2021/06/20 v2.5.7 Space info for CJKpunct (CTEX)] +%<backend> [2021/06/20 v2.5.7 Backend configuration file (CTEX)] +%<dict&theorem> [2021/06/20 v2.5.7 Chinese translation for theorem name (CTEX)] %</!(driver|readme|install|zhmap|spa|docstrip)> %<*driver> \documentclass{ctxdoc} @@ -575,7 +575,7 @@ Copyright and Licence % \changes{v2.4.15}{2019/03/23}{同步 \LaTeXiii{} 2019/03/05。} % \changes{v2.5.1}{2020/05/02}{\pkg{zhconv} 更名为 \pkg{ctex-zhconv}。} % -% \CheckSum{6335} +% \CheckSum{6400} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z @@ -3177,7 +3177,6 @@ Copyright and Licence % \item \pkg{expl3}、\pkg{xparse} 和 \pkg{l3keys2e} 宏包。它们属于 \pkg{l3kernel} % 和 \pkg{l3packages} 宏集。 % \item \pkg{indentfirst} 宏包,属于 \pkg{tools} 宏集。 -% \item \pkg{everysel} 宏包,属于 \pkg{ms} 宏集。 % \item \pkg{zhnumber} 宏包。 % \item[\ding{229}] 以上是各种编译方式都必需的依赖项。 % \item \pkg{CJK} 宏集。 @@ -3215,7 +3214,6 @@ Copyright and Licence % \end{itemize} % \item \pkg{fontspec} 宏包。 % \item[\ding{229}] 以上是使用 \LuaLaTeX{} 编译时的依赖项。 -% \item \pkg{pxeverysel} 宏包,属于 \pkg{platex-tools} 宏集。 % \item \pkg{zhmetrics-uptex} 宏包。 % \item[\ding{229}] 以上是使用 \upLaTeX{} 编译时的依赖项。 % \end{itemize} @@ -3294,34 +3292,6 @@ Copyright and Licence %<@@=ctex> % \end{macrocode} % -% 宏包载入检查。 -% \begin{macrocode} -%<*class|ctex> -\tl_const:Nx \c_@@_version_tl - { \cs_if_exist_use:cF { ver@ \@currname . \@currext } { 9999/99/99 } } -%<*class> -\cs_new_eq:cN { ver@ctex. \@pkgextension } \c_@@_version_tl -\cs_new_eq:cN { ver@ctexcap. \@pkgextension } \c_@@_version_tl -\cs_new_eq:cN { ver@ctexsize. \@pkgextension } \c_@@_version_tl -\cs_new_eq:cN { ver@ctexheading. \@pkgextension } \c_@@_version_tl -%</class> -%<*ctex> -\msg_new:nnnn { ctex } { subpackage-loaded } - { Package~`#1'~can~not~be~loaded~with~`ctex'. } - { - `#1'~is~actually~a~part~of~`ctex'.\\ - It~is~not~necessary~to~load~it~separately. - } -\@ifpackageloaded { ctexsize } - { \msg_error:nnn { ctex } { subpackage-loaded } { ctexsize } } - { \cs_new_eq:cN { ver@ctexsize. \@pkgextension } \c_@@_version_tl } -\@ifpackageloaded { ctexheading } - { \msg_error:nnn { ctex } { subpackage-loaded } { ctexheading } } - { \cs_new_eq:cN { ver@ctexheading. \@pkgextension } \c_@@_version_tl } -%</ctex> -%</class|ctex> -% \end{macrocode} -% % \begin{macrocode} %<*class|style> \RequirePackage { xparse , l3keys2e } @@ -3387,9 +3357,36 @@ Copyright and Licence % \begin{macrocode} %<!ctexsize>\RequirePackage { ctexhook , ctexpatch } %<!ctexheading>\RequirePackage { fix-cm } +% \end{macrocode} +% +% 宏包载入检查。 +% \begin{macrocode} +%<*class|ctex> +%<*class> +\ctex_disable_package:n { ctex } +\ctex_disable_package:n { ctexcap } +%</class> +\ctex_disable_package:n { ctexsize } +\ctex_disable_package:n { ctexheading } +%</class|ctex> +% \end{macrocode} +% +% \changes{v2.5.7}{2021/06/04}{兼容 \LaTeX \ 2021/06/01 的字体钩子。} +% +% \begin{variable}{\c_@@_everysel_loaded_bool} +% \LaTeX \ 2021-06-01 以后的版本内建了 \pkg{everysel} 包的功能。 +% \begin{macrocode} %<*!ctexsize> -%<!ctexheading>\RequirePackage { everysel } +%<*!ctexheading> +\ctex_if_format_at_least:nTF { 2021/06/01 } + { \bool_const:Nn \c_@@_everysel_loaded_bool { \c_false_bool } } + { + \RequirePackage { everysel } + \bool_const:Nn \c_@@_everysel_loaded_bool { \c_true_bool } + } +%</!ctexheading> % \end{macrocode} +% \end{variable} % % \subsection{内部函数与变量} % @@ -3417,7 +3414,6 @@ Copyright and Licence { \keys_set:nn { ctex } } \cs_new_protected:Npn \ctex_set:nn #1 { \keys_set:nn { ctex / #1 } } -%</!ctexsize> % \end{macrocode} % \end{macro} % @@ -3425,54 +3421,9 @@ Copyright and Licence % \changes{v2.5.4}{2020/08/02}{应用 \pkg{l3cctab}。} % \changes{v2.5.5}{2020/10/17}{放弃应用 \pkg{l3cctab}。} % -% \begin{macro}[int]{\ctex_file_input:n} -% 输入文件,关闭 \LaTeXiii 语法环境,并设置 |@| 为字母类、|^| 为上标和 \tn{endlinechar} 为 $13$。 -% \begin{macrocode} -\cs_new_protected:Npn \ctex_file_input:n #1 - { - \ctex_push_file: - \file_input:n {#1} - \ctex_pop_file: - } -\cs_new_protected:Npn \ctex_push_file: - { - \seq_gpush:Nx \g_@@_file_status_seq - { - { - \bool_if:NTF \l__kernel_expl_bool - { \ExplSyntaxOn } - { \ExplSyntaxOff } - } - { \char_value_catcode:n { 64 } } - { \char_value_catcode:n { 94 } } - { \int_use:N \tex_endlinechar:D } - } - \ExplSyntaxOff - \char_set_catcode_letter:n { 64 } - \char_set_catcode_math_superscript:n { 94 } - \int_set:Nn \tex_endlinechar:D { 13 } - } -\cs_new_protected:Npn \ctex_pop_file: - { - \seq_gpop:NN \g_@@_file_status_seq \l_@@_file_status_tl - \exp_after:wN \@@_pop_file_aux:nnnn \l_@@_file_status_tl - } -\cs_new_protected:Npn \@@_pop_file_aux:nnnn #1#2#3#4 - { - #1 - \char_set_catcode:nn { 64 } {#2} - \char_set_catcode:nn { 94 } {#3} - \int_set:Nn \tex_endlinechar:D {#4} - } -\tl_new:N \l_@@_file_status_tl -\seq_new:N \g_@@_file_status_seq -% \end{macrocode} -% \end{macro} -% % \begin{macro}[int]{\ctex_scheme_input:n} % 输入 \opt{scheme} 文件。先查找当前文档类下的 \meta{scheme},找不到再查找一般的文件。 % \begin{macrocode} -%<*!ctexsize> \cs_new_protected:Npn \ctex_scheme_input:n #1 { \ctex_push_file: @@ -4142,14 +4093,20 @@ Copyright and Licence \cs_new_protected:Npn \ctex_use_zhmap: { \tl_use:N \g_@@_zhmap_tl } \cs_if_exist:NTF \ctex_gadd_ltxhook:nn - { \ctex_gadd_ltxhook:nn { shipout/firstpage } { \ctex_use_zhmap: } } + { + \cs_new_protected:Npn \ctex_at_shipout_first:n + { \ctex_gadd_ltxhook:nn { shipout/firstpage } } + \ctex_at_shipout_first:n { \ctex_use_zhmap: } + } { \cs_new_protected:Npn \ctex_add_dvi_zhmap: { \AtBeginDvi { \ctex_use_zhmap: } } \ctex_after_end_preamble:n { \ctex_add_dvi_zhmap: } \ctex_at_end_package:nn { atbegshi } { - \AtBeginShipoutFirst { \ctex_use_zhmap: } + \cs_new_protected:Npn \ctex_at_shipout_first:n + { \AtBeginShipoutFirst } + \ctex_at_shipout_first:n { \ctex_use_zhmap: } \cs_gset_eq:NN \ctex_add_dvi_zhmap: \prg_do_nothing: } } @@ -4189,30 +4146,40 @@ Copyright and Licence % \end{macrocode} % \end{macro} % +% \changes{v2.5.7}{2021/06/06}{更好地兼容 \pkg{cmap} 包。} +% % \begin{macro}[int]{\ctex_add_cmap:n} +% \changes{v2.5.7}{2021/06/06}{确保 cmap 文件存在。} % 给 |#1| 编码的 CJK 字体加上 CMap。 % \begin{macrocode} \cs_new_protected:Npn \ctex_add_cmap:n #1 { \cs_if_free:NF \CJK@plane - { \ctex_add_cmap:cn { @@_add_cmap_ #1 \CJK@plane : } {#1} } + { \exp_args:Ne \@@_add_cmap_auxi:n { #1 \CJK@plane } } } -\cs_new_protected:Npn \ctex_add_cmap:Nn #1#2 +\cs_new_protected:Npn \@@_add_cmap_auxi:n #1 + { \exp_args:Nc \@@_add_cmap_auxii:Nn { @@_add_cmap_ #1 : } {#1} } +\cs_new_protected:Npn \@@_add_cmap_auxii:Nn #1#2 { \cs_if_exist:NF #1 { \@@_save_cmap:Nn #1 {#2} } #1 } -\cs_generate_variant:Nn \ctex_add_cmap:Nn { c } \cs_new_protected:Npn \@@_save_cmap:Nn #1#2 { - \tl_set:Nx \l_@@_tmp_tl { \str_lowercase:n {#2} \CJK@plane } - \tex_immediate:D \tex_pdfobj:D stream ~ file { \l_@@_tmp_tl .cmap } - \cs_new_protected:Npx #1 + \exp_args:Ne \file_get_full_name:nNTF + { \str_lowercase:n {#2} .cmap } \l_@@_cmap_file_tl { - \exp_not:N \tex_pdffontattr:D \exp_not:N \tex_font:D - { /ToUnicode ~ \int_use:N \tex_pdflastobj:D \c_space_tl 0 ~ R } + \tex_immediate:D \tex_pdfobj:D stream ~ file { \l_@@_cmap_file_tl } + \cs_new_protected:Npx #1 + { + \pdfnobuiltintounicode \tex_font:D + \tex_pdffontattr:D \tex_font:D + { /ToUnicode ~ \int_value:w \tex_pdflastobj:D \c_space_tl 0 ~ R } + } } + { \cs_new_eq:NN #1 \prg_do_nothing: } } +\tl_new:N \l_@@_cmap_file_tl % \end{macrocode} % \end{macro} % @@ -4228,7 +4195,10 @@ Copyright and Licence { \CTEX@Family@CMap {#1} {#2} } { \ctex_at_end_package:nn { cmap } - { \cs_gset_eq:NN \CTEX@Family@CMap \use_none:nn } + { + \cs_gset_eq:NN \ctex_add_cmap:n \use_none:n + \cs_gset_eq:NN \CTEX@Family@CMap \use_none:nn + } } { \ctex_patch_failure:N \DeclareFontFamily } } @@ -4273,10 +4243,7 @@ Copyright and Licence % \end{macrocode} % % \begin{macro}[int]{\ctex_CJK_input:n,\CJK@input} -% \pkg{breqn} 包可能会在正文中将 |^| 的 \tn{catcode} 改为 $12$ 或 $13$,这将 -% 破坏 \pkg{CJK} 对汉字的首字节的定义(\tn{CJK@loadBinding} 和 -% \tn{CJK@loadEncoding})。因此需要确保载入 \file{.enc} 和 \file{.bdg} 文件时, -% |^| 的 \tn{catcode} 为 $7$。同时要设置 \tn{endlinechar} 为 $-1$。 +% 载入 \pkg{CJK} 包的 \file{.enc} 和 \file{.bdg} 等文件时,需要设置 \tn{endlinechar} 为 $-1$。 % \begin{macrocode} \cs_new_protected:Npn \ctex_CJK_input:n #1 { @@ -4296,27 +4263,43 @@ Copyright and Licence % \footnote{\url{https://github.com/CTeX-org/ctex-kit/issues/146}}。 % 我们在这里给出 \tn{CJK@surr} 的一个不依赖 \tn{uppercase} 的实现。 % \begin{macrocode} -\if_cs_exist:N \CJK@surr - \cs_new_protected:Npn \ctex_plane_to_utfxvibe:Nn #1#2 - { - \tl_set:Nx \l_@@_tmp_tl {#2} - \int_set:Nn \l_@@_tmp_int - { \exp_args:No \int_from_hex:n { \l_@@_tmp_tl } } - \int_compare:nNnTF \l_@@_tmp_int < { 256 } - { \tl_gset:Nx #1 { \int_to_Hex:n { \l_@@_tmp_int } } } - { - \int_sub:Nn \l_@@_tmp_int { 256 } - \tl_gset:Nx #1 - { - \int_to_Hex:n - { \int_div_truncate:nn { \l_@@_tmp_int } { 4 } + "D800 } - \int_to_Hex:n - { \int_mod:nn { \l_@@_tmp_int } { 4 } + "DC } - } - } - } - \cs_set_eq:NN \CJK@surr \ctex_plane_to_utfxvibe:Nn -\fi: +\cs_if_free:NF \CJK@surr + { + \cs_new_protected:Npn \ctex_plane_to_utfxvibe:Nn #1#2 + { + \int_set:Nn \l_@@_tmp_int + { \exp_args:Ne \int_from_hex:n {#2} } + \int_compare:nNnTF \l_@@_tmp_int < { 256 } + { \tl_gset:Nx #1 { \int_to_Hex:n { \l_@@_tmp_int } } } + { + \int_sub:Nn \l_@@_tmp_int { 256 } + \tl_gset:Nx #1 + { + \int_to_Hex:n + { \int_div_truncate:nn { \l_@@_tmp_int } { 4 } + "D800 } + \int_to_Hex:n + { \int_mod:nn { \l_@@_tmp_int } { 4 } + "DC } + } + } + } + \cs_set_eq:NN \CJK@surr \ctex_plane_to_utfxvibe:Nn + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\CJK@addcmap} +% \changes{v2.5.7}{2021/06/06}{应用 \tn{pdfnobuiltintounicode}。} +% \LaTeX \ 2021-06-01 默认载入 \file{glyphtounicode.tex},我们对 CJK 字体禁用这一内建设置。 +% \begin{macrocode} +\cs_if_free:NF \CJK@addcmap + { + \ctex_patch_cmd:Nnn \CJK@addcmap + { \pdffontattr \font@name } + { + \pdfnobuiltintounicode \font@name + \pdffontattr \font@name + } + } % \end{macrocode} % \end{macro} % @@ -4565,7 +4548,13 @@ Copyright and Licence } \@ifpackageloaded { luatexja } { \msg_critical:nnx { ctex } { luatexja-loaded } { \g_file_curr_name_str } } - { \tl_const:cn { ver@ltj-latex.\@pkgextension } { 9999/99/99 } } + { + \ctex_at_begin_package:nn { luatexja } + { \msg_redirect_name:nnn { ctex } { disable-package } { info } } + \ctex_at_end_package:nn { luatexja } + { \msg_redirect_name:nnn { ctex } { disable-package } { } } + \ctex_disable_package:n { ltj-latex } + } % \end{macrocode} % % \begin{macrocode} @@ -4580,6 +4569,13 @@ Copyright and Licence { \msg_error:nnn { ctex } { package-too-old } { fontspec } } % \end{macrocode} % +% 引擎文件是通过 \cs{ctex_file_input:n} 载入的,其中的 \tn{catcodetable} 机制会完整恢复 +% 文件载入之前的 \tn{catcode} 状态,在引擎文件中的 \tn{catcode} 设置都无效。 +% 因此,对 \tn{ltjlineendcomment} 的设置要放到文件之外进行。 +% \begin{macrocode} +\ctex_at_end:n { \char_set_catcode_comment:n { \ltjlineendcomment } } +% \end{macrocode} +% % \paragraph{\pkg{LuaTeX-ja} 的默认设置} % % \begin{macrocode} @@ -6393,7 +6389,8 @@ Copyright and Licence % \pkg{everysel} 宏包(2011/10/28)未考虑 \upLaTeX{} 对 \tn{selectfont} 的修 % 改,需要引入 \pkg{pxeverysel} 宏包。 % \begin{macrocode} -\RequirePackage { pxeverysel } +\bool_if:NT \c_@@_everysel_loaded_bool + { \RequirePackage { pxeverysel } } % \end{macrocode} % % \begin{macrocode} @@ -6580,11 +6577,15 @@ Copyright and Licence % \end{macrocode} % \end{macro} % +% \changes{v2.5.7}{2021/06/06}{禁用 \dvipdfmx\ 驱动的 \opt{unicode} 书签设置。} +% % 在 \pdfTeX{} 下使用 \texttt{GBK} 编码,\dvipdfmx{} 驱动可以直接用它的 % \tn{special} 命令,其他模式用 \pkg{xCJK2uni} 宏包处理。使用 \texttt{UTF-8} 编 % 码时,\pkg{CJKutf8} 已经处理了书签问题,但仍需要设置 \opt{pdfencoding} 为 % \opt{unicode},目的是在书签的开头写入 BOM (|\376\377|),提示这是 % \texttt{UTF-16BE} 字节流。 +% \pkg{hyperref} 2021-02-04 版开始默认设置 \opt{unicode} 为 \opt{true}, +% 对于 \dvipdfmx\ 驱动,我们需要禁用这个设置,为此设置 \opt{pdfencoding} 为 \opt{pdfdoc}。 % \begin{macrocode} %<*pdftex> \ctex_hypersetup:n { driverfallback = dvipdfmx } @@ -6594,11 +6595,12 @@ Copyright and Licence \sys_if_output_pdf:TF { \ctex_at_end_package:nn { hyperref } { \RequirePackage { xCJK2uni } } } { + \ctex_hypersetup:n { pdfencoding = pdfdoc } \ctex_at_end_package:nn { hyperref } { \str_if_eq:onTF { \Hy@driver } { hdvipdfm } { - \AtBeginShipoutFirst + \ctex_at_shipout_first:n { \special { pdf:tounicode~GBK-EUC-UCS2 } } } { \RequirePackage { xCJK2uni } } @@ -6619,9 +6621,16 @@ Copyright and Licence % 置。注意 \upTeX{} 需要使用 UTF8-UTF16 的编码转换。 % \begin{macrocode} %<*uptex|aptex> -\ctex_hypersetup:n { driverfallback = dvipdfmx } +\ctex_hypersetup:n + { + driverfallback = dvipdfmx , + pdfencoding = pdfdoc + } \ctex_at_end_package:nn { hyperref } - { \AtBeginShipoutFirst { \special { pdf:tounicode~UTF8-UTF16 } } } + { + \ctex_at_shipout_first:n + { \special { pdf:tounicode~UTF8-UTF16 } } + } %</uptex|aptex> % \end{macrocode} % @@ -6759,13 +6768,6 @@ Copyright and Licence % \begin{macro}[int]{\ctex_add_to_selectfont:n,\CTEX@selectfont@hook} % \changes{v2.4.13}{2018/03/23}{修正导言区 \tn{selectfont} 钩子位置。} % \changes{v2.5}{2020/04/19}{兼容 \pkg{KOMA-Script} 的 \tn{selectfont} 补丁。} -% -% \tn{EverySelectfont} 直到文档开始时才有效。为了 \tn{ccwd} 和 \pkg{LuaTeX-ja} 的 -% 字体设置在导言区也可用,我们还需要在这里手工修改 \tn{selectfont}。\pkg{everysel} -% 宏包会用 \tn{CheckCommand} 来检查 \tn{selectfont} 是否为标准定义。我们修改了 -% \tn{selectfont},所以会给出一个警告。为了消除这个警告,在它检查之前,还原本来 -% 定义。\pkg{pxeverysel} 宏包取消了检查,但也需要恢复定义,避免重复使用钩子。 -% \pkg{KOMA-Script} 宏包也会进行检查,我们需要小心处理。 % \begin{macrocode} \cs_new_protected:Npn \ctex_add_to_selectfont:n #1 { @@ -6773,49 +6775,68 @@ Copyright and Licence { \exp_not:o { \CTEX@selectfont@hook #1 } } } \cs_new_eq:NN \CTEX@selectfont@hook \prg_do_nothing: -\if_cs_exist:N \@EverySelectfont@Init - \group_begin: - \cs_set:Npn \@@_tmp:N #1 - { - \tl_set:Nn \l_@@_tmp_tl {#1} - \cs_new_eq:NN \CTEX@selectfont@save #1 - \cs_new_protected:Npn \@@_restore_selectfont: - { - \cs_if_free:NF \scr@new@selectfont - { +% \end{macrocode} +% 使用 \pkg{everysel} 包的情况。 +% \tn{EverySelectfont} 直到文档开始时才有效。为了 \tn{ccwd} 和 \pkg{LuaTeX-ja} 的 +% 字体设置在导言区也可用,我们还需要在这里手工修改 \tn{selectfont}。\pkg{everysel} +% 宏包会用 \tn{CheckCommand} 来检查 \tn{selectfont} 是否为标准定义。我们修改了 +% \tn{selectfont},所以会给出一个警告。为了消除这个警告,在它检查之前,还原本来 +% 定义。\pkg{pxeverysel} 宏包取消了检查,但也需要恢复定义,避免重复使用钩子。 +% \pkg{KOMA-Script} 宏包也会进行检查,我们需要小心处理。 +% \begin{macrocode} +\if_bool:N \c_@@_everysel_loaded_bool + \if_cs_exist:N \@EverySelectfont@Init + \group_begin: + \cs_set:Npn \@@_tmp:N #1 + { + \tl_set:Nn \l_@@_tmp_tl {#1} + \cs_new_eq:NN \CTEX@selectfont@save #1 + \cs_new_protected:Npn \@@_restore_selectfont: + { + \cs_if_free:NF \scr@new@selectfont + { % \end{macrocode} % \pkg{CJK} 直接修改 \tn{selectfont} 和 \pkg{pxeverysel} 的补丁, % 会使 \pkg{KOMA-Script} 的 \tn{par@update} 失效。 % \begin{macrocode} %<*pdftex|uptex|aptex> - \cs_if_free:NF \par@update + \cs_if_free:NF \par@update %<*uptex|aptex> - { - \tl_put_right:Nn \@EverySelectfont@Init - { \tl_put_right:Nn #1 { \par@update } } - } + { + \tl_put_right:Nn \@EverySelectfont@Init + { \tl_put_right:Nn #1 { \par@update } } + } %</uptex|aptex> %<*pdftex> - { \tl_put_right:Nn #1 { \par@update } } - \cs_set_eq:NN \scr@selectfont \CTEX@selectfont@save + { \tl_put_right:Nn #1 { \par@update } } + \cs_set_eq:NN \scr@selectfont \CTEX@selectfont@save %</pdftex> %</pdftex|uptex|aptex> - \cs_set_eq:NN \scr@new@selectfont #1 -%<!pdftex> \cs_set_eq:NN \CTEX@selectfont@save \scr@selectfont - } - \tl_put_left:Nn \@EverySelectfont@Init - { \cs_set_eq:NN #1 \CTEX@selectfont@save } - \cs_undefine:N \@@_restore_selectfont: - } - } - \ctex_parse_name:NN \@@_tmp:N \selectfont - \exp_last_unbraced:NNo \group_end: - \ctex_patch_cmd_once:NnnnTF { \l_@@_tmp_tl } - { \ExplSyntaxOff } - { \size@update } - { \CTEX@selectfont@hook \size@update } - { \@@_restore_selectfont: } - { \ctex_patch_failure:N \selectfont } + \cs_set_eq:NN \scr@new@selectfont #1 +%<!pdftex> \cs_set_eq:NN \CTEX@selectfont@save \scr@selectfont + } + \tl_put_left:Nn \@EverySelectfont@Init + { \cs_set_eq:NN #1 \CTEX@selectfont@save } + \cs_undefine:N \@@_restore_selectfont: + } + } + \ctex_parse_name:NN \@@_tmp:N \selectfont + \exp_last_unbraced:NNo \group_end: + \ctex_patch_cmd_once:NnnnTF { \l_@@_tmp_tl } + { \ExplSyntaxOff } + { \size@update } + { \CTEX@selectfont@hook \size@update } + { \@@_restore_selectfont: } + { \ctex_patch_failure:N \selectfont } + \fi: + \cs_new_protected:Npn \ctex_gadd_selectfont_hook:n + { \EverySelectfont } +% \end{macrocode} +% 使用 \LaTeX \ 2021-06-01 的新钩子,不使用 \pkg{everysel} 包的情况。 +% \begin{macrocode} +\else: + \cs_new_protected:Npn \ctex_gadd_selectfont_hook:n + { \ctex_gadd_ltxhook:nn { selectfont } } \fi: % \end{macrocode} % \end{macro} @@ -6823,10 +6844,11 @@ Copyright and Licence % \tn{CJK@plane} 有定义,说明处于 \pkg{CJK} 宏包的 \tn{CJKsymbol} 之内,不必使用钩子。 % \begin{macrocode} %<*pdftex> -\EverySelectfont { \cs_if_exist:NF \CJK@plane { \CTEX@selectfont@hook } } +\ctex_gadd_selectfont_hook:n + { \cs_if_exist:NF \CJK@plane { \CTEX@selectfont@hook } } %</pdftex> %<*xetex|luatex|uptex|aptex> -\EverySelectfont { \CTEX@selectfont@hook } +\ctex_gadd_selectfont_hook:n { \CTEX@selectfont@hook } %</xetex|luatex|uptex|aptex> % \end{macrocode} % @@ -9072,13 +9094,18 @@ Copyright and Licence % % \changes{v2.5.3}{2020/06/04}{兼容 \pkg{cleveref}。} % \changes{v2.5.4}{2020/06/17}{同时兼容 \pkg{cleveref} 和 \pkg{hyperref}。} +% \changes{v2.5.7}{2021/06/04}{同时兼容 \pkg{cleveref} 和 \cls{beamer}。} % \begin{macro}{\ctex_cleveref_hook:,\@@_cleveref_hook_aux:N} % 需要将\pkg{cleveref} 包对应命令中 |\p@|\meta{counter} 的参数及时展开,以兼容 \tn{labelformat}。 % \begin{macrocode} \cs_new_protected:Npn \ctex_cleveref_hook: { \@ifpackageloaded { hyperref } - { \@@_cleveref_hook_aux:N \H@refstepcounter } + { + \@ifpackagewith { hyperref } { implicit = false } + { } + { \@@_cleveref_hook_aux:N \H@refstepcounter } + } { \@@_cleveref_hook_aux:N \refstepcounter@noarg \@@_cleveref_hook_aux:N \refstepcounter@optarg @@ -9761,8 +9788,8 @@ Copyright and Licence % \begin{macrocode} \int_case:nn { \g_@@_font_size_int } { - { 0 } { \ctex_file_input:n { ctex-c5size.clo } } - { 1 } { \ctex_file_input:n { ctex-cs4size.clo } } + { 0 } { \file_input:n { ctex-c5size.clo } } + { 1 } { \file_input:n { ctex-cs4size.clo } } } % \end{macrocode} % @@ -10891,17 +10918,17 @@ Copyright and Licence % 文件标识信息。 % \begin{macrocode} %<adobe>\ProvidesFile{ctex-zhmap-adobe.tex}% -%<adobe> [2021/03/14 v2.5.6 Adobe font map loader for DVIPDFMx (CTEX)] +%<adobe> [2021/06/20 v2.5.7 Adobe font map loader for DVIPDFMx (CTEX)] %<fandol>\ProvidesFile{ctex-zhmap-fandol.tex}% -%<fandol> [2021/03/14 v2.5.6 Fandol font map loader for DVIPDFMx (CTEX)] +%<fandol> [2021/06/20 v2.5.7 Fandol font map loader for DVIPDFMx (CTEX)] %<founder>\ProvidesFile{ctex-zhmap-founder.tex}% -%<founder> [2021/03/14 v2.5.6 Founder font map loader for pdfTeX and DVIPDFMx (CTEX)] +%<founder> [2021/06/20 v2.5.7 Founder font map loader for pdfTeX and DVIPDFMx (CTEX)] %<mac>\ProvidesFile{ctex-zhmap-mac.tex}% -%<mac> [2021/03/14 v2.5.6 Mac font map loader for DVIPDFMx (CTEX)] +%<mac> [2021/06/20 v2.5.7 Mac font map loader for DVIPDFMx (CTEX)] %<ubuntu>\ProvidesFile{ctex-zhmap-ubuntu.tex}% -%<ubuntu> [2021/03/14 v2.5.6 Ubuntu font map loader for DVIPDFMx (CTEX)] +%<ubuntu> [2021/06/20 v2.5.7 Ubuntu font map loader for DVIPDFMx (CTEX)] %<windows>\ProvidesFile{ctex-zhmap-windows.tex}% -%<windows> [2021/03/14 v2.5.6 Windows font map loader for pdfTeX and DVIPDFMx (CTEX)] +%<windows> [2021/06/20 v2.5.7 Windows font map loader for pdfTeX and DVIPDFMx (CTEX)] % \end{macrocode} % % \paragraph{\pkg{ctex-zhmap-adobe.tex}} @@ -11463,6 +11490,113 @@ Copyright and Licence %<*ctexhook> % \end{macrocode} % +% \begin{macro}[int]{\ctex_if_format_at_least:nTF} +% 与 \tn{IfFormatAtLeastTF} 同义。 +% \begin{macrocode} +\cs_new:Npn \ctex_if_format_at_least:nTF + { \@ifl@t@r \fmtversion } +% \end{macrocode} +% \end{macro} +% +% \changes{v2.5.7}{2021/06/12}{重新应用 \pkg{l3cctab}。} +% +% \begin{macro}[int]{\ctex_file_input:n,\ctex_push_file:,\ctex_pop_file:} +% 输入文件,关闭 \LaTeXiii 语法环境,并设置 |@| 为字母类,利用 \pkg{l3cctab} 实现。 +% 我们使用 \cs{file_input:n} 而不是 \LaTeXe \ 的 \tn{input} 或者 \tn{InputIfFileExists} +% 载入文件,因此 \LaTeXe \ 的文件钩子都\emph{无效}。 +% \begin{macrocode} +\cs_new_protected:Npn \ctex_file_input:n #1 + { + \ctex_push_file: + \file_input:n {#1} + \ctex_pop_file: + } +\bool_if_exist:NTF \l__kernel_expl_bool + { + \cs_new_protected:Npn \ctex_push_file: + { + \seq_gpush:Nx \g_@@_expl_status_seq + { \bool_if:NTF \l__kernel_expl_bool { 1 } { 0 } } + \bool_set_false:N \l__kernel_expl_bool + \cctab_begin:N \c_@@_package_cctab + } + \cs_new_protected:Npn \ctex_pop_file: + { + \cctab_end: + \seq_gpop:NN \g_@@_expl_status_seq \l_@@_expl_status_tl + \int_if_odd:nTF { \l_@@_expl_status_tl } + { \bool_set_true:N \l__kernel_expl_bool } + { \bool_set_false:N \l__kernel_expl_bool } + } + \tl_new:N \l_@@_expl_status_tl + \seq_new:N \g_@@_expl_status_seq + } + { + \cs_new_protected:Npn \ctex_push_file: + { \cctab_begin:N \c_@@_package_cctab } + \cs_new_protected:Npn \ctex_pop_file: + { \cctab_end: } + } +\cctab_const:Nn \c_@@_package_cctab + { + \cctab_select:N \c_document_cctab + \char_set_catcode_letter:n { 64 } + } +% \end{macrocode} +% \end{macro} +% +% \changes{v2.5.7}{2021/06/09}{使用 \tn{disable@package@load} 禁止宏包载入。} +% +% \begin{macro}[int]{\ctex_disable_package:n} +% 禁止宏包载入。采用 \LaTeX \ 2020-10-01 提供的 \tn{disable@package@load} 实现, +% 否则采用传统方式:预定义 |\ver@|\meta{package}|.sty| 标识符。 +% \begin{macrocode} +\cs_new_protected:Npn \ctex_disable_package:n #1 + { + \@ifpackageloaded {#1} + { \msg_error:nnxx } + { \@@_disable_package_aux:nnnn } + { ctex } { disable-package } {#1} { \@currname } + } +\cs_new_protected:Npx \@@_disable_package_aux:nnnn #1#2#3#4 + { + \cs_if_exist:NTF \disable@package@load + { + \exp_args:Nnx \exp_not:N \disable@package@load {#3} + { \msg_warning:nnnn {#1} {#2} {#3} {#4} } + } + { \tl_const:cn { ver@ #3 . \exp_not:N \@pkgextension } { 9999/99/99 } } + } +\msg_new:nnn { ctex } { disable-package } + { Package~`#1'~can~not~be~loaded~with~`#2'. } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\ctex_replace_package:nn} +% 替换宏包。采用 \LaTeX \ 2020-10-01 提供的 \tn{declare@file@substitution} 实现, +% 否则给出无效警告。 +% \begin{macrocode} +\ctex_if_format_at_least:nTF { 2020/10/01 } + { + \cs_new_protected:Npn \ctex_replace_package:nn #1#2 + { + \declare@file@substitution + { #1 . \@pkgextension } + { #2 . \@pkgextension } + } + } + { + \cs_new_protected:Npn \ctex_replace_package:nn + { \msg_warning:nnnn { ctex } { replace-package-invalid } } + \msg_new:nnn { ctex } { replace-package-invalid } + { + \token_to_str:N \ctex_replace_package:nn \{#1\}\{#2\}~is~invalid~ + before~LaTeX~2020-10-01. + } + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[int]{\ctex_at_begin_package:nn} % 如果宏包已经被载入,则钩子无效,给出警告。 % \begin{macrocode} @@ -11499,7 +11633,7 @@ Copyright and Licence % % \LaTeX \ 2020/10/01 开始提供常用钩子管理机制。在新机制下,我们只需要做简单的包装。 % \begin{macrocode} -\@ifl@t@r \fmtversion { 2020/10/01 } +\ctex_if_format_at_least:nTF { 2020/10/01 } { \cs_new_protected:Npx \ctex_gadd_ltxhook:nn #1 { \hook_gput_code:nnn {#1} { \c_novalue_tl } } diff --git a/language/chinese/ctex/ctex.pdf b/language/chinese/ctex/ctex.pdf Binary files differindex 76adf7b92c..073c674a84 100644 --- a/language/chinese/ctex/ctex.pdf +++ b/language/chinese/ctex/ctex.pdf |