From 9591c0c57b007ba49f15f0970009bc27efa23db4 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Thu, 14 May 2015 21:23:11 +0000
Subject: ctex (14may15)

git-svn-id: svn://tug.org/texlive/trunk@37393 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/latex/ctex/ctexart.cls | 1265 +++++++++++++++++++++++++-
 1 file changed, 1236 insertions(+), 29 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/ctex/ctexart.cls')

diff --git a/Master/texmf-dist/tex/latex/ctex/ctexart.cls b/Master/texmf-dist/tex/latex/ctex/ctexart.cls
index c6bc963160c..31ce3f77e79 100644
--- a/Master/texmf-dist/tex/latex/ctex/ctexart.cls
+++ b/Master/texmf-dist/tex/latex/ctex/ctexart.cls
@@ -1,29 +1,1236 @@
-% ctexart.cls
-
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesClass{ctexart}
-  [2014/06/09 v1.02d ctexart
-   document class]
-
-\def\CTEX@classtoload{article}
-
-\input{ctex-common-opts.def}
-\input{ctex-caption-opts.def}
-\input{ctex-class-opts.def}
-
-\InputIfFileExists{ctexopts.cfg}{}{}
-
-\input{ctex-loadclass.def}
-
-\input{ctex-common.def}
-\input{ctex-caption.def}
-\input{ctex-class.def}
-\input{ctex-article.def}
-
-% ctex.cfg should be loaded very last
-\AtEndOfPackage{%
-  \makeatletter
-  \InputIfFileExists{ctex.cfg}{}{}
-  \makeatother}
-
-\endinput
+%%
+%% This is file `ctexart.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ctex.dtx  (with options: `class,article')
+%% 
+%%     Copyright (C) 2003--2015
+%%     CTEX.ORG and any individual authors listed in the documentation.
+%% ------------------------------------------------------------------------------
+%% 
+%%     This work may be distributed and/or modified under the
+%%     conditions of the LaTeX Project Public License, either
+%%     version 1.3c of this license or (at your option) any later
+%%     version. This version of this license is in
+%%        http://www.latex-project.org/lppl/lppl-1-3c.txt
+%%     and the latest version of this license is in
+%%        http://www.latex-project.org/lppl.txt
+%%     and version 1.3 or later is part of all distributions of
+%%     LaTeX version 2005/12/01 or later.
+%% 
+%%     This work has the LPPL maintenance status `maintained'.
+%% 
+%%     The Current Maintainers of this work are Leo Liu, Qing Lee and Liam Huang.
+%% 
+%% ------------------------------------------------------------------------------
+%% 
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{expl3}
+\GetIdInfo$Id: ctex.dtx 3d246c0 2015-05-11 23:20:45 +0800 Qing Lee <sobenlee@gmail.com> $
+  {Chinese adapter for class article (CTEX)}
+\ProvidesExplClass{ctexart}
+  {\ExplFileDate}{2.0}{\ExplFileDescription}
+\RequirePackage { xparse , l3keys2e }
+\msg_new:nnnn { ctex } { l3-too-old }
+  { Support~package~`#1'~too~old. }
+  {
+    Please~update~an~up~to~date~version~of~the~bundles\\\\
+    `l3kernel'~and~`l3packages'\\\\
+    using~your~TeX~package~manager~or~from~CTAN.
+  }
+\@ifpackagelater { expl3 } { 2014/07/20 } { }
+  { \msg_error:nnn { ctex } { l3-too-old } { expl3 } }
+\@ifpackagelater { l3keys2e } { 2014/05/05 } { }
+  { \msg_error:nnn { ctex } { l3-too-old } { l3keys2e } }
+\RequirePackage { etoolbox , ifpdf , fix-cm , everysel }
+\tl_new:N \l__ctex_tmp_tl
+\int_new:N \l__ctex_tmp_int
+\dim_new:N \l__ctex_tmp_dim
+\box_new:N \l__ctex_tmp_box
+\msg_new:nnnn { ctex } { package-too-old }
+  { Support~package~`#1'~too~old. }
+  {
+    Please~update~an~up~to~date~version~of~the~package~`#1'\\
+    using~your~TeX~package~manager~or~from~CTAN.
+  }
+\cs_new_eq:NN \ctex_lua_now_x:n \luatex_directlua:D
+\ifpdf
+  \cs_new_eq:NN \ctex_if_pdfmode:TF \use_i:nn
+\else:
+  \cs_new_eq:NN \ctex_if_pdfmode:TF \use_ii:nn
+\fi:
+\prg_new_conditional:Npnn \ctex_if_preamble: { TF }
+  {
+    \if_meaning:w \@onlypreamble \@notprerr
+      \prg_return_false:
+    \else:
+      \prg_return_true:
+    \fi:
+  }
+\cs_new_protected:Npn \ctex_at_end_package:nn #1#2
+  {
+    \@ifpackageloaded { #1 }
+      { #2 }
+      { \ctex_add_hook:cn { g__ctex_at_end_ #1 _hook_tl } { #2 } }
+  }
+\cs_new_protected:Npn \ctex_add_hook:Nn #1#2
+  {
+    \tl_if_exist:NF #1 { \tl_new:N #1 }
+    \tl_gput_right:Nn #1 { #2 }
+  }
+\cs_generate_variant:Nn \ctex_add_hook:Nn { c }
+\cs_new_protected_nopar:Npn \ctex_package_end_hook:n #1
+  {
+    \cs_if_exist_use:cT { g__ctex_at_end_ #1 _hook_tl }
+      { \cs_undefine:c { g__ctex_at_end_ #1 _hook_tl } }
+  }
+\cs_generate_variant:Nn \ctex_package_end_hook:n { o }
+\tl_put_left:Nn \@popfilename
+  { \ctex_package_end_hook:o { \@currname } }
+\cs_new_protected:Npn \ctex_file_wrapper:nnn #1#2#3
+  {
+    \use:x
+      {
+        \ExplSyntaxOff
+        \char_set_catcode_letter:n { 64 }
+        #1
+        \exp_not:n {#2}
+        \bool_if:NTF \l__kernel_expl_bool
+          { \ExplSyntaxOn }
+          { \ExplSyntaxOff }
+        \char_set_catcode:nn { 64 } { \char_value_catcode:n { 64 } }
+        #3
+      }
+  }
+\cs_new_protected_nopar:Npn \ctex_file_input:n #1
+  { \ctex_file_wrapper:nnn { } { \file_input:n {#1} } { } }
+\cs_new_protected_nopar:Npn \ctex_scheme_input:n #1
+  {
+    \ctex_file_wrapper:nnn
+      { }
+      {
+        \tl_if_exist:NTF \c__ctex_class_tl
+          {
+            \file_if_exist_input:nF { ctex-scheme- #1 - \c__ctex_class_tl .def }
+              { \file_input:n  { ctex-scheme- #1 .def } }
+          }
+          { \file_input:n  { ctex-scheme- #1 .def } }
+      }
+      { }
+  }
+\cs_generate_variant:Nn \ctex_scheme_input:n { o }
+\cs_new_protected:Npn \ctex_parse_name:NN #1#2
+  { \ctex_parse_name:NNx #1#2 { \cs_to_str:N #2 } }
+\group_begin:
+\char_set_lccode:nn { `\< } { `\{ }
+\char_set_lccode:nn { `\/ } { `\\ }
+\char_set_lccode:nn { `\A } { `\t }
+\tl_map_function:nN { \A \E \S \O \P } \char_set_catcode_other:N
+\tex_lowercase:D
+  {
+    \group_end:
+    \cs_new_protected:Npn \ctex_parse_name:NNn #1#2#3
+      {
+        \bool_if:nTF { \cs_if_exist_p:c { #3 ~ } || \cs_if_exist_p:c { /#3 } }
+          {
+            \group_begin:
+            \use:x
+              {
+                \__ctex_parse_name:nNNNnN { \token_get_replacement_spec:N #2 }
+                  \exp_not:N #2 \exp_not:c { #3 ~ } \exp_not:c { /#3 } {#3}
+              } #1
+          }
+          { #1#2 }
+      }
+    \cs_new_protected:Npn \__ctex_parse_name:nNNNnN #1#2#3#4#5#6
+      {
+        \group_end:
+        \exp_args:Nc #6
+          {
+            \str_case:nnTF {#1}
+              {
+                { \protect #3 } { }
+                { \x@protect #2 \protect #3 } { }
+              }
+              {
+                \str_if_eq_x:nnTF { \exp_not:n { /@protected@ #3 /#3 } }
+                  {
+                    \exp_last_unbraced:Nf \__ctex_parse_name:w
+                    \token_get_replacement_spec:N #3 AESAOPA ~ < \q_stop
+                  }
+                  { /#5 ~ } { #5 ~ }
+              }
+              {
+                \str_case:onTF { \__ctex_parse_name:w #1 AESAOPA ~ < \q_stop }
+                  {
+                    { /@protected@ #2 #4 } { }
+                    { /@ #4 } { }
+                  }
+                  { /#5 } {#5}
+              }
+          }
+      }
+    \cs_new:Npn \__ctex_parse_name:w #1 AESAOPA ~ #2 < #3 \q_stop { #1#2 }
+  }
+\cs_generate_variant:Nn \ctex_parse_name:NNn { NNx }
+\cs_new_protected:Npn \ctex_patch_cmd:NnnTF { \ctex_parse_name:NN \patchcmd }
+\cs_new_protected:Npn \ctex_preto_cmd:NnTF  { \ctex_parse_name:NN \pretocmd }
+\cs_new_protected:Npn \ctex_appto_cmd:NnTF  { \ctex_parse_name:NN \apptocmd }
+\cs_new_protected:Npn \ctex_patch_cmd:Nnn
+  {
+    \group_begin:
+    \char_set_catcode_other:N \#
+    \__ctex_patch_cmd:Nnn
+  }
+\cs_new_protected:Npn \__ctex_patch_cmd:Nnn #1#2#3
+  {
+    \group_end:
+    \group_begin:
+    \ExplSyntaxOff
+    \ctex_patch_cmd:NnnTF #1 {#2} {#3}
+      {
+        \cs_gset_eq:NN \__ctex_tmp:w #1
+        \group_end:
+        \cs_set_eq:NN #1 \__ctex_tmp:w
+        \cs_undefine:N \__ctex_tmp:w
+      }
+      { \group_end: \ctex_patch_failure:N #1 }
+  }
+\cs_new_protected:Npn \ctex_patch_failure:N #1
+  { \msg_warning:nnx { ctex } { patch-failure } { \token_to_str:N #1 } }
+\msg_new:nnn { ctex } { patch-failure }
+  {
+    Patching~command~`#1'~failed.\\
+    ctex~may~not~work~as~expected.
+  }
+\cs_new:Npn \ctex_set_default_ccwd:Nn #1#2
+  {
+    \dim_compare:nNnTF
+      { \ctex_default_pt:n {#2} } = { \ctex_default_pt:n { #2 ~ mm } }
+      { \tl_set:Nn #1 {#2} }
+      { \tl_set:Nn #1 { #2 \ccwd } }
+  }
+\cs_new:Npn \ctex_default_pt:n #1
+  {
+    \exp_after:wN \__ctex_default_pt:w
+      \dim_use:N \etex_dimexpr:D #1 pt \scan_stop: \q_stop
+  }
+\group_begin:
+  \char_set_catcode_other:N \P
+  \char_set_catcode_other:N \T
+\tex_lowercase:D
+  {
+    \group_end:
+    \cs_new:Npn \__ctex_default_pt:w #1 PT #2 \q_stop { #1 PT }
+  }
+\tl_new:N \l__ctex_encoding_tl
+\tl_set:Nx \l__ctex_encoding_tl
+  { \pdftex_if_engine:TF { GBK } { UTF8 } }
+\cs_new_eq:NN \g__ctex_section_depth_flag \c_two
+\bool_new:N \g__ctex_zhmCJK_bool
+\tl_new:N \l__ctex_autoindent_tl
+\cs_new_eq:NN \ctex_if_autoindent_touched:F \use:n
+\cs_new_eq:NN \ctex_zhmap_case:nnn \use_ii:nnn
+\cs_new_protected_nopar:Npn \ctex_at_end:n { \AtEndOfClass }
+\clist_new:N \g__ctex_std_options_clist
+\msg_new:nnn { ctex } { invalid-option }
+  { Option~`\l_keys_key_tl'~is~invalid~in~current~mode. }
+\msg_new:nnn { ctex } { invalid-value }
+  { Value~`#1'~is~invalid~for~the~key~`\l_keys_key_tl'. }
+\msg_new:nnn { ctex } { deprecated-option }
+  { Option~ `\l_keys_key_tl'~ is~ deprecated.\\ #1 }
+\msg_new:nnn { ctex } { deprecated-command }
+  { Command~ #1 is~ deprecated.\\ #2 }
+\msg_new:nnn { ctex } { deprecated-environment }
+  { Environment~ `#1'~ is~ deprecated.\\ #2 }
+\cs_new_eq:NN \g__ctex_font_size_flag \c_minus_one
+\keys_define:nn { ctex / option }
+  {
+    zihao .choice: ,
+    zihao .default:n = { 5 } ,
+    zihao /     5  .code:n = { \cs_gset_eq:NN \g__ctex_font_size_flag \c_zero } ,
+    zihao /    -4  .code:n = { \cs_gset_eq:NN \g__ctex_font_size_flag \c_one } ,
+    zihao / false  .code:n = { \cs_gset_eq:NN \g__ctex_font_size_flag \c_two } ,
+    c5size  .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { Option~ `zihao=5'~ is~ set. }
+        \keys_set:nn { ctex / option } { zihao = 5 }
+      } ,
+    cs4size  .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { Option~ `zihao=-4'~ is~ set. }
+        \keys_set:nn { ctex / option } { zihao = -4 }
+      } ,
+    c5size  .value_forbidden: ,
+    cs4size .value_forbidden: ,
+    linespread  .fp_set:N = \l__ctex_line_spread_fp ,
+    linespread .initial:n = { \c_nan_fp } ,
+    linespread .value_required: ,
+    autoindent .choice: ,
+    autoindent .default:n = { true } ,
+    autoindent / true    .code:n =
+      {
+        \tl_set:Nn \l__ctex_autoindent_tl { 2 \ccwd }
+        \cs_set_eq:NN \ctex_if_autoindent_touched:F \use_none:n
+      } ,
+    autoindent / false   .code:n =
+      {
+        \tl_clear:N \l__ctex_autoindent_tl
+        \cs_set_eq:NN \ctex_if_autoindent_touched:F \use_none:n
+      } ,
+    autoindent / unknown .code:n =
+      {
+        \ctex_set_default_ccwd:Nn \l__ctex_autoindent_tl {#1}
+        \cs_set_eq:NN \ctex_if_autoindent_touched:F \use_none:n
+      } ,
+    indent .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          {
+            The~ indentfirst~ package~ will~ be~ loaded~ but~ the~
+            functionality~ may~ be~ removed~ in~ later~ version.
+            It's~ better~ to~ set~ the~ heading~ styles~ via~ beforeskip~
+            options.~
+          }
+        \keys_set:nn { ctex / option } { autoindent = true }
+      } ,
+    indent .value_forbidden: ,
+    noindent .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          {
+            The~ functionality~ has~ been~ removed.~
+            It's~ better~ to~ set~ the~ heading~ styles~ via~ beforeskip~
+            options.
+          }
+        \keys_set:nn { ctex / option } { autoindent = false }
+      } ,
+    noindent .value_forbidden: ,
+    GBK  .code:n = { \tl_set:Nn \l__ctex_encoding_tl { GBK } } ,
+    UTF8 .code:n = { \tl_set:Nn \l__ctex_encoding_tl { UTF8 } } ,
+    GBK  .value_forbidden: ,
+    UTF8 .value_forbidden: ,
+    fontset    .tl_gset:N = \g__ctex_fontset_tl ,
+    nofonts    .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          {
+            Option~ `fontset=none'~ is~ set.~ It~ is~ better~ to~ use~
+            fontset~ option.
+          }
+        \keys_set:nn { ctex / option } { fontset = none }
+      } ,
+    adobefonts .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          {
+            Option~ `fontset=adobe'~ is~ set.~ It~ is~ better~ to~ use~
+            fontset~ option.
+          }
+        \keys_set:nn { ctex / option } { fontset = none }
+      } ,
+    winfonts   .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          {
+            Option~ `fontset=windows'~ is~ set.~ It~ is~ better~ to~ use~
+            fontset~ option.
+          }
+        \keys_set:nn { ctex / option } { fontset = none }
+      } ,
+    nofonts    .value_forbidden: ,
+    winfonts   .value_forbidden: ,
+    adobefonts .value_forbidden: ,
+    zhmap .choice: ,
+    zhmap .default:n = { true } ,
+    zhmap / zhmCJK .code:n =
+      {
+        \bool_gset_true:N \g__ctex_zhmCJK_bool
+        \cs_gset_eq:NN \ctex_zhmap_case:nnn \use_i:nnn
+      } ,
+    zhmap / true   .code:n =
+      {
+        \bool_gset_false:N \g__ctex_zhmCJK_bool
+        \cs_gset_eq:NN \ctex_zhmap_case:nnn \use_ii:nnn
+      } ,
+    zhmap / false  .code:n =
+      {
+        \bool_gset_false:N \g__ctex_zhmCJK_bool
+        \cs_gset_eq:NN \ctex_zhmap_case:nnn \use_iii:nnn
+      } ,
+    nozhmap   .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { Option~ `zhmap=false'~ is~ set. }
+        \keys_set:nn { ctex / option } { zhmap = false }
+      } ,
+    nozhmap   .value_forbidden: ,
+    punct   .tl_set:N = \l__ctex_punct_tl ,
+    punct  .default:n = { quanjiao } ,
+    punct  .initial:n = { quanjiao } ,
+    nopunct   .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { Option~ `punct=plain'~ is~ set.  }
+        \keys_set:nn { ctex / option } { punct = plain }
+      } ,
+    nopunct   .value_forbidden: ,
+    space .choices:nn =
+      { true , auto , false }
+      {
+        \exp_args:Nx \ctex_at_end:n
+          { \keys_set:nn { ctex } { space = \l_keys_choice_tl } }
+      } ,
+    space  .default:n = { true } ,
+    nospace   .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { Option~ `space=false'~ is~ set. }
+        \keys_set:nn { ctex / option } { space = false }
+      } ,
+    nospace   .value_forbidden: ,
+    heading .bool_set:N = \l__ctex_heading_bool ,
+    scheme .tl_set:N  = \l__ctex_scheme_tl ,
+    scheme .default:n = { chinese },
+    scheme .initial:n = { chinese },
+    cap    .code:n    =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { Option~ `scheme = chinese' ~ is~ set. }
+        \keys_set:nn { ctex / option } { scheme = chinese }
+      } ,
+    nocap  .code:n    =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { Option~ `scheme = plain' ~ is~ set. }
+        \keys_set:nn { ctex / option } { scheme = plain }
+      } ,
+    cap    .value_forbidden: ,
+    nocap  .value_forbidden: ,
+    sub3section .code:n =
+      { \cs_gset_eq:NN \g__ctex_section_depth_flag \c_three } ,
+    sub4section .code:n =
+      { \cs_gset_eq:NN \g__ctex_section_depth_flag \c_four } ,
+    sub3section .value_forbidden: ,
+    sub4section .value_forbidden: ,
+    fntef    .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { `(xe)CJKfntef'~ package~ is~ always~ loaded. }
+      } ,
+    fancyhdr .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { `fancyhdr'~ package~ is~ loaded. }
+        \RequirePackage{ fancyhdr }
+      } ,
+    hyperref .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { `hyperref'~ package~ will~ be~ loaded. }
+        \AtEndPreamble { \RequirePackage { hyperref } }
+      } ,
+  }
+\tl_clear:N \l__ctex_tmp_tl
+\clist_map_inline:nn
+  {
+    10pt , 11pt , 12pt ,
+     8pt ,  9pt , 14pt , 17pt , 20pt , 25pt , 30pt , 36pt , 48pt , 60pt
+  }
+  {
+    \tl_put_right:Nn \l__ctex_tmp_tl
+      {
+        #1 .code:n =
+          {
+            \cs_gset_eq:NN \g__ctex_font_size_flag \c_minus_one
+            \clist_gput_right:Nn \g__ctex_std_options_clist {#1}
+          } ,
+        #1 .value_forbidden: ,
+      }
+  }
+\use:x { \keys_define:nn { ctex / option } { \exp_not:o { \l__ctex_tmp_tl } } }
+\tl_clear:N \l__ctex_tmp_tl
+\keys_define:nn { ctex / option }
+  {
+    unknown .code:n =
+      { \clist_gput_right:No \g__ctex_std_options_clist { \CurrentOption } }
+  }
+\ctex_file_input:n { ctexopts.cfg }
+\ProcessKeysOptions { ctex / option }
+\if_case:w \g__ctex_font_size_flag
+  \clist_gput_right:Nn \g__ctex_std_options_clist { 10pt }
+\or:
+  \clist_gput_right:Nn \g__ctex_std_options_clist { 12pt }
+\fi:
+\tl_const:Nn \c__ctex_class_tl { article }
+\PassOptionsToClass { \g__ctex_std_options_clist } { article }
+\LoadClass { article }
+\tl_set_eq:Nc \l__ctex_tmp_tl { ver@ \@currname . \@currext }
+\cs_new_eq:cN { ver@ctex.     \@pkgextension } \l__ctex_tmp_tl
+\cs_new_eq:cN { ver@ctexcap.  \@pkgextension } \l__ctex_tmp_tl
+\cs_new_eq:cN { ver@ctexsize. \@pkgextension } \l__ctex_tmp_tl
+\NewDocumentCommand \ctexset { +m }
+  { \keys_set:nn { ctex } {#1} }
+\NewDocumentCommand \CTEXsetup { +o > { \TrimSpaces } m }
+  {
+    \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXsetup }
+      { \ctexset~ {~ #2~ =~ {~ #1~ }~ }~ is~ set. }
+    \IfNoValueF {#1} { \keys_set:nn { ctex / #2 } {#1} }
+  }
+\NewDocumentCommand \CTEXoptions { +o }
+  {
+    \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXoptions }
+      { \ctexset~ {~ #1~ }~ is~ set. }
+    \IfNoValueF {#1} { \keys_set:nn { ctex } {#1} }
+  }
+\@ifpackageloaded { hyperref }
+  {
+    \cs_new_protected_nopar:Npn \ctex_hypersetup:n #1
+      { \hypersetup {#1} }
+  }
+  {
+    \cs_new_protected_nopar:Npn \ctex_hypersetup:n #1
+      { \PassOptionsToPackage {#1} { hyperref } }
+  }
+\ctex_hypersetup:n { colorlinks = true }
+\pdftex_if_engine:TF
+  {
+    \tl_set:Nx \l__ctex_encoding_tl { \l__ctex_encoding_tl }
+    \ctex_file_input:n { ctex-engine-pdftex.def }
+  }
+  {
+    \tl_set:Nn \l__ctex_encoding_tl { UTF8 }
+    \xetex_if_engine:TF
+      { \ctex_file_input:n { ctex-engine-xetex.def } }
+      { \ctex_file_input:n { ctex-engine-luatex.def } }
+  }
+\keys_define:nn { ctex }
+  {
+    autoindent .choice: ,
+    autoindent .default:n = { true } ,
+    autoindent / true    .code:n =
+      {
+        \tl_set:Nn \l__ctex_autoindent_tl { 2 \ccwd }
+        \ctex_select_size:
+      } ,
+    autoindent / false   .code:n =
+      { \tl_clear:N \l__ctex_autoindent_tl } ,
+    autoindent / unknown .code:n =
+      {
+        \ctex_set_default_ccwd:Nn \l__ctex_autoindent_tl {#1}
+        \ctex_select_size:
+      }
+  }
+\NewDocumentCommand \CTEXsetfont { } { \ctex_select_size: }
+\cs_new_protected_nopar:Npn \ctex_select_size:
+  { \cs_if_free:NTF \size@update { \ctex_update_size: } { \selectfont } }
+\cs_new_protected_nopar:Npn \ctex_update_size:
+  {
+    \tl_if_eq:NNTF \l__ctex_ziju_tl \c__ctex_zero_tl
+      {
+        \ctex_update_stretch:
+        \ctex_update_parindent:
+      }
+      { \ctex_update_ziju: }
+  }
+\tl_const:Nx \c__ctex_zero_tl { \fp_use:N \c_zero_fp }
+\tl_new:N \l__ctex_ziju_tl
+\tl_set_eq:NN \l__ctex_ziju_tl \c__ctex_zero_tl
+\ctex_add_to_selectfont:n
+  { \cs_if_free:NF \size@update { \ctex_update_size: } }
+\keys_define:nn { ctex }
+  {
+    linestretch .code:n =
+      {
+        \ctex_set_default_ccwd:Nn \l__ctex_line_stretch_tl {#1}
+        \ctex_select_size:
+      } ,
+    linestretch .value_required:
+  }
+\tl_new:N \l__ctex_line_stretch_tl
+\tl_set:Nn \l__ctex_line_stretch_tl { \ccwd }
+\cs_new_protected_nopar:Npn \ctex_update_stretch:
+  {
+    \ctex_update_em_unit:
+    \dim_set:Nn \l__ctex_tmp_dim { \l__ctex_line_stretch_tl }
+    \dim_compare:nNnTF \l__ctex_tmp_dim = \c_max_dim
+      {
+        \ctex_if_ccglue_touched:TF
+          { \ctex_update_ccwd: }
+          {
+            \dim_set:Nn \l__ctex_tmp_dim
+              { \baselinestretch \etex_glueexpr:D \f@baselineskip \scan_stop: }
+            \skip_set:Nn \l__ctex_ccglue_skip
+              { \c_zero_dim plus .08 \l__ctex_tmp_dim }
+            \ctex_update_ccglue:
+          }
+      }
+      {
+        \int_set:Nn \l__ctex_tmp_int
+          { \etex_dimexpr:D \linewidth - \ccwd - \l__ctex_tmp_dim \scan_stop: }
+        \tex_divide:D \l__ctex_tmp_int \ccwd
+        \int_compare:nNnTF \l__ctex_tmp_int > \c_zero
+          {
+            \skip_set:Nn \l__ctex_ccglue_skip
+              {
+                \c_zero_dim plus \dim_eval:n
+                  {
+                    ( \linewidth - \ccwd - \l__ctex_tmp_int \ccwd ) /
+                    \l__ctex_tmp_int
+                  }
+              }
+          }
+          { \skip_zero:N \l__ctex_ccglue_skip }
+        \ctex_update_ccglue:
+      }
+  }
+\cs_new_protected_nopar:Npn \ctex_update_parindent:
+  {
+    \tl_if_empty:NF \l__ctex_autoindent_tl
+      {
+        \dim_compare:nNnF \parindent = \c_zero_dim
+          { \dim_set:Nn \parindent { \l__ctex_autoindent_tl } }
+      }
+  }
+\NewDocumentCommand \ziju { m }
+  { \exp_args:Nx \ctex_ziju:n {#1} \tex_ignorespaces:D }
+\cs_new_protected_nopar:Npn \ctex_ziju:n #1
+  {
+    \tl_set:Nx \l__ctex_ziju_tl { \fp_eval:n {#1} }
+    \ctex_select_size:
+  }
+\cs_new_protected_nopar:Npn \ctex_update_ziju:
+  {
+    \ctex_update_em_unit:
+    \dim_set:Nn \l__ctex_ziju_dim { \l__ctex_ziju_tl \ccwd }
+    \dim_add:Nn \ccwd { \l__ctex_ziju_dim }
+    \dim_compare:nNnTF \ccwd > \c_zero_dim
+      {
+        \dim_set:Nn \l__ctex_tmp_dim
+          { \linewidth - \ccwd + \l__ctex_ziju_dim }
+        \int_set:Nn \l__ctex_tmp_int { \l__ctex_tmp_dim }
+        \tex_divide:D \l__ctex_tmp_int \ccwd
+        \dim_sub:Nn \l__ctex_tmp_dim { \l__ctex_tmp_int \ccwd }
+        \dim_compare:nNnF \parindent = \c_zero_dim
+          {
+            \int_compare:nNnF \l__ctex_tmp_int < \c_three
+              { \int_sub:Nn \l__ctex_tmp_int { \c_two } }
+          }
+        \skip_set:Nn \l__ctex_ccglue_skip
+          {
+            \l__ctex_ziju_dim
+            plus  \dim_eval:n { \l__ctex_tmp_dim / \l__ctex_tmp_int }
+            minus \dim_min:nn { \dim_abs:n { \l__ctex_ziju_dim } }
+              { ( \ccwd - \l__ctex_tmp_dim ) / ( \l__ctex_tmp_int + \c_one ) }
+          }
+      }
+      { \skip_set:Nn \l__ctex_ccglue_skip { \l__ctex_ziju_dim } }
+    \ctex_update_ccglue:
+    \ctex_update_parindent:
+  }
+\dim_new:N \l__ctex_ziju_dim
+\NewDocumentCommand \CTEXindent { }
+  {
+    \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXindent }
+      { \parindent is~ set~ to~ 2\ccwd. }
+    \ctex_update_ccwd: \dim_set:Nn \parindent { 2 \ccwd }
+  }
+\NewDocumentCommand \CTEXnoindent { }
+  {
+    \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXnoindent }
+      { \parindent is~ set~ to~ 0pt. }
+    \dim_zero:N \parindent
+  }
+\bool_if:NT \l__ctex_indent_bool
+  { \RequirePackage { indentfirst } }
+\PassOptionsToPackage { encoding = \l__ctex_encoding_tl } { zhnumber }
+\RequirePackage { zhnumber }
+\cs_new_eq:NN \chinese \zhnum
+\cs_new_eq:NN \Chinese \chinese
+\cs_new_eq:NN \CTEXcounter \use_none:n
+\NewDocumentCommand \CTEXnumber { m m }
+  { \protected@edef #1 { \zhnumber {#2} } }
+\NewDocumentCommand \CTEXdigits { m m }
+  { \protected@edef #1 { \zhdigits {#2} } }
+\cs_set_eq:NN \CTEX@todayold \today
+\keys_define:nn { ctex }
+  {
+    today .choice: ,
+    today / old     .code:n =
+      { \cs_set_eq:NN \today \CTEX@todayold } ,
+    today / small   .code:n =
+      {
+        \cs_set_eq:NN \today \zhtoday
+        \zhnumsetup { time = Arabic }
+      } ,
+    today / big     .code:n =
+      {
+        \cs_set_eq:NN \today \zhtoday
+        \zhnumsetup { time = Chinese }
+      } ,
+    today / unknown .code:n =
+      { \msg_error:nnx { ctex } { today-undef } {#1} }
+  }
+\msg_new:nnnn { ctex } { today-undef }
+  { Today~format~`#1'~is~undefined. }
+  { Available~today~formats~are~`old',~`small',~and~`big'. }
+\keys_define:nn { ctex }
+  {
+    contentsname   .tl_set:N = \contentsname ,
+    listfigurename .tl_set:N = \listfigurename ,
+    listtablename  .tl_set:N = \listtablename ,
+    figurename     .tl_set:N = \figurename ,
+    tablename      .tl_set:N = \tablename ,
+    abstractname   .tl_set:N = \abstractname ,
+    indexname      .tl_set:N = \indexname ,
+    appendixname   .tl_set:N = \appendixname ,
+    bibname        .tl_set:N = \refname
+  }
+\seq_new:N \c__ctex_headings_seq
+\seq_gset_from_clist:Nn \c__ctex_headings_seq
+  {
+    part , section , subsection , subsubsection ,
+    paragraph , subparagraph
+  }
+\cs_new_protected_nopar:Npn \__ctex_initial_heading:n #1
+  {
+    \tl_new:c { CTEX@pre#1 }
+    \tl_new:c { CTEX@post#1 }
+    \tl_const:cx { CTEXthe#1 }
+      {
+        \exp_not:c { CTEX@pre#1 }
+        \exp_not:c { CTEX@the#1 }
+        \exp_not:c { CTEX@post#1 }
+      }
+    \tl_const:cx { CTEX@#1name }
+      {
+        \exp_not:c { CTEX@#1@nameformat }
+        \exp_not:c { CTEX@pre#1 }
+        \exp_not:N \tl_if_empty:NTF \exp_not:c { CTEX@#1@numberformat }
+          { \exp_not:c { CTEX@the#1 } }
+          {
+            \group_begin:
+              \exp_not:c { CTEX@#1@numberformat }
+              \exp_not:c { CTEX@the#1 }
+            \group_end:
+          }
+        \exp_not:c { CTEX@post#1 }
+        \exp_not:c { CTEX@#1@aftername }
+      }
+  }
+\cs_new_protected_nopar:Npn \__ctex_def_heading_keys:n #1
+  {
+    \tl_put_right:Nx \l__ctex_tmp_tl
+      {
+        #1                 .meta:nn = { ctex / #1 } { ####1 } ,
+        #1 / name           .code:n =
+          { \ctex_assign_heading_name:nn {#1} { ####1 } } ,
+        #1 / number       .tl_set:N = \exp_not:c { CTEX@the#1 } ,
+        #1 / format       .tl_set:N = \exp_not:c { CTEX@#1@format } ,
+        #1 / nameformat   .tl_set:N = \exp_not:c { CTEX@#1@nameformat } ,
+        #1 / numberformat .tl_set:N = \exp_not:c { CTEX@#1@numberformat } ,
+        #1 / aftername    .tl_set:N = \exp_not:c { CTEX@#1@aftername } ,
+        #1 / titleformat  .tl_set:N = \exp_not:c { CTEX@#1@titleformat } ,
+        #1 / beforeskip   .tl_set:N = \exp_not:c { CTEX@#1@beforeskip } ,
+        #1 / afterskip    .tl_set:N = \exp_not:c { CTEX@#1@afterskip} ,
+        #1 / indent       .tl_set:N = \exp_not:c { CTEX@#1@indent } ,
+        #1 / format+        .code:n =
+          { \tl_put_right:Nn \exp_not:c { CTEX@#1@format } { ####1 } } ,
+        #1 / nameformat+    .code:n =
+          { \tl_put_right:Nn \exp_not:c { CTEX@#1@nameformat } { ####1 } } ,
+        #1 / numberformat+  .code:n =
+          { \tl_put_right:Nn \exp_not:c { CTEX@#1@numberformat } { ####1 } } ,
+        #1 / aftername+     .code:n =
+          { \tl_put_right:Nn \exp_not:c { CTEX@#1@aftername } { ####1 } } ,
+        #1 / titleformat+   .code:n =
+          { \tl_put_right:Nn \exp_not:c { CTEX@#1@titleformat } { ####1 } } ,
+        #1 / beforeskip  .initial:n = \c_zero_skip ,
+        #1 / afterskip   .initial:n = \c_zero_skip ,
+        #1 / indent      .initial:n = \c_zero_dim ,
+        #1 / beforeskip  .value_required: ,
+        #1 / afterskip   .value_required: ,
+        #1 / indent      .value_required: ,
+      }
+  }
+\NewDocumentCommand \ctex_assign_heading_name:nn
+  { m > { \SplitArgument { \c_one } { , } } +m }
+  { \__ctex_assign_heading_name:nnn {#1} #2 }
+\cs_new_protected:Npn \__ctex_assign_heading_name:nnn #1#2#3
+  {
+    \tl_set:cn { CTEX@pre#1 } {#2}
+    \IfNoValueTF {#3}
+      { \tl_clear:c { CTEX@post#1 } }
+      { \tl_set:cn { CTEX@post#1 } {#3} }
+  }
+\tl_clear:N \l__ctex_tmp_tl
+\seq_map_inline:Nn \c__ctex_headings_seq
+  {
+    \__ctex_initial_heading:n {#1}
+    \__ctex_def_heading_keys:n {#1}
+  }
+\use:x { \keys_define:nn { ctex } { \exp_not:o { \l__ctex_tmp_tl } } }
+\tl_clear:N \l__ctex_tmp_tl
+\renewcommand\part{%
+   \if@noskipsec \leavevmode \fi
+   \par
+   \@tempskipa \CTEX@part@beforeskip \relax
+   \ifdim \@tempskipa <\z@
+     \@tempskipa -\@tempskipa \@afterindentfalse
+   \else
+     \@afterindenttrue
+   \fi
+   \addvspace{\@tempskipa}%
+   \secdef\@part\@spart}
+\def\@part[#1]#2{%
+  \ifnum \c@secnumdepth >\m@ne
+    \refstepcounter{part}%
+    \addcontentsline{toc}{part}{\CTEXthepart\hspace{1em}#1}%
+  \else
+    \addcontentsline{toc}{part}{#1}%
+  \fi
+  {\interlinepenalty \@M
+   \normalfont \parindent \CTEX@part@indent \CTEX@part@format
+   \ifnum \c@secnumdepth >\m@ne
+     \CTEX@partname
+   \fi
+   \CTEX@part@titleformat{#2}%
+   \markboth{}{}\par}%
+  \nobreak
+  \vskip \CTEX@part@afterskip
+  \@afterheading}
+\def\@spart#1{%
+    {\interlinepenalty \@M
+     \normalfont \parindent \CTEX@part@indent \CTEX@part@format
+     \CTEX@part@titleformat{#1}\par}%
+     \nobreak
+     \vskip \CTEX@part@afterskip
+     \@afterheading}
+\def\@seccntformat#1{%
+  \@ifundefined{CTEX@#1name}%
+    {\csname the#1\endcsname\quad}%
+    {\csname CTEX@#1name\endcsname}}
+\def\@sect#1#2#3#4#5#6[#7]#8{%
+  \ifnum #2>\c@secnumdepth
+    \let\@svsec\@empty
+  \else
+    \refstepcounter{#1}%
+    \protected@edef\@svsec{\@seccntformat{#1}\relax}%
+  \fi
+  \@tempskipa #5\relax
+  \ifdim \@tempskipa>\z@
+    \begingroup
+      #6{%
+        \@hangfrom{\hskip #3\relax\@svsec}%
+        \interlinepenalty \@M
+        \csname CTEX@#1@titleformat\endcsname{#8}\@@par}%
+    \endgroup
+    \csname #1mark\endcsname{#7}%
+    \addcontentsline{toc}{#1}{%
+      \ifnum #2>\c@secnumdepth \else
+        \protect\numberline{\@ifundefined{CTEXthe#1}%
+                              {\csname the#1\endcsname}%
+                              {\csname CTEXthe#1\endcsname}}%
+      \fi
+      #7}%
+  \else
+    \def\@svsechd{%
+    #6{\hskip #3\relax
+      \@svsec \csname CTEX@#1@titleformat\endcsname{#8}}%
+    \csname #1mark\endcsname{#7}%
+    \addcontentsline{toc}{#1}{%
+      \ifnum #2>\c@secnumdepth \else
+        \protect\numberline{\@ifundefined{CTEXthe#1}%
+                              {\csname the#1\endcsname}%
+                              {\csname CTEXthe#1\endcsname}}%
+      \fi
+      #7}}%
+  \fi
+  \@xsect{#5}}
+\def\@ssect#1#2#3#4#5{%
+  \@tempskipa #3\relax
+  \ifdim \@tempskipa>\z@
+    \begingroup
+      #4{%
+        \@hangfrom{\hskip #1}%
+          \interlinepenalty \@M
+          \CTEX@titleformat@n{#5}\@@par}%
+    \endgroup
+  \else
+    \def\@svsechd{#4{\hskip #1\relax \CTEX@titleformat@n{#5}}}%
+  \fi
+  \@xsect{#3}}
+\cs_new_protected_nopar:Npn \CTEX@set@titleformat@n #1
+  { \cs_set_eq:Nc \CTEX@titleformat@n { CTEX@#1@titleformat } }
+\cs_new_eq:NN \CTEX@titleformat@n \use:n
+\int_zero:N \l__ctex_tmp_int
+\clist_map_inline:nn
+  { section , subsection , subsubsection , paragraph , subparagraph }
+  {
+    \int_incr:N \l__ctex_tmp_int
+    \cs_gset_protected_nopar:cpx  {#1}
+      {
+        \exp_not:N \@startsection {#1}
+          { \int_use:N \l__ctex_tmp_int }
+          { \exp_not:c { CTEX@#1@indent } }
+          { \exp_not:c { CTEX@#1@beforeskip } }
+          { \exp_not:c { CTEX@#1@afterskip } }
+          {
+            \CTEX@set@titleformat@n {#1}
+            \exp_not:N \normalfont \exp_not:c { CTEX@#1@format }
+          }
+      }
+  }
+\tl_new:N \CTEX@preappendix
+\tl_new:N \CTEX@postappendix
+\keys_define:nn { ctex }
+  { appendix .meta:nn = { ctex / appendix } {#1} }
+\keys_define:nn { ctex / appendix }
+  {
+    name      .code:n = { \ctex_assign_heading_name:nn { appendix } {#1} } ,
+    number  .tl_set:N = \CTEX@appendixnumber
+  }
+\cs_new_eq:NN \CTEX@save@appendix \appendix
+\cs_gset_protected_nopar:Npn \appendix
+  {
+    \CTEX@save@appendix
+    \gdef \CTEX@presection { \CTEX@preappendix }
+    \gdef \CTEX@thesection { \CTEX@appendixnumber }
+    \gdef \CTEX@postsection { \CTEX@postappendix }
+  }
+\cs_new_protected:Npn \CTEX@toc@width@n #1
+  {
+    \hbox_set:Nn \l__ctex_tmp_box {#1}
+    \dim_set:Nn \@tempdima
+      {
+        \dim_max:nn { \@tempdima }
+          { \box_wd:N \l__ctex_tmp_box + \f@size \p@ / \c_two }
+      }
+  }
+\group_begin:
+\char_set_catcode_other:N \#
+\use:n
+  {
+    \group_end:
+    \ExplSyntaxOff
+    \ctex_preto_cmd:NnTF \numberline { \CTEX@toc@width@n {#1} } { }
+      { \ctex_patch_failure:N \numberline }
+    \@ifpackageloaded { tocloft }
+      { }
+      {
+        \ctex_at_end_package:nn { tocloft }
+          {
+            \ctex_preto_cmd:NnTF \numberline { \CTEX@toc@width@n {#1} } { }
+              { \ctex_patch_failure:N \numberline }
+          }
+      }
+    \ExplSyntaxOn
+  }
+\ctex_patch_cmd:Nnn \ps@headings { \thesection } { \CTEXthesection }
+\if@twoside
+  \ctex_patch_cmd:Nnn \ps@headings { \thesubsection } { \CTEXthesubsection }
+\fi:
+\ctex_at_end_package:nn { fancyhdr }
+  {
+    \ctex_patch_cmd:Nnn \ps@fancy
+      { \thesection \hskip 1em \relax } { \CTEXthesection \quad }
+    \ctex_patch_cmd:Nnn \ps@fancy
+      { \thesubsection \hskip 1em \relax } { \CTEXthesubsection \quad }
+  }
+\cs_new_protected_nopar:Npn \CTEX@setcurrentlabel@n #1
+  {
+    \protected@edef \@currentlabel
+      {
+        \cs_if_exist:cTF { CTEX@the#1 }
+          { \exp_args:cc { p@#1 } { CTEX@the#1 } }
+          { \exp_not:o { \@currentlabel } }
+      }
+  }
+\cs_new_protected_nopar:Npn \ctex_varioref_hook:
+  {
+    \seq_map_inline:Nn \c__ctex_headings_seq
+      { \ctex_fix_varioref_label:n { ##1 } }
+  }
+\cs_new_protected_nopar:Npn \ctex_fix_varioref_label:n #1
+  {
+    \tl_if_empty:cT { p@#1 }
+      { \exp_args:Nno \labelformat {#1} { \cs:w CTEX@the#1 \cs_end: } }
+  }
+\@ifpackageloaded { varioref }
+  { \ctex_varioref_hook: }
+  {
+    \cs_new_eq:NN \CTEX@save@refstepcounter \refstepcounter
+    \RenewDocumentCommand \refstepcounter { m }
+      {
+        \CTEX@save@refstepcounter {#1}
+        \CTEX@setcurrentlabel@n {#1}
+      }
+    \ctex_at_end_package:nn { varioref } { \ctex_varioref_hook: }
+  }
+\ctex_scheme_input:o { \l__ctex_scheme_tl }
+\NewDocumentCommand \zihao { m }
+  { \exp_args:Nx \ctex_zihao:n {#1} \tex_ignorespaces:D }
+\cs_new_protected_nopar:Npn \ctex_zihao:n #1
+  {
+    \prop_get:NnNTF \c__ctex_font_size_prop {#1} \l__ctex_font_size_tl
+      { \exp_after:wN \fontsize \l__ctex_font_size_tl \selectfont }
+      { \msg_error:nnn { ctex } { fontsize } {#1} }
+  }
+\msg_new:nnnn { ctex } { fontsize }
+  { Undefined~Chinese~font~size~`#1'~in~command~\token_to_str:N \zihao.}
+  {
+    The~old~font~size~is~used~if~you~continue.\\
+    The~available~font~sizes~are~listed~as~follow.\\
+    \seq_use:Nnnn \c__ctex_font_size_seq { ~and~ } { ,~ } { ,~and~ }.
+  }
+\prop_new:N \c__ctex_font_size_prop
+\seq_new:N \c__ctex_font_size_seq
+\cs_new_protected_nopar:Npn \__ctex_save_font_size:nn #1#2
+  {
+    \use:x
+      {
+        \prop_gput:Nnn \exp_not:N \c__ctex_font_size_prop {#1}
+          {
+            { \dim_to_decimal:n {#2} }
+            { \dim_to_decimal:n { (#2) * \c_six / \c_five } }
+          }
+      }
+    \seq_gput_right:Nn \c__ctex_font_size_seq {#1}
+  }
+\clist_map_inline:nn
+  {
+    {  8 } { 5    bp } ,
+    {  7 } { 5.5  bp } ,
+    { -6 } { 6.5  bp } ,
+    {  6 } { 7.5  bp } ,
+    { -5 } { 9    bp } ,
+    {  5 } { 10.5 bp } ,
+    { -4 } { 12   bp } ,
+    {  4 } { 14   bp } ,
+    { -3 } { 15   bp } ,
+    {  3 } { 16   bp } ,
+    { -2 } { 18   bp } ,
+    {  2 } { 22   bp } ,
+    { -1 } { 24   bp } ,
+    {  1 } { 26   bp } ,
+    { -0 } { 36   bp } ,
+    {  0 } { 42   bp }
+  }
+  { \__ctex_save_font_size:nn #1 }
+\cs_new_protected_nopar:Npn \ctex_declare_math_sizes:nnnn #1#2#3#4
+  {
+    \__ctex_get_font_sizes:Nn \l__ctex_font_size_tl { {#1} {#2} {#3} {#4} }
+    \exp_after:wN \DeclareMathSizes \l__ctex_font_size_tl
+  }
+\cs_new_protected_nopar:Npn \__ctex_get_font_sizes:Nn #1#2
+  {
+    \tl_clear:N #1
+    \tl_map_inline:nn {#2}
+      {
+        \prop_get:NnNTF \c__ctex_font_size_prop {##1} \l__ctex_tmp_tl
+          { \tl_put_right:Nx #1 { { \tl_head:N \l__ctex_tmp_tl } } }
+          { \tl_put_right:Nx #1 { { \dim_to_decimal:n { ##1 } } } }
+      }
+  }
+\clist_map_inline:nn
+  {
+    {  8 }{  8 }{ 5pt }{ 5pt } ,
+    {  7 }{  7 }{ 5pt }{ 5pt } ,
+    { -6 }{ -6 }{ 5pt }{ 5pt } ,
+    {  6 }{  6 }{ 5pt }{ 5pt } ,
+    { -5 }{ -5 }{ 6pt }{ 5pt } ,
+    {  5 }{  5 }{ 7pt }{ 5pt } ,
+    { -4 }{ -4 }{ 8pt }{ 6pt } ,
+    {  4 }{  4 }{  5 }{  6 } ,
+    { -3 }{ -3 }{ -4 }{ -5 } ,
+    {  3 }{  3 }{  4 }{  5 } ,
+    { -2 }{ -2 }{ -3 }{ -4 } ,
+    {  2 }{  2 }{  3 }{  4 } ,
+    { -1 }{ -1 }{ -2 }{ -3 } ,
+    {  1 }{  1 }{  2 }{  3 } ,
+    { -0 }{ -0 }{ -1 }{ -2 } ,
+    {  0 }{  0 }{  1 }{  2 }
+  }
+  { \ctex_declare_math_sizes:nnnn #1 }
+\cs_new_protected:Npn \ctex_set_font_size:Nnn #1#2#3
+  {
+    \prop_get:NnNTF \c__ctex_font_size_prop {#2} \l__ctex_font_size_tl
+      { \exp_after:wN \__ctex_set_font_size:nnNn \l__ctex_font_size_tl #1 {#3} }
+      { \msg_error:nnn { ctex } { fontsize } {#2} }
+  }
+\cs_new_protected:Npn \__ctex_set_font_size:nnNn #1#2#3#4
+  { \cs_set_protected_nopar:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } }
+\if_case:w \g__ctex_font_size_flag
+  \ctex_file_input:n { ctex-c5size.clo }
+\or:
+  \ctex_file_input:n { ctex-cs4size.clo }
+\fi:
+\fp_compare:nNnF { \l__ctex_line_spread_fp } ? { \c_zero_fp }
+  {
+    \linespread { \fp_use:N \l__ctex_line_spread_fp }
+    \group_begin: \footnotesize \exp_args:NNNo \group_end:
+    \dim_set:Nn \footnotesep { \dim_use:N \box_ht:N \strutbox }
+  }
+\normalsize
+\NewDocumentCommand \CTeX { }
+  { \ifincsname CTeX \else: C \TeX \fi: }
+\AtBeginDocument
+  {
+    \cs_if_exist_use:NT \pdfstringdefDisableCommands
+      { { \tl_set:Nn \CTeX { CTeX } } }
+  }
+\keys_define:nn { ctex }
+  {
+    captiondelimiter .code:n =
+      {
+        \msg_warning:nnn { ctex } { deprecated-option }
+          { You~can~load~the~package~`caption'~to~get~its~functionality. }
+      }
+  }
+\group_begin:
+\char_set_catcode_other:N \#
+\use:n
+  {
+    \group_end:
+    \ExplSyntaxOff
+    \ctex_at_end_package:nn { breqn }
+      {
+        \ctex_patch_cmd:NnnTF \end { \csname end#1 \endcsname }
+          {
+            \csuse { @end@#1@hook }
+            \csname end#1 \endcsname
+          } { }
+          {
+            \ctex_preto_cmd:NnTF \end { \csuse { @end@#1@hook } }
+              { } { \ctex_patch_failure:N \end }
+          }
+      }
+    \ExplSyntaxOn
+  }
+\cs_new_protected_nopar:Npn \ctex_fontset_error:n #1
+  { \msg_critical:nnn { ctex } { fontset-unavailable } {#1} }
+\msg_new:nnn { ctex } { fontset-unavailable }
+  { CTeX~fontset~`#1'~is~unavailable~in~current~mode. }
+\cs_new_protected_nopar:Npn \ctex_load_fontset:
+  {
+    \tl_if_empty:NTF \g__ctex_fontset_tl
+      {
+        \ctex_detected_platform:
+        \ctex_file_input:n { ctex-fontset- \g__ctex_fontset_tl .def }
+      }
+      {
+        \file_if_exist:nTF { ctex-fontset- \g__ctex_fontset_tl .def }
+          { \ctex_file_input:n { ctex-fontset- \g__ctex_fontset_tl .def } }
+          {
+            \use:x
+              {
+                \ctex_detected_platform:
+                \msg_error:nnxx { ctex } { fontset-not-found }
+                  { \g__ctex_fontset_tl } { \exp_not:N \g__ctex_fontset_tl }
+              }
+            \ctex_file_input:n { ctex-fontset- \g__ctex_fontset_tl .def }
+          }
+      }
+  }
+\@onlypreamble \ctex_load_fontset:
+\msg_new:nnnn { ctex } { fontset-not-found }
+  {
+    CTeX~fontset~`#1'~could~not~be~found.\\
+    Fontset~`#2'~will~be~used~instead.
+  }
+  { You~may~run~`mktexlsr'~firstly. }
+\keys_define:nn { ctex }
+  {
+    fontset .code:n =
+      {
+        \ctex_if_preamble:TF
+          {
+            \str_if_eq_x:nnTF {#1} { none }
+              { \msg_warning:nnn { ctex } { invalid-value } {#1} }
+              {
+                \str_if_eq:onTF { \g__ctex_fontset_tl } { none }
+                  {
+                    \tl_gset:Nx \g__ctex_fontset_tl {#1}
+                    \ctex_load_fontset:
+                  }
+                  {
+                    \msg_error:nnxx { ctex } { fontset-loaded }
+                      { \g__ctex_fontset_tl } {#1}
+                  }
+              }
+          }
+          { \msg_error:nn { ctex } { fontset-only-preamble } }
+      }
+  }
+\msg_new:nnnn { ctex } { fontset-loaded }
+  {
+    CTeX~fontset~`#1'~has~been~loaded.
+    \str_if_eq:nnF {#1} {#2} { \\ Fontset~`#2'~will~be~ignored. }
+  }
+  { Only~one~fontset~can~be~loaded~in~the~preamble. }
+\msg_new:nnn { ctex } { fontset-only-preamble }
+  {
+    The~ `fontset'~ option~ can~ be~ used~ only~ in~ preamble.
+  }
+\str_if_eq:onF { \g__ctex_fontset_tl } { none }
+  { \ctex_load_fontset: }
+\ctex_at_end:n { \ctex_file_input:n { ctex.cfg } }
+%% 
+%%     This package consists of the file  ctex.dtx,
+%%                  and the derived files ctex.pdf,
+%%                                        ctex.ins,
+%%                                        ctex.sty,
+%%                                        ctexcap.sty,
+%%                                        ctexsize.sty,
+%%                                        ctexart.cls,
+%%                                        ctexbook.cls,
+%%                                        ctexrep.cls,
+%%                                        ctex-c5size.clo,
+%%                                        ctex-cs4size.clo,
+%%                                        ctex-article.def,
+%%                                        ctex-book.def,
+%%                                        ctex-report.def,
+%%                                        ctex-scheme-plain.def,
+%%                                        ctex-scheme-plain-article.def,
+%%                                        ctex-scheme-plain-book.def,
+%%                                        ctex-scheme-plain-report.def,
+%%                                        ctex-scheme-chinese.def,
+%%                                        ctex-scheme-chinese-article.def,
+%%                                        ctex-scheme-chinese-book.def,
+%%                                        ctex-scheme-chinese-report.def,
+%%                                        ctex-name-gbk.cfg,
+%%                                        ctex-name-utf8.cfg,
+%%                                        ctex.cfg,
+%%                                        ctexopts.cfg,
+%%                                        ctex-engine-pdftex.def,
+%%                                        ctex-engine-xetex.def,
+%%                                        ctex-engine-luatex.def,
+%%                                        c19rm.fd,
+%%                                        c19sf.fd,
+%%                                        c19tt.fd,
+%%                                        c70rm.fd,
+%%                                        c70sf.fd,
+%%                                        c70tt.fd,
+%%                                        ctex-fontset-windows.def,
+%%                                        ctex-fontset-windowsnew.def,
+%%                                        ctex-fontset-windowsold.def,
+%%                                        ctex-fontset-adobe.def,
+%%                                        ctex-fontset-fandol.def,
+%%                                        ctex-fontset-mac.def,
+%%                                        ctex-fontset-founder.def,
+%%                                        ctex-fontset-ubuntu.def,
+%%                                        ctexspa.def,
+%%                                        ctexpunct.spa,
+%%                                        ctexmakespa.tex,
+%%                                        ctexspamacro.tex,
+%%                                        zhadobefonts.tex,
+%%                                        zhfandolfonts.tex,
+%%                                        zhfounderfonts.tex,
+%%                                        zhubuntufonts.tex,
+%%                                        zhwindowsfonts.tex, and
+%%                                        README.
+%%
+%% End of file `ctexart.cls'.
-- 
cgit v1.2.3

