%%
%% File ctxdoc.cls
%%
%%     Copyright (C) 2016--2022
%%     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".
%%
%%---------------------------------------------------------------------
%%
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
\GetIdInfo$Id: ctxdoc.cls c3e8eb5 2022-06-07 19:08:17 +0800 Qing Lee <[email protected]> $
 {ctex documentation (CTEX)}
\ProvidesExplClass{ctxdoc}{\ExplFileDate}{}{\ExplFileDescription}
\ExplSyntaxOff
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{l3doc}}
\PassOptionsToClass{a4paper,full}{l3doc}
\ProcessOptions
\LoadClass{l3doc}
\RequirePackage[UTF8, punct=kaiming, heading, linespread=1.2, sub3section]{ctex}
\ctexset{
 abstractname   = 简介,
 indexname      = 代码索引,
 section/format = \Large\bfseries\raggedright,
 section/name   = {第,节},
}
\RequirePackage[toc]{multitoc}
\RequirePackage{geometry}
\RequirePackage{tabularx}
\RequirePackage{makecell}
\RequirePackage{threeparttable}
\RequirePackage{siunitx}
\RequirePackage{unicode-math}
\RequirePackage{xcolor}
\RequirePackage{caption}
\RequirePackage{fancyvrb-ex}
\RequirePackage{zref-base}
\geometry{includemp, hmargin={0mm,15mm}, vmargin={25mm,15mm}, footskip=7mm}
\hypersetup{pdfstartview=FitH, bookmarksdepth=subparagraph}
\setcounter{secnumdepth}{4}
\setcounter{tocdepth}{2}
\newcommand*\email{\nolinkurl}
\setmainfont{texgyrepagella}[
 Extension      = .otf,
 UprightFont    = *-regular,
 BoldFont       = *-bold,
 ItalicFont     = *-italic,
 BoldItalicFont = *-bolditalic]
\setsansfont{texgyreheros}[
 Extension      = .otf,
 UprightFont    = *-regular,
 BoldFont       = *-bold,
 ItalicFont     = *-italic,
 BoldItalicFont = *-bolditalic]
\setmonofont{cmun}[
 Extension      = .otf,
 UprightFont    = *btl,
 BoldFont       = *tb,
 ItalicFont     = *bto,
 BoldItalicFont = *tx,
 HyphenChar     = None]
\setmathfont{texgyrepagella-math.otf}
\captionsetup{%
 strut=off, labelsep=quad, labelfont+=bf,
 figureposition = bottom, tableposition = top}
%% <--- http://tex.stackexchange.com/a/40896
\patchcmd{\@addtocurcol}%
   {\vskip \intextsep}%
   {\edef\save@first@penalty{\the\lastpenalty}\unpenalty
    \ifnum \lastpenalty = \@M  % hopefully the OR penalty
       \unpenalty
    \else
       \penalty \save@first@penalty \relax % put it back
    \fi
     \ifnum\outputpenalty <-\@Mii
                        \addvspace\intextsep
                        \vskip\parskip
     \else
                        \addvspace\intextsep
     \fi}%
   {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
\patchcmd{\@addtocurcol}%
   {\vskip\intextsep \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi}%
   {\ifnum\outputpenalty <-\@Mii
      \aftergroup\vskip\aftergroup\intextsep
      \aftergroup\nointerlineskip
    \else
      \vskip\intextsep
    \fi}%
   {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
\patchcmd{\@getpen}{\@M}{\@Mi}
 {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
%% --->
%% 不对代码实现的 \section 以下标题编目录。
\AtBeginEnvironment{implementation}{%
 \ifnum\value{tocdepth}>\@ne
   \addtocontents{toc}{\protect\value{tocdepth}=1\relax}%
 \fi}
\ifxetex
 \let\ctexdocverbaddon\xeCJKVerbAddon
 \def\ctexdisableecglue{\xeCJKsetup{CJKecglue}}
 \def\ctexplainps{\xeCJKsetup{PunctStyle=plain}}
 \appto\meta@font@select{\ifinner\ctexdisableecglue\fi}
\else
 \let\ctexdocverbaddon\relax
 \let\ctexplainps\relax
 \def\ctexdisableecglue{\ltjsetparameter{autoxspacing=false}}
 \appto\meta@font@select{\ctexdisableecglue}
\fi
\setlist{noitemsep,topsep=\smallskipamount}
\setlist[1]{labelindent=\parindent}
\setlist[enumerate]{leftmargin=*}
\setlist[itemize]{leftmargin=*}
\setlist[trivlist]{topsep=\medskipamount}
\renewlist{arguments}{enumerate}{1}
\setlist[arguments]{nolistsep,
 leftmargin=\parindent, labelindent=0pt, labelsep=*,
 label=\texttt{\#\arabic*}\,:}
\newlist{optdesc}{description}{3}
%% 设置间距为 \marginparsep,与 l3doc 一致
\setlist[optdesc]{%
 font=\mdseries\small\ttfamily,align=right,listparindent=\parindent,
 labelsep=\marginparsep,labelindent=-\marginparsep,leftmargin=0pt}
%% 重新定义 threeparttable 包的 tablenotes 环境
\renewlist{tablenotes}{description}{1}
\setlist[tablenotes]{%
 format=\normalfont\tnote@item,align=right,listparindent=\parindent,
 labelindent=\tabcolsep,leftmargin=*,rightmargin=\tabcolsep,
 after=\@noparlisttrue}
\AtBeginEnvironment{tablenotes}{%
 \setlength\parindent{2\ccwd}%
 \normalfont\footnotesize}
\AtBeginEnvironment{threeparttable}{%
 \stepcounter{tpt@id}%
 \edef\curr@tpt@id{tpt@\arabic{tpt@id}}}
\newcounter{tpt@id}
\def\tnote@item#1{%
 \Hy@raisedlink{\hyper@anchor{\curr@tpt@id-#1}}#1}
\def\TPTtagStyle#1{\hyperlink{\curr@tpt@id-#1}{#1}}
\fvset{
 fontsize=\small,baselinestretch=1,numbersep=5pt,
 formatcom=\ctexdocverbaddon,
 listparameters=\setlength\topsep{\MacrocodeTopsep}}
\DefineVerbatimEnvironment{frameverb}{Verbatim}{%
 gobble=4,
 frame=single,framesep=8pt,
 listparameters=
   \setlength\topsep{\medskipamount}%
   \appto\FV@EndList{\nointerlineskip}}
\DefineVerbatimEnvironment{ctexexam}{Verbatim}{%
 gobble=4,
 frame=single,framesep=10pt,
 label=\rule{0pt}{12pt}\textnormal{\bfseries 例 \arabic{ctexexam}},
 listparameters=
   \setlength\topsep{\bigskipamount}%
   \refstepcounter{ctexexam}\ctexexamlabelref
   \appto\FV@EndList{\nointerlineskip}}
\define@key{FV}{labelref}{\def\ctexexamlabelref{\label{#1}}}
\let\ctexexamlabelref\empty
\newcounter{ctexexam}
\AtEndEnvironment{function}{\ctexsetverticalspacing}
\AfterEndEnvironment{function}{\ctexfixverticalspacing}
\AtBeginEnvironment{syntax}{\linespread{1}\ctexplainps\ctexdisableecglue}
\newrobustcmd\exptarget{%
 \AddLineBeginMainAux{\csgdef{Codedoc@expstar}{}}%
 \Hy@raisedlink{\hypertarget{expstar}{}}}
\newrobustcmd\rexptarget{%
 \AddLineBeginMainAux{\csgdef{Codedoc@rexpstar}{}}%
 \Hy@raisedlink{\hypertarget{rexpstar}{}}}
\newrobustcmd\expstar{\hyperlink{expstar}{$\star$}}
\newrobustcmd\rexpstar{\hyperlink{rexpstar}{\ding{73}}}
\ExplSyntaxOn
\cs_new_protected:Npn \ctexsetverticalspacing
 {
   \par
   \tl_gset:Nx \ctexfixverticalspacing
     { \dim_set:Nn \prevdepth { \dim_use:N \prevdepth } }
   \int_compare:nNnT \lastnodetype = { 11 }
     {
       \tl_gput_right:Nx \ctexfixverticalspacing
         { \exp_not:N \skip_vertical:n { \skip_use:N \lastskip } }
       \unskip
     }
 }
\tl_new:N \ctexfixverticalspacing
\NewDocumentCommand \SideBySideExampleSet { }
 { \prop_put_from_keyval:Nn \l__ctxdoc_side_example_prop }
\prop_new:N \l__ctxdoc_side_example_prop
\prop_set_from_keyval:Nn \l__ctxdoc_side_example_prop
 { frame=single, numbers=left, gobble=5, xrightmargin=.5\linewidth }
\tl_put_left:Nn \SideBySideExample
 {
   \trivlist \item \relax
   \exp_args:Ne \fvset
     { \prop_to_keyval:N \l__ctxdoc_side_example_prop }
 }
\tl_put_right:Nn \endSideBySideExample
 { \endtrivlist }
\ctex_patch_cmd:Nnn \__codedoc_function_typeset_start:
 { \bigskip }
 { \nointerlineskip \addvspace { \bigskipamount } }
%% l3doc 会设置列表环境中 \listparindent=\z@,我们在这里恢复它。
\cs_set_eq:NN \list \__codedoc_oldlist:nn
\cs_new_nopar:Npn \zihaopt #1
 {
   \exp_last_unbraced:Nf \tl_head:w
     { \prop_item:Nn \c__ctex_font_size_prop {#1} } { } \q_stop
 }
%% 抑制首段的 \parskip
\ctex_patch_cmd_once:NnnnTF \__codedoc_function_descr_start:w
 { }
 { \noindent }
 { \skip_vertical:n { -\parskip } \noindent }
 { \iow_term:n { *** ~ SUCCESS ~ *** } }
 { \iow_term:n { *** ~ FAIL ~ *** } }
%% l3doc 会在 function 环境的 syntax 和 descr 盒子中间加上 \medskipamount 的距离。
%% 但是若 syntax 盒子为空(未使用 syntax 环境),就会显得不好看。
%% 此时我们通过将 \medskipamount 设置为零来修正。若盒子非空,则将 \parskip 还回去。
\ctex_preto_cmd:NnnTF \__codedoc_function_assemble:
 { }
 { \ctex_doc_fix_yoffset: }
 { \iow_term:n { *** ~ SUCCESS ~ *** } }
 { \iow_term:n { *** ~ FAIL ~ *** } }
\cs_new_protected_nopar:Npn \ctex_doc_fix_yoffset:
 {
   \box_if_empty:NTF \g__codedoc_syntax_box
     { \skip_zero:N \medskipamount }
     { \skip_add:Nn \medskipamount { \parskip } }
 }
%% 左侧边注的函数列表采用单倍行距
\ctex_preto_cmd:NnnTF \__codedoc_typeset_functions:
 { }
 { \MacroFont }
 { \iow_term:n { *** ~ SUCCESS ~ *** } }
 { \iow_term:n { *** ~ FAIL ~ *** } }
\ctex_patch_cmd_once:NnnnTF \__codedoc_macro_init:
 { }
 { \hbox:n }
 { \MacroFont \hbox:n }
 { \iow_term:n { *** ~ SUCCESS ~ *** } }
 { \iow_term:n { *** ~ FAIL ~ *** } }
\ctex_patch_cmd_once:NnnnTF \__codedoc_macro_dump:
 { }
 { \hbox_unpack_drop:N }
 { \MacroFont \hbox_unpack_drop:N }
 { \iow_term:n { *** ~ SUCCESS ~ *** } }
 { \iow_term:n { *** ~ FAIL ~ *** } }
\cs_set_eq:NN \__codedoc_macro_end_style:n \use_none:n
\cs_set_protected:Npn \__codedoc_macro_typeset_one:nN #1#2
 {
   \vbox_set:Nn \l__codedoc_macro_box
     {
       \MacroFont
       \vbox_unpack_drop:N \l__codedoc_macro_box
       \hbox_set:Nn \l_tmpa_box
         { \__codedoc_print_macroname:nN {#1} #2 }
       \dim_set:Nn \l_tmpa_dim { \marginparwidth - \labelsep }
       \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
         {
           \box_resize_to_wd_and_ht:Nnn \l_tmpa_box
             { \l_tmpa_dim }
             { \box_ht:N \l_tmpa_box }
         }
       \hbox_overlap_left:n
         {
           \box_use:N \l_tmpa_box
           \skip_horizontal:n { \marginparsep - \labelsep }
         }
     }
   \int_incr:N \l__codedoc_macro_int
 }
\cs_set_protected:Npn \__codedoc_print_macroname:nN #1#2
 {
   \strut
   \__codedoc_get_hyper_target:xN
     {
       \exp_not:n {#1}
       \bool_if:NT #2 { \tl_to_str:n {TF} }
     }
     \l__codedoc_tmpa_tl
   \cs_if_exist:cTF { r@ \l__codedoc_tmpa_tl }
     { \exp_args:NNo \label@hyperref [ \l__codedoc_tmpa_tl ] }
     { \use:n }
     {
       \tl_set:Nn \l__codedoc_tmpa_tl {#1}
       \tl_replace_all:Non \l__codedoc_tmpa_tl
         { \c_catcode_other_space_tl }
         { \fontspec_visible_space: }
       \__codedoc_macroname_prefix:o \l__codedoc_tmpa_tl
       \__codedoc_macroname_suffix:N #2
     }
 }
\AtBeginEnvironment { syntax }
 {
   \char_set_catcode_active:N \|
   \char_set_active_eq:NN \| \orbar
   \char_set_catcode_active:N \(
   \char_set_active_eq:NN \( \defaultvalaux
 }
%% 不对目录中出现的 \cs 和 \tn 等编索引
\DeclareDocumentCommand \StopSpecialIndexModule { }
 { \cs_set_eq:NN \__codedoc_special_index_module:nnnnN \use_none:nnnnn }
\tl_map_inline:nn { \actualchar \encapchar \levelchar }
 { \exp_args:Nx \DoNotIndex { \bslash \tl_to_str:N #1 } }
\DeclareDocumentCommand \package { o m }
 {
   \exp_args:Nx \href
     {
       http \c_colon_str //www.ctan.org/pkg/
       \IfNoValueTF {#1} { \str_lowercase:n {#2} } {#1}
     }
     { \pkg {#2} }
 }
\DeclareDocumentCommand \GetFileId { m }
 {
   \GetFileInfo {#1}
   \file_get:nnNTF { \c_sys_jobname_str .id }
     { \int_set:Nn \tex_endlinechar:D { -1 } } \l__ctxdoc_tmp_tl
     { \tl_if_empty:NTF \l__ctxdoc_tmp_tl }
     { \use_i:nn }
     { \GetIdInfo $Id$ }
     { \exp_after:wN \GetIdInfo \l__ctxdoc_tmp_tl }
     { \fileinfo }
 }
\cs_new_eq:NN \__ctxdoc_ltx_changes:nnn \changes@
\cs_set_protected:Npn \changes@ #1#2
 {
   \__ctxdoc_save_version_date:nn {#1} {#2}
   \tl_if_empty:nTF {#1}
     { \__ctxdoc_ltx_changes:nnn }
     { \__ctxdoc_version_zfill:wnnn #1 \q_stop }
     {#1} {#2}
 }
\cs_new_protected:Npn \__ctxdoc_version_zfill:wnnn #1#2 \q_stop
 {
   \str_if_eq:nnTF {#1} { v }
     { \__ctxdoc_version_zfill:nnnn {#2} }
     { \__ctxdoc_ltx_changes:nnn }
 }
\cs_new_protected:Npn \__ctxdoc_version_zfill:nnnn #1#2
 {
   \tl_clear:N \l__ctxdoc_tmp_tl
   \int_zero:N \l_tmpa_int
   \seq_set_split:Nnn \l_tmpa_seq { . } {#1}
   \seq_map_function:NN \l_tmpa_seq \__ctxdoc_version_zfill:n
   \int_compare:nNnF \l_tmpa_int > 2
     {
       \tl_put_right:Nx \l__ctxdoc_tmp_tl
         { \prg_replicate:nn { 3 - \l_tmpa_int } { 00000 } }
     }
   \__ctxdoc_ltx_changes:nnn { \l__ctxdoc_tmp_tl \actualchar #2 }
 }
\tl_new:N \l__ctxdoc_tmp_tl
\cs_new_protected:Npn \__ctxdoc_version_zfill:n #1
 {
   \int_incr:N \l_tmpa_int
   \tl_put_right:Nx \l__ctxdoc_tmp_tl
     {
       \prg_replicate:nn
         { \int_max:nn { 0 } { 5 - \tl_count:n {#1} } } { 0 }
       \exp_not:n {#1}
     }
 }
\cs_new_protected:Npn \__ctxdoc_save_version_date:nn #1#2
 {
   \prop_get:NnNTF \g__ctxdoc_version_date_prop {#1} \l__ctxdoc_tmp_tl
     { \exp_after:wN \__ctxdoc_save_version_date:nnnn \l__ctxdoc_tmp_tl {#2} {#1} }
     { \__ctxdoc_save_version_date:nnn {#1} {#2} {#2} }
 }
\cs_new_protected:Npn \__ctxdoc_save_version_date:nnnn #1#2#3#4
 {
   \__ctxdoc_if_date_later:nnTF {#1} {#3}
     { \__ctxdoc_save_version_date:nnn {#4} {#3} {#2} }
     {
       \__ctxdoc_if_date_later:nnT {#3} {#2}
         { \__ctxdoc_save_version_date:nnn {#4} {#1} {#3} }
     }
 }
\prg_new_conditional:Npnn \__ctxdoc_if_date_later:nn #1#2 { TF , T }
 {
   \if_int_compare:w \__ctxdoc_parse_date:w #1 / / / 0 \q_stop >
                     \__ctxdoc_parse_date:w #2 / / / 0 \q_stop \exp_stop_f:
     \prg_return_true: \else: \prg_return_false: \fi:
 }
\cs_new:Npn \__ctxdoc_parse_date:w #1/#2/#3/ #4 \q_stop
 { #1#2#3 }
\cs_new_protected:Npn \__ctxdoc_save_version_date:nnn #1#2#3
 { \prop_gput:Nnn \g__ctxdoc_version_date_prop {#1} { {#2} {#3} } }
\cs_new_protected:Npn \CTEX@versionitem #1 \efill
 {
   \@idxitem
   \prop_get:NnNTF \g__ctxdoc_version_date_prop {#1} \l__ctxdoc_tmp_tl
     { \exp_after:wN \__ctxdoc_version_item:nnn \l__ctxdoc_tmp_tl {#1} }
     { \BOOM }
 }
\cs_new_protected:Npn \__ctxdoc_version_item:nnn #1#2#3
 {
   \noindent
   \Hy@raisedlink { \belowpdfbookmark {#3} { HD.#3 } }
   \textbf {#3} \hfill
   \hbox:n
     {
       \footnotesize
       \str_if_eq:nnTF {#1} {#2}
         { ( #1 ) }
         { ( #1 ~ -- ~ #2 ) }
     }
   \par \nopagebreak
 }
\prop_new:N \g__ctxdoc_version_date_prop
\ctex_patch_cmd:Nnn \HDorg@theglossary
 { \let \item \@idxitem }
 { \let \item \CTEX@versionitem }
\ctex_patch_cmd:Nnn \l@section    { 2.5em } { 1.5em }
\ctex_patch_cmd:Nnn \l@subsection { 2.5em } { 1.5em }
\ctex_patch_cmd:Nnn \@wrglossary
 { hdpindex }
 {
   \ifnum \c@HD@hypercount = \z@
     hdpindex
   \else
     hdclindex { \the \c@HD@hypercount }
   \fi
 }
%% 重定义 macrocode 环境的实现,逐行处理
\cs_set_protected_nopar:Npn \xmacro@code
 { \__ctxdoc_marco_code:w }
\cs_set_protected_nopar:Npn \sxmacro@code
 {
   \fontspec_print_visible_spaces:
   \xmacro@code
 }
\cs_new_protected_nopar:Npn \__ctxdoc_marco_code:w
 {
   \ifcodeline@index
     \__ctxdoc_marco_every_par:n { \__ctxdoc_code_line_no: }
   \else:
     \__ctxdoc_marco_every_par:n { }
   \fi:
   \exp_args:Nx \__ctxdoc_make_finish_tag:n { \@currenvir }
   \__ctxdoc_verbatim_start:w
 }
\cs_new_protected:Npn \__ctxdoc_marco_every_par:n #1
 {
   \everypar
     {
       \everypar {#1}
       \if@inlabel
         \global \@inlabelfalse
         \@noparlistfalse
         \unless \ifvoid \CTEX@labelbox
           \llap { \box \CTEX@labelbox \hskip \leftskip }
         \fi
       \fi
       #1
     }
 }
\ctex_patch_cmd:Nnn \macro@code
 { \if@inlabel \leavevmode \fi }
 {
   \partopsep \z@skip
   \if@inlabel \setbox \CTEX@labelbox \copy \@labels \fi
 }
\newbox \CTEX@labelbox
\group_begin:
 \int_set:Nn \tex_endlinechar:D { -1 }
 \use:n
   {
     \char_set_catcode_active:n { 32 }
     \tl_const:Nn \c__ctxdoc_active_space_tl
   }
   { }
\group_end:
\group_begin:
 \char_set_catcode_active:n { 13 }
 \cs_new_protected:Npx \__ctxdoc_make_finish_tag:n #1
   {
     \tl_set:Nn \exp_not:N \l__ctxdoc_verbatim_finish_tl
       {
         \c_percent_str
         \prg_replicate:nn { 4 }
           { \exp_not:o { \c__ctxdoc_active_space_tl } }
         \exp_not:o { \active@escape@char } end
         \c_left_brace_str #1 \c_right_brace_str
         \exp_not:N ^^M
       }
   }
 \cs_new_protected:Npn \__ctxdoc_verbatim_start:w #1
   {
     \str_if_eq:nnTF {#1} { ^^M }
       { \__ctxdoc_verbatim_read_line:w }
       { \__ctxdoc_verbatim_read_line:w #1 }
   }
 \cs_new_protected:Npn \__ctxdoc_verbatim_read_line:w #1 ^^M
   {
     \tl_set:Nn \l__ctxdoc_verbatim_line_tl { #1 ^^M }
     \tl_if_eq:NNTF \l__ctxdoc_verbatim_line_tl \l__ctxdoc_verbatim_finish_tl
       { \exp_args:Nx \end { \@currenvir } }
       {
         \__ctxdoc_verbatim_process_line:
         \__ctxdoc_verbatim_read_line:w
       }
   }
 \cs_new_protected:Npn \__ctxdoc_swap_cr:
   { \exp_after:wN \__ctxdoc_swap_cr:w \l__ctxdoc_verbatim_line_tl }
 \cs_new_protected:Npn \__ctxdoc_swap_cr:w #1 ^^M
   {
     \group_insert_after:N ^^M
     \tl_set:Nn \l__ctxdoc_verbatim_line_tl {#1}
   }
 \tl_const:Nn \c__ctxdoc_active_cr_tl { ^^M }
\group_end:
\tl_new:N \l__ctxdoc_verbatim_line_tl
\tl_new:N \l__ctxdoc_verbatim_finish_tl
\tl_new:N \g__ctxdoc_verbatim_verb_stop_tl
\cs_new_protected_nopar:Npn \__ctxdoc_process_normal_line:
 {
   \str_if_eq:eeTF
     { \str_head:N \l__ctxdoc_verbatim_line_tl } { \c_percent_str }
     { \__ctxdoc_check_angle:x { \tl_tail:N \l__ctxdoc_verbatim_line_tl } }
     { \__ctxdoc_output_line: }
 }
\cs_new_protected_nopar:Npn \__ctxdoc_process_verb_line:
 {
   \tl_if_eq:NNTF \l__ctxdoc_verbatim_line_tl \g__ctxdoc_verbatim_verb_stop_tl
     {
       \tl_gclear:N \g__ctxdoc_verbatim_verb_stop_tl
       \cs_gset_eq:NN \__ctxdoc_verbatim_process_line: \__ctxdoc_process_normal_line:
       \__ctxdoc_output_module:nn
         { \color { verb@guard } }
         {
           \__ctxdoc_swap_cr:
           \__ctxdoc_module_pop:n { \l__ctxdoc_verbatim_line_tl }
         }
     }
     { \tl_use:N \l__ctxdoc_verbatim_line_tl }
 }
\cs_new_eq:NN \__ctxdoc_verbatim_process_line: \__ctxdoc_process_normal_line:
\DeclareDocumentCommand \CheckModules { }
 { \cs_set_eq:NN \__ctxdoc_verbatim_process_line: \__ctxdoc_process_normal_line: }
\DeclareDocumentCommand \DontCheckModules { }
 { \cs_set_eq:NN \__ctxdoc_verbatim_process_line: \__ctxdoc_output_line: }
\cs_new_protected:Npn \__ctxdoc_check_angle:n #1
 {
    \str_if_eq:eeTF { \str_head:n {#1} } { < }
     { \__ctxdoc_check_module:x { \tl_tail:n {#1} } }
     { \__ctxdoc_output_percent_line: }
 }
\cs_generate_variant:Nn \__ctxdoc_check_angle:n { x }
\cs_new_protected:Npn \__ctxdoc_check_module:n #1
 {
   \exp_args:Nx \str_case:nnF { \str_head:n {#1} }
     {
       { * } { \__ctxdoc_module_star:w }
       { / } { \__ctxdoc_module_slash:w }
       { @ } { \__ctxdoc_module_at:w }
       { < } { \__ctxdoc_module_verb:w }
     }
     { \__ctxdoc_module_pm:w }
   #1 \q_stop
 }
\cs_generate_variant:Nn \__ctxdoc_check_module:n { x }
\group_begin:
 \char_set_catcode_active:N \>
 \cs_new_protected:Npn \__ctxdoc_module_star:w #1 > #2 \q_stop
   {
     \__ctxdoc_output_module:nn
       { \__ctxdoc_star_color: }
       { \__ctxdoc_module_push:n { \__ctxdoc_module_angle:n {#1} } }
     \__ctxdoc_output_line:n {#2}
     \__ctxdoc_star_format:
   }
 \cs_new_protected:Npn \__ctxdoc_module_slash:w #1 > #2 \q_stop
   {
     \__ctxdoc_output_module:nn
       { \__ctxdoc_slash_color: }
       { \__ctxdoc_module_pop:n { \__ctxdoc_module_angle:n {#1} } }
     \__ctxdoc_output_line:n {#2}
     \__ctxdoc_slash_format:
   }
 \cs_new_protected:Npn \__ctxdoc_module_at:w @ @ = #1 > #2 \q_stop
   {
     \__ctxdoc_output_module:nn
       { \color { at@guard } }
       { \__ctxdoc_module_angle:n { @ @ = #1 } }
     \tl_gset:Nn \g__codedoc_module_name_tl {#1}
     \__ctxdoc_output_line:n {#2}
   }
 \cs_new_protected:Npn \__ctxdoc_module_pm:w #1 > #2 \q_stop
   {
     \tex_noindent:D
     \hbox_overlap_left:n
       {
         \__ctxdoc_output_module:nn
           { \__ctxdoc_pm_color: }
           { \__ctxdoc_module_angle:n {#1} }
         \skip_horizontal:n { \leftskip + \smallskipamount }
       }
     \group_begin:
       \__ctxdoc_pm_format:
       \__ctxdoc_output_line:n {#2}
     \group_end:
   }
 \cs_new_protected:Npn \__ctxdoc_module_verb:w #1 \q_stop
   {
     \cs_gset_eq:NN \__ctxdoc_verbatim_process_line: \__ctxdoc_process_verb_line:
     \tl_gset:Nx \g__ctxdoc_verbatim_verb_stop_tl
       { \c_percent_str \tl_tail:n {#1} }
     \__ctxdoc_output_module:nn
       { \color { verb@guard } }
       {
         \__ctxdoc_swap_cr:
         \__ctxdoc_module_push:n { \l__ctxdoc_verbatim_line_tl }
       }
   }
\group_end:
\cs_new_protected_nopar:Npn \__ctxdoc_output_line:
 {
   \tex_noindent:D
   \__ctxdoc_replace_at_at:N \l__ctxdoc_verbatim_line_tl
   \tl_use:N \l__ctxdoc_verbatim_line_tl
 }
\cs_new_protected:Npn \__ctxdoc_replace_at_at:N #1
 {
   \tl_if_empty:NF \g__codedoc_module_name_tl
     {
       \exp_args:NNo \__ctxdoc_replace_at_at_aux:Nn
         #1 \g__codedoc_module_name_tl
     }
 }
\cs_new_protected:Npx \__ctxdoc_replace_at_at_aux:Nn #1#2
 {
   \tl_replace_all:Nnn #1 { \token_to_str:N @ } { @ }
   \tl_replace_all:Nnn #1 { \token_to_str:N _ } { _ }
   \tl_replace_all:Nnn #1 { @ @ @ @ } { \token_to_str:N a a }
   \tl_replace_all:Nnn #1 { _ _ @ @ } { _ _ #2 }
   \tl_replace_all:Nnn #1 {   _ @ @ } { _ _ #2 }
   \tl_replace_all:Nnn #1 {     @ @ } { _ _ #2 }
   \tl_replace_all:Nnn #1 { \token_to_str:N a a } { @ @ }
 }
\cs_new_protected:Npn \__ctxdoc_output_line:n #1
 {
   \tl_set:Nn \l__ctxdoc_verbatim_line_tl {#1}
   \tl_if_eq:NNTF \l__ctxdoc_verbatim_line_tl \c__ctxdoc_active_cr_tl
     { \tl_use:N \l__ctxdoc_verbatim_line_tl }
     {
       \str_if_eq:eeTF
         { \str_head:N \l__ctxdoc_verbatim_line_tl }
         { \c_percent_str }
         { \__ctxdoc_output_percent_line: }
         { \__ctxdoc_output_line: }
     }
 }
\cs_new_protected:Npn \__ctxdoc_output_percent_line:
 {
   \tex_noindent:D
   \group_begin:
     \color { code@gray }
     \__ctxdoc_swap_cr:
     \str_if_eq:eeTF { \f@shape } { \updefault }
       { \slshape }
       { \upshape }
     \__ctxdoc_output_line:
   \group_end:
 }
\cs_new_protected_nopar:Npn \__ctxdoc_module_push:n
 { \exp_args:No \__ctxdoc_module_push_aux:nn { \int_use:N \c@HD@hypercount } }
\cs_new_protected:Npn \__ctxdoc_module_push_aux:nn #1
 {
   \seq_gpush:Nn \g__ctxdoc_module_dest_seq {#1}
   \hypersetup { hidelinks }
   \exp_args:Nx \hdclindex
     { \zref@extractdefault { HD.#1 } { guard@end } { 1 } } { }
 }
\cs_new_protected_nopar:Npn \__ctxdoc_module_pop:n
 {
   \seq_gpop:NNTF \g__ctxdoc_module_dest_seq \l__ctxdoc_tmp_tl
     { \exp_args:No \__ctxdoc_module_pop_aux:nn { \l__ctxdoc_tmp_tl } }
     { \BOOM \use:n }
 }
\cs_new_protected:Npn \__ctxdoc_module_pop_aux:nn #1
 {
   \zref@labelbylist { HD.#1 } { ctxdoc }
   \hypersetup { hidelinks }
   \hdclindex {#1} { }
 }
\seq_new:N \g__ctxdoc_module_dest_seq
\zref@newlist { ctxdoc }
\zref@newprop { guard@end } [ 1 ]
 { \int_eval:n { \c@HD@hypercount - 1 } }
\zref@addprop { ctxdoc } { guard@end }
\cs_new_protected_nopar:Npn \__ctxdoc_star_format:
 {
   \seq_gpush:No \g__ctxdoc_slash_format_seq { \macro@font }
   \seq_gpop:NNF \g__ctxdoc_star_format_seq \l__ctxdoc_format_tl
     { \__ctxdoc_pop_format: }
   \__ctxdoc_select_format:
 }
\cs_new_protected_nopar:Npn \__ctxdoc_slash_format:
 {
   \seq_gpop:NNTF \g__ctxdoc_slash_format_seq \l__ctxdoc_format_tl
     {
       \seq_gpush:No \g__ctxdoc_star_format_seq { \macro@font }
       \__ctxdoc_select_format:
     }
     { \BOOM }
 }
\cs_new_protected_nopar:Npn \__ctxdoc_pm_format:
 {
   \seq_get:NNF \g__ctxdoc_star_format_seq \l__ctxdoc_format_tl
     {
       \__ctxdoc_pop_format:
       \seq_gpush:No \g__ctxdoc_star_format_seq { \l__ctxdoc_format_tl }
     }
   \cs_if_eq:NNF \macro@font \l__ctxdoc_format_tl
     { \l__ctxdoc_format_tl }
 }
\cs_new_protected_nopar:Npn \__ctxdoc_pop_format:
 {
   \seq_gpop_left:NN \g__ctxdoc_format_seq \l__ctxdoc_format_tl
   \seq_gput_right:No \g__ctxdoc_format_seq { \l__ctxdoc_format_tl }
 }
\cs_new_protected_nopar:Npn \__ctxdoc_select_format:
 {
   \cs_if_eq:NNF \macro@font \l__ctxdoc_format_tl
     {
       \cs_gset_eq:NN \macro@font \l__ctxdoc_format_tl
       \macro@font
     }
 }
\tl_new:N \l__ctxdoc_format_tl
\seq_new:N \g__ctxdoc_format_seq
\seq_new:N \g__ctxdoc_star_format_seq
\seq_new:N \g__ctxdoc_slash_format_seq
\seq_gput_right:Nn \g__ctxdoc_format_seq { \MacroFont }
\seq_gput_right:Nn \g__ctxdoc_format_seq { \AltMacroFont }
\cs_set_protected:Npn \MacroFont
 {
   \linespread { 1 }
   \small
   \fontseries { \mddefault }
   \fontshape  { \updefault }
   \ttfamily
   \ctexdocverbaddon
 }
\cs_set_protected:Npn \AltMacroFont
 {
   \linespread { 1 }
   \small
   \fontseries { \mddefault }
   \fontshape  { \sldefault }
   \ttfamily
   \ctexdocverbaddon
 }
\AtBeginDocument
 {
   \tl_gset:Nx \macro@font
     { \seq_item:Nn \g__ctxdoc_format_seq { 1 } }
 }
\cs_new_protected:Npn \__ctxdoc_output_module:nn #1#2
 {
   \tex_noindent:D
   \group_begin:
     #1
     \footnotesize \normalfont \sffamily #2
   \group_end:
 }
\cs_new_protected_nopar:Npn \__ctxdoc_star_color:
 {
   \seq_gpop:NNTF \g__ctxdoc_star_color_seq \current@color
     { \set@color }
     { \__ctxdoc_select_color: }
   \seq_gpush:No \g__ctxdoc_slash_color_seq { \current@color }
 }
\cs_new_protected_nopar:Npn \__ctxdoc_slash_color:
 {
   \seq_gpop:NNTF \g__ctxdoc_slash_color_seq \current@color
     {
       \set@color
       \seq_gpush:No \g__ctxdoc_star_color_seq { \current@color }
     }
     { \BOOM }
 }
\cs_new_protected_nopar:Npn \__ctxdoc_pm_color:
 {
   \seq_get:NNTF \g__ctxdoc_star_color_seq \current@color
     { \set@color }
     {
       \__ctxdoc_select_color:
       \seq_gpush:No \g__ctxdoc_star_color_seq { \current@color }
     }
 }
\seq_new:N \g__ctxdoc_star_color_seq
\seq_new:N \g__ctxdoc_slash_color_seq
\cs_new_protected_nopar:Npn \__ctxdoc_select_color:
 { \color { guard@series!!+ } }
\definecolorseries { guard@series }
 { cmyk } { last } { blue } { purple }
\resetcolorseries [ 3 ] { guard@series }
\definecolor { verb@guard } { rgb }  { 0.5  , 0.5 , 0 }
\definecolor { at@guard }   { rgb }  { 0.5  , 0   , 0.5 }
\definecolor { code@gray }  { gray } { 0.5 }
\cs_new_protected:Npn \__ctxdoc_module_angle:n #1
 { \textlangle #1 \textrangle }
\cs_new_protected_nopar:Npn \__ctxdoc_code_line_no:
 {
   \int_gincr:N \c@CodelineNo
   \hbox_overlap_left:n
     {
       \hbox_to_wd:nn
         { \MacroIndent }
         {
           \HD@target
           \tex_hss:D
           \__ctxdoc_code_line_no_style:
           \theCodelineNo \enspace
         }
       \tex_kern:D \@totalleftmargin
     }
 }
\tl_set:Nn \theCodelineNo
 { \arabic { CodelineNo } }
\cs_new_protected_nopar:Npn \__ctxdoc_code_line_no_style:
 { \color { code@gray } \normalfont \sffamily \tiny }
\cs_set_protected:Npn \HD@SetMacroIndent #1
 {
   \group_begin:
     \settowidth \MacroIndent
       {
         \__ctxdoc_code_line_no_style:
         \prg_replicate:nn { \tl_count:n {#1} } { 0 }
         \enspace
       }
     \dim_gset_eq:NN \MacroIndent \MacroIndent
   \group_end:
 }
\ExplSyntaxOff
\AtBeginDocument{\addtocontents{toc}{\StopSpecialIndexModule}}
\pdfstringdefDisableCommands{%
 \let\path\meta
 \let\opt\@firstofone}
\preto\@thehead{\cslet{MakeUppercase\space}{\@iden}}
\def\orbar{\textup{\textbar}}
\def\defaultval#1{\textbf{\textup{#1}}}
\def\defaultvalaux#1){\defaultval{#1}}
\def\TF{true\orbar false}
\def\TTF{\defaultval{true}\orbar false}
\def\TFF{true\orbar\defaultval{false}}
\protected\def\opt{\texttt}
\def\TeX{\hologo{TeX}}
\def\pdfTeX{\hologo{pdfTeX}}
\def\XeTeX{\hologo{XeTeX}}
\def\XeLaTeX{\hologo{XeLaTeX}}
\def\LuaLaTeX{\hologo{LuaLaTeX}}
\def\pdfLaTeX{\hologo{pdfLaTeX}}
\def\LaTeX{\hologo{LaTeX}}
\def\LaTeXe{\hologo{LaTeX2e}}
\def\LaTeXiii{\hologo{LaTeX3}}
\def\dvipdfmx{\hologo{DVIPDFMx}}
\def\TeXLive{\hologo{TeXLive}}
\def\MiKTeX{\hologo{MiKTeX}}
\def\pTeX{\hologo{pTeX}}
\def\ApTeX{\hologo{ApTeX}}
\def\upTeX{\hologo{upTeX}}
\def\ApLaTeX{\hologo{ApLaTeX}}
\def\upLaTeX{\hologo{upLaTeX}}
\def\HoLogo@pTeX#1{p\kern -.15em \hologo{TeX}}
\def\HoLogo@pLaTeX#1{p\kern -.05em \hologo{LaTeX}}
\def\HoLogo@ApTeX#1{A\kern -.05em \hologo{pTeX}}
\def\HoLogo@upTeX#1{u\kern -.05em \hologo{pTeX}}
\def\HoLogo@ApLaTeX#1{A\kern -.05em \hologo{pLaTeX}}
\def\HoLogo@upLaTeX#1{u\kern -.05em \hologo{pLaTeX}}
\def\HoLogoBkm@pTeX#1{p\hologo{TeX}}
\def\HoLogoBkm@pLaTeX#1{p\hologo{LaTeX}}
\def\HoLogoBkm@ApTeX#1{A\hologo{pTeX}}
\def\HoLogoBkm@upTeX#1{u\hologo{pTeX}}
\def\HoLogoBkm@ApLaTeX#1{A\hologo{pLaTeX}}
\def\HoLogoBkm@upLaTeX#1{u\hologo{pLaTeX}}
\def\HoLogo@TeXLive#1{\TeX\ Live}
\def\HoLogo@DVIPDFMx#1{DVIPDFM\ensuremath{x}}
\def\bashcmd{\texttt}
\def\BSTACK{\begin{tabular}[t]{@{}l@{}}}
\def\ESTACK{\end{tabular}}
\newenvironment{defaultcapconfig}{%
 \MakePercentComment
 \input{ctex-name-utf8.cfg}%
 \ExplSyntaxOff
 \MakePercentIgnore}{}
\def\ctexkit{\href{https://github.com/CTeX-org/ctex-kit/}{\texttt{ctex-kit}}}
\def\ctexkitrev#1{%
 \href{https://github.com/CTeX-org/ctex-kit/commit/#1}{\texttt{ctex-kit} rev. #1}}
\appto\GlossaryParms{%
 \raggedcolumns
 \let\Hy@writebookmark\HDorg@writebookmark
 \def\@idxitem{\par\hangindent 2em }%
 \def\subitem{\@idxitem\hspace*{1em}}%
 \def\subsubitem{\@idxitem\hspace*{2em}}}
\def\glossaryname{版本历史}
\GlossaryPrologue{\section{\glossaryname}}
\IndexPrologue{%
 \section{\indexname}
 \textit{意大利体的数字表示描述对应索引项的页码;
 带下划线的数字表示定义对应索引项的代码行号;
 罗马字体的数字表示使用对应索引项的代码行号。}}
\def\IndexLayout{%
 \newgeometry{hmargin=15mm,vmargin={25mm,15mm},footskip=7mm}%
 \setlength\IndexMin{.5\textheight}%
 \ctexset{section/numbering=false}%
 \StopSpecialIndexModule}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
%%
%%
%% End of file ctxdoc.cls.