<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
% !TEX program  = XeLaTeX
%&lt;*internal&gt;
\iffalse
%&lt;/internal&gt;
%&lt;*readme&gt;
xeCJK
=====

`xeCJK` is a package written for XeLaTeX which allows users to typeset
CJK scripts easily.

 - Different default fonts for CJK and other characters.
 - Spaces automatically ignored between CJK characters.
 - Special effects on full-width CJK punctuation.
 - Automatic adjustment of the space between CJK and other characters.

Contributing
------------

This package is a part of the [ctex-kit](https://github.com/CTeX-org/ctex-kit) project.

Issues and pull requests are welcome.

Copyright and Licence
---------------------

    Copyright (C) 2007--2010 by Wenchang Sun &lt;sunwch@nankai.edu.cn&gt;
    Copyright (C) 2009--2022 by Leo Liu &lt;leoliu.pku@gmail.com&gt;
    Copyright (C) 2012--2022 by Qing Lee &lt;sobenlee@gmail.com&gt;
    ----------------------------------------------------------------------

    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 and Qing Lee.

    This package consists of the files xeCJK.dtx,
                                       full-stop.map,
                                       fullwidth-stop.map,
                                       han-simp.map,
                                       han-trad.map,
                 and the derived files xeCJK.pdf,
                                       xeCJK.sty,
                                       xeCJK.cfg,
                                       xeCJK.ins,
                                       xeCJKfntef.sty,
                                       xeCJK-listings.sty,
                                       xunicode-addon.sty,
                                       xunicode-extra.def,
                                       xeCJK-example-autofake.tex,
                                       xeCJK-example-fallback.tex,
                                       xeCJK-example-subCJKblock.tex,
                                       xeCJK-example-CJKecglue.tex,
                                       xeCJK-example-checksingle.tex,
                                       xeCJK-example-CJKfntef.tex,
                                       xeCJK-example-punctstyle.tex,
                                       xeCJK-example-verbatim.tex,
                                       xeCJK-example-CM.tex,
                                       xeCJK-example-listings.tex,
                                       xeCJK-example-mathblock.tex,
                                       xunicode-symbols.tex,
                                       xunicode-commands.tex,
                                       xunicode-combine-marks.tex,
                                       xunicode-symbols.pdf,
                                       full-stop.tec,
                                       fullwidth-stop.tec,
                                       han-simp.tec,
                                       han-trad.tec, and
                                       README.md (this file).
%&lt;/readme&gt;
%&lt;*internal&gt;
\fi
\begingroup
  \def\temp{LaTeX2e}
\expandafter\endgroup\ifx\temp\fmtname\else
\csname fi\endcsname
%&lt;/internal&gt;
%&lt;*install&gt;

\input ctxdocstrip %

\preamble

    Copyright (C) 2007--2010 by Wenchang Sun &lt;sunwch@nankai.edu.cn&gt;
    Copyright (C) 2009--2022 by Leo Liu &lt;leoliu.pku@gmail.com&gt;
    Copyright (C) 2012--2022 by Qing Lee &lt;sobenlee@gmail.com&gt;
----------------------------------------------------------------------

    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 and Qing Lee.

----------------------------------------------------------------------

\endpreamble
\postamble

    This package consists of the files xeCJK.dtx,
                                       full-stop.map,
                                       fullwidth-stop.map,
                                       han-simp.map,
                                       han-trad.map,
                 and the derived files xeCJK.pdf,
                                       xeCJK.sty,
                                       xeCJK.cfg,
                                       xeCJK.ins,
                                       xeCJKfntef.sty,
                                       xeCJK-listings.sty,
                                       xunicode-addon.sty,
                                       xunicode-extra.def,
                                       xeCJK-example-autofake.tex,
                                       xeCJK-example-fallback.tex,
                                       xeCJK-example-subCJKblock.tex,
                                       xeCJK-example-CJKecglue.tex,
                                       xeCJK-example-checksingle.tex,
                                       xeCJK-example-CJKfntef.tex,
                                       xeCJK-example-punctstyle.tex,
                                       xeCJK-example-verbatim.tex,
                                       xeCJK-example-CM.tex,
                                       xeCJK-example-listings.tex,
                                       xeCJK-example-mathblock.tex,
                                       xunicode-symbols.tex,
                                       xunicode-commands.tex,
                                       xunicode-combine-marks.tex,
                                       xunicode-symbols.pdf,
                                       full-stop.tec,
                                       fullwidth-stop.tec,
                                       han-simp.tec,
                                       han-trad.tec, and
                                       README.md.
\endpostamble

\generate
  {
%&lt;/install&gt;
%&lt;*internal&gt;
    \usedir{source/xelatex/xecjk}
    \file{xeCJK.ins}                      {\from{\jobname.dtx}{install}}
%&lt;/internal&gt;
%&lt;*install&gt;
    \usedir{tex/xelatex/xecjk}
    \file{xeCJK.sty}                      {\from{\jobname.dtx}{package}}
    \file{xeCJKfntef.sty}                 {\from{\jobname.dtx}{fntef}}
    \file{xeCJK-listings.sty}             {\from{\jobname.dtx}{listings}}
    \file{xunicode-addon.sty}             {\from{\jobname.dtx}{xunicode}}
    \file{xunicode-extra.def}             {\from{\jobname.dtx}{xunextra}}
    \usepreamble\emptypreamble
    \usepostamble\emptypostamble
    \usedir{tex/xelatex/xecjk/config}
    \file{xeCJK.cfg}                      {\from{\jobname.dtx}{config}}
    \usedir{doc/xelatex/xecjk/example}
    \file{xeCJK-example-autofake.tex}     {\from{\jobname.dtx}{ex-autofake}}
    \file{xeCJK-example-fallback.tex}     {\from{\jobname.dtx}{ex-fallback}}
    \file{xeCJK-example-subCJKblock.tex}  {\from{\jobname.dtx}{ex-block}}
    \file{xeCJK-example-CJKecglue.tex}    {\from{\jobname.dtx}{ex-ecglue}}
    \file{xeCJK-example-checksingle.tex}  {\from{\jobname.dtx}{ex-single}}
    \file{xeCJK-example-CJKfntef.tex}     {\from{\jobname.dtx}{ex-fntef}}
    \file{xeCJK-example-punctstyle.tex}   {\from{\jobname.dtx}{ex-punctstyle}}
    \file{xeCJK-example-verbatim.tex}     {\from{\jobname.dtx}{ex-verb}}
    \file{xeCJK-example-CM.tex}           {\from{\jobname.dtx}{ex-cm}}
    \file{xeCJK-example-listings.tex}     {\from{\jobname.dtx}{ex-listings}}
    \file{xeCJK-example-mathblock.tex}    {\from{\jobname.dtx}{ex-mathblock}}
    \file{xunicode-symbols.tex}           {\from{\jobname.dtx}{xunicode-symbols}}
    \nopreamble\nopostamble
    \usedir{doc/xelatex/xecjk}
    \file{README.md}                      {\from{\jobname.dtx}{readme}}
  }

\endbatchfile
%&lt;/install&gt;
%&lt;*internal&gt;
\fi
%&lt;/internal&gt;
%&lt;*package|config|fntef|listings|xunicode|xunextra&gt;
%&lt;!(config|xunextra)&gt;\NeedsTeXFormat{LaTeX2e}
%&lt;!(config|xunextra)&gt;\RequirePackage{expl3}
%&lt;+!driver&gt;\GetIdInfo$Id: xeCJK.dtx c4ccfae 2022-08-05 21:02:32 +0800 Qing Lee &lt;sobenlee@gmail.com&gt; $
%&lt;package&gt;  {Typesetting CJK scripts with XeLaTeX}
%&lt;config&gt;  {Configuration file for xeCJK package}
%&lt;fntef&gt;  {xeCJK font effect}
%&lt;listings&gt;  {xeCJK patch file for listings}
%&lt;xunicode&gt;  {addon file for xunicode}
%&lt;xunextra&gt;  {extra definition for xunicode}
%&lt;package&gt;\ProvidesExplPackage{\ExplFileName}
%&lt;config&gt;\ProvidesExplFile{\ExplFileName.cfg}
%&lt;fntef&gt;\ProvidesExplPackage{xeCJKfntef}
%&lt;listings&gt;\ProvidesExplPackage{xeCJK-listings}
%&lt;xunicode&gt;\ProvidesExplPackage{xunicode-addon}
%&lt;xunextra&gt;\ProvidesExplFile{xunicode-extra.def}
%&lt;!driver&gt;  {\ExplFileDate}{3.9.1}{\ExplFileDescription}
%&lt;/package|config|fntef|listings|xunicode|xunextra&gt;
%&lt;*driver&gt;
\documentclass{ctxdoc}
\usepackage{xeCJKfntef}
\xeCJKDeclareSubCJKBlock{SP} { "2E3A , "301C , "30A0 , "FF65 }
\xeCJKDeclareSubCJKBlock{Ext-B} { "20000 -&gt; "2A6DF }
\xeCJKDeclareSubCJKBlock{Hangul}
  { "1100 -&gt; "11FF, "3130 -&gt; "318F, "A960 -&gt; "A97F, "AC00 -&gt; "D7AF }
\setCJKmainfont[SP, Language=Chinese Simplified]{Source Han Serif SC}
\setCJKmainfont[Ext-B]{SimSun-ExtB}
\setCJKmainfont[Hangul, Script=Hangul, Language=Korean]{Source Han Serif K}
\newlist{psopt}{description}{3}
\setlist[psopt]{%
  font=\mdseries\ttfamily, align=right,
  labelsep=.5em, leftmargin=4.5em, labelindent=0pt}
\newcommand\PSKeyVal[2]{%
  \item[#1]\makebox[4em][l]{\meta{#2}}\ignorespaces}
\newcommand\tokslink[1]{\hyperlink{#1}{\ding{51}}}
\newcommand\ghissue[1]{%
  \href{https://github.com/CTeX-org/ctex-kit/issues/#1}{\##1}}
\AtBeginDocument{\DeleteShortVerb{\"}}
\ExplSyntaxOn
\NewDocumentCommand \PrintPunctList { O{7} m m }
  {
    \par
    \begingroup
    \CJKfontspec[Language=Chinese ~ Simplified]{Source ~ Han ~ Serif ~ SC}
    \tl_clear:N \l_tmpa_tl
    \int_zero:N \l_tmpa_int
    \tl_set:Nx \l_tmpb_tl { \tl_to_str:n { c__xeCJK_#2_chars_clist } }
    \int_set:Nn \l_tmpb_int { \clist_count:c { \l_tmpb_tl } }
    \clist_map_inline:cn { \l_tmpb_tl }
      {
        \int_incr:N \l_tmpa_int
        \tl_put_right:Nx \l_tmpa_tl
          {
            \use_none:n ##1 &amp; \tex_char:D ##1 \scan_stop:
            \int_compare:nNnF \l_tmpa_int = \l_tmpb_int
              {
                \int_compare:nNnTF { \int_mod:nn \l_tmpa_int {#1} } = \c_zero_int
                  { \exp_not:N \\ \scan_stop: } { &amp; }
              }
          }
      }
    \noindent\hfill\linespread{1}\selectfont
    \begin{tabular}{|*{#1}{&gt;{\footnotesize\ttfamily U+}c|c|}}
      \tl_use:N \l_tmpa_tl
    \end{tabular}\hfill\null
    \endgroup
    \par
  }
\ExplSyntaxOff
\begin{document}
  \DocInput{\jobname.dtx}
  \IndexLayout
  \PrintChanges
  \PrintIndex
\end{document}
%&lt;/driver&gt;
% \fi
%
% \changes{v3.1.0}{2012/11/13}{æ”¾å¼ƒå¯¹ \tn{outer} å®çš„ç‰¹æ®Šå¤„ç†ã€‚}
% \changes{v3.1.1}{2012/12/07}{ä¸å†ä¾èµ– \pkg{xpatch} å®åŒ…ã€‚}
% \changes{v3.2.2}{2013/06/01}{ä¿®æ­£æŸäº›é‡éŸ³ä¸èƒ½æ­£ç¡®æ˜¾ç¤ºçš„é—®é¢˜ã€‚}
% \changes{v3.2.3}{2013/06/07}{æä¾›å››ä¸ª TECkit æ˜&nbsp;å°„æ–‡ä»¶ç”¨äºŽå¥å·è½¬æ¢å’Œç®€ç¹äº’æ¢ã€‚}
% \changes{v3.2.4}{2013/07/02}{éµå¾ª \LaTeXiii{} å˜é‡éœ€è¦é¢„å…ˆå£°æ˜Žçš„åŽŸåˆ™ã€‚}
% \changes{v3.2.6}{2013/07/29}{\texttt{case} ç±»å‡½æ•°çš„ç”¨æ³•ä¸Ž \LaTeXiii{} åŒæ­¥ã€‚}
% \changes{v3.3.2}{2015/05/15}{éš Unicode 7.0.0 æ›´æ–°ç®€ç¹æ±‰å­—æ˜&nbsp;å°„ã€‚}
% \changes{v3.3.3}{2015/09/25}{æ›´æ–° \LaTeXiii{} ä»£ç&nbsp;ã€‚}
% \changes{v3.5.0}{2017/07/19}{å¸¸æ•° \cs{c_minus_one} å·²è¿‡æ—¶ã€‚}
% \changes{v3.5.0}{2017/07/22}{ä½¿ç”¨ \texttt{lazy} å‡½æ•°å¯¹ Boolean è¡¨è¾¾å¼
% è¿›è¡Œæœ€å°åŒ–è¿ç®—ï¼ˆ\LaTeXiii{} 2017/07/19ï¼‰ã€‚}
% \changes{v3.6.0}{2018/01/13}{åŒæ­¥ \LaTeXiii{} 2017/12/16ã€‚}
% \changes{v3.6.1}{2018/02/27}{å‡å°‘ \texttt{bool} è¿ç®—ã€‚}
% \changes{v3.7.2}{2019/03/23}{åŒæ­¥ \LaTeXiii{} 2019/03/05ã€‚}
% \changes{v3.8.0}{2020/02/09}{å…¼å®¹ \LaTeXe\ 2020/02/02 å¯¹ \pkg{NFSS} çš„ä¿®æ”¹ã€‚}
% \changes{v3.8.0}{2020/02/09}{æ¸…ç†è¿‡æ—¶çš„å…¼å®¹æ€§è¡¥ä¸ä»£ç&nbsp;ã€‚}
% \changes{v3.8.3}{2020/04/07}{åˆ&nbsp;é™¤ \texttt{\_nopar}ã€‚}
%
% \CheckSum{11032}
% \GetFileId{xeCJK.sty}
%
% \title{\bfseries\pkg{xeCJK} å®åŒ…}
% \author{\href{http://www.ctex.org}{CTEX.ORG}}
% \date{\filedate\qquad\fileversion\thanks{\ctexkitrev{\ExplFileVersion}.}}
% \maketitle
%
% \tableofcontents
% \vspace{\baselineskip}
%
% \begin{documentation}
%
% \section{ç®€ä»‹}
%
% \pkg{xeCJK} æ˜¯ä¸€ä¸ª \XeLaTeX å®åŒ…ï¼Œç”¨äºŽæŽ’ç‰ˆä¸­æ—¥éŸ©ï¼ˆCJKï¼‰æ–‡å­—ã€‚ä¸»è¦åŠŸèƒ½ï¼š
% \begin{enumerate}
% \item åˆ†åˆ«è®¾ç½® CJK å’Œè‹±æ–‡å­—ä½“ï¼›
% \item è‡ªåŠ¨å¿½ç•¥ CJK æ–‡å­—é—´çš„ç©ºæ&nbsp;¼è€Œä¿ç•™å…¶ä»–ç©ºæ&nbsp;¼ï¼Œå…è®¸åœ¨éžæ&nbsp;‡ç‚¹æ±‰å­—å’Œè‹±æ–‡
% å­—æ¯ (a -- z, A -- Z) é—´æ–­è¡Œï¼›
% \item æä¾›å¤šç§æ&nbsp;‡ç‚¹å¤„ç†æ–¹å¼ï¼š å…¨è§’å¼ã€åŠè§’å¼ã€å¼€æ˜Žå¼ã€è¡Œæœ«åŠè§’å¼å’Œ CCT å¼ï¼›
% \item è‡ªåŠ¨è°ƒæ•´ä¸­è‹±æ–‡é—´ç©ºç™½ã€‚
% \end{enumerate}
%
% \pkg{xeCJK} ä½¿ç”¨äº† \XeTeX çš„ä¸€äº›æœ€æ–°ç‰¹æ€§ï¼Œéœ€è¦ \XeTeX{} 0.9995.0 (2009/06/29) ä»¥
% åŽçš„ç‰ˆæœ¬ã€‚\pkg{xeCJK} ä¾èµ– \LaTeXiii{} é¡¹ç›®çš„å®åŒ…å¥—ä»¶
% \package{l3kernel} å’Œ \package{l3packages}ã€‚
% \pkg{xeCJK} è¿˜éœ€è¦é€šè¿‡ \package{fontspec} å®åŒ…æ¥è°ƒç”¨ç³»ç»Ÿå­—ä½“ã€‚
% \pkg{xeCJK} ä¼šè‡ªåŠ¨æ&nbsp;¹æ®éœ€è¦è½½å…¥è¿™äº›å®åŒ…ã€‚
%
% \pkg{xeCJK} çš„åŽŸå§‹ä½œè€…æ˜¯å­™æ–‡æ˜Œï¼Œ2009 å¹´ 5 æœˆèµ·å®åŒ…è¢«æ”¶å…¥ \ctexkit\ é¡¹ç›®è¿›è¡Œ
% ç»´æŠ¤ï¼Œç›®å‰ä¸»è¦ç»´æŠ¤è€…æ˜¯åˆ˜æµ·æ´‹\footnote{\email{leoliu.pku@gmail.com}} å’Œ
% æŽæ¸…\footnote{\email{sobenlee@gmail.com}}ã€‚
%
% \section{åŸºæœ¬ç”¨æ³•}
%
% ä¸Žå…¶ä»– \LaTeX{} å®åŒ…ä¸€æ&nbsp;·ï¼Œå¼•å…¥ \pkg{xeCJK} å®åŒ…åªè¦åœ¨å¯¼è¨€åŒºä½¿ç”¨
% \begin{frameverb}
%     \usepackage{xeCJK}
% \end{frameverb}
% åœ¨å¼•å…¥ \pkg{xeCJK} å®åŒ…ä¹‹åŽï¼Œåªè¦è®¾ç½® CJK æ–‡å­—çš„å­—ä½“ï¼Œå°±å¯ä»¥åœ¨æ–‡æ¡£ä¸­ä½¿ç”¨ä¸­æ—¥
% éŸ©æ–‡å­—äº†ã€‚
%
% å¯ä»¥åœ¨å„ç§æ–‡æ¡£ç±»ä¸­ä½¿ç”¨ \pkg{xeCJK} å®åŒ…ï¼Œæœ€ç®€å•çš„ç¤ºä¾‹æ˜¯ï¼š
% \begin{ctexexam}
%   \documentclass{article}
%   \usepackage{xeCJK}
%   \setCJKmainfont{SimSun}
%
%   \begin{document}
%   ä¸­æ–‡ \LaTeX ç¤ºä¾‹ã€‚
%   \end{document}
% \end{ctexexam}
% ä¸Šè¿°ç¤ºä¾‹è®¾ç½®äº†ä¸­æ–‡å­—ä½“ SimSunï¼ˆå®‹ä½“ï¼‰ã€‚è¿è¡Œæ­¤ç¤ºä¾‹è¦æ±‚ç³»ç»Ÿå®‰è£…äº†è®¾ç½®çš„å­—ä½“ï¼Œ
% æºæ–‡ä»¶ç”¨ UTF-8 ç¼–ç&nbsp;ä¿å­˜ï¼Œä½¿ç”¨ \XeLaTeX{} ç¼–è¯‘ã€‚
%
% \pkg{xeCJK} åªæä¾›äº†å­—ä½“å’Œæ&nbsp;‡ç‚¹æŽ§åˆ¶ç­‰åŸºæœ¬ CJK è¯­è¨€æ”¯æŒã€‚å¯¹äºŽä¸­æ–‡æ–‡æ¡£ï¼Œå¯ä»¥ä½¿
% ç”¨æ›´ä¸ºé«˜å±‚çš„ \package{ctex} å®åŒ…æˆ–æ–‡æ¡£ç±»ï¼Œå®ƒå°†è‡ªåŠ¨è°ƒç”¨ \pkg{xeCJK} å¹¶è®¾ç½®å¥½ä¸­æ–‡
% å­—ä½“ï¼ŒåŒæ—¶æä¾›äº†è¿›ä¸€æ­¥çš„æœ¬åœ°åŒ–æ”¯æŒã€‚è¯¦ç»†å†…å®¹å‚çœ‹ \package{ctex} å®åŒ…å¥—ä»¶çš„è¯´æ˜Žã€‚
%
% \pkg{xeCJK} æä¾›äº†å¤§é‡é€‰é¡¹ï¼Œå¯ä»¥åœ¨å®åŒ…è°ƒç”¨æ—¶ä½œä¸ºå®åŒ…é€‰é¡¹æˆ–ç”¨ \tn{xeCJKsetup}
% å‘½ä»¤è¿›è¡Œè®¾ç½®ï¼Œè¯¦è§ \ref{subsec:opts}~èŠ‚ã€‚é™¤äº† \tn{setCJKmainfont} å‘½ä»¤ï¼Œ
% \pkg{xeCJK} è¿˜æä¾›äº†è®¸å¤šå…¶ä»–å‘½ä»¤è®¾ç½®å’Œé€‰æ‹©ä¸­æ–‡å­—ä½“ï¼Œè¯¦è§
% \ref{subsec:fontset}~èŠ‚ã€‚å…¶ä»–æ›´è¯¦ç»†çš„åŠŸèƒ½ä¹Ÿéƒ½å°†åœ¨ä¸‹é¢è¯¦ç»†è¯´æ˜Žã€‚åœ¨æœ¬æ–‡æ¡£æ‰€åœ¨çš„
% æ–‡ä»¶å¤¹çš„ |example| ç›®å½•ä¸‹é¢ä¹Ÿæœ‰ä¸€äº›ä¾‹å­å¯ä»¥å‚è€ƒã€‚
%
% \section{ç”¨æˆ·æ‰‹å†Œ}
%
% \subsection{å®åŒ…é€‰é¡¹}
% \label{subsec:opts}
%
% \pkg{xeCJK} ä»¥ \meta{key}|=|\meta{var} çš„å½¢å¼æä¾›å®åŒ…é€‰é¡¹ï¼Œä½&nbsp;å¯ä»¥åœ¨è°ƒç”¨å®åŒ…
% çš„æ—¶å€™ç›´æŽ¥è®¾ç½®è¿™äº›é€‰é¡¹ï¼Œä¹Ÿå¯ä»¥åœ¨è°ƒç”¨å®åŒ…ä¹‹åŽä½¿ç”¨ \tn{xeCJKsetup} æ¥è®¾ç½®è¿™äº›é€‰
% é¡¹ã€‚\pkg{xeCJK} å†…éƒ¨è°ƒç”¨ \pkg{fontspec} å®åŒ…ï¼Œå¯ä»¥åœ¨è°ƒç”¨ \pkg{xeCJK} çš„æ—¶å€™ï¼Œ
% ä½¿ç”¨å®ƒçš„å®åŒ…é€‰é¡¹ã€‚\pkg{xeCJK} ä¼šå°† \pkg{fontspec} çš„é€‰é¡¹ä¼&nbsp;é€’ç»™å®ƒã€‚
%
% \begin{function}{\xeCJKsetup}
%   \begin{syntax}
%     \tn{xeCJKsetup} \{\meta{key_1}=\meta{val_1}, \meta{key_2}=\meta{val_2}, ...\}
%   \end{syntax}
%   å…¶ä¸­ \meta{key_1}, \meta{key_2} æ˜¯è®¾ç½®é€‰é¡¹ï¼Œè€Œ \meta{val_1}, \meta{val_2} åˆ™æ˜¯å¯¹åº”é€‰é¡¹çš„
%   è®¾ç½®å†…å®¹ã€‚å¤šä¸ªé€‰é¡¹å¯ä»¥åœ¨ä¸€ä¸ªè¯­å¥ä¸­å®Œæˆè®¾ç½®ã€‚ä¾‹å¦‚
%   \begin{ctexexam}
%   \usepackage[PunctStyle=kaiming]{xeCJK}
%   \end{ctexexam}
%   ç­‰ä»·äºŽ
%   \begin{ctexexam}
%   \usepackage{xeCJK}
%   ......
%   \xeCJKsetup{PunctStyle=kaiming}
%   \end{ctexexam}
% \end{function}
%
% å¸¦æœ‰ \exptarget\expstar{} æˆ–è€… \rexptarget\rexpstar{} æ&nbsp;‡è®°çš„é€‰é¡¹æˆ–å‘½ä»¤
% åªèƒ½åœ¨å¯¼è¨€åŒºä¸­ä½¿ç”¨ï¼Œå…¶ä¸­ \rexptarget\rexpstar{} è¿˜è¡¨ç¤ºè¿™ä¸ªé€‰é¡¹æˆ–å‘½ä»¤åª
% å½±å“éšåŽå®šä¹‰çš„ CJK å­—ä½“ã€‚å…¶ä½™ä¸å¸¦ç‰¹æ®Šæ&nbsp;‡è®°çš„é€‰é¡¹æˆ–å‘½ä»¤ï¼Œå¦‚æžœæ²¡æœ‰ç‰¹åˆ«è¯´æ˜Žï¼Œ
% åˆ™å¯ä»¥åœ¨å¯¼è¨€åŒºæˆ–æ­£æ–‡ä¸­ä½¿ç”¨ã€‚\textbf{ç²—ä½“}è¡¨ç¤º \pkg{xeCJK} çš„é»˜è®¤è®¾ç½®ã€‚
%
% \begin{function}[EXP,added=2012-11-22]{LocalConfig}
%   \begin{syntax}
%     LocalConfig = \Arg{\TTF|name}
%   \end{syntax}
%   æ˜¯å¦ä½¿ç”¨æœ¬åœ°é…ç½®æ–‡ä»¶ \texttt{xeCJK-\meta{name}.cfg}ã€‚\meta{name} å¯ä»¥æ˜¯ä¸åŒ…å«
%   ç©ºæ&nbsp;¼çš„ä»»æ„ä½¿æ–‡ä»¶ååˆæ³•çš„å­—ç¬¦ä¸²ã€‚å¦‚æžœè®¾ç½®ä¸º |true|ï¼Œåˆ™ä½¿ç”¨çš„æ˜¯ \texttt{xeCJK.cfg}ï¼›
%   è®¾ç½®ä¸º |false| åˆ™ä¸è½½å…¥é…ç½®æ–‡ä»¶ã€‚å¯ä»¥æŠŠå°†è¦åœ¨ä¸‹æ–‡ä»‹ç»åˆ°çš„å¯¹ \pkg{xeCJK} çš„ä¸€äº›
%   è®¾ç½®ï¼ˆä¾‹å¦‚è®¾ç½®å¸¸ç”¨ CJK å­—ä½“ã€ä¿®æ”¹å­—ç¬¦èŒƒå›´å’Œå®šä¹‰æ–°çš„æ&nbsp;‡ç‚¹è¾“å‡ºæ&nbsp;¼å¼ç­‰ï¼‰ä¿å­˜åˆ°æ–‡ä»¶
%   \texttt{xeCJK-\meta{name}.cfg}ã€‚ç„¶åŽæŠŠè¿™ä¸ªæ–‡ä»¶æ”¾åœ¨æœ¬åœ°çš„ |TDS| ç›®å½•ä¸‹çš„é€‚å½“
%   ä½ç½®ã€‚ä½¿ç”¨ \TeX~Live çš„ç”¨æˆ·ï¼Œå¯ä»¥æ–°å»ºä¸‹åˆ—ç›®å½•ï¼Œç„¶åŽå†æŠŠ
%   \texttt{xeCJK-\meta{name}.cfg} æ”¾åœ¨é‡Œé¢ï¼š
%   \begin{frameverb}
%   texlive/texmf-local/tex/xelatex/xecjk
%   \end{frameverb}
%   æœ€åŽè¿˜éœ€è¦åœ¨å‘½ä»¤è¡Œä¸‹æ‰§è¡Œ |mktexlsr|ï¼Œåˆ·æ–°æ–‡ä»¶åæ•°æ®åº“ä»¥ä¾¿ \TeX ç³»ç»Ÿèƒ½å¤Ÿæ‰¾åˆ°å®ƒã€‚
% \end{function}
%
% è¯·æ³¨æ„ï¼Œ\pkg{xeCJK} å®åŒ…ä¸­åªæœ‰ä¸Šè¿° |LocalConfig| é€‰é¡¹éœ€è¦åœ¨è°ƒç”¨ \pkg{xeCJK} æ—¶
% è®¾ç½®ï¼Œè€Œä¸èƒ½é€šè¿‡ \tn{xeCJKsetup} æ¥è®¾ç½®ã€‚
%
% \begin{function}{xeCJKactive}
%   \begin{syntax}
%     xeCJKactive = \meta{\TTF}
%   \end{syntax}
%   æ‰“å¼€/å…³é—­å¯¹ä¸­æ–‡çš„ç‰¹æ®Šå¤„ç†ã€‚äº‹å®žä¸Šï¼Œè¿™ä¸ªé€‰é¡¹ä¼šæ‰“å¼€/å…³é—­ \XeTeX çš„æ•´ä¸ªå­—ç¬¦ç±»æœºåˆ¶ï¼Œä¾èµ–
%   è¿™ä¸ªæœºåˆ¶çš„å®åŒ…éƒ½ä¼šå—åˆ°å½±å“ã€‚
% \end{function}
%
% \begin{function}{CJKspace}
%   \begin{syntax}
%     CJKspace = \meta{\TFF}
%   \end{syntax}
%   ç¼ºçœçŠ¶æ€ä¸‹ï¼Œ\pkg{xeCJK} ä¼šå¿½ç•¥ CJK æ–‡å­—ä¹‹é—´çš„ç©ºæ&nbsp;¼ï¼Œä½¿ç”¨è¿™ä¸€é€‰é¡¹æ¥ä¿ç•™å®ƒä»¬ä¹‹é—´çš„ç©ºæ&nbsp;¼ã€‚
% \end{function}
%
% \begin{function}[EXP,updated=2016-05-04]{CJKmath}
%   \begin{syntax}
%     CJKmath = \meta{\TFF}
%   \end{syntax}
%   æ˜¯å¦æ”¯æŒåœ¨æ•°å­¦çŽ¯å¢ƒä¸­ç›´æŽ¥è¾“å…¥ CJK å­—ç¬¦ã€‚ä½¿ç”¨è¿™ä¸ªé€‰é¡¹åŽï¼Œå¯ä»¥ç›´æŽ¥åœ¨æ•°å­¦çŽ¯å¢ƒä¸­
%   è¾“å‡º CJK å­—ç¬¦ã€‚\pkg{url} å®åŒ…å°†ä¸€ä¸ª URL æ”¾åœ¨ä¸€ä¸ªç‰¹æ®Šçš„æ•°å­¦çŽ¯å¢ƒä¸­æŽ’ç‰ˆï¼Œæ‰€ä»¥å¦‚æžœåœ¨
%   \tn{path} ç­‰å‘½ä»¤çš„è·¯å¾„å‚æ•°ä¸­å«æœ‰æ±‰å­—ï¼Œåˆ™éœ€è¦å¯ç”¨è¿™ä¸ªé€‰é¡¹ï¼Œè·¯å¾„ä¸­çš„æ±‰å­—æ‰èƒ½æ˜¾ç¤ºã€‚
% \end{function}
%
% \begin{function}{CJKglue}
%   \begin{syntax}
%     CJKglue = \{\tn{hskip} 0pt plus 0.08\tn{baselineskip}\}
%   \end{syntax}
%   è®¾ç½® CJK æ–‡å­—ä¹‹é—´æ’å…¥çš„ |glue|ï¼Œä¸Šè¾¹æ˜¯ \pkg{xeCJK} çš„é»˜è®¤å€¼ã€‚ä¸€èˆ¬æ¥è¯´ï¼Œé™¤éžæœ‰
%   ç‰¹æ®Šéœ€è¦ï¼ˆä¾‹å¦‚ï¼Œæ”¹å˜æ–‡å­—é—´è·ç­‰ï¼‰ï¼Œå¦åˆ™ä¸éœ€è¦è®¾ç½®è¿™ä¸ªé€‰é¡¹ï¼Œä½¿ç”¨é»˜è®¤å€¼å³å¯ã€‚å¦‚æžœè¦è®¾ç½®
%   è¿™ä¸ªé€‰é¡¹ï¼Œä¸ºäº†è¡Œæœ«çš„å¯¹é½ï¼Œè®¾ç½®çš„ |glue| æœ€å¥½æœ‰ä¸€å®šçš„å¼¹æ€§ã€‚
% \end{function}
%
% \begin{function}{CJKecglue}
%   \begin{syntax}
%     CJKecglue = \Arg{glue}
%   \end{syntax}
%   è®¾ç½® CJK æ–‡å­—ä¸Žè¥¿æ–‡ã€CJK æ–‡å­—ä¸Žè¡Œå†…æ•°å­¦å…¬å¼ä¹‹é—´çš„é—´è·ï¼Œé»˜è®¤å€¼æ˜¯ä¸€ä¸ªç©ºæ&nbsp;¼ã€‚ä½¿ç”¨è¿™ä¸ª
%   é€‰é¡¹è®¾ç½®çš„ \meta{glue} æœ€å¥½ä¹Ÿè¦ç”¨ä¸€å®šçš„å¼¹æ€§ã€‚è¯·æ³¨æ„ï¼Œè¿™é‡Œè®¾ç½®çš„ \meta{glue} åªå½±å“
%   \pkg{xeCJK} æ&nbsp;¹æ®éœ€è¦è‡ªåŠ¨æ·»åŠ&nbsp;çš„ç©ºç™½ï¼Œæºæ–‡ä»¶ä¸­ç›´æŽ¥è¾“å…¥çš„ CJK æ–‡å­—ä¸Žè¥¿æ–‡ä¹‹é—´çš„ç©ºæ&nbsp;¼ä¸
%   å—å½±å“ï¼ˆç›´æŽ¥è¾“å‡ºï¼‰ã€‚æœ‰æ—¶å€™ \pkg{xeCJK} å¯èƒ½ä¸èƒ½æ­£ç¡®åœ°è°ƒæ•´é—´è·ï¼Œéœ€è¦æ‰‹åŠ¨åŠ&nbsp;ç©ºæ&nbsp;¼ã€‚
% \end{function}
%
% \begin{function}{xCJKecglue}
%   \begin{syntax}
%     xCJKecglue = \Arg{\TFF|glue}
%   \end{syntax}
%   ç¼ºçœçŠ¶æ€ä¸‹ï¼Œ\pkg{xeCJK} ä¸å¯¹æºæ–‡ä»¶ä¸­ç›´æŽ¥è¾“å…¥çš„ CJK æ–‡å­—ä¸Žè¥¿æ–‡ä¹‹é—´çš„ç©ºæ&nbsp;¼è¿›è¡Œè°ƒæ•´ï¼Œå¦‚
%   æžœéœ€è¦è°ƒæ•´ï¼Œè¯·ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ã€‚å¦‚æžœä½¿ç”¨è¿™ä¸ªé€‰é¡¹ï¼Œå°†ä½¿ç”¨ |CJKecglue| æ›¿æ¢æºæ–‡ä»¶ä¸­ç›´æŽ¥è¾“
%   å…¥çš„ CJK æ–‡å­—ä¸Žè¥¿æ–‡ä¹‹é—´çš„ç©ºæ&nbsp;¼ã€‚
% \end{function}
%
% \begin{function}[updated=2013-06-26]{CheckSingle}
%   \begin{syntax}
%     CheckSingle = \meta{\TFF}
%   \end{syntax}
%   æ˜¯å¦é¿å…å•ä¸ª CJK æ–‡å­—å•ç‹¬å&nbsp;ä¸€ä¸ªæ®µè½çš„æœ€åŽä¸€è¡Œã€‚éœ€è¦è¯´æ˜Žçš„æ˜¯ï¼Œè¿™ä¸ªé€‰é¡¹åªæœ‰åœ¨
%   æ®µæœ«çš„æœ€åŽä¸€ä¸ªå­—æ˜¯ CJK æ–‡å­—æˆ–è€…æ&nbsp;‡ç‚¹ç¬¦å·ï¼Œå¹¶ä¸”å€’æ•°ç¬¬äºŒå’Œç¬¬ä¸‰ä¸ªå­—éƒ½æ˜¯æ–‡å­—æ‰èƒ½
%   æ­£ç¡®å¤„ç†å¤„ç†å­¤å­—çš„é—®é¢˜ã€‚å¦‚æžœè¿™å€’æ•°ä¸‰ä¸ªå­—æœ‰ä½œä¸ºæŽ§åˆ¶åºåˆ—çš„å‚æ•°çš„æƒ…å†µï¼Œé‚£ä¹ˆä¸€èˆ¬
%   æ¥è¯´ä¹Ÿä¸èƒ½æ­£ç¡®å¤„ç†ã€‚
% \end{function}
%
% \begin{function}[added=2015-04-08]{WidowPenalty}
%   \begin{syntax}
%     WidowPenalty = \Arg{penalty|(10000)}
%   \end{syntax}
%   ä½¿ç”¨ \texttt{CheckSingle} é€‰é¡¹åŽï¼Œè®¾ç½®æ®µæœ«ä¸‰ä¸ªæ±‰å­—ä¹‹é—´çš„ penaltyã€‚
%   åˆå§‹å€¼ä¸º \num{10000}ï¼Œå³ç¦æ­¢åœ¨å®ƒä»¬ä¹‹é—´æŠ˜è¡Œã€‚
% \end{function}
%
% \begin{function}[added=2012-12-06]{PlainEquation}
%   \begin{syntax}
%     PlainEquation = \meta{\TFF}
%   \end{syntax}
%   å¦‚æžœä½¿ç”¨äº† |$$...$$| çš„å½¢å¼æ¥è¾“å…¥è¡Œé—´æ•°å­¦å…¬å¼ï¼Œå°±éœ€è¦å¯ç”¨æœ¬é€‰é¡¹ï¼Œä»¥ä¾¿
%   |CheckSingle| é€‰é¡¹èƒ½å¤Ÿæ­£ç¡®è¯†åˆ«ã€‚æŽ¨èä½¿ç”¨ |\[...\]| çš„å½¢å¼æ¥è¾“å…¥è¡Œé—´æ•°å­¦å…¬å¼ã€‚
% \end{function}
%
% \begin{function}[added=2012-12-04]{NewLineCS,NewLineCS+,NewLineCS-}
%   \begin{syntax}
%     NewLineCS = \{ \tn{par} \tn{[} \}
%   \end{syntax}
%   è®¾ç½®é€&nbsp;æˆæ–­è¡Œçš„æŽ§åˆ¶åºåˆ—ï¼Œä»¥ä¾¿ |CheckSingle| é€‰é¡¹èƒ½å¤Ÿæ­£ç¡®è¯†åˆ«ã€‚
%   ä»¥ä¸Šæ˜¯ \pkg{xeCJK} çš„åˆå§‹è®¾ç½®ã€‚
% \end{function}
%
% \begin{function}[added=2012-12-04]{EnvCS,EnvCS+,EnvCS-}
%   \begin{syntax}
%     EnvCS = \{ \tn{begin} \tn{end} \}
%   \end{syntax}
%   è®¾ç½® \LaTeX çŽ¯å¢ƒå¼€å§‹å’Œç»“æŸçš„æŽ§åˆ¶åºåˆ—ï¼Œä»¥ä¾¿ |CheckSingle| é€‰é¡¹èƒ½å¤Ÿæ­£ç¡®è¯†åˆ«ã€‚
%   ä»¥ä¸Šæ˜¯ \pkg{xeCJK} çš„åˆå§‹è®¾ç½®ã€‚
% \end{function}
%
% \begin{function}[updated=2012-12-06]{InlineEnv,InlineEnv+,InlineEnv-}
%   \begin{syntax}
%     InlineEnv = \{\meta{env_1}, \meta{env_2}, \meta{env_3}, ...\}
%   \end{syntax}
%   åœ¨ä½¿ç”¨ |CheckSingle| é€‰é¡¹çš„æ—¶å€™ï¼Œ\pkg{xeCJK} ä¼šå°† CJK æ–‡å­—åŽæŽ¥ç€çš„ \LaTeX çŽ¯å¢ƒçš„
%   å¼€å§‹ |\begin{...}| å’Œç»“æŸ |\end{...}| è§†ä¸ºæ–­è¡Œçš„åœ°æ–¹ï¼Œå¦‚æžœæœ‰æŸäº›ç‰¹æ®Š
%   çš„ \LaTeX çŽ¯å¢ƒæ²¡æœ‰é€&nbsp;æˆæ–­è¡Œï¼Œå¯ä»¥ä½¿ç”¨è¿™ä¸ªé€‰é¡¹æ¥å£°æ˜Žå®ƒï¼Œä»¥ä¾¿ |CheckSingle| èƒ½æ­£ç¡®è¯†åˆ«ã€‚
% \end{function}
%
% \begin{function}{AutoFallBack}
%   \begin{syntax}
%     AutoFallBack = \meta{\TFF}
%   \end{syntax}
%   å½“æ–‡æ¡£ä¸­æœ‰ä¸ªåˆ«ç”Ÿåƒ»å­—æ—¶ï¼Œå¯ä»¥ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ï¼Œè‡ªåŠ¨ä½¿ç”¨é¢„å…ˆè®¾ç½®å¥½çš„åŽå¤‡å­—ä½“æ¥è¾“å‡ºè¿™äº›ç”Ÿåƒ»
%   å­—ã€‚åŽå¤‡å­—ä½“çš„è®¾ç½®æ–¹æ³•å°†åœ¨ \ref{subsec:fontset} èŠ‚ä¸­ä»‹ç»ã€‚
% \end{function}
%
% \begin{function}[rEXP]{AutoFakeBold}
%   \begin{syntax}
%     AutoFakeBold = \Arg{\TFF|æ•°å­—}
%   \end{syntax}
%   å…¨å±€è®¾å®šå½“æ²¡æœ‰å£°æ˜Žå¯¹åº”çš„ç²—ä½“æ—¶ï¼Œæ˜¯å¦ä½¿ç”¨^^A
%   \textbf{\CJKfontspec[AutoFakeBold]{FandolSong-Regular.otf}ä¼ªç²—ä½“}ï¼›
%   å½“è¾“å…¥çš„æ˜¯æ•°å­—æ—¶ï¼Œå°†ä½¿ç”¨ä¼ªç²—ä½“ï¼Œå¹¶å°†ä½¿ç”¨è¾“å…¥çš„æ•°å­—ä½œä¸ºä¼ªç²—ä½“çš„é»˜è®¤ç²—ç»†ç¨‹åº¦ã€‚
% \end{function}
%
% \begin{function}[rEXP]{AutoFakeSlant}
%   \begin{syntax}
%     AutoFakeSlant = \Arg{\TFF|æ•°å­—}
%   \end{syntax}
%   å…¨å±€è®¾å®šå½“æ²¡æœ‰å£°æ˜Žå¯¹åº”çš„æ–œä½“æ—¶ï¼Œæ˜¯å¦ä½¿ç”¨^^A
%   \textit{\CJKfontspec[AutoFakeSlant]{FandolSong-Regular.otf}ä¼ªæ–œä½“}ï¼›
%   å½“è¾“å…¥çš„æ˜¯æ•°å­—æ—¶ï¼Œå°†ä½¿ç”¨ä¼ªæ–œä½“ï¼Œå¹¶å°†ä½¿ç”¨è¾“å…¥çš„æ•°å­—ä½œä¸ºä¼ªæ–œä½“çš„é»˜è®¤å€¾æ–œç¨‹åº¦ã€‚
% å€¾æ–œç¨‹åº¦çš„å–å€¼èŒƒå›´æ˜¯ $[-0.999, 0.999]$ã€‚
% \end{function}
%
% \begin{function}[rEXP]{EmboldenFactor}
%   \begin{syntax}
%     EmboldenFactor = \Arg{æ•°å­—|(4)}
%   \end{syntax}
%   è®¾ç½®ä¼ªç²—ä½“çš„é»˜è®¤ç²—ç»†ç¨‹åº¦ã€‚
% \end{function}
%
% \begin{function}[rEXP]{SlantFactor}
%   \begin{syntax}
%     SlantFactor = \Arg{æ•°å­—|(0.167)}
%   \end{syntax}
%   è®¾ç½®ä¼ªæ–œä½“çš„å€¾æ–œç¨‹åº¦ï¼ŒèŒƒå›´æ˜¯ $[-0.999, 0.999]$ã€‚
% \end{function}
%
% \begin{function}[updated=2012-11-10]{PunctStyle}
%   \begin{syntax}
%     PunctStyle = \Arg{(quanjiao)|banjiao|kaiming|hangmobanjiao|CCT|plain|...}
%   \end{syntax}
%   è®¾ç½®æ&nbsp;‡ç‚¹å¤„ç†æ&nbsp;¼å¼ã€‚\pkg{xeCJK} ä¸­é¢„å…ˆå®šä¹‰å¥½çš„æ&nbsp;¼å¼ä¸º
%   \begin{optdesc}
%     \item[quanjiao] å…¨è§’å¼ï¼šæ‰€æœ‰æ&nbsp;‡ç‚¹å&nbsp;ä¸€ä¸ªæ±‰å­—å®½åº¦ï¼Œç›¸é‚»ä¸¤ä¸ªæ&nbsp;‡ç‚¹å&nbsp; 1.5 æ±‰å­—å®½åº¦ï¼›
%     \item[banjiao]  åŠè§’å¼ï¼šæ‰€æœ‰æ&nbsp;‡ç‚¹å&nbsp;åŠä¸ªæ±‰å­—å®½åº¦ï¼›
%     \item[kaiming]  å¼€æ˜Žå¼ï¼šå¥æœ«ç‚¹å·ç”¨å…¨è§’ï¼Œå…¶ä»–åŠè§’ï¼›
%     \item[hangmobanjiao] è¡Œæœ«åŠè§’å¼ï¼šæ‰€æœ‰æ&nbsp;‡ç‚¹å&nbsp;ä¸€ä¸ªæ±‰å­—å®½åº¦ï¼Œè¡Œé¦–è¡Œæœ«å¯¹é½ï¼›
%     \item[CCT]   CCT æ&nbsp;¼å¼ï¼šæ‰€æœ‰æ&nbsp;‡ç‚¹ç¬¦å·çš„å®½åº¦ç•¥å°äºŽä¸€ä¸ªæ±‰å­—å®½åº¦ï¼›
%     \item[plain] åŽŸæ&nbsp;·ï¼ˆä¸è°ƒæ•´æ&nbsp;‡ç‚¹é—´è·ï¼‰ã€‚
%   \end{optdesc}
%   å¯ä»¥ä½¿ç”¨ \ref{subsec:punctstyle} ä¸­ä»‹ç»çš„ \tn{xeCJKDeclarePunctStyle} å®šä¹‰æ–°çš„æ&nbsp;‡ç‚¹
%   æ&nbsp;¼å¼ã€‚
% \end{function}
%
% \begin{function}[added=2018-01-24]{PunctFamily}
%   \begin{syntax}
%     PunctFamily = \Arg{(false)|family}
%   \end{syntax}
%   é»˜è®¤æƒ…å†µä¸‹ï¼ŒCJK æ&nbsp;‡ç‚¹ç¬¦å·çš„å­—ä½“ä¸Ž CJK æ­£æ–‡ä¸€è‡´ï¼Œ\opt{PunctFamily} ç”¨äºŽå•ç‹¬å¯¹æ&nbsp;‡ç‚¹ç¬¦å·è®¾ç½®å­—ä½“ã€‚
%   \meta{family} éœ€è¦ä½¿ç”¨éšåŽè¯´æ˜Žçš„ \tn{setCJKfamilyfont} æˆ– \tn{newCJKfontfamily}
%   é¢„å…ˆå®šä¹‰ã€‚\opt{false} è¡¨ç¤ºå–æ¶ˆæœ¬é€‰é¡¹çš„ä½œç”¨ï¼Œè®©æ&nbsp;‡ç‚¹ç¬¦å·å­—ä½“ä¸Žæ­£æ–‡ä¸€è‡´ã€‚
% \end{function}
%
% \begin{function}[EXP]{KaiMingPunct,KaiMingPunct+,KaiMingPunct-}
%   \begin{syntax}
%     KaiMingPunct = \Arg{( ï¼Ž ã€‚ï¼Ÿ ï¼)}
%   \end{syntax}
%   è®¾ç½®å¼€æ˜Žï¼ˆ|kaiming|ï¼‰æ&nbsp;‡ç‚¹å¤„ç†æ&nbsp;¼å¼æ—¶çš„å¥æœ«ç‚¹å·ï¼Œ|KaiMingPunct| åŽå¸¦çš„ |+| ä¸Ž |-|
%   åˆ†åˆ«è¡¨ç¤ºä»Žå·²æœ‰çš„å¼€æ˜Žå¥æœ«ç‚¹å·ä¸­å¢žåŠ&nbsp;æˆ–å‡å°‘æ&nbsp;‡ç‚¹ã€‚
% \end{function}
%
% \begin{function}[EXP]{LongPunct,LongPunct+,LongPunct-}
%   \begin{syntax}
%     LongPunct = \Arg{( â€” â¸º â€¥ â€¦ )}
%   \end{syntax}
%   è®¾ç½®é•¿æ&nbsp;‡ç‚¹ï¼Œä¾‹å¦‚ç&nbsp;´æŠ˜å·â€œâ€”â€”â€ä¸Žçœç•¥å·â€œâ€¦â€¦â€ï¼Œå…è®¸åœ¨é•¿æ&nbsp;‡ç‚¹å‰åŽ
%   æ–­è¡Œï¼Œä½†æ˜¯ç¦æ­¢åœ¨å®ƒä»¬ä¹‹é—´æ–­è¡Œã€‚
% \end{function}
%
% \begin{function}[EXP]{MiddlePunct,MiddlePunct+,MiddlePunct-}
%   \begin{syntax}
%     MiddlePunct = \Arg{( â€“ â€” â¸º Â· Â· ï½¥ ã€œã‚&nbsp;ï½ž)}
%   \end{syntax}
%   è®¾ç½®å±…ä¸­æ˜¾ç¤ºçš„æ&nbsp;‡ç‚¹ï¼Œä¾‹å¦‚é—´éš”å·â€œ\textbf{Â·}â€ã€‚å¯¹äºŽåœ¨ CJK æ–‡å­—ä¹‹é—´çš„å±…ä¸­æ&nbsp;‡ç‚¹ï¼Œ
%   \pkg{xeCJK} ä¼šæ&nbsp;¹æ®ä¸åŒçš„æ&nbsp;‡ç‚¹å¤„ç†æ&nbsp;¼å¼ï¼Œè°ƒæ•´å±…ä¸­æ&nbsp;‡ç‚¹ä¸Žå‰åŽæ–‡å­—ä¹‹é—´çš„ç©ºç™½ï¼Œä¿è¯
%   å…¶ç¡®å®žå±…ä¸­ã€‚å¯¹äºŽè¡Œæœ«å‡ºçŽ°çš„å±…ä¸­æ&nbsp;‡ç‚¹ï¼Œå…è®¸åœ¨å…¶åŽé¢æ–­è¡Œï¼Œä½†ç¦æ­¢åœ¨å®ƒå‰é¢æ–­è¡Œã€‚
% \end{function}
%
% \begin{function}[EXP]{PunctWidth}
%   \begin{syntax}
%     PunctWidth = \Arg{length}
%   \end{syntax}
%   ç¼ºçœçŠ¶æ€ä¸‹ï¼Œ\pkg{xeCJK} ä¼šæ&nbsp;¹æ®æ‰€é€‰æ‹©çš„æ&nbsp;‡ç‚¹å¤„ç†æ&nbsp;¼å¼è‡ªåŠ¨è®¡ç®—æ&nbsp;‡ç‚¹æ‰€å&nbsp;çš„å®½åº¦ï¼Œå¦‚æžœå¯¹ç¼º
%   çœè®¾ç½®ä¸æ»¡æ„ï¼Œå¯ä»¥é€šè¿‡è¿™ä¸€é€‰é¡¹æ¥æ”¹å˜å®ƒã€‚ä¸ºäº†ä½¿å¾—æ&nbsp;‡ç‚¹æ‰€å&nbsp;çš„å®½åº¦èƒ½å¤Ÿé€‚åº”å­—ä½“å¤§å°çš„å˜åŒ–ï¼Œ
%   è¿™é‡Œè®¾ç½®çš„ |length| çš„å•ä½æœ€å¥½ç”¨ |em| ç­‰ç›¸å¯¹è·ç¦»å•ä½ï¼Œè€Œä¸å»ºè®®ä½¿ç”¨è¯¸å¦‚ |pt| ä¹‹ç±»çš„
%   ç»å¯¹è·ç¦»å•ä½ã€‚è¿™é‡Œçš„è®¾ç½®å¯ç”¨äºŽé™¤äº† |plain| ä»¥å¤–çš„æ‰€æœ‰æ&nbsp;‡ç‚¹å¤„ç†æ&nbsp;¼å¼ã€‚åŒæ—¶ï¼Œè¿™é‡Œçš„
%   è®¾ç½®å¯¹æ‰€æœ‰çš„ CJK æ&nbsp;‡ç‚¹éƒ½ç”Ÿæ•ˆï¼Œå¦‚æžœåªè¦è®¾ç½®éƒ¨åˆ†æ&nbsp;‡ç‚¹ï¼Œè¯·ä½¿ç”¨ \ref{subsec:punct}~èŠ‚çš„
%   \tn{xeCJKsetwidth}ã€‚
% \end{function}
%
% \begin{function}[EXP,added=2013-08-22]{PunctBoundWidth}
%   \begin{syntax}
%     PunctBoundWidth = \Arg{length}
%   \end{syntax}
%   ä¸Žä»¥ä¸Šé€‰é¡¹ç±»ä¼¼ï¼Œä½†è®¾ç½®çš„æ˜¯æ&nbsp;‡ç‚¹ç¬¦å·å‡ºçŽ°åœ¨è¡Œé¦–/å°¾æ—¶çš„å®½åº¦ã€‚
% \end{function}
%
% \begin{function}{AllowBreakBetweenPuncts}
%   \begin{syntax}
%     AllowBreakBetweenPuncts = \meta{\TFF}
%   \end{syntax}
%   ç¼ºçœçŠ¶æ€ä¸‹ï¼Œ\pkg{xeCJK} ç¦æ­¢åœ¨ç›¸é‚» CJK å³æ&nbsp;‡ç‚¹å’Œ CJK å·¦æ&nbsp;‡ç‚¹ä¹‹é—´æ¢è¡Œï¼Œå¯ä»¥ä½¿ç”¨
%   è¿™ä¸€é€‰é¡¹æ”¹å˜è¿™ä¸€è®¾ç½®ã€‚
% \end{function}
%
% \begin{function}[updated=2016-05-13]{RubberPunctSkip}
%   \begin{syntax}
%     RubberPunctSkip = \meta{\TTF|plus|minus}
%   \end{syntax}
%   ç¼ºçœçŠ¶æ€ä¸‹ï¼Œæ&nbsp;‡ç‚¹ç¬¦å·å‰/åŽçš„é—´è·æœ‰ä¸€å®šçš„å¼¹æ€§ã€‚å¯ä»¥ä¼¸é•¿åˆ°åŽŸå§‹è¾¹ç•Œå®½åº¦ï¼Œå¯ä»¥æ”¶ç¼©åˆ°
%   æ&nbsp;‡ç‚¹å¦ä¸€ä¾§çš„è¾¹ç•Œå®½åº¦ã€‚å°†æœ¬é€‰é¡¹è®¾ç½®ä¸º \texttt{plus}ï¼Œå°†åªå…è®¸ä¼¸é•¿ï¼›è®¾ç½®ä¸º
%   \texttt{minus} åªå…è®¸æ”¶ç¼©ã€‚è®¾ç½®ä¸º \texttt{false} å°†ç¦ç”¨è¿™ä¸€ç‰¹æ€§ï¼Œ
%   ä»Žè€Œä½¿å¾—å‰/åŽçš„é—´è·ä¸ºå›ºå®šå€¼ã€‚
% \end{function}
%
% \begin{function}[added=2012-12-02]{CheckFullRight}
%   \begin{syntax}
%     CheckFullRight = \meta{\TFF}
%   \end{syntax}
%   æŸäº›æŽ§åˆ¶åºåˆ—è¦æ±‚ä¸èƒ½åœ¨å®ƒçš„å‰é¢æ–­è¡Œã€‚ä½†æ˜¯åœ¨ç¼ºçœçŠ¶æ€ä¸‹ï¼Œå•ä¸ªå…¨è§’å³æ&nbsp;‡ç‚¹çš„åŽé¢æ€»æ˜¯
%   å¯ä»¥æ–­è¡Œçš„ã€‚å›&nbsp;æ­¤å½“è¿™äº›æŽ§åˆ¶åºåˆ—å‡ºçŽ°åœ¨å…¨è§’å³æ&nbsp;‡ç‚¹åŽé¢æ—¶ï¼Œå¯èƒ½ä¼šå‡ºçŽ°æ„æ–™ä¹‹å¤–çš„æ–­è¡Œã€‚
%   æ­¤æ—¶å¯ä»¥ä½¿ç”¨è¿™ä¸ªé€‰é¡¹æ¥é¿å…è¿™ä¸ªæƒ…å†µã€‚
% \end{function}
%
% \begin{function}[added=2012-12-02]{NoBreakCS,NoBreakCS+,NoBreakCS-}
%   \begin{syntax}
%     NoBreakCS = \{ \tn{footnote} \tn{footnotemark} \tn{nobreak} \}
%   \end{syntax}
%   è®¾ç½®ä¸èƒ½åœ¨å…¨è§’å³æ&nbsp;‡ç‚¹åŽæ–­è¡Œçš„æŽ§åˆ¶åºåˆ—ã€‚ä»¥ä¸Šæ˜¯ \pkg{xeCJK} çš„é»˜è®¤è®¾ç½®ã€‚å¦‚æžœè¿™äº›
%   æŽ§åˆ¶åºåˆ—åœ¨æ–‡æ¡£ä¸­åªå‡ºçŽ°å°‘é‡å‡&nbsp;æ¬¡ï¼Œä¹Ÿå¯ä»¥ä¸å¿…ä½¿ç”¨ |CheckFullRight| é€‰é¡¹ï¼Œè€Œæ˜¯æ‰‹å·¥
%   åœ¨è¿™äº›æŽ§åˆ¶åºåˆ—å‰é¢åŠ&nbsp;ä¸Š \ref{subsec:others}~èŠ‚ä»‹ç»çš„ \tn{xeCJKnobreak}ã€‚
% \end{function}
%
% \begin{function}[updated=2013-11-16]{Verb}
%   \begin{syntax}
%     Verb = \meta{\TF|(env)|env+}
%   \end{syntax}
%   \texttt{true} è¡¨ç¤ºåœ¨ \tn{verb} å‘½ä»¤æˆ– \texttt{verbatim} çŽ¯å¢ƒé‡Œä¸è‡ªåŠ¨è°ƒæ•´ä¸­è‹±æ–‡
%   ä¹‹é—´çš„é—´è·ã€‚\texttt{env} é€‰é¡¹åœ¨ \texttt{verbatim} çŽ¯å¢ƒé‡Œè‡ªåŠ¨è®¡ç®—ä¸­è¥¿æ–‡é—´è·å’Œä¸­æ–‡
%   ä¹‹é—´çš„é—´è·ï¼Œä»¥ä¾¿äºŽä¿æŒä»£ç&nbsp;çš„å¯¹é½ï¼›\texttt{env} é€‰é¡¹ä¸è°ƒæ•´ \tn{verb} é‡Œçš„é—´è·ï¼Œ^^A
%   \texttt{env+} é€‰é¡¹è¿˜å°†æ­£æ–‡é‡Œè®¾ç½®çš„é—´è·åº”ç”¨åˆ° \tn{verb} é‡Œã€‚^^A
%   è¿™ä¸ªé€‰é¡¹å¯¹ä½¿ç”¨åˆ° \tn{verbatim@font} å‘½ä»¤çš„æƒ…å½¢å‡æœ‰æ•ˆï¼Œæ›´ä¸€èˆ¬çš„æƒ…å†µå¯ä»¥ä½¿ç”¨
%   \ref{subsec:others}~èŠ‚ä»‹ç»çš„ \tn{xeCJKVerbAddon}ã€‚\texttt{false} è¡¨ç¤ºä¸ä½œä»»ä½•
%   å¤„ç†ã€‚ä»¥ä¸Šé€‰é¡¹çš„å€¼é™¤ \texttt{false} å¤–ï¼Œéƒ½ç¦æ­¢åœ¨æ±‰å­—ä¹‹é—´å’Œæ±‰å­—ä¸Žè¥¿æ–‡ä¹‹é—´è‡ªåŠ¨æ¢è¡Œã€‚
% \end{function}
%
% \begin{function}[rEXP,added=2014-03-01]{LoadFandol}
%   \begin{syntax}
%     LoadFandol = \meta{\TTF}
%   \end{syntax}
%   å½“æ²¡æœ‰åœ¨å¯¼è¨€åŒºè®¾ç½® CJK å­—ä½“æ—¶ï¼Œæ˜¯å¦ä½¿ç”¨ Fandol å­—ä½“ã€‚å¦‚æžœå¯ç”¨è¿™ä¸ªé€‰é¡¹ï¼Œéœ€è¦
%   å®‰è£… \package{Fandol} å­—ä½“ç³»åˆ—ã€‚
% \end{function}
%
% \subsection{å­—ä½“è®¾ç½®ä¸Žé€‰æ‹©}
% \label{subsec:fontset}
%
% \begin{function}[EXP,updated=2016-11-18]{\setCJKmainfont}
%   \begin{syntax}
%     \tn{setCJKmainfont} \Arg{font name}\oarg{font features} æˆ–\\
%     \tn{setCJKmainfont} \oarg{font features} \Arg{font name}
%   \end{syntax}
%   è®¾ç½®æ­£æ–‡ç½—é©¬æ—çš„ CJK å­—ä½“ï¼Œå½±å“ \tn{rmfamily} å’Œ \tn{textrm} çš„å­—ä½“ã€‚åŽé¢ä¸¤ä¸ª
%   å‚æ•°ç»§æ‰¿è‡ª \pkg{fontspec} å®åŒ…ï¼Œ \meta{font features} è¡¨ç¤ºå­—ä½“å±žæ€§é€‰é¡¹ï¼Œ
%   \meta{font name} æ˜¯å­—ä½“åã€‚å­—ä½“åå¯ä»¥æ˜¯å­—ä½“æ—åï¼Œä¹Ÿå¯ä»¥æ˜¯å­—ä½“çš„æ–‡ä»¶åï¼ŒæŸ¥
%   æ‰¾å­—ä½“åè§ \ref{subsubsec:fontsearch}~èŠ‚ï¼›å¯ç”¨çš„å­—ä½“å±žæ€§é€‰é¡¹å‚è§
%   \pkg{fontspec} å®åŒ…çš„æ–‡æ¡£ã€‚éœ€è¦è¯´æ˜Žçš„æ˜¯ \pkg{xeCJK} ä¿®æ”¹äº† |AutoFakeBold|
%   å’Œ |AutoFakeSlant| é€‰é¡¹ï¼Œä»¥ä¾¿é…åˆå…¨å±€ä¼ªç²—ä½“å’Œä¼ªæ–œä½“çš„è®¾å®šã€‚
%
%   å‡ºäºŽå…¼å®¹æ€§è€ƒè™‘ï¼Œå­—ä½“å±žæ€§å¯é€‰é¡¹å¯ä»¥æ”¾åœ¨å­—ä½“åç§°å‰é¢ï¼Œä¹Ÿå¯ä»¥æ”¾åœ¨åŽé¢ã€‚
%   å¦‚æžœå¯é€‰é¡¹æ”¾åœ¨åŽé¢ï¼Œå­—ä½“åç§°ä¸Žå¯é€‰é¡¹ä¹‹é—´ä¸è¦æœ‰ç©ºæ&nbsp;¼æˆ–è€…æ¢è¡Œã€‚
% \end{function}
%
% \begin{function}[label = ]{AutoFakeBold,AutoFakeSlant}
%   \begin{syntax}
%     AutoFakeBold  = \Arg{\TF|æ•°å­—}
%     AutoFakeSlant = \Arg{\TF|æ•°å­—}
%   \end{syntax}
%   å±€éƒ¨è®¾ç½®å½“å‰å­—ä½“æ—çš„ä¼ªç²—å’Œä¼ªæ–œå±žæ€§ã€‚å¦‚æžœæ²¡æœ‰åœ¨å±€éƒ¨ç»™å‡ºè¿™äº›é€‰é¡¹ï¼Œå°†ä½¿ç”¨å…¨å±€è®¾å®šã€‚
% \end{function}
%
% \begin{function}[added=2013-06-07]{Mapping}
%   \begin{syntax}
%     Mapping = \Arg{fullwidth-stop|full-stop|han-trad|han-simp|...}
%   \end{syntax}
%   \pkg{xeCJK} æä¾›äº†ä»¥ä¸Šå››ä¸ª \href{http://scripts.sil.org/teckit}{TECKit} æ˜&nbsp;å°„
%   æ–‡ä»¶ï¼Œå¯ä»¥åœ¨è®¾ç½®å­—ä½“çš„æ—¶å€™é€šè¿‡ \texttt{Mapping} é€‰é¡¹æ¥ä½¿ç”¨å®ƒä»¬ã€‚å…¶ä¸­
%   \texttt{fullwidth-stop} ç”¨äºŽå°†æ­£å¸¸å¥å·â€œã€‚â€è½¬æ¢æˆå…¨è§’å®žå¿ƒå¥å·â€œï¼Žâ€ï¼Œ
%   \texttt{full-stop} çš„ä½œç”¨ç›¸åã€‚\texttt{han-trad} ç”¨äºŽå°†ç®€ä½“ä¸­æ–‡è½¬æ¢æˆç¹ä½“ä¸­æ–‡ï¼Œ
%   \texttt{han-simp} çš„ä½œç”¨ç›¸åã€‚éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œç®€ç¹äº’æ¢éƒ½æ˜¯ç®€å•æœºæ¢°çš„å­—å­—å¯¹è¯‘ï¼Œ
%   ä¸èƒ½åšåˆ°å®Œå…¨å‡†ç¡®ï¼Œä½¿ç”¨æ—¶è¦å°å¿ƒã€‚ä¾‹å¦‚ç®€ä½“çš„â€œå‘æŒ¥â€å’Œâ€œå¤´å‘â€è¢«è½¬æ¢æˆç¹ä½“çš„
%   â€œç™¼æ®â€å’Œâ€œé&nbsp;­ç™¼â€ï¼Œæ˜¾ç„¶åŽè€…åº”ä½œâ€œé&nbsp;­é«®â€ã€‚ä¹Ÿå¯ä»¥æ&nbsp;¹æ®å®žé™…éœ€è¦ï¼Œåˆ¶ä½œæ–°çš„æ˜&nbsp;å°„æ–‡ä»¶ï¼Œ
%   è¯·å‚è€ƒ TECKit çš„æ–‡æ¡£ã€‚
% \end{function}
%
% \begin{function}[EXP,updated=2016-11-18]{\setCJKsansfont}
%   \begin{syntax}
%     \tn{setCJKsansfont} \Arg{font name}\oarg{font features} æˆ–\\
%     \tn{setCJKsansfont} \oarg{font features} \Arg{font name}
%   \end{syntax}
%   è®¾ç½®æ­£æ–‡æ—&nbsp;è¡¬çº¿æ—çš„ CJK å­—ä½“ï¼Œå½±å“ \tn{sffamily} å’Œ \tn{textsf} çš„å­—ä½“ã€‚
% \end{function}
%
% \begin{function}[EXP,updated=2016-11-18]{\setCJKmonofont}
%   \begin{syntax}
%     \tn{setCJKmonofont} \Arg{font name}\oarg{font features} æˆ–\\
%     \tn{setCJKmonofont} \oarg{font features} \Arg{font name}
%   \end{syntax}
%   è®¾ç½®æ­£æ–‡ç­‰å®½æ—çš„ CJK å­—ä½“ï¼Œå½±å“ \tn{ttfamily} å’Œ \tn{texttt} çš„å­—ä½“ã€‚
% \end{function}
%
% \begin{function}[EXP,updated=2016-11-18]{\setCJKfamilyfont}
%   \begin{syntax}
%     \tn{setCJKfamilyfont} \Arg{family} \Arg{font name}\oarg{font features} æˆ–\\
%     \tn{setCJKfamilyfont} \Arg{family} \oarg{font features} \Arg{font name}
%   \end{syntax}
%   å£°æ˜Žæ–°çš„ CJK å­—ä½“æ— \meta{family} å¹¶æŒ‡å®šå­—ä½“ã€‚
% \end{function}
%
% \begin{function}[updated=2012-10-27]{\CJKfamily}
%   \begin{syntax}
%     \tn{CJKfamily}  \Arg{family}
%     \tn{CJKfamily} + \Arg{family}
%     \tn{CJKfamily} - \Arg{family}
%   \end{syntax}
%   ç”¨äºŽåœ¨æ–‡æ¡£ä¸­åˆ‡æ¢ |CJK| å­—ä½“æ—ï¼Œ\meta{family} å¿…é¡»é¢„å…ˆå£°æ˜Žã€‚\tn{CJKfamily} ä»…å¯¹
%   CJK å­—ç¬¦ç±»æœ‰æ•ˆï¼Œ\tn{CJKfamily}|+| å¯¹æ‰€æœ‰å­—ç¬¦ç±»å‡æœ‰æ•ˆï¼Œ\tn{CJKfamily}|-| å¯¹éž CJK å­—
%   ç¬¦ç±»æœ‰æ•ˆã€‚å½“ \tn{CJKfamily}|+| å’Œ \tn{CJKfamily}|-| çš„å‚æ•°ä¸ºç©ºæ—¶ï¼Œåˆ™ä½¿ç”¨å½“å‰çš„ |CJK| å­—ä½“æ—ã€‚
% \end{function}
%
% \begin{function}[EXP,updated=2016-11-18]{\newCJKfontfamily}
%   \begin{syntax}
%     \tn{newCJKfontfamily} \oarg{family} \cs{\meta{font-switch}} \Arg{font name}\oarg{font features} æˆ–\\
%     \tn{newCJKfontfamily} \oarg{family} \cs{\meta{font-switch}} \oarg{font features} \Arg{font name}
%   \end{syntax}
%   å£°æ˜Žæ–°çš„ CJK å­—ä½“æ— \meta{family} å¹¶æŒ‡å®šå­—ä½“ï¼Œå¹¶å®šä¹‰ \cs{\meta{font-switch}}ï¼Œåœ¨
%   æ–‡æ¡£ä¸­å¯ä»¥ä½¿ç”¨å®ƒæ¥åˆ‡æ¢ CJK å­—ä½“æ—ã€‚å¯ä»¥ä¸å¿…æŒ‡å®š \meta{family}ï¼Œè¿™æ—¶å€™ \meta{family}
%   å°†ç­‰äºŽ \meta{font-switch}ã€‚
% \end{function}
%
%   äº‹å®žä¸Šï¼Œ\tn{newCJKfontfamily} æ˜¯ \tn{setCJKfamilyfont} å’Œ
%   \tn{CJKfamily} çš„åˆå¹¶ã€‚ä¾‹å¦‚
%   \begin{ctexexam}
%   \newCJKfontfamily[song]\songti{SimSun}
%   \end{ctexexam}
%   ç­‰ä»·äºŽ
%   \begin{ctexexam}
%   \setCJKfamilyfont{song}{SimSun}
%   \newcommand*{\songti}{\CJKfamily{song}}
%   \end{ctexexam}
%
% \begin{function}[updated=2016-11-18]{\CJKfontspec}
%   \begin{syntax}
%     \tn{CJKfontspec} \Arg{font name}\oarg{font features} æˆ–\\
%     \tn{CJKfontspec} \oarg{font features} \Arg{font name}
%   \end{syntax}
%   åœ¨æ–‡æ¡£ä¸­å®šä¹‰æ–°çš„ CJK å­—ä½“æ—ï¼Œå¹¶é©¬ä¸Šä½¿ç”¨å®ƒã€‚
% \end{function}
%
% \begin{function}[rEXP]{\defaultCJKfontfeatures}
%   \begin{syntax}
%     \tn{defaultCJKfontfeatures} \Arg{font features}
%   \end{syntax}
%   å…¨å±€è®¾ç½® CJK å­—ä½“æ—çš„é»˜è®¤é€‰é¡¹ã€‚ä¾‹å¦‚ï¼Œä½¿ç”¨
%   \begin{ctexexam}
%   \defaultCJKfontfeatures{Scale=0.962216}
%   \end{ctexexam}
%   å¯ä»¥å°†å…¨éƒ¨ CJK å­—ä½“ç¼©å°ä¸º |0.962216|ã€‚\pkg{xeCJK} å®åŒ…çš„åˆå§‹åŒ–è®¾ç½®æ˜¯
%   \begin{frameverb}
%   \defaultCJKfontfeatures{Script=CJK}
%   \end{frameverb}
% \end{function}
%
% \begin{function}[updated=2013-06-30]{\addCJKfontfeatures}
%   \begin{syntax}
%     \tn{addCJKfontfeatures}   \Arg{font features}
%     \tn{addCJKfontfeatures} * \Arg{font features}
%     \tn{addCJKfontfeatures}   \oarg{block_1, block_2, ...} \Arg{font features}
%     \tn{addCJKfontfeatures} * \oarg{block_1, block_2, ...} \Arg{font features}
%   \end{syntax}
%   ä¸´æ—¶å¢žåŠ&nbsp;å½“å‰ä½¿ç”¨çš„ CJK å­—ä½“çš„é€‰é¡¹ã€‚ç¬¬ä¸€æ¡å‘½ä»¤ï¼Œä»…å¯¹å½“å‰ CJK ä¸»åˆ†åŒºå­—ä½“æœ‰æ•ˆï¼›
%   ç¬¬äºŒæ¡å¯¹ä¸»åˆ†åŒºå’Œå…¶ä»–åˆ†åŒºçš„å­—ä½“éƒ½æœ‰æ•ˆï¼›ç¬¬ä¸‰æ¡ä»…å¯¹å¯é€‰å‚æ•°ä¸­æŒ‡å®šçš„åˆ†åŒºæœ‰æ•ˆï¼›
%   ç¬¬å››æ¡å¯¹ä¸»åˆ†åŒºå’Œå¯é€‰å‚æ•°ä¸­æŒ‡å®šçš„åˆ†åŒºæœ‰æ•ˆã€‚ä¾‹å¦‚ï¼Œä½¿ç”¨
%   \begin{ctexexam}
%   \addCJKfontfeatures{Scale=1.1}
%   \end{ctexexam}
%   å¯ä»¥å°†æ–‡æ¡£ä¸­å½“å‰ä½¿ç”¨çš„ CJK ä¸»åˆ†åŒºå­—ä½“æ”¾å¤§ä¸º |1.1|ã€‚
% \end{function}
%
% \begin{function}{\CJKrmdefault}
%   ä¿å­˜ \tn{textrm} å’Œ \tn{rmfamily} æ‰€ä½¿ç”¨çš„ CJK å­—ä½“æ—ï¼Œé»˜è®¤å€¼æ˜¯ |rm|ã€‚
% \end{function}
%
% \begin{function}{\CJKsfdefault}
%   ä¿å­˜ \tn{textsf} å’Œ \tn{sffamily} æ‰€ä½¿ç”¨çš„ CJK å­—ä½“æ—ï¼Œé»˜è®¤å€¼æ˜¯ |sf|ã€‚
% \end{function}
%
% \begin{function}{\CJKttdefault}
%   ä¿å­˜ \tn{texttt} å’Œ \tn{ttfamily} æ‰€ä½¿ç”¨çš„ CJK å­—ä½“æ—ï¼Œé»˜è®¤å€¼æ˜¯ |tt|ã€‚
% \end{function}
%
% \begin{function}[updated=2013-01-01]{\CJKfamilydefault}
%   ä¿å­˜ \tn{textnormal} å’Œ \tn{normalfont} æ‰€ä½¿ç”¨çš„ CJK å­—ä½“æ—ã€‚ç±»ä¼¼è¥¿æ–‡å­—ä½“çš„ \tn{familydefault}ã€‚
%   åˆå§‹å€¼æ˜¯ \tn{CJKrmdefault}ã€‚å¦‚æžœæ²¡æœ‰åœ¨å¯¼è¨€åŒºä¸­ä¿®æ”¹å®ƒï¼Œ\pkg{xeCJK} ä¼šåœ¨å¯¼è¨€åŒº
%   ç»“æŸçš„æ—¶å€™æ&nbsp;¹æ®è¥¿æ–‡å­—ä½“çš„æƒ…å†µè‡ªåŠ¨æ›´æ–° \tn{CJKfamilydefault}ã€‚å›&nbsp;æ­¤ï¼Œåœ¨å¯¼è¨€åŒºé‡Œä½¿ç”¨
%   \begin{frameverb}
%   \renewcommand\familydefault{\sfdefault}
%   \end{frameverb}
%   å°±å¯ä»¥å°†å…¨æ–‡çš„ CJK å’Œè¥¿æ–‡é»˜è®¤å­—ä½“éƒ½æ”¹ä¸ºæ—&nbsp;è¡¬çº¿å­—ä½“æ—ã€‚
% \end{function}
%
% \begin{function}[EXP,updated=2016-11-18]{\setCJKmathfont}
%   \begin{syntax}
%     \tn{setCJKmathfont} \Arg{font name}\oarg{font features} æˆ–\\
%     \tn{setCJKmathfont} \oarg{font features} \Arg{font name}
%   \end{syntax}
%   è®¾ç½®æ•°å­¦å…¬å¼ä¸­çš„ CJK å­—ä½“æ—ã€‚å¦‚æžœä½¿ç”¨äº† |CJKmath| é€‰é¡¹ï¼Œä½†æ˜¯æ²¡æœ‰ä½¿ç”¨
%   \tn{setCJKmathfont} è®¾ç½®æ•°å­¦å…¬å¼ä¸­çš„ CJK å­—ä½“ï¼Œé‚£ä¹ˆå°†ä½¿ç”¨ \tn{CJKfamilydefault}
%   ä½œä¸ºæ•°å­¦å…¬å¼ä¸­çš„ CJK å­—ä½“ã€‚
% \end{function}
%
% \begin{function}[EXP, label=, updated=2016-11-18]{\setCJKfallbackfamilyfont}
%   \begin{syntax}
%     \tn{setCJKfallbackfamilyfont} \Arg{family} \Arg{font name}\oarg{font features} æˆ–\\
%     \tn{setCJKfallbackfamilyfont} \Arg{family} \oarg{font features} \Arg{font name}
%   \end{syntax}
%   è®¾ç½® CJK å­—ä½“æ— \meta{family} çš„å¤‡ç”¨å­—ä½“ã€‚ä¾‹å¦‚ï¼Œä½¿ç”¨
%   \begin{ctexexam}
%   \setCJKmainfont{SimSun}
%   \setCJKfallbackfamilyfont{\CJKrmdefault}{SimSun-ExtB}
%   \end{ctexexam}
%   å¯ä»¥å°† |SimSun-ExtB| ä½œä¸º |SimSun| çš„å¤‡ç”¨å­—ä½“ã€‚
% \end{function}
%
% \begin{function}{FallBack}
%   \begin{syntax}
%     FallBack = \{\oarg{font features}\Arg{font name}\}
%   \end{syntax}
%   \pkg{xeCJK} åœ¨ \meta{font features} é‡Œå¢žåŠ&nbsp;äº† |FallBack| è¿™ä¸ªé€‰é¡¹ã€‚ç”¨æ¥åœ¨å£°æ˜Žä¸»
%   å­—ä½“çš„æ—¶å€™ï¼ŒåŒæ—¶è®¾ç½®å¤‡ç”¨å­—ä½“ã€‚ä¾‹å¦‚ï¼Œä¸Šé¢çš„ä¾‹å­ç­‰ä»·äºŽï¼š
%   \begin{ctexexam}
%   \setCJKmainfont[FallBack=SimSun-ExtB]{SimSun}
%   \end{ctexexam}
%   å¦‚æžœ |FallBack| çš„å€¼ä¸ºç©ºï¼Œå°†è®¾ç½®çš„æ˜¯å¤‡ç”¨å­—ä½“ã€‚ä¾‹å¦‚ï¼Œ
%   \begin{ctexexam}
%   \setCJKmainfont[FallBack,AutoFakeBold,Scale=.97]{SimSun-ExtB}
%   \end{ctexexam}
%   ç­‰ä»·äºŽ
%   \begin{ctexexam}
%   \setCJKfallbackfamilyfont{\CJKrmdefault}[AutoFakeBold,Scale=.97]{SimSun-ExtB}
%   \end{ctexexam}
% \end{function}
%
% \begin{function}[EXP,updated=2013-06-30]{\setCJKfallbackfamilyfont}
%   \begin{syntax}
%     \tn{setCJKfallbackfamilyfont} \Arg{family}
%        \  \{
%        \    \{\oarg{font features_1} \Arg{font name_1}\} ,
%        \    \{\oarg{font features_2} \Arg{font name_2}\} ,
%        \     ......
%        \  \}\oarg{common font features} æˆ–\\
%     \tn{setCJKfallbackfamilyfont} \Arg{family} \oarg{common font features}
%        \  \{
%        \    \{\oarg{font features_1} \Arg{font name_1}\} ,
%        \    \{\oarg{font features_2} \Arg{font name_2}\} ,
%        \     ......
%        \  \}
%   \end{syntax}
%   \tn{setCJKfallbackfamilyfont} è¿˜å¯ä»¥ç”¨äºŽè®¾ç½®å¤šå±‚çš„å¤‡ç”¨å­—ä½“ã€‚ä¾‹å¦‚ï¼Œä½¿ç”¨
%   \begin{ctexexam}
%   \setCJKmainfont[AutoFakeBold,AutoFakeSlant]{KaiTi_GB2312}
%   \setCJKfallbackfamilyfont{\CJKrmdefault}[AutoFakeSlant]
%     { [BoldFont=SimHei]{SimSun} ,
%       [AutoFakeBold]   {SimSun-ExtB} }
%   \end{ctexexam}
%   ä¹‹åŽï¼Œå°±è®¾ç½®äº† |SimSun| æ˜¯ |KaiTi_GB2312| çš„å¤‡ç”¨å­—ä½“ï¼Œè€Œ |SimSun-ExtB| æ˜¯
%   |SimSun| çš„å¤‡ç”¨å­—ä½“ã€‚è‹¥å½“å‰å­—ä½“æ—ç¼ºå­—ï¼Œå¹¶æ²¡æœ‰å¤‡ç”¨å­—ä½“ï¼Œåˆ™å°è¯•ä½¿ç”¨
%   \tn{CJKfamilydefault} çš„å¤‡ç”¨å­—ä½“ã€‚
% \end{function}
%
% \subsubsection{\XeTeX çš„å­—ä½“åæŸ¥æ‰¾}
% \label{subsubsec:fontsearch}
%
% ç”±äºŽåœ¨ \pkg{fontspec} å®åŒ…æ–‡æ¡£ä¸­ç¼ºå°‘å…³äºŽå¦‚ä½•æŸ¥çœ‹ \XeTeX{} å¯ç”¨å­—ä½“åçš„è¯´æ˜Žï¼Œ
% è¿™é‡Œç•¥ä½œè¯´æ˜Žã€‚
%
% \XeTeX{} é€šå¸¸ä½¿ç”¨ fontconfig åº“æŸ¥æ‰¾å’Œè°ƒç”¨å­—ä½“ï¼Œå›&nbsp;æ­¤ï¼Œå¯ä»¥ç”¨ |fc-list| å‘½ä»¤æ˜¾
% ç¤ºå¯ç”¨çš„å­—ä½“ã€‚åœ¨å‘½ä»¤è¡Œï¼ˆWindows çš„â€œå‘½ä»¤æç¤ºç¬¦â€ï¼ŒLinux çš„ Consoleï¼‰ä¸‹è¿è¡Œä»¥
% ä¸‹å‘½ä»¤ï¼š
% \begin{frameverb}
%   fc-list &gt; fontlist.txt
% \end{frameverb}
% å¯ä»¥å°†ç³»ç»Ÿä¸­æ‰€æœ‰å®‰è£…çš„å­—ä½“åˆ—è¡¨å­˜å…¥ \file{fontlist.txt} æ–‡ä»¶ä¸­ï¼ˆå¯èƒ½å¾ˆé•¿ï¼‰ã€‚
%
% |fc-list| å‘½ä»¤åˆ—å‡ºçš„ä¿¡æ¯å¾ˆå¤šï¼Œè€Œä¸”åœ¨å®‰è£…å­—ä½“è¾ƒå¤šçš„ Windows ç³»ç»Ÿä¸Šçš„è¾“å‡ºå°†éž
% å¸¸åºžå¤§ï¼Œå¦‚å…¶ä¸­å¯èƒ½åŒ…å«ï¼š
% \begin{frameverb}
%   Times New Roman:style=cursiva,kurzÃ­va,kursiv,Î&nbsp;Î»Î¬Î³Î¹Î±,Italic,
%     Kursivoitu,Italique,DÅ‘lt,Corsivo,Cursief,kursywa,ItÃ¡lico,ÐšÑƒÑ€ÑÐ¸Ð²,
%     Ä°talik,PoÅ¡evno,nghiÃªng,Etzana
%   Times New Roman:style=Negreta cursiva,tuÄnÃ© kurzÃ­va,fed kursiv,
%     Fett Kursiv,ÎˆÎ½Ï„Î¿Î½Î± Î&nbsp;Î»Î¬Î³Î¹Î±,Bold Italic,Negrita Cursiva,
%     Lihavoitu Kursivoi,Gras Italique,FÃ©lkÃ¶vÃ©r dÅ‘lt,Grassetto Corsivo,
%     Vet Cursief,Halvfet Kursiv,Pogrubiona kursywa,Negrito ItÃ¡lico,
%     ÐŸÐ¾Ð»ÑƒÐ¶Ð¸Ñ€Ð½Ñ‹Ð¹ ÐšÑƒÑ€ÑÐ¸Ð²,TuÄnÃ¡ kurzÃ­va,Fet Kursiv,KalÄ±n Ä°talik,
%     Krepko poÅ¡evno,nghiÃªng Ä‘Ã¢Ì£m,Lodi etzana
%   Times New Roman:style=Negreta,tuÄnÃ©,fed,Fett,ÎˆÎ½Ï„Î¿Î½Î±,Bold,Negrita,
%     Lihavoitu,Gras,FÃ©lkÃ¶vÃ©r,Grassetto,Vet,Halvfet,Pogrubiona,Negrito,
%     ÐŸÐ¾Ð»ÑƒÐ¶Ð¸Ñ€Ð½Ñ‹Ð¹,Fet,KalÄ±n,Krepko,Ä‘Ã¢Ì£m,Lodia
%   Times New Roman:style=Normal,obyÄejnÃ©,Standard,ÎšÎ±Î½Î¿Î½Î¹ÎºÎ¬,Regular,
%     Normaali,NormÃ¡l,Normale,Standaard,Normalny,ÐžÐ±Ñ‹Ñ‡Ð½Ñ‹Ð¹,NormÃ¡lne,Navadno,
%     thÆ°Æ¡Ì€ng,Arrunta
%   å®‹ä½“,SimSun:style=Regular
%   é»‘ä½“,SimHei:style=Normal,obyÄejnÃ©,Standard,ÎšÎ±Î½Î¿Î½Î¹ÎºÎ¬,Regular,Normaali,
%     NormÃ¡l,Normale,Standaard,Normalny,ÐžÐ±Ñ‹Ñ‡Ð½Ñ‹Ð¹,NormÃ¡lne,Navadno,Arrunta
% \end{frameverb}
% åœ¨ \pkg{fontspec} æˆ– \pkg{xeCJK} ä¸­ä½¿ç”¨çš„å­—ä½“æ—åæ˜¯ä¸Šé¢åˆ—è¡¨ä¸­å†’å·å‰çš„éƒ¨åˆ†ã€‚
% ä¾‹å¦‚å¯ä»¥ä½¿ç”¨
% \begin{ctexexam}
%   \setmainfont{Times New Roman}
%   \setCJKmainfont{SimSun} % æˆ–è€… \setCJKmainfont{å®‹ä½“}
% \end{ctexexam}
% æ¥è®¾ç½®å­—ä½“ã€‚
%
% ä¸ºäº†æ–¹ä¾¿èµ·è§ï¼Œ|fc-list| å‘½ä»¤ä¹Ÿå¯ä»¥åŠ&nbsp;ä¸Šå„ç§é€‰é¡¹æŽ§åˆ¶è¾“å‡ºæ&nbsp;¼å¼ï¼Œä¾‹å¦‚å¦‚æžœåªè¦åˆ—å‡º
% æ‰€æœ‰çš„ä¸­æ–‡å­—ä½“çš„å­—ä½“æ—åï¼Œå¯ä»¥ç”¨å‘½ä»¤ï¼š
% \begin{frameverb}
%     fc-list -f "%{family}\n" :lang=zh  &gt; zhfont.txt
% \end{frameverb}
% è¿™æ&nbsp;·å°±æŠŠå­—ä½“åˆ—è¡¨ä¿å­˜åœ¨æ–‡ä»¶ \file{zhfont.txt} ä¸­\footnote{ç”±äºŽæ±‰å­—ç¼–ç&nbsp;åŽŸå›&nbsp;ï¼Œ
% Windows ä¸‹æ€»éœ€è¦æŠŠå­—ä½“åˆ—è¡¨è¾“å‡ºçš„æ–‡ä»¶ä¸­é˜²æ­¢ä¹±ç&nbsp;ã€‚}ã€‚è¿™æ&nbsp;·åˆ—å‡ºçš„å­—ä½“åˆ—è¡¨å°±æ¯”è¾ƒ
% ç®€æ˜Žæ˜“ç”¨ï¼Œå¦‚ Windows ä¸‹é¢„è£…çš„ä¸­æ–‡å­—ä½“ï¼š
% \begin{frameverb}
%   Arial Unicode MS
%   FangSong,ä»¿å®‹
%   KaiTi,æ¥·ä½“
%   Microsoft YaHei,å¾®è½¯é›…é»‘
%   MingLiU,ç´°æ˜Žé«”
%   NSimSun,æ–°å®‹ä½“
%   PMingLiU,æ–°ç´°æ˜Žé«”
%   SimHei,é»‘ä½“
%   SimSun,å®‹ä½“
% \end{frameverb}
% è¦åˆ—å‡ºæ—¥æ–‡å’ŒéŸ©æ–‡çš„å­—ä½“ï¼Œå¯ä»¥æŠŠ |:lang=zh| é€‰é¡¹ä¸­çš„ |zh| æ”¹æˆ |ja| æˆ– |ko|ã€‚
%
% \pkg{fontspec} å’Œ \pkg{xeCJK} ä¹Ÿå¯ä»¥ä½¿ç”¨å­—ä½“çš„æ–‡ä»¶åè®¿é—®å­—ä½“ã€‚ä¾‹å¦‚ Windows
% ä¸‹çš„å®‹ä½“ä¹Ÿå¯ä»¥ä½¿ç”¨å‘½ä»¤ï¼š
% \begin{frameverb}
%   \setCJKmainfont{simsun.ttc}
% \end{frameverb}
% æ¥è®¾ç½®ã€‚è®¾ç½®å­—ä½“æ–‡ä»¶åçš„ç›¸å…³é€‰é¡¹å’Œè¯­æ³•åœ¨ \pkg{fontspec} å®åŒ…æ‰‹å†Œä¸­å™è¿°ç”šè¯¦ï¼Œ
% è¿™é‡Œä¸å†èµ˜è¿°ã€‚æœ‰ä¸ªåˆ«å­—ä½“åä¸è§„èŒƒçš„ä¸­æ–‡å­—ä½“ï¼Œ\pkg{xeCJK} å®åŒ…å¯èƒ½æ—&nbsp;æ³•æ­£ç¡®åœ°é€š
% è¿‡å­—ä½“åè®¿é—®ï¼Œé‚£ä¹ˆä¹Ÿå¯ä»¥ä½¿ç”¨è¿™ç§æ–¹å¼è®¾ç½®ã€‚
%
% \subsection{CJK åˆ†åŒºå­—ä½“è®¾ç½®}
% \label{subsec:block}
%
% ä¼—æ‰€å‘¨çŸ¥ï¼ŒCJK æ–‡å­—æ•°é‡æžå…¶åºžå¤§ï¼Œå•ä¸€çš„å­—ä½“ä¸å¯èƒ½æ¶µç›–æ‰€æœ‰çš„ CJK æ–‡å­—ã€‚\pkg{xeCJK} å¯
% ä»¥åœ¨åŒä¸€ CJK å­—ä½“æ—ä¸‹ï¼Œè‡ªåŠ¨ä½¿ç”¨ä¸åŒçš„å­—ä½“è¾“å‡º CJK å­—ç¬¦èŒƒå›´å†…ä¸åŒåŒºå—é‡Œçš„æ–‡å­—ã€‚é¦–å…ˆè¦
% å£°æ˜Ž CJK å­åˆ†åŒºã€‚
%
% \begin{function}[EXP]{\xeCJKDeclareSubCJKBlock}
%   \begin{syntax}
%     \tn{xeCJKDeclareSubCJKBlock}  \Arg{block} \Arg{block range}
%     \tn{xeCJKDeclareSubCJKBlock} * \Arg{block} \Arg{block range}
%   \end{syntax}
%   å…¶ä¸­ \meta{block range} æ˜¯é€—å·åˆ—è¡¨ï¼Œå¯ä»¥æ˜¯ CJK å­—ç¬¦çš„ |Unicode| èŒƒå›´ï¼Œä¹Ÿå¯ä»¥æ˜¯å•ä¸ªå­—ç¬¦
%   çš„ |Unicode|ã€‚ä¾‹å¦‚
% \end{function}
%   \begin{ctexexam}
%   { `ä¸­ -&gt; `æ–‡ , "3400 -&gt; "4DBF , "5000 -&gt; "7000 , `æ±‰ , `å­— , "3500 }
%   \end{ctexexam}
%   çš„å½¢å¼ã€‚éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œè¿™é‡Œè®¾ç½®çš„ \meta{block range} é™¤éžç¡®å®žéœ€è¦ï¼ˆä¾‹å¦‚æŸäº›ç‰¹æ®Šå­—ä½“ä½¿ç”¨
%   äº† |Unicode| ä¸­çš„ç§äººä½¿ç”¨åŒºçš„æƒ…å†µï¼‰ï¼Œå¦åˆ™ä¸è¦è¶…å‡ºæºä»£ç&nbsp;ä¸­é¢„è®¾çš„
%   \hyperlink{CJKcharclass}{CJK æ–‡å­—èŒƒå›´}ã€‚ä½¿ç”¨
%   \begin{ctexexam}
%   \xeCJKDeclareSubCJKBlock{SPUA}{ "E400 -&gt; "E4DA , "E500 -&gt; "E5E8 , "E600 -&gt; "E6CE }
%   \xeCJKDeclareSubCJKBlock{Ext-B}{ "20000 -&gt; "2A6DF }
%   \end{ctexexam}
%   å°±å£°æ˜Žäº† |SPUA| å’Œ |Ext-B| è¿™ä¸¤ä¸ªä¸ªå­åˆ†åŒºã€‚åŒæ—¶åœ¨ \ref{subsec:fontset} èŠ‚ä»‹ç»çš„
%   CJK å­—ä½“è®¾ç½®å‘½ä»¤çš„ \meta{font features} é‡Œæ–°å»ºäº† |SPUA| å’Œ |Ext-B| è¿™ä¸¤ä¸ªé€‰é¡¹ã€‚
%   æ–°å»ºçš„è¿™ä¸¤ä¸ªé€‰é¡¹çš„ä½¿ç”¨æ–¹æ³•è·Ÿ \ref{subsec:fontset} ä»‹ç»çš„ |FallBack| ç±»ä¼¼ã€‚å¯ä»¥
%   é€šè¿‡å®ƒä»¬æ¥è®¾ç½®å­—ä½“ã€‚
%
%   ä¾‹å¦‚ï¼Œå¯ä»¥ä½¿ç”¨
%   \begin{ctexexam}
%   \setCJKmainfont[SPUA=SunmanPUA,Ext-B=SimSun-ExtB]{SimSun}
%   \end{ctexexam}
%   è®¾ç½®æ–‡æ¡£çš„ä¸»å­—ä½“æ˜¯ |SimSun|ï¼Œ|SPUA| åˆ†åŒºçš„å­—ä½“æ˜¯ |SunmanPUA|ï¼Œè€Œ |Ext-B| åˆ†åŒº
%   çš„å­—ä½“æ˜¯ |SimSun-ExtB|ã€‚
%
%   \tn{xeCJKDeclareSubCJKBlock} åº”è¯¥åœ¨å£°æ˜Žæ‰€æœ‰çš„ CJK å­—ä½“æ—ä¹‹å‰ä½¿ç”¨ã€‚å¦‚æžœæœ‰æŸä¸ª CJK å­—
%   ä½“æ—æ²¡æœ‰è®¾ç½® \meta{block} é€‰é¡¹ï¼Œå°†ä½¿ç”¨ \tn{CJKfamilydefault} çš„ \meta{block} é€‰é¡¹
%   ä½œä¸ºè¯¥ CJK å­—ä½“æ—çš„ \meta{block} é€‰é¡¹ã€‚å¦‚æžœå¸Œæœ›åœ¨ä½¿ç”¨æŸ CJK å­—ä½“æ—æ—¶ï¼Œä¸åœ¨ CJK ä¸»
%   åˆ†åŒºä¸Ž \meta{block} ä¹‹é—´åˆ‡æ¢å­—ä½“ï¼Œå¯ä»¥ä½¿ç”¨ \meta{block}|=*| é€‰é¡¹ã€‚å¸¦æ˜Ÿå·çš„å‘½ä»¤é™¤äº†
%   è®¾ç½® CJK å­åˆ†åŒºä»¥å¤–ï¼Œè¿˜é‡ç½®æ&nbsp;‡ç‚¹ç¬¦å·æ‰€å±žçš„å­—ç¬¦ç±»ã€‚
%
% \begin{function}{\xeCJKCancelSubCJKBlock}
%   \begin{syntax}
%     \tn{xeCJKCancelSubCJKBlock}  \Arg{block_1, block_2, ...}
%     \tn{xeCJKCancelSubCJKBlock} \Arg{block_1, block_2, ...}
%   \end{syntax}
%   åœ¨æ–‡æ¡£ä¸­å–æ¶ˆå¯¹ |CJK| åˆ†åŒºçš„å£°æ˜Žã€‚å¸¦æ˜Ÿå·çš„å‘½ä»¤è¿˜é‡ç½®æ&nbsp;‡ç‚¹ç¬¦å·æ‰€å±žçš„å­—ç¬¦ç±»ã€‚
% \end{function}
%
% \begin{function}{\xeCJKRestoreSubCJKBlock}
%   \begin{syntax}
%     \tn{xeCJKRestoreSubCJKBlock}  \Arg{block_1, block_2, ...}
%     \tn{xeCJKRestoreSubCJKBlock} * \Arg{block_1, block_2, ...}
%   \end{syntax}
%   åœ¨æ–‡æ¡£ä¸­æ¢å¤å¯¹ |CJK| åˆ†åŒºçš„å£°æ˜Žã€‚å¸¦æ˜Ÿå·çš„å‘½ä»¤è¿˜é‡ç½®æ&nbsp;‡ç‚¹ç¬¦å·æ‰€å±žçš„å­—ç¬¦ç±»ã€‚
% \end{function}
%
% \subsection{è®¾ç½® CJK å­—ç¬¦èŒƒå›´}
%
% \begin{function}[EXP]{\xeCJKDeclareCharClass}
%   \begin{syntax}
%     \tn{xeCJKDeclareCharClass}  \Arg{class} \Arg{class range}
%     \tn{xeCJKDeclareCharClass} * \Arg{class} \Arg{class range}
%   \end{syntax}
%   \meta{class range} çš„æ&nbsp;¼å¼å’Œ \ref{subsec:block} èŠ‚çš„ \meta{block range} ç›¸åŒã€‚
%   \meta{class} çš„æœ‰æ•ˆå€¼è§æºä»£ç&nbsp;ï¼ˆç¬¬ \ref{sec:xeCJK-class-set} èŠ‚ï¼‰ã€‚\pkg{xeCJK} å·²
%   ç»æ”¯æŒ |Unicode| ä¸­æ‰€æœ‰ CJK æ–‡å­—å’Œæ&nbsp;‡ç‚¹ã€‚ä¸€èˆ¬æ¥è¯´ï¼Œä¸è¦è½»æ˜“æ”¹å˜å­—ç¬¦ç±»åˆ«ã€‚å¸¦æ˜Ÿå·çš„
%   å‘½ä»¤é™¤äº†è®¾ç½®å­—ç¬¦ç±»åˆ«ä»¥å¤–ï¼Œä¸ºäº†ç¡®ä¿æ&nbsp;‡ç‚¹å¤„ç†çš„æ­£ç¡®æ€§ï¼Œè¿˜é‡ç½®æ&nbsp;‡ç‚¹ç¬¦å·æ‰€å±žçš„å­—ç¬¦ç±»ã€‚
% \end{function}
%
% \begin{function}[EXP]{\xeCJKResetCharClass}
%   ç”¨äºŽæ¢å¤ \pkg{xeCJK} å¯¹å„ä¸ªå­—ç¬¦ç±»åˆ«çš„åˆå§‹åŒ–è®¾ç½®ã€‚
% \end{function}
%
% \begin{function}[EXP]{\xeCJKResetPunctClass}
%   ç”¨äºŽé‡ç½®æ&nbsp;‡ç‚¹ç¬¦å·æ‰€å±žçš„å­—ç¬¦ç±»ã€‚
% \end{function}
%
% \begin{function}{\normalspacedchars}
%   \begin{syntax}
%     \tn{normalspacedchars} \Arg{char list}
%   \end{syntax}
%   åœ¨ \meta{char list} ä¸­å‡ºçŽ°çš„å­—ç¬¦ä¸¤ç«¯ä¸è‡ªåŠ¨æ·»åŠ&nbsp;ç©ºæ&nbsp;¼ï¼Œåˆå§‹è®¾ç½®æ˜¯ |/|ã€|\|ã€
%   å’Œ |-| (|U+002D|)ã€‚
% \end{function}
%
% \subsection{æ&nbsp;‡ç‚¹ç¬¦å·çš„å¤„ç†}
%
% \pkg{xeCJK} å¯¹æ&nbsp;‡ç‚¹ç¬¦å·çš„è¾“å‡ºå®½åº¦çš„è°ƒæ•´æ˜¯é€šè¿‡è°ƒæ•´å…¶å·¦è¾¹æˆ–å³è¾¹çš„ç©ºç™½å®½åº¦æ¥å®žçŽ°çš„ã€‚
% æŒ‰ç…§ç›®å‰çš„å¤„ç†æ–¹å¼ï¼Œå¯¹äºŽä½äºŽå·¦è¾¹çš„æ&nbsp;‡ç‚¹ç¬¦å·ï¼ˆå¦‚å·¦å¼•å·ï¼‰ï¼Œ\pkg{xeCJK} åªèƒ½è°ƒæ•´å®ƒ
% å·¦è¾¹çš„ç©ºç™½ï¼›å¯¹äºŽä½äºŽå³è¾¹çš„æ&nbsp;‡ç‚¹ç¬¦å·ï¼ˆå¦‚å³å¼•å·ï¼‰ï¼Œ\pkg{xeCJK} åªèƒ½è°ƒæ•´å®ƒå³è¾¹çš„ç©º
% ç™½ï¼›å¯¹äºŽå±…ä¸­çš„æ&nbsp;‡ç‚¹ç¬¦å·ï¼Œåˆ™è°ƒæ•´å…¶å·¦å³ç©ºç™½ï¼Œä»¥ä¿è¯å…¶å±…ä¸­ã€‚å¯¹äºŽæ&nbsp;‡ç‚¹ç¬¦å·çš„ç›¸å…³è®¾ç½®ï¼Œ
% åªèƒ½åœ¨å¯¼è¨€åŒºä¸­è¿›è¡Œã€‚
%
% \subsubsection{è®¾ç½®ç‰¹å®šæ&nbsp;‡ç‚¹ç¬¦å·çš„å®½åº¦å’Œé—´è·}
% \label{subsec:punct}
%
% è¿™é‡Œçš„è®¾ç½®å¯ç”¨äºŽé™¤ |plain| ä»¥å¤–çš„æ‰€æœ‰æ&nbsp;‡ç‚¹å¤„ç†æ&nbsp;¼å¼ã€‚
%
% \begin{function}[EXP,updated=2013-08-22]{\xeCJKsetwidth}
%   \begin{syntax}
%     \tn{xeCJKsetwidth}  \Arg{æ&nbsp;‡ç‚¹åˆ—è¡¨} \Arg{length}
%     \tn{xeCJKsetwidth} * \Arg{æ&nbsp;‡ç‚¹åˆ—è¡¨} \Arg{length}
%   \end{syntax}
%   \meta{æ&nbsp;‡ç‚¹åˆ—è¡¨}å¯ä»¥æ˜¯å•ä¸ªæ&nbsp;‡ç‚¹ï¼Œä¹Ÿå¯ä»¥æ˜¯å¤šä¸ªæ&nbsp;‡ç‚¹ã€‚ä¾‹å¦‚ï¼Œ
%   \begin{ctexexam}
%   \xeCJKsetwidth{ã€‚ï¼Ÿ}{0.7em}
%   \end{ctexexam}
%   å°†è®¾ç½®å¥å·å’Œé—®å·æ‰€å&nbsp;çš„å®½åº¦ä¸º |0.7em|ã€‚å¸¦æ˜Ÿå·çš„å‘½ä»¤ï¼Œè®¾ç½®æ&nbsp;‡ç‚¹ç¬¦å·å‡ºçŽ°åœ¨è¡Œé¦–/å°¾
%   æ—¶çš„å®½åº¦ã€‚
% \end{function}
%
% \begin{function}[EXP]{\xeCJKsetkern}
%   \begin{syntax}
%     \tn{xeCJKsetkern} \Arg{å‰æ&nbsp;‡ç‚¹} \Arg{åŽæ&nbsp;‡ç‚¹} \Arg{length}
%   \end{syntax}
%   \pkg{xeCJK} ä¼šæ&nbsp;¹æ®é€‰å®šçš„æ&nbsp;‡ç‚¹å¤„ç†æ&nbsp;¼å¼è‡ªåŠ¨è°ƒæ•´ç›¸é‚»çš„å‰åŽä¸¤ä¸ª |CJK| æ&nbsp;‡ç‚¹ç¬¦å·çš„
%   ç©ºç™½å®½åº¦ã€‚å¦‚æžœéœ€è¦å¯¹ä¸ªåˆ«æƒ…å†µè¿›è¡Œç‰¹æ®Šè°ƒæ•´ï¼Œå¯ä»¥ä½¿ç”¨è¿™ä¸ªå‘½ä»¤ã€‚ä¾‹å¦‚ï¼Œ
%   \begin{ctexexam}
%   \xeCJKsetkern{ï¼š}{â€œ}{0.3em}
%   \end{ctexexam}
%   å°†è®¾ç½®å†’å·ä¸Žå·¦åŒå¼•å·ä¹‹é—´çš„ç©ºç™½å®½åº¦ä¸º |0.3em|ã€‚
% \end{function}
%
% \subsubsection{å®šä¹‰æ&nbsp;‡ç‚¹ç¬¦å·å¤„ç†æ&nbsp;¼å¼}
% \label{subsec:punctstyle}
%
% \begin{function}[EXP,updated=2013-08-22]{\xeCJKDeclarePunctStyle}
%   \begin{syntax}
%     \tn{xeCJKDeclarePunctStyle} \Arg{style} \Arg{options}
%   \end{syntax}
%   å®šä¹‰æ–°çš„æ&nbsp;‡ç‚¹ç¬¦å·å¤„ç†æ&nbsp;¼å¼ï¼Œå·²ç»å­˜åœ¨çš„åŒåæ&nbsp;¼å¼å°†è¢«è¦†ç›–ã€‚å¯ä»¥è®¾ç½®çš„é€‰é¡¹å°†åœ¨ä¸‹é¢ä»‹ç»ã€‚
% \end{function}
%
% \begin{function}[EXP,updated=2013-08-22]{\xeCJKEditPunctStyle}
%   \begin{syntax}
%     \tn{xeCJKEditPunctStyle} \Arg{style} \Arg{options}
%   \end{syntax}
%   ä¿®æ”¹å·²æœ‰çš„æ&nbsp;‡ç‚¹ç¬¦å·å¤„ç†æ&nbsp;¼å¼ã€‚
% \end{function}
%
% ä¸‹é¢æ˜¯å¯ä»¥è®¾ç½®çš„æ&nbsp;‡ç‚¹ç¬¦å·æ&nbsp;¼å¼é€‰é¡¹ã€‚å…¶ä¸­å·¦è¾¹ä¸€æ&nbsp;æ˜¯é€‰é¡¹åç§°ï¼Œä¸­é—´æ˜¯é€‰é¡¹çš„è¾“å…¥å€¼ç±»
% åž‹ï¼Œå³è¾¹åˆ™æ˜¯ç›¸å…³è¯´æ˜Žã€‚æŸäº›é€‰é¡¹ä¹‹é—´æ˜¯äº’æ–¥çš„ï¼Œå…·æœ‰ä¼˜å…ˆçº§å…³ç³»ã€‚è¦ä½¿ä¸‹ä¸€çº§çš„é€‰é¡¹æœ‰
% æ•ˆï¼Œåˆ™éœ€è¦å…ˆç¦ç”¨ä¸Šä¸€çº§çš„è®¾ç½®ï¼šå¯¹äºŽ \meta{boolean} ç±»åž‹çš„é€‰é¡¹ï¼Œå°†å…¶è®¾ç½®ä¸º |false|ï¼Œ
% å¯¹äºŽ \meta{length} ç±»åž‹çš„é€‰é¡¹ï¼Œå°†å…¶è®¾ç½®ä¸º \tn{maxdimen}ï¼Œè€Œå¯¹äºŽ \meta{real} ç±»åž‹
% çš„é€‰é¡¹ï¼Œå°†å…¶è®¾ç½®ä¸º |nan|ã€‚
%
% \begin{psopt}
%   \PSKeyVal{enabled-global-setting}{boolean}
%     æ˜¯å¦ä½¿ç”¨ \tn{xeCJKsetup} çš„ |PunctWidth|ã€|PunctBoundWidth| é€‰é¡¹å’Œ
%     \tn{xeCJKsetwidth}ã€\tn{xeCJKsetkern} çš„è®¾ç½®ã€‚é»˜è®¤å€¼æ˜¯ |true|ã€‚
% \end{psopt}
%
% \begin{psopt}
%   \PSKeyVal{fixed-punct-width}{length}
%     è®¾ç½®å•ä¸ªæ&nbsp;‡ç‚¹ç¬¦å·çš„å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ \tn{maxdimen}ã€‚
%   \PSKeyVal{fixed-punct-ratio}{real}
%     è®¾ç½®å•ä¸ªæ&nbsp;‡ç‚¹ç¬¦å·çš„è¾“å‡ºå®½åº¦ä¸Žå®žé™…å®½åº¦çš„æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯ |1.0|ã€‚
%   \PSKeyVal{mixed-punct-width}{length}
%     è®¾ç½®å¥æœ«æ&nbsp;‡ç‚¹ç¬¦å·çš„å®½åº¦ã€‚å…¶ä¸­å¥æœ«æ&nbsp;‡ç‚¹ç¬¦å·é€šè¿‡ \tn{xeCJKsetup} çš„ |KaiMingPunct|
%     æ¥è®¾ç½®ã€‚é»˜è®¤å€¼æ˜¯ä¸Ž |fixed-punct-width| é€‰é¡¹çš„å€¼ç›¸åŒã€‚
%   \PSKeyVal{mixed-punct-ratio}{real}
%     è®¾ç½®å¥æœ«æ&nbsp;‡ç‚¹ç¬¦å·çš„å®½åº¦æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯ä¸Ž |fixed-punct-ratio| é€‰é¡¹çš„å€¼ç›¸åŒã€‚
%   \PSKeyVal{middle-punct-width}{length}
%     è®¾ç½®å±…ä¸­æ&nbsp;‡ç‚¹ç¬¦å·çš„å®½åº¦ã€‚å…¶ä¸­å±…ä¸­æ&nbsp;‡ç‚¹ç¬¦å·é€šè¿‡ \tn{xeCJKsetup} çš„ |MiddlePunct|
%     æ¥è®¾ç½®ã€‚é»˜è®¤å€¼æ˜¯ä¸Ž |fixed-punct-width| é€‰é¡¹çš„å€¼ç›¸åŒã€‚
%   \PSKeyVal{middle-punct-ratio}{real}
%     è®¾ç½®å±…ä¸­æ&nbsp;‡ç‚¹ç¬¦å·çš„å®½åº¦æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯ä¸Ž |fixed-punct-ratio| é€‰é¡¹çš„å€¼ç›¸åŒã€‚
% \end{psopt}
%
% ä»¥ä¸Šå‡&nbsp;ä¸ªé€‰é¡¹è®¾ç½®çš„æ˜¯æ&nbsp;‡ç‚¹çš„å›ºå®šå®½åº¦æˆ–æ¯”ä¾‹ï¼Œ\pkg{xeCJK} ä¼šæ&nbsp;¹æ®è®¾å®šçš„é€‰é¡¹è®¡ç®—æ&nbsp;‡ç‚¹ç¬¦å·
% å·¦/å³çš„ç©ºç™½å®½åº¦ã€‚ä¸‹é¢çš„é€‰é¡¹è®¾ç½®çš„æ˜¯æ&nbsp;‡ç‚¹ç¬¦å·å·¦/å³çš„ç©ºç™½å®½åº¦æˆ–æ¯”ä¾‹ï¼Œå›&nbsp;æ­¤ä¸åŒæ&nbsp;‡ç‚¹ç¬¦å·
% çš„å®½åº¦å¯èƒ½ä¼šä¸åŒã€‚ä¸ºäº†ä½¿ä¸‹é¢çš„é€‰é¡¹ç”Ÿæ•ˆï¼Œéœ€è¦å…ˆç¦ç”¨ä¸Šé¢çš„ç›¸åº”é€‰é¡¹ã€‚ä¼˜å…ˆçº§è‡ªä¸Šè€Œä¸‹ã€‚
%
% \begin{psopt}
%   \PSKeyVal{fixed-margin-width}{length}
%     è®¾ç½®æ&nbsp;‡ç‚¹çš„å·¦/å³ç©ºç™½å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ \tn{maxdimen}ã€‚
%   \PSKeyVal{fixed-margin-ratio}{real}
%     è®¾ç½®æ&nbsp;‡ç‚¹çš„å·¦/å³ç©ºç™½å®½åº¦ä¸Žå­—ä½“ä¸­è¯¥æ&nbsp;‡ç‚¹çš„ç›¸åº”å®žé™…è¾¹ç•Œå®½åº¦çš„æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯~|1.0|ã€‚
%   \PSKeyVal{mixed-margin-width}{length}
%     è®¾ç½®å¥æœ«æ&nbsp;‡ç‚¹çš„å·¦/å³ç©ºç™½å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ä¸Ž |fixed-margin-width| çš„å€¼ç›¸åŒã€‚
%   \PSKeyVal{mixed-margin-ratio}{real}
%     è®¾ç½®å¥æœ«æ&nbsp;‡ç‚¹çš„å·¦/å³ç©ºç™½å®½åº¦çš„æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯ä¸Ž |fixed-margin-ratio| çš„å€¼ç›¸åŒã€‚
%   \PSKeyVal{middle-margin-width}{length}
%     è®¾ç½®å±…ä¸­æ&nbsp;‡ç‚¹çš„ä¸¤è¾¹ç©ºç™½å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ä¸Ž |fixed-margin-width| çš„å€¼ç›¸åŒã€‚
%   \PSKeyVal{middle-margin-ratio}{real}
%     è®¾ç½®å±…ä¸­æ&nbsp;‡ç‚¹çš„ä¸¤è¾¹ç©ºç™½å®½åº¦ä¹‹å’Œä¸Žä¸¤è¾¹å®žé™…ä¸¤è¾¹è¾¹ç•Œå®½åº¦ä¹‹å’Œçš„æ¯”ä¾‹ã€‚
%     é»˜è®¤å€¼æ˜¯ä¸Ž |fixed-margin-ratio| çš„å€¼ç›¸åŒã€‚
% \end{psopt}
%
% ä¸‹é¢é€‰é¡¹è®¾ç½®æ&nbsp;‡ç‚¹ç¬¦å·å‡ºçŽ°åœ¨è¡Œé¦–æˆ–è€…è¡Œå°¾æ—¶çš„å®½åº¦æˆ–æ¯”ä¾‹ã€‚
%
% \begin{psopt}
%   \PSKeyVal{bound-punct-width}{length}
%   è®¾ç½®æ&nbsp;‡ç‚¹ç¬¦å·å‡ºçŽ°åœ¨è¡Œé¦–/å°¾æ—¶çš„å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ \tn{maxdimen}ã€‚
%   \PSKeyVal{bound-punct-ratio}{real}
%   è®¾ç½®æ&nbsp;‡ç‚¹ç¬¦å·å‡ºçŽ°åœ¨è¡Œé¦–/å°¾æ—¶çš„è¾“å‡ºå®½åº¦ä¸Žå®žé™…å®½åº¦çš„æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯ |nan|ã€‚
%   \PSKeyVal{bound-margin-width}{length}
%   è®¾ç½®æ&nbsp;‡ç‚¹ç¬¦å·å‡ºçŽ°åœ¨è¡Œé¦–/å°¾æ—¶çš„å·¦/å³ç©ºç™½å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ \tn{maxdimen}ã€‚
%   \PSKeyVal{bound-margin-ratio}{real}
%   è®¾ç½®æ&nbsp;‡ç‚¹ç¬¦å·å‡ºçŽ°åœ¨è¡Œé¦–/å°¾æ—¶çš„å·¦/å³ç©ºç™½å®½åº¦ä¸Žç›¸åº”å®žé™…è¾¹ç•Œå®½åº¦çš„æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯ |0|ã€‚
%   \PSKeyVal{enabled-hanging}{boolean}
%   å½“ä»¥ä¸Šé€‰é¡¹çš„è®¡ç®—ç»“æžœå¾—åˆ°çš„å®½åº¦å°äºŽæ&nbsp;‡ç‚¹ç¬¦å·çš„å®žé™…è¾¹ç•Œå®½åº¦æ—¶ï¼Œæ˜¯å¦å…è®¸æ&nbsp;‡ç‚¹ç¬¦å·
%   æ‚¬æŒ‚å‡ºé¡µé¢è¾¹ç•Œã€‚é»˜è®¤å€¼æ˜¯ |false|ã€‚
% \end{psopt}
%
% \begin{psopt}
%   \PSKeyVal{add-min-bound-to-margin}{boolean}
%     æ˜¯å¦åœ¨ä»¥ä¸Šè®¡ç®—ç»“æžœçš„åŸºç¡€ä¸Šå†åŠ&nbsp;ä¸Šæ&nbsp;‡ç‚¹çš„å·¦å³å®žé™…è¾¹ç•Œå®½åº¦ä¸­çš„æœ€å°å€¼ã€‚è¿™ä¸ªé€‰é¡¹
%     å¯¹å±…ä¸­çš„æ&nbsp;‡ç‚¹æ—&nbsp;æ•ˆã€‚é»˜è®¤å€¼æ˜¯ |false|ã€‚
% \end{psopt}
%
% \begin{psopt}
%   \PSKeyVal{optimize-margin}{boolean}
%     ä½¿ç”¨ä»¥ä¸Šè®¾ç½®ç©ºç™½å®½åº¦æˆ–æ¯”ä¾‹çš„é€‰é¡¹æ—¶ï¼Œæœ€ç»ˆè¾“å‡ºçš„æ&nbsp;‡ç‚¹ç¬¦å·å·¦/å³çš„ç©ºç™½å®½åº¦å¯èƒ½å¤§
%     äºŽåŽŸæ¥çš„å®žé™…è¾¹ç•Œå®½åº¦ã€‚è‹¥æ­¤æ—¶æœ¬é€‰é¡¹è¢«è®¾ç½®ä¸º |true|ï¼Œåˆ™ä½¿ç”¨åŽŸæ¥çš„å®žé™…è¾¹ç•Œå®½åº¦ã€‚
%     è€Œä½¿ç”¨ |fixed-punct-width| é€‰é¡¹è®¡ç®—å¾—å‡ºçš„å·¦/å³å®½åº¦å¯èƒ½å°äºŽè¯¥æ&nbsp;‡ç‚¹çš„å¦ä¸€ä¾§å®½
%     åº¦ï¼Œè‹¥æ­¤æ—¶æœ¬é€‰é¡¹è¢«å¯ç”¨ï¼Œåˆ™ä½¿ç”¨è¯¥æ&nbsp;‡ç‚¹çš„å¦ä¸€ä¾§å®½åº¦ã€‚é»˜è®¤å€¼ä¸º |false|ã€‚
% \end{psopt}
%
% \begin{psopt}
%   \PSKeyVal{margin-minimum}{length}
%     æŒ‡å®šæ&nbsp;‡ç‚¹ç¬¦å·å·¦/å³çš„æœ€å°ç©ºç™½å®½åº¦ã€‚å½“ç»è¿‡ä»¥ä¸Šé€‰é¡¹è®¾ç½®çš„ç©ºç™½å®½åº¦å°äºŽè¿™ä¸ªé€‰é¡¹çš„å€¼
%     æ—¶ï¼Œåˆ™ä½¿ç”¨è¿™ä¸ªé€‰é¡¹çš„å€¼ã€‚é»˜è®¤å€¼æ˜¯ |0pt|ã€‚
% \end{psopt}
%
% ä¸‹é¢çš„é€‰é¡¹å¤„ç†çš„æ˜¯å‰åŽç›¸é‚»çš„ä¸¤ä¸ªæ&nbsp;‡ç‚¹ç¬¦å·ä¹‹é—´çš„ç©ºç™½å®½åº¦ã€‚è¿™äº›é€‰é¡¹æ˜¯äº’æ–¥çš„ï¼Œä¼˜å…ˆçº§
% è‡ªä¸Šè€Œä¸‹ã€‚
%
% \begin{psopt}
%   \PSKeyVal{enabled-kerning}{boolean}
%     æ˜¯å¦è°ƒæ•´å‰åŽç›¸é‚»çš„ä¸¤ä¸ªæ&nbsp;‡ç‚¹ä¹‹é—´çš„ç©ºç™½å®½åº¦ã€‚å¦‚æžœè®¾ç½®ä¸º |false|ï¼Œåˆ™æ¯ä¸ªæ&nbsp;‡ç‚¹éƒ½æŒ‰
%     åŽŸæ¥çš„è¾“å‡ºå®½åº¦è¾“å‡ºã€‚é»˜è®¤å€¼æ˜¯ |true|ã€‚
%   \PSKeyVal{min-bound-to-kerning}{boolean}
%     æ˜¯å¦ä½¿ç”¨å½“å‰å­—ä½“ä¸­å‰é¢æ&nbsp;‡ç‚¹å®žé™…å·¦å³è¾¹ç•Œçš„æœ€å°å€¼ä¸ŽåŽé¢æ&nbsp;‡ç‚¹å®žé™…å·¦å³è¾¹ç•Œçš„æœ€å°å€¼
%     ä¸­çš„æœ€å¤§å€¼ä½œä¸ºä¸¤ä¸ªæ&nbsp;‡ç‚¹ä¹‹é—´çš„ç©ºç™½å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ |false|ã€‚
%   \PSKeyVal{kerning-total-width}{length}
%     è®¾ç½®ä¸¤ä¸ªæ&nbsp;‡ç‚¹çš„æ€»å…±å®½åº¦ã€‚æ­¤æ—¶ \pkg{xeCJK} ä¼šè‡ªåŠ¨è®¡ç®—ä¸¤ä¸ªæ&nbsp;‡ç‚¹ä¹‹é—´çš„ç©ºç™½å®½åº¦ã€‚
%     é»˜è®¤å€¼æ˜¯ \tn{maxdimen}ã€‚
%   \PSKeyVal{kerning-total-ratio}{real}
%     è®¾ç½®ä¸¤ä¸ªæ&nbsp;‡ç‚¹çš„æ€»å…±è¾“å‡ºå®½åº¦ä¸Žå®žé™…å®½åº¦çš„æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯ |0.75|ã€‚
%   \PSKeyVal{same-align-margin}{length}
%     å‰åŽä¸¤ä¸ªæ&nbsp;‡ç‚¹ä½äºŽåŒä¾§æ—¶ï¼Œå®ƒä»¬ä¹‹é—´çš„ç©ºç™½å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ \tn{maxdimen}ã€‚
%   \PSKeyVal{same-align-ratio}{real}
%     å‰åŽä¸¤ä¸ªæ&nbsp;‡ç‚¹ä½äºŽåŒä¾§æ—¶ï¼Œå®ƒä»¬ä¹‹é—´çš„ç©ºç™½å®½åº¦ä¸Žå®žé™…è¾“å‡ºå®½åº¦çš„æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯~|nan|ã€‚
%   \PSKeyVal{different-align-margin}{length}
%     å‰åŽä¸¤ä¸ªæ&nbsp;‡ç‚¹ä½äºŽå¼‚ä¾§æ—¶ï¼Œå®ƒä»¬ä¹‹é—´çš„ç©ºç™½å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ \tn{maxdimen}ã€‚
%   \PSKeyVal{different-align-ratio}{real}
%     å‰åŽä¸¤ä¸ªæ&nbsp;‡ç‚¹ä½äºŽå¼‚ä¾§æ—¶ï¼Œå®ƒä»¬ä¹‹é—´çš„ç©ºç™½å®½åº¦ä¸Žå®žé™…è¾“å‡ºå®½åº¦çš„æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯~|nan|ã€‚
%   \PSKeyVal{kerning-margin-width}{length}
%     è®¾ç½®å‰åŽä¸¤ä¸ªæ&nbsp;‡ç‚¹ä¹‹é—´çš„ç©ºç™½å®½åº¦ã€‚é»˜è®¤å€¼æ˜¯ \tn{maxdimen}ã€‚
%   \PSKeyVal{kerning-margin-ratio}{real}
%     è®¾ç½®å‰åŽä¸¤ä¸ªæ&nbsp;‡ç‚¹ä¹‹é—´çš„ç©ºç™½å®½åº¦ä¸Žå®žé™…è¾“å‡ºç©ºç™½çš„æ¯”ä¾‹ã€‚é»˜è®¤å€¼æ˜¯ |1.0|ã€‚
% \end{psopt}
%
% \begin{psopt}
%   \PSKeyVal{optimize-kerning}{boolean}
%     ä½¿ç”¨ä»¥ä¸Šé€‰é¡¹è®¡ç®—å‡ºä¸¤ä¸ªæ&nbsp;‡ç‚¹ä¹‹é—´çš„ç©ºç™½å®½åº¦å¯èƒ½å°äºŽé€šè¿‡ |min-bound-to-kerning|
%     é€‰é¡¹å¾—å‡ºçš„ç»“æžœã€‚å½“å‡ºçŽ°è¿™ä¸€æƒ…å†µæ—¶ï¼Œè‹¥æ­¤é€‰é¡¹è¢«è®¾ç½®ä¸º |true|ï¼Œåˆ™ä½¿ç”¨è¯¥é€‰é¡¹çš„ç©º
%     ç™½å®½åº¦ã€‚é»˜è®¤å€¼ä¸º |false|ã€‚
% \end{psopt}
%
% \begin{psopt}
%   \PSKeyVal{kerning-margin-minimum}{length}
%     æŒ‡å®šä¸¤ä¸ªæ&nbsp;‡ç‚¹ä¹‹é—´çš„æœ€å°ç©ºç™½å®½åº¦ã€‚å½“ç»è¿‡ä»¥ä¸Šé€‰é¡¹è®¾ç½®çš„ç©ºç™½å®½åº¦å°äºŽè¿™ä¸ªé€‰é¡¹çš„å€¼
%     æ—¶ï¼Œåˆ™ä½¿ç”¨è¿™ä¸ªé€‰é¡¹çš„å€¼ã€‚é»˜è®¤å€¼æ˜¯ |0pt|ã€‚
% \end{psopt}
%
% äº‹å®žä¸Šï¼Œ\pkg{xeCJK} çš„é»˜è®¤è®¾ç½®å°±ç›¸å½“äºŽä¸­æ–‡å…¨è§’ï¼ˆ|quanjiao|ï¼‰æ&nbsp;¼å¼ã€‚å¯ä»¥ä½¿ç”¨ä¸Šé¢
% è¯´æ˜Žçš„é€‰é¡¹å®šä¹‰æ–°çš„æ&nbsp;‡ç‚¹å¤„ç†æ&nbsp;¼å¼ã€‚ä¾‹å¦‚ï¼Œä½¿ç”¨
% \begin{ctexexam}
%   \xeCJKDeclarePunctStyle { mine }
%     {
%       fixed-punct-ratio       = nan ,
%       fixed-margin-width      = 0 pt ,
%       mixed-margin-width      = \maxdimen ,
%       mixed-margin-ratio      = 0.5 ,
%       middle-margin-width     = \maxdimen ,
%       middle-margin-ratio     = 0.5 ,
%       add-min-bound-to-margin = true ,
%       bound-punct-width       = 0 em ,
%       enabled-hanging         = true ,
%       min-bound-to-kerning    = true ,
%       kerning-margin-minimum  = 0.1 em
%     }
% \end{ctexexam}
% å°±å®šä¹‰äº†ä¸€ä¸ªåä¸º |mine| çš„æ&nbsp;‡ç‚¹å¤„ç†æ&nbsp;¼å¼ã€‚å¯ä»¥åœ¨å¯¼è¨€åŒºé€šè¿‡
% \begin{frameverb}
%   \xeCJKsetup{PunctStyle=mine}
% \end{frameverb}
% åœ¨æ–‡æ¡£ä¸­ä½¿ç”¨è¿™ä¸ªæ&nbsp;¼å¼ã€‚å®ƒçš„æ„ä¹‰æ˜¯ï¼šä½¿ç”¨æ&nbsp;‡ç‚¹ç¬¦å·çš„å®žé™…å·¦å³è¾¹ç•Œä¸­çš„æœ€å°å€¼ä½œä¸ºå…¶å·¦/å³
% ç©ºç™½çš„å®½åº¦ï¼Œå¯¹äºŽå¥æœ«æ&nbsp;‡ç‚¹å’Œå±…ä¸­æ&nbsp;‡ç‚¹ï¼Œå†åŠ&nbsp;ä¸Šå®žé™…è¾¹ç•Œç©ºç™½çš„ä¸€åŠï¼›å½“æ&nbsp;‡ç‚¹å‡ºçŽ°åœ¨è¡Œé¦–æˆ–
% è¡Œå°¾æ—¶å®½åº¦ä¸ºé›¶ï¼Œå…è®¸æ‚¬æŒ‚å‡ºé¡µé¢è¾¹ç•Œï¼›ä½¿ç”¨ç›¸é‚»ä¸¤ä¸ªæ&nbsp;‡ç‚¹çš„å®žé™…è¾¹ç•Œä¸­çš„è¾ƒå°å€¼ä½œä¸ºå®ƒä»¬
% ä¹‹é—´çš„ç©ºç™½å®½åº¦ï¼Œå¹¶ä¸”æœ€å°çš„ç©ºç™½å®½åº¦æ˜¯ |0.1em|ã€‚å†ä¾‹å¦‚ï¼Œä½¿ç”¨
% \begin{ctexexam}
%   \xeCJKEditPunctStyle { hangmobanjiao } { enabled-global-setting = false }
% \end{ctexexam}
% å°†ä½¿å¾— \tn{xeCJKsetkern} ç­‰çš„è®¾ç½®å¯¹ |hangmobanjiao| è¿™ä¸€æ&nbsp;¼å¼æ—&nbsp;æ•ˆã€‚
%
% \subsection{\pkg{xeCJKfntef} ç”¨æ³•è¯´æ˜Ž}
%
% \pkg{xeCJK} åŒ…å«æœ‰ä¸€ä¸ªå­å®åŒ… \pkg{xeCJKfntef}ï¼Œå¯ä»¥ç”¨å®ƒæ¥å®žçŽ°\CJKunderdot{æ±‰å­—åŠ&nbsp;ç‚¹}%
% å’Œå¯æ–­è¡Œçš„ä¸‹åˆ’çº¿ç­‰ã€‚å®ƒæ˜¯ \pkg{CJKfntef} å®åŒ…åœ¨ \XeLaTeX ä¸‹çš„æ›¿æ¢ç‰ˆæœ¬ï¼ŒåŸºæœ¬ç”¨æ³•å®Œå…¨ä¸€è‡´ã€‚
%
% \pkg{xeCJKfntef} åŸºäºŽ \package{ulem} å®åŒ…ï¼Œé™¤äº†å…¼å®¹ \pkg{ulem} å®šä¹‰çš„ä¸€äº›å‘½ä»¤å¤–ï¼Œ
% è¿˜è¿›è¡Œäº†ä¸€äº›æ‰©å……ï¼š
%
% \begin{function}[updated=2014-11-04]
%  {\CJKunderline,\CJKunderdblline,\CJKunderwave,\CJKsout,\CJKxout}
%   \begin{syntax}
%     \tn{CJKunderline} [*] [-] \oarg{é€‰é¡¹} \Arg{å†…å®¹}
%   \end{syntax}
%   \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.35\linewidth,gobble=6]
%     \CJKunderline{è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}\\
%     \CJKunderdblline{è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}\\
%     \CJKunderwave{è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}\\
%     \CJKsout{è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}\\
%     \CJKxout{è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}
%   \end{SideBySideExample}
% \end{function}
%
% \csappto{NoHighlight@Attributes}{\catcode37=14\relax}
%
% \begin{Example}[frame=single,numbers=left,gobble=4]
%   \CJKunderline-{å—æœ}\CJKunderline-{æ¢}\CJKunderline-{åŠ‰å‹°}%
%   \CJKunderwave-{æ–‡å¿ƒé›•é¾}\CJKunderwave-{é¤Šæ°£}\\
%   \CJKunderline*[thickness=1pt, hidden=true]{çž»å½¼é˜•è€…ï¼Œè™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}
% \end{Example}
%
% \begin{function}[updated=2014-11-04]{\CJKunderdot}
%   \begin{syntax}
%     \tn{CJKunderdot} \oarg{é€‰é¡¹} \Arg{å†…å®¹}
%   \end{syntax}
%   åœ¨æ±‰å­—ä¸‹åŠ&nbsp;ç‚¹ï¼Œå¯ä»¥å’Œä¸Šè¿°ä¸‹åˆ’çº¿å‘½ä»¤åµŒå¥—ä½¿ç”¨ã€‚ä¾‹å¦‚\smallskip
%
%   \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.35\linewidth,gobble=6]
%     \CJKunderline{è™šå®¤ç”Ÿç™½ï¼Œ\CJKunderdot{å‰ç¥¥}æ­¢æ­¢}\\
%     \CJKunderdot{è™šå®¤ç”Ÿç™½ï¼Œ\CJKunderline{å‰ç¥¥}æ­¢æ­¢}
%   \end{SideBySideExample}
% \end{function}
%
% \bigskip
%
% å¯¹ä¸Šè¿°å…­ç§å¯¹è±¡ï¼Œ\pkg{xeCJKfntef} æä¾›äº†ä¸€äº›é€‰é¡¹ï¼Œè®¾ç½®ç‚¹æˆ–çº¿çš„ä½ç½®å’Œé¢œè‰²ã€‚å¯ä»¥ç”¨
% \tn{xeCJKsetup} é¢„å…ˆç»Ÿä¸€è®¾ç½®å®ƒä»¬ï¼Œä¹Ÿå¯ä»¥åœ¨ä½¿ç”¨æ—¶ç‰¹åˆ«è®¾ç½®ã€‚
%
% \begin{function}[added=2014-11-04]{skip}
%   \begin{syntax}
%     \tn{xeCJKsetup} \{ underline/skip = \meta{\TTF} \}
%     \tn{xeCJKsetup} \{ underline = \{ skip = \meta{\TTF} , ... \} \}
%   \end{syntax}
%   é»˜è®¤æƒ…å†µä¸‹ï¼Œä¸‹åˆ’çº¿ä¼šè‡ªåŠ¨è·³è¿‡ä¸­æ–‡æ&nbsp;‡ç‚¹ç¬¦å·ï¼Œå¯ä»¥è®¾ç½®æœ¬é€‰é¡¹ä¸º \texttt{false}ï¼Œ
%   ç¦ç”¨è¿™ä¸€åŠŸèƒ½ã€‚ç›¸åº”ä¸‹åˆ’çº¿å‘½ä»¤åŽåŠ&nbsp;ä¸Š |*| å·ï¼Œå…·æœ‰ç›¸åŒçš„æ•ˆæžœã€‚
% \end{function}
%
% \begin{function}{subtract}
%   è®¾ç½®æœ¬é€‰é¡¹ä¸º \texttt{true}ï¼Œä½¿å¾—ä¸‹åˆ’çº¿çš„é¦–å°¾å‡å°‘ä¸€å®šè·ç¦»ï¼Œé¿å…å‰åŽçš„ä¸‹åˆ’çº¿
%   è¿žåœ¨ä¸€èµ·ï¼Œé€‚ç”¨äºŽå¤ç±æ&nbsp;‡ç‚¹æ•´ç†ä¸­çš„ä¸“åå·å’Œä¹¦åå·ã€‚åœ¨ç›¸åº”ä¸‹åˆ’çº¿å‘½ä»¤åŽåŠ&nbsp;ä¸Š |-|
%   å·ï¼Œå…·æœ‰ç›¸åŒçš„æ•ˆæžœã€‚
% \end{function}
%
% \begin{function}{hidden}
%   è®¾ç½®æœ¬é€‰é¡¹ä¸º \texttt{true}ï¼Œå°†éšè—æ–‡æœ¬å†…å®¹ï¼Œåªç”»ä¸‹åˆ’çº¿ã€‚
% \end{function}
%
% \begin{function}{format}
%   \begin{syntax}
%     \tn{xeCJKsetup} \{ underline/format = \tn{color}\{red\} \}
%     \tn{xeCJKsetup} \{ underwave = \{ format = \tn{color}\{red\}, ... \} \}
%   \end{syntax}
%   è®¾ç½®çº¿æˆ–ç‚¹çš„æ&nbsp;¼å¼ï¼Œæ¯”å¦‚é¢œè‰²ã€‚
% \end{function}
%
% \begin{function}[added=2016-06-03]{textformat}
%   è®¾ç½®ä¸‹åˆ’çº¿æˆ–ç‚¹çš„æ­£æ–‡çš„æ&nbsp;¼å¼ã€‚ä¾‹å¦‚ï¼š\smallskip
%   \begin{Example}[frame=single,numbers=left,gobble=6]
%     \CJKunderline[textformat=\color{blue}]{è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}\\
%     \CJKunderdot[textformat=\bfseries, format=\color{red}]{è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}
%   \end{Example}
% \end{function}
%
% \begin{function}{symbol}
%   è®¾ç½® \tn{CJKunderwave} æˆ– \tn{CJKunderdot} çš„ç¬¦å·ã€‚
% \end{function}
%
% ä¾‹å¦‚ï¼Œæ³¢æµªçº¿ \tn{CJKunderwave} çš„ç¬¦å·ä¸ä¼šéšå­—å·è€Œå˜åŒ–ï¼Œåœ¨å°å­—å·ä¸‹ä¸å¥½çœ‹ã€‚æˆ‘ä»¬å¯ä»¥
% å°†å®ƒæ”¹ä¸ºéšå­—å·è€Œå˜åŒ–å¤§å°ï¼š
%
% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.35\linewidth,gobble=4]
%   % \usepackage{fix-cm}
%   \xeCJKsetup{%
%     underwave/symbol=
%       \fontsize{0.5em}{0pt}%
%       \fontencoding{U}\fontfamily{lasy}\selectfont
%       \char 58\relax}
%   \footnotesize
%   \CJKunderwave{çž»å½¼é˜•è€…ï¼Œè™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}
% \end{SideBySideExample}
%
% \begin{function}{thickness}
%   è®¾ç½® \tn{CJKunderline}ã€\tn{CJKunderdblline} å’Œ \tn{CJKsout} çš„çº¿çš„åŽšåº¦ã€‚
%   åˆå§‹å€¼æ˜¯ \tn{ULthickness}ã€‚
% \end{function}
%
% \begin{function}{depth}
%   è®¾ç½®çº¿æˆ–ç‚¹çš„æ·±åº¦ï¼ˆåŸºçº¿åˆ°çº¿æˆ–ç‚¹çš„é¡¶éƒ¨çš„è·ç¦»ï¼‰ã€‚åˆå§‹å€¼éƒ½æ˜¯ \texttt{0.2em}ã€‚
% \end{function}
%
% \begin{function}{boxdepth}
%   \tn{CJKunderdot} å¯èƒ½ä¼šå½±å“åˆ°è¡Œè·ï¼Œå¯ä»¥è®¾ç½®æœ¬é€‰é¡¹è¿›è¡Œè°ƒæ•´ã€‚å¦‚æžœä¸å¸Œæœ›
%   \tn{CJKunderdot} å½±å“è¡Œè·ï¼Œå¯ä»¥å°†æœ¬é€‰é¡¹è®¾ç½®ä¸º \texttt{0pt}ã€‚
% \end{function}
%
% \begin{function}{sep}
%   è®¾ç½® \tn{CJKunderdot} ä¸Ž \tn{CJKunderline}ã€\tn{CJKunderdblline} æˆ–
%   \tn{CJKunderwave} åµŒå¥—ä½¿ç”¨æ—¶ï¼Œç‚¹ä¸Žçº¿æˆ–è€…çº¿ä¸Žç‚¹çš„è·ç¦»ã€‚
% \end{function}
%
% \begin{function}{gap}
%   è®¾ç½® \tn{CJKunderdblline} çš„ä¸¤æ¡çº¿ä¹‹é—´çš„è·ç¦»ã€‚åˆå§‹å€¼æ˜¯ \texttt{1.1pt}ã€‚
% \end{function}
%
% \begin{function}{height}
%   è®¾ç½®åˆ&nbsp;é™¤çº¿ \tn{CJKsout} çš„é«˜åº¦ï¼ˆçº¿çš„ä¸­å¿ƒåˆ°åŸºçº¿çš„è·ç¦»ï¼‰ã€‚åˆå§‹å€¼æ˜¯ \texttt{0.35em}ã€‚
%
%   ä¾‹å¦‚ï¼Œæˆ‘ä»¬å¯ä»¥è®¾ç½® \tn{CJKsout} çš„åŽšåº¦å’Œé¢œè‰²ï¼Œè®©å®ƒå…·æœ‰ç±»ä¼¼é«˜äº®çš„æ•ˆæžœï¼š\smallskip
%
%   \begin{Example}[frame=single,numbers=left,gobble=4]
%     \CJKsout*[thickness=2.5ex, format=\color{yellow}]{çž»å½¼é˜•è€…ï¼Œè™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}
%   \end{Example}
% \end{function}
%
% \medskip
%
% \pkg{xeCJKfntef} è¿˜æä¾›ç»™äº†è‡ªå®šä¹‰ä¸‹åˆ’çº¿å’Œç¬¦å·çš„ \tn{CJKunderanyline} å’Œ
% \tn{CJKunderanysymbol}ã€‚
%
% \begin{function}[updated=2014-11-07]{\CJKunderanyline}
%   \begin{syntax}
%     \tn{CJKunderanyline} [*] [-] \oarg{é€‰é¡¹} \Arg{æ·±åº¦} \Arg{ä¸‹åˆ’å†…å®¹} \Arg{æ–‡æœ¬å†…å®¹}
%   \end{syntax}
%   \pkg{xeCJKfntef} å…ˆå°† \meta{ä¸‹åˆ’å†…å®¹} æ”¾è¿›ä¸€ä¸ªç›’å­ï¼ˆ\tn{xeCJKfntefbox}ï¼‰é‡Œï¼Œç„¶åŽ
%   å‘ä¸‹ç§»åŠ¨ \meta{æ·±åº¦} ç»™å®šçš„è·ç¦»ï¼Œå†ç”¨äºŽå¡«å……ã€‚å¯ç”¨çš„ \meta{é€‰é¡¹} æ˜¯ \texttt{textformat}ã€
%   \texttt{skip}ã€\texttt{hidden}ã€\texttt{subtract}ã€\texttt{sep} å’Œ
%   \texttt{boxdepth}ã€‚é€‰é¡¹ \texttt{sep} å’Œ \texttt{boxdepth} çš„åˆå§‹å€¼æ˜¯ç©ºï¼Œè¡¨ç¤º
%   ç¦ç”¨è¯¥é€‰é¡¹çš„åŠŸèƒ½ã€‚å¯ä»¥åœ¨ \tn{xeCJKsetup} ä¸­é€šè¿‡å¯¹è±¡ \texttt{ulem} æ¥è®¾ç½®ã€‚
% \end{function}
%
% ä¾‹å¦‚ï¼Œé«˜äº®æ•ˆæžœä¹Ÿå¯ä»¥å¦‚ä¸‹å®žçŽ°ï¼š\smallskip
%
% \begin{Example}[frame=single,numbers=left,gobble=4]
%   \CJKunderanyline*{0.5ex}{\color{yellow}\rule{2pt}{2.5ex}}{è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}
% \end{Example}
%
% \begin{function}[updated=2014-11-04]{\CJKunderanysymbol}
%   \begin{syntax}
%     \tn{CJKunderanysymbol} \oarg{é€‰é¡¹} \Arg{æ·±åº¦} \Arg{ç¬¦å·} \Arg{æ–‡æœ¬å†…å®¹}
%   \end{syntax}
%   \pkg{xeCJKfntef} å°† \meta{ç¬¦å·} æ”¾è¿›ä¸€ä¸ªç›’å­ï¼ˆ\tn{xeCJKfntefbox}ï¼‰é‡Œã€‚
%   \meta{æ·±åº¦} å‚æ•°ç”¨äºŽè®¾ç½®ç›’å­é¡¶éƒ¨çš„æ·±åº¦ï¼ˆåŸºçº¿åˆ°ç›’å­é¡¶éƒ¨çš„è·ç¦»ï¼‰ã€‚
%   å¯ç”¨çš„ \meta{é€‰é¡¹} æ˜¯ \texttt{textformat}ã€\texttt{sep} å’Œ \texttt{boxdepth}ï¼Œæ„ä¹‰ä¸Ž
%   \tn{CJKunderdot} çš„ç›¸åŒã€‚
% \end{function}
%
% ä¾‹å¦‚ï¼Œç»™æ±‰å­—åŠ&nbsp;ä¸‰è§’å½¢ï¼Œå¯ä»¥å¦‚ä¸‹è®¾ç½®ï¼š\smallskip
%
% \begin{Example}[frame=single,numbers=left,gobble=4]
%   \CJKunderanysymbol[sep=0.1em]{0.2em}{\tiny$\triangle$}
%     {çž»å½¼é˜•è€…ï¼Œè™šå®¤ç”Ÿç™½ï¼Œ\CJKunderline{å‰ç¥¥æ­¢æ­¢}}
% \end{Example}
%
% \begin{function}[updated=2014-11-07]{\xeCJKfntefon}
%   \begin{syntax}
%     \tn{xeCJKfntefon} [*] [-] \oarg{é€‰é¡¹}
%   \end{syntax}
%   åŠŸèƒ½ä¸Žç”¨æ³• \pkg{ulem} å®åŒ…çš„ \tn{ULon} ç›¸åŒï¼Œæ‰©å±•äº†å¯é€‰å‚æ•°ç¬¦å· |*| å’Œ |-|ï¼Œ
%   å¯ç”¨çš„ \meta{é€‰é¡¹} æ˜¯ \texttt{textformat}ã€ \texttt{skip}ã€\texttt{hidden} å’Œ
%   \texttt{subtract}ã€‚ è¿™å››ä¸ªé€‰é¡¹å¯¹ \pkg{ulem} å®åŒ…å®šä¹‰çš„ \tn{uline} ç­‰å‘½ä»¤ä¹Ÿæœ‰æ•ˆï¼Œéœ€è¦åœ¨
%   \tn{xeCJKsetup} ä¸­é€šè¿‡å¯¹è±¡ \texttt{ulem} æ¥è®¾ç½®ã€‚ä¾‹å¦‚\smallskip
%
%   \begin{Example}[frame=single,numbers=left,gobble=6]
%     \xeCJKsetup{ulem={textformat=\bfseries\color{red}, skip=true}}
%     \uline{è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢}
%   \end{Example}
% \end{function}
%
% \medskip
%
% æ­¤å¤–ï¼Œ\pkg{xeCJKfntef} è¿˜æä¾›äº†æŒ‡å®šå®½åº¦ï¼Œè®©æ±‰å­—åˆ†æ•£å¯¹é½çš„çš„çŽ¯å¢ƒ
% \env{CJKfilltwosides} å’Œ \env{CJKfilltwosides*}ã€‚
%
% \begin{function}[updated=2014-11-04]{CJKfilltwosides}
%   \begin{syntax}
%     \tn{begin}\{CJKfilltwosides\} \oarg{ä½ç½®} \Arg{å®½åº¦}
%       æ–‡æœ¬å†…å®¹\verb=\\=
%       æ–‡æœ¬å†…å®¹
%     \tn{end}\{CJKfilltwosides\}
%   \end{syntax}
%   çŽ¯å¢ƒä¸­çš„å†…å®¹è¢«æ”¾å…¥åž‚ç›´ç›’å­ä¸­ï¼Œå¯é€‰å‚æ•° \meta{ä½ç½®} æŒ‡å®šç›’å­çš„åŸºçº¿ä½ç½®ã€‚
%   å¯ä»¥ä½¿ç”¨ \texttt{t}ï¼ˆé¡¶éƒ¨ï¼‰ã€\texttt{c}ï¼ˆå±…ä¸­ï¼‰å’Œ \texttt{b}ï¼ˆåº•éƒ¨ï¼‰ï¼Œé»˜è®¤æ˜¯ \texttt{c}ã€‚
%   \meta{å®½åº¦} å‚æ•°æŒ‡å®šç›’å­çš„å®½åº¦ã€‚
%   \env{CJKfilltwosides*} çŽ¯å¢ƒä¸Ž \env{CJKfilltwosides} çš„åŒºåˆ«æ˜¯ï¼Œå½“ \meta{å®½åº¦}
%   ä¸å¤§äºŽé›¶æˆ–è€…ä¸å¤§äºŽç›’å­çš„è‡ªç„¶å®½åº¦æ—¶ï¼Œå°±å–ç›’å­çš„è‡ªç„¶å®½åº¦ã€‚ä¾‹å¦‚
% \end{function}
%
% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.5\linewidth,gobble=4]
%   \begin{CJKfilltwosides}{.8\linewidth}
%     çž»å½¼é˜•è€…ï¼Œ\\
%     è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢
%   \end{CJKfilltwosides}
% \end{SideBySideExample}
%
% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.5\linewidth,gobble=4]
%   \begin{CJKfilltwosides*}{0pt}
%     çž»å½¼é˜•è€…ï¼Œ\\
%     è™šå®¤ç”Ÿç™½ï¼Œå‰ç¥¥æ­¢æ­¢
%   \end{CJKfilltwosides*}
% \end{SideBySideExample}
%
% \subsection{å…¶ä»–}
% \label{subsec:others}
%
% \begin{function}[updated=2013-11-16]{\xeCJKVerbAddon,\xeCJKOffVerbAddon}
%   è°ƒæ•´æ–‡å­—é—´è·ä»¥ä¾¿äºŽè®© CJK å­—ç¬¦å&nbsp;çš„å®½åº¦ç­‰äºŽè¥¿æ–‡ç­‰å®½å­—ä½“ä¸­ä¸¤ä¸ªç©ºæ&nbsp;¼çš„å®½åº¦ã€‚å¦‚æžœè¿™ä¸¤
%   ä¸ªç©ºæ&nbsp;¼çš„å®½åº¦å°äºŽå½“å‰ CJK æ­£å¸¸æ–‡å­—çš„å®½åº¦ï¼Œå°†å¯¹ CJK å­—ä½“è¿›è¡Œé€‚å½“åœ°ç¼©å°ã€‚è¿™æœ‰åˆ©äºŽ
%   ç­‰å®½å­—ä½“çš„ä»£ç&nbsp;å¯¹é½ç­‰æƒ…å½¢ã€‚éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œ\tn{xeCJKVerbAddon} å¯¹ \pkg{xeCJK} çš„å†…
%   éƒ¨è¿›è¡Œäº†æ¯”è¾ƒå¤§çš„ä¿®æ”¹ï¼Œä½¿ç”¨å®ƒä¹‹åŽï¼Œå°†ç¦æ­¢åœ¨ CJK å­—ç¬¦ç±»ä¹‹é—´è‡ªåŠ¨æ¢è¡Œï¼Œè¿™ä¸Žè¥¿æ–‡åœ¨
%   æŠ„å½•çŽ¯å¢ƒä¸­çš„æƒ…å†µæ˜¯ä¸€è‡´çš„ã€‚æ‰€ä»¥ä¸åº”è¯¥å•ç‹¬ä½¿ç”¨ï¼Œåº”è¯¥æ”¾åœ¨åˆ†ç»„é‡Œé™åˆ¶å…¶ä½œç”¨åŸŸï¼Œå¦åˆ™
%   æ˜¯æ—&nbsp;æ•ˆçš„ã€‚å½“ç„¶å®ƒå¯ä»¥å’Œå…¶ä»–å…³äºŽä»£ç&nbsp;æŠ„å½•çš„å®åŒ…é…åˆä½¿ç”¨ã€‚ä¾‹å¦‚ï¼Œå¯ä»¥ä½¿ç”¨äºŽ
%   \package{fancyvrb} å®åŒ…çš„ \texttt{formatcom} é€‰é¡¹ã€‚æ­¤æ—¶è®¾ç½®çš„è¥¿æ–‡å­—ä½“åº”è¯¥ç¡®å®ž
%   æ˜¯ç­‰å®½çš„ä»¥ä¿è¯å¯¹é½ã€‚è‹¥è¥¿æ–‡ç­‰å®½å­—ä½“å‘ç”Ÿå˜åŠ¨ï¼ˆåŒ…æ‹¬å­—ä½“å¤§å°ï¼‰ï¼Œåˆ™éœ€è¦åœ¨å…¶åŽé¢ä½¿ç”¨
%   \tn{xeCJKVerbAddon}ï¼Œé‡æ–°è®¡ç®—é—´è·çš„å®½åº¦ã€‚\tn{xeCJKOffVerbAddon}
%   ç”¨äºŽåœ¨ä½¿ç”¨ \tn{xeCJKVerbAddon} çš„çŽ¯å¢ƒä¸­å±€éƒ¨å–æ¶ˆå®ƒçš„ä½œç”¨ã€‚ç”±äºŽ \package{listings}
%   å®åŒ…æœ‰è‡ªå·±çš„ä»£ç&nbsp;å¯¹é½æœºåˆ¶ï¼Œæ‰€ä»¥ \tn{xeCJKVerbAddon} åœ¨ç”± \pkg{listings} å®šä¹‰çš„
%   ä»£ç&nbsp;çŽ¯å¢ƒä¸­æ—&nbsp;æ•ˆã€‚
% \end{function}
%
% \begin{function}[added=2012-12-03]{\xeCJKnobreak}
%   \begin{syntax}
%     â€¦â€¦æ±‰å­—ã€‚\tn{xeCJKnobreak}\tn{footnote}\{è„šæ³¨\}
%   \end{syntax}
%   \tn{xeCJKnobreak} ç”¨åœ¨å…¨è§’æ&nbsp;‡ç‚¹ç¬¦å·åŽé¢ï¼Œç›®çš„æ˜¯ç¡®ä¿ä¸èƒ½åœ¨æ­¤å¤„æ–­è¡Œã€‚å¦‚æžœå·²ç»å¯ç”¨äº†
%   å‰é¢ä»‹ç»çš„ |CheckFullRight| é€‰é¡¹ï¼Œåˆ™ä¸éœ€è¦å†ç”¨æ­¤å‘½ä»¤ã€‚
% \end{function}
%
% \begin{function}[added=2013-11-09]{\xeCJKShipoutHook}
%   \pkg{xeCJK} åœ¨æ­£æ–‡ä¸­çš„ä¸€äº›ç‰¹æ®Šè®¾ç½®ï¼ˆæ±‰å­—ä¸‹åŠ&nbsp;ç‚¹ã€åœ¨ \env{verbatim} æˆ–
%   \env{lstlisting} çŽ¯å¢ƒä¸­åˆ†é¡µï¼‰å¯èƒ½ä¼šå½±å“åˆ° \TeX çš„è¾“å‡ºä¾‹è¡Œç¨‹åºï¼ˆoutput routineï¼‰
%   ä¸­çš„å†…å®¹ï¼ˆæ¯”å¦‚é¡µçœ‰å’Œé¡µè„šï¼‰ã€‚\tn{xeCJKShipoutHook} ç”¨äºŽæ¢å¤æ­£æ–‡ä¸­çš„æ™®é€šè®¾ç½®ã€‚
%   \pkg{xeCJK} å·²ç»å¤„ç†äº†é¡µçœ‰å’Œé¡µè„šçš„æƒ…å†µï¼Œå…¶ä»–çš„å°±éœ€è¦æ&nbsp;¹æ®æƒ…å†µè‡ªè¡Œè°ƒç”¨ã€‚
%   æ¯”å¦‚è‹¥ä½¿ç”¨ \pkg{eso-pic} æˆ–è€… \pkg{atbegshi} å®žçŽ°æ–‡å­—æ°´å°ï¼Œå¹¶ä¸”æ­£æ–‡ä¸­ä½¿ç”¨äº†
%   ä»¥ä¸Šæ‰€åˆ—çš„ç‰¹æ®Šå½¢å¼ï¼Œå°±éœ€è¦åœ¨å‘½ä»¤ \tn{AtBeginShipout} çš„å‚æ•°çš„æœ€å‰é¢ä½¿ç”¨
%   \tn{xeCJKShipoutHook}ã€‚
% \end{function}
%
% \section{å·²çŸ¥é—®é¢˜å’Œå…¼å®¹æ€§}
%
% æ&nbsp;¹æ® \pkg{unicode-data} å®åŒ…ï¼Œ\XeTeX å°†æ‰€æœ‰ CJK è¡¨æ„æ–‡å­—çš„ \tn{catcode}
% è®¾ç½®ä¸º $11$ã€‚å›&nbsp;æ­¤æ±‰å­—å¯ä»¥ç›´æŽ¥ç”¨ä½œæŽ§åˆ¶åºåˆ—çš„åå­—ï¼Œä½†æ˜¯å½“æ±‰å­—å‡ºçŽ°åœ¨æŽ§åˆ¶åºåˆ—åŽé¢çš„
% æ—¶å€™ï¼Œè¦ç”¨ç©ºæ&nbsp;¼åˆ†éš”å¼€ï¼Œå¦åˆ™å°±ä¼šå‡ºçŽ°â€œ\texttt{! Undefined control sequence.}â€çš„é”™è¯¯ã€‚
%
% \pkg{xeCJK} ä½¿ç”¨å¹¶é‡æ–°å®šä¹‰äº† \pkg{CJK} å®åŒ…çš„éƒ¨åˆ†å®å‘½ä»¤ï¼Œå¦‚ \tn{CJKfamily}ã€
% \tn{CJKsymbol} å’Œ \tn{CJKglue} ç­‰ã€‚éœ€è¦æŒ‡å‡ºï¼Œ\pkg{xeCJK} ä¸éœ€è¦ \pkg{CJK}
% çš„æ”¯æŒï¼Œå¹¶ä¸” \pkg{xeCJK} è‡ªåŠ¨ç¦æ­¢åœ¨å®ƒä¹‹åŽè½½å…¥ \pkg{CJK} å®åŒ…ã€‚
% å¯ä»¥åœ¨ \pkg{xeCJK} ä¹‹\emph{åŽ}è½½å…¥ \pkg{CJKnumb} å®åŒ…ï¼Œå®žçŽ°æ•°å­—çš„ä¸­æ–‡åŒ–ï¼Œ
% ä¹Ÿå¯ä»¥ç”¨åŠŸèƒ½æ›´å®Œå–„çš„ \package{zhnumber} å®åŒ…ã€‚
%
% \pkg{xeCJK} è¿›è¡Œäº†ä¸€äº›å¤„ç†ï¼Œä½¿å¾—åœ¨ä½¿ç”¨ \XeTeX æ—¶ \package{listings} å®åŒ…å¯ä»¥
% æ”¯æŒ Unicodeï¼Œå›&nbsp;æ­¤åœ¨ \texttt{listings} å®šä¹‰çš„ä»£ç&nbsp;çŽ¯å¢ƒä¸­å¯ä»¥ç›´æŽ¥ä½¿ç”¨ä¸­æ–‡ï¼Œä¸å†
% éœ€è¦é€šè¿‡ \texttt{escapechar}ã€‚
%
% æ–°ç‰ˆæœ¬ï¼ˆ\texttt{3.x}ï¼‰çš„ \pkg{xeCJK} å®Œå…¨ä½¿ç”¨ \LaTeXiii{} çš„è¯­æ³•æ¥ç¼–å†™ã€‚
% \LaTeXiii{} æ”¾å¼ƒäº† \tn{outer} å®çš„æ¦‚å¿µï¼Œå›&nbsp;æ­¤ç›¸å…³å·¥å…·åœ¨
% é‡åˆ° \tn{outer} å®æ—¶å¯èƒ½ä¼šå­˜åœ¨é—®é¢˜ã€‚æŒ‰ç…§ç›®å‰ \pkg{xeCJK} çš„å®žçŽ°æ–¹å¼ï¼Œåœ¨ CJK æ–‡å­—
% åŽé¢é‡åˆ° \tn{outer} å®æ—¶ä¼šå‡ºçŽ°ç±»ä¼¼
% \begin{frameverb}
%   ! Forbidden control sequence found while scanning use of \use_i:nn
% \end{frameverb}
% çš„é”™è¯¯ã€‚ç›®å‰å·²çŸ¥çš„æœ‰ \package{cprotect} å®åŒ…æä¾›çš„ \tn{cprotect}ã€‚å®ƒçš„å®šä¹‰æ˜¯
% \begin{frameverb}
%   \outer\long\def\cprotect{\icprotect}
% \end{frameverb}
% å›&nbsp;æ­¤ï¼Œè¿™æ—¶å¯ä»¥æš‚æ—¶ç”¨ \tn{icprotect} ä»£æ›¿ \tn{cprotect}ã€‚äº‹å®žä¸Šï¼Œå½“ \pkg{cprotect}
% è¢«å¼•å…¥æ—¶ï¼Œ\pkg{xeCJK} å°†ä½¿ç”¨
% \begin{frameverb}
%   \let\cprotect\icprotect
% \end{frameverb}
% æ¥å–æ¶ˆ \tn{cprotect} çš„å¤–éƒ¨å®é™åˆ¶ã€‚ä½†ç”±äºŽ \tn{cprotect} çš„ç‰¹æ®Šæ€§ï¼Œåº”è¯¥åªåœ¨å¤–éƒ¨
% ä½¿ç”¨å®ƒï¼Œå³ä¸è¦è®©å®ƒå‡ºçŽ°åœ¨ä»»ä½•å®çš„å‚æ•°ä¸­ã€‚å…¶ä»– \tn{outer} å®çš„æƒ…å†µï¼Œå¯ä»¥åœ¨å®ƒå‰é¢
% åŠ&nbsp;ä¸Š \tn{relax} æ¥å›žé¿ä¸Šé¢çš„é”™è¯¯ã€‚
%
% \pkg{xeCJK} ä¾èµ– \XeTeX çš„ \tn{XeTeXinterchartoks} æœºåˆ¶ï¼Œä¸Žä½¿ç”¨ç›¸åŒæœºåˆ¶çš„å®åŒ…ï¼ˆä¾‹å¦‚
% \pkg{polyglossia} å’Œ \pkg{xesearch}ï¼‰å¯èƒ½ä¼šå­˜åœ¨å¤§å°ä¸ä¸€çš„å†²çªã€‚
% \pkg{xeCJK} è™½ç„¶ä¸ºæ­¤ä½œäº†ä¸€äº›å¤„ç†ï¼Œä½†ä¸Žå®ƒä»¬å…±åŒä½¿ç”¨æ—¶åº”è¯¥å°å¿ƒã€‚
%
%\end{documentation}
%
%
% \StopEventually{}
%
%
%\begin{implementation}
%
% \section{\pkg{xeCJK} ä»£ç&nbsp;å®žçŽ°}
%
%    \begin{macrocode}
%&lt;*package&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;@@=xeCJK&gt;
%    \end{macrocode}
%
% \subsection{è¿è¡ŒçŽ¯å¢ƒæ£€æŸ¥}
%
% \pkg{xeCJK} å¿…é¡»ä½¿ç”¨ \XeTeX å¼•æ“Žçš„æ”¯æŒã€‚
%    \begin{macrocode}
\msg_new:nnn { xeCJK } { Require-XeTeX }
  {
    The~xeCJK~package~requires~XeTeX~to~function.\\\\
    You~must~change~your~typesetting~engine~to~"xelatex" \\
    instead~of~plain~"latex"~or~"pdflatex"~or~"lualatex".\\
    Loading~xeCJK~will~abort!
  }
\sys_if_engine_xetex:F { \msg_critical:nn { xeCJK } { Require-XeTeX } }
%    \end{macrocode}
%
% åº”è¯¥ä½¿ç”¨è¾ƒæ–°ç‰ˆæœ¬çš„ \pkg{expl3} å®åŒ…ã€‚
%    \begin{macrocode}
\msg_new:nnn { xeCJK } { 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.\\
    \str_if_eq:nnT {#1} { expl3 } { Loading~xeCJK~will~abort! }
  }
\@ifpackagelater { expl3 } { 2020/02/08 } { }
  { \msg_critical:nnn { xeCJK } { l3-too-old } { expl3 } }
%    \end{macrocode}
%
% \cs{ctex_disable_package:n} ç”± \pkg{ctexhook} æä¾›ã€‚
%    \begin{macrocode}
\RequirePackage { ctexhook }
%    \end{macrocode}
%
% \begin{macro}[pTF,int]{\xeCJK_if_package_loaded:n}
% åˆ¤æ–­å®åŒ…æ˜¯å¦è¢«å¼•å…¥ï¼Œå¯ç”¨äºŽæ–‡æ¡£æ­£æ–‡ä¸­ã€‚
%    \begin{macrocode}
\prg_new_conditional:Npnn \xeCJK_if_package_loaded:n #1 { p , T , F , TF }
  {
    \tl_if_exist:cTF { ver@ #1 . \c_@@_package_ext_tl }
      { \prg_return_true: } { \prg_return_false: }
  }
\tl_const:Nx \c_@@_package_ext_tl { \@pkgextension }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.8.7}{2021/06/09}{åº”ç”¨ \tn{disable@package@load} å’Œ
%   \tn{declare@file@substitution}ã€‚}
%
% ä¸‹é¢è¿™äº› \pkg{CJK} ç³»åˆ—å®åŒ…ä¸åº”è¯¥è¢«ä½¿ç”¨ã€‚
%    \begin{macrocode}
\msg_new:nnn { xeCJK } { after-package }
  {
    The~`#1'~package~and~xeCJK~are~incompatible.\\\\
    Please~load~it~after~xeCJK.
  }
\clist_map_inline:nn { CJKnumb }
  {
    \xeCJK_if_package_loaded:nT {#1}
      { \msg_error:nnn { xeCJK } { after-package } {#1} }
  }
\clist_map_inline:nn
  { CJKulem , CJKvert , CJKpunct , CJKutf8 , CJK }
  { \ctex_disable_package:n {#1} }
%    \end{macrocode}
%
% \changes{v3.8.7}{2021/06/09}{å°† \pkg{CJKfntef} åŒ…æ›¿æ¢ä¸º \pkg{xeCJKfntef} åŒ…ã€‚}
%
% å°† \pkg{CJKfntef} åŒ…æ›¿æ¢ä¸º \pkg{xeCJKfntef} åŒ…ã€‚
%    \begin{macrocode}
\ctex_if_format_at_least:nTF { 2020/10/01 }
  { \ctex_replace_package:nn { CJKfntef } { xeCJKfntef } }
  { \ctex_disable_package:n { CJKfntef } }
%    \end{macrocode}
%
% \changes{v3.9.0}{2022/07/08}{ä¸ç›´æŽ¥ä¾èµ– \pkg{xparse} å’Œ \pkg{l3keys2e}ã€‚}
%
%    \begin{macrocode}
\cs_if_exist:NF \NewDocumentCommand
  { \RequirePackage { xparse } }
\RequirePackage { xtemplate }
%    \end{macrocode}
%
% \subsection{å†…éƒ¨å·¥å…·}
%
% åˆ†é…ä¸´æ—¶å˜é‡ã€‚
%    \begin{macrocode}
\tl_new:N \l_@@_tmp_tl
\int_new:N \l_@@_tmp_int
\box_new:N \l_@@_tmp_box
\dim_new:N \l_@@_tmp_dim
\bool_new:N \l_@@_tmp_bool
\skip_new:N \l_@@_tmp_skip
\clist_new:N \l_@@_tmp_clist
%    \end{macrocode}
%
% \begin{macro}
%  {\@@_msg_new:nn ,\@@_error:n,\@@_error:nx,\@@_warning:nx,\@@_info:nxx}
% å„ç§ä¿¡æ¯å‡½æ•°çš„ç¼©ç•¥å½¢å¼ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_msg_new:nn   { \msg_new:nnn       { xeCJK } }
\cs_new_protected:Npn \@@_msg_new:nnn  { \msg_new:nnnn      { xeCJK } }
\cs_new_protected:Npn \@@_error:n      { \msg_error:nn      { xeCJK } }
\cs_new_protected:Npn \@@_error:nx     { \msg_error:nnx     { xeCJK } }
\cs_new_protected:Npn \@@_warning:n    { \msg_warning:nn    { xeCJK } }
\cs_new_protected:Npn \@@_warning:nx   { \msg_warning:nnx   { xeCJK } }
\cs_new_protected:Npn \@@_warning:nxx  { \msg_warning:nnxx  { xeCJK } }
\cs_new_protected:Npn \@@_warning:nxxx { \msg_warning:nnxxx { xeCJK } }
\cs_new_protected:Npn \@@_info:nxx     { \msg_info:nnxx     { xeCJK } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_allow_break:,\xeCJK_no_break:}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_allow_break:
  { \tex_penalty:D \c_zero_int }
\cs_new_protected:Npn \xeCJK_no_break:
  { \tex_penalty:D \c_@@_nobreak_penalty_int }
\int_const:Nn \c_@@_nobreak_penalty_int { 10 000 }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.8.3}{2020/04/07}{ä¾èµ– \pkg{ctexhook} å®åŒ…ã€‚}
%
% \begin{macro}
%  {\@@_at_end_preamble:n,\@@_after_preamble:n,
%   \@@_after_end_preamble:n,\@@_package_hook:nn}
%  åœ¨ \tn{document} å‰åŽå’Œå®åŒ…åŽåŠ&nbsp;ä¸Šå„ç§é’©å­ï¼Œä¾èµ– \pkg{ctexhook}ã€‚
%    \begin{macrocode}
\AtBeginDocument           { \xeCJK@document@hook }
\ctex_at_end_preamble:n    { \xeCJK@document@left@hook }
\ctex_after_end_preamble:n { \xeCJK@document@right@hook }
\cs_new_protected:Npn \xeCJK@document@hook
  { \tl_use:N \g_@@_after_preamble_hook_tl }
\cs_new_protected:Npn \xeCJK@document@left@hook
  { \tl_use:N \g_@@_at_end_preamble_hook_tl }
\cs_new_protected:Npn \xeCJK@document@right@hook
  { \tl_use:N \g_@@_after_end_preamble_hook_tl }
\cs_new_protected:Npn \@@_at_end_preamble:n
  { \tl_gput_right:Nn \g_@@_at_end_preamble_hook_tl }
\cs_new_protected:Npn \@@_after_preamble:n
  { \tl_gput_right:Nn \g_@@_after_preamble_hook_tl }
\cs_new_protected:Npn \@@_after_end_preamble:n
  { \tl_gput_right:Nn \g_@@_after_end_preamble_hook_tl }
\cs_new_protected:Npn \@@_package_hook:nn
  { \ctex_at_end_package:nn }
\tl_new:N \g_@@_at_end_preamble_hook_tl
\tl_new:N \g_@@_after_preamble_hook_tl
\tl_new:N \g_@@_after_end_preamble_hook_tl
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.7}{2013/11/09}{ä½¿ç”¨ \pkg{everypage} å¾€ \tn{shipout} ç›’å­é‡ŒåŠ&nbsp;é’©å­ã€‚}
% \changes{v3.2.16}{2014/12/16}{ä¸å†ä¾èµ– \pkg{everypage} å®åŒ…ã€‚}
%
% \begin{macro}{\xeCJKShipoutHook}
% åœ¨ \tn{shipout} ç›’å­é‡ŒåŠ&nbsp;é’©å­ï¼Œå¯ä»¥å½±å“åˆ°é¡µçœ‰é¡µè„šã€‚\tn{AtBeginDvi} å°†å‚æ•°ä¿å­˜åœ¨
% ç›’å­ä¸­ï¼Œè€Œ \pkg{atbegshi} çš„ \tn{AtBeginShipout} åœ¨ \tn{shipout} ç›’å­æž„å»ºå¥½ä¹‹åŽ
% æ‰èµ·ä½œç”¨ï¼Œæ‰€ä»¥å®ƒä»¬éƒ½å½±å“ä¸åˆ°é¡µçœ‰é¡µè„šã€‚æˆ‘ä»¬é€šè¿‡å¾€ \tn{@begindvi} é‡ŒåŠ&nbsp;å…¥é’©å­æ¥å®Œæˆã€‚
% æ³¨æ„ï¼Œç¬¬ä¸€æ¬¡ä½¿ç”¨ \tn{@begindvi} ä¹‹åŽï¼Œå®ƒä¼šå°†è‡ªèº«å®šä¹‰ä¸º \tn{@empty}ã€‚
%    \begin{macrocode}
\@@_after_preamble:n
  { \tl_put_right:Nn \@begindvi { \xeCJK@first@begindvi } }
\cs_new_protected:Npn \xeCJK@first@begindvi
  {
    \xeCJKShipoutHook
    \cs_if_exist:NTF \@begindvi
      { \tl_gput_right:Nn }
      { \tl_const:Nn }
    \@begindvi { \xeCJKShipoutHook }
  }
\NewDocumentCommand \xeCJKShipoutHook { }
  {
    \bool_if:NF \l_@@_shipout_hook_bool
      {
        \bool_set_true:N \l_@@_shipout_hook_bool
        \tl_use:N \l_@@_shipout_hook_tl
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_add_to_shipout:n}
% \changes{v3.2.11}{2014/03/14}{ä¸å†ä½¿ç”¨å†…éƒ¨åå­—ã€‚}
% å¾€ \tn{shipout} ç›’å­ä¸­åŠ&nbsp;å…¥é’©å­ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_add_to_shipout:n
  { \tl_put_right:Nn \l_@@_shipout_hook_tl }
\tl_new:N \l_@@_shipout_hook_tl
\bool_new:N \l_@@_shipout_hook_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_tl_remove_outer_braces:n}
% \changes{v3.2.4}{2013/07/02}{åŽ»æŽ‰å¤–å±‚åˆ†ç»„æ‹¬å·æ—¶ï¼Œç§»é™¤ç©ºæ&nbsp;¼ï¼Œé¿å…æ­»å¾ªçŽ¯ã€‚}
% åŽ»æŽ‰ |#1| å¤–å±‚çš„åˆ†ç»„æ‹¬å·ã€‚
%    \begin{macrocode}
\cs_new:Npn \xeCJK_tl_remove_outer_braces:n #1
  {
    \exp_last_unbraced:Ne
    \@@_tl_remove_outer_braces:w { \tl_trim_spaces:n {#1} } \s_stop
  }
\cs_new:Npn \@@_tl_remove_outer_braces:w #1 \s_stop
  {
    \tl_if_single:nTF {#1}
      {
        \tl_if_head_is_N_type:nTF {#1}
          { \tl_trim_spaces:n }
          { \xeCJK_tl_remove_outer_braces:n }
      }
      { \tl_trim_spaces:n }
      {#1}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_cs_clear:N,\xeCJK_cs_gclear:N}
% è®©æŽ§åˆ¶åºåˆ—çš„æ„ä¹‰ä¸ºç©ºã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_cs_clear:N #1
  { \cs_set_eq:NN #1 \prg_do_nothing: }
\cs_new_protected:Npn \xeCJK_cs_gclear:N #1
  { \cs_gset_eq:NN #1 \prg_do_nothing: }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_swap_cs:NN}
% äº¤æ¢ |#1| å’Œ |#2| çš„æ„ä¹‰ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_swap_cs:NN #1#2
  {
    \cs_set_eq:NN \@@_swap_cs_aux:w #1
    \cs_set_eq:NN #1 #2
    \cs_set_eq:NN #2 \@@_swap_cs_aux:w
    \cs_undefine:N \@@_swap_cs_aux:w
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_font_gset_to_current:N}
% \changes{v3.8.4}{2020/06/04}{ä¸ç¼“å­˜ \tn{nullfont}ã€‚}
% |#1| æ˜¯æŽ§åˆ¶åºåˆ—çš„åå­—ï¼Œä»¤å®ƒç­‰äºŽå½“å‰å­—ä½“å‘½ä»¤ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_font_gset_to_current:N
  { \exp_after:wN \@@_font_gset_to_current_aux:NN \tex_the:D \tex_font:D }
\cs_new_protected:Npn \@@_font_gset_to_current_aux:NN #1#2
  { \cs_if_eq:NNF #1 \tex_nullfont:D { \cs_gset_eq:NN #2#1 } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int,pTF]{\xeCJK_glyph_if_exist:N}
% \changes{v3.1.0}{2012/11/19}{æ”¹è¿› \pkg{fontspec} å®åŒ…ä¸­å®šä¹‰çš„
% \cs{font_glyph_if_exist:NnTF}ã€‚}
% åˆ¤æ–­å½“å‰å­—ä½“ä¸­æ˜¯å¦å«æœ‰å­—ç¬¦ |#1|ã€‚\pkg{fontspec} ä¸­çš„ç±»ä¼¼å‡½æ•°åœ¨åˆ¤æ–­ä¸ºçœŸçš„æ—¶å€™ï¼Œ
% ä¼šç•™æœ‰ä¸€ä¸ª \cs{scan_stop:}ï¼Œé€&nbsp;æˆä¸å¿…è¦çš„è¾¹ç•Œï¼ŒåŒæ—¶ä¹Ÿä¸å®Œå…¨å¯å±•ã€‚å›&nbsp;æ­¤ï¼Œæˆ‘ä»¬é‡æ–°
% å®šä¹‰å®ƒã€‚
%    \begin{macrocode}
\prg_new_conditional:Npnn \xeCJK_glyph_if_exist:N #1 { p , T , F , TF }
  {
    \tex_iffontchar:D \tex_font:D `#1 \exp_stop_f:
      \prg_return_true: \else: \prg_return_false: \fi:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}[int]{\c_xeCJK_space_skip_tl}
% \changes{v3.1.0}{2012/11/18}{å­—é—´ç©ºæ&nbsp;¼è€ƒè™‘ \tn{spaceskip} ä¸ä¸ºé›¶çš„æƒ…å†µã€‚}
% \changes{v3.2.0}{2013/05/22}{å­—é—´ç©ºæ&nbsp;¼è€ƒè™‘åˆ° \tn{spacefactor} å’Œ \tn{xspaceskip} çš„æƒ…å†µã€‚}
% å½“å‰å­—ä½“çŠ¶æ€ä¸‹ï¼Œä¸€ä¸ªå­—é—´ç©ºæ&nbsp;¼äº§ç”Ÿçš„ |glue| çš„é•¿åº¦ï¼ŒåŒ…æ‹¬ä¼¸å±•å’Œæ”¶ç¼©éƒ¨åˆ†ã€‚
%    \begin{macrocode}
\tl_const:Nn \c_xeCJK_space_skip_tl
  {
    \int_compare:nNnTF \g_@@_space_factor_int = { 1000 }
      {
        \skip_if_eq:nnTF \tex_spaceskip:D \c_zero_skip
          {
                    \tex_fontdimen:D 2 ~ \tex_font:D
              plus  \tex_fontdimen:D 3 ~ \tex_font:D
              minus \tex_fontdimen:D 4 ~ \tex_font:D
          }
          { \tex_spaceskip:D }
      }
      {
        \skip_if_eq:nnTF \tex_spaceskip:D \c_zero_skip
          {
            \int_compare:nNnTF \g_@@_space_factor_int &lt; { 2000 }
              {
                \@@_space_skip_scale:nnn
                  { \tex_fontdimen:D 2 ~ \tex_font:D }
              }
              {
                \skip_if_eq:nnTF \tex_xspaceskip:D \c_zero_skip
                  {
                    \@@_space_skip_scale:nnn
                      {
                        \tex_fontdimen:D 2 ~ \tex_font:D +
                        \tex_fontdimen:D 7 ~ \tex_font:D
                      }
                  }
                  { \tex_xspaceskip:D  \use_none:nn }
              }
              { \tex_fontdimen:D 3 ~ \tex_font:D }
              { \tex_fontdimen:D 4 ~ \tex_font:D }
          }
          {
            \int_compare:nNnTF \g_@@_space_factor_int &lt; { 2000 }
              { \@@_space_skip_scale:nnn { \tex_spaceskip:D } }
              {
                \skip_if_eq:nnTF \tex_xspaceskip:D \c_zero_skip
                  {
                    \@@_space_skip_scale:nnn
                      {
                        \tex_spaceskip:D +
                        \tex_fontdimen:D 7 ~ \tex_font:D
                      }
                  }
                  { \tex_xspaceskip:D \use_none:nn }
              }
              { \tex_gluestretch:D \tex_spaceskip:D }
              { \tex_glueshrink:D  \tex_spaceskip:D }
          }
      }
  }
\cs_new:Npn \@@_space_skip_scale:nnn #1#2#3
  {
    \dim_eval:n {#1}
    plus \fp_eval:n { \g_@@_space_factor_int / 1000 } #2
    minus
      \int_div_truncate:nn
        { 1000 * \int_value:w #3 } { \g_@@_space_factor_int } sp
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}[int]{\xeCJK_reset_space_factor:}
% \begin{variable}[int]{\g_@@_space_factor_int}
% åœ¨ \tn{XeTeXinterchartoks} é‡Œï¼Œ\tn{spacefactor} å·²ç»è¢«é‡ç½®ä¸º $1000$ã€‚
% æˆ‘ä»¬éœ€è¦åœ¨ Default ç±»é‡Œä¿å­˜ \tn{spacefactor} ç”¨äºŽè®¡ç®—ç©ºæ&nbsp;¼å®½åº¦ã€‚
%    \begin{macrocode}
\int_new:N \g_@@_space_factor_int
\cs_new_protected:Npn \xeCJK_reset_space_factor:
  { \int_gset:Nn \g_@@_space_factor_int { 1000 } }
\xeCJK_reset_space_factor:
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_glue_to_skip:nN}
% å–å¾—ä¸€ä¸ª |glue| çš„é•¿åº¦ï¼ŒåŒ…æ‹¬ä¼¸å±•å’Œæ”¶ç¼©éƒ¨åˆ†ã€‚å¦‚æžœå‚æ•°ä¸æ˜¯ |glue|ï¼Œåˆ™å–å…¶å®½åº¦ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_glue_to_skip:nN #1#2
  {
    \group_begin:
      \hbox_set:Nw \l_@@_tmp_box #1 \scan_stop:
      \@@_if_last_glue:TF
        {
          \exp_args:NNNo \hbox_set_end:
          \skip_set:Nn #2 { \skip_use:N \tex_lastskip:D }
        }
        {
          \exp_args:NNNo \hbox_set_end:
          \skip_set:Nn #2 { \dim_use:N \box_wd:N \l_@@_tmp_box }
        }
    \exp_args:NNNo \group_end:
    \skip_set:Nn #2 { \skip_use:N #2 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_int_until_do:nn}
% \begin{macro}{\@@_int_until_do:wn}
% ç”±äºŽå®šä¹‰è¾ƒä¸ºç®€å•ï¼Œå¯ä»¥æ¯” \cs{int_until_do:nNnn} ç¨å¾®å¿«ä¸€ç‚¹ç‚¹ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_int_until_do:nn #1#2
  {
    \@@_int_until_do:wn \use_none:n
      { \reverse_if:N \if_int_compare:w #1#2 }
  }
\cs_new_protected:Npn \@@_int_until_do:wn \use_none:n #1
  { #1 \exp_after:wN \@@_int_until_do:wn \fi: \use_none:n {#1} }
\int_new:N \l_@@_begin_int
\int_new:N \l_@@_end_int
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_peek_catcode_ignore_spaces:NTF}
% \changes{v3.1.1}{2012/12/04}{æ–°å¢žæœ‰çœç•¥ç©ºæ&nbsp;¼æ&nbsp;‡è¯†çš„ \texttt{peek} å‡½æ•°ã€‚}
% æˆ‘ä»¬åœ¨é‡Œé¢è®¾ç½®äº†ä¸€ä¸ªå˜é‡ \cs{l_@@_peek_ignore_spaces_bool} ç”¨äºŽæ&nbsp;‡è¯†åŽé¢çš„ç©ºæ&nbsp;¼
% æ˜¯å¦è¢«çœç•¥æŽ‰äº†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_peek_catcode_ignore_spaces:NTF #1#2#3
  {
    \cs_set_eq:NN \l_@@_peek_search_token #1 \scan_stop:
    \cs_set_protected:Npx \@@_peek_catcode_true:w
      { \exp_not:N \group_align_safe_end: \exp_not:n {#2} }
    \cs_set_protected:Npx \@@_peek_catcode_false:w
      { \exp_not:N \group_align_safe_end: \exp_not:n {#3} }
    \bool_set_false:N \l_@@_peek_ignore_spaces_bool
    \group_align_safe_begin:
    \peek_after:Nw \@@_peek_catcode_ignore_spaces_branches:w
  }
\cs_new_protected:Npn \@@_peek_catcode_ignore_spaces_branches:w
  {
    \if_meaning:w \l_peek_token \c_space_token
      \bool_set_true:N \l_@@_peek_ignore_spaces_bool
      \exp_after:wN \peek_after:Nw
      \exp_after:wN \@@_peek_catcode_ignore_spaces_branches:w
      \tex_romannumeral:D 0
    \else:
      \if_catcode:w
        \exp_not:N \l_peek_token \exp_not:N \l_@@_peek_search_token
        \exp_after:wN \exp_after:wN
        \exp_after:wN \@@_peek_catcode_true:w
      \else:
        \exp_after:wN \exp_after:wN
        \exp_after:wN \@@_peek_catcode_false:w
      \fi:
    \fi:
  }
\cs_new_eq:NN \l_@@_peek_search_token ?
\cs_new_eq:NN \@@_peek_catcode_true:w  \prg_do_nothing:
\cs_new_eq:NN \@@_peek_catcode_false:w \prg_do_nothing:
\bool_new:N \l_@@_peek_ignore_spaces_bool
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.8.0}{2020/02/10}{åº”ç”¨ \cs{peek_remove_spaces:n}ã€‚}
%
% \begin{macro}[int]{\xeCJK_token_value_class:N}
% ç”¨äºŽå–å¾—è®°å· |#1| æ‰€åœ¨çš„ \XeTeX å­—ç¬¦ç±»ã€‚|#1| åº”ä¸º \tn{catcode} ä¸º |11| æˆ– |12|
% çš„æ˜¾æ€§æˆ–éšæ€§è®°å·ã€‚
%    \begin{macrocode}
\cs_new:Npn \xeCJK_token_value_class:N #1
  { \tex_XeTeXcharclass:D \xeCJK_token_value_charcode:N #1 }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_token_value_charcode:N}
% \changes{v3.2.4}{2013/06/30}{è€ƒè™‘ \texttt{charcode} è¶…å‡º BMP çš„æƒ…å†µã€‚}
% \changes{v3.3.1}{2015/05/08}{\texttt{0.99992} ç‰ˆä¿®å¤äº† \tn{meaning} çš„ Bugã€‚}
% å½“è®°å· |#1| çš„ \texttt{charcode} å¤§äºŽç­‰äºŽ \texttt{0x10000} æ—¶ï¼Œ\XeTeX\
% \texttt{0.9999.0} ç‰ˆä»¥å‰çš„ \tn{meaning} çš„è¿”å›žç»“æžœæ¯”è¾ƒç‰¹æ®Š\footnote{å‚è§
% \url{http://tug.org/pipermail/xetex/2013-January/023967.html} å’Œ
% \url{http://tex.stackexchange.com/a/64848}ã€‚}ï¼Œéœ€è¦ç‰¹åˆ«å¤„ç†ã€‚
% \texttt{0.9999.0} ç‰ˆä»¥åŽçš„ \XeTeX çš„ \tn{meaning}
% å¯¹äºŽè¶…å‡º BMP çš„å­—ç¬¦ï¼Œä¼šè¿”å›žä¸¤ä¸ªå­—ç¬¦ï¼Œåˆ†åˆ«å¯¹åº”äºŽå…¶ UTF-16 ç¼–ç&nbsp;çš„é¦–å°¾ä»£ç†^^A
% \footnote{å‚è§ \url{http://tug.org/pipermail/xetex/2013-June/024543.html}ã€‚}ã€‚
% è¿™ä¸€ Bug åœ¨ TeX Live 2015 çš„ \texttt{0.99992} ç‰ˆä¸­å¾—åˆ°ä¿®å¤^^A
% \footnote{å‚è§\url{http://tug.org/pipermail/xetex/2015-May/025941.html}}ã€‚
%    \begin{macrocode}
\cs_new:Npn \xeCJK_token_value_charcode:N #1
  { \exp_after:wN \@@_get_charcode:w \token_to_meaning:N #1 \q_stop }
\group_begin:
  \cs_set:Npn \@@_tmp:w #1 ~ #2 ~ #3#4#5 \q_stop
    {
      \tl_if_empty:nTF { #4#5 }
        {
          \cs_new:Npn \@@_get_charcode:w ##1 ~ ##2 ~ ##3 \q_stop
            { \int_eval:n { `##3 } }
        }
        {
          \tl_if_empty:nTF {#5}
            {
              \cs_new:Npn \@@_get_charcode:w ##1 ~ ##2 ~ ##3##4 \q_stop
                {
                  \int_eval:n
                    {
                      \tl_if_empty:nTF { ##4 }
                        { `##3 }
                        { ( `##3 - "D800 ) * "400 + ( `##4 - "DC00 ) + "10000 }
                    }
                }
            }
            {
              \cs_new:Npn \@@_get_charcode:w ##1 ~ ##2 ~ ##3##4 \q_stop
                { \int_eval:n { \tl_if_empty:nTF { ##4 } { `##3 } { "20000 } } }
            }
        }
    }
  \exp_after:wN \@@_tmp:w \token_to_meaning:N ^^^^^20000 { } \q_stop
\group_end:
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[pTF,int]{\xeCJK_if_CJK_class:N}
% åˆ¤æ–­å­—ç¬¦ |#1| æ˜¯å¦ä¸º CJK å­—ç¬¦ç±»ï¼ŒåŒ…æ‹¬æ–‡å­—å’Œæ&nbsp;‡ç‚¹ç¬¦å·ã€‚
%    \begin{macrocode}
\prg_new_conditional:Npnn \xeCJK_if_CJK_class:N #1 { p , T , F , TF }
  {
    \if_cs_exist:w
      \@@_CJK_class_tl:n { \xeCJK_token_value_class:N #1 }
    \cs_end:
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\cs_new:Npn \@@_CJK_class_tl:n #1
  { c_@@_CJK_class_ \int_eval:n {#1} _tl }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[pTF,int]{\xeCJK_if_same_class:NN}
% åˆ¤æ–­ä¸¤ä¸ªå­—ç¬¦æ˜¯å¦åŒå±žäºŽä¸€ä¸ªå­—ç¬¦ç±»ã€‚
%    \begin{macrocode}
\prg_new_conditional:Npnn \xeCJK_if_same_class:NN #1#2 { p , T , F , TF }
  {
    \if_int_compare:w \xeCJK_token_value_class:N #1 =
                      \xeCJK_token_value_class:N #2 \exp_stop_f:
      \prg_return_true: \else: \prg_return_false: \fi:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_make_boundary:}
% åˆ©ç”¨ \cs{scan_stop:} ç»“æŸ CJK åˆ†ç»„ï¼Œç”¨äºŽæ¢å¤å­—ä½“ç­‰ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_make_boundary:
  { \bool_if:NT \l_@@_CJK_group_bool { \scan_stop: } }
%    \end{macrocode}
% \end{macro}
%
% \subsection{åŠŸèƒ½å¼€å…³}
%
% \begin{macro}{xeCJKactive}
% äº‹å®žä¸Šï¼Œå°†å¼€å¯æˆ–å…³é—­ \XeTeX çš„æ•´ä¸ªå­—ç¬¦ç±»æœºåˆ¶ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    xeCJKactive .choice: ,
    xeCJKactive / true  .code:n = { \makexeCJKactive   } ,
    xeCJKactive / false .code:n = { \makexeCJKinactive } ,
    xeCJKactive      .default:n = { true }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\makexeCJKactive, \makexeCJKinactive}
%    \begin{macrocode}
\NewDocumentCommand \makexeCJKactive   { }
  { \tex_XeTeXinterchartokenstate:D = \c_one_int }
\NewDocumentCommand \makexeCJKinactive { }
  { \tex_XeTeXinterchartokenstate:D = \c_zero_int }
%    \end{macrocode}
% \end{macro}
%
% æŠ‘åˆ¶ |BOM|ã€‚
%    \begin{macrocode}
\char_set_catcode_ignore:n { "FEFF }
%    \end{macrocode}
%
% \subsection{å­—ç¬¦ç±»åˆ«è®¾å®š}\label{sec:xeCJK-class-set}
%
% \begin{variable}{\g_@@_class_seq,\g_@@_new_class_seq}
% åˆ†åˆ«ç”¨äºŽè®°å½•åœ¨ \pkg{xeCJK} ä¸­ä½¿ç”¨çš„å­—ç¬¦ç±»åˆ«åç§°å’Œæ–°å»ºçš„å­—ç¬¦ç±»åˆ«çš„ç¼–å·ã€‚
%    \begin{macrocode}
\seq_new:N \g_@@_class_seq
\seq_new:N \g_@@_new_class_seq
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}[int]{\xeCJK_new_class:n}
% æ–°å»ºä¸€ä¸ªå­—ç¬¦ç±»åˆ«ã€‚|#1| æ˜¯è‡ªå®šä¹‰åç§°ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_new_class:n #1
  {
    \int_if_exist:cTF { \@@_class_csname:n {#1} }
      { \@@_error:nx { class-already-defined } {#1} }
      {
        \exp_args:Nc \newXeTeXintercharclass
          { \@@_class_csname:n {#1} }
        \clist_new:c { g_@@_#1_range_clist }
        \seq_gput_right:Nn \g_@@_class_seq {#1}
        \seq_gput_right:Nv \g_@@_new_class_seq
          { \@@_class_csname:n {#1} }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_save_class:nn}
% \changes{v3.1.1}{2012/12/06}
% {ä½¿ç”¨ \cs{xeCJK_save_class:nn} ä¿å­˜ \XeTeX é¢„å®šä¹‰çš„å­—ç¬¦ç±»åˆ«ã€‚}
% ä¿å­˜ \XeTeX é¢„å®šä¹‰çš„å­—ç¬¦ç±»åˆ«ã€‚|#1| æ˜¯è‡ªå®šä¹‰åç§°ï¼Œ|#2| æ˜¯ç¼–å·ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_save_class:nn #1#2
  {
    \int_if_exist:cTF { \@@_class_csname:n {#1} }
      { \@@_error:nx { class-already-defined } {#1} }
      {
        \int_const:cn { \@@_class_csname:n {#1} } {#2}
        \clist_new:c { g_@@_#1_range_clist }
        \seq_gput_right:Nn \g_@@_class_seq {#1}
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_class_csname:n}
% å­—ç¬¦ç±»åç§°å¯¹åº”çš„æŽ§åˆ¶åºåˆ—åå­—ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_class_csname:n #1 { c_@@_#1_class_int }
\cs_new_eq:cN { \@@_class_csname:n { Others } } \l_@@_tmp_int
\@@_msg_new:nn { class-already-defined }
  {
    XeTeX~character~class~`#1'~has~been~already~defined.\\\\
    Please~take~another~name. \\
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.0}{2013/05/20}{å¢žåŠ&nbsp; \texttt{IVS} å­—ç¬¦ç±»ç”¨äºŽå¤„ç†å¼‚ä½“å­—é€‰æ‹©ç¬¦ã€‚}
% \changes{v3.3.1}{2015/01/22}{\texttt{IVS} å­—ç¬¦ç±»æ›´åä¸º \texttt{CM}ã€‚}
%
% \pkg{xeCJK} éœ€è¦ä»¥ä¸‹å­—ç¬¦ç±»åˆ«ç”¨äºŽå­—ç¬¦è¾“å‡ºã€‚å…¶ä¸­ |Default|ã€|CJK|ã€|FullLeft|ã€
% |FullRight|ã€|Boundary| ä¸º \XeTeX\ ä¸­é¢„å®šä¹‰çš„ç±»åˆ«ï¼Œ\pkg{xeCJK} æ–°å¢žåŠ&nbsp;äº†\
% |HalfLeft|ã€|HalfRight|ã€|NormalSpace| å’Œ |CM|ã€‚å…¶ä¸­å¼‚ä½“å­—é€‰æ‹©ç¬¦
% (Ideographic Variation Selectors)\footnote{\url{http://www.unicode.org/reports/tr37/}}
% éœ€è¦ \XeTeX\ |0.9999.0| ä»¥ä¸Šçš„ç‰ˆæœ¬^^A
% \footnote{\url{http://tug.org/pipermail/xetex/2013-March/024118.html}}å’Œç›¸å…³å­—ä½“çš„æ”¯æŒã€‚
% \begin{center}\xeCJKsetup{PunctStyle=hangmobanjiao}
% \begin{tabular}{cll}
% \toprule
%   ç±»åˆ«        &amp; è¯´æ˜Ž               &amp; ä¾‹å­ \\ \midrule
% |Default|     &amp; è¥¿æ–‡ä¸€èˆ¬ç¬¦å·       &amp; abc123 \\
% |CJK|         &amp; CJK è¡¨æ„ç¬¦å·       &amp; æ±‰å­—ããƒã… \\
% |FullLeft|    &amp; å…¨è§’å·¦æ&nbsp;‡ç‚¹         &amp; ï¼ˆã€Šï¼šâ€œ \\
% |FullRight|   &amp; å…¨è§’å³æ&nbsp;‡ç‚¹         &amp; ï¼Œã€‚ï¼‰ã€‹â€ \\
% |HalfLeft|    &amp; åŠè§’å·¦æ&nbsp;‡ç‚¹         &amp; ( [ \{ \\
% |HalfRight|   &amp; åŠè§’å³æ&nbsp;‡ç‚¹         &amp; , . ? ) ] \} \\
% |NormalSpace| &amp; å‰åŽåŽŸå§‹é—´è·çš„ç¬¦å· &amp; / \\
% |Boundary|    &amp; è¾¹ç•Œ               &amp; ç©ºæ&nbsp;¼ \\
% |CM|          &amp; ç»„åˆæ&nbsp;‡è¯†           &amp; å¼‚ä½“å­—é€‰æ‹©ç¬¦\\
% |HangulJamo|  &amp; æœé²œæ–‡å­—æ¯         &amp; |á„»||á†Ÿ||á‡«|\\
% \bottomrule
% \end{tabular}
% \end{center}
%
% \changes{v3.3.3}{2016/01/20}{å…¼å®¹ \LaTeXe{} 2016/02/01 çš„å­—ç¬¦ç±»è®¾ç½®ã€‚}
% \changes{v3.3.4}{2016/02/07}{å…¼å®¹ \XeTeX{} 0.99994 çš„è¾¹ç•Œå­—ç¬¦ç±»ã€‚}
% \begin{macro}[int]{Default,CJK,FullLeft,FullRight,Boundary}
%    \begin{macrocode}
\xeCJK_save_class:nn { Default } { 0 }
%    \end{macrocode}
% \XeTeX{} 0.99994 å°†å­—ç¬¦ç±»æ€»æ•°æ‰©å¤§åˆ° $4096$^^A
% \footnote{\url{http://tug.org/pipermail/xetex/2016-February/026363.html}}ã€‚
%    \begin{macrocode}
\str_const:Nx \c_@@_xetex_version_str
  { \int_use:N \tex_XeTeXversion:D \tex_XeTeXrevision:D }
\fp_compare:nNnTF { \c_@@_xetex_version_str } &gt; { 0.99993 }
  { \xeCJK_save_class:nn { Boundary } { 4095 } }
  { \xeCJK_save_class:nn { Boundary } { 255 } }
%    \end{macrocode}
% \LaTeXe{} 2016/02/01 ä¸å†é¢„è®¾ç½® CJK å­—ç¬¦ç±»ã€‚
%    \begin{macrocode}
\int_compare:nNnTF { \tex_XeTeXcharclass:D "4E00 } = \c_one_int
  {
    \xeCJK_save_class:nn { CJK }       { 1 }
    \xeCJK_save_class:nn { FullLeft }  { 2 }
    \xeCJK_save_class:nn { FullRight } { 3 }
    \int_const:Nn \c_@@_class_begin_int { 3 }
  }
  {
    \xeCJK_new_class:n { CJK }
    \xeCJK_new_class:n { FullLeft }
    \xeCJK_new_class:n { FullRight }
    \int_const:Nn \c_@@_class_begin_int { 0 }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.15}{2014/11/10}{å¢žåŠ&nbsp; \texttt{HangulJamo} å­—ç¬¦ç±»ã€‚}
%
% \begin{macro}[int]{HalfLeft,HalfRight,NormalSpace,CM,HangulJamo}
% æ–°å¢žè¥¿æ–‡åŠè§’å·¦/å³æ&nbsp;‡ç‚¹ã€å‰åŽåŽŸå§‹é—´è·çš„ç¬¦å·å’Œå¼‚ä½“å­—é€‰æ‹©ç¬¦ç±»ã€‚
%    \begin{macrocode}
\xeCJK_new_class:n { HalfLeft }
\xeCJK_new_class:n { HalfRight }
\xeCJK_new_class:n { NormalSpace }
\xeCJK_new_class:n { CM }
\xeCJK_new_class:n { HangulJamo }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.11}{2014/04/10}
% {å·¦å³è§’æ‹¬å· \texttt{U+2329} å’Œ \texttt{U+232A} æ˜¯è¥¿æ–‡æ&nbsp;‡ç‚¹ç¬¦å·ã€‚}
% \changes{v3.2.15}{2014/11/09}
% {æŠŠ REVERSE SOLIDUSï¼ˆ\texttt{U+005C}ï¼‰ã€HYPHEN-MINUSï¼ˆ\texttt{U+002D}ï¼‰å’Œ
%  EN DASHï¼ˆ\texttt{U+2013}ï¼‰å½’å…¥ \texttt{NormalSpace} ç±»ã€‚}
%
% \begin{variable}
%  {\c_@@_HalfLeft_chars_clist,\c_@@_HalfRight_chars_clist,\c_@@_NormalSpace_chars_clist}
% \hypertarget{CJKcharclass}{è¥¿æ–‡åŠè§’å·¦/å³æ&nbsp;‡ç‚¹å’Œå‰åŽåŽŸå§‹é—´è·çš„å­—ç¬¦ç±»ã€‚}
%    \begin{macrocode}
\clist_const:Nn \c_@@_HalfLeft_chars_clist
  { "28  , "5B , "60 , "7B , "2329 }
\clist_const:Nn \c_@@_HalfRight_chars_clist
  { "21 , "22 , "25 , "27 , "29 , "2C , "2E , "3A , "3B , "3F , "5D , "7D , "232A }
\clist_const:Nn \c_@@_NormalSpace_chars_clist { "2D , "2F , "5C }
%    \end{macrocode}
% \end{variable}
%
% ä»¥ä¸‹å¯¹å…¨è§’æ&nbsp;‡ç‚¹ç¬¦å·çš„å½’ç±»æ¥æºäºŽ \XeTeX çš„è„šæœ¬
% \href{http://sourceforge.net/p/xetex/code/ci/master/tree/source/texk/web2c/xetexdir/unicode-char-prep.pl}
% {\file{unicode-char-prep.pl}} å’Œ Unicode æ•°æ®åº“\footnote{\url{http://www.unicode.org/reports/tr14/}}ã€‚
%
% \changes{v3.2.3}{2013/06/09}{æ&nbsp;¹æ® \XeTeX çš„è„šæœ¬é‡æ–°æ•´ç†å…¨è§’æ&nbsp;‡ç‚¹ç¬¦å·ã€‚}
%
% \begin{variable}{\c_@@_OP_chars_clist}
% Open Punctuation (OP)
% \PrintPunctList{OP}{Open Punctuation}
% ä»¥ä¸‹ä»£ç&nbsp;çš„ç¬¬ä¸€è¡Œæ˜¯ä¸­è¥¿æ–‡å…±ç”¨çš„å·¦å¼•å·ã€‚
%    \begin{macrocode}
\clist_const:Nn \c_@@_OP_chars_clist
  {
    "2018 , "201C ,
    "3008 , "300A , "300C , "300E , "3010 , "3014 , "3016 , "3018 , "301A , "301D ,
    "FE17 , "FE35 , "FE37 , "FE39 , "FE3B , "FE3D , "FE3F , "FE41 , "FE43 , "FE47 ,
    "FE59 , "FE5B , "FE5D , "FF08 , "FF3B , "FF5B , "FF5F , "FF62
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_PR_chars_clist}
% \changes{v3.3.0}{2014/12/26}{ä¸æŠŠ \texttt{U+20A9} å½’å…¥ CJK çš„ PR ç±»ã€‚}
% Prefix Numeric (PR)
% \PrintPunctList{PR}{Prefix Numeric}
%    \begin{macrocode}
\clist_const:Nn \c_@@_PR_chars_clist
  { "FE69 , "FF04 , "FFE1 , "FFE5 , "FFE6 }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_FullLeft_chars_clist}
% ä»¥ä¸Šä¸¤ç±»æ&nbsp;‡ç‚¹ç¬¦å·å‡ºçŽ°åœ¨æ–‡å­—çš„å·¦è¾¹ï¼Œä¸åº”å‡ºçŽ°åœ¨è¡Œå°¾ä½ç½®ã€‚
%    \begin{macrocode}
\clist_new:N \c_@@_FullLeft_chars_clist
\clist_gconcat:NNN \c_@@_FullLeft_chars_clist
                   \c_@@_OP_chars_clist
                   \c_@@_PR_chars_clist
%    \end{macrocode}
% \end{variable}
%
% \changes{v3.3.3}{2015/12/12}
% {æŠŠ EN DASHï¼ˆ\texttt{U+2013}ï¼‰ä½œä¸ºåŠå­—çº¿è¿žæŽ¥å·å½’å…¥ \texttt{FullRight} ç±»ã€‚}
% \changes{v3.3.3}{2015/12/12}
% {ä¸å†æŠŠ \texttt{U+2015} å’Œ \texttt{U+2500} å½’å…¥ \texttt{FullRight} ç±»ã€‚}
% \changes{v3.6.0}{2018/01/14}
% {æŠŠ TWO-EM DASH (\texttt{U+2E3A}) å½’å…¥ \texttt{FullRight} ç±»å’Œè®¾ä¸º
%  \texttt{LongPunct} ä¸Ž \texttt{MiddlePunct}ã€‚}
%
% \begin{variable}{\c_@@_CL_chars_clist}
% Close Punctuation (CL)
% \PrintPunctList{CL}{Close Punctuation}
% ä»¥ä¸‹ä»£ç&nbsp;çš„ç¬¬ä¸€è¡Œæ˜¯ä¸­è¥¿æ–‡å…±ç”¨çš„ä¸€äº›æ&nbsp;‡ç‚¹ç¬¦å·ã€‚
%    \begin{macrocode}
\clist_const:Nn \c_@@_CL_chars_clist
  {
    "00B7 , "2019 , "201D , "2013 , "2014 , "2025 , "2026 , "2027 , "2E3A ,
    "3001 , "3002 , "3009 , "300B , "300D , "300F , "3011 , "3015 , "3017 , "3019 ,
    "301B , "301E , "301F , "FE11 , "FE12 , "FE18 , "FE36 , "FE38 , "FE3A , "FE3C ,
    "FE3E , "FE40 , "FE42 , "FE44 , "FE48 , "FE50 , "FE52 , "FE5A , "FE5C , "FE5E ,
    "FF09 , "FF0C , "FF0E , "FF3D , "FF5D , "FF60 , "FF61 , "FF63 , "FF64
  }
%    \end{macrocode}
% \end{variable}
%
% \changes{v3.3.0}{2014/12/26}{ä¸æŠŠ NS ç±»ä¸­çš„ä¸€äº›æœ‰ç¦åˆ™çš„æ—¥æ–‡å½’å…¥ \texttt{FullRight} ç±»ã€‚}
% \changes{v3.6.0}{2018/01/14}
% {å°†å…¨è§’æµªçº¿ \texttt{U+FF5E} ç­‰è¿žæŽ¥å·å½’å…¥ \texttt{FullRight} ç±»å’Œè®¾ä¸º \texttt{MiddlePunct}ã€‚}
%
% \begin{variable}{\c_@@_NS_chars_clist}
% Nonstarter (NS)
% \PrintPunctList{NS}{Nonstarter}
% \noindent Hyphens (cl-03)
% \PrintPunctList{hyphens}{Hyphens}
% \noindent Iteration marks (cl-09)
% \PrintPunctList{iteration_marks}{Iteration marks}
% æ&nbsp;¹æ® W3C çš„èµ„æ–™\footnote{\url{http://www.w3.org/TR/jlreq/}}ï¼Œ\texttt{cl-03} å’Œ
% \texttt{cl-09} åœ¨éžå¸¸æ¾æ•£çš„æƒ…å†µä¸‹å¯ä»¥æ²¡æœ‰ç¦åˆ™ã€‚æˆ‘ä»¬ä»…å°†å…¨è§’æµªçº¿ \texttt{U+FF5E} ç­‰è¿žæŽ¥å·å½’å…¥
% \texttt{FullRight} ç±»å¹¶åœ¨å®åŒ…æœ«å°¾è®¾ä¸º \texttt{MiddlePunct}ã€‚
%    \begin{macrocode}
\clist_const:Nn \c_@@_hyphens_chars_clist
  { "301C , "30A0 , "FF5E }
\clist_const:Nn \c_@@_iteration_marks_chars_clist
  { "3005 , "303B , "309D , "309E , "30FD , "30FE }
\clist_const:Nn \c_@@_NS_chars_clist
  { "30FB , "FE54 , "FE55 , "FF1A , "FF1B , "FF65 , "16FE0 }
\AtEndOfPackage
  {
    \cs_set:Npn \@@_tmp:w #1
      { \char_generate:nn {#1} { 12 } }
    \@@_add_special_punct:nn { middle }
      { \clist_map_function:NN \c_@@_hyphens_chars_clist \@@_tmp:w }
    \cs_undefine:N \@@_tmp:w
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_EX_chars_clist}
% Exclamation/Interrogation (EX)
% \PrintPunctList{EX}{Exclamation/Interrogation}
%    \begin{macrocode}
\clist_const:Nn \c_@@_EX_chars_clist
  { "FE15 , "FE16 , "FE56 , "FE57 , "FF01 , "FF1F }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_IS_chars_clist}
% Infix Numeric Separator (IS)
% \PrintPunctList{IS}{Infix Numeric Separator}
%    \begin{macrocode}
\clist_const:Nn \c_@@_IS_chars_clist { "FE10 , "FE13 , "FE14 }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_CJ_chars_clist}
% Conditional Japanese Starter (CJ)ã€‚è¿™ç±»å­—ç¬¦çš„ç¦åˆ™æ˜¯å¯é€‰çš„^^A
% \footnote{\url{https://github.com/CTeX-org/ctex-kit/issues/165}}ï¼Œ
% ä¸ºå®žçŽ°çš„ç®€å•è®¡ï¼Œæˆ‘ä»¬æŠŠå®ƒä»¬å½’å…¥ CJK ç±»ï¼Œå³æ²¡æœ‰ç¦åˆ™ã€‚
% \PrintPunctList{CJ}{Conditional Japanese Starter}
%    \begin{macrocode}
\clist_const:Nn \c_@@_CJ_chars_clist
  {
    "3041 , "3043 , "3045 , "3047 , "3049 , "3063 , "3083 , "3085 , "3087 , "308E ,
    "3095 , "3096 , "30A1 , "30A3 , "30A5 , "30A7 , "30A9 , "30C3 , "30E3 , "30E5 ,
    "30E7 , "30EE , "30F5 , "30F6 , "30FC , "31F0 , "31F1 , "31F2 , "31F3 , "31F4 ,
    "31F5 , "31F6 , "31F7 , "31F8 , "31F9 , "31FA , "31FB , "31FC , "31FD , "31FE ,
    "31FF , "FF67 , "FF68 , "FF69 , "FF6A , "FF6B , "FF6C , "FF6D , "FF6E , "FF6F ,
    "FF70
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_PO_chars_clist}
% Postfix Numeric (PO)
% \PrintPunctList{PO}{Postfix Numeric}
%    \begin{macrocode}
\clist_const:Nn \c_@@_PO_chars_clist { "FE6A , "FF05 , "FFE0 }
%    \end{macrocode}
% \end{variable}
%
% \changes{v3.3.0}{2014/12/26}{ä¸æŠŠå°å†™æ—¥æ–‡å‡åå½’å…¥ \texttt{FullRight} ç±»ã€‚}
%
% \begin{variable}{\c_@@_FullRight_chars_clist}
% ä»¥ä¸Šå…­ç±»æ&nbsp;‡ç‚¹ç¬¦å·å‡ºçŽ°åœ¨æ–‡å­—çš„å³è¾¹ï¼Œä¸åº”å‡ºçŽ°åœ¨è¡Œé¦–ä½ç½®ã€‚
%    \begin{macrocode}
\clist_new:N \c_@@_FullRight_chars_clist
\tl_map_inline:nn
  {
    \c_@@_CL_chars_clist
    \c_@@_NS_chars_clist
    \c_@@_EX_chars_clist
    \c_@@_IS_chars_clist
    \c_@@_PO_chars_clist
    \c_@@_hyphens_chars_clist
  }
  {
    \clist_gconcat:NNN \c_@@_FullRight_chars_clist
                       \c_@@_FullRight_chars_clist #1
  }
%    \end{macrocode}
% \end{variable}
%
% \changes{v3.3.3}{2015/06/25}{è¡¥å…… Ext-Eã€‚}
% \changes{v3.4.1}{2016/08/18}{è¡¥å…… Unicode 9.0.0 çš„è¥¿å¤æ–‡ã€‚}
% \changes{v3.5.0}{2017/07/22}{è¡¥å…… Ext-Fã€‚}
% \changes{v3.7.3}{2019/04/15}{è¡¥å……æ—¥æ–‡å‡åæ‰©å±•ã€‚}
% \changes{v3.8.3}{2020/03/15}{åŒæ­¥ Unicode 13.0.0ã€‚}
% \changes{v3.8.3}{2020/04/09}{è¡¥å…… \texttt{U+02EA} å’Œ \texttt{U+02EB}ã€‚}
% \changes{v3.8.8}{2021/09/15}{åŒæ­¥ Unicode 14.0.0ã€‚}
% \changes{v3.8.8}{2021/09/16}{è¡¥å……å¥³ä¹¦ã€‚}
%
% \begin{variable}{\c_@@_CJK_chars_clist}
% CJK å­—ç¬¦ç±»ï¼ŒåŒ…æ‹¬æ–‡å­—å’Œæ&nbsp;‡ç‚¹ç¬¦å·ã€‚
%    \begin{macrocode}
\clist_const:Nn \c_@@_CJK_chars_clist
  {
%    \end{macrocode}
% \begin{itemize}[nosep,leftmargin=0pt]
% \item é—½å—è¯­ã€å®¢å®¶è¯é˜´åŽ»å’Œé˜³åŽ»å£°è°ƒæ&nbsp;‡è®°
%    \begin{macrocode}
    "02EA -&gt; "02EB ,
%    \end{macrocode}
% \item CJK Radicals Supplement ï¼ˆä¸­æ—¥éŸ©éƒ¨é¦–è¡¥å……ï¼‰
%    \begin{macrocode}
    "2E80 -&gt; "2EFF ,
%    \end{macrocode}
% \item Kangxi Radicals ï¼ˆåº·ç†™éƒ¨é¦–ï¼‰
%    \begin{macrocode}
    "2F00 -&gt; "2FDF ,
%    \end{macrocode}
% \item Ideographic Description Characters ï¼ˆè¡¨æ„æ–‡å­—æè¿°ç¬¦ï¼‰
%    \begin{macrocode}
    "2FF0 -&gt; "2FFF ,
%    \end{macrocode}
% \item CJK Symbols and Punctuation ï¼ˆä¸­æ—¥éŸ©ç¬¦å·å’Œæ&nbsp;‡ç‚¹ï¼‰
%    \begin{macrocode}
    "3000 -&gt; "303F ,
%    \end{macrocode}
% \item Hiragana ï¼ˆæ—¥æ–‡å¹³å‡åï¼‰
%    \begin{macrocode}
    "3040 -&gt; "309F ,
%    \end{macrocode}
% \item Katakana ï¼ˆæ—¥æ–‡ç‰‡å‡åï¼‰
%    \begin{macrocode}
    "30A0 -&gt; "30FF ,
%    \end{macrocode}
% \item Bopomofo ï¼ˆæ³¨éŸ³å­—æ¯ï¼‰
%    \begin{macrocode}
    "3100 -&gt; "312F ,
%    \end{macrocode}
% \item Hangul Compatibility Jamo ï¼ˆè°šæ–‡å…¼å®¹å­—æ¯ï¼‰
%    \begin{macrocode}
    "3130 -&gt; "318F ,
%    \end{macrocode}
% \item Kanbun ï¼ˆè±¡å½¢å­—æ³¨é‡Šæ&nbsp;‡å¿—ï¼‰
%    \begin{macrocode}
    "3190 -&gt; "319F ,
%    \end{macrocode}
% \item Bopomofo Extended ï¼ˆæ³¨éŸ³å­—æ¯æ‰©å±•ï¼‰
%    \begin{macrocode}
    "31A0 -&gt; "31BF ,
%    \end{macrocode}
% \item CJK Strokes ï¼ˆä¸­æ—¥éŸ©ç¬”ç”»ï¼‰
%    \begin{macrocode}
    "31C0 -&gt; "31EF ,
%    \end{macrocode}
% \item Katakana Phonetic Extensions ï¼ˆæ—¥æ–‡ç‰‡å‡åè¯­éŸ³æ‰©å±•ï¼‰
%    \begin{macrocode}
    "31F0 -&gt; "31FF ,
%    \end{macrocode}
% \item Enclosed CJK Letters and Months ï¼ˆå¸¦åœˆä¸­æ—¥éŸ©å­—æ¯å’Œæœˆä»½ï¼‰
%    \begin{macrocode}
    "3200 -&gt; "32FF ,
%    \end{macrocode}
% \item CJK Compatibility ï¼ˆä¸­æ—¥éŸ©å…¼å®¹ï¼‰
%    \begin{macrocode}
    "3300 -&gt; "33FF ,
%    \end{macrocode}
% \item CJK Unified Ideographs Extension-A ï¼ˆä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—æ‰©å±• Aï¼‰
%    \begin{macrocode}
    "3400 -&gt; "4DBF ,
%    \end{macrocode}
% \item Yijing Hexagrams Symbols ï¼ˆæ˜“ç»å…­åå››å¦ç¬¦å·ï¼‰
%    \begin{macrocode}
    "4DC0 -&gt; "4DFF ,
%    \end{macrocode}
% \item CJK Unified Ideographs ï¼ˆä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—ï¼‰
%    \begin{macrocode}
    "4E00 -&gt; "9FFF ,
%    \end{macrocode}
% \item Yi Syllables ï¼ˆå½æ–‡éŸ³èŠ‚ï¼‰
%    \begin{macrocode}
    "A000 -&gt; "A48F ,
%    \end{macrocode}
% \item Yi Radicals ï¼ˆå½æ–‡å­—æ&nbsp;¹ï¼‰
%    \begin{macrocode}
    "A490 -&gt; "A4CF ,
%    \end{macrocode}
% \item Hangul Syllables ï¼ˆè°šæ–‡éŸ³èŠ‚ï¼‰
%    \begin{macrocode}
    "AC00 -&gt; "D7AF ,
%    \end{macrocode}
% \item CJK Compatibility Ideographs ï¼ˆä¸­æ—¥éŸ©å…¼å®¹è¡¨æ„æ–‡å­—ï¼‰
%    \begin{macrocode}
    "F900 -&gt; "FAFF ,
%    \end{macrocode}
% \item Vertical Forms ï¼ˆç«–æŽ’å½¢å¼ï¼‰
%    \begin{macrocode}
    "FE10 -&gt; "FE1F ,
%    \end{macrocode}
% \item CJK Compatibility Forms ï¼ˆä¸­æ—¥éŸ©å…¼å®¹å½¢å¼ï¼‰
%    \begin{macrocode}
    "FE30 -&gt; "FE4F ,
%    \end{macrocode}
% \item Halfwidth and Fullwidth Forms ï¼ˆåŠè§’åŠå…¨è§’å½¢å¼ï¼‰
%    \begin{macrocode}
    "FF00 -&gt; "FFEF ,
%    \end{macrocode}
% \item Ideographic Symbols and Punctuation ï¼ˆè¡¨æ„æ–‡å­—ç¬¦å·åŠæ&nbsp;‡ç‚¹ï¼‰
%    \begin{macrocode}
    "16FE0 -&gt; "16FFF ,
%    \end{macrocode}
% \item Tangut ï¼ˆè¥¿å¤æ–‡ï¼‰
%    \begin{macrocode}
    "17000 -&gt; "187FF ,
%    \end{macrocode}
% \item Tangut Components ï¼ˆè¥¿å¤æ–‡éƒ¨é¦–ï¼‰
%    \begin{macrocode}
    "18800 -&gt; "18AFF ,
%    \end{macrocode}
% \item Khitan Small Script ï¼ˆå¥‘ä¸¹å°å­—ï¼‰
%    \begin{macrocode}
    "18B00 -&gt; "18CFF ,
%    \end{macrocode}
% \item Tangut Supplement ï¼ˆè¥¿å¤æ–‡å¢žè¡¥ï¼‰
%    \begin{macrocode}
    "18D00 -&gt; "18D7F ,
%    \end{macrocode}
% \item Kana Extended-B ï¼ˆæ—¥æ–‡å‡åæ‰©å±• Bï¼‰
%    \begin{macrocode}
    "1AFF0 -&gt; "1AFFF ,
%    \end{macrocode}
% \item Kana Supplement ï¼ˆæ—¥æ–‡å‡åå¢žè¡¥ï¼‰
%    \begin{macrocode}
    "1B000 -&gt; "1B0FF ,
%    \end{macrocode}
% \item Kana Extended-A ï¼ˆæ—¥æ–‡å‡åæ‰©å±• Aï¼‰
%    \begin{macrocode}
    "1B100 -&gt; "1B12F ,
%    \end{macrocode}
% \item Small Kana Extension ï¼ˆå°åž‹æ—¥æ–‡å‡åæ‰©å±•ï¼‰
%    \begin{macrocode}
    "1B130 -&gt; "1B16F ,
%    \end{macrocode}
% \item Nushu ï¼ˆå¥³ä¹¦ï¼‰
%    \begin{macrocode}
    "1B170 -&gt; "1B2FF ,
%    \end{macrocode}
% \item Enclosed Ideographic Supplement ï¼ˆå¸¦åœˆè¡¨æ„æ–‡å­—å¢žè¡¥ï¼‰
%    \begin{macrocode}
    "1F200 -&gt; "1F2FF ,
%    \end{macrocode}
% \item CJK Unified Ideographs Extension-B ï¼ˆä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—æ‰©å±• Bï¼‰
%    \begin{macrocode}
    "20000 -&gt; "2A6DF ,
%    \end{macrocode}
% \item CJK Unified Ideographs Extension-C ï¼ˆä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—æ‰©å±• Cï¼‰
%    \begin{macrocode}
    "2A700 -&gt; "2B73F ,
%    \end{macrocode}
% \item CJK Unified Ideographs Extension-D ï¼ˆä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—æ‰©å±• Dï¼‰
%    \begin{macrocode}
    "2B740 -&gt; "2B81F ,
%    \end{macrocode}
% \item CJK Unified Ideographs Extension-E ï¼ˆä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—æ‰©å±• Eï¼‰
%    \begin{macrocode}
    "2B820 -&gt; "2CEAF ,
%    \end{macrocode}
% \item CJK Unified Ideographs Extension-F ï¼ˆä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—æ‰©å±• Fï¼‰
%    \begin{macrocode}
    "2CEB0 -&gt; "2EBEF ,
%    \end{macrocode}
% \item CJK Compatibility Ideographs Supplement ï¼ˆä¸­æ—¥éŸ©å…¼å®¹è¡¨æ„æ–‡å­—å¢žè¡¥ï¼‰
%    \begin{macrocode}
    "2F800 -&gt; "2FA1F ,
%    \end{macrocode}
% \item CJK Unified Ideographs Extension-G ï¼ˆä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—æ‰©å±• Gï¼‰
%    \begin{macrocode}
    "30000 -&gt; "3134F
%    \end{macrocode}
% \end{itemize}
%    \begin{macrocode}
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_CM_chars_clist}
% \changes{v3.3.1}{2015/01/22}{è¡¥å……éŸ³è°ƒç¬¦å·ã€‚}
% åŒ…æ‹¬æ—¥æ–‡å‡åæµŠç‚¹å’Œå¼‚ä½“å­—é€‰æ‹©ç¬¦ã€‚ç»„åˆæ&nbsp;‡è¯†æ˜¯æœ€å¥½æ˜¯å½’å…¥ 256 ç±»ï¼Œå³é€æ˜Žç±»ï¼Œä¸ä¼šå½±å“
% çŠ¶æ€ã€‚ä½†ä¹Ÿä¼šäº§ç”Ÿä¸€å®šé—®é¢˜ã€‚æ¯”å¦‚ä¸‹é¢çš„ä¾‹å­ï¼Œä½äºŽè¡Œå°¾çš„â€œäºŒâ€é€&nbsp;æˆåˆ†ç»„ä¸åŒ¹é…ã€‚
% \begin{verbatim}
%   \XeTeXinterchartokenstate=1
%   \XeTeXcharclass`äºŒ=256
%   \XeTeXinterchartoks 255 1 = {\bgroup}
%   \XeTeXinterchartoks 1 255 = {\egroup}
%   \XeTeXinterchartoks 1 1 = {x}
%   \font\zhfont="SimSun"
%   \zhfont
%   ä¸€äºŒä¸‰äºŒ
%   \bye
% \end{verbatim}
%    \begin{macrocode}
\clist_const:Nn \c_@@_CM_chars_clist
  {
%    \end{macrocode}
% \begin{itemize}[nosep,leftmargin=0pt]
% \item Diacritics ï¼ˆéŸ³è°ƒç¬¦å·ï¼‰
%    \begin{macrocode}
    "302A -&gt; "302F ,
%    \end{macrocode}
% \item æ—¥æ–‡å‡åæµŠç‚¹
%    \begin{macrocode}
    "3099 -&gt; "309A ,
%    \end{macrocode}
% \item Variation Selectors ï¼ˆå¼‚ä½“å­—é€‰æ‹©ç¬¦ï¼‰
%    \begin{macrocode}
    "FE00 -&gt; "FE0F ,
%    \end{macrocode}
% \item Variation Selectors Supplement ï¼ˆå¼‚ä½“å­—é€‰æ‹©ç¬¦å¢žè¡¥ï¼‰
%    \begin{macrocode}
    "E0100 -&gt; "E01EF
%    \end{macrocode}
% \end{itemize}
%    \begin{macrocode}
  }
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\c_@@_HangulJamo_chars_clist}
% æœé²œæ–‡å­—æ¯ã€‚
%    \begin{macrocode}
\clist_const:Nn \c_@@_HangulJamo_chars_clist
  {
%    \end{macrocode}
% \begin{itemize}[nosep,leftmargin=0pt]
% \item Hangul Jamo ï¼ˆè°šæ–‡å­—æ¯ï¼‰
%    \begin{macrocode}
    "1100 -&gt; "11FF ,
%    \end{macrocode}
% \item Hangul Jamo Extended-A ï¼ˆè°šæ–‡æ‰©å±• Aï¼‰
%    \begin{macrocode}
    "A960 -&gt; "A97F ,
%    \end{macrocode}
% \item Hangul Jamo Extended-B ï¼ˆè°šæ–‡æ‰©å±• Bï¼‰
%    \begin{macrocode}
    "D7B0 -&gt; "D7FF
%    \end{macrocode}
% \end{itemize}
%    \begin{macrocode}
  }
%    \end{macrocode}
% \end{variable}
%
% \subsection{å­—ç¬¦ç±»åˆ«å¤„ç†}
%
% \begin{macro}[int]{\xeCJK_class_num:n}
% |#1| ä¸ºå­—ç¬¦ç±»åˆ«åç§°ï¼Œç”¨äºŽå–å¾—å­—ç¬¦ç±»åˆ«å¯¹åº”çš„ç¼–å·ã€‚
%    \begin{macrocode}
\cs_new:Npn \xeCJK_class_num:n #1
  { \use:c { \@@_class_csname:n {#1} } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJKDeclareCharClass}
%    \begin{macrocode}
\NewDocumentCommand \xeCJKDeclareCharClass { s &gt; { \TrimSpaces } m m }
  {
    \xeCJK_declare_char_class:nn {#2} {#3}
    \IfBooleanT {#1} { \xeCJKResetPunctClass }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_declare_char_class:nn,\xeCJK_declare_char_class:nN}
% \begin{macro}{\@@_set_char_class_aux:Nnw}
% ç”¨äºŽè®¾ç½®å­—ç¬¦æ‰€å±žçš„ç±»åˆ«ï¼Œ|#1| ä¸ºç±»åˆ«åç§°ï¼Œ|#2| ä¸ºå­—ç¬¦çš„ |Unicode|ï¼Œç›¸é‚»å­—ç¬¦ç”¨
% åŠè§’é€—å·éš”å¼€ï¼Œæ”¯æŒç±»ä¼¼ |"1100 -&gt; "11FF| èµ·æ­¢èŒƒå›´çš„ä½¿ç”¨æ–¹å¼ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_declare_char_class:nn #1#2
  {
    \clist_set:Nx \l_@@_tmp_clist {#2}
    \xeCJK_declare_char_class:nN {#1} \l_@@_tmp_clist
  }
\cs_new_protected:Npn \xeCJK_declare_char_class:nN #1#2
  {
    \clist_gconcat:ccN
      { g_@@_#1_range_clist } { g_@@_#1_range_clist } #2
    \clist_map_inline:Nn #2
      {
        \str_if_eq:nnF {##1} { -&gt; }
          {
            \@@_set_char_class_aux:Nnw \xeCJK_set_char_class:nnn {##1}
              { \xeCJK_class_num:n {#1} }
          }
      }
    \xeCJK_set_char_class:nnn { "3099 } { "309A } { \xeCJK_class_num:n { CM } }
  }
\NewDocumentCommand \@@_set_char_class_aux:Nnw
  { m &gt; { \SplitArgument { 1 } { -&gt; } } m } { #1 #2 }
\cs_generate_variant:Nn \clist_gconcat:NNN { cc }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@@_check_num_range:nnNN}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_check_num_range:nnNN #1#2#3#4
  {
    \bool_lazy_or:nnTF
      { \tl_if_blank_p:n {#1} }
      { \tl_if_blank_p:n {#2} }
      {
        \int_set:Nn #3 { \tl_if_blank:nTF {#1} {#2} {#1} }
        \int_set_eq:NN #3 #4
      }
      {
        \int_set:Nn #3 { \int_min:nn {#1} { \tl_if_novalue:nTF {#2} {#1} {#2} } }
        \int_set:Nn #4 { \int_max:nn {#1} { \tl_if_novalue:nTF {#2} {#1} {#2} } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.3}{2013/06/08}{ä¸å†æ”¹å˜ CJK å­—ç¬¦ç±»çš„ \tn{catcode}ã€‚}
% \changes{v3.2.7}{2013/08/29}{ä¿®æ­£ \file{unicode-letters.tex} ä¸­è°šæ–‡ç¬¦å·
% \tn{catcode} ä¸å‡†çš„é—®é¢˜ã€‚}
%    \begin{macrocode}
\token_if_letter:NF ^^^^ac00
  {
    \int_set:Nn \l_@@_begin_int { "AC00 }
    \int_set:Nn \l_@@_end_int   { "D7A3 }
    \xeCJK_int_until_do:nn { \l_@@_begin_int &gt; \l_@@_end_int }
      {
        \char_set_catcode_letter:n { \l_@@_begin_int }
        \int_incr:N \l_@@_begin_int
      }
  }
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_set_char_class:nnn}
% \changes{v3.1.1}{2012/12/05}{åœ¨æ–‡æ¡£ä¸­è®¾ç½®å­—ç¬¦ç±»åˆ«æ—¶ä¸é‡å¤è®¾ç½® \tn{catcode}ã€‚}
% è®¾ç½®å­—ç¬¦ç±»åˆ«ï¼Œ|#1| å’Œ |#2| ä¸ºå­—ç¬¦ç±»åˆ«èµ·æ­¢çš„ |Unicode|ï¼Œ|#3| ä¸ºç±»åˆ«åç§°å¯¹åº”ç¼–å·ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_set_char_class:nnn #1#2#3
  {
    \@@_check_num_range:nnNN {#1} {#2} \l_@@_begin_int \l_@@_end_int
    \int_set:Nn \l_@@_tmp_int {#3}
    \xeCJK_int_until_do:nn { \l_@@_begin_int &gt; \l_@@_end_int }
      {
        \tex_XeTeXcharclass:D \l_@@_begin_int = \l_@@_tmp_int
        \int_incr:N \l_@@_begin_int
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_char_class_eq:nn}
% \changes{v3.1.1}{2012/12/06}{äº¤æ¢å‚æ•°çš„é¡ºåºã€‚}
% å°†å­—ç¬¦ç±» |#1| ä¸­çš„å­—ç¬¦å…¨éƒ¨è®¾ç½®æˆå­—ç¬¦ç±» |#2|ã€‚åªé€‚ç”¨äºŽ |#1| çš„å­—ç¬¦ç±»èŒƒå›´ä¸ºç¦»æ•£çš„
% é€—å·åˆ—è¡¨çš„æƒ…å†µã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_char_class_eq:nn #1#2
  {
    \int_set:Nn \l_@@_tmp_int { \xeCJK_class_num:n {#2} }
    \clist_map_inline:cn { c_@@_#1_chars_clist }
      { \tex_XeTeXcharclass:D ##1 = \l_@@_tmp_int }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\normalspacedchars}
% å£°æ˜Žå‰åŽä¸åŠ&nbsp;é—´è·çš„å­—ç¬¦ã€‚
%    \begin{macrocode}
\NewDocumentCommand \normalspacedchars { m }
  {
    \tl_map_inline:nn {#1}
      { \tex_XeTeXcharclass:D `##1 = \xeCJK_class_num:n { NormalSpace } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJKResetPunctClass}
% ç”¨äºŽé‡ç½®æ&nbsp;‡ç‚¹ç¬¦å·æ‰€å±žçš„å­—ç¬¦ç±»ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKResetPunctClass { }
  {
    \clist_gclear:N \g_@@_HalfLeft_range_clist
    \clist_gclear:N \g_@@_HalfRight_range_clist
    \clist_gclear:N \g_@@_FullLeft_range_clist
    \clist_gclear:N \g_@@_FullRight_range_clist
    \xeCJK_declare_char_class:nN { HalfLeft  } \c_@@_HalfLeft_chars_clist
    \xeCJK_declare_char_class:nN { HalfRight } \c_@@_HalfRight_chars_clist
    \xeCJK_declare_char_class:nN { FullLeft  } \c_@@_FullLeft_chars_clist
    \xeCJK_declare_char_class:nN { FullRight } \c_@@_FullRight_chars_clist
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\xeCJKResetCharClass}
% ç”¨äºŽæ¢å¤ \pkg{xeCJK} å¯¹å­—ç¬¦ç±»åˆ«çš„è®¾ç½®ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKResetCharClass { }
  {
    \clist_gclear:N \g_@@_CJK_range_clist
    \clist_gclear:N \g_@@_NormalSpace_range_clist
    \clist_gclear:N \g_@@_CM_range_clist
    \clist_gclear:N \g_@@_HangulJamo_range_clist
    \xeCJK_declare_char_class:nN { CJK } \c_@@_CJK_chars_clist
    \xeCJK_declare_char_class:nN { NormalSpace } \c_@@_NormalSpace_chars_clist
    \xeCJK_declare_char_class:nN { CM } \c_@@_CM_chars_clist
    \xeCJK_declare_char_class:nN { HangulJamo } \c_@@_HangulJamo_chars_clist
    \xeCJKResetPunctClass
  }
%    \end{macrocode}
% \end{macro}
%
% è®¾ç½®å­—ç¬¦ç±»åˆ«ã€‚
%    \begin{macrocode}
\xeCJKResetCharClass
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_inter_class_toks:nnn}
% åœ¨ç›¸é‚»ç±»åˆ«ä¹‹é—´æ’å…¥å†…å®¹ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_inter_class_toks:nnn #1#2#3
  {
    \tex_XeTeXinterchartoks:D \xeCJK_class_num:n {#1} ~
                              \xeCJK_class_num:n {#2} = {#3}
  }
\cs_generate_variant:Nn \xeCJK_inter_class_toks:nnn { nne }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_get_inter_class_toks:nn}
% å–å‡ºç›¸é‚»ç±»åˆ«ä¹‹é—´çš„å†…å®¹ã€‚
%    \begin{macrocode}
\cs_new:Npn \xeCJK_get_inter_class_toks:nn #1#2
  {
    \tex_the:D \tex_XeTeXinterchartoks:D \xeCJK_class_num:n {#1} ~
                                         \xeCJK_class_num:n {#2}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_clear_inter_class_toks:nn}
% æ¸…é™¤ç›¸é‚»ç±»åˆ«ä¹‹é—´çš„å†…å®¹ã€‚æ³¨æ„ï¼Œç›´æŽ¥èµ‹ç©ºå€¼å¯èƒ½ä¼šå¯¼è‡´ \XeTeX å´©æºƒã€‚ä¾‹å¦‚
% \begin{verbatim}
%   \XeTeXinterchartokenstate = 1
%   \XeTeXcharclass`A=10
%   \XeTeXinterchartoks 10 10 = {xx}
%   \begingroup
%     \XeTeXinterchartoks 10 10 = {} AA
%   \endgroup
%   \bye
% \end{verbatim}
% å¦‚æžœæŠŠä¸Šè¿°ä¾‹å­ä¸­çš„åˆ†ç»„ \tn{begingroup} å’Œ \tn{endgroup} åŽ»æŽ‰ï¼Œåˆ™ç»“æžœæ­£å¸¸ï¼Œç”šä¸ºæ€ªå¼‚ã€‚
% æ­¤å¤„ \XeTeX çš„ bug å·²ç»åœ¨ 0.999992 ç‰ˆä¸­ä¿®å¤^^A
% \footnote{\url{http://tug.org/svn/texlive?view=revision&amp;revision=53880}}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_clear_inter_class_toks:nn #1#2
  { \xeCJK_inter_class_toks:nnn {#1} {#2} { \prg_do_nothing: } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_pre_inter_class_toks:nnn}
% åœ¨ç›¸é‚»ç±»åˆ«ä¹‹é—´å·²æœ‰çš„å†…å®¹å‰å¢žåŠ&nbsp;å†…å®¹ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_pre_inter_class_toks:nnn #1#2#3
  {
    \xeCJK_inter_class_toks:nne {#1} {#2}
      { \exp_not:n {#3} \xeCJK_get_inter_class_toks:nn {#1} {#2} }
  }
\cs_generate_variant:Nn \xeCJK_pre_inter_class_toks:nnn { nne }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_app_inter_class_toks:nnn}
% åœ¨ç›¸é‚»ç±»åˆ«ä¹‹é—´å·²æœ‰çš„å†…å®¹åŽè¿½åŠ&nbsp;å†…å®¹ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_app_inter_class_toks:nnn #1#2#3
  {
    \xeCJK_inter_class_toks:nne {#1} {#2}
      { \xeCJK_get_inter_class_toks:nn {#1} {#2} \exp_not:n {#3} }
  }
\cs_generate_variant:Nn \xeCJK_app_inter_class_toks:nnn { nne }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_copy_inter_class_toks:nnnn}
% å°† |#3| å’Œ |#4| ä¹‹é—´çš„å†…å®¹å¤åˆ¶åˆ° |#1| å’Œ |#2| ä¹‹é—´ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_copy_inter_class_toks:nnnn #1#2#3#4
  {
    \tl_set:Nx \l_@@_tmp_tl
      { \xeCJK_get_inter_class_toks:nn {#3} {#4} }
    \tl_if_empty:NTF \l_@@_tmp_tl
      {
        \tl_set:Nx \l_@@_tmp_tl
          { \xeCJK_get_inter_class_toks:nn {#1} {#2} }
        \tl_if_empty:NF \l_@@_tmp_tl
          { \xeCJK_clear_inter_class_toks:nn {#1} {#2} }
      }
      { \xeCJK_inter_class_toks:nne {#1} {#2} { \exp_not:o \l_@@_tmp_tl } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_replace_inter_class_toks:nnnn}
% å°† |#1| å’Œ |#2| ä¹‹é—´å‡ºçŽ°çš„ |#3| ç”¨ |#4| æ›¿æ¢ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_replace_inter_class_toks:nnnn #1#2#3#4
  {
    \tl_set:Nx \l_@@_tmp_tl
      { \xeCJK_get_inter_class_toks:nn {#1} {#2} }
    \tl_if_empty:NF \l_@@_tmp_tl
      {
        \tl_replace_all:Nnn \l_@@_tmp_tl {#3} {#4}
        \xeCJK_inter_class_toks:nne {#1} {#2}
          { \exp_not:o \l_@@_tmp_tl }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_clear_Boundary_and_CJK_toks:}
% \changes{v3.4.2}{2016/10/19}{æé«˜æ•ˆçŽ‡ï¼Œé¿å…é‡å¤å¾ªçŽ¯ã€‚}
% æ¸…é™¤è¾¹ç•Œä¸Ž CJK æ–‡å­—ã€å…¨è§’å·¦å³æ&nbsp;‡ç‚¹ä¹‹é—´çš„å†…å®¹ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_clear_Boundary_and_CJK_toks:
  { }
\cs_new_protected:Npn \@@_update_clear_toks:n #1
  {
    \cs_gset_protected:Npx \xeCJK_clear_Boundary_and_CJK_toks:
      {
        \exp_not:o { \xeCJK_clear_Boundary_and_CJK_toks: }
        \tex_XeTeXinterchartoks:D
          \xeCJK_class_num:n { Boundary } ~
          \xeCJK_class_num:n {#1} = { \exp_not:N \prg_do_nothing: }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}
%  {\g_@@_base_class_seq,\g_@@_non_CJK_class_seq,\g_@@_CJK_class_seq}
%  ä¿å­˜å®åŒ…é¢„å…ˆå®šä¹‰çš„å­—ç¬¦ç±»ã€‚
%    \begin{macrocode}
\seq_new:N \g_@@_base_class_seq
\seq_gset_eq:NN \g_@@_base_class_seq \g_@@_class_seq
\seq_new:N \g_@@_non_CJK_class_seq
\seq_gset_from_clist:Nn \g_@@_non_CJK_class_seq
  { Default , HalfLeft , HalfRight , NormalSpace , Boundary }
\seq_new:N \g_@@_CJK_class_seq
\cs_new_protected:Npn \@@_save_CJK_class:n #1
  {
    \seq_gput_right:Nn \g_@@_CJK_class_seq {#1}
    \tl_const:cn
      { \@@_CJK_class_tl:n { \use:c { \@@_class_csname:n {#1} } } }
      {#1}
    \@@_update_clear_toks:n {#1}
  }
\clist_map_function:nN
  { CJK , FullLeft , FullRight , CM , HangulJamo } \@@_save_CJK_class:n
%    \end{macrocode}
% \end{variable}
%
% \subsection{å­—ç¬¦è¾“å‡ºè§„åˆ™}
%
% \begin{center}
% \begin{tabular}{l*9c}
% \toprule
%   &amp; |Default| &amp; |CJK| &amp; |FullL| &amp; |FullR| &amp; |HalfL|
%   &amp; |HalfR| &amp; |Normal| &amp; |Bound| &amp; |CM| \\ \midrule
% |Default|
%   &amp;
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp;
%   &amp;
%   &amp;
%   &amp; \tokslink{def-bound}
%   &amp; \tokslink{def-cm}\\
% |CJK|
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{cjk-cjk}
%   &amp; \tokslink{cjk-fl-fr}
%   &amp; \tokslink{cjk-fl-fr}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{cjk-bound}
%   &amp;\\
% |FullLeft|
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{fl-fr-others}
%   &amp; \tokslink{cjk-fl-fr}
%   &amp; \tokslink{cjk-fl-fr}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{fl-fr-bound}
%   &amp; \tokslink{def-cm}\\
% |FullRight|
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{fl-fr-others}
%   &amp; \tokslink{cjk-fl-fr}
%   &amp; \tokslink{cjk-fl-fr}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{fl-fr-bound}
%   &amp; \tokslink{def-cm}\\
% |HalfLeft|
%   &amp;
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp;
%   &amp;
%   &amp;
%   &amp;
%   &amp; \tokslink{def-cm}\\
% |HalfRight|
%   &amp;
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp;
%   &amp;
%   &amp;
%   &amp; \tokslink{def-bound}
%   &amp; \tokslink{def-cm}\\
% |NormalSpace|
%   &amp;
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp; \tokslink{def-cjk}
%   &amp;
%   &amp;
%   &amp;
%   &amp; \tokslink{ns-bound}
%   &amp; \tokslink{def-cm}\\
% |Boundary|
%   &amp; \tokslink{bound-def}
%   &amp; \tokslink{bound-cjk}
%   &amp; \tokslink{bound-fl-fr}
%   &amp; \tokslink{bound-fl-fr}
%   &amp; \tokslink{bound-def}
%   &amp;
%   &amp; \tokslink{bound-ns}
%   &amp;
%   &amp; \tokslink{def-cm}\\
% |CM|
%   &amp; \tokslink{def-cm}
%   &amp; \tokslink{def-cm}
%   &amp; \tokslink{def-cm}
%   &amp; \tokslink{def-cm}
%   &amp; \tokslink{def-cm}
%   &amp; \tokslink{def-cm}
%   &amp; \tokslink{def-cm}
%   &amp; \tokslink{def-cm}
%   &amp; \tokslink{def-cm}\\
% \bottomrule
% \end{tabular}
% \end{center}
%
% \changes{v3.4.2}{2016/10/19}{é¿å…åœ¨ç&nbsp;´æŠ˜å·ä¹‹é—´æŠ˜è¡Œã€‚}
%
% \begin{macro}[int]{\xeCJK_class_group_begin:,\xeCJK_class_group_end:}
% åœ¨ CJK ç±»å¼€å§‹æ—¶ï¼Œè®¾ç½® \tn{XeTeXdashbreakstate} ä¸ºé›¶ï¼Œé¿å…ç&nbsp;´æŠ˜å·ä¹‹é—´çš„æŠ˜è¡Œã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_class_group_begin:
  {
    \c_group_begin_token
    \bool_set_true:N \l_@@_CJK_group_bool
    \xeCJK_reset_space_factor:
    \int_zero:N \tex_XeTeXdashbreakstate:D
  }
\bool_new:N \l_@@_CJK_group_bool
\cs_new_eq:NN \xeCJK_class_group_end: \c_group_end_token
%    \end{macrocode}
% \end{macro}
%
% \hypertarget{def-cm}{\texttt{CM}} å­—ç¬¦ç±»ä¸Ž |CJK| å­—ç¬¦ç±»åŸºæœ¬ç›¸åŒï¼Œåªæ˜¯ä»Ž |CJK|
% è½¬ç§»åˆ° |CM| æ—¶ï¼Œä¸åŠ&nbsp;å…¥ä»»ä½•å†…å®¹ã€‚
%    \begin{macrocode}
\AtEndOfPackage
  {
    \seq_map_inline:Nn \g_@@_class_seq
      {
        \str_if_eq:nnTF {#1} { CM }
          { \xeCJK_copy_inter_class_toks:nnnn { CM } {#1} { CJK } { CJK } }
          {
            \xeCJK_copy_inter_class_toks:nnnn { CM } {#1} { CJK } {#1}
            \str_if_eq:nnF {#1} { CJK }
              { \xeCJK_copy_inter_class_toks:nnnn {#1} { CM } {#1} { CJK } }
          }
      }
  }
%    \end{macrocode}
%
% \hypertarget{def-HJ}{\texttt{HangulJamo}} å­—ç¬¦ç±»ä¸Ž |CJK| å­—ç¬¦ç±»åŸºæœ¬ç›¸åŒï¼Œåªæ˜¯
% |HangulJamo| ç±»ä¹‹é—´ä¸åŠ&nbsp;å…¥ä»»ä½•å†…å®¹ã€‚
%    \begin{macrocode}
\AtEndOfPackage
  {
    \seq_map_inline:Nn \g_@@_class_seq
      {
        \str_if_eq:nnF {#1} { HangulJamo }
          {
            \xeCJK_copy_inter_class_toks:nnnn { HangulJamo } {#1} { CJK } {#1}
            \xeCJK_copy_inter_class_toks:nnnn {#1} { HangulJamo } {#1} { CJK }
          }
      }
  }
%    \end{macrocode}
%
% \hypertarget{def-cjk}{}
%    \begin{macrocode}
\clist_map_inline:nn { Default , HalfLeft , HalfRight , NormalSpace }
  {
    \xeCJK_inter_class_toks:nnn {#1} { CJK }
      {
        \xeCJK_class_group_begin:
        \xeCJK_select_font:
        \xeCJK_clear_inter_class_toks:nn {#1} { CJK }
        \xeCJK_clear_Boundary_and_CJK_toks:
        \xeCJK_fallback_symbol:NN
        \CJKsymbol
      }
    \xeCJK_inter_class_toks:nnn { CJK } {#1} { \xeCJK_class_group_end: }
  }
%    \end{macrocode}
%
% \hypertarget{bound-def}{}
%    \begin{macrocode}
\clist_map_inline:nn { Default , HalfLeft }
  {
    \xeCJK_inter_class_toks:nnn { Boundary } {#1}
      { \xeCJK_Boundary_and_Default: }
    \xeCJK_app_inter_class_toks:nnn { CJK } {#1}
      { \CJKecglue }
  }
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_Boundary_and_Default:}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_Boundary_and_Default:
  { \xeCJK_check_for_ecglue: }
\cs_new_protected:Npn \@@_check_for_xecglue:
  {
    \@@_if_last_glue:TF
      { \@@_replace_space: }
      { \@@_check_for_ecglue: }
  }
\cs_new_protected:Npn \@@_check_for_ecglue:
  {
    \xeCJK_if_last_node:nTF { CJK }
      { \use_i:nn }
      { \xeCJK_if_last_node:nTF { CJK-widow } }
      { \xeCJK_remove_node: \CJKecglue }
      {
        \xeCJK_if_last_node:nT { CJK-space }
          { \xeCJK_remove_node: \xeCJK_space_or_xecglue: }
      }
  }
\cs_new_eq:NN \xeCJK_check_for_ecglue: \@@_check_for_ecglue:
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.4.0}{2016/05/08}{æ”¹è¿› \texttt{xCJKecglue} çš„å®žçŽ°ã€‚}
%
% \begin{macro}{\@@_replace_space:}
% å°†ç©ºæ&nbsp;¼æ›¿æ¢ä¸º \tn{CJKecglue}ã€‚æ³¨æ„ç”± \tn{leaders} ç­‰äº§ç”Ÿçš„ glueï¼Œå¹¶ä¸èƒ½æ­£ç¡®åœ°è¿˜å›žåŽ»ã€‚
% å¥½åœ¨ \LaTeXe{} ä¸­å¸¸ç”¨çš„ \tn{hrulefill} å’Œ \tn{dotfill} å®šä¹‰æœ«å°¾éƒ½æœ‰ |\kern\z@| ä¿æŠ¤ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_replace_space:
  {
    \skip_set_eq:NN \l_@@_last_skip \tex_lastskip:D
    \tex_unskip:D
    \xeCJK_if_last_node:nTF { CJK-space }
      { \xeCJK_remove_node: \CJKecglue }
      {
        \xeCJK_if_last_node:nTF { CJK }
          {
            \skip_if_eq:nnTF
              { \l_@@_last_skip }
              { \c_xeCJK_space_skip_tl }
              { \xeCJK_remove_node: \CJKecglue }
              { \skip_horizontal:N \l_@@_last_skip }
          }
          { \skip_horizontal:N \l_@@_last_skip }
      }
  }
\skip_new:N \l_@@_last_skip
%    \end{macrocode}
% \end{macro}
%
% \hypertarget{def-bound}{}
%    \begin{macrocode}
\clist_map_inline:nn { Default , HalfRight }
  {
    \xeCJK_inter_class_toks:nnn {#1} { Boundary }
      {
        \int_gset_eq:NN \g_@@_space_factor_int \tex_spacefactor:D
        \peek_meaning_remove:NTF \tex_italiccorrection:D
          {
            \tex_italiccorrection:D
            { \xeCJK_make_node:n { default } }
          }
          {
            \token_if_space:NTF \l_peek_token
              { \xeCJK_make_space_node: }
              { { \xeCJK_make_node:n { default } } }
          }
      }
    \xeCJK_pre_inter_class_toks:nnn {#1} { CJK } { \CJKecglue }
  }
%    \end{macrocode}
%
% \changes{v3.2.5}{2013/07/10}
% {ä¿®æ­£ \texttt{CJK} å’Œ \texttt{NormalSpace} å­—ç¬¦ç±»ä¹‹é—´å›&nbsp;ä¸ºè¾¹ç•Œé€&nbsp;æˆçš„é—´è·ä¸æ­£ç¡®çš„é—®é¢˜ã€‚}
%
% \hypertarget{bound-ns}{}
%    \begin{macrocode}
\xeCJK_inter_class_toks:nnn { Boundary } { NormalSpace }
  { \xeCJK_Boundary_and_NormalSp: }
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_Boundary_and_NormalSp:}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_Boundary_and_NormalSp:
  { \xeCJK_check_for_ecglue_normalsp: }
\cs_new_protected:Npn \@@_check_for_xecglue_normalsp:
  {
    \@@_if_last_glue:TF
      { \@@_replace_space: }
      { \@@_check_for_ecglue_normalsp: }
  }
\cs_new_protected:Npn \@@_check_for_ecglue_normalsp:
  {
    \xeCJK_if_last_node:nT { CJK-space }
      { \xeCJK_remove_node: \xeCJK_space_or_xecglue: }
  }
\cs_new_eq:NN \xeCJK_check_for_ecglue_normalsp:
              \@@_check_for_ecglue_normalsp:
%    \end{macrocode}
% \end{macro}
%
% \hypertarget{ns-bound}{}
%    \begin{macrocode}
\xeCJK_inter_class_toks:nnn { NormalSpace } { Boundary }
  {
    \int_gset_eq:NN \g_@@_space_factor_int \tex_spacefactor:D
    \peek_meaning_remove:NTF \tex_italiccorrection:D
      {
        \tex_italiccorrection:D
        { \xeCJK_make_node:n { normalspace } }
      }
      {
        \token_if_space:NTF \l_peek_token
          { \xeCJK_make_space_node: }
          { { \xeCJK_make_node:n { normalspace } } }
      }
  }
%    \end{macrocode}
%
% \hypertarget{bound-cjk}{}
%    \begin{macrocode}
\xeCJK_inter_class_toks:nnn { Boundary } { CJK }
  {
    \xeCJK_check_for_glue:
    \xeCJK_class_group_begin:
    \xeCJK_clear_Boundary_and_CJK_toks:
    \xeCJK_select_font:
    \xeCJK_fallback_symbol:NN
    \CJKsymbol
  }
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_check_for_glue:}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_check_for_glue:
  {
    \@@_if_last_kern:TF
      { \@@_check_for_glue_auxi: }
      {
        \@@_if_last_math:TF
          { \xeCJK_remove_node: \CJKecglue }
          { \@@_check_for_glue_auxii: }
      }
  }
\cs_new_protected:Npn \@@_check_for_glue_auxi:
  {
    \dim_case:nn { \tex_lastkern:D }
      {
        { \@@_node:n { CJK } }
        { \xeCJK_remove_node: \CJKglue }
        { \@@_node:n { CJK-space } }
        { \xeCJK_remove_node: \@@_ccglue_or_space: }
        { \@@_node:n { CJK-widow } }
        { \xeCJK_remove_node: \xeCJK_widow_penalty: \CJKglue }
        { \@@_node:n { default } }
        { \xeCJK_remove_node: \CJKecglue }
      }
  }
\cs_new_protected:Npn \@@_check_for_glue_auxii:
  {
    \xeCJK_if_last_punct:TF
      { \@@_check_for_glue_auxiii: }
      { \xeCJK_check_for_xglue: }
  }
\cs_new_protected:Npn \@@_check_for_glue_auxiii:
  {
    \bool_if:NT \l_@@_last_penalty_bool
      { \tex_penalty:D \l_@@_last_penalty_int }
    \skip_horizontal:N \l_@@_last_skip
    \tl_if_eq:NNF \l_@@_aligni_tl \c_@@_left_tl { \CJKglue }
  }
\cs_new_eq:NN \xeCJK_check_for_xglue: \prg_do_nothing:
\cs_new_protected:Npn \@@_check_for_xglue:
  {
    \@@_if_last_glue:TF
      {
        \skip_set_eq:NN \l_@@_last_skip \tex_lastskip:D
        \tex_unskip:D
        \xeCJK_if_last_node:nTF { CJK-space }
          { \xeCJK_remove_node: \@@_ccglue_or_space: }
          {
            \xeCJK_if_last_node:nTF { default-space }
              { \xeCJK_remove_node: \CJKecglue }
              { \@@_check_for_xglue_aux: }
          }
      }
  }
\cs_new_protected:Npn \@@_check_for_xglue_aux:
  {
    \skip_if_eq:nnTF
      { \l_@@_last_skip }
      { \c_xeCJK_space_skip_tl }
      {
        \xeCJK_if_last_node:nTF { CJK }
          { \xeCJK_remove_node: \@@_ccglue_or_space: }
          {
            \xeCJK_if_last_node:nTF { default }
              { \xeCJK_remove_node: \CJKecglue }
              {
                \@@_if_last_math:TF
                  { \CJKecglue }
                  { \skip_horizontal:N \l_@@_last_skip }
              }
          }
      }
      { \skip_horizontal:N \l_@@_last_skip }
  }
\cs_new_protected:Npn \@@_ccglue_or_space:
  { \CJKglue }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.9.1}{2022/08/02}{ç®€åŒ–éƒ¨åˆ†å†…éƒ¨å®žçŽ°ã€‚}
%
% \begin{macro}[TF]{
%   \@@_if_last_none:,
%   \@@_if_last_hlist:,
%   \@@_if_last_math:,
%   \@@_if_last_glue:,
%   \@@_if_last_kern:,
%   \@@_if_last_penalty:}
% ä¸€äº› \hologo{eTeX} ç»“ç‚¹åˆ¤å®šå‡½æ•°ã€‚
%    \begin{macrocode}
\group_begin:
\cs_set:Npn \@@_tmp:nn #1
  {
    \exp_args:Ncc \@@_tmp_aux:NNn
      { @@_if_last_ #1 : }
      { c_@@_ #1 _node }
  }
\cs_set:Npn \@@_tmp_aux:NNn #1#2#3
  {
    \int_const:Nn #2 {#3}
    \prg_new_conditional:Npnn #1 { T , F , TF }
      {
        \if_int_compare:w \tex_lastnodetype:D = #2
          \prg_return_true: \else: \prg_return_false: \fi:
      }
  }
\@@_tmp:nn { none }    { -1 }
\@@_tmp:nn { hlist }   {  1 }
\@@_tmp:nn { math }    { 10 }
\@@_tmp:nn { glue }    { 11 }
\@@_tmp:nn { kern }    { 12 }
\@@_tmp:nn { penalty } { 13 }
\group_end:
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[pTF,int]{\xeCJK_if_last_node:n}
%    \begin{macrocode}
 \prg_new_conditional:Npnn \xeCJK_if_last_node:n #1 { p , T , F , TF }
  {
    \if_dim:w
      \cs_if_exist_use:cTF { c_@@_#1_node_dim }
        { = \tex_lastkern:D }
        { \use:c { c_@@_#1_node_skip } = \tex_lastskip:D }
      \prg_return_true: \else: \prg_return_false: \fi:
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.1.0}{2012/11/14}{åˆ&nbsp;é™¤å¤šä½™çš„ \texttt{default-itcorr} ç»“ç‚¹ã€‚}
% \changes{v3.2.4}{2013/07/03}{å°½é‡ç§»é™¤ç”¨ä½œåˆ¤æ–­æ&nbsp;‡å¿—çš„ \tn{kern}ã€‚}
%
% \begin{macro}[int]{\xeCJK_declare_node:n,\xeCJK_make_node:n}
% ç”¨äºŽåˆ¤æ–­æ’å…¥çš„å„ç§ |kern| å’Œ |glue|ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_declare_node:n #1
  {
    \int_gincr:N \g_@@_node_int
    \dim_if_exist:cTF { c_@@_#1_node_dim }
      { \dim_gset:cn } { \dim_const:cn }
      { c_@@_#1_node_dim } { \g_@@_node_int sp }
  }
\cs_new_protected:Npn \xeCJK_declare_glue_node:n #1
  {
    \int_gincr:N \g_@@_node_int
    \skip_if_exist:cTF { c_@@_#1_node_skip }
      { \skip_gset:cn } { \skip_const:cn }
      { c_@@_#1_node_skip } { \g_@@_node_int sp }
  }
\int_new:N \g_@@_node_int
\int_gset:Nn \g_@@_node_int { 10 }
\cs_new_protected:Npn \xeCJK_make_node:n #1
  { \exp_args:Nc \@@_make_node:N { c_@@_#1_node_dim } }
\cs_new:Npn \@@_node:n #1
  { \use:c { c_@@_#1_node_dim } }
\cs_new:Npn \@@_gule_node:n #1
  { \use:c { c_@@_#1_node_skip } }
\cs_new_protected:Npn \@@_make_node:N #1
  {
    \tex_kern:D - #1
    \tex_kern:D   #1
  }
\cs_new_protected:Npn \xeCJK_remove_node:
  {
    \@@_if_last_kern:TF
      { \tex_unkern:D \tex_unkern:D }
      {
        \@@_if_last_glue:T
          { \tex_unskip:D \tex_unskip:D }
      }
  }
\xeCJK_declare_node:n { CJK }
\xeCJK_declare_node:n { CJK-space }
\xeCJK_declare_node:n { default }
\xeCJK_declare_node:n { CJK-widow }
\xeCJK_declare_node:n { normalspace }
\xeCJK_declare_glue_node:n { default-space }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.9.0}{2022/06/06}{ä¿®å¤è¥¿æ–‡çš„ character protrusion åŠŸèƒ½ã€‚}
%
% \begin{macro}[int]{\xeCJK_make_space_node:}
% ç”¨äºŽåˆ¤æ–­æ’å…¥ç©ºæ&nbsp;¼ä¹‹å‰çš„ nodeï¼Œé»˜è®¤ä¸ºç©ºï¼Œåªæœ‰ç”¨æˆ·è®¾ç½®äº† \opt{xCJKecglue} é€‰é¡¹æ‰æœ‰æ„ä¹‰ã€‚
% éœ€è¦ä½¿ç”¨ |glue| æ¥æ&nbsp;‡è®°ï¼Œä½¿ç”¨ |kern| ä¼šå½±å“ character protrusion åŠŸèƒ½ã€‚
%    \begin{macrocode}
\cs_new_eq:NN \xeCJK_make_space_node: \prg_do_nothing:
\cs_new_protected:Npx \@@_make_space_node:
  {
    \tex_hskip:D - \@@_gule_node:n { default-space }
    \tex_hskip:D   \@@_gule_node:n { default-space }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{CJKglue}
% CJK æ–‡å­—ä¹‹é—´æ’å…¥çš„ |glue|ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    CJKglue .code:n =
      {
        \cs_set_protected:Npn \CJKglue {#1}
        \xeCJK_glue_to_skip:nN {#1} \l_@@_ccglue_skip
      }
  }
\skip_new:N \l_@@_ccglue_skip
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.16}{2014/12/16}{æ•´ç† \texttt{xCJKecglue} çš„éƒ¨åˆ†ä»£ç&nbsp;ã€‚}
%
% \begin{macro}{CJKecglue,xCJKecglue}
% CJK ä¸Žè¥¿æ–‡å’Œæ•°å­¦è¡Œå†…æ•°å­¦å…¬å¼ä¹‹é—´è‡ªåŠ¨æ·»åŠ&nbsp;çš„ç©ºç™½ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    CJKecglue            .code:n =
      {
        \cs_set_protected:Npn \CJKecglue {#1}
        \xeCJK_glue_to_skip:nN {#1} \l_@@_ecglue_skip
      } ,
    xCJKecglue .choice: ,
    xCJKecglue / true    .code:n =
      {
        \bool_set_true:N  \l_@@_xecglue_bool
        \cs_set_eq:NN \xeCJK_space_or_xecglue: \CJKecglue
        \cs_set_eq:NN \xeCJK_make_space_node: \@@_make_space_node:
        \cs_set_eq:NN \xeCJK_check_for_xglue: \@@_check_for_xglue:
        \cs_set_eq:NN \xeCJK_check_for_ecglue: \@@_check_for_xecglue:
        \cs_set_eq:NN
          \xeCJK_check_for_ecglue_normalsp:
          \@@_check_for_xecglue_normalsp:
      } ,
    xCJKecglue / false   .code:n =
      {
        \bool_set_false:N \l_@@_xecglue_bool
        \cs_set_eq:NN \xeCJK_space_or_xecglue: \xeCJK_space_glue:
        \xeCJK_cs_clear:N \xeCJK_make_space_node:
        \xeCJK_cs_clear:N \xeCJK_check_for_xglue:
        \cs_set_eq:NN \xeCJK_check_for_ecglue: \@@_check_for_ecglue:
        \cs_set_eq:NN
          \xeCJK_check_for_ecglue_normalsp:
          \@@_check_for_ecglue_normalsp:
      } ,
    xCJKecglue / unknown .code:n =
      {
        \bool_set_true:N  \l_@@_xecglue_bool
        \cs_set_protected:Npn \CJKecglue {#1}
        \xeCJK_glue_to_skip:nN {#1} \l_@@_ecglue_skip
        \cs_set_eq:NN \xeCJK_space_or_xecglue: \CJKecglue
        \cs_set_eq:NN \xeCJK_make_space_node: \@@_make_space_node:
        \cs_set_eq:NN \xeCJK_check_for_xglue: \@@_check_for_xglue:
        \cs_set_eq:NN \xeCJK_check_for_ecglue: \@@_check_for_xecglue:
        \cs_set_eq:NN
          \xeCJK_check_for_ecglue_normalsp:
          \@@_check_for_xecglue_normalsp:
      } ,
    xCJKecglue        .default:n = { true }
  }
\cs_new_eq:NN \xeCJK_space_glue: \c_space_tl
\skip_new:N \l_@@_ecglue_skip
\bool_new:N \l_@@_xecglue_bool
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.4.1}{2016/05/21}{ä¿®å¤ \texttt{CJKspace} åŠŸèƒ½å¤±æ•ˆã€‚}
% \changes{v3.7.2}{2019/04/07}{ç®€åŒ– \texttt{CJKspace} çš„å®žçŽ°ï¼Œå¹¶ä¿®å¤é”™è¯¯ã€‚}
%
% \begin{macro}{CJKspace}
% æ˜¯å¦ä¿ç•™ CJK æ–‡å­—é—´çš„ç©ºç™½ï¼Œé»˜è®¤ä¸ä¿ç•™ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    CJKspace .choice: ,
    CJKspace / true  .code:n =
      {
        \bool_set_true:N \l_@@_reserve_space_bool
        \cs_set_protected:Npn \@@_ccglue_or_space:
          { \xeCJK_space_glue: }
      } ,
    CJKspace / false .code:n =
      {
        \bool_set_false:N \l_@@_reserve_space_bool
        \cs_set_protected:Npn \@@_ccglue_or_space:
          { \CJKglue }
      } ,
    CJKspace      .default:n = { true } ,
    space            .meta:n = { CJKspace = true  } ,
    nospace          .meta:n = { CJKspace = false }
  }
\bool_new:N \l_@@_reserve_space_bool
%    \end{macrocode}
% \end{macro}
%
% \hypertarget{cjk-bound}{}
%    \begin{macrocode}
\xeCJK_inter_class_toks:nnn { CJK } { Boundary } { \xeCJK_CJK_and_Boundary:w }
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_CJK_and_Boundary:w}
% \changes{v3.2.6}{2013/08/05}{æ›´å¥½çš„å¤„ç†è¾¹ç•Œæ˜¯ \tn{relax} çš„æƒ…å†µã€‚}
% å½“è¾¹ç•Œæ˜¯ \tn{relax} çš„æ—¶å€™ï¼Œå®ƒå¯èƒ½æ˜¯ç”± |\csname ...\endcsname| çš„å½¢å¼äº§ç”Ÿçš„ï¼Œ
% è¿™æ&nbsp;·å°±å¯èƒ½å‡ºçŽ°é—®é¢˜\footnote{å‚è§ \url{http://bbs.ctex.org/forum.php?mod=viewthread&amp;tid=71563}ã€‚}ã€‚
% åŽŸæ¥æ˜¯éƒ½åœ¨æœªå®šä¹‰æŽ§åˆ¶åºåˆ—å‰éƒ½åŠ&nbsp;ä¸Š \cs{exp_not:N}ï¼ŒçŽ°åœ¨æ˜¯é‡‡ç”¨åˆ†ç»„ç»“æŸåŽæ‰‹å·¥æ¢å¤çš„æ–¹å¼ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_CJK_and_Boundary:w
  {
    \xeCJK_peek_catcode_ignore_spaces:NTF \c_math_toggle_token
      {
        \bool_if:NTF \l_@@_peek_ignore_spaces_bool
          { \xeCJK_class_group_end: \xeCJK_space_or_xecglue: }
          { \xeCJK_class_group_end: \CJKecglue }
      }
      {
        \group_align_safe_begin:
        \bool_if:NTF \l_@@_peek_ignore_spaces_bool
          {
            \token_if_macro:NTF \l_peek_token
              { \@@_boundary_reserve_space: }
              { \@@_boundary_group_end:n { CJK-space } }
          }
          {
            \token_if_eq_meaning:NNTF \l_peek_token \scan_stop:
              { \@@_CJK_and_Boundary_relax:N }
              { \@@_boundary_group_end:n { CJK } }
          }
      }
  }
\cs_new_protected:Npn \@@_boundary_reserve_space:
  {
    \@@_boundary_group_end:n { CJK-space }
    \xeCJK_space_or_xecglue:
  }
\cs_new_protected:Npn \@@_CJK_and_Boundary_relax:N #1
  {
    \@@_boundary_group_end:n { CJK }
    \token_if_eq_meaning:NNTF #1 \scan_stop:
      {#1} { \cs_set_eq:NN #1 \scan_stop: #1 }
  }
\cs_new_protected:Npn \@@_boundary_group_end:n #1
  {
    \group_align_safe_end:
    \xeCJK_class_group_end:
    { \xeCJK_make_node:n {#1} }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_ignore_spaces:w}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_ignore_spaces:w
  {
    \xeCJK_peek_catcode_ignore_spaces:NTF \c_math_toggle_token
      {
        \bool_if:NTF \l_@@_peek_ignore_spaces_bool
          { \xeCJK_space_or_xecglue: } { \CJKecglue }
      }
      {
        \bool_if:NT \l_@@_peek_ignore_spaces_bool
          {
            \dim_case:nn { \tex_lastkern:D }
              {
                { \@@_node:n { CJK } }
                { \xeCJK_remove_node: \xeCJK_make_node:n { CJK-space } }
                { \@@_node:n { default } }
                { \xeCJK_remove_node: \xeCJK_make_space_node: }
              }
            \group_align_safe_begin:
            \token_if_macro:NTF \l_peek_token
              { \@@_reserve_space_aux: }
              { \group_align_safe_end: }
          }
      }
  }
\cs_new_protected:Npn \@@_reserve_space_aux:
  {
    \group_align_safe_end:
    \xeCJK_space_or_xecglue:
  }
%    \end{macrocode}
% \end{macro}
%
% \hypertarget{cjk-cjk}{}
%    \begin{macrocode}
\xeCJK_inter_class_toks:nnn { CJK } { CJK }
  { \xeCJK_CJK_and_CJK:N }
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_CJK_and_CJK:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_CJK_and_CJK:N
  {
    \CJKglue
    \xeCJK_fallback_symbol:NN
    \CJKsymbol
  }
%    \end{macrocode}
% \end{macro}
%
% \hypertarget{fl-fr-others}{}
%    \begin{macrocode}
\xeCJK_inter_class_toks:nnn { FullLeft }  { CJK }
  {
    \xeCJK_FullLeft_and_CJK:
    \xeCJK_fallback_symbol:NN
    \CJKsymbol
  }
\xeCJK_inter_class_toks:nnn { FullRight } { CJK }
  {
    \xeCJK_FullRight_and_CJK:
    \xeCJK_fallback_symbol:NN
    \CJKsymbol
  }
\seq_map_inline:Nn \g_@@_non_CJK_class_seq
  {
    \clist_map_inline:nn { FullLeft , FullRight }
      {
        \xeCJK_inter_class_toks:nne {#1} {##1}
          { \exp_not:c { xeCJK_Default_and_##1:nN } {#1} }
        \xeCJK_inter_class_toks:nne {##1} {#1}
          { \exp_not:c { xeCJK_##1_and_Default: } }
      }
  }
%    \end{macrocode}
%
% \hypertarget{bound-fl-fr}{}
%    \begin{macrocode}
\xeCJK_inter_class_toks:nnn { Boundary } { FullLeft }
  { \xeCJK_Boundary_and_FullLeft:N  }
\xeCJK_inter_class_toks:nnn { Boundary } { FullRight }
  { \xeCJK_Boundary_and_FullRight:N  }
%    \end{macrocode}
%
% \hypertarget{fl-fr-bound}{}
%    \begin{macrocode}
\xeCJK_inter_class_toks:nnn { FullLeft } { Boundary }
  { \xeCJK_FullLeft_and_Boundary: }
\xeCJK_inter_class_toks:nnn { FullRight } { Boundary }
  { \xeCJK_FullRight_and_Boundary: }
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_FullLeft_and_Boundary:}
% \hypertarget{fl-fr-bound}{}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullLeft_and_Boundary:
  {
    \@@_punct_if_middle:NTF \g_@@_last_punct_tl
      {
        \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
        \xeCJK_class_group_end:
        \exp_after:wN \xeCJK_punct_node:N \g_@@_last_punct_tl
        \xeCJK_no_break:
        \@@_punct_glue:NN \c_@@_left_tl  \g_@@_last_punct_tl
      }
      {
        \xeCJK_class_group_end:
        \exp_after:wN \xeCJK_punct_node:N \g_@@_last_punct_tl
        \@@_nobreak_zero_glue:
      }
    \tex_ignorespaces:D
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_FullRight_and_Boundary:}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullRight_and_Boundary:
  {
    \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
    \xeCJK_class_group_end:
    \exp_after:wN \xeCJK_punct_node:N \g_@@_last_punct_tl
    \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl
    \tex_ignorespaces:D
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_punct_node:N}
% ä¿å­˜æ&nbsp;‡ç‚¹çš„å½“å‰è¾¹ç•Œå®½åº¦å’Œå­—ç¬¦ç&nbsp;ï¼Œé€šè¿‡æ’å…¥ \tn{kern} å®žçŽ°ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_punct_node:N #1
  {
    \@@_punct_bound_unitization:NN #1 \l_@@_tmp_dim
    \@@_make_node:N \l_@@_tmp_dim
    \dim_set:Nn \l_@@_tmp_dim { `#1 sp }
    \@@_make_node:N \l_@@_tmp_dim
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_punct_bound_unitization:NN}
% æˆ‘ä»¬ä¸æƒ³å‡ºçŽ°è¿‡å¤§çš„ \tn{kern}ï¼Œå›&nbsp;æ­¤å½“è¾¹ç•Œå¤§äºŽ \SI{1}{pt} æ—¶ï¼Œä»¥ \cs{c_max_dim} ä¸ºæ&nbsp;‡å‡†
% å¯¹å…¶è¿›è¡Œâ€œå•ä½åŒ–â€ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_punct_bound_unitization:NN #1#2
  {
    \dim_set:Nn #2
      {
        \dim_max:nn
          { \c_zero_dim }
          { \@@_use_punct_dim:nNN { bound } \c_@@_right_tl #1 }
      }
    \dim_compare:nNnF {#2} &lt; { 1pt }
      { \dim_set:Nn #2 { -1pt * \dim_ratio:nn {#2} { \c_max_dim } } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_punct_bound_kern:N}
% \begin{macro}{\@@_punct_bound_kern:NN}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_punct_bound_kern:N #1
  {
    \exp_after:wN \@@_punct_bound_kern:NN
      \g_@@_last_punct_tl #1
  }
\cs_new_protected:Npn \@@_punct_bound_kern:NN #1#2
  {
    \xeCJK_get_punct_bounds:NN \l_@@_aligni_tl #1
    \xeCJK_get_punct_kerning:NN #1 #2
    \@@_punct_bound_unitization:NN #1 \l_@@_tmp_dim
    \skip_set:Nn \l_@@_punct_kern_skip
      { \@@_use_dim_or_skip:nNN { bound_kern } #1 #2 }
    \dim_compare:nNnF \l_@@_tmp_dim = \l_@@_last_bound_dim
      { \@@_punct_bound_kern_ratio:NN #1 #2 }
    \bool_if:NTF \l_@@_last_penalty_bool
      {
        \tex_penalty:D \l_@@_last_penalty_int
        \skip_horizontal:N
      }
      { \@@_punct_bound_kern_aux:NNN #1 #2 }
      \l_@@_punct_kern_skip
  }
\skip_new:N \l_@@_punct_kern_skip
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@@_punct_bound_kern_ratio:NN}
% å½“æ&nbsp;‡ç‚¹å‰åŽçš„å­—ä½“æƒ…å†µä¸ä¸€è‡´æ—¶ï¼ŒæŒ‰ä¸€å®šçš„æ¯”ä¾‹è¿›è¡ŒåŽ‹ç¼©ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_punct_bound_kern_ratio:NN #1#2
  {
    \dim_set:Nn \l_@@_bound_dim
      { \@@_use_punct_dim:nNN { bound_width } #1 #2 }
    \dim_compare:nNnT \l_@@_bound_dim &gt; \c_zero_dim
      {
        \dim_compare:nNnF \l_@@_last_bound_dim &gt; \c_zero_dim
          {
            \dim_set:Nn \l_@@_last_bound_dim
              {
                - \l_@@_last_bound_dim *
                  \dim_ratio:nn { \c_max_dim } { 1pt }
              }
          }
        \@@_punct_bound_kern_ratio_aux:N #2
      }
  }
\cs_new_protected:Npn \@@_punct_bound_kern_ratio_aux:N #1
  {
    \skip_set:Nn \l_@@_punct_kern_skip
      {
        \l_@@_punct_kern_skip *
        \dim_ratio:nn
          {
              \l_@@_last_bound_dim
            + \@@_use_punct_dim:nNN { bound } \c_@@_left_tl #1
          }
          { \l_@@_bound_dim }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_nobreak_hskip:N,\@@_nobreak_hskip:n,
% \@@_punct_bound_kern:N, \@@_punct_bound_breakable_kern:N}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_nobreak_hskip:N
  { \xeCJK_no_break: \skip_horizontal:N }
\cs_new_protected:Npn \@@_nobreak_hskip:n
  { \xeCJK_no_break: \skip_horizontal:n }
\cs_new_eq:NN \@@_punct_bound_kern:N \@@_nobreak_hskip:N
\cs_new_protected:Npn \@@_punct_bound_breakable_kern:N
  {
    \tl_if_eq:NNTF \l_@@_aligni_tl \c_@@_right_tl
      {
        \tl_if_eq:NNTF \l_@@_alignii_tl \c_@@_left_tl
          { \skip_horizontal:N }
          { \@@_nobreak_hskip:N }
      }
      { \@@_nobreak_hskip:N }
  }
\cs_new_protected:Npn \@@_punct_bound_kern_aux:NNN #1#2
  {
    \str_if_eq:nnTF {#1} {#2}
      { \@@_nobreak_hskip:N }
      {
        \@@_punct_if_long:NTF #1
          { \skip_horizontal:N }
          {
            \@@_punct_if_long:NTF #2
              { \skip_horizontal:N }
              { \@@_punct_bound_kern:N }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \hypertarget{cjk-fl-fr}{}
%    \begin{macrocode}
\clist_map_inline:nn { CJK , FullLeft , FullRight }
  {
    \clist_map_inline:nn { FullLeft , FullRight }
      {
        \xeCJK_inter_class_toks:nne {#1} {##1}
          { \exp_not:c { xeCJK_#1_and_##1:N } }
      }
  }
%    \end{macrocode}
%
% \begin{macro}{\@@_punct_bound_rule:NN}
% ç”¨äºŽæŠ¹åŽ»æ&nbsp;‡ç‚¹ç¬¦å·çš„å…¨éƒ¨å·¦/å³ç©ºç™½ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_punct_bound_rule:NN #1#2
  {
    \tex_vrule:D
      width - \@@_use_punct_dim:nNN { bound } #1 #2 ~
      depth  \c_zero_dim
      height \c_zero_dim \scan_stop:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_punct_rule:NN}
% ç”¨äºŽå‡å°‘æ&nbsp;‡ç‚¹ç¬¦å·çš„å·¦/å³ç©ºç™½ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_punct_rule:NN #1#2
  {
    \tex_vrule:D
      width  \@@_use_punct_dim:nNN { rule } #1 #2 ~
      depth  \c_zero_dim
      height \c_zero_dim \scan_stop:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_punct_glue:NN}
% \changes{v3.2.7}{2013/08/23}
% {æ&nbsp;‡ç‚¹ç¬¦å·å·¦/å³ç©ºç™½çš„ä¼¸å±•å€¼ä¸è¶…è¿‡åŽŸå§‹è¾¹ç•Œï¼Œæ”¶ç¼©å€¼ä¸å°äºŽå¦ä¸€ä¾§è¾¹ç•Œã€‚}
% æ&nbsp;¹æ®æ‰€é€‰çš„æ&nbsp;‡ç‚¹å¤„ç†æ–¹å¼åœ¨æ&nbsp;‡ç‚¹ç¬¦å·å·¦/å³å¢žåŠ&nbsp;çš„ç©ºç™½ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_punct_glue:NN #1#2
  { \@@_punct_hskip:n { \@@_use_dim_or_skip:nNN { glue } #1 #2 } }
\cs_new_eq:NN \@@_punct_hskip:n \skip_horizontal:n
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.6.0}{2018/01/23}{æ€»å…è®¸é•¿æ&nbsp;‡ç‚¹ä¸Žå…¶ä»–æ&nbsp;‡ç‚¹ä¹‹é—´æŠ˜è¡Œã€‚}
% \begin{macro}{\xeCJK_punct_kern:NN,\@@_punct_kern:NN}
% ç›¸é‚»ä¸¤ä¸ªæ&nbsp;‡ç‚¹ä¹‹é—´çš„é—´è·ï¼Œæ€»å…è®¸é•¿æ&nbsp;‡ç‚¹ä¸Žå…¶ä»–æ&nbsp;‡ç‚¹ä¹‹é—´æŠ˜è¡Œã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_punct_kern:NN #1#2
  {
    \str_if_eq:eeTF {#1} {#2}
      { \@@_punct_nobreak_kern:NN }
      {
        \@@_punct_if_long:NTF #1
          { \@@_punct_breakable_kern:NN }
          {
            \@@_punct_if_long:NTF #2
              { \@@_punct_breakable_kern:NN }
              { \@@_punct_nobreak_kern:NN }
          }
      }
    #1 #2
  }
\cs_new_eq:NN \xeCJK_punct_kern:NN \@@_punct_kern:NN
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_punct_nobreak_kern:NN}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_punct_nobreak_kern:NN #1#2
  { \@@_nobreak_hskip:n { \@@_use_dim_or_skip:nNN { kern } #1 #2 } }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.4}{2013/07/06}
% {ä½¿ç”¨ \texttt{AllowBreakBetweenPuncts} æ—¶ï¼Œç›¸åº”æ&nbsp;‡ç‚¹ç¬¦å·ä»èƒ½ä¸Žè¾¹ç•Œå¯¹é½ã€‚}
% \changes{v3.2.7}{2013/08/23}
% {å¤„ç† \texttt{AllowBreakBetweenPuncts} ä¸Ž \pkg{xeCJKfntef} çš„å…¼å®¹é—®é¢˜ã€‚}
%
% \begin{macro}{\@@_punct_breakable_kern:NN}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_punct_breakable_kern:NN #1#2
  {
    \exp_after:wN \@@_punct_if_right:NT #1
      { \@@_punct_rule:NN \c_@@_right_tl #1 }
    \@@_punct_breakable_kern:n
      { \@@_use_dim_or_skip:nNN { bound_kern } #1 #2 }
    \@@_punct_if_right:NF #2
      { \@@_punct_rule:NN \c_@@_left_tl #2 }
  }
\cs_new_eq:NN \@@_punct_breakable_kern:n \skip_horizontal:n
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\g_@@_last_punct_tl}
% ç”¨äºŽè®°å½•å½“å‰çš„æ&nbsp;‡ç‚¹ç¬¦å·ã€‚
%    \begin{macrocode}
\tl_new:N \g_@@_last_punct_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}[int]{\xeCJK_FullLeft_and_CJK:}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullLeft_and_CJK:
  {
    \@@_punct_if_middle:NTF \g_@@_last_punct_tl
      {
        \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
        \xeCJK_no_break:
        \@@_punct_glue:NN \c_@@_left_tl \g_@@_last_punct_tl
      }
      { }
    \@@_select_font:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_FullLeft_and_Default:}
% \changes{v3.2.0}{2013/05/20}{ä¿®æ­£ \pkg{xeCJK} ä½¿è¥¿æ–‡åœ¨éƒ¨åˆ†æƒ…å†µä¸‹æ—&nbsp;æ³•æ–­è¯çš„é—®é¢˜ã€‚}
% \changes{v3.7.2}{2018/05/21}{å†æ¬¡ä¿®æ­£ FullLeft ç±»å­—ç¬¦ä¸Žè¥¿æ–‡è¿žç”¨æ–­è¯å¤±è´¥çš„é—®é¢˜ã€‚}
% \cs{@@_nobreak_zero_glue:} ç”¨äºŽç¡®ä¿ FullLeft ç±»åŽçš„è¥¿æ–‡å•è¯å¯ä»¥æ–­è¯ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullLeft_and_Default:
  {
    \@@_punct_if_middle:NTF \g_@@_last_punct_tl
      {
        \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
        \xeCJK_class_group_end: \xeCJK_no_break:
        \@@_punct_glue:NN \c_@@_left_tl  \g_@@_last_punct_tl
      }
      {
        \xeCJK_class_group_end:
        \@@_nobreak_zero_glue:
      }
  }
\cs_new_protected:Npn \@@_nobreak_zero_glue:
  {
    \tex_penalty:D \c_@@_nobreak_penalty_int
    \skip_horizontal:N \c_zero_skip
  }
\cs_new_protected:Npn \@@_zero_glue:
  { \skip_horizontal:N \c_zero_skip }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_FullRight_and_CJK:}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullRight_and_CJK:
  {
    \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
    \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl
    \@@_select_font:
    \CJKglue
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_FullRight_and_Default:}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullRight_and_Default:
  {
    \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
    \xeCJK_class_group_end:
    \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_Default_and_FullLeft:nN}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_Default_and_FullLeft:nN #1#2
  {
    \xeCJK_get_punct_bounds:NN \c_@@_left_tl #2
    \@@_Default_and_FullLeft_glue:N #2
    \xeCJK_class_group_begin:
    \xeCJK_select_punct_font:
    \xeCJK_clear_inter_class_toks:nn {#1} { FullLeft }
    \xeCJK_clear_Boundary_and_CJK_toks:
    \tl_gset:Nn \g_@@_last_punct_tl {#2}
    \@@_punct_rule:NN \c_@@_left_tl #2
    \xeCJK_fallback_punct_symbol:NN
    \CJKpunctsymbol #2
  }
\cs_new_protected:Npn \@@_Default_and_FullLeft_glue:N #1
  { \@@_punct_glue:NN \c_@@_left_tl #1 }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_CJK_and_FullLeft:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_CJK_and_FullLeft:N #1
  {
    \xeCJK_get_punct_bounds:NN \c_@@_left_tl #1
    \@@_CJK_and_FullLeft_glue:N #1
    \tl_gset:Nn \g_@@_last_punct_tl {#1}
    \@@_punct_rule:NN \c_@@_left_tl #1
    \@@_select_punct_font:
    \xeCJK_fallback_punct_symbol:NN
    \CJKpunctsymbol #1
  }
\cs_new_protected:Npn \@@_CJK_and_FullLeft_glue:N #1
  {
    \CJKglue
    \@@_punct_glue:NN \c_@@_left_tl #1
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_Boundary_and_FullLeft:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_Boundary_and_FullLeft:N #1
  {
    \xeCJK_get_punct_bounds:NN \c_@@_left_tl #1
    \@@_Boundary_and_FullLeft_glue:N #1
    \xeCJK_class_group_begin:
    \xeCJK_select_punct_font:
    \xeCJK_clear_Boundary_and_CJK_toks:
    \tl_gset:Nn \g_@@_last_punct_tl {#1}
    \@@_punct_rule:NN \c_@@_left_tl #1
    \xeCJK_fallback_punct_symbol:NN
    \CJKpunctsymbol #1
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_Boundary_and_FullLeft_glue:N}
% \changes{v3.2.0}{2013/05/22}{å½“å…¨è§’å·¦æ&nbsp;‡ç‚¹å‰é¢æ˜¯ \texttt{hlist}ã€\texttt{none}ã€
% \texttt{glue} å’Œ \texttt{penalty} ç­‰èŠ‚ç‚¹æ—¶ï¼ŒåŽ‹ç¼©å…¶å·¦ç©ºç™½ã€‚}
% \changes{v3.2.4}{2013/07/03}{ç»†åŒ–è¾¹ç•Œä¸Žå…¨è§’å·¦æ&nbsp;‡ç‚¹ä¹‹é—´æ˜¯å¦åŽ‹ç¼©ç©ºç™½çš„åˆ¤æ–­ã€‚}
% \changes{v3.2.5}{2013/07/13}{ç»†åŒ–å…¨è§’å·¦æ&nbsp;‡ç‚¹æ˜¯å¦ä½äºŽæ®µé¦–çš„åˆ¤æ–­ã€‚}
% \changes{v3.2.5}{2013/07/13}{å¢žåŠ&nbsp;å¯¹ \pkg{enumitem} å®åŒ…ä¿®æ”¹çš„ \tn{item} çš„åˆ¤æ–­ã€‚}
% æ&nbsp;¹æ® \cs{etex_lastnodetype:D} çš„å€¼è¿›è¡Œåˆ†åˆ«å¤„ç†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_Boundary_and_FullLeft_glue:N #1
  {
    \tl_set_eq:NN \l_@@_alignii_tl \c_@@_left_tl
    \group_begin: \exp_args:NNc \group_end: \cs_if_exist_use:NTF
      { @@_bound_type_ \int_use:N \tex_lastnodetype:D _glue:Nn }
      {#1}
      { \use:n }
      { \@@_punct_glue:NN \c_@@_left_tl #1 }
  }
\tl_new:N \c_@@_alignii_tl
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_bound_type_-1_glue:Nn}
% \cs{etex_lastnodetype:D} ä¸º $-1$ è¡¨ç¤º empty listï¼Œå¸¸å‡ºçŽ°åœ¨ç›’å­çš„èµ·å§‹ä½ç½®ï¼Œ
% åœ¨æ®µè½å‰ä½¿ç”¨ \tn{noindent} å°±æ˜¯è¿™ç§æƒ…å†µã€‚
%    \begin{macrocode}
\cs_new_protected:cpn { @@_bound_type_ -1 _glue:Nn } #1#2
  { \@@_zero_glue: }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_bound_type_1_glue:Nn}
% \changes{v3.8.5}{2020/06/26}{å¢žåŠ&nbsp;ç›’å­é«˜åº¦åˆ¤æ–­ã€‚}
% \changes{v3.8.9}{2022/05/26}{å¢žåŠ&nbsp;ä½äºŽæ®µé¦–çš„æ”¯æž¶ç›’å­åˆ¤æ–­ã€‚}
% $1$ è¡¨ç¤º hlist nodeï¼Œåœ¨è¿™é‡Œç”¨æ¥åˆ¤æ–­æ˜¯å¦ä½äºŽæ®µé¦–ã€‚åŸºäºŽæ­£å¸¸æƒ…å†µä¸‹ï¼Œ\TeX ä¼šåœ¨æ®µè½å¼€å¤´æ’å…¥å®½åº¦ä¸º
% \tn{parindent} çš„æ°´å¹³ç›’å­ç”¨äºŽç¼©è¿›ã€‚
%    \begin{macrocode}
\cs_new_protected:cpn { @@_bound_type_  1 _glue:Nn } #1
  {
    \int_do_while:nNnn \tex_lastnodetype:D = \c_@@_hlist_node
      { \@@_bound_hbox_auxi: }
    \@@_if_last_none:TF
      {
        \dim_case:nnF { \box_wd:N \l_@@_indent_box }
          {
            { \tex_parindent:D } { \@@_bound_hbox_auxii:nn }
            { \c_zero_dim }      { \use_i:nn }
          }
          { \use:nn }
      }
      { \use:nn }
      { \hbox_unpack_drop:N \l_@@_indent_box }
  }
\cs_new_protected:Npn \@@_bound_hbox_auxi:
  {
    \box_set_to_last:N \l_@@_tmp_box
    \hbox_set:Nn \l_@@_indent_box
      {
        \box_use:N \l_@@_tmp_box
        \hbox_unpack:N \l_@@_indent_box
      }
  }
\cs_new_protected:Npn \@@_bound_hbox_auxii:nn
  {
    \dim_compare:nNnTF
      { \box_ht:N \l__xeCJK_tmp_box } = \c_zero_dim
      { \use_i:nn }
      { \use:nn }
  }
\box_new:N \l_@@_indent_box
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_bound_type_11_glue:Nn}
% $11$ è¡¨ç¤º glue nodeï¼Œè¿™é‡Œåˆ¤æ–­çš„ç›®çš„æ˜¯å½“å…¨è§’å·¦æ&nbsp;‡ç‚¹å‡ºçŽ°åœ¨ \LaTeX è¡¨æ&nbsp;¼çš„éž \texttt{p} åˆ—è¡Œé¦–æ—¶ï¼Œ
% èƒ½å¤Ÿå¯¹é½åˆ°å•å…ƒæ&nbsp;¼çš„è¾¹ç•Œã€‚åˆ¤æ–­åŸºäºŽæ&nbsp;‡å‡† \LaTeX è¡¨æ&nbsp;¼çš„åˆ—æ&nbsp;¼å¼ï¼ˆ\tn{@tabclassz}ï¼‰å®šä¹‰ä¸­ï¼Œ
% åœ¨ \texttt{l} åˆ—å’Œ \texttt{r} åˆ—å‰ä¸ºäº†é˜²æ­¢ \tn{tabcolsep} è¢«æ—&nbsp;æ„ \tn{unskip} æŽ‰ï¼Œ
% éƒ½åŠ&nbsp;äº† |\hskip1sp|ï¼Œè€Œ \texttt{c} åˆ—å‰åˆ™æœ‰ \tn{hfil}ã€‚\package{enumitem} å®åŒ…ä¿®æ”¹äº†
% \env{description} çŽ¯å¢ƒä¸­ä½¿ç”¨çš„ \tn{item}ï¼ˆ\tn{enit@postlabel@i}ï¼‰ï¼Œ
% åœ¨è¿™é‡Œèµ·åˆ°å½±å“ä½œç”¨çš„æ˜¯ |\penalty\z@ \hskip\labelsep|ã€‚
%    \begin{macrocode}
\cs_new_protected:cpn { @@_bound_type_ 11 _glue:Nn } #1#2
  {
    \skip_if_finite:nTF { \tex_lastskip:D }
      { \@@_bound_glue_auxi:Nn #1 {#2} }
      { \@@_zero_glue: }
  }
\cs_new_protected:Npn \@@_bound_glue_auxi:Nn #1#2
  {
    \@@_if_last_punct_glue:TF
      { \xeCJK_punct_bound_kern:N #1 }
      { \@@_bound_glue_auxii:n {#2} }
  }
\cs_new_protected:Npn \@@_bound_glue_auxii:n #1
  {
    \skip_set_eq:NN \l_@@_last_skip \tex_lastskip:D
    \skip_if_eq:nnTF { \l_@@_last_skip } { 1sp }
      { \@@_zero_glue: }
      {
        \skip_if_eq:nnTF { \l_@@_last_skip } { \labelsep }
          {
            \tex_unskip:D
            \@@_if_last_penalty:TF
              {
                \int_compare:nNnTF \tex_lastpenalty:D = \c_zero_int
                  { \skip_horizontal:N \l_@@_last_skip }
                  { \skip_horizontal:N \l_@@_last_skip #1 }
              }
              { \skip_horizontal:N \l_@@_last_skip #1 }
          }
          {#1}
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_bound_type_12_glue:Nn}
% $12$ è¡¨ç¤º kern nodeï¼Œç”¨äºŽåˆ¤æ–­ä¹‹å‰çš„å­—ç¬¦æ˜¯å¦æ˜¯ CJK ç±»ï¼Œå¦‚æžœæ˜¯ï¼Œåˆ™æ’å…¥ \tn{CJKglue}ã€‚
%    \begin{macrocode}
\cs_new_protected:cpn { @@_bound_type_ 12 _glue:Nn } #1#2
  {
    \xeCJK_if_last_node:nF { CJK }
      { \xeCJK_if_last_node:nF { CJK-space } { \use_none:nn } }
    \xeCJK_remove_node: \CJKglue
    #2
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_bound_type_13_glue:n}
% $13$ è¡¨ç¤º penalty nodeï¼Œè¿™é‡Œåˆ¤æ–­çš„ç›®çš„æ˜¯å…¨è§’å·¦æ&nbsp;‡ç‚¹å‡ºçŽ°åœ¨ \LaTeX åˆ—è¡¨çŽ¯å¢ƒçš„ \tn{item} åŽé¢æ—¶ï¼Œ
% èƒ½å¯¹é½åˆ°è¾¹ç•Œã€‚åˆ¤æ–­åŸºäºŽ \tn{item} çš„å†…éƒ¨å®šä¹‰ \tn{@item} å¯¹ \tn{everypar} è¿›è¡Œäº†ä¿®æ”¹ï¼Œåœ¨è¿™é‡Œèµ·
% åˆ°å½±å“ä½œç”¨çš„æ˜¯ |\box\@labels \penalty\z@|ã€‚ä»¥ä¸Šåˆ¤æ–­éƒ½æ¯”è¾ƒç²—ç•¥ï¼Œæš‚æ—¶ä¹Ÿæ²¡æœ‰æƒ³èµ·æ›´å¥½çš„åŠžæ³•ã€‚
%    \begin{macrocode}
\cs_new_protected:cpn { @@_bound_type_ 13 _glue:Nn } #1#2
  {
    \@@_if_last_punct_penalty:TF
      { \xeCJK_punct_bound_kern:N #1 }
      {
        \int_compare:nNnTF \tex_lastpenalty:D = \c_zero_int
          {
            \tex_unpenalty:D
            \@@_if_last_hlist:TF
              { \tex_penalty:D \c_zero_int }
              { \tex_penalty:D \c_zero_int #2 }
          }
          {#2}
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_Default_and_FullRight:nN}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_Default_and_FullRight:nN #1#2
  {
    \xeCJK_get_punct_bounds:NN \c_@@_right_tl #2
    \@@_Default_and_FullRight_glue:N #2
    \xeCJK_class_group_begin:
    \xeCJK_select_punct_font:
    \xeCJK_clear_inter_class_toks:nn {#1} { FullRight }
    \xeCJK_clear_Boundary_and_CJK_toks:
    \tl_gset:Nn \g_@@_last_punct_tl {#2}
    \xeCJK_FullRight_symbol:N #2
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_Boundary_and_FullRight:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_Boundary_and_FullRight:N #1
  {
    \xeCJK_get_punct_bounds:NN \c_@@_right_tl #1
    \xeCJK_if_last_punct:TF
      {
        \tl_set_eq:NN \l_@@_alignii_tl \c_@@_right_tl
        \xeCJK_punct_bound_kern:N
      }
      { \@@_Default_and_FullRight_glue:N }
      #1
    \xeCJK_class_group_begin:
    \xeCJK_select_punct_font:
    \xeCJK_clear_Boundary_and_CJK_toks:
    \tl_gset:Nn \g_@@_last_punct_tl {#1}
    \xeCJK_FullRight_symbol:N #1
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_CJK_and_FullRight:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_CJK_and_FullRight:N #1
  {
    \xeCJK_get_punct_bounds:NN \c_@@_right_tl #1
    \@@_CJK_and_FullRight_glue:N #1
    \tl_gset:Nn \g_@@_last_punct_tl {#1}
    \@@_select_punct_font:
    \xeCJK_FullRight_symbol:N #1
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.6.0}{2018/01/23}{è§£å†³æ&nbsp;‡ç‚¹ä¸­é—´è¢«éš”å¼€çš„ç¦åˆ™ä¸ŽåŽ‹ç¼©é—®é¢˜ã€‚}
% \changes{v3.7.3}{2019/04/15}{ä¿®å¤ penalty æ•°å€¼é”™è¯¯ã€‚}
% \changes{v3.8.3}{2020/04/27}{ä¿®å¤ \opt{xCJKecglue} é€‰é¡¹ã€‚}
% \changes{v3.8.6}{2020/10/18}{æ­£ç¡®è¿˜åŽŸæ&nbsp;‡ç‚¹ç¬¦å·åŽçš„ penalty çŠ¶æ€ã€‚}
%
% \begin{macro}{\xeCJK_if_last_punct:TF}
% \changes{v3.6.1}{2018/02/25}{ç»†åŒ–åˆ¤æ–­ã€‚}
% åˆ¤æ–­ä¹‹å‰æ˜¯å¦æ˜¯ä¸€ä¸ªæ&nbsp;‡ç‚¹ç¬¦å·ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_if_last_punct:TF
  {
    \bool_set_false:N \l_@@_last_penalty_bool
    \@@_if_last_glue:TF
      { \@@_if_last_punct_glue:TF }
      {
        \@@_if_last_penalty:TF
         { \@@_if_last_punct_penalty:TF }
         { \use_ii:nn }
      }
  }
\cs_new_protected:Npn \@@_if_last_punct_glue:TF
  {
    \prop_get:NoNTF \g_@@_punct_skip_prop
      { \skip_use:N \tex_lastskip:D } \l_@@_tmp_tl
      { \@@_if_last_punct_glue_auxi:TF }
      { \@@_if_last_punct_glue_auxii:TF }
  }
\cs_new_protected:Npn \@@_if_last_punct_glue_auxi:TF
  {
    \skip_set_eq:NN \l_@@_last_skip \tex_lastskip:D
    \tex_unskip:D
    \int_compare:nNnTF \tex_lastpenalty:D = \c_@@_nobreak_penalty_int
      { \@@_if_last_punct_auxi:TF { \use_i:nn } }
      {
        \xeCJK_if_last_node:TF
          { \@@_if_last_punct_auxii:TF { \use_i:nn } }
          { \use:n }
      }
      { \skip_horizontal:N \l_@@_last_skip \use_ii:nn }
  }
\cs_new_protected:Npn \@@_if_last_punct_glue_auxii:TF
  {
    \group_begin:
      \g_@@_space_factor_int \tex_spacefactor:D
      \skip_if_eq:nnTF { \tex_lastskip:D } { \c_xeCJK_space_skip_tl }
        { \group_end: \@@_if_last_punct_glue_auxiii:TF }
        { \group_end: \use_ii:nn }
  }
\cs_new_protected:Npn \@@_if_last_punct_glue_auxiii:TF
  {
    \skip_set_eq:NN \l_@@_tmp_skip \tex_lastskip:D
    \tex_unskip:D
    \@@_if_last_glue:TF
      {
        \prop_get:NoNTF \g_@@_punct_skip_prop
          { \skip_use:N \tex_lastskip:D } \l_@@_tmp_tl
          { \@@_if_last_punct_glue_auxi:TF { \use_i:nn } }
          { \use:n }
      }
      { \use:n }
      { \skip_horizontal:N \l_@@_tmp_skip \use_ii:nn }
  }
\cs_new_protected:Npn \@@_if_last_punct_penalty:TF
  {
    \int_set_eq:NN \l_@@_last_penalty_int \tex_lastpenalty:D
    \tex_unpenalty:D
    \bool_set_true:N \l_@@_last_penalty_bool
    \@@_if_last_glue:TF
      { \@@_if_last_punct_glue:TF { \use_i:nn } }
      { \use:n }
      { \@@_last_punct_penalty_false:nn }
  }
\cs_new_protected:Npn \@@_last_punct_penalty_false:nn #1#2
  {
    \bool_set_false:N \l_@@_last_penalty_bool
    \tex_penalty:D \l_@@_last_penalty_int
    #2
  }
\cs_new_protected:Npn \@@_if_last_punct_auxi:TF
  {
    \tex_unpenalty:D
    \bool_if:NF \l_@@_last_penalty_bool
      {
        \bool_set_true:N \l_@@_last_penalty_bool
        \int_set_eq:NN \l_@@_last_penalty_int \c_@@_nobreak_penalty_int
      }
    \xeCJK_if_last_node:TF
      { \@@_if_last_punct_auxii:TF { \use_i:nn } }
      { \use:n }
      { \xeCJK_no_break: \use_ii:nn }
  }
\cs_new_protected:Npn \@@_if_last_punct_auxii:TF
  {
    \dim_compare:nNnTF \l_@@_last_kern_dim &gt; \c_zero_dim
      { \@@_if_last_punct_auxiii:TF }
      { \@@_make_node:N \l_@@_last_kern_dim \use_ii:nn }
  }
\cs_new_protected:Npn \@@_if_last_punct_auxiii:TF
  {
    \int_case:nnTF { \tex_XeTeXcharclass:D \l_@@_last_kern_dim }
      {
        { \xeCJK_class_num:n { FullRight } }
        { \tl_set_eq:NN \l_@@_aligni_tl \c_@@_right_tl }
        { \xeCJK_class_num:n { FullLeft } }
        { \tl_set_eq:NN \l_@@_aligni_tl \c_@@_left_tl }
      }
      { \@@_if_last_punct_auxiv:TF }
      { \use_ii:nn }
  }
\cs_new_protected:Npn \@@_if_last_punct_auxiv:TF
  {
    \dim_set_eq:NN \l_@@_tmp_dim \l_@@_last_kern_dim
    \xeCJK_if_last_node:TF
      {
        \tl_gset:Nx \g_@@_last_punct_tl
          { \tex_Uchar:D \l_@@_tmp_dim }
        \dim_set_eq:NN \l_@@_last_bound_dim \l_@@_last_kern_dim
        \use_i:nn
      }
      { \@@_make_node:N \l_@@_tmp_dim \use_ii:nn }
  }
\tl_new:N \l_@@_aligni_tl
\tl_new:N \l_@@_alignii_tl
\int_new:N \l_@@_last_penalty_int
\dim_new:N \l_@@_last_bound_dim
\bool_new:N \l_@@_last_penalty_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJK_if_last_node:TF}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_if_last_node:TF #1#2
  {
    \@@_if_last_kern:TF
      {
        \dim_set_eq:NN \l_@@_last_kern_dim \tex_lastkern:D
        \tex_unkern:D
        \@@_if_last_kern:TF
          {
            \dim_compare:nNnTF \tex_lastkern:D = { - \l_@@_last_kern_dim }
              { \tex_unkern:D #1 }
              { \tex_kern:D \l_@@_last_kern_dim #2 }
          }
          { \tex_kern:D \l_@@_last_kern_dim #2 }
      }
      {#2}
  }
\dim_new:N \l_@@_last_kern_dim
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.6.0}{2018/01/14}
% {ä¿®æ­£æ&nbsp;‡ç‚¹åŒä¸º \texttt{LongPunct} ä¸Ž \texttt{MiddlePunct} æ—¶çš„å®žçŽ°é”™è¯¯ã€‚}
% \changes{v3.6.0}{2018/01/14}
% {\texttt{Default} ç±»ä¸Ž \texttt{MiddlePunct} ä¹‹é—´ä¸åº”è¯¥æœ‰ \tn{CJKglue}ã€‚}
%
% \begin{macro}
% {\@@_CJK_and_FullRight_glue:N,\@@_Default_and_FullRight_glue:N}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_CJK_and_FullRight_glue:N #1
  {
    \@@_punct_if_long:NTF #1
      { \xeCJK_allow_break: }
      { \xeCJK_no_break: }
    \@@_punct_if_middle:NT #1
      {
        \CJKglue
        \@@_punct_glue:NN \c_@@_right_tl #1
        \@@_punct_rule:NN \c_@@_left_tl #1
      }
  }
\cs_new_protected:Npn \@@_Default_and_FullRight_glue:N #1
  {
    \@@_punct_if_long:NTF #1
      { \xeCJK_allow_break: }
      { \xeCJK_no_break: }
    \@@_punct_if_middle:NT #1
      {
        \@@_punct_glue:NN \c_@@_right_tl #1
        \@@_punct_rule:NN \c_@@_left_tl #1
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_FullLeft_and_FullLeft:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullLeft_and_FullLeft:N #1
  {
    \xeCJK_get_punct_bounds:NN \c_@@_left_tl #1
    \xeCJK_get_punct_kerning:oN \g_@@_last_punct_tl #1
    \@@_punct_kern:NN \g_@@_last_punct_tl #1
    \tl_gset:Nn \g_@@_last_punct_tl {#1}
    \xeCJK_fallback_punct_symbol:NN
    \CJKpunctsymbol #1
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_FullLeft_and_FullRight:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullLeft_and_FullRight:N #1
  {
    \xeCJK_get_punct_bounds:NN \c_@@_right_tl #1
    \xeCJK_get_punct_kerning:oN \g_@@_last_punct_tl #1
    \@@_punct_kern:NN \g_@@_last_punct_tl #1
    \tl_gset:Nn \g_@@_last_punct_tl {#1}
    \xeCJK_FullRight_symbol:N #1
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_FullRight_and_FullLeft:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullRight_and_FullLeft:N #1
  {
    \xeCJK_get_punct_bounds:NN \c_@@_left_tl #1
    \xeCJK_get_punct_kerning:oN \g_@@_last_punct_tl #1
    \xeCJK_punct_kern:NN \g_@@_last_punct_tl #1
    \tl_gset:Nn \g_@@_last_punct_tl {#1}
    \xeCJK_fallback_punct_symbol:NN
    \CJKpunctsymbol #1
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_FullRight_and_FullRight:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullRight_and_FullRight:N #1
  {
    \xeCJK_get_punct_bounds:NN \c_@@_right_tl #1
    \xeCJK_get_punct_kerning:oN \g_@@_last_punct_tl #1
    \@@_punct_kern:NN \g_@@_last_punct_tl #1
    \tl_gset:Nn \g_@@_last_punct_tl {#1}
    \xeCJK_FullRight_symbol:N #1
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{å…¨è§’å³æ&nbsp;‡ç‚¹åŽçš„æ–­è¡Œ}
%
% \begin{macro}{CheckFullRight}
% \changes{v3.1.1}{2012/12/02}{å¤„ç†å…¨è§’å³æ&nbsp;‡ç‚¹ä¹‹åŽçš„æ–­è¡Œé—®é¢˜ã€‚}
% é€‰é¡¹è®¾ç½®ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    CheckFullRight .choice: ,
    CheckFullRight / true  .code:n =
      {
        \cs_if_eq:NNF \xeCJK_FullRight_and_Boundary: \xeCJK_check_FullRight:
          {
            \cs_set_eq:NN \@@_save_FullRight_check:
                          \xeCJK_FullRight_and_Boundary:
            \cs_set_eq:NN \@@_save_FullRight_symbol:N
                          \xeCJK_FullRight_symbol:N
            \cs_set_eq:NN \xeCJK_FullRight_and_Boundary:
                          \xeCJK_check_FullRight:
            \cs_set_eq:NN \xeCJK_FullRight_symbol:N
                          \xeCJK_check_FullRight_symbol:Nw
          }
      } ,
    CheckFullRight / false .code:n =
      {
        \cs_if_eq:NNT \xeCJK_FullRight_and_Boundary: \xeCJK_check_FullRight:
          {
            \cs_set_eq:NN \xeCJK_FullRight_and_Boundary:
                          \@@_save_FullRight_check:
            \cs_set_eq:NN \xeCJK_FullRight_symbol:N
                          \@@_save_FullRight_symbol:N
          }
      } ,
    CheckFullRight      .default:n = { true }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_FullRight_symbol:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_FullRight_symbol:N
  {
    \xeCJK_fallback_punct_symbol:NN
    \CJKpunctsymbol
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_check_FullRight:}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_check_FullRight:
  {
    \xeCJK_get_punct_bounds:No \c_@@_right_tl \g_@@_last_punct_tl
    \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
    \group_align_safe_begin:
    \token_case_meaning:NoTF \l_peek_token
      { \l_@@_no_break_cs_case_tl }
      {
        \group_align_safe_end:
        \xeCJK_no_break:
        \group_insert_after:N \xeCJK_no_break:
      }
      { \group_align_safe_end: }
    \exp_after:wN \xeCJK_punct_node:N \g_@@_last_punct_tl
    \xeCJK_class_group_end:
    \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl
  }
\prg_generate_conditional_variant:Nnn \token_case_meaning:Nn { No } { TF , F }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_check_FullRight_symbol:Nw}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_check_FullRight_symbol:Nw #1
  { \peek_remove_spaces:n { \@@_save_FullRight_symbol:N #1 } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_cs_case_keys_define:nNNnn}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_cs_case_keys_define:nNNnn #1#2#3#4#5
  {
    \tl_new:N #2
    \seq_new:N #3
    \keys_define:nn { xeCJK / options }
      {
        #1  .code:n =
          {
            \seq_set_split:Nnn #3 { } {##1}
            \@@_update_cs_case_tl:NNnn #2#3 {#4} {#5}
          } ,
        #1+ .code:n =
          {
            \tl_map_inline:nn {##1}
              { \seq_if_in:NnF #3 {####1} { \seq_put_right:Nn #3 {####1} } }
            \@@_update_cs_case_tl:NNnn #2#3 {#4} {#5}
          } ,
        #1- .code:n =
          {
            \tl_map_inline:nn {##1} { \seq_remove_all:Nn #3 {####1} }
            \@@_update_cs_case_tl:NNnn #2#3 {#4} {#5}
          }
      }
  }
\cs_new_protected:Npn \@@_update_cs_case_tl:NNnn #1#2#3#4
  {
    \tl_clear:N #1
    \seq_map_inline:Nn #2 { \tl_put_right:Nn #1 { {##1} {#3} } }
    #4
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{NoBreakCS}
% è®¾ç½®ä¸èƒ½åœ¨å…¨è§’å³æ&nbsp;‡ç‚¹ä¹‹åŽæ–­è¡Œçš„æŽ§åˆ¶åºåˆ—ã€‚
%    \begin{macrocode}
\xeCJK_cs_case_keys_define:nNNnn { NoBreakCS }
  \l_@@_no_break_cs_case_tl \l_@@_no_break_cs_seq { } { }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJKnobreak}
% \changes{v3.1.1}{2012/12/03}{å¢žåŠ&nbsp; \tn{nobreak} çš„ \pkg{xeCJK} ç‰ˆæœ¬ã€‚}
% ä¸ºä¿é™©èµ·è§ï¼Œæˆ‘ä»¬åœ¨è¿™é‡Œç”¨äº†ä¸€ä¸ªå¾ªçŽ¯ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKnobreak { }
  {
    \bool_set_true:N \l_@@_tmp_bool
    \int_while_do:nNnn \tex_lastnodetype:D = \c_@@_glue_node
      {
        \bool_if:NTF \l_@@_tmp_bool
          {
            \bool_set_false:N \l_@@_tmp_bool
            \skip_set_eq:NN \l_@@_last_skip \tex_lastskip:D
          }
          { \skip_add:Nn \l_@@_last_skip \tex_lastskip:D }
        \tex_unskip:D
      }
    \xeCJK_if_last_node:TF
      {
        \dim_set_eq:NN \l_@@_tmp_dim \l_@@_last_kern_dim
        \xeCJK_if_last_node:TF
          {
            \@@_if_last_glue:TF
              {
                \exp_args:NNNo \tex_unskip:D \xeCJK_no_break:
                \skip_horizontal:n { \skip_use:N \tex_lastskip:D }
              }
            \@@_make_node:N \l_@@_last_kern_dim
          }
          { }
        \@@_make_node:N \l_@@_tmp_dim
      }
      { }
    \xeCJK_no_break:
    \bool_if:NF \l_@@_tmp_bool
      { \skip_horizontal:N \l_@@_last_skip }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{æ®µæœ«å­¤å­—å¤„ç†}
%
% \begin{macro}{CheckSingle}
% å­¤å­—å¤„ç†åŠŸèƒ½é€‰é¡¹ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    CheckSingle .choice: ,
    CheckSingle / true  .code:n =
      {
        \cs_if_eq:NNF \xeCJK_CJK_and_CJK:N \xeCJK_check_single:Nw
          {
            \cs_set_eq:NN \@@_check_single_save:N \xeCJK_CJK_and_CJK:N
            \cs_set_eq:NN \xeCJK_CJK_and_CJK:N \xeCJK_check_single:Nw
          }
      } ,
    CheckSingle / false .code:n =
      {
        \cs_if_eq:NNT \xeCJK_CJK_and_CJK:N \xeCJK_check_single:Nw
          { \cs_set_eq:NN  \xeCJK_CJK_and_CJK:N \@@_check_single_save:N }
      } ,
    CheckSingle      .default:n = { true } ,
    CJKchecksingle      .meta:n = { CheckSingle = true }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.3.1}{2015/04/08}{æ–°é€‰é¡¹ \texttt{WidowPenalty}ã€‚}
%
% \begin{macro}{WidowPenalty}
% è®¾ç½®æ®µæœ«æ±‰å­—çš„ penaltyï¼Œé»˜è®¤å€¼æ˜¯ \num{10000}ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    WidowPenalty .int_set:N = \l_@@_widow_penalty_int ,
    WidowPenalty .default:n = { 10 000 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_widow_penalty:}
% é¢„é˜²æ®µæœ«å­¤å­—è€Œæ’å…¥çš„ penaltyï¼Œå€¼ä¸º \cs{l_@@_widow_penalty_int}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_widow_penalty:
  { \tex_penalty:D \l_@@_widow_penalty_int }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.4.7}{2017/03/20}{ç®€åŒ– \texttt{CheckSingle} çš„å®žçŽ°ï¼Œä¸å†å±•å¼€å®ã€‚}
%
% \begin{macro}[int]{\xeCJK_check_single:Nw}
% \begin{macro}{\@@_check_single_end:N}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_check_single:Nw #1
  {
    \group_align_safe_begin:
    \peek_catcode:NTF \c_catcode_letter_token
      { \xeCJK_check_single:NNw #1 }
      {
        \token_if_other:NTF \l_peek_token
          { \xeCJK_check_single:NNw }
          { \@@_check_single_end:N }
        #1
      }
  }
\cs_new_protected:Npn \@@_check_single_end:N
  {
    \group_align_safe_end:
    \@@_check_single_save:N
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_check_single:NNw}
% \begin{macro}{\@@_check_single_aux:nNNw}
% \changes{v3.1.1}{2012/12/04}{æ”¹è¿›å®šä¹‰ï¼Œå‡å°‘ä½¿ç”¨ \texttt{peek} å‡½æ•°çš„æ¬¡æ•°ã€‚}
% \changes{v3.2.7}{2013/08/30}{ä¸Ž \tn{CJKspace} å…¼å®¹ã€‚}
% ä½¿ç”¨ \cs{group_align_safe_begin:} å’Œ \cs{group_align_safe_end:} æ˜¯ä¸ºäº†é˜²æ­¢åœ¨è¡¨æ&nbsp;¼
% é‡Œé¢æŠ¥é”™ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_check_single:NNw #1#2
  {
    \xeCJK_peek_catcode_ignore_spaces:NTF \c_catcode_letter_token
      {
        \bool_if:NTF \l_@@_peek_ignore_spaces_bool
          {
            \bool_if:NTF \l_@@_reserve_space_bool
              { \@@_check_single_end:N #1 #2 ~ }
              { \@@_check_single_space:NN #1#2 }
          }
          { \@@_check_single_end:N #1 #2 }
      }
      {
        \token_if_other:NTF \l_peek_token
          {
            \bool_if:NTF \l_@@_peek_ignore_spaces_bool
              { \@@_check_single_space:NN }
              { \@@_check_single_end:N }
          }
          {
            \bool_if:NTF \l_@@_peek_ignore_spaces_bool
              { \@@_check_single_aux:nNNw { ~ } }
              { \@@_check_single_aux:nNNw { } }
          }
        #1 #2
      }
  }
\cs_new_protected:Npn \@@_check_single_aux:nNNw #1#2#3
  {
    \token_if_cs:NTF \l_peek_token
      { \xeCJK_check_single_cs:NNn }
      { \xeCJK_check_single_end:NNnw }
    #2 #3 {#1}
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_check_single_end:NNnw}
% \begin{macro}{\@@_check_single_end_aux:NNn,\@@_check_single_end_equation:NNnw}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_check_single_end_aux:NNn #1#2#3
  { \@@_check_single_end:N #1 #2 #3 }
\cs_new_eq:NN \xeCJK_check_single_end:NNnw \@@_check_single_end_aux:NNn
\cs_new_protected:Npn \@@_check_single_end_equation:NNnw
  {
    \token_if_math_toggle:NTF \l_peek_token
      { \xeCJK_check_single_equation:NNnNw }
      { \@@_check_single_end_aux:NNn }
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{PlainEquation}
% \changes{v3.1.1}{2012/12/06}{å¢žåŠ&nbsp; \texttt{PlainEquation} é€‰é¡¹ã€‚}
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    PlainEquation .choice: ,
    PlainEquation / true  .code:n =
      {
        \cs_set_eq:NN \xeCJK_check_single_end:NNnw
                      \@@_check_single_end_equation:NNnw
      } ,
    PlainEquation / false .code:n =
      {
        \cs_set_eq:NN \xeCJK_check_single_end:NNnw
                      \@@_check_single_end_aux:NNn
      } ,
    PlainEquation      .default:n = { true } ,
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_check_single_space:NN}
% \changes{v3.1.1}{2012/12/13}
% {\texttt{CheckSingle} æ”¯æŒæ®µæœ«â€œæ±‰å­—$+$æ±‰å­—$+$ç©ºæ&nbsp;¼$+$æ±‰å­—/æ&nbsp;‡ç‚¹â€çš„å½¢å¼ã€‚}
% \changes{v3.1.2}{2012/12/27}
% {ä½¿ç”¨ \cs{xeCJK_if_CJK_class:NTF} æ¥ä»£æ›¿ \cs{int_case:nnn} åˆ¤æ–­æ˜¯å¦æ˜¯ CJK å­—ç¬¦ç±»ã€‚}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_check_single_space:NN #1#2
  {
    \xeCJK_if_CJK_class:NTF #2
      {
        \xeCJK_if_CJK_class:NTF \l_peek_token
          { \@@_check_single_end:N #1 #2 }
          { \@@_check_single_end:N #1 #2 ~ }
      }
      { \@@_check_single_end:N #1 #2 ~ }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_check_single_equation:NNnNw}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_check_single_equation:NNnNw #1#2#3#4
  {
    \peek_catcode:NTF \c_math_toggle_token
      {
        \xeCJK_widow_penalty: \@@_check_single_end:N #1
        \xeCJK_make_node:n { CJK-widow } #2 #4
      }
      { \@@_check_single_end:N #1 #2#3#4 }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.3}{2013/06/11}
% {è§£å†³ \texttt{CheckSingle} é€‰é¡¹ä¸Ž \pkg{tablists} å®åŒ…çš„å†²çªã€‚}
% \changes{v3.2.4}{2013/06/26}
% {è§£å†³ä½¿ç”¨ \texttt{CheckSingle} æ—¶ï¼ŒæŸäº› \tn{CJKglue} ä¸èƒ½è¢«æ­£ç¡®åŠ&nbsp;å…¥çš„é—®é¢˜ã€‚}
%
% \begin{macro}[int]{\xeCJK_check_single_cs:NNn}
% \changes{v3.3.1}{2015/04/06}{è¡¥å……å¯èƒ½é—æ¼çš„ç©ºæ&nbsp;¼ã€‚}
% åœ¨ä½¿ç”¨ \texttt{CheckSingle} é€‰é¡¹æ—¶ï¼Œåœ¨ \package{tablists} å®åŒ…å®šä¹‰çš„
% \env{tabenum} çŽ¯å¢ƒä¸­ä¼šå‡ºçŽ°ä¸‹é¢çš„é”™è¯¯ï¼š
% \begin{verbatim}
%   ! Forbidden control sequence found while scanning use of \use_ii:nn.
%   &lt;inserted text&gt;
%                   \par
%    l.10 \item
% \end{verbatim}
% åŽŸå›&nbsp;åœ¨äºŽ \env{tabenum} å®žé™…ä¸Šæ˜¯ä¸€ä¸ª \TeX å¯¹é½çŽ¯å¢ƒï¼ˆ\tn{halign}ï¼‰ï¼Œ\tn{par} åœ¨
% å…¶ä¸­è¢«é‡å®šä¹‰ä¸º \tn{cr}ã€‚è€Œåœ¨ä¸‹é¢ \cs{token_case_meaning:NnF} çš„åˆ†æ”¯é‡Œæœ‰å¯¹ \tn{par} çš„
% \tn{ifx} åˆ¤æ–­ã€‚è§£å†³åŠžæ³•æ˜¯å°†åˆ¤æ–­ç”¨ \cs{group_align_safe_begin:} å’Œ
% \cs{group_align_safe_end:} åŒ…èµ·æ¥ã€‚æˆ–è€…æ”¹ç”¨åŽŸè¯­ \cs{tex_par:D} ä½œä¸ºåˆ¤æ–­æ¡ä»¶ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_check_single_cs:NNn #1#2#3
  {
    \token_case_meaning:NoF \l_peek_token
      { \l_@@_check_single_cs_case_tl }
      { \use_iii:nnn }
      { \xeCJK_check_single_env:nnNn }
      {
        \xeCJK_widow_penalty:
        \@@_check_single_end:N #1
        \xeCJK_make_node:n { CJK-widow } #2#3
      }
      { \@@_check_single_end:N #1 #2#3 }
  }
\tl_new:N \l_@@_check_single_cs_case_tl
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_check_single_env:nnNn}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_check_single_env:nnNn #1#2#3#4
  {
    \str_case_e:noTF {#4}
      { \l_@@_inline_env_case_tl }
      {#2}
      {#1}
    #3 {#4}
  }
\prg_generate_conditional_variant:Nnn \str_case_e:nn { no } { TF }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.1.1}{2012/12/04}{å¢žåŠ&nbsp; \texttt{NewLineCS} å’Œ \texttt{EnvCS} é€‰é¡¹ã€‚}
%
% \begin{macro}{NewLineCS}
%    \begin{macrocode}
\xeCJK_cs_case_keys_define:nNNnn { NewLineCS }
  \l_@@_new_line_cs_case_tl \l_@@_new_line_cs_seq
  { \use_ii:nnn }
  {
    \tl_concat:NNN \l_@@_check_single_cs_case_tl
      \l_@@_new_line_cs_case_tl \l_@@_env_cs_case_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{EnvCS}
%    \begin{macrocode}
\xeCJK_cs_case_keys_define:nNNnn { EnvCS }
  \l_@@_env_cs_case_tl \l_@@_env_cs_seq
  { \use:n }
  {
    \tl_concat:NNN \l_@@_check_single_cs_case_tl
      \l_@@_new_line_cs_case_tl \l_@@_env_cs_case_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{InlineEnv}
% \changes{v3.1.1}{2012/12/05}{æ”¹å˜è¡Œå†…çŽ¯å¢ƒçš„è®¾ç½®æ–¹å¼ï¼Œä»Žè€Œä½¿ç”¨ \cs{str_case_x:nnn}
% ä»£æ›¿åŽŸæ¥çš„ \cs{clist_if_in:NnTF} æ¥åˆ¤æ–­æ˜¯å¦æ˜¯è¡Œå†…çŽ¯å¢ƒã€‚}
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    InlineEnv       .code:n =
      {
        \seq_set_from_clist:Nn \l_@@_inline_env_seq {#1}
        \@@_update_inline_env_case_tl:
      } ,
    InlineEnv+      .code:n =
      {
        \clist_map_inline:nn {#1}
          {
            \seq_if_in:NnF \l_@@_inline_env_seq {##1}
              { \seq_put_right:Nn \l_@@_inline_env_seq {##1} }
          }
        \@@_update_inline_env_case_tl:
      } ,
    InlineEnv-      .code:n =
      {
        \clist_map_inline:nn {#1}
          { \seq_remove_all:Nn \l_@@_inline_env_seq {##1} }
        \@@_update_inline_env_case_tl:
      }
  }
\seq_new:N \l_@@_inline_env_seq
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_update_inline_env_case_tl:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_update_inline_env_case_tl:
  {
    \tl_clear:N \l_@@_inline_env_case_tl
    \seq_map_inline:Nn \l_@@_inline_env_seq
      { \tl_put_right:Nn \l_@@_inline_env_case_tl { {##1} { } } }
  }
\tl_new:N \l_@@_inline_env_case_tl
%    \end{macrocode}
% \end{macro}
%
% \subsection{å¢žåŠ&nbsp; CJK å­åˆ†åŒº}
%
% \begin{variable}{\g_@@_CJK_sub_class_seq}
%    \begin{macrocode}
\seq_new:N \g_@@_CJK_sub_class_seq
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\xeCJKDeclareSubCJKBlock}
% å£°æ˜Ž CJK å­åŒºèŒƒå›´ï¼Œ|#1| ä¸ºè‡ªå®šä¹‰åç§°ï¼Œ|#2| ä¸ºå­åŒºçš„ |Unicode| èŒƒå›´ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKDeclareSubCJKBlock
  { s &gt; { \TrimSpaces } m m }
  {
    \xeCJK_declare_sub_char_class:nen { CJK } {#2} {#3}
    \IfBooleanT {#1} { \xeCJKResetPunctClass }
  }
\@onlypreamble \xeCJKDeclareSubCJKBlock
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJKCancelSubCJKBlock,\xeCJKRestoreSubCJKBlock}
% å–æ¶ˆå’Œæ¢å¤å¯¹ CJK å­åŒºçš„å£°æ˜Žã€‚
%    \begin{macrocode}
\bool_new:N \l_@@_sub_cancel_bool
\NewDocumentCommand \xeCJKCancelSubCJKBlock { s m }
  {
    \bool_if:NF \l_@@_sub_cancel_bool
      {
        \bool_set_true:N \l_@@_sub_cancel_bool
        \@@_sub_restore_or_cancel:e {#2}
        \IfBooleanT {#1} { \xeCJKResetPunctClass }
      }
  }
\NewDocumentCommand \xeCJKRestoreSubCJKBlock { s m }
  {
    \bool_if:NT \l_@@_sub_cancel_bool
      {
        \bool_set_false:N \l_@@_sub_cancel_bool
        \@@_sub_restore_or_cancel:e {#2}
        \IfBooleanT {#1} { \xeCJKResetPunctClass }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_sub_restore_or_cancel:n}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_sub_restore_or_cancel:n #1
  {
    \clist_map_inline:nn {#1}
      {
        \int_if_exist:cTF { \@@_class_csname:n { CJK/##1 } }
          {
            \xeCJK_declare_char_class:nn
              { CJK \bool_if:NF \l_@@_sub_cancel_bool { /##1 } }
              { \use:c { g_@@_CJK/##1_range_clist } }
          }
          { \@@_error:nx { SubBlock-undefined } {##1} }
      }
  }
\cs_generate_variant:Nn \@@_sub_restore_or_cancel:n { e }
\@@_msg_new:nn { SubBlock-undefined }
  {
    The~CJK~sub~block~`#1'~is~undefined.\\\\
    Try~to~use~\token_to_str:N \xeCJKDeclareSubCJKBlock \
    to~declare~it.
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_declare_sub_char_class:nnn}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_declare_sub_char_class:nnn #1#2#3
  {
    \int_if_exist:cF { \@@_class_csname:n { #1/#2 } }
      {
        \xeCJK_new_class:n { #1/#2 }
        \@@_set_sub_class_toks:nn {#1} {#2}
        \xeCJK_new_sub_key:n {#2}
      }
    \xeCJK_declare_char_class:nn { #1/#2 } {#3}
  }
\cs_generate_variant:Nn \xeCJK_declare_sub_char_class:nnn { ne }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_sub_class_toks:nn}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_sub_class_toks:nn #1#2
  {
    \seq_map_inline:Nn \g_@@_base_class_seq
      {
        \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } {##1} {#1}  {##1}
        \xeCJK_copy_inter_class_toks:nnnn {##1} { #1/#2 } {##1} {#1}
        \str_if_eq:nnTF {##1} { CJK }
          {
            \xeCJK_pre_inter_class_toks:nnn {##1} { #1/#2 }
              { \@@_switch_font:nn {#1} {#2} }
          }
          {
            \xeCJK_replace_inter_class_toks:nnnn {##1} { #1/#2 }
              { \xeCJK_fallback_symbol:NN }
              {
                \@@_switch_font:nn {#1} {#2}
                \xeCJK_fallback_symbol:NN
              }
          }
      }
    \xeCJK_copy_inter_class_toks:nnnn { #1/#2 } { #1/#2 } {#1} {#1}
    \seq_map_inline:Nn \g_@@_CJK_sub_class_seq
      {
        \xeCJK_copy_inter_class_toks:nnnn { #1/#2  } { #1/##1 } {#1} {#1}
        \xeCJK_copy_inter_class_toks:nnnn { #1/##1 } { #1/#2  } {#1} {#1}
        \xeCJK_pre_inter_class_toks:nnn { #1/#2 } { #1/##1 }
          { \@@_switch_font:nn {#2} {##1} }
        \xeCJK_pre_inter_class_toks:nnn { #1/##1 } { #1/#2 }
          { \@@_switch_font:nn {##1} {#2} }
      }
    \seq_gput_right:Nn \g_@@_CJK_sub_class_seq {#2}
    \@@_save_CJK_class:n { #1/#2 }
    \clist_map_inline:nn { CJK , FullLeft , FullRight , HangulJamo }
      {
        \xeCJK_pre_inter_class_toks:nnn { #1/#2 } {##1}
          { \@@_switch_font:nn {#2} {#1} }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{æ&nbsp;‡ç‚¹å¤„ç†}
%
% \changes{v3.2.7}{2013/08/22}{å®žçŽ°è‡ªå®šä¹‰è¡Œé¦–/å°¾æ&nbsp;‡ç‚¹ç¬¦å·å®½åº¦åŠŸèƒ½ã€‚}
% \changes{v3.7.4}{2019/05/31}{ç®€åŒ–è¡Œé¦–/å°¾æ&nbsp;‡ç‚¹ç¬¦å·å®½åº¦çš„å®žçŽ°ã€‚}
%
% \tn{XeTeXglyphbounds} å¯ä»¥å¾—åˆ°ä¸€ä¸ªå­—ç¬¦çš„å·¦å³è¾¹è·ï¼Œç”¨äºŽæ&nbsp;‡ç‚¹åŽ‹ç¼©ã€‚å¦‚æžœå®ƒä¸å¯ç”¨ï¼Œåˆ™
% åœ¨æ–‡æ¡£ä¸­åªèƒ½ä½¿ç”¨ |plain| è¿™ä¸€æ&nbsp;‡ç‚¹æ&nbsp;¼å¼åŽŸæ&nbsp;·è¾“å‡ºæ&nbsp;‡ç‚¹ã€‚
%    \begin{macrocode}
\cs_if_exist:NF \tex_XeTeXglyphbounds:D
  {
    \@@_msg_new:nn { XeTeX-too-old }
      {
        \token_to_str:N \tex_XeTeXglyphbounds:D \ is~not~defined.\\
        CJK~punctuation~kerning~will~not~be~available.\\\\
        You~have~to~update~XeTeX~to~the~version~0.9995.0~or~later.
      }
    \@@_error:n { XeTeX-too-old }
    \AtEndOfPackage
      {
        \keys_define:nn { xeCJK / options }
          {
            PunctStyle .code:n =
              { \@@_error:nx { punct-style-unknown } {#1} }
          }
        \seq_gclear:N \g_@@_punct_style_seq
        \@@_set_punct_style:n { plain }
      }
  }
%    \end{macrocode}
%
% \begin{macro}{\xeCJKsetwidth}
% æ‰‹åŠ¨è®¾ç½®å‚æ•°ä¸­çš„æ&nbsp;‡ç‚¹ç¬¦å·çš„å®½åº¦ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKsetwidth { s m m }
  {
    \IfBooleanTF {#1}
      {
        \tl_map_inline:en {#2}
          { \tl_gset:cn { g_@@_punct_bound_width/##1/tl } {#3} }
      }
      {
        \tl_map_inline:en {#2}
          { \tl_gset:cn { g_@@_punct_width/##1/tl } {#3} }
      }
  }
\@onlypreamble \xeCJKsetwidth
\cs_generate_variant:Nn \tl_map_inline:nn { e }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJKsetkern}
% æ‰‹åŠ¨è®¾ç½®ç›¸é‚»æ&nbsp;‡ç‚¹çš„è·ç¦»ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKsetkern { m m m }
  { \tl_gset:cn { g_@@_punct/kern/#1/#2/tl } {#3} }
\@onlypreamble \xeCJKsetkern
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\c_@@_left_tl,\c_@@_right_tl}
%    \begin{macrocode}
\tl_const:Nn \c_@@_left_tl  { left }
\tl_const:Nn \c_@@_right_tl { right }
%    \end{macrocode}
% \end{variable}
%
% \changes{v3.2.12}{2014/05/12}{æ–°å¢ž \texttt{RubberPunctSkip} é€‰é¡¹ã€‚}
% \changes{v3.4.0}{2016/05/13}{\texttt{RubberPunctSkip} é€‰é¡¹æœ‰æ–°çš„å€¼ \texttt{plus} å’Œ \texttt{minus}ã€‚}
%
% \begin{macro}
%  {AllowBreakBetweenPuncts,KaiMingPunct,LongPunct,
%   MiddlePunct,PunctWidth,PunctBoundWidth,RubberPunctSkip}
% ç›¸å…³é€‰é¡¹å£°æ˜Žã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    AllowBreakBetweenPuncts .choice: ,
    AllowBreakBetweenPuncts / true  .code:n =
      {
        \bool_set_true:N \l_@@_punct_breakable_bool
        \cs_set_eq:NN \xeCJK_punct_kern:NN \@@_punct_breakable_kern:NN
        \cs_set_eq:NN \@@_punct_bound_kern:N
                      \@@_punct_bound_breakable_kern:N
      } ,
    AllowBreakBetweenPuncts / false .code:n =
      {
        \bool_set_false:N \l_@@_punct_breakable_bool
        \cs_set_eq:NN \xeCJK_punct_kern:NN \@@_punct_kern:NN
        \cs_set_eq:NN \@@_punct_bound_kern:N
                      \@@_nobreak_hskip:N
      } ,
    AllowBreakBetweenPuncts      .default:n = { true } ,
    KaiMingPunct  .code:n = { \@@_set_special_punct:nn { mixed_width } {#1} } ,
    KaiMingPunct+ .code:n = { \@@_add_special_punct:nn { mixed_width } {#1} } ,
    KaiMingPunct- .code:n = { \@@_sub_special_punct:nn { mixed_width } {#1} } ,
    LongPunct     .code:n = { \@@_set_special_punct:nn { long } {#1} } ,
    LongPunct+    .code:n = { \@@_add_special_punct:nn { long } {#1} } ,
    LongPunct-    .code:n = { \@@_sub_special_punct:nn { long } {#1} } ,
    MiddlePunct   .code:n = { \@@_set_special_punct:nn { middle } {#1} } ,
    MiddlePunct+  .code:n = { \@@_add_special_punct:nn { middle } {#1} } ,
    MiddlePunct-  .code:n = { \@@_sub_special_punct:nn { middle } {#1} } ,
    PunctWidth      .tl_gset:N = \g_@@_punct_width_tl ,
    PunctBoundWidth .tl_gset:N = \g_@@_punct_bound_width_tl ,
    PunctWidth      .value_required:n = true ,
    PunctBoundWidth .value_required:n = true ,
    RubberPunctSkip .choice: ,
    RubberPunctSkip      .default:n = { true } ,
    RubberPunctSkip / true  .code:n =
      { \cs_set_eq:NN \@@_use_dim_or_skip:nNN \@@_use_punct_skip:nNN } ,
    RubberPunctSkip / plus  .code:n =
      { \cs_set_eq:NN \@@_use_dim_or_skip:nNN \@@_use_punct_skip_plus:nNN } ,
    RubberPunctSkip / minus .code:n =
      { \cs_set_eq:NN \@@_use_dim_or_skip:nNN \@@_use_punct_skip_minus:nNN } ,
    RubberPunctSkip / false .code:n =
      { \cs_set_eq:NN \@@_use_dim_or_skip:nNN \@@_use_punct_dim:nNN }
  }
\bool_new:N \l_@@_punct_breakable_bool
%    \end{macrocode}
% \end{macro}
%
% ç›¸å…³é€‰é¡¹å®šä¹‰çš„è¾…åŠ©å‡½æ•°ã€‚
%    \begin{macrocode}
\clist_new:N \g_@@_special_punct_clist
\clist_gset:Nn \g_@@_special_punct_clist { mixed_width , long , middle }
\cs_new:Npn \@@_special_punct_seq:n #1 { g_@@_special_punct_#1_seq }
\cs_new:Npn \@@_special_punct_tl:nN #1#2 { g_@@_special_punct_#1_#2_tl }
\clist_map_inline:Nn \g_@@_special_punct_clist
  { \seq_new:c { \@@_special_punct_seq:n {#1} } }
\cs_new_protected:Npn \@@_set_special_punct:nn #1#2
  {
    \seq_map_inline:cn { \@@_special_punct_seq:n {#1} }
      { \cs_undefine:c { \@@_special_punct_tl:nN {#1} {##1} } }
    \seq_gclear:c { \@@_special_punct_seq:n {#1} }
    \tl_map_inline:en {#2}
      {
        \tl_new:c { \@@_special_punct_tl:nN {#1} {##1} }
        \seq_gput_right:cn { \@@_special_punct_seq:n {#1} } {##1}
      }
  }
\cs_new_protected:Npn \@@_add_special_punct:nn #1#2
  {
    \tl_map_inline:en {#2}
      {
        \seq_if_in:cnF { \@@_special_punct_seq:n {#1} } {##1}
          {
            \tl_new:c { \@@_special_punct_tl:nN {#1} {##1} }
            \seq_gput_right:cn { \@@_special_punct_seq:n {#1} } {##1}
          }
      }
  }
\cs_new_protected:Npn \@@_sub_special_punct:nn #1#2
  {
    \tl_map_inline:en {#2}
      {
        \cs_undefine:c { \@@_special_punct_tl:nN {#1} {##1} }
        \seq_gremove_all:cn { \@@_special_punct_seq:n {#1} } {##1}
      }
  }
%    \end{macrocode}
%
% åˆ¤æ–­ä¸€ä¸ªæ&nbsp;‡ç‚¹ç¬¦å·æ˜¯å¦ä¸ºå…¨è§’å³æ&nbsp;‡ç‚¹å’Œé•¿æ&nbsp;‡ç‚¹ç¬¦å·ã€‚
%    \begin{macrocode}
\prg_new_conditional:Npnn \@@_punct_if_right:N #1 { p , T , F , TF }
  {
    \if_int_compare:w \xeCJK_token_value_class:N #1 =
                      \xeCJK_class_num:n { FullRight }
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\clist_map_inline:Nn \g_@@_special_punct_clist
  {
    \exp_args:Nc
    \prg_new_conditional:Npnn { @@_punct_if_#1:N } ##1 { p , T , F , TF }
      {
        \if_cs_exist:w \@@_special_punct_tl:nN {#1} {##1} \cs_end:
          \prg_return_true: \else: \prg_return_false: \fi:
      }
  }
%    \end{macrocode}
%
% ä¸€äº›ç”¨äºŽè®°å½•çš„è¾…åŠ©å‡½æ•°ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_punct_csname:n #1
  { c_@@_\l_xeCJK_current_punct_font_tl/\l_xeCJK_punct_style_tl/#1/tl }
\cs_new:Npn \@@_use_punct_dim:nN #1#2
  { \use:c { \@@_punct_csname:n { dim/#1/#2 } } }
\cs_new:Npn \@@_use_punct_dim:nNN #1#2#3
  { \use:c { \@@_punct_csname:n { dim/#1/#2/#3 } } }
\cs_new:Npn \@@_use_punct_skip:nNN #1#2#3
  { \use:c { \@@_punct_csname:n { skip/#1/#2/#3 } } }
\cs_new:Npn \@@_use_punct_skip_plus:nNN #1#2#3
  { \use:c { \@@_punct_csname:n { skip/plus/#1/#2/#3 } } }
\cs_new:Npn \@@_use_punct_skip_minus:nNN #1#2#3
  { \use:c { \@@_punct_csname:n { skip/minus/#1/#2/#3 } } }
\cs_new_protected:Npn \@@_save_punct_dim:nNn #1#2
  { \@@_save_punct_width_aux:nnnn { dim } {#1} { #1/#2 } }
\cs_new_protected:Npn \@@_save_punct_dim:nNNn #1#2#3
  { \@@_save_punct_width_aux:nnnn { dim } {#1} { #1/#2/#3 } }
\cs_new_protected:Npn \@@_save_punct_skip:nNNn #1#2#3#4
  {
    \@@_save_punct_width_aux:nnnn { skip } {#1} { #1/#2/#3 } {#4}
    \@@_save_punct_width_aux:nnnn { skip } {#1} { plus/#1/#2/#3 } {#4}
    \@@_save_punct_width_aux:nnnn { skip } {#1} { minus/#1/#2/#3 } {#4}
  }
\cs_new_protected:Npn \@@_save_punct_skip:nNNnnn #1#2#3#4#5#6
  {
    \exp_last_unbraced:Ne
    \@@_save_punct_skip_aux:nnnnn
      {
        {#1}
        { #1/#2/#3 }
        { \dim_eval:n {#4} }
        { \dim_max:nn { \c_zero_dim } {#5} }
        { \dim_max:nn { \c_zero_dim } {#6} }
      }
  }
\cs_new_protected:Npn \@@_save_punct_skip_aux:nnnnn #1#2#3#4#5
  {
    \@@_save_punct_width_aux:nnnn { skip } {#1}
      {#2}         { #3 ~ plus ~ #4 ~ minus ~ #5 ~ }
    \@@_save_punct_width_aux:nnnn { skip } {#1}
      { plus/#2 }  { #3 ~ plus ~ #4 ~ }
    \@@_save_punct_width_aux:nnnn { skip } {#1}
      { minus/#2 } { #3 ~ minus ~ #5 ~ }
  }
\cs_new_protected:Npn \@@_save_punct_width_aux:nnnn #1#2#3#4
  {
    \@@_save_punct_width_aux:cen
      { \@@_punct_csname:n { #1/#3 } }
      { \use:c { #1_eval:n } {#4} }
      {#2}
  }
\cs_new_protected:Npn \@@_save_punct_width_aux:Nnn #1#2#3
  {
    \tl_const:Nn #1 {#2}
    \str_if_eq:nnT {#3} { glue }
      { \prop_gput:Nnn \g_@@_punct_skip_prop {#2} { } }
  }
\prop_new:N \g_@@_punct_skip_prop
\prop_gput:Non \g_@@_punct_skip_prop { \skip_use:N \c_zero_skip } { }
\cs_generate_variant:Nn \@@_save_punct_width_aux:Nnn { ce }
\cs_new_eq:NN \@@_use_dim_or_skip:nNN \@@_use_punct_skip:nNN
%    \end{macrocode}
%
% \changes{v3.1.0}{2012/11/14}{ä½¿ç”¨ \pkg{xtemplate} å®åŒ…çš„æœºåˆ¶æ¥ç»„ç»‡æ&nbsp;‡ç‚¹ç¬¦å·çš„å¤„ç†ã€‚}
%
% å®šä¹‰æ&nbsp;‡ç‚¹å¤„ç†æ¨¡æ¿ã€‚
%    \begin{macrocode}
\DeclareObjectType { xeCJK / punctuation } { 0 }
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareTemplateInterface { xeCJK / punctuation } { basic } { 0 }
  {
    enabled-global-setting  : boolean = true ,
    fixed-punct-width       : length  = \c_max_dim ,
    fixed-punct-ratio       : real    = \c_one_fp ,
    mixed-punct-width       : length  = \KeyValue { fixed-punct-width } ,
    mixed-punct-ratio       : real    = \KeyValue { fixed-punct-ratio } ,
    middle-punct-width      : length  = \KeyValue { fixed-punct-width } ,
    middle-punct-ratio      : real    = \KeyValue { fixed-punct-ratio } ,
    fixed-margin-width      : length  = \c_max_dim ,
    fixed-margin-ratio      : real    = \c_one_fp ,
    mixed-margin-width      : length  = \KeyValue { fixed-margin-width } ,
    mixed-margin-ratio      : real    = \KeyValue { fixed-margin-ratio } ,
    middle-margin-width     : length  = \KeyValue { fixed-margin-width } ,
    middle-margin-ratio     : real    = \KeyValue { fixed-margin-ratio } ,
    bound-punct-width       : length  = \c_max_dim ,
    bound-punct-ratio       : real    = \c_nan_fp ,
    bound-margin-width      : length  = \c_max_dim ,
    bound-margin-ratio      : real    = \c_zero_fp ,
    enabled-hanging         : boolean = false ,
    add-min-bound-to-margin : boolean = false ,
    optimize-margin         : boolean = false ,
    margin-minimum          : length  = \c_zero_dim ,
    enabled-kerning         : boolean = true ,
    min-bound-to-kerning    : boolean = false ,
    kerning-total-width     : length  = \c_max_dim ,
    kerning-total-ratio     : real    = 0.75 ,
    optimize-kerning        : boolean = false ,
    same-align-margin       : length  = \c_max_dim ,
    same-align-ratio        : real    = \c_nan_fp ,
    different-align-margin  : length  = \c_max_dim ,
    different-align-ratio   : real    = \c_nan_fp ,
    kerning-margin-width    : length  = \c_max_dim ,
    kerning-margin-ratio    : real    = \c_one_fp ,
    kerning-margin-minimum  : length  = \c_zero_dim
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareTemplateCode { xeCJK / punctuation } { basic } { 0 }
  {
    enabled-global-setting  = \l_@@_enabled_global_setting_bool ,
    fixed-punct-width       = \l_@@_fixed_punct_width_dim ,
    fixed-punct-ratio       = \l_@@_fixed_punct_ratio_fp ,
    mixed-punct-width       = \l_@@_mixed_punct_width_dim ,
    mixed-punct-ratio       = \l_@@_mixed_punct_ratio_fp ,
    middle-punct-width      = \l_@@_middle_punct_width_dim ,
    middle-punct-ratio      = \l_@@_middle_punct_ratio_fp ,
    fixed-margin-width      = \l_@@_fixed_margin_width_dim ,
    fixed-margin-ratio      = \l_@@_fixed_margin_ratio_fp ,
    mixed-margin-width      = \l_@@_mixed_margin_width_dim ,
    mixed-margin-ratio      = \l_@@_mixed_margin_ratio_fp ,
    middle-margin-width     = \l_@@_middle_margin_width_dim ,
    middle-margin-ratio     = \l_@@_middle_margin_ratio_fp ,
    bound-punct-width       = \l_@@_bound_punct_width_dim ,
    bound-punct-ratio       = \l_@@_bound_punct_ratio_fp ,
    bound-margin-width      = \l_@@_bound_margin_width_dim ,
    bound-margin-ratio      = \l_@@_bound_margin_ratio_fp ,
    enabled-hanging         = \l_@@_enabled_hanging_bool ,
    add-min-bound-to-margin = \l_@@_add_min_bound_to_margin_bool ,
    optimize-margin         = \l_@@_optimize_margin_bool ,
    margin-minimum          = \l_@@_margin_minimum_dim ,
    enabled-kerning         = \l_@@_enabled_kerning_bool ,
    min-bound-to-kerning    = \l_@@_min_bound_to_kerning_bool ,
    kerning-total-width     = \l_@@_kerning_total_width_dim ,
    kerning-total-ratio     = \l_@@_kerning_total_ratio_fp ,
    optimize-kerning        = \l_@@_optimize_kerning_bool ,
    same-align-margin       = \l_@@_same_align_margin_dim ,
    same-align-ratio        = \l_@@_same_align_ratio_fp ,
    different-align-margin  = \l_@@_different_align_margin_dim ,
    different-align-ratio   = \l_@@_different_align_ratio_fp ,
    kerning-margin-width    = \l_@@_kerning_margin_width_dim ,
    kerning-margin-ratio    = \l_@@_kerning_margin_ratio_fp ,
    kerning-margin-minimum  = \l_@@_kerning_margin_minimum_dim
  }
  { \AssignTemplateKeys }
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_get_punct_bounds:NN}
% |#1| ä¸º \cs{c_@@_left_tl} æˆ– \cs{c_@@_right_tl}ï¼Œ|#2| ä¸ºæ&nbsp;‡ç‚¹ç¬¦å·ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_get_punct_bounds:NN #1#2
  {
    \tl_if_exist:cF { \@@_punct_csname:n { dim/glue/#1/#2 } }
      { \@@_get_punct_bounds_aux:NN #1 #2 }
  }
\cs_new_protected:Npn \@@_get_punct_bounds_aux:NN
  {
    \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c_@@_punct_style_plain_tl
      { \@@_save_punct_margin_plain:NN }
      { \@@_save_punct_margin:NN }
  }
\cs_new_protected:Npn \xeCJK_get_punct_bounds:No
  { \exp_last_unbraced:NNo \xeCJK_get_punct_bounds:NN }
\cs_new_protected:Npn \@@_save_punct_margin_plain:NN #1#2
  {
    \@@_save_punct_dim:nNNn { glue }   #1 #2 { \c_zero_dim }
    \@@_save_punct_dim:nNNn { offset } #1 #2 { \c_zero_dim }
    \@@_save_punct_dim:nNNn { margin } #1 #2 { \c_zero_dim }
    \@@_save_punct_dim:nNNn { rule } \c_@@_left_tl  {#2} { \c_zero_dim }
    \@@_save_punct_dim:nNNn { rule } \c_@@_right_tl {#2} { \c_zero_dim }
    \@@_save_punct_dim:nNNn { bound } \c_@@_left_tl  {#2} { \c_zero_dim }
    \@@_save_punct_dim:nNNn { bound } \c_@@_right_tl {#2} { \c_zero_dim }
    \@@_save_punct_skip:nNNn { glue }  #1 #2 { \c_zero_skip }
  }
\cs_new_protected:Npn \@@_save_punct_margin:NN #1#2
  {
    \group_begin:
      \xeCJK_select_punct_font:
      \xeCJK_fallback_punct_symbol:NN
      \xeCJK_calc_punct_dimen:N #2
    \group_end:
    \dim_set:Nn \l_@@_bound_dim
      { \@@_use_punct_dim:nNN { bound } #1 #2 }
    \tl_if_eq:NNTF #1 \c_@@_right_tl
      { \tl_set_eq:NN \l_@@_reverse_tl \c_@@_left_tl }
      { \tl_set_eq:NN \l_@@_reverse_tl \c_@@_right_tl }
    \dim_set:Nn \l_@@_reverse_bound_dim
      { \@@_use_punct_dim:nNN { bound } \l_@@_reverse_tl #2 }
    \UseInstance { xeCJK / punctuation } { \l_xeCJK_punct_style_tl }
    \xeCJK_punct_margin_process:NN #1 #2
    \xeCJK_punct_offset_process:NN #1 #2
    \@@_punct_if_long:NT #2
      { \@@_long_punct_kerning:N #2 }
  }
\tl_new:N \l_@@_reverse_tl
\dim_new:N \l_@@_bound_dim
\dim_new:N \l_@@_reverse_bound_dim
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.7.0}{2018/03/12}{ä¿®æ­£é•¿æ&nbsp;‡ç‚¹è¢«éš”å¼€æ—¶çš„åŽ‹ç¼©å¤„ç†é”™è¯¯ã€‚}
%
% \begin{macro}[int]{\@@_long_punct_kerning:N}
% \changes{v3.4.3}{2016/10/27}{è€ƒè™‘ç&nbsp;´æŠ˜å·è¾¹ç•Œä¸ºè´Ÿå€¼çš„æƒ…å†µã€‚}
% ç›¸åŒé•¿æ&nbsp;‡ç‚¹åŽ‹ç¼©ã€‚å¯¹äºŽç&nbsp;´æŠ˜å·ï¼Œè®¡ç®—ä¸¤æ&nbsp;‡ç‚¹ä¹‹é—´çš„ç©ºç™½ï¼Œä¿è¯å®ƒä¸­é—´ä¸è¢«æ–­å¼€ã€‚
% æ³¨æ„ï¼Œç&nbsp;´æŠ˜å·çš„è¾¹ç•Œå¯èƒ½ä¸ºè´Ÿå€¼ï¼ˆæ¯”å¦‚æ–¹æ­£æ–°ä¹¦å®‹ï¼‰ï¼Œæ­¤æ—¶ä¸å¿…åŽ‹ç¼©ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_long_punct_kerning:N #1
  {
    \dim_set:Nn \l_@@_tmp_dim
      {
        \dim_max:nn
          { \l_@@_bound_dim + \l_@@_reverse_bound_dim }
          { \c_zero_dim }
      }
    \@@_save_punct_dim:nNNn { bound_width } #1 #1 { \l_@@_tmp_dim }
    \dim_set:Nn \l_@@_tmp_dim
      {
        \str_case:nnTF {#1}
          { { ^^^^2025 } { } { ^^^^2026 } { } }
          { \c_zero_dim }
          { -\l_@@_tmp_dim }
      }
    \@@_save_punct_dim:nNNn  { kern } #1 #1 { \l_@@_tmp_dim }
    \@@_save_punct_skip:nNNn { kern } #1 #1 { \l_@@_tmp_dim }
    \dim_add:Nn \l_@@_tmp_dim
      { \dim_max:nn { \l_@@_bound_dim } { \c_zero_dim } }
    \@@_save_punct_dim:nNNn  { bound_kern } #1 #1 { \l_@@_tmp_dim }
    \@@_save_punct_skip:nNNn { bound_kern } #1 #1 { \l_@@_tmp_dim }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_get_punct_kerning:NN}
% æ&nbsp;‡ç‚¹åŽ‹ç¼©ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_get_punct_kerning:NN #1#2
  {
    \tl_if_exist:cF { \@@_punct_csname:n { dim/kern/#1/#2 } }
      {
        \tl_if_eq:NNTF \l_xeCJK_punct_style_tl \c_@@_punct_style_plain_tl
          { \@@_save_punct_kerning_plain:NN }
          { \@@_save_punct_kerning:NN }
          #1 #2
      }
  }
\cs_new_protected:Npn \xeCJK_get_punct_kerning:oN
  { \exp_after:wN \xeCJK_get_punct_kerning:NN }
\cs_new_protected:Npn \@@_save_punct_kerning_plain:NN #1#2
  {
    \@@_save_punct_dim:nNNn { kern } #1 #2 { \c_zero_dim }
    \@@_save_punct_dim:nNNn { bound_kern } #1 #2 { \c_zero_dim }
    \@@_save_punct_dim:nNNn { bound_width } #1 #2 { \c_zero_dim }
    \@@_save_punct_skip:nNNn { kern } #1 #2 { \c_zero_skip }
    \@@_save_punct_skip:nNNn { bound_kern } #1 #2 { \c_zero_skip }
  }
\cs_new_protected:Npn \@@_save_punct_kerning:NN
  {
    \UseInstance { xeCJK / punctuation } { \l_xeCJK_punct_style_tl }
    \xeCJK_punct_kerning_process:NN
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_punct_margin_process:NN}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_punct_margin_process:NN #1#2
  {
    \dim_set:Nn \l_@@_tmp_dim
      {
        \bool_if:NTF \l_@@_enabled_global_setting_bool
          {
            \cs_if_exist_use:cF { g_@@_punct_width/#2/tl }
              {
                \tl_if_empty:NTF \g_@@_punct_width_tl
                  { \@@_calc_punct_width:N #2 }
                  { \g_@@_punct_width_tl }
              }
          }
          { \@@_calc_punct_width:N #2 }
      }
    \dim_set:Nn \l_@@_margin_dim
      {
        \dim_max:nn
          { \l_@@_margin_minimum_dim }
          {
            \dim_compare:nNnTF \l_@@_tmp_dim &lt; \c_max_dim
              {
                \@@_punct_if_middle:NTF #2
                  {
                    (   \l_@@_tmp_dim
                      - ( \@@_use_punct_dim:nN { dimen } #2 )
                    ) / 2
                  }
                  {
                    \bool_if:NTF \l_@@_optimize_margin_bool
                      {
                        \dim_max:nn
                          {
                            \dim_min:nn
                              { \l_@@_bound_dim }
                              { \l_@@_reverse_bound_dim }
                          }
                      }
                      { \use:n }
                      {
                          \l_@@_tmp_dim
                        - \l_@@_reverse_bound_dim
                        - ( \@@_use_punct_dim:nN { dimen } #2 )
                      }
                  }
              }
              {
                \bool_if:NTF \l_@@_optimize_margin_bool
                  { \dim_min:nn { \l_@@_bound_dim } }
                  { \use:n }
                  { \@@_calc_margin_width:N #2 }
              }
          }
      }
    \@@_save_punct_dim:nNNn { margin } #1 #2 { \l_@@_margin_dim }
  }
\dim_new:N \l_@@_margin_dim
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_calc_punct_width:N}
%    \begin{macrocode}
\cs_new:Npn \@@_calc_punct_width:N #1
  {
    \@@_punct_if_middle:NTF #1
      { \@@_punct_width_or_ratio:nN { middle } }
      {
        \@@_punct_if_mixed_width:NTF #1
          { \@@_punct_width_or_ratio:nN { mixed } }
          { \@@_punct_width_or_ratio:nN { fixed } }
      }
      #1
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_calc_margin_width:N}
%    \begin{macrocode}
\cs_new:Npn \@@_calc_margin_width:N #1
  {
    \@@_punct_if_middle:NTF #1
      {
        \dim_compare:nNnTF \l_@@_middle_margin_width_dim &lt; \c_max_dim
          { \l_@@_middle_margin_width_dim }
          {
            \@@_dim_ratio:Nn \l_@@_middle_margin_ratio_fp
              { ( \l_@@_bound_dim + \l_@@_reverse_bound_dim ) / 2 }
          }
      }
      {
        \@@_punct_if_mixed_width:NTF #1
          { \@@_margin_width_or_ratio:n { mixed } }
          { \@@_margin_width_or_ratio:n { fixed } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_dim_ratio:Nn}
%    \begin{macrocode}
\cs_new:Npn \@@_dim_ratio:Nn #1#2
  { \fp_to_dim:n { #1 \dim_to_fp:n {#2} } }
\cs_generate_variant:Nn \@@_dim_ratio:Nn { c }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.8.9}{2022/05/26}{ä¿®æ­£å±…ä¸­æ&nbsp;‡ç‚¹æ‚¬æŒ‚é”™è¯¯ã€‚}
%
% \begin{macro}[int]{\xeCJK_punct_offset_process:NN}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_punct_offset_process:NN #1#2
  {
    \dim_set:Nn \l_@@_tmp_dim
      {
        \bool_if:NTF \l_@@_enabled_global_setting_bool
          {
            \cs_if_exist_use:cF { g_@@_punct_bound_width/#2/tl }
              {
                \tl_if_empty:NTF \g_@@_punct_bound_width_tl
                  { \@@_punct_width_or_ratio:nN { bound } #2 }
                  { \g_@@_punct_bound_width_tl }
              }
          }
          { \@@_punct_width_or_ratio:nN { bound } #2 }
      }
    \dim_set:Nn \l_@@_tmp_dim
      {
        \bool_if:NTF \l_@@_enabled_hanging_bool
          { \use:n }
          { \dim_max:nn { \l_@@_margin_minimum_dim } }
          {
            \dim_compare:nNnTF \l_@@_tmp_dim &lt; \c_max_dim
              {
                \@@_punct_if_middle:NTF #2
                  {
                      \l_@@_tmp_dim
                    - \l_@@_margin_dim
                    - ( \@@_use_punct_dim:nN { dimen } #2 )
                  }
                  {
                      \l_@@_tmp_dim
                    - \l_@@_reverse_bound_dim
                    - ( \@@_use_punct_dim:nN { dimen } #2 )
                  }
              }
              {
                \bool_if:NTF \l_@@_optimize_margin_bool
                  { \dim_min:nn { \l_@@_bound_dim } }
                  { \use:n }
                  { \@@_margin_width_or_ratio:n { bound } }
              }
          }
      }
    \@@_save_punct_dim:nNNn { offset } #1 #2
      { \l_@@_tmp_dim }
    \@@_save_punct_dim:nNNn { rule } #1 #2
      { \l_@@_tmp_dim - \l_@@_bound_dim }
    \@@_save_punct_dim:nNNn { rule } \l_@@_reverse_tl #2
      { \l_@@_tmp_dim - \l_@@_reverse_bound_dim }
    \@@_save_punct_dim:nNNn { glue } #1 #2
      { \l_@@_margin_dim - \l_@@_tmp_dim }
    \@@_save_punct_skip:nNNnnn { glue } #1 #2
      { \l_@@_margin_dim - \l_@@_tmp_dim }
      {
        \@@_punct_if_middle:NTF #2
          {
            ( \@@_use_punct_dim:nN { width } #2 -
              \@@_use_punct_dim:nN { dimen } #2 ) / 2
            - \l_@@_margin_dim
          }
          { \l_@@_bound_dim - \l_@@_margin_dim }
      }
      {
        \@@_punct_if_middle:NTF #2
          { \l_@@_margin_dim / 2 }
          { \l_@@_margin_dim - \l_@@_reverse_bound_dim }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.7}{2013/08/25}{æ&nbsp;‡ç‚¹å®½åº¦è®¾ç½®ç¦ç”¨æ¯”ä¾‹é€‰é¡¹çš„å€¼æ”¹ä¸º \texttt{nan}ã€‚}
% \changes{v3.8.0}{2020/02/10}{åº”ç”¨ \cs{fp_if_nan:nTF}ã€‚}
%
% \begin{macro}{\@@_punct_width_or_ratio:nN}
%    \begin{macrocode}
\cs_new:Npn \@@_punct_width_or_ratio:nN #1#2
  {
    \dim_compare:nNnTF { \use:c { l_@@_#1_punct_width_dim } } &lt; \c_max_dim
      { \use:c { l_@@_#1_punct_width_dim } }
      {
        \fp_if_nan:nTF { \use:c { l_@@_#1_punct_ratio_fp } }
          { \c_max_dim }
          {
            \@@_dim_ratio:cn
              { l_@@_#1_punct_ratio_fp }
              { \@@_use_punct_dim:nN { width } #2 }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_margin_width_or_ratio:n}
%    \begin{macrocode}
\cs_new:Npn \@@_margin_width_or_ratio:n #1
  {
    \dim_compare:nNnTF { \use:c { l_@@_#1_margin_width_dim } } &lt; \c_max_dim
      { \use:c { l_@@_#1_margin_width_dim } }
      {
        \@@_dim_ratio:cn
          { l_@@_#1_margin_ratio_fp }
          { \l_@@_bound_dim }
      }
    \bool_if:NT \l_@@_add_min_bound_to_margin_bool
      { + \dim_min:nn \l_@@_bound_dim \l_@@_reverse_bound_dim }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.4.4}{2016/11/30}{ä¸åŽ‹ç¼©é•¿æ&nbsp;‡ç‚¹ä¸Žå…¶ä»–æ&nbsp;‡ç‚¹çš„é—´è·ã€‚}
%
% \begin{macro}[int]{\xeCJK_punct_kerning_process:NN}
% å½“æ&nbsp;‡ç‚¹ä¹‹ä¸€ä¸ºé•¿æ&nbsp;‡ç‚¹æ—¶ï¼Œä¸å¿…è¿›è¡ŒåŽ‹ç¼©ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_punct_kerning_process:NN #1#2
  {
    \dim_set:Nn \l_@@_margin_dim
      { \@@_original_kerning_margin:NN #1 #2 }
    \dim_set:Nn \l_@@_minimum_bound_dim
      { \@@_punct_min_bound:NN #1 #2 }
    \@@_punct_if_long:NTF #1
      { \bool_set_false:N \l_@@_enabled_kerning_bool }
      {
        \@@_punct_if_long:NT #2
          { \bool_set_false:N \l_@@_enabled_kerning_bool }
      }
    \dim_set:Nn \l_@@_kerning_margin_dim
      {
        \bool_if:NTF \l_@@_enabled_global_setting_bool
          {
            \cs_if_exist_use:cF { g_@@_punct/kern/#1/#2/tl }
              { \@@_punct_kerning_process_aux:NN #1 #2 }
          }
          { \@@_punct_kerning_process_aux:NN #1 #2 }
      }
    \@@_save_kerning:nnNN { kern } { bound }  #1 #2
    \@@_save_punct_dim:nNNn { bound_width } #1 #2
      { \l_@@_kerning_margin_dim - \l_@@_tmp_dim }
    \@@_punct_if_right:NTF #1
      {
        \@@_punct_if_right:NTF #2
          { \@@_save_kerning:nnnNN { bound_kern } { offset } { bound } }
          { \@@_save_kerning:nnNN  { bound_kern } { offset } }
      }
      {
        \@@_punct_if_right:NTF #2
          { \@@_save_kerning:nnNN  { bound_kern } { bound } }
          { \@@_save_kerning:nnnNN { bound_kern } { bound } { offset } }
      }
      #1 #2
  }
\cs_new:Npn \@@_punct_kerning_process_aux:NN #1#2
  {
    \bool_if:NTF \l_@@_enabled_kerning_bool
      { \@@_calc_kerning_margin:NN #1 #2 }
      { \l_@@_margin_dim }
  }
\dim_new:N \l_@@_minimum_bound_dim
\dim_new:N \l_@@_kerning_margin_dim
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.4.0}{2016/05/12}{æ&nbsp;‡ç‚¹ç¬¦å·çš„åŽ‹ç¼©é‡èƒ½ä¼¸é•¿åˆ°åŽŸå§‹ç©ºç™½ï¼Œèƒ½æ”¶ç¼©åˆ°è¾ƒå°è¾¹è·ã€‚}
%
% \begin{macro}{\@@_save_kerning:nnNN}
% ç›¸é‚»ä¸¤ä¸ªæ&nbsp;‡ç‚¹ç¬¦å·çš„é—´è·èƒ½ä¼¸é•¿åˆ°åŽŸå§‹ç©ºç™½ï¼ˆæœªåŽ‹ç¼©æ—¶çš„çŠ¶æ€ï¼‰ï¼Œèƒ½æ”¶ç¼©åˆ°è¾ƒå°è¾¹è·ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_save_kerning:nnNN #1#2
  { \@@_save_kerning:nnnNN {#1} {#2} {#2} }
\cs_new_protected:Npn \@@_save_kerning:nnnNN #1#2#3#4#5
  {
    \dim_set:Nn \l_@@_tmp_dim
      {
          \l_@@_kerning_margin_dim
        - ( \@@_use_punct_dim:nNN {#2} \c_@@_right_tl #4 )
        - ( \@@_use_punct_dim:nNN {#3} \c_@@_left_tl  #5 )
      }
    \@@_save_punct_dim:nNNn {#1} #4 #5 { \l_@@_tmp_dim }
    \@@_save_punct_skip:nNNnnn {#1} #4 #5
      { \l_@@_tmp_dim }
      { \l_@@_margin_dim - \l_@@_kerning_margin_dim }
      { \l_@@_kerning_margin_dim - \l_@@_minimum_bound_dim }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_original_kerning_margin:NN}
% ç›¸é‚»ä¸¤ä¸ªæ&nbsp;‡ç‚¹ç¬¦å·ä¹‹é—´çš„æœ¬æ¥ç©ºç™½å®½åº¦ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_original_kerning_margin:NN #1#2
  {
    \dim_eval:n
      {
        \@@_use_punct_dim:nNN
          { \@@_punct_if_right:NTF #1 { margin } { bound } } \c_@@_right_tl #1
        +
        \@@_use_punct_dim:nNN
          { \@@_punct_if_right:NTF #2 { bound } { margin } } \c_@@_left_tl #2
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_calc_kerning_margin:NN,\@@_calc_kerning_margin_aux:NN}
%    \begin{macrocode}
\cs_new:Npn \@@_calc_kerning_margin:NN #1#2
  {
    \dim_max:nn
      { \l_@@_kerning_margin_minimum_dim }
      {
        \bool_if:NTF \l_@@_min_bound_to_kerning_bool
          { \l_@@_minimum_bound_dim }
          {
            \bool_if:NTF \l_@@_optimize_kerning_bool
              { \dim_max:nn { \l_@@_minimum_bound_dim } }
              { \use:n }
              { \@@_calc_kerning_margin_aux:NN #1 #2 }
          }
      }
  }
\cs_new:Npn \@@_calc_kerning_margin_aux:NN #1#2
  {
    \dim_compare:nNnTF \l_@@_kerning_total_width_dim &lt; \c_max_dim
      { \@@_calc_kerning_margin:nNN \l_@@_kerning_total_width_dim }
      {
        \fp_if_nan:nTF { \l_@@_kerning_total_ratio_fp }
          {
            \xeCJK_if_same_class:NNTF #1 #2
              { \@@_kerning_width_or_ratio:nNN { same } }
              { \@@_kerning_width_or_ratio:nNN { different } }
          }
          {
            \@@_calc_kerning_margin:nNN
              {
                \@@_dim_ratio:Nn \l_@@_kerning_total_ratio_fp
                  {
                    \@@_use_punct_dim:nN { width } #1 +
                    \@@_use_punct_dim:nN { width } #2
                  }
              }
          }
      }
      #1 #2
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_kerning_width_or_ratio:nNN}
%    \begin{macrocode}
\cs_new:Npn \@@_kerning_width_or_ratio:nNN #1#2#3
  {
    \dim_compare:nNnTF { \use:c { l_@@_#1_align_margin_dim } } &lt; \c_max_dim
      { \use:c { l_@@_#1_align_margin_dim } }
      {
        \fp_if_nan:nTF { \use:c { l_@@_#1_align_ratio_fp } }
          {
            \dim_compare:nNnTF \l_@@_kerning_margin_width_dim &lt; \c_max_dim
              { \l_@@_kerning_margin_width_dim \use_none:n }
              { \@@_dim_ratio:Nn \l_@@_kerning_margin_ratio_fp }
          }
          { \@@_dim_ratio:cn { l_@@_#1_align_ratio_fp } }
          { \l_@@_margin_dim }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_punct_min_bound:NN}
%    \begin{macrocode}
\cs_new:Npn \@@_punct_min_bound:NN #1#2
  {
    \dim_max:nn
      {
        \dim_min:nn
          { \@@_use_punct_dim:nNN { bound } \c_@@_left_tl  #1 }
          { \@@_use_punct_dim:nNN { bound } \c_@@_right_tl #1 }
      }
      {
        \dim_min:nn
          { \@@_use_punct_dim:nNN { bound } \c_@@_left_tl  #2 }
          { \@@_use_punct_dim:nNN { bound } \c_@@_right_tl #2 }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_calc_kerning_margin:nNN}
% |#2| å’Œ |#3| ä¸ºç›¸é‚»çš„ä¸¤ä¸ªæ&nbsp;‡ç‚¹ï¼Œ|#1| ä¸ºè¦ç¡®å®šçš„ç›¸é‚»ä¸¤ä¸ªæ&nbsp;‡ç‚¹æ€»å…±å&nbsp;çš„å®½åº¦ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_calc_kerning_margin:nNN #1#2#3
  {
    \dim_eval:n
      {
          (#1)
        - ( \@@_use_punct_dim:nNN
              { \@@_punct_if_right:NTF #2 { bound } { margin } }
              \c_@@_left_tl #2 )
        - ( \@@_use_punct_dim:nNN
              { \@@_punct_if_right:NTF #3 { margin } { bound } }
              \c_@@_right_tl #3 )
        - ( \@@_use_punct_dim:nN { dimen } #2 )
        - ( \@@_use_punct_dim:nN { dimen } #3 )
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_calc_punct_dimen:N}
% è®¡ç®—æ&nbsp;‡ç‚¹çš„å·¦å³å®žé™…è¾¹è·å’Œå®žé™…å°ºå¯¸ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_calc_punct_dimen:N #1
  {
    \@@_save_punct_dim:nNNn { bound } \c_@@_left_tl #1
      { \xeCJK_glyph_bounds:NN 1 #1 }
    \@@_save_punct_dim:nNNn { bound } \c_@@_right_tl #1
      { \xeCJK_glyph_bounds:NN 3 #1 }
    \@@_save_punct_dim:nNn { width } #1
      { \tex_fontcharwd:D \tex_font:D `#1 }
    \@@_save_punct_dim:nNn { dimen } #1
      {
        ( \@@_use_punct_dim:nN { width } #1 )                 -
        ( \@@_use_punct_dim:nNN { bound } \c_@@_left_tl  #1 ) -
        ( \@@_use_punct_dim:nNN { bound } \c_@@_right_tl #1 )
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_glyph_bounds:NN}
% ç”¨ \tn{XeTeXglyphbounds} å–å¾—æ&nbsp;‡ç‚¹ç¬¦å·çš„ä¸Šä¸‹å·¦å³ç©ºç™½ã€‚
%    \begin{macrocode}
\cs_new:Npn \xeCJK_glyph_bounds:NN #1#2
  { \tex_XeTeXglyphbounds:D #1 ~ \tex_XeTeXcharglyph:D `#2 \exp_stop_f: }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.8.3}{2020/04/09}{é‡æž„ \opt{PunctStyle} é€‰é¡¹ï¼Œå®Œå…¨å±•å¼€å‚æ•°ã€‚}
%
% \begin{macro}{PunctStyle}
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  { PunctStyle .code:n = \exp_args:Nx \@@_set_punct_style:n {#1} }
\cs_new_protected:Npn \@@_set_punct_style:n #1
  {
    \IfInstanceExistTF { xeCJK / punctuation } {#1}
      { \tl_set:Nn \l_xeCJK_punct_style_tl {#1} }
      {
        \prop_get:NnNF \c_@@_punct_style_alias_prop
          {#1} \l_xeCJK_punct_style_tl
          { \@@_error:nx { punct-style-unknown } {#1} }
      }
  }
\prop_const_from_keyval:Nn \c_@@_punct_style_alias_prop
  {
    halfwidth     = banjiao ,
    fullwidth     = quanjiao ,
    mixedwidth    = kaiming ,
    marginkerning = hangmobanjiao ,
    plain         = plain
  }
\tl_new:N \l_xeCJK_punct_style_tl
\tl_const:Nn \c_@@_punct_style_plain_tl { plain }
\@@_msg_new:nn { punct-style-unknown }
  {
    Punctuation~style~"#1"~is~unknown. \\\\
    The~available~styles~are~listed~as~follow.\\\\
    "plain,~\seq_use:Nnnn \g_@@_punct_style_seq
      { ~and~ } { ,~ } { ,~and~ }".\\
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_trim_spaces:n}
% \pkg{xparse} å¤„ç†å‡½æ•°ï¼Œå…ˆå®Œå…¨å±•å¼€å‚æ•°å†åˆ&nbsp;é™¤ä¸¤è¾¹ç©ºæ&nbsp;¼ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_trim_spaces:n #1
  {
    \tl_set:Nx \ProcessedArgument
      { \exp_args:Ne \tl_trim_spaces:n {#1} }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJKDeclarePunctStyle}
% å®šä¹‰æ–°çš„æ&nbsp;‡ç‚¹å¤„ç†é£Žæ&nbsp;¼ï¼Œå·²ç»å­˜åœ¨çš„åŒåé£Žæ&nbsp;¼å°†è¢«è¦†ç›–ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKDeclarePunctStyle
  { &gt; { \@@_trim_spaces:n } m m }
  {
    \IfInstanceExistTF { xeCJK / punctuation } {#1}
      { \@@_warning:nx { punct-style-already-defined } {#1} }
      { \seq_gput_right:Nn \g_@@_punct_style_seq {#1} }
    \DeclareInstance { xeCJK / punctuation } {#1} { basic } {#2}
  }
\seq_new:N \g_@@_punct_style_seq
\@@_msg_new:nn { punct-style-already-defined }
  {
    Punctuation~style~"#1"~is~already~defined!. \\\\
    The~existing~style~of~"#1"~will~be~overwritten.\\
  }
\@onlypreamble \xeCJKDeclarePunctStyle
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJKEditPunctStyle}
% å¯¹å·²æœ‰çš„æ&nbsp;‡ç‚¹å¤„ç†é£Žæ&nbsp;¼è¿›è¡Œä¿®æ”¹ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKEditPunctStyle
  { &gt; { \@@_trim_spaces:n } m m }
  {
    \IfInstanceExistTF { xeCJK / punctuation } {#1}
      { \EditInstance { xeCJK / punctuation } {#1} {#2} }
      { \@@_error:nx { punct-style-unknown } {#1} }
  }
\@onlypreamble \xeCJKEditPunctStyle
%    \end{macrocode}
% \end{macro}
%
% é»˜è®¤è®¾ç½®å³ä¸ºå…¨è§’æ&nbsp;¼å¼ã€‚
%    \begin{macrocode}
\xeCJKDeclarePunctStyle { quanjiao } { }
%    \end{macrocode}
%
%    \begin{macrocode}
\xeCJKDeclarePunctStyle { hangmobanjiao } { enabled-kerning = false }
%    \end{macrocode}
%
%    \begin{macrocode}
\xeCJKDeclarePunctStyle { banjiao }
  {
    fixed-punct-ratio   = 0.5  ,
    optimize-margin     = true ,
    kerning-total-ratio = 0.5  ,
    optimize-kerning    = true
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\xeCJKDeclarePunctStyle { kaiming }
  {
    fixed-punct-ratio   = 0.5  ,
    mixed-punct-ratio   = 0.8  ,
    optimize-margin     = true ,
    kerning-total-ratio = 0.5  ,
    optimize-kerning    = true
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\xeCJKDeclarePunctStyle { CCT }
  {
    fixed-punct-ratio   = 0.7  ,
    optimize-margin     = true ,
    kerning-total-ratio = 0.6  ,
    optimize-kerning    = true
  }
%    \end{macrocode}
%
% \subsection{åŽå¤‡å­—ä½“}
%
% \changes{v3.8.4}{2020/05/31}{é‡æž„åŽå¤‡å­—ä½“çš„å®žçŽ°ï¼Œä¿®æ­£æ&nbsp;‡ç‚¹ç¬¦å·æ—&nbsp;åŽå¤‡å­—ä½“çš„é—®é¢˜ã€‚}
%
% \begin{macro}{AutoFallBack}
% åŽå¤‡å­—ä½“çš„å®åŒ…é€‰é¡¹å£°æ˜Žã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    AutoFallBack .choice: ,
    AutoFallBack / true  .code:n =
      {
        \cs_set_eq:NN \xeCJK_fallback_symbol:NN
                      \@@_fallback_symbol:NN
        \cs_set_eq:NN \xeCJK_fallback_punct_symbol:NN
                      \@@_fallback_punct_symbol:NN
        \cs_set_eq:NN \xeCJK_clear_fallback_font:
                      \@@_clear_fallback_font:
      } ,
    AutoFallBack / false .code:n =
      {
        \xeCJK_cs_clear:N \xeCJK_fallback_symbol:NN
        \xeCJK_cs_clear:N \xeCJK_fallback_punct_symbol:NN
        \xeCJK_cs_clear:N \xeCJK_clear_fallback_font:
      } ,
    AutoFallBack      .default:n = { true } ,
    fallback             .meta:n = { AutoFallBack = true }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_fallback_symbol:NN,\xeCJK_fallback_punct_symbol:NN}
% æµ‹è¯•å½“å‰å­—ä½“ä¸­æ˜¯å¦å­˜åœ¨å½“å‰å­—ç¬¦ï¼Œå¦‚å­˜åœ¨åˆ™ç›´æŽ¥è¾“å‡ºï¼Œå¦åˆ™å¯ç”¨åŽå¤‡å­—ä½“ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_fallback_symbol:NN #1#2
  {
    \xeCJK_reset_fallback_font:
    \xeCJK_glyph_if_exist:NF #2
      { \@@_fallback_symbol_aux:NN }
    #1#2
  }
\cs_new_protected:Npn \@@_fallback_punct_symbol:NN #1#2
  {
    \xeCJK_reset_fallback_font:
    \xeCJK_glyph_if_exist:NF #2
      { \@@_fallback_punct_symbol_aux:NN }
    #1#2
  }
\cs_new_eq:NN \xeCJK_fallback_symbol:NN       \prg_do_nothing:
\cs_new_eq:NN \xeCJK_fallback_punct_symbol:NN \prg_do_nothing:
\cs_new_protected:Npn \@@_fallback_symbol_aux:NN
  {
    \@@_fallback_symbol_aux:nnNN
      { \CJK@family }
      { \l_xeCJK_family_tl }
  }
\cs_new_protected:Npn \@@_fallback_punct_symbol_aux:NN
  {
    \@@_fallback_symbol_aux:nnNN
      { \CJK@punctfamily }
      { \l_xeCJK_punct_family_tl }
  }
\cs_new_protected:Npn \@@_fallback_symbol_aux:nnNN
  {
    \cs_set_protected:Npx \xeCJK_reset_fallback_font:
      {
        \tex_the:D \tex_font:D
        \xeCJK_clear_fallback_font:
      }
    \exp_args:Nee \@@_fallback_loop:nnNN
  }
\cs_new_protected:Npn \@@_clear_fallback_font:
  { \cs_set_eq:NN \xeCJK_reset_fallback_font: \prg_do_nothing: }
\cs_new_eq:NN \xeCJK_reset_fallback_font: \prg_do_nothing:
\cs_new_eq:NN \xeCJK_clear_fallback_font: \prg_do_nothing:
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.5.1}{2017/11/16}{ä¿®æ­£ fallback å­—ä½“åŽæ—&nbsp;æ³•å¿½ç•¥ç©ºæ&nbsp;¼çš„é”™è¯¯ã€‚}
% \changes{v3.2.12}{2014/05/12}{æ›´æ–° \cs{int_to_Hex:n}ã€‚}
%
% \begin{macro}[int]{\@@_fallback_loop:nnNN}
% \changes{v3.1.0}{2012/11/19}{è°ƒæ•´å¤‡ç”¨å­—ä½“çš„å¾ªçŽ¯æ–¹å¼ã€‚}
% \changes{v3.2.4}{2013/06/30}
% {ä½¿ \tn{CJKfamilydefault} çš„ \texttt{FallBack} è®¾ç½®å…¨å±€å¯ç”¨ã€‚}
% å¾ªçŽ¯æµ‹è¯•åŽå¤‡å­—ä½“æ˜¯å¦åŒ…å«å­—ç¬¦ |#1|ã€‚è‹¥åŽå¤‡å­—ä½“ä¸­å­˜åœ¨è¯¥å­—ç¬¦æˆ–è€…å†æ²¡æœ‰åŽå¤‡å­—ä½“ï¼Œåˆ™
% ç»“æŸå¾ªçŽ¯ã€‚å½“å‰å­—ä½“æ—æ²¡æœ‰å¤‡ç”¨å­—ä½“æ—¶ï¼Œä½¿ç”¨ \tn{CJKfamilydefault} çš„è®¾ç½®ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_fallback_loop:nnNN
  {
    \cs_set_eq:NN \@@_fallback_loop:TF \use_i:nn
    \@@_fallback_loop:nnnNN { FallBack }
  }
\cs_new_protected:Npn \@@_fallback_loop:nnnNN #1#2#3
  {
    \xeCJK_select_fallback_font:nnn {#1} {#2} {#3}
    \@@_fallback_loop:TF
      { \@@_fallback_loop_aux:nnnNN }
      { \@@_fallback_missing_glyph:nnnNN }
      {#1} {#2} {#3}
  }
\cs_new_protected:Npn \@@_fallback_loop_aux:nnnNN #1#2#3#4#5
  {
    \xeCJK_glyph_if_exist:NF #5
      { \@@_fallback_loop:nnnNN { #1/FallBack } {#2} {#3} }
    #4#5
  }
\cs_new_protected:Npn \@@_fallback_missing_glyph:nnnNN #1#2#3#4#5
  {
    \@@_warning:nxxx { missing-glyph } {#1} {#2} {#5}
    #4#5
  }
\cs_new_protected:Npn \xeCJK_select_fallback_font:nnn #1#2
  {
    \@@_select_fallback_font:cnnn
      { \@@_font_csname:n { #2/#1 } } {#1} {#2}
  }
\cs_new_protected:Npn \@@_select_fallback_font:Nnnn #1
  {
    \cs_if_exist:NF #1
      { \@@_fallback_font_initial:NNnnn }
    #1 \use_none:nnn
  }
\cs_generate_variant:Nn \@@_select_fallback_font:Nnnn { c }
\cs_new_protected:Npn \@@_fallback_font_initial:NNnnn #1#2#3#4#5
  {
    \xeCJK_family_if_exist:nTF { #5/#3 }
      { \@@_font_initial:Nn #1 { #5/#3 } }
      { \@@_fallback_font_initial_auxi:Nnnn #1 {#5} {#3} {#4} }
    #1
  }
\cs_new_protected:Npn \@@_fallback_font_initial_auxi:Nnnn #1
  {
    \exp_args:NNe \@@_fallback_font_initial_auxii:Nnnnn
      #1 { \CJKfamilydefault }
  }
\cs_new_protected:Npn \@@_fallback_font_initial_auxii:Nnnnn #1#2#3
  {
    \str_if_eq:nnTF {#2} {#3}
      { \@@_fallback_loop_end:Nnnn }
      { \@@_fallback_font_initial_auxiii:Nnnn }
      #1 {#2}
  }
\cs_new_protected:Npn \@@_fallback_font_initial_auxiii:Nnnn #1#2
  {
    \xeCJK_family_if_exist:nTF {#2}
      { \@@_fallback_font_initial_auxiv:Nnnn }
      { \@@_fallback_loop_end:Nnnn }
      #1 {#2}
  }
\cs_new_protected:Npn \@@_fallback_font_initial_auxiv:Nnnn #1#2#3#4
  {
    \@@_font_initial:Nn #1 {#2}
    \exp_args:Nc \@@_fallback_font_initial_auxiii:Nnnn
      { \@@_font_csname:n { #4/#3/FallBack } }
      { #2/FallBack } { #3/FallBack } {#4}
  }
\cs_new_eq:NN \@@_fallback_loop:TF \use_i:nn
\cs_new_protected:Npn \@@_fallback_loop_end:Nnnn #1#2#3#4
  { \cs_gset_eq:NN #1 \@@_fallback_loop_end: }
\cs_new_protected:Npn \@@_fallback_loop_end:
  { \cs_set_eq:NN \@@_fallback_loop:TF \use_ii:nn }
\@@_msg_new:nn { missing-glyph }
  {
    CJKfamily~`\@@_msg_family_map:n {#2}'~(#1)~
    does~not~contain~glyph~`#3'~
    ( U + \int_to_Hex:n { `#3 } )~\msg_line_context:.
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setCJKfallbackfamilyfont}
% \changes{v3.4.3}{2016/11/18}{å…è®¸å­—ä½“å±žæ€§å¯é€‰é¡¹åœ¨åŽçš„æ–°è¯­æ³•ã€‚}
%    \begin{macrocode}
\NewDocumentCommand \setCJKfallbackfamilyfont { m o m }
  {
    \@@_pass_args:nnnn
      { \xeCJK_set_family_fallback:nnn {#1} } {#2} {#3}
      { }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_set_family_fallback:nnn}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_set_family_fallback:nnn #1#2#3
  {
    \group_begin:
    \tl_set:Nn \l_@@_fallback_family_tl {#1}
    \prop_get:NoNF \g_@@_family_font_name_prop
      \l_@@_fallback_family_tl \l_@@_font_name_tl
      { \tl_clear:N \l_@@_font_name_tl }
    \clist_set:Nn \l_@@_public_options_clist {#2}
    \clist_map_function:nN {#3} \@@_set_family_fallback:n
    \group_end:
  }
\cs_new_protected:Npn \@@_set_family_fallback:n #1
  {
    \tl_put_right:Nn \l_@@_fallback_family_tl { /FallBack }
    \@@_get_sub_features:on \l_@@_fallback_family_tl {#1}
    \clist_concat:NNN \l_@@_sub_font_options_clist
      \l_@@_public_options_clist
      \l_@@_sub_font_options_clist
    \exp_args:Nooo \xeCJK_set_family:nnn
      \l_@@_fallback_family_tl
      \l_@@_sub_font_options_clist
      \l_@@_sub_font_name_tl
  }
\tl_new:N \l_@@_fallback_family_tl
\clist_new:N \l_@@_public_options_clist
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{CJK å­—ä½“æ—å£°æ˜Žæ–¹å¼}
%
%    \begin{macrocode}
\bool_new:N \g_@@_auto_fake_bold_bool
\bool_new:N \g_@@_auto_fake_slant_bool
\fp_new:N \g_@@_embolden_factor_fp
\fp_new:N \g_@@_slant_factor_fp
%    \end{macrocode}
%
% \begin{macro}{AutoFakeBold, AutoFakeSlant,EmboldenFactor,SlantFactor}
% ä¼ªç²—ä½“å’Œä¼ªæ–œä½“çš„å®åŒ…é€‰é¡¹å£°æ˜Žã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    AutoFakeBold .choices:nn = { true , false }
      { \use:c { bool_gset_ \l_keys_choice_tl :N } \g_@@_auto_fake_bold_bool } ,
    AutoFakeBold / unknown .code:n =
      {
        \bool_gset_true:N  \g_@@_auto_fake_bold_bool
        \fp_gset:Nn \g_@@_embolden_factor_fp { \l_keys_value_tl }
      } ,
    AutoFakeBold  .default:n  = { true } ,
    AutoFakeSlant .choices:nn = { true , false }
      { \use:c { bool_gset_ \l_keys_choice_tl :N } \g_@@_auto_fake_slant_bool } ,
    AutoFakeSlant / unknown  .code:n =
      {
        \bool_gset_true:N  \g_@@_auto_fake_slant_bool
        \fp_gset:Nn \g_@@_slant_factor_fp { \l_keys_value_tl }
      } ,
    AutoFakeSlant  .default:n = { true } ,
    EmboldenFactor .fp_gset:N = \g_@@_embolden_factor_fp ,
    SlantFactor    .fp_gset:N = \g_@@_slant_factor_fp ,
    BoldFont  .meta:n = { AutoFakeBold  = true } ,
    boldfont  .meta:n = { AutoFakeBold  = true } ,
    SlantFont .meta:n = { AutoFakeSlant = true } ,
    slantfont .meta:n = { AutoFakeSlant = true }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.4}{2013/07/02}{å†…éƒ¨è°ƒæ•´åˆ†åŒºå­—ä½“çš„è®¾ç½®æ–¹æ³•ã€‚}
%
% \begin{macro}[int]{\xeCJK_new_sub_key:n}
% \begin{variable}{\g_@@_sub_key_seq}
% ç”¨äºŽå®šä¹‰ CJK å­åŒºå­—ä½“å’Œå¤‡ç”¨å­—ä½“çš„é€‰é¡¹ã€‚
%    \begin{macrocode}
\seq_new:N \g_@@_sub_key_seq
\cs_new_protected:Npn \xeCJK_new_sub_key:n #1
  {
    \seq_gput_right:Nn \g_@@_sub_key_seq {#1}
    \keys_define:nn { xeCJK / features }
      {
        #1 .code:n =
          {
            \tl_if_blank:nTF {##1}
              {
                \prop_clear:N \l_@@_sub_key_prop
                \tl_set:Nx \l_@@_sub_family_name_tl
                  { \l_@@_family_name_tl /#1 }
                \clist_remove_all:Nn \l_@@_font_options_clist {#1}
              }
              {
                \tl_clear:N \l_@@_sub_family_name_tl
                \str_if_eq:nnTF {##1} { * }
                  { \prop_put:Nnn \l_@@_sub_key_prop {#1} { \q_no_value } }
                  { \@@_get_sub_features:nn {#1} {##1} }
              }
          } ,
        #1 .default:n = { }
      }
  }
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
% \changes{v3.2.4}{2013/07/02}{æ”¹è¿›èŽ·å–åˆ†åŒºå­—ä½“å±žæ€§çš„åŠžæ³•ã€‚}
%
% \begin{macro}{\@@_get_sub_features:nn,\@@_get_sub_features:w}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_get_sub_features:nn #1#2
  {
    \tl_set:Nx \l_@@_tmp_tl { \xeCJK_tl_remove_outer_braces:n {#2} }
    \clist_clear:N \l_@@_sub_font_options_clist
    \exp_after:wN \@@_get_sub_features:w \l_@@_tmp_tl
      \q_mark [ \q_nil ] \q_mark \q_stop
    \tl_if_empty:NTF \l_@@_sub_font_name_tl
      { \tl_set_eq:NN \l_@@_sub_font_name_tl \l_@@_font_name_tl }
      { \tl_replace_all:Nno \l_@@_sub_font_name_tl { * } \l_@@_font_name_tl }
    \prop_put:Nne \l_@@_sub_key_prop {#1}
      {
        { \exp_not:o \l_@@_sub_font_options_clist }
        { \exp_not:o \l_@@_sub_font_name_tl }
      }
  }
\cs_new_protected:Npn \@@_get_sub_features:w #1 [#2] #3 \q_mark #4 \q_stop
  {
    \quark_if_nil:nTF {#2}
      { \tl_set_eq:NN \l_@@_sub_font_name_tl \l_@@_tmp_tl }
      {
        \tl_set:Nx \l_@@_sub_font_name_tl
          { \xeCJK_tl_remove_outer_braces:n {#3} }
        \tl_if_empty:NTF \l_@@_sub_font_name_tl
          { \tl_set_eq:NN \l_@@_sub_font_name_tl \l_@@_tmp_tl }
          { \clist_set:Nn \l_@@_sub_font_options_clist {#2} }
      }
  }
\tl_new:N \l_@@_sub_family_name_tl
\tl_new:N \l_@@_sub_font_name_tl
\clist_new:N \l_@@_sub_font_options_clist
\cs_generate_variant:Nn \@@_get_sub_features:nn { o }
\cs_generate_variant:Nn \tl_replace_all:Nnn { Nno }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{FallBack}
%    \begin{macrocode}
\xeCJK_new_sub_key:n { FallBack }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{BoldFont,ItalicFont}
% è°ƒç”¨å­—ä½“çš„å±žæ€§å£°æ˜Žï¼ŒåŒ \pkg{fontspec} å®åŒ…ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / features }
  {
    BoldFont   .tl_set:N = \l_@@_font_name_bf_tl ,
    ItalicFont .tl_set:N = \l_@@_font_name_it_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.6}{2013/07/31}{\texttt{AutoFakeBold} å’Œ \texttt{AutoFakeSlant}
% é€‰é¡¹ç›´æŽ¥ä½¿ç”¨ \pkg{fontspec} çš„è®¾ç½®ï¼Œä¿®æ­£ä¸èƒ½è°ƒç”¨ç›¸åº”å®žé™…å­—ä½“çš„é—®é¢˜ã€‚}
%
% \begin{macro}[int]{AutoFakeBold, AutoFakeSlant}
%    \begin{macrocode}
\keys_define:nn { xeCJK / features }
  {
    AutoFakeBold  .choice: ,
    AutoFakeBold / true    .code:n =
      {
        \bool_set_true:N \l_@@_auto_fake_bold_bool
        \fp_set_eq:NN \l_@@_embolden_factor_fp \g_@@_embolden_factor_fp
      } ,
    AutoFakeBold / false   .code:n =
      { \bool_set_false:N \l_@@_auto_fake_bold_bool } ,
    AutoFakeBold / unknown .code:n =
      {
        \bool_set_true:N \l_@@_auto_fake_bold_bool
        \fp_set:Nn \l_@@_embolden_factor_fp { \l_keys_value_tl }
      } ,
    AutoFakeBold .default:n  = { true } ,
    AutoFakeSlant  .choice: ,
    AutoFakeSlant / true    .code:n =
      {
        \bool_set_true:N \l_@@_auto_fake_slant_bool
        \fp_set_eq:NN \l_@@_slant_factor_fp \g_@@_slant_factor_fp
      } ,
    AutoFakeSlant / false   .code:n =
      { \bool_set_false:N \l_@@_auto_fake_slant_bool } ,
    AutoFakeSlant / unknown .code:n =
      {
        \bool_set_true:N \l_@@_auto_fake_slant_bool
        \fp_set:Nn \l_@@_slant_factor_fp { \l_keys_value_tl }
      } ,
    AutoFakeSlant .default:n  = { true }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_family_initial:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_family_initial:
  {
    \int_gincr:N \g_@@_family_int
    \prop_clear:N \l_@@_sub_key_prop
    \tl_clear:N \l_@@_font_name_bf_tl
    \tl_clear:N \l_@@_font_name_it_tl
    \tl_clear:N \l_@@_sub_family_name_tl
    \clist_clear:N \l_@@_fontspec_options_clist
    \bool_set_eq:NN \l_@@_auto_fake_bold_bool  \g_@@_auto_fake_bold_bool
    \bool_set_eq:NN \l_@@_auto_fake_slant_bool \g_@@_auto_fake_slant_bool
    \fp_set_eq:NN \l_@@_embolden_factor_fp \g_@@_embolden_factor_fp
    \fp_set_eq:NN \l_@@_slant_factor_fp    \g_@@_slant_factor_fp
  }
\int_new:N \g_@@_family_int
\prop_new:N \l_@@_sub_key_prop
\clist_new:N \l_@@_fontspec_options_clist
\bool_new:N \l_@@_auto_fake_bold_bool
\bool_new:N \l_@@_auto_fake_slant_bool
\fp_new:N \l_@@_embolden_factor_fp
\fp_new:N \l_@@_slant_factor_fp
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_set_family:nnn}
% è®¾ç½®ä¸€ä¸ª CJK æ–°å­—ä½“æ—ï¼Œä¸Ž \tn{newfontfamily} ç±»ä¼¼ï¼Œå¢žåŠ&nbsp; |FallBack| é€‰é¡¹ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_set_family:nnn #1#2#3
  {
    \group_begin:
    \@@_set_family_initial:
    \tl_set:Nn \l_@@_family_name_tl {#1}
    \clist_set:Nn \l_@@_font_options_clist {#2}
    \tl_set:Nn \l_@@_font_name_tl {#3}
    \clist_concat:NNN \l_@@_font_options_clist
      \g_@@_default_features_clist \l_@@_font_options_clist
    \keys_set_known:noN { xeCJK / features }
      \l_@@_font_options_clist \l_@@_fontspec_options_clist
    \@@_binding_sub_family:
    \@@_parse_font_shape:
    \@@_check_family:o \l_@@_family_name_tl
    \@@_gset_family_cs:n { \l_@@_family_name_tl }
    \@@_save_family_info:
    \@@_set_sub_block_family:
    \group_end:
  }
\tl_new:N \l_@@_family_name_tl
\tl_new:N \l_@@_font_name_tl
\clist_new:N \l_@@_font_options_clist
\cs_generate_variant:Nn \xeCJK_set_family:nnn { e , o }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.7.2}{2019/03/27}{åˆ&nbsp;é™¤å®šä¹‰æ–°å­—ä½“æ—æ—¶è¿‡æ»¤é‡å¤é€‰é¡¹çš„åŠŸèƒ½ã€‚}
%
% \begin{macro}{\@@_binding_sub_family:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_binding_sub_family:
  {
    \tl_if_empty:NF \l_@@_sub_family_name_tl
      { \tl_set_eq:NN \l_@@_family_name_tl \l_@@_sub_family_name_tl }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_gset_family_cs:n}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_gset_family_cs:n #1
  {
    \cs_gset_protected:cpx { \@@_family_csname:n {#1} }
      {
        \group_begin:
        \exp_not:n { \cs_set_eq:NN \xeCJK@fontfamily \use_none:n }
        \exp_not:n { \fontspec_gset_family:Nnn \g_@@_fontspec_family_tl }
          { \exp_not:o \l_@@_fontspec_options_clist }
          { \exp_not:o \l_@@_font_name_tl }
        \@@_gset_family_nfss_cs:no
          {#1} { \exp_not:N \g_@@_fontspec_family_tl }
        \group_end:
        \tl_set_eq:NN \exp_not:N \l_@@_fontspec_family_tl
                      \exp_not:N \g_@@_fontspec_family_tl
      }
  }
\tl_new:N \g_@@_fontspec_family_tl
\tl_new:N \l_@@_fontspec_family_tl
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_check_family:n}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_check_family:n #1
  {
    \prop_gpop:NnNT \g_@@_family_font_name_prop {#1} \l_@@_tmp_tl
      {
        \prop_gpop:NnNT \g_@@_family_name_prop {#1} \l_@@_tmp_tl
          {
            \cs_undefine:c { \@@_family_csname:n {#1} }
            \cs_undefine:c { \@@_family_nfss_csname:n {#1} }
          }
        \@@_warning:nxx { CJKfamily-redef } {#1} { \l_@@_tmp_tl }
      }
  }
\cs_generate_variant:Nn \@@_check_family:n { o }
\@@_msg_new:nn { CJKfamily-redef }
  { Redefining~CJKfamily~`\@@_msg_family_map:n {#1}'~(#2). }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_parse_font_shape:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_parse_font_shape:
  {
    \tl_if_blank:oTF \l_@@_font_name_bf_tl
      {
        \bool_if:NT \l_@@_auto_fake_bold_bool
          {
            \clist_put_right:Nx \l_@@_fontspec_options_clist
              { AutoFakeBold = { \fp_use:N \l_@@_embolden_factor_fp } }
          }
      }
      {
        \clist_put_right:Nx \l_@@_fontspec_options_clist
          { BoldFont = { \exp_not:o \l_@@_font_name_bf_tl } }
      }
    \tl_if_blank:oTF \l_@@_font_name_it_tl
      {
        \bool_if:NT \l_@@_auto_fake_slant_bool
          {
            \clist_put_right:Nx \l_@@_fontspec_options_clist
              { AutoFakeSlant = { \fp_use:N \l_@@_slant_factor_fp } }
          }
      }
      {
        \clist_put_right:Nx \l_@@_fontspec_options_clist
          { ItalicFont = { \exp_not:o \l_@@_font_name_it_tl } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}
%  {\g_@@_family_name_prop,\g_@@_family_font_name_prop,\g_@@_family_font_options_prop}
%    \begin{macrocode}
\prop_new:N \g_@@_family_name_prop
\prop_new:N \g_@@_family_font_name_prop
\prop_new:N \g_@@_family_font_options_prop
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\@@_save_family_info:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_save_family_info:
  {
    \exp_args:Nooo \@@_save_family_info:nnn
      \l_@@_family_name_tl
      \l_@@_font_name_tl
      \l_@@_font_options_clist
  }
\cs_new_protected:Npn \@@_save_family_info:nnn #1#2#3
  {
    \prop_gput:Nnn \g_@@_family_font_name_prop    {#1} {#2}
    \prop_gput:Nnn \g_@@_family_font_options_prop {#1} {#3}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_sub_block_family:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_sub_block_family:
  {
    \prop_if_empty:NF \l_@@_sub_key_prop
      {
        \prop_map_function:NN
          \l_@@_sub_key_prop
          \@@_set_sub_block_family:nn
      }
  }
\cs_new_protected:Npn \@@_set_sub_block_family:nn #1#2
  {
    \tl_set:Nx \l_@@_sub_family_name_tl { \l_@@_family_name_tl/#1 }
    \quark_if_no_value:nTF {#2}
      { \@@_copy_sub_family:n {#1} }
      { \xeCJK_set_family:onn \l_@@_sub_family_name_tl #2 }
  }
\cs_new_protected:Npn \@@_copy_sub_family:n #1
  {
    \@@_check_family:o \l_@@_sub_family_name_tl
    \prop_get:NoNT \g_@@_family_font_name_prop
      \l_@@_family_name_tl \l_@@_sub_font_name_tl
      {
        \prop_gput:Noo \g_@@_family_font_name_prop
          \l_@@_sub_family_name_tl \l_@@_sub_font_name_tl
      }
    \prop_get:NoNT \g_@@_family_font_options_prop
      \l_@@_family_name_tl \l_@@_sub_font_options_clist
      {
        \clist_remove_all:Nn \l_@@_sub_font_options_clist { #1 = * }
        \prop_gput:Noo \g_@@_family_font_options_prop
          \l_@@_sub_family_name_tl \l_@@_sub_font_options_clist
      }
    \cs_gset_protected:cpx
      { \@@_family_csname:n { \l_@@_sub_family_name_tl } }
      {
        \xeCJK_family_if_exist:eT { \l_@@_family_name_tl }
          {
            \@@_gset_family_nfss_cs:no
              { \l_@@_sub_family_name_tl }
              { \exp_not:N \l_@@_fontspec_family_tl }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_copy_family:nn,\@@_copy_family:ee}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_copy_family:nn #1#2
  {
    \xeCJK_family_if_exist:nT {#2}
      {
        \prop_gput:Nno \g_@@_family_name_prop
          {#1} \l_@@_fontspec_family_tl
        \tl_map_inline:nn
          {
            \g_@@_family_font_name_prop
            \g_@@_family_font_options_prop
          }
          {
            \prop_get:NnNT ##1 {#2} \l_@@_tmp_tl
              { \prop_gput:Nno ##1 {#1} \l_@@_tmp_tl }
          }
        \cs_gset_eq:cc
          { \@@_family_nfss_csname:n {#1} }
          { \@@_family_nfss_csname:n {#2} }
      }
  }
\cs_generate_variant:Nn \@@_copy_family:nn { ee }
%    \end{macrocode}
% \end{macro}
%
% \subsection{å­—ä½“åˆ‡æ¢}
%
% \begin{macro}[int]{\xeCJK_select_font:}
% \begin{variable}[int]{\l_xeCJK_current_font_tl}
% ç¼“å­˜å½“å‰å­—ä½“çš„åŽŸå§‹æ&nbsp;¼å¼ï¼Œä»¥åŠ&nbsp;é€Ÿç¼–è¯‘ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_font_csname:n #1
  { xeCJK/#1/\f@series/\f@shape/\f@size }
\tl_new:N \l_xeCJK_current_font_tl
\tl_set:No \l_xeCJK_current_font_tl
  { \@@_font_csname:n { \CJK@family } }
\cs_new_protected:Npn \xeCJK_select_font:
  {
    \@@_select_font:cn
      { \l_xeCJK_current_font_tl }
      { \l_xeCJK_family_tl }
  }
\cs_new_protected:Npn \@@_select_font:Nn #1#2
  {
    \xeCJK_clear_fallback_font:
    \cs_if_exist:NF #1 { \@@_font_initial:Nn #1 {#2} }
    #1
  }
\cs_generate_variant:Nn \@@_select_font:Nn { c }
\tl_new:N \l_@@_current_coor_tl
\cs_new_eq:NN \xeCJK@setfont \xeCJK_select_font:
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
% \changes{v3.8.1}{2020/02/14}{ä¿®å¤ \cs{l_xeCJK_current_font_tl} æ&nbsp;‡è®°é”™è¯¯ã€‚}
%
% \begin{macro}{\@@_font_initial:Nn}
% æ³¨æ„è¦å°† \tn{selectfont} æ”¾åœ¨åˆ†ç»„ä¸­è°ƒç”¨ï¼Œé˜²æ­¢ \tn{f@series} ç­‰å­—ä½“å‚æ•°è¢«ä¿®æ”¹ï¼Œ
% å¯¼è‡´ \cs{l_xeCJK_current_font_tl} æ&nbsp;‡è®°å‰åŽä¸ä¸€è‡´ï¼Œå¼•å‘é”™è¯¯ï¼ˆè§~\ghissue{486}ï¼‰ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_font_initial:Nn #1#2
  {
    \group_begin:
      \@@_font_initial_hook:
      \@@_family_use:n {#2}
      \xeCJK_font_gset_to_current:N #1
    \group_end:
  }
\cs_new_protected:Npn \@@_font_initial_hook:
  { \tl_use:N \g_@@_font_initial_hook_tl }
\cs_new_protected:Npn \@@_gadd_font_initial_hook:n
  { \tl_gput_right:Nn \g_@@_font_initial_hook_tl }
\tl_new:N \g_@@_font_initial_hook_tl
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_select_punct_font:}
% \begin{variable}[int]{\l_xeCJK_current_punct_font_tl}
% åˆ‡æ¢æ&nbsp;‡ç‚¹ç¬¦å·å­—ä½“ã€‚
%    \begin{macrocode}
\cs_new_eq:NN \xeCJK_select_punct_font: \xeCJK_select_font:
\cs_new_protected:Npn \@@_select_punct_font_aux:
  {
    \@@_select_font:cn
      { \l_xeCJK_current_punct_font_tl }
      { \l_xeCJK_punct_family_tl }
  }
\tl_new:N \CJK@punctfamily
\tl_new:N \l_xeCJK_punct_family_tl
\tl_new:N \l_xeCJK_current_punct_font_tl
\tl_set:Nn \CJK@punctfamily { \CJK@family }
\tl_set:Nn \l_xeCJK_punct_family_tl { \l_xeCJK_family_tl }
\tl_set:No \l_xeCJK_current_punct_font_tl
  { \@@_font_csname:n { \CJK@punctfamily } }
\cs_new_eq:NN \@@_select_font: \prg_do_nothing:
\cs_new_eq:NN \@@_select_punct_font: \prg_do_nothing:
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
% \begin{macro}{\@@_switch_font:nn}
% \changes{v3.1.0}{2012/11/18}{æ”¹è¿›å®šä¹‰ï¼ŒåŠ&nbsp;å¿«åˆ‡æ¢é€Ÿåº¦ã€‚}
% ä¸¤ä¸ª CJK åˆ†åŒºä¹‹é—´çš„å­—ä½“åˆ‡æ¢ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_switch_font:nn #1#2
  {
    \str_if_eq:nnF {#1} {#2}
      {
        \@@_info:nxx { CJK-block } {#1} {#2}
        \str_if_eq:nnTF {#2} { CJK }
          { \xeCJK_select_font: }
          { \xeCJK_select_font:n {#2} }
      }
  }
\@@_msg_new:nn { CJK-block } { Switch~from~block~`#1'~to~`#2'. }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.8.2}{2020/02/17}{ä¿®å¤åˆ†åŒºå­—ä½“é”™è¯¯ã€‚}
%
% \begin{macro}[int]{\xeCJK_select_font:n,\xeCJK_block_family:nn}
% è‹¥å½“å‰ CJK å­—ä½“æ—æ²¡æœ‰å®šä¹‰å­åˆ†åŒº |#1| çš„å­—ä½“ï¼Œåˆ™ä½¿ç”¨ \tn{CJKfamilydefault} çš„å¯¹åº”
% åˆ†åŒºå­—ä½“ï¼›è‹¥ \tn{CJKfamilydefault} ä¹Ÿæ²¡æœ‰å®šä¹‰è¯¥åˆ†åŒºå­—ä½“ï¼Œåˆ™ä½¿ç”¨å½“å‰ CJK å­—ä½“æ—çš„
% ä¸»åˆ†åŒºå­—ä½“ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_select_font:n #1
  {
    \@@_select_font:cnn
      { \@@_font_csname:n { \CJK@family/#1 } }
      { \l_xeCJK_family_tl }
      {#1}
  }
\cs_new_protected:Npn \@@_select_font:Nnn #1#2#3
  {
    \xeCJK_clear_fallback_font:
    \cs_if_exist:NF #1
      { \@@_block_font_initial:Nnn #1 {#2} {#3} }
    #1
  }
\cs_generate_variant:Nn \@@_select_font:Nnn { c }
\cs_new_protected:Npn \@@_block_font_initial:Nnn #1#2#3
  {
    \xeCJK_block_family:nn {#2} {#3}
    \@@_font_initial:Nn #1 { #2/#3 }
  }
\cs_new_protected:Npn \xeCJK_block_family:nn #1#2
  {
    \xeCJK_family_if_exist:eF { #1/#2 }
      {
        \@@_copy_family:ee { #1/#2 }
          {
            \cs_if_exist:cTF
              { \@@_family_csname:n { \CJKfamilydefault/#2 } }
              { \CJKfamilydefault/#2 } {#1}
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}
%   {\@@_family_csname:n,\@@_family_nfss_csname:n,
%    \@@_family_use:n,\@@_gset_family_nfss_cs:nn}
%    \begin{macrocode}
\cs_new:Npn \@@_family_csname:n #1
  { xeCJK/family/#1 }
\cs_new:Npn \@@_family_nfss_csname:n #1
  { xeCJK/family/nfss/#1 }
\cs_new_protected:Npn \@@_family_use:n #1
  { \use:c { \@@_family_nfss_csname:n {#1} } }
\cs_new_protected:Npn \@@_gset_family_nfss_cs:nn #1#2
  {
    \prop_gput:Nnn \g_@@_family_name_prop {#1} {#2}
    \cs_gset_protected:cpx
      { \@@_family_nfss_csname:n {#1} }
      { \@@_nfss_family:nn { \c_@@_encoding_tl } {#2} }
  }
\cs_generate_variant:Nn \@@_gset_family_nfss_cs:nn { no }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_nfss_family:n}
% ç”¨äºŽå¤„ç† \LaTeXe\ 2020/02/02 ä¸­ \tn{bfseries@rm} ç­‰ä¸Ž \tn{bfdefault} ä¸ä¸€è‡´å¯èƒ½å¯¼è‡´çš„é—®é¢˜ã€‚
%    \begin{macrocode}
\cs_if_exist:NTF \fontseriesforce
  {
    \cs_new_protected:Npn \@@_nfss_family:nn #1#2
      {
        \fontencoding {#1}
        \str_if_eq:eeF { \f@series } { \bfdefault }
          {
            \str_case_e:nn { \f@family }
              {
                { \rmdefault } { \@@_nfss_series:n { rm } }
                { \sfdefault } { \@@_nfss_series:n { sf } }
                { \ttdefault } { \@@_nfss_series:n { tt } }
              }
          }
        \fontfamily {#2}
        \selectfont
      }
    \cs_new_protected:Npn \@@_nfss_series:n #1
      {
        \str_if_eq:eeT { \f@series } { \use:c { bfseries@#1 } }
          { \fontseriesforce { \bfdefault } }
      }
  }
  {
    \cs_new_protected:Npn \@@_nfss_family:nn #1#2
      {
        \fontencoding {#1}
        \tl_set:Nn \f@family {#2}
        \selectfont
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[TF,int]{\xeCJK_family_if_exist:n}
%    \begin{macrocode}
\prg_new_protected_conditional:Npnn \xeCJK_family_if_exist:n #1 { T , F , TF }
  {
    \prop_get:NnNTF \g_@@_family_name_prop
      {#1} \l_@@_fontspec_family_tl
      { \prg_return_true: }
      {
        \exp_args:Ne \cs_if_exist_use:cTF
          { \@@_family_csname:n {#1} }
          { \prg_return_true: }
          { \prg_return_false: }
      }
  }
\prg_generate_conditional_variant:Nnn \xeCJK_family_if_exist:n { e } { T , F , TF }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CJKfamily}
% ç”¨äºŽåˆ‡æ¢ CJK å­—ä½“æ—ã€‚
%    \begin{macrocode}
\NewDocumentCommand \CJKfamily { t+ t- m }
  {
    \xeCJK_family:NNe #1 #2 {#3}
    \tex_ignorespaces:D
  }
\cs_new_protected:Npn \xeCJK_family:NNn #1#2#3
  {
    \tl_if_blank:nTF {#3}
      {
        \bool_if:NF #1 { \bool_if:NF #2 { \use_none:nn } }
        \xeCJK_family_if_exist_use:e { \l_xeCJK_family_tl }
      }
      {
        \bool_if:NTF #2
          { \xeCJK_family_if_exist_use:n {#3} }
          {
            \xeCJK_family_if_exist:nTF {#3}
              {
                \tl_set:Nn \l_xeCJK_family_tl {#3}
                \tl_set_eq:NN \CJK@family \l_@@_fontspec_family_tl
                \bool_if:NT #1 { \@@_family_use:n {#3} }
              }
              { \@@_family_unknown_warning:n {#3} }
          }
      }
  }
\cs_generate_variant:Nn \xeCJK_family:NNn { NNe }
\cs_new_protected:Npn \xeCJK_switch_family:n #1
  {
    \xeCJK_family_if_exist:nTF {#1}
      {
        \tl_set:Nn \l_xeCJK_family_tl {#1}
        \tl_set_eq:NN \CJK@family \l_@@_fontspec_family_tl
      }
      { \@@_family_unknown_warning:n {#1} }
  }
\cs_generate_variant:Nn \xeCJK_switch_family:n { e , o }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.6.0}{2018/01/24}{æ–°å¢ž \opt{PunctFamily} é€‰é¡¹æ”¯æŒå¯¹æ±‰å­—æ&nbsp;‡ç‚¹å•ç‹¬åˆ‡æ¢å­—ä½“ã€‚}
%
% \begin{macro}{PunctFamily}
% è®¾ç½®æ±‰å­—æ&nbsp;‡ç‚¹ç¬¦å·çš„å­—ä½“ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    PunctFamily .choice: ,
    PunctFamily .value_required:n = { true } ,
    PunctFamily / false   .code:n =
      {
        \tl_set:Nn \CJK@punctfamily { \CJK@family }
        \tl_set:Nn \l_xeCJK_punct_family_tl { \l_xeCJK_family_tl }
        \xeCJK_cs_clear:N \@@_select_font:
        \xeCJK_cs_clear:N \@@_select_punct_font:
        \cs_set_eq:NN \xeCJK_select_punct_font: \xeCJK_select_font:
      } ,
    PunctFamily / unknown .code:n =
      { \xeCJK_punct_family:e {#1} } ,
  }
\cs_new_protected:Npn \xeCJK_punct_family:n #1
  {
    \xeCJK_family_if_exist:nTF {#1}
      {
        \tl_set:Nn \l_xeCJK_punct_family_tl {#1}
        \tl_set_eq:NN \CJK@punctfamily \l_@@_fontspec_family_tl
        \cs_set_eq:NN \@@_select_font: \xeCJK_select_font:
        \cs_set_eq:NN \@@_select_punct_font: \@@_select_punct_font_aux:
        \cs_set_eq:NN \xeCJK_select_punct_font: \@@_select_punct_font:
      }
      { \@@_family_unknown_warning:n {#1} }
  }
\cs_generate_variant:Nn \xeCJK_punct_family:n { e }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}[int]{\l_xeCJK_family_tl}
% ç”¨äºŽä¿å­˜æ–‡æ¡£å½“å‰æ­£åœ¨ä½¿ç”¨çš„ CJK å­—ä½“æ—ã€‚
% \changes{v3.2.0}{2013/04/14}{ä¸å°†å…¶åˆå§‹åŒ–ä¸º \tn{CJKfamilydefault}ã€‚}
%    \begin{macrocode}
\tl_new:N \l_xeCJK_family_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\CJK@family}
% ç”¨äºŽä¿å­˜å®žé™…çš„å­—ä½“æ—åç§°ã€‚
% \changes{v3.2.11}{2014/03/29}{å¼•å…¥ \tn{CJK@family} ä¿å­˜å®žé™…çš„å­—ä½“æ—åã€‚}
%    \begin{macrocode}
\tl_new:N \CJK@family
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\@@_gobble_CJKfamily:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_gobble_CJKfamily:
  { \cs_set_eq:NN \CJKfamily \@@_gobble_CJKfamily:wn }
\NewExpandableDocumentCommand \@@_gobble_CJKfamily:wn { t+ t- m } {  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_family_if_exist_use:n}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_family_if_exist_use:n #1
  {
    \xeCJK_family_if_exist:nTF {#1}
      { \@@_family_use:n {#1} }
      { \@@_family_unknown_warning:n {#1} }
  }
\cs_generate_variant:Nn \xeCJK_family_if_exist_use:n { e }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_family_unknown_warning:n}
% \changes{v3.1.2}{2013/01/01}
% {åœ¨æ²¡æœ‰å®šä¹‰ä»»ä½• CJK å­—ä½“çš„æƒ…å†µä¸‹ï¼Œä¸å†é‡å¤ç»™å‡ºå­—ä½“æ²¡æœ‰å®šä¹‰çš„è­¦å‘Šã€‚}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_family_unknown_warning:n #1
  {
    \prop_if_empty:NF \g_@@_family_font_name_prop
      {
        \seq_if_in:NnF \g_@@_unknown_family_seq {#1}
          {
            \seq_gput_right:Nn \g_@@_unknown_family_seq {#1}
            \@@_warning:nx { CJKfamily-Unknown } {#1}
          }
      }
  }
\seq_new:N \g_@@_unknown_family_seq
\@@_msg_new:nn { CJKfamily-Unknown }
  {
    Unknown~CJK~family~`\@@_msg_family_map:n {#1}'~is~being~ignored.\\\\
    Try~to~use~`\@@_msg_def_family_map:n {#1}'~to~define~it.
  }
\cs_new:Npn \@@_msg_def_family_map:n #1
  {
    \str_case_e:nnF {#1}
      {
        \CJKrmdefault { \token_to_str:N \setCJKmainfont }
        \CJKsfdefault { \token_to_str:N \setCJKsansfont }
        \CJKttdefault { \token_to_str:N \setCJKmonofont }
      }
      { \token_to_str:N \setCJKfamilyfont \{ #1 \} }
    [&lt;...&gt;]\{&lt;...&gt;\}
  }
\cs_new:Npn \@@_msg_family_map:n #1
  {
    \str_case_e:nnF {#1}
      {
        \CJKrmdefault { \token_to_str:N \CJKrmdefault }
        \CJKsfdefault { \token_to_str:N \CJKsfdefault }
        \CJKttdefault { \token_to_str:N \CJKttdefault }
      }
      {#1}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_pass_args:nnnn}
% ä¸ºäº†æ”¯æŒå­—ä½“å±žæ€§å¯é€‰é¡¹åœ¨å‰åœ¨åŽä¸¤ç§è¯­æ³•ï¼Œç»™å‡ºä¸¤ä¸ªè¾…åŠ©å·¥å…·ï¼Œç±»ä¼¼
% \package{fontspec} çš„å®žçŽ°ã€‚è‡ªå¸¦å±•å¼€åŠŸèƒ½ï¼Œé¢å¤–å‚æ•° |#4| ç”¨äºŽåŽå¤„ç†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_pass_args:nnnn #1#2#3#4
  {
    \tl_if_novalue:nTF {#2}
      { \@@_post_arg:w {#1} {#3} {#4} }
      {
        \use:e { #1 {#2} {#3} }
        #4
      }
  }
\NewDocumentCommand \@@_post_arg:w { m m m O { } }
  {
    \use:e { #1 {#4} {#2} }
    #3
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setCJKmainfont,\setCJKsansfont,\setCJKmonofont}
% è®¾ç½®æ–‡æ¡£çš„ CJK æ™®é€šå­—ä½“ã€æ—&nbsp;è¡¬çº¿å’Œç­‰å®½å­—ä½“ã€‚
% \changes{v3.2.0}{2013/04/14}{å®šä¹‰ä¸­åŠ&nbsp;å…¥ \tn{normalfont}ã€‚}
% \changes{v3.4.3}{2016/11/18}{å…è®¸å­—ä½“å±žæ€§å¯é€‰é¡¹åœ¨åŽçš„æ–°è¯­æ³•ã€‚}
%    \begin{macrocode}
\NewDocumentCommand \setCJKmainfont { o m }
  {
    \@@_pass_args:nnnn
      { \xeCJK_set_family:nnn { \CJKrmdefault } } {#1} {#2}
      { \@@_preamble_family:n { \CJKrmdefault } }
  }
\cs_new_eq:NN \setCJKromanfont \setCJKmainfont
\NewDocumentCommand \setCJKsansfont { o m }
  {
    \@@_pass_args:nnnn
      { \xeCJK_set_family:nnn { \CJKsfdefault } } {#1} {#2}
      { \@@_preamble_family:n { \CJKsfdefault } }
  }
\NewDocumentCommand \setCJKmonofont { o m }
  {
    \@@_pass_args:nnnn
      { \xeCJK_set_family:nnn { \CJKttdefault } } {#1} {#2}
      { \@@_preamble_family:n { \CJKttdefault } }
  }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\@onlypreamble \setCJKmainfont
\@onlypreamble \setCJKmathfont
\@onlypreamble \setCJKsansfont
\@onlypreamble \setCJKmonofont
\@onlypreamble \setCJKromanfont
%    \end{macrocode}
%
% \changes{v3.8.2}{2020/02/17}{é¿å…å¯¼è¨€åŒºå­—ä½“è­¦å‘Šã€‚}
%
% \begin{macro}{\@@_preamble_family:n}
% ç”¨åœ¨ \tn{setCJKmainfont} ç­‰ä¸»è¦å‘½ä»¤ä¹‹åŽï¼Œç¡®ä¿å¯¼è¨€åŒºæœ‰ CJK å­—ä½“å¯ç”¨ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_preamble_family:n #1
  { \str_if_eq:eeT {#1} { \CJKfamilydefault } { \normalfont } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setCJKfamilyfont, \newCJKfontfamily, \CJKfontspec}
% \changes{v3.4.3}{2016/11/18}{å…è®¸å­—ä½“å±žæ€§å¯é€‰é¡¹åœ¨åŽçš„æ–°è¯­æ³•ã€‚}
% åˆ†åˆ«ç”¨äºŽé¢„å£°æ˜Ž CJK å­—ä½“æ—å’Œå£°æ˜Žå¹¶é©¬ä¸Šè°ƒç”¨ CJK å­—ä½“æ—ã€‚
%    \begin{macrocode}
\NewDocumentCommand \setCJKfamilyfont { m o m }
  {
    \@@_pass_args:nnnn
      { \xeCJK_set_family:nnn {#1} } {#2} {#3}
      { }
  }
\NewDocumentCommand \newCJKfontfamily { o m o m }
  {
    \tl_set:Nx \l_@@_tmp_tl
      { \tl_if_novalue:nTF {#1} { \cs_to_str:N #2 } {#1} }
    \cs_new_protected:Npx #2
      { \xeCJK_switch_family:n { \l_@@_tmp_tl } }
    \@@_pass_args:nnnn
      { \xeCJK_set_family:nnn { \l_@@_tmp_tl } } {#3} {#4}
      { }
  }
\NewDocumentCommand \CJKfontspec { o m }
  {
    \@@_pass_args:nnnn
      { \xeCJK_fontspec:nn } {#1} {#2}
      { \tex_ignorespaces:D }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_fontspec:nn}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_fontspec:nn #1#2
  {
    \prop_get:NnNTF \g_@@_fontspec_prop
      { CJKfontspec/#1/#2/id } \l_xeCJK_family_tl
      { \xeCJK_switch_family:o { \l_xeCJK_family_tl } }
      {
        \@@_fontspec:enn
          { CJKfontspec ( \int_eval:n { \g_@@_family_int + 1 } ) }
          {#1} {#2}
      }
  }
\cs_new_protected:Npn \@@_fontspec:nnn #1#2#3
  {
    \prop_gput:Nnn \g_@@_fontspec_prop { CJKfontspec/#2/#3/id } {#1}
    \xeCJK_set_family:nnn {#1} {#2} {#3}
    \xeCJK_switch_family:n {#1}
  }
\cs_generate_variant:Nn \xeCJK_fontspec:nn { oo }
\cs_generate_variant:Nn \@@_fontspec:nnn { e }
\prop_new:N \g_@@_fontspec_prop
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\defaultCJKfontfeatures, \addCJKfontfeatures}
% \changes{v3.2.4}{2013/06/30}{å¯ä»¥å•ç‹¬å¢žåŠ&nbsp;å½“å‰å„ä¸ªåˆ†åŒºå­—ä½“çš„å±žæ€§ã€‚}
% åˆ†åˆ«ç”¨äºŽè®¾ç½® CJK å­—ä½“çš„é»˜è®¤å±žæ€§å’Œå¢žåŠ&nbsp;å½“å‰ CJK å­—ä½“çš„å±žæ€§ã€‚
%    \begin{macrocode}
\clist_new:N \g_@@_default_features_clist
\NewDocumentCommand \defaultCJKfontfeatures { m }
  { \clist_gset:Nn \g_@@_default_features_clist {#1} }
\@onlypreamble \defaultCJKfontfeatures
\NewDocumentCommand \addCJKfontfeatures { s O { } m }
  {
    \xeCJK_add_font_features:Nee #1 {#2} {#3}
    \tex_ignorespaces:D
  }
\cs_new_eq:NN \addCJKfontfeature \addCJKfontfeatures
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_add_font_features:Nnn}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_add_font_features:Nnn #1#2#3
  {
    \prop_get:NoNTF \g_@@_family_font_name_prop
      \l_xeCJK_family_tl \l_@@_font_name_tl
      {
        \clist_set:Nn \l_@@_add_font_features_clist {#3}
        \seq_map_inline:Nn \g_@@_sub_key_seq
          { \clist_remove_all:Nn \l_@@_add_font_features_clist {##1} }
        \seq_clear:N \l_@@_sub_key_seq
        \clist_clear:N \l_@@_add_block_features_clist
        \clist_map_function:nN {#2} \@@_add_sub_features:n
        \bool_lazy_and:nnT
          {#1}
          { \seq_if_empty_p:N \l_@@_sub_key_seq }
          {
            \seq_map_function:NN
              \g_@@_sub_key_seq \@@_add_sub_class_features:n
          }
        \prop_get:NoNT \g_@@_family_font_options_prop
          \l_xeCJK_family_tl \l_@@_font_options_clist
          {
            \bool_lazy_or:nnT
              { \seq_if_empty_p:N \l_@@_sub_key_seq }
              {#1}
              {
                \clist_concat:NNN \l_@@_font_options_clist
                  \l_@@_font_options_clist \l_@@_add_font_features_clist
              }
            \clist_concat:NNN \l_@@_font_options_clist
              \l_@@_font_options_clist \l_@@_add_block_features_clist
          }
        \xeCJK_fontspec:oo \l_@@_font_options_clist \l_@@_font_name_tl
      }
      { \@@_warning:n { addCJKfontfeature-ignored } }
  }
\cs_new_protected:Npn \@@_add_sub_features:n #1
  {
    \seq_if_in:NnTF \g_@@_sub_key_seq {#1}
      {
        \seq_put_right:Nn \l_@@_sub_key_seq {#1}
        \@@_add_sub_class_features:n {#1}
      }
      { \@@_warning:nx { SubBlock-undefined } {#1} }
  }
\clist_new:N \l_@@_add_font_features_clist
\clist_new:N \l_@@_add_block_features_clist
\cs_generate_variant:Nn \xeCJK_add_font_features:Nnn { Nee , Nne }
\@@_msg_new:nn { addCJKfontfeature-ignored }
  {
    \token_to_str:N \addCJKfontfeature (s)~ignored.\\\\
    It~cannot~be~used~with~a~font~that~wasn't~selected~by~xeCJK.
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_add_sub_class_features:n}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_add_sub_class_features:n #1
  {
    \prop_get:NoNTF \g_@@_family_font_name_prop
      { \l_xeCJK_family_tl/#1 } \l_@@_sub_font_name_tl
      {
        \prop_get:NoN \g_@@_family_font_options_prop
          { \l_xeCJK_family_tl/#1 } \l_@@_sub_font_options_clist
      }
      {
        \prop_get:NeNTF \g_@@_family_font_name_prop
          { \CJKfamilydefault/#1 } \l_@@_sub_font_name_tl
          {
            \prop_get:NeN \g_@@_family_font_options_prop
              { \CJKfamilydefault/#1 } \l_@@_sub_font_options_clist
          }
          {
            \prop_get:NoN \g_@@_family_font_options_prop
              \l_xeCJK_family_tl \l_@@_sub_font_options_clist
            \tl_set_eq:NN \l_@@_sub_font_name_tl \l_@@_font_name_tl
          }
      }
    \clist_concat:NNN \l_@@_sub_font_options_clist
      \l_@@_sub_font_options_clist \l_@@_add_font_features_clist
    \clist_put_right:Nx \l_@@_add_block_features_clist
      {
        #1 =
          {
            [ \exp_not:o \l_@@_sub_font_options_clist ]
            { \exp_not:o \l_@@_sub_font_name_tl }
          }
      }
  }
\cs_generate_variant:Nn \prop_get:NnN { Ne }
\prg_generate_conditional_variant:Nnn \prop_get:NnN { Ne } { T , TF }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{LoadFandol}
% \changes{v3.2.10}{2014/03/01}{å½“æ²¡æœ‰è®¾ç½®å­—ä½“æ—¶ï¼Œä½¿ç”¨ Fandol å­—ä½“ç³»åˆ—ã€‚}
% \changes{v3.3.1}{2015/04/08}{ä¸ºæ–¹ä¾¿ MacTeX ç”¨æˆ·ï¼ŒFandol å­—ä½“æ”¹ç”¨æ–‡ä»¶åã€‚}
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  { LoadFandol .bool_gset:N = \g_@@_fandol_bool }
\cs_new_protected:Npn \@@_load_fandol:
  {
    \xeCJK_set_family:enn { \CJKrmdefault }
      { Extension = .otf , BoldFont = FandolSong-Bold , ItalicFont = FandolKai-Regular }
      { FandolSong-Regular }
    \xeCJK_set_family:enn { \CJKsfdefault }
      { Extension = .otf , BoldFont = FandolHei-Bold } { FandolHei-Regular }
    \xeCJK_set_family:enn { \CJKttdefault }
      { Extension = .otf } { FandolFang-Regular }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.1.2}{2013/01/01}{ä¿®æ­£é‡å®šä¹‰ \tn{CJKfamilydefault} æ—&nbsp;æ•ˆçš„é—®é¢˜ï¼Œæ¢å¤å®¹é”™èƒ½åŠ›ã€‚}
% \changes{v3.2.13}{2014/06/02}{è‡ªåŠ¨è°ƒæ•´ \tn{CJKfamilydefault} æ—¶ï¼Œåªå°† \tn{familydefault} å±•å¼€ä¸€æ¬¡ã€‚}
%
% åœ¨å¯¼è¨€åŒºç»“æŸçš„æ—¶å€™ï¼Œè‹¥æ²¡æœ‰å£°æ˜Ž CJK å­—ä½“ï¼Œåˆ™ç»™å‡ºä¸€ä¸ªè­¦å‘Šã€‚å¦‚æžœ \tn{CJKfamilydefault}
% æ²¡æœ‰è¢«æ›´æ”¹ï¼Œåˆ™åœ¨æ­¤æ—¶æ&nbsp;¹æ®è¥¿æ–‡å­—ä½“çš„æƒ…å†µæ›´æ–° \tn{CJKfamilydefault}ã€‚
% å¦‚æžœ \tn{CJKfamilydefault} å¯¹åº”çš„å­—ä½“æ—æ²¡æœ‰å®šä¹‰ï¼Œåˆ™ä½¿ç”¨ \tn{CJKrmdefault} ä½œä¸º
% é»˜è®¤å­—ä½“æ—ã€‚è‹¥ \tn{CJKrmdefault} ä¹Ÿæ²¡æœ‰å®šä¹‰ï¼Œåˆ™ä½¿ç”¨åœ¨å¯¼è¨€åŒºè®¾ç½®çš„ç¬¬ä¸€ä¸ª CJK å­—ä½“
% ä½œä¸ºé»˜è®¤å­—ä½“æ—ã€‚æœ€åŽè®¾ç½®æ•°å­¦å­—ä½“ã€‚
%    \begin{macrocode}
\@@_at_end_preamble:n
  {
    \tl_if_eq:NNT \CJKfamilydefault \l_@@_family_default_init_tl
      {
        \group_begin:
        \cs_set_eq:NN \@@_family_default_wrap:n \exp_not:n
        \tl_gset:Nx \CJKfamilydefault
          {
            \str_case:onF { \familydefault }
              {
                { \rmdefault } { \exp_not:N \CJKrmdefault }
                { \sfdefault } { \exp_not:N \CJKsfdefault }
                { \ttdefault } { \exp_not:N \CJKttdefault }
              }
              { \CJKfamilydefault }
          }
        \group_end:
      }
    \prop_if_empty:NTF \g_@@_family_font_name_prop
      {
        \bool_if:NTF \g_@@_fandol_bool
          {
            \@@_warning:n { fandol }
            \@@_load_fandol:
            \xeCJK_ensure_default_family:
          }
          { \@@_warning:nx { no-CJKfamily } { \CJKfamilydefault } }
      }
      { \xeCJK_ensure_default_family: }
  }
\cs_new_protected:Npn \xeCJK_ensure_default_family:
  {
    \xeCJK_family_if_exist:eF { \CJKfamilydefault }
      {
        \tl_set_eq:NN \l_@@_tmp_tl \CJKfamilydefault
        \str_if_eq:eeTF { \CJKfamilydefault } { \CJKrmdefault }
          { \use:n }
          {
            \xeCJK_family_if_exist:eTF { \CJKrmdefault }
              { \tl_gset:Nn \CJKfamilydefault { \CJKrmdefault } }
          }
          {
            \prop_map_inline:Nn \g_@@_family_font_name_prop
              {
                \prop_map_break:n
                  { \tl_gset_rescan:Nnn \CJKfamilydefault { } { ##1 } }
              }
          }
        \@@_warning:nxx { CJKfamilydefault-undefined }
          { \l_@@_tmp_tl } { \CJKfamilydefault }
      }
    \xeCJK_switch_family:e { \CJKfamilydefault }
    \bool_if:NT \g_@@_math_bool { \xeCJK_set_mathfont: }
  }
\@@_msg_new:nn { no-CJKfamily }
  {
    It~seems~that~you~have~not~declare~a~CJKfamily.\\
    If~you~want~to~use~xeCJK~in~the~right~way,~you~should~use\\\\
    `\@@_msg_def_family_map:n {#1}'\\\\
    in~the~preamble~to~declare~the~default~CJKfamily.\\
  }
\@@_msg_new:nn { CJKfamilydefault-undefined }
  {
    Undefined~CJK~default~family~`\@@_msg_family_map:n {#1}'~
    has~been~replaced~by~`\@@_msg_family_map:n {#2}'.\\\\
    Try~to~use~`\@@_msg_def_family_map:n {#1}'~to~define~it.
  }
\@@_msg_new:nn { fandol }
  {
    Fandol~is~being~set~as~the~default~font~for~CJK~text.\\
    Please~make~sure~it~has~been~properly~installed.
  }
%    \end{macrocode}
%
% \subsection{æ•°å­¦å­—ä½“è®¾ç½®}
%
% \begin{macro}{CJKmath}
% æ˜¯å¦å¯ç”¨ CJK æ•°å­¦å­—ä½“çš„å®åŒ…é€‰é¡¹ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options } { CJKmath .bool_gset:N = \g_@@_math_bool }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setCJKmathfont}
% \changes{v3.4.3}{2016/11/18}{å…è®¸å­—ä½“å±žæ€§å¯é€‰é¡¹åœ¨åŽçš„æ–°è¯­æ³•ã€‚}
% è®¾ç½® CJK æ•°å­¦å­—ä½“ã€‚
%    \begin{macrocode}
\NewDocumentCommand \setCJKmathfont { o m }
  {
    \@@_pass_args:nnnn
      { \xeCJK_set_family:nnn { \c_@@_math_tl } } {#1} {#2}
      { }
  }
\tl_const:Nn \c_@@_math_tl { CJKmath }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_set_mathfont:}
% \changes{v3.2.6}{2013/08/01}{è®¾ç½®ç²—ä½“æ—¶å…ˆæ£€æŸ¥å¯¹åº”å­—ä½“æ˜¯å¦å­˜åœ¨ã€‚}
% \changes{v3.2.7}{2013/11/09}{å°† CJK å­—ç¬¦çš„æ•°å­¦å½’ç±»ç”± $7$ æ”¹ä¸º $0$ï¼Œè§£å†³æ±‰å­—è·¯å¾„çš„é—®é¢˜ã€‚}
% \changes{v3.2.13}{2014/06/20}{ä¿®å¤å‚æ•°ç±»åž‹é”™è¯¯ã€‚}
% \changes{v3.4.0}{2016/05/01}{CJKmath çš„å­—ç¬¦èŒƒå›´éµä»Ž \tn{xeCJKDeclareCharClass} çš„è®¾ç½®ã€‚}
% å½“æ²¡æœ‰è®¾ç½® CJK æ•°å­¦å­—ä½“æ—¶ï¼Œä½¿ç”¨ \tn{CJKfamilydefault} ä½œä¸ºæ•°å­¦å­—ä½“ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_set_mathfont:
  {
    \cs_if_exist_use:N \@@_save_um_char:
    \xeCJK_family_if_exist:eTF { \c_@@_math_tl }
      { \@@_set_mathfont_aux: }
      {
        \xeCJK_family_if_exist:eT { \CJKfamilydefault }
          {
            \@@_copy_family:ee { \c_@@_math_tl } { \CJKfamilydefault }
            \@@_set_mathfont_aux:
          }
      }
    \cs_if_exist_use:N \@@_restore_um_char:
  }
\cs_new_protected:Npn \@@_set_mathfont_aux:
  {
    \tl_const:Nx \c_@@_math_family_tl
      { \l_@@_fontspec_family_tl }
    \xeCJK_declare_mathfont:ee
      { \c_@@_math_tl }
      { \c_@@_math_family_tl }
    \int_const:Nn \c_xeCJK_math_fam_int
      { \use:c { sym \c_@@_math_tl } }
    \clist_gconcat:NNN \g_@@_math_chars_clist
      \g_@@_CJK_range_clist \g_@@_FullLeft_range_clist
    \clist_gconcat:NNN \g_@@_math_chars_clist
      \g_@@_math_chars_clist \g_@@_FullRight_range_clist
    \xeCJK_gset_mathcode:Nn \g_@@_math_chars_clist
      { \c_xeCJK_math_fam_int }
    \xeCJK_set_mathfont_block:
  }
\clist_new:N \g_@@_math_chars_clist
\prop_new:N \g_@@_fam_prop
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.4.0}{2016/05/04}{CJKmath åŠŸèƒ½ä¹Ÿæ”¯æŒåˆ†åŒºå­—ä½“ã€‚}
%
% \begin{macro}[int]{\xeCJK_set_mathfont_block:}
% åˆ†åŒºæ•°å­¦å­—ä½“ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_set_mathfont_block:
  {
    \seq_if_empty:NF \g_@@_CJK_sub_class_seq
      {
        \seq_map_function:NN
          \g_@@_CJK_sub_class_seq
          \xeCJK_set_mathfont_block:n
      }
  }
\cs_new_protected:Npn \xeCJK_set_mathfont_block:n #1
  {
    \xeCJK_block_family:nn { \c_@@_math_tl } {#1}
    \prop_get:NoNTF \g_@@_fam_prop
      \l_@@_fontspec_family_tl \l_@@_tmp_tl
      { \int_set:Nn \l_@@_fam_int { \l_@@_tmp_tl } }
      {
        \xeCJK_declare_mathfont:ee
          { \c_@@_math_tl / #1 }
          { \l_@@_fontspec_family_tl }
        \@@_set_mathfont_block_aux:cn
          { sym \c_@@_math_tl / #1 } {#1}
      }
    \xeCJK_gset_mathcode:cn { g_@@_CJK/#1_range_clist } { \l_@@_fam_int }
  }
\cs_new_protected:Npn \@@_set_mathfont_block_aux:Nn #1#2
  {
    \int_set_eq:NN \l_@@_fam_int #1
    \prop_gput:Nnn \g_@@_block_fam_prop {#2} {#1}
  }
\int_new:N \l_@@_fam_int
\prop_new:N \g_@@_block_fam_prop
\cs_generate_variant:Nn \@@_set_mathfont_block_aux:Nn { c }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.8.1}{2020/02/14}{åº”ç”¨ \tn{shapedefault}ã€‚}
%
% \begin{macro}[int]{\xeCJK_declare_mathfont:nn}
% æ³¨æ„ä»Ž \LaTeXe\ 2020/02/02 å¼€å§‹ï¼Œ\tn{shapedefault} åˆå§‹å€¼æ˜¯ \texttt{n}ï¼Œ
% è€Œ \tn{updefault} åˆå§‹å€¼æ˜¯ \texttt{up}ï¼Œä¸¤è€…å¹¶ä¸ä¸€è‡´ã€‚
% \pkg{fontspec} åŒ…å®šä¹‰å­—ä½“ä½¿ç”¨çš„æ˜¯ \tn{shapedefault}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_declare_mathfont:nn #1#2
  {
    \xeCJK_declare_symbol_font:nnnnn {#1} { \c_@@_encoding_tl }
      {#2} { \mddefault } { \shapedefault }
    \cs_if_free:cF
      { \c_@@_encoding_tl/#2/\bfdefault/\shapedefault }
      {
        \SetSymbolFont {#1} { bold } { \c_@@_encoding_tl }
          {#2} { \bfdefault } { \shapedefault }
      }
    \prop_gput:Nne \g_@@_fam_prop {#2} { \exp_not:c { sym #1 } }
  }
\cs_generate_variant:Nn \prop_put:Nnn { Nne }
\cs_generate_variant:Nn \prop_gput:Nnn { Nne }
\cs_generate_variant:Nn \xeCJK_declare_mathfont:nn { ee }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_declare_symbol_font:nnnnn}
% ä¸»è¦åŠŸèƒ½åŒ \tn{DeclareSymbolFont}ï¼Œä¸å¸¦ç¼–ç&nbsp;å’Œé‡å¤å®šä¹‰æ£€æŸ¥ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_declare_symbol_font:nnnnn #1
  { \@@_declare_symbol_font:cnnnn { sym #1 } }
\cs_new_protected:Npn \@@_declare_symbol_font:Nnnnn #1
  {
    \xeCJK_new_fam:N #1
    \xeCJK_new_symbol_font:Nnnnn #1
  }
\cs_generate_variant:Nn \@@_declare_symbol_font:Nnnnn { c }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_new_fam:N}
% æˆ‘ä»¬ä»Ž $255$ å¾€ä¸‹åˆ†é… \tn{fam}ï¼Œ|\count18| æ˜¯ \LaTeXe{} è®°å½•æœ€åŽåˆ†é…çš„ \tn{fam} ç¼–å·ï¼Œ
% ä½œä¸ºæˆ‘ä»¬çš„åˆ†é…å™¨çš„ä¸‹é™ã€‚äº‹å®žä¸Šï¼Œè¿˜åº”è¯¥ç›¸åº”åœ°å‡å° \tn{e@mathgroup@top} æ‰åˆç†ï¼Œä½†è¿™å¯èƒ½ä¼šæœ‰ä¸åˆ©å½±å“ï¼Œ
% æˆ‘ä»¬æš‚æœªå¤„ç†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_new_fam:N #1
  {
    \int_compare:nNnTF
      { \g_@@_fam_allocation_int } &gt; { \g_@@_fam_bottom_int }
      {
        \int_set_eq:NN \allocationnumber \g_@@_fam_allocation_int
        \int_const:Nn #1 { \allocationnumber }
        \iow_log:x
          {
            \token_to_str:N #1 =
            \token_to_str:N \mathgroup \int_use:N \allocationnumber
          }
        \int_gdecr:N \g_@@_fam_allocation_int
      }
      { \@@_error:n { fam-exhausted } }
  }
\tex_countdef:D \g_@@_fam_bottom_int = 18 ~
\int_new:N \g_@@_fam_allocation_int
\int_gset:Nn \g_@@_fam_allocation_int { 255 }
\@@_msg_new:nn { fam-exhausted }
  { No~room~for~a~new~fam. }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_new_symbol_font:Nnnnn}
% \begin{macro}{\@@_new_symbol_font:NN}
% åŠŸèƒ½åŒ \tn{new@symbolfont}ï¼Œä½†æˆ‘ä»¬ä¸å¢žåŠ&nbsp; \tn{c@mv@normal} å’Œ \tn{c@mv@bold} ä¹‹ç±»çš„è®¡æ•°å™¨ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_new_symbol_font:Nnnnn #1#2#3#4#5
  { \@@_new_symbol_font:Nc #1 { #2/#3/#4/#5 } }
\cs_new_protected:Npn \@@_new_symbol_font:NN #1#2
  {
    \tl_put_right:Nn \group@list { \group@elt #1 #2 }
    \cs_set:Npn \version@elt ##1
      { \tl_put_right:Nn ##1 { \getanddefine@fonts #1 #2 } }
    \version@list
  }
\cs_generate_variant:Nn \@@_new_symbol_font:NN { Nc }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_gset_mathcode:Nn,
%   \xeCJK_gset_mathcode:Nnn,\xeCJK_gset_mathcode:nnnn}
% CJK å­—ç¬¦çš„æ•°å­¦ç±»åˆ«å›ºå®šä¸º $0$ï¼ˆ\tn{mathord}ï¼‰ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_gset_mathcode:Nn #1#2
  {
    \clist_map_inline:Nn #1
      {
        \@@_set_char_class_aux:Nnw \xeCJK_gset_mathcode:nnnn { ##1 }
          { 0 } {#2}
      }
  }
\cs_generate_variant:Nn \xeCJK_gset_mathcode:Nn { c }
\cs_new_protected:Npn \xeCJK_gset_mathcode:nnnn #1#2#3#4
  {
    \@@_check_num_range:nnNN {#1} {#2} \l_@@_begin_int \l_@@_end_int
    \xeCJK_int_until_do:nn { \l_@@_begin_int &gt; \l_@@_end_int }
      {
        \xeCJK_gset_mathcode:Nnn \l_@@_begin_int {#3} {#4}
        \int_incr:N \l_@@_begin_int
      }
  }
\cs_new_protected:Npn \xeCJK_gset_mathcode:Nnn #1#2#3
  { \tex_global:D \tex_Umathcode:D #1 = #2 ~ #3 ~ #1 }
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{æŠ„å½•çŽ¯å¢ƒä¸­çš„é—´è·è°ƒæ•´}
%
% \changes{v3.1.0}{2012/11/19}{æ”¾å¼ƒä½¿ç”¨æ”¾ç¼©å­—ä½“å¤§å°çš„æ–¹å¼ï¼Œè€Œåªé‡‡ç”¨è°ƒæ•´é—´è·çš„æ–¹å¼
% ä¸Žè¥¿æ–‡ç­‰å®½å­—ä½“å¯¹é½ã€‚å¹¶ä¸”åªé€‚ç”¨äºŽä¸ŽæŠ„å½•çŽ¯å¢ƒä¸‹ã€‚}
% \changes{v3.2.0}{2013/04/15}{å¢žåŠ&nbsp; \texttt{Verb} é€‰é¡¹ã€‚}
% \changes{v3.2.1}{2013/05/29}{è°ƒæ•´ \texttt{Verb} é€‰é¡¹ï¼šåœ¨å‘½ä»¤ \tn{verb} é‡Œä½¿ç”¨æ—¶ï¼Œ
% ä¸ç&nbsp;´åæ&nbsp;‡ç‚¹ç¦åˆ™ï¼Œå¢žåŠ&nbsp;å€¼ \texttt{env+}ã€‚}
%
% \begin{macro}{Verb}
% \changes{v3.2.5}{2013/07/25}{å¾®è°ƒå®šä¹‰ã€‚}
% å¦‚æžœè®¾ç½®ä¸º \texttt{env}ï¼Œåˆ™åªåœ¨ \LaTeX çš„æŠ„å½•çŽ¯å¢ƒé‡Œä½¿ç”¨ \tn{xeCJKVerbAddon}ï¼Œ^^A
% è€Œä¸åŒ…æ‹¬ \tn{verb}ã€‚å¯¹å½“å‰ä½¿ç”¨çŽ¯å¢ƒçš„åˆ¤æ–­åŸºäºŽåœ¨æ&nbsp;‡å‡† \LaTeX çš„åå¢ƒå®šä¹‰é‡Œä½¿ç”¨
% \tn{begingroup} å’Œ \tn{endgroup} æ¥åˆ†ç»„ã€‚
%    \begin{macrocode}
\int_new:N \l_@@_verb_case_int
\keys_define:nn { xeCJK / options }
  {
    Verb .choices:nn =
      { true , env+ , env , false }
      { \int_set_eq:NN \l_@@_verb_case_int \l_keys_choice_int } ,
    Verb  .default:n = { env }
  }
\cs_new_protected:Npn \@@_verb_font_hook:
  {
    \if_case:w \l_@@_verb_case_int
    \or:
      \@@_nobreak_skip_zero:
    \or:
      \int_compare:nNnTF \tex_currentgrouptype:D = { 14 }
        { \xeCJKVerbAddon }
        { \@@_nobreak_skip: }
    \or:
      \int_compare:nNnTF \tex_currentgrouptype:D = { 14 }
        { \xeCJKVerbAddon }
        { \@@_nobreak_skip_zero: }
    \fi:
  }
\@@_after_preamble:n
  {
    \cs_set_protected:Npx \verbatim@font
      { \exp_not:o { \verbatim@font } \@@_verb_font_hook: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_nobreak_skip_zero:,\@@_nobreak_skip:}
% \changes{v3.2.8}{2013/11/16}{ç¦æ­¢åœ¨ \tn{verb} ä¸­æ–­è¡Œã€‚}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_nobreak_skip_zero:
  {
    \@@_reset_shipout_skip:
    \cs_set_eq:NN \@@_shipout_check_for_glue: \xeCJK_check_for_glue:
    \cs_set_eq:NN \@@_shipout_boundary:w \xeCJK_CJK_and_Boundary:w
    \tl_put_right:Nn \l_@@_reset_shipout_skip_hook_tl
      {
        \cs_set_eq:NN \xeCJK_check_for_glue: \@@_shipout_check_for_glue:
        \cs_set_eq:NN \xeCJK_CJK_and_Boundary:w \@@_shipout_boundary:w
      }
    \xeCJK_cs_clear:N \CJKglue
    \xeCJK_cs_clear:N \CJKecglue
    \xeCJK_cs_clear:N \xeCJK_check_for_glue:
    \cs_set_eq:NN \xeCJK_CJK_and_Boundary:w \xeCJK_class_group_end:
    \cs_set_eq:NN \@@_punct_hskip:n \@@_nobreak_hskip:n
    \cs_set_eq:NN \@@_punct_breakable_kern:n \@@_nobreak_hskip:n
  }
\cs_new_protected:Npn \@@_nobreak_skip:
  {
    \@@_reset_shipout_skip:
    \xeCJK_glue_to_skip:nN { \CJKglue } \l_@@_ccglue_skip
    \skip_if_eq:nnTF { \l_@@_ccglue_skip } { \c_zero_skip }
      { \xeCJK_cs_clear:N \CJKglue }
      { \cs_set_eq:NN \CJKglue \@@_nobreak_ccglue: }
    \xeCJK_glue_to_skip:nN { \CJKecglue } \l_@@_ecglue_skip
    \skip_if_eq:nnTF { \l_@@_ecglue_skip } { \c_zero_skip }
      { \xeCJK_cs_clear:N \CJKecglue }
      { \cs_set_eq:NN \CJKecglue \@@_nobreak_ecglue: }
    \cs_set_eq:NN \@@_punct_hskip:n \@@_nobreak_hskip:n
    \cs_set_eq:NN \@@_punct_breakable_kern:n \@@_nobreak_hskip:n
  }
\cs_new_protected:Npn \@@_nobreak_ccglue:
  { \xeCJK_no_break: \skip_horizontal:N \l_@@_ccglue_skip }
\cs_new_protected:Npn \@@_nobreak_ecglue:
  { \xeCJK_no_break: \skip_horizontal:N \l_@@_ecglue_skip }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_reset_shipout_skip:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_reset_shipout_skip:
  {
    \cs_set_eq:NN \@@_shipout_CJKglue:   \CJKglue
    \cs_set_eq:NN \@@_shipout_CJKecglue: \CJKecglue
    \cs_set_eq:NN \@@_shipout_punct_hskip:n \@@_punct_hskip:n
    \cs_set_eq:NN
      \@@_shipout_punct_breakable_kern:n \@@_punct_breakable_kern:n
    \tl_set:Nx \l_@@_off_verb_addon_tl
      {
        \bool_if:NTF \l_@@_xecglue_bool
          { \keys_set:nn { xeCJK / options } { xCJKecglue = true } }
          { \keys_set:nn { xeCJK / options } { xCJKecglue = false } }
        \exp_not:n
          {
            \cs_set_eq:NN \CJKglue \@@_shipout_CJKglue:
            \cs_set_eq:NN \CJKecglue \@@_shipout_CJKecglue:
            \cs_set_eq:NN \@@_punct_hskip:n \@@_shipout_punct_hskip:n
            \cs_set_eq:NN \@@_punct_breakable_kern:n
                          \@@_shipout_punct_breakable_kern:n
            \l_@@_reset_shipout_skip_hook_tl
          }
      }
    \xeCJK_add_to_shipout:n { \l_@@_off_verb_addon_tl }
    \keys_set:nn { xeCJK / options } { xCJKecglue = false }
  }
\tl_new:N \l_@@_reset_shipout_skip_hook_tl
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJKOffVerbAddon,\xeCJKVerbAddon}
% \changes{v3.1.0}{2012/11/19}{æ–°å¢ž \tn{xeCJKVerbAddon} ç”¨äºŽæŠ„å½•çŽ¯å¢ƒä¸­çš„é—´è·è°ƒæ•´ã€‚}
% \changes{v3.2.3}{2013/06/04}
% {æ–°å¢ž \tn{xeCJKOffVerbAddon} ç”¨äºŽå±€éƒ¨å–æ¶ˆ \tn{xeCJKOffVerbAddon} çš„å½±å“ï¼›å¹¶è§£å†³
% è·¨é¡µä½¿ç”¨æ—¶å½±å“åˆ°é¡µçœ‰é¡µè„šçš„é—®é¢˜ã€‚}
% \changes{v3.2.5}{2013/07/13}{ç¦æ­¢è‡ªåŠ¨æ¢è¡Œï¼Œä¸Žè¥¿æ–‡ä¸€è‡´ã€‚}
% \changes{v3.2.8}{2013/11/16}{å¢žåŠ&nbsp;æ˜¯å¦æ˜¯ç­‰å®½å­—ä½“çš„åˆ¤æ–­ã€‚}
% \tn{xeCJKVerbAddon} è¿›è¡Œäº†æ¯”è¾ƒå¤§çš„è°ƒæ•´ï¼Œåº”è¯¥åªåœ¨åˆ†ç»„çŽ¯å¢ƒé‡Œä½¿ç”¨ã€‚ä¸ºäº†æ–¹ä¾¿è°ƒæ•´é—´è·
% ä»¥åˆ©äºŽå¯¹é½ï¼Œè¿™é‡ŒåªæŠŠå­—ç¬¦åˆ†æˆäº†ä¸¤ç±»ï¼Œå¹¶ä¸”åœ¨ CJK ç±»ä¸Žè¾¹ç•Œï¼ˆç©ºæ&nbsp;¼ï¼‰ä¹‹é—´ä¹Ÿæ’å…¥
% \tn{CJKecglue}ã€‚ä»¥å­—æ¯â€œMâ€çš„å®½åº¦æ˜¯å¦ç­‰äºŽ \tn{fontdimen2} æ¥åˆ¤æ–­å½“å‰å­—ä½“æ˜¯å¦æ˜¯
% ç­‰å®½å­—ä½“ã€‚å¦‚æžœä¸æ˜¯ç­‰å®½å­—ä½“ï¼Œåˆ™è®¾ç½®é—´è·ä¸ºé›¶æˆ–æ­£æ–‡é—´è·ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKVerbAddon { }
  {
    \int_compare:nNnF \tex_currentgrouplevel:D = \c_zero_int
      {
        \bool_if:NF \l_@@_listings_env_bool
          {
            \dim_compare:nNnTF
              { \tex_fontdimen:D 2 ~ \tex_font:D } =
              { \tex_fontcharwd:D \tex_font:D \c_@@_mono_letter_int }
              {
                \@@_set_verb_exspace:
                \@@_verb_addon:
              }
              {
                \int_if_odd:nTF { \l_@@_verb_case_int }
                  { \@@_nobreak_skip_zero: }
                  { \@@_nobreak_skip: }
              }
          }
      }
  }
\int_const:Nn \c_@@_mono_letter_int { 77 }
\bool_new:N \l_@@_listings_env_bool
\NewDocumentCommand \xeCJKOffVerbAddon { }
  { \tl_use:N \l_@@_off_verb_addon_tl }
\tl_new:N \l_@@_off_verb_addon_tl
\cs_new_protected:Npn \@@_verb_addon:
  {
    \bool_if:NF \l_@@_verb_addon_bool
      { \@@_verb_addon_action: }
    \skip_if_eq:nnTF { \l_@@_verb_exspace_skip } { \c_zero_skip }
      {
        \xeCJK_cs_clear:N \CJKglue
        \xeCJK_cs_clear:N \CJKecglue
      }
      {
        \skip_set_eq:NN \l_@@_ccglue_skip \l_@@_verb_exspace_skip
        \skip_set:Nn \l_@@_ecglue_skip { \l_@@_verb_exspace_skip / 2 }
        \cs_set_eq:NN \CJKglue   \@@_nobreak_ccglue:
        \cs_set_eq:NN \CJKecglue \@@_nobreak_ecglue:
      }
    \cs_set_eq:NN \xeCJK_check_for_glue: \CJKecglue
    \cs_set_eq:NN \xeCJK_CJK_and_Boundary:w \@@_verb_CJK_and_Boundary:w
  }
\cs_new_protected:Npn \@@_verb_addon_action:
  {
    \bool_set_true:N \l_@@_verb_addon_bool
    \@@_set_char_class_eq:nn { FullLeft }    { CJK }
    \@@_set_char_class_eq:nn { FullRight }   { CJK }
    \@@_set_char_class_eq:nn { HalfLeft }    { Default }
    \@@_set_char_class_eq:nn { HalfRight }   { Default }
    \@@_set_char_class_eq:nn { NormalSpace } { Default }
    \cs_set_eq:NN \@@_shipout_CJKglue:   \CJKglue
    \cs_set_eq:NN \@@_shipout_CJKecglue: \CJKecglue
    \cs_set_eq:NN \@@_shipout_check_for_glue: \xeCJK_check_for_glue:
    \cs_set_eq:NN \@@_shipout_boundary:w \xeCJK_CJK_and_Boundary:w
    \cs_set_protected:Npx \xeCJKOffVerbAddon
      {
        \@@_reset_char_class:n { FullLeft }
        \@@_reset_char_class:n { FullRight }
        \@@_reset_char_class:n { HalfLeft }
        \@@_reset_char_class:n { HalfLeft }
        \@@_reset_char_class:n { NormalSpace }
        \bool_if:NTF \l_@@_xecglue_bool
          { \keys_set:nn { xeCJK / options } { xCJKecglue = true } }
          { \keys_set:nn { xeCJK / options } { xCJKecglue = false } }
        \exp_not:n
          {
            \cs_set_eq:NN \CJKglue   \@@_shipout_CJKglue:
            \cs_set_eq:NN \CJKecglue \@@_shipout_CJKecglue:
            \cs_set_eq:NN \xeCJK_check_for_glue: \@@_shipout_check_for_glue:
            \cs_set_eq:NN \xeCJK_CJK_and_Boundary:w \@@_shipout_boundary:w
          }
      }
    \xeCJK_add_to_shipout:n { \xeCJKOffVerbAddon }
    \keys_set:nn { xeCJK / options } { xCJKecglue = false }
  }
\cs_new_protected:Npn \@@_verb_CJK_and_Boundary:w
  { \xeCJK_class_group_end: \CJKecglue }
\cs_new_protected:Npn \@@_reset_char_class:n #1
  {
    \int_set:Nn \l_@@_tmp_int { \xeCJK_class_num:n {#1} }
    \clist_map_inline:cn { c_@@_#1_chars_clist }
      { \tex_XeTeXcharclass:D ##1 = \l_@@_tmp_int }
  }
\bool_new:N \l_@@_verb_addon_bool
\cs_new_eq:NN \CJKfixedspacing \xeCJKVerbAddon
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_verb_exspace:}
% \changes{v3.1.1}{2012/12/08}{è°ƒæ•´é—´è·çš„è®¡ç®—æ–¹æ³•ã€‚}
% \changes{v3.2.4}{2013/06/29}{å½“è®¡ç®—å¾—å‡ºçš„é—´è·ä¸ºè´Ÿæ—¶ï¼Œç¼©å° CJK å­—ä½“ã€‚}
% åœ¨æŠ„å½•çŽ¯å¢ƒä¸­ï¼ŒCJK æ–‡å­—ä¹‹é—´çš„é—´è·ä¸ºå½“å‰è¥¿æ–‡å­—ä½“ä¸¤ä¸ªç©ºæ&nbsp;¼çš„å®½åº¦ä¸Žå½“å‰å­—ä½“å¤§å°ä¹‹å·®ï¼Œ
% è€Œä¸Žè¥¿æ–‡å’Œç©ºæ&nbsp;¼çš„é—´è·ä¸º CJK æ–‡å­—ä¹‹é—´çš„é—´è·çš„ä¸€åŠã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_verb_exspace:
  {
    \tl_if_exist:cTF { xeCJK/verb/\CJK@family/\curr@fontshape/\f@size }
      {
        \skip_set:Nn \l_@@_verb_exspace_skip
          { \use:c { xeCJK/verb/\CJK@family/\curr@fontshape/\f@size } }
      }
      {
        \tl_set:Nx \l_@@_current_coor_tl { \CJK@family/\curr@fontshape }
        \prop_get:NoNTF \g_@@_scale_family_prop
          \l_@@_current_coor_tl \l_xeCJK_family_tl
          {
            \xeCJK_switch_family:o { \l_xeCJK_family_tl }
            \skip_zero:N \l_@@_verb_exspace_skip
          }
          {
            \group_begin: \xeCJK_select_font: \exp_args:NNo \group_end:
            \@@_set_verb_exspace:n
              { \dim_use:N \tex_fontcharwd:D \tex_font:D "4E00 ~ }
          }
      }
  }
\skip_new:N \l_@@_verb_exspace_skip
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_verb_exspace:n}
% å½“ä¸¤ä¸ªè¥¿æ–‡ç©ºæ&nbsp;¼çš„å®½åº¦å°äºŽä¸€ä¸ª CJK æ–‡å­—çš„å®½åº¦æ—¶ï¼Œå¯¹ç›®å‰ä½¿ç”¨çš„ CJK å­—ä½“è¿›è¡Œé€‚å½“ç¼©å°ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_verb_exspace:n #1
  {
    \skip_set:Nn \l_@@_verb_exspace_skip
      { 2 \tex_fontdimen:D 2 ~ \tex_font:D - #1 }
    \dim_compare:nNnTF \l_@@_verb_exspace_skip &lt; \c_zero_dim
      {
        \skip_zero:N \l_@@_verb_exspace_skip
        \exp_args:Nee \@@_set_verb_scale:nn
          { \dim_to_fp:n { 2 \tex_fontdimen:D 2 ~ \tex_font:D } }
          { \dim_to_fp:n {#1} }
      }
      {
        \tl_const:cx { xeCJK/verb/\CJK@family/\curr@fontshape/\f@size }
          { \skip_use:N \l_@@_verb_exspace_skip }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_set_verb_scale:nn}
% ç¼©å° CJK å­—ä½“ï¼Œå¹¶ä¿å­˜ç›¸å…³ä¿¡æ¯ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_set_verb_scale:nn #1#2
  {
    \fp_set:Nn \l_@@_scale_factor_fp { #1 / #2 }
    \@@_warning:nxx { scale-factor }
      { \fp_eval:n { trunc ( \l_@@_scale_factor_fp , 4 ) } }
      { \fp_eval:n {  ceil ( #2 / #1 , 4 ) } }
    \xeCJK_add_font_features:Nne \c_true_bool
      { } { Scale = { \fp_use:N \l_@@_scale_factor_fp } }
    \prop_gput:Noo \g_@@_scale_family_prop
      \l_@@_current_coor_tl \l_xeCJK_family_tl
  }
\@@_msg_new:nn { scale-factor }
  {
    `\token_to_str:N \xeCJKVerbAddon'~may~not~work~properly.\\\\
    You~may~set~`Scale=#1'~to~CJKfamily~
    `\@@_msg_family_map:n { \l_xeCJK_family_tl }',\\
    or~set~`Scale=#2'~to~family~
    `\str_if_eq:eeTF \f@family \ttdefault
      { \token_to_str:N \ttdefault } { \f@family }'.
  }
\fp_new:N \l_@@_scale_factor_fp
\prop_new:N \g_@@_scale_family_prop
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_visible_space:}
% \begin{macro}[int]{\@setupverbvisiblespace}
% \changes{v3.2.5}{2013/07/13}{å¯è§†ç©ºæ&nbsp;¼è€ƒè™‘ä¼&nbsp;ç»Ÿ \TeX å­—ä½“çš„æƒ…å†µã€‚}
% \changes{v3.8.0}{2020/02/09}{æ›´æ–°å¯è§†ç©ºæ&nbsp;¼è¡¥ä¸ã€‚}
% å¦‚æžœæ–‡æ¡£ä¸ä½¿ç”¨ \texttt{EU1} ä½œä¸ºé»˜è®¤å­—ä½“ç¼–ç&nbsp;ï¼Œé‚£ä¹ˆé»˜è®¤çš„æ‰“å­—æœºå­—ä½“æ—å¾ˆå¯èƒ½æ˜¯
% ä¼&nbsp;ç»Ÿçš„ \TeX å­—ä½“ï¼Œè¿™æ—¶å¯è§†ç©ºæ&nbsp;¼æŒ‰ç…§ \texttt{OT1} ç¼–ç&nbsp;ä¼&nbsp;ç»Ÿä¸€èˆ¬å°±æ˜¯å­—ä½“ä¸­çš„ |\char32|ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_setup_visible_space:
  {
    \xeCJK_make_boundary:
    \xeCJK_glyph_if_exist:NTF { ^^^^2423 }
      { \tl_set:Nn \l_@@_visible_space_tl { ^^^^2423 } }
      {
        \int_compare:nNnTF { \tex_XeTeXfonttype:D \tex_font:D } = \c_zero_int
          {
            \tl_set:Nx \l_@@_visible_space_tl
              {
                \str_if_eq:eeTF { \f@family } { \ttdefault }
                    { \c_catcode_other_space_tl }
                    { \exp_not:N \textvisiblespace }
              }
          }
          { \@@_visible_space_fallback: }
      }
    \cs_set_eq:NN \@xobeysp \l_@@_visible_space_tl
  }
\tl_new:N \l_@@_visible_space_tl
\cs_set_eq:NN \@setupverbvisiblespace \xeCJK_setup_visible_space:
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@@_visible_space_fallback:}
% æˆ‘ä»¬ä½¿ç”¨ |lmtt| å­—ä½“ä¸­çš„å¯è§†ç©ºæ&nbsp;¼ç¬¦å·ï¼ˆ|U+2423|ï¼‰ä½œä¸ºå½“å‰å­—ä½“ä¸­ç›¸åº”ç¬¦å·
% çš„åŽå¤‡ï¼Œä½†æ˜¯ |lmtt| çš„å­—ä½“å¤§å°æœªå¿…ä¸Žå½“å‰å­—ä½“åŒ¹é…ã€‚å›&nbsp;æ­¤ï¼Œè¿™é‡Œéœ€è¦åšä¸€äº›è°ƒæ•´ï¼Œä»¥
% ä¿è¯ä½¿ç”¨åŽå¤‡å¯è§†ç©ºæ&nbsp;¼ç¬¦å·æ—¶ï¼Œä¹Ÿèƒ½ä¿è¯å¯¹é½ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_visible_space_fallback:
  {
    \exp_args:Nc \@@_visible_space_fallback_auxi:N
      { xeCJK/space/\curr@fontshape/\f@size }
  }
\cs_new_protected:Npn \@@_visible_space_fallback_auxi:N #1
  {
    \cs_if_exist:NF #1
      { \@@_visible_space_fallback_auxii:N #1 }
    \tl_set:Nn \l_@@_visible_space_tl {#1}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_visible_space_fallback_auxii:N}
% å½“å‰å­—ä½“ç©ºæ&nbsp;¼çš„å®½åº¦ä¸ŽåŽå¤‡å­—ä½“ |lmtt| ä¸ä¸€æ&nbsp;·æ—¶ï¼Œå°±å¯¹ \tn{textvisiblespace} çš„å­—ä½“å°ºå¯¸
% æŒ‰ç›¸åº”çš„æ¯”ä¾‹æ”¾ç¼©ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_visible_space_fallback_auxii:N #1
  {
    \group_begin:
      \exp_args:No \@@_set_visible_space_size:n
        { \dim_use:N \tex_fontdimen:D 2 ~ \tex_font:D }
      \cs_new_protected:Npx #1
        { \group_begin: \tex_the:D \tex_font:D ^^^^2423 \group_end: }
    \group_end:
  }
\cs_new_protected:Npn \@@_set_visible_space_size:n #1
  {
    \fontencoding { \UnicodeEncodingName }
    \tl_set:Nn \f@family { lmtt }
    \selectfont
    \dim_compare:nNnF {#1} = { \tex_fontdimen:D 2 ~ \tex_font:D }
      {
        \fontsize
          {
            \dim_eval:n
              {
                \f@size pt *
                \dim_ratio:nn {#1} { \tex_fontdimen:D 2 ~ \tex_font:D }
              }
          }
          { \f@baselineskip }
        \selectfont
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{\pkg{xeCJK} å…¶ä»–é€‰é¡¹}
%
% \begin{macro}{LocalConfig}
% \changes{v3.1.0}{2012/11/20}{å¢žåŠ&nbsp; \texttt{LocalConfig} é€‰é¡¹ç”¨äºŽè½½å…¥æœ¬åœ°é…ç½®æ–‡ä»¶ã€‚}
% å£°æ˜Žè½½å…¥æœ¬åœ°é…ç½®æ–‡ä»¶çš„é€‰é¡¹ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    LocalConfig .choice: ,
    LocalConfig / false   .code:n =
      { \bool_gset_false:N \g_@@_config_bool } ,
    LocalConfig / true    .code:n =
      {
        \bool_gset_true:N \g_@@_config_bool
        \tl_gset:Nn \g_@@_config_name_tl { xeCJK }
      } ,
    LocalConfig / unknown .code:n =
      {
        \bool_gset_true:N \g_@@_config_bool
        \tl_gset:Nx \g_@@_config_name_tl { xeCJK - \l_keys_value_tl }
      } ,
    LocalConfig        .default:n = { true }
  }
\tl_new:N \g_@@_config_name_tl
\bool_new:N \g_@@_config_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{CJKnumber,indentfirst}
% \changes{v3.2.11}{2014/03/14}{æ”¾å¼ƒ \texttt{indentfirst} å’Œ \texttt{CJKnumber} é€‰é¡¹ã€‚}
% \texttt{CJKnumber} å’Œ \texttt{indentfirst} æ˜¯è¿‡æ—¶é€‰é¡¹ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    CJKnumber         .code:n =
      { \@@_warning:nxx { option-deprecated } { \l_keys_key_tl } { CJKnumb } } ,
    indentfirst       .code:n =
      { \@@_warning:nxx { option-deprecated } { \l_keys_key_tl } { indentfirst } } ,
    normalindentfirst .code:n =
      { \@@_warning:nxx { option-deprecated } { \l_keys_key_tl } { } }
  }
\@@_msg_new:nn { option-deprecated }
  {
    The~`#1'~option~is~deprecated.\\
    \tl_if_empty:nF {#2}
      { You~may~load~the~package~`#2'~after~xeCJK~to~use~its~function.\\ }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{quiet,silent}
% å°†è°ƒç”¨ \pkg{xeCJK} æ—¶ä½¿ç”¨çš„æœªçŸ¥çš„é€‰é¡¹ä¼&nbsp;é€’ç»™ \pkg{fontspec} å®åŒ…ã€‚
% å¯¹ \pkg{fontspec} çš„ |quiet| å’Œ |silent| é€‰é¡¹è¿›è¡Œä¿®æ”¹ï¼Œä½¿å…¶é€‚ç”¨äºŽ \pkg{xeCJK}ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    quiet .code:n =
      {
        \msg_redirect_module:nnn { xeCJK } { warning } { info }
        \msg_redirect_module:nnn { xeCJK } { info }    { none }
        \xeCJK_if_package_loaded:nF { fontspec }
          { \PassOptionsToPackage { quiet } { fontspec } }
      } ,
    silent .code:n =
      {
        \msg_redirect_module:nnn { xeCJK } { warning } { none }
        \msg_redirect_module:nnn { xeCJK } { info }    { none }
        \xeCJK_if_package_loaded:nF { fontspec }
          { \PassOptionsToPackage { silent } { fontspec } }
      } ,
    unknown .code:n =
      {
        \xeCJK_if_package_loaded:nTF { fontspec }
          { \@@_error:nx { key-unknown } { \l_keys_key_tl } }
          { \PassOptionsToPackage { \l_keys_key_tl } { fontspec } }
      }
  }
\@@_msg_new:nn { key-unknown }
  {
    Sorry,~but~xeCJK/options~does~not~have~a~key~called~`#1'.\\\\
    The~key~`#1'~is~being~ignored.
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{\pkg{xeCJK} åˆå§‹åŒ–è®¾ç½®}
%
% \begin{macro}[int]{\CJKsymbol, \CJKpunctsymbol}
%    \begin{macrocode}
\cs_new_eq:NN \CJKsymbol      \use:n
\cs_new_eq:NN \CJKpunctsymbol \use:n
%    \end{macrocode}
% \end{macro}
%
% \pkg{xeCJK} å®åŒ…çš„åˆå§‹åŒ–è®¾ç½®ã€‚
%
%    \begin{macrocode}
\keys_set:nn { xeCJK / options }
  {
    CJKglue         = { \skip_horizontal:n { \c_zero_dim plus 0.08 \tex_baselineskip:D } } ,
    CJKecglue       = { ~ } ,
    xCJKecglue      = false ,
    CheckSingle     = false ,
    PlainEquation   = false ,
    CheckFullRight  = false ,
    CJKspace        = false ,
    CJKmath         = false ,
    xeCJKactive     = true  ,
    LocalConfig     = true  ,
    LoadFandol      = true  ,
    RubberPunctSkip = true  ,
    Verb            = env   ,
    EmboldenFactor  = 4     ,
    SlantFactor     = 0.167 ,
    PunctStyle      = quanjiao ,
    NewLineCS       = { \par \[ } ,
    EnvCS           = { \begin \end } ,
    WidowPenalty    = { 10 000 } ,
    NoBreakCS       = { \footnote \footnotemark \nobreak } ,
    KaiMingPunct    = { ^^^^3002 ^^^^ff0e ^^^^ff1f ^^^^ff01 } ,
    LongPunct       = { ^^^^2014 ^^^^2e3a ^^^^2025 ^^^^2026 } ,
    MiddlePunct     = { ^^^^2013 ^^^^2014 ^^^^2e3a ^^^^2027 ^^^^00b7 ^^^^30fb ^^^^ff65 } ,
    AllowBreakBetweenPuncts = false
  }
\defaultCJKfontfeatures { Script = CJK }
%    \end{macrocode}
%
% åŠå­—çº¿è¿žæŽ¥å·\footnote{è§\href{http://www.moe.gov.cn/ewebeditor/uploadfile/2015/01/13/20150113092346124.pdf}
% {ã€Šå¤¹ç”¨è‹±æ–‡çš„ä¸­æ–‡æ–‡æœ¬çš„æ&nbsp;‡ç‚¹ç¬¦å·ç”¨æ³•ï¼ˆè‰æ¡ˆï¼‰ã€‹5.13 èŠ‚ã€‚}}åº”ä¸ºåŠè§’å®½åº¦ã€‚
%    \begin{macrocode}
\xeCJKsetwidth { ^^^^2013 } { 0.5 em }
%    \end{macrocode}
%
% \changes{v3.7.0}{2018/03/16}{ä¸å†é»˜è®¤å¼•å…¥ \pkg{xunicode} å®åŒ…ã€‚}
%
% æ‰§è¡Œå®åŒ…é€‰é¡¹ï¼Œå¹¶è½½å…¥ \pkg{fontspec} å®åŒ…ã€‚
%    \begin{macrocode}
\cs_if_exist:NTF \ProcessKeyOptions
  { \ProcessKeyOptions [ xeCJK / options ] }
  {
    \RequirePackage { l3keys2e }
    \ProcessKeysOptions { xeCJK / options }
  }
\RequirePackage { fontspec } [ 2020/02/03 ]
%    \end{macrocode}
%
% \begin{variable}{\c_@@_encoding_tl}
% ä¿å­˜ \pkg{fontspec} å£°æ˜Žå­—ä½“æ—¶ä½¿ç”¨çš„å­—ä½“ç¼–ç&nbsp;ã€‚
%    \begin{macrocode}
\tl_const:Nx \c_@@_encoding_tl { \g_fontspec_encoding_tl }
%    \end{macrocode}
% \end{variable}
%
% \changes{v3.1.0}{2012/11/21}{æ”¹ç”¨ \pkg{indentfirst} å®åŒ…å¤„ç†ç¼©è¿›çš„é—®é¢˜ã€‚}
%
% å¯¹ä¸èƒ½é€šè¿‡ \tn{xeCJKsetup} è®¾ç½®çš„é€‰é¡¹ç»™å‡ºè­¦å‘Šã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    LocalConfig .code:n =
      { \@@_warning:nx { option-invalid } { \l_keys_key_tl } }
  }
\@@_msg_new:nn { option-invalid }
  {
    The~`#1'~option~can~only~be~set~in~the~optional~argument~to~the\\
    \token_to_str:N \usepackage \ command~when~xeCJK~is~being~loaded.\\\\
    Please~do~not~set~it~via~the~\token_to_str:N \xeCJKsetup \ command.
  }
%    \end{macrocode}
%
% \begin{variable}{\CJKrmdefault,\CJKsfdefault,\CJKttdefault,\CJKfamilydefault}
%    \begin{macrocode}
\tl_if_exist:NF \CJKrmdefault { \tl_gset:Nn \CJKrmdefault { rm } }
\tl_if_exist:NF \CJKsfdefault { \tl_gset:Nn \CJKsfdefault { sf } }
\tl_if_exist:NF \CJKttdefault { \tl_gset:Nn \CJKttdefault { tt } }
\tl_new:N \l_@@_family_default_init_tl
\cs_new_eq:NN \@@_family_default_wrap:n \use:n
\tl_set:Nx \l_@@_family_default_init_tl
  {
    \exp_not:N \@@_family_default_wrap:n
      {
        \tl_if_exist:NTF \CJKfamilydefault
          { \exp_not:o \CJKfamilydefault }
          { \exp_not:N \CJKrmdefault }
      }
  }
\tl_gset_eq:NN \CJKfamilydefault \l_@@_family_default_init_tl
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\xeCJKsetup}
% åœ¨å¯¼è¨€åŒºæˆ–æ–‡æ¡£ä¸­è®¾ç½® \pkg{xeCJK} çš„æŽ¥å£ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKsetup { +m }
  {
    \keys_set:nn { xeCJK / options } {#1}
    \tex_ignorespaces:D
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJKsetemboldenfactor, \xeCJKsetslantfactor}
%    \begin{macrocode}
\NewDocumentCommand \xeCJKsetemboldenfactor { m }
  { \xeCJKsetup { EmboldenFactor = {#1} } }
\NewDocumentCommand \xeCJKsetslantfactor { m }
  { \xeCJKsetup { SlantFactor = {#1} } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\punctstyle, \xeCJKplainchr}
%    \begin{macrocode}
\NewDocumentCommand \punctstyle { m } { \xeCJKsetup { PunctStyle = {#1} } }
\NewDocumentCommand \xeCJKplainchr { } { \xeCJKsetup { PunctStyle = plain } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\CJKsetecglue}
%    \begin{macrocode}
\NewDocumentCommand \CJKsetecglue { m } { \xeCJKsetup { CJKecglue = {#1} } }
\cs_new_eq:NN \xeCJKsetecglue \CJKsetecglue
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\CJKspace,\CJKnospace}
%    \begin{macrocode}
\NewDocumentCommand \CJKspace   { } { \xeCJKsetup { CJKspace = true } }
\NewDocumentCommand \CJKnospace { } { \xeCJKsetup { CJKspace = false } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJKallowbreakbetweenpuncts, \xeCJKnobreakbetweenpuncts}
%    \begin{macrocode}
\NewDocumentCommand \xeCJKallowbreakbetweenpuncts { }
  { \xeCJKsetup { AllowBreakBetweenPuncts = true } }
\NewDocumentCommand \xeCJKnobreakbetweenpuncts { }
  { \xeCJKsetup { AllowBreakBetweenPuncts = false } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJKenablefallback, \xeCJKdisablefallback}
%    \begin{macrocode}
\NewDocumentCommand \xeCJKenablefallback { }
  { \xeCJKsetup { AutoFallBack = true } }
\NewDocumentCommand \xeCJKdisablefallback { }
  { \xeCJKsetup { AutoFallBack = false } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJKsetcharclass}
%    \begin{macrocode}
\NewDocumentCommand \xeCJKsetcharclass { m m m }
  {
    \xeCJK_set_char_class:nnn {#1} {#2} {#3}
    \xeCJKResetPunctClass
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{å…¼å®¹æ€§ä¿®è¡¥}
%
% \changes{v3.2.16}{2014/11/20}{ä¿®å¤ \tn{hbar}ã€‚}
% \changes{v3.8.0}{2020/02/09}{åˆ&nbsp;é™¤ \tn{hbar} è¡¥ä¸ã€‚}
%
% \begin{macro}[int]{\xeCJK@update@fam,\Url@MathSetup}
% \changes{v3.2.7}{2013/11/09}{ä½¿é€šè¿‡ \tn{UrlFont} ç­‰å‘½ä»¤è®¾ç½®çš„ CJK å­—ä½“ç”Ÿæ•ˆã€‚}
% ä½¿é€šè¿‡ \tn{urlstyle} æˆ–è€… \tn{UrlFont} è®¾ç½®çš„è·¯å¾„ä¸­ä½¿ç”¨çš„ CJK å­—ä½“ç”Ÿæ•ˆã€‚
% ä½¿ç”¨ \tn{everymath} é’©å­ä¸­æ•°å­¦æ¨¡å¼ä¸­é‡å®šä¹‰ CJK æ•°å­¦å­—ä½“ï¼Œä»¥ç¡®ä¿æˆ‘ä»¬çš„è®¾ç½®åœ¨
% \tn{check@mathfonts} ä¹‹åŽç”Ÿæ•ˆï¼Œä¸ä¼šè¢«å®ƒè¦†ç›–ã€‚
% æ›´åˆç†çš„æ–¹å¼æ˜¯å®šä¹‰ä¸€ä¸ªæ–°çš„ \tn{mathversion} æ¥åˆ‡æ¢ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK@update@fam
  {
    \addto@hook \everymath
      {
        \@@_update_main_fam:
        \@@_update_block_fam:
      }
  }
\cs_new_protected:Npn \@@_update_main_fam:
  {
    \group_begin:
      \xeCJK_select_font:
      \exp_last_unbraced:NNNo \group_end:
    \tex_textfont:D \c_xeCJK_math_fam_int \tex_the:D \tex_font:D
  }
\cs_new_protected:Npn \@@_update_block_fam:
  {
    \prop_if_empty:NF \g_@@_block_fam_prop
      {
        \prop_map_function:NN
          \g_@@_block_fam_prop
          \@@_update_block_fam:nn
      }
  }
\cs_new_protected:Npn \@@_update_block_fam:nn #1#2
  {
    \int_set:Nn \l_@@_fam_int {#2}
    \group_begin:
      \xeCJK_select_font:n {#1}
      \exp_last_unbraced:NNNo \group_end:
    \tex_textfont:D \l_@@_fam_int \tex_the:D \tex_font:D
  }
\@@_after_end_preamble:n
  {
    \bool_lazy_and:nnT
      { \g_@@_math_bool }
      { \cs_if_exist_p:N \Url@MathSetup }
      { \tl_put_right:Nn \Url@MathSetup { \xeCJK@update@fam } }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.6}{2013/08/02}{ä¸º \tn{mathrm} å‡å°‘ä¸€ä¸ªå¯èƒ½çš„æ•°å­¦å­—ä½“æ—ã€‚}
% \changes{v3.8.0}{2020/02/09}{åˆ&nbsp;é™¤ \tn{mathrm} è¡¥ä¸ã€‚}
%
% \changes{v3.4.5}{2017/01/02}{æ›´æ–° \LaTeXiii{} çš„è¿‡æ—¶ç”¨æ³•ã€‚}
%
% \begin{macro}[int]{\(,\),\math,\endmath,\ensuremath}
% \begin{macro}{\@@_math_robust:N}
% \changes{v3.2.5}{2013/07/25}
% {è§£å†³æ±‰å­—åŽç´§è·Ÿ \tn{(}\texttt{...}\tn{)} å½¢å¼çš„è¡Œå†…æ•°å­¦å…¬å¼æ—¶ï¼Œä¸èƒ½åŠ&nbsp;å…¥é—´è·çš„é—®é¢˜ã€‚}
% \changes{v3.2.6}{2013/08/03}{è€ƒè™‘ \pkg{ulem} å¯¹ \tn{MakeRobust} çš„ä¸å½“å®šä¹‰ã€‚}
% \changes{v3.2.6}{2013/08/03}{è€ƒè™‘ \tn{math} å’Œ \tn{ensuremath}ã€‚}
% \changes{v3.3.1}{2015/04/14}{å…¼å®¹ \LaTeXe{} 2015ã€‚}
% \tn{(} çš„åœ¨ \LaTeXe ä¸­çš„å®šä¹‰æ˜¯
% \begin{verbatim}
%   \def\({\relax\ifmmode\@badmath\else$\fi}
% \end{verbatim}
% è¿™ä¸ªå®šä¹‰æœ€å¼€å§‹çš„ \tn{relax} æ˜¯ä¸ºäº†é˜²æ­¢ \tn{(} å‡ºçŽ°åœ¨è¡¨æ&nbsp;¼å•å…ƒæ&nbsp;¼çš„å¼€å§‹ä½ç½®æ—¶ï¼Œæ¨¡å¼
% åˆ¤æ–­ä¸æ­£ç¡®ï¼ˆå›&nbsp;ä¸º \TeX ä¼šå…ˆçœ‹å•å…ƒæ&nbsp;¼ä¸­ç¬¬ä¸€ä¸ªä¸å¯å±•çš„éžç©ºæ&nbsp;¼è®°å·æ˜¯å¦æ˜¯ \tn{omit} æˆ–
% \tn{noalign}ï¼‰ã€‚ä½†æ˜¯å®ƒä¼šé€&nbsp;æˆä¸€ä¸ªè¾¹ç•Œï¼Œä½¿ \pkg{xeCJK} ä¸èƒ½çœ‹åˆ° \tn{relax} åŽé¢å‡ºçŽ°çš„
% |$|ï¼Œä»Žè€Œä¸èƒ½åŠ&nbsp;å…¥é—´è·\footnote{\url{http://tex.stackexchange.com/q/124773}}ã€‚ä½¿ç”¨
% \hologo{eTeX} çš„ \tn{protected} æ¥å®šä¹‰å®ƒï¼Œå¯ä»¥ä¸éœ€è¦ \tn{relax}ï¼Œæˆ–è€…å°† \tn{relax}
% æ”¹æˆ \cs{scan_align_safe_stop:}ï¼Œéƒ½å¯ä»¥é¿å…è¿™äº›æƒ…å†µã€‚åŒæ—¶ \pkg{fixltx2e} ä¸­è¿˜ä½¿ç”¨äº†
% |\MakeRobust\(|ï¼Œæˆ‘ä»¬éœ€è¦å°å¿ƒå¤„ç†ã€‚å¦å¤– \pkg{ulem} ä¹Ÿå®šä¹‰äº†ä¸€ä¸ª \tn{MakeRobust}ï¼Œ
% å¦‚æžœå®ƒè¢«æ”¾åœ¨ \pkg{fixltx2e} ä¹‹å‰è½½å…¥ï¼Œé‚£ä¹ˆ \pkg{fixltx2e} çš„å®šä¹‰å°±ä¼šå¤±æ•ˆï¼ˆå›&nbsp;ä¸º
% \pkg{fixltx2e} ä½¿ç”¨ \tn{providecommand}|*| æ¥å®šä¹‰ \tn{MakeRobust}ï¼‰ã€‚ä½†æ˜¯ \pkg{ulem}
% çš„å®šä¹‰å¹¶ä¸å®Œå…¨æ­£ç¡®ï¼Œæ²¡æœ‰è€ƒè™‘ \TeX ä¸ä¼šç•¥åŽ»æŽ§åˆ¶ç¬¦å·åŽé¢çš„ç©ºæ&nbsp;¼çš„æƒ…å†µã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_math_robust:N #1
  {
    \group_begin: \exp_args:NcNc \group_end:
      { @@_math_robust_aux:NN } #1 { \cs_to_str:N #1 ~ }
  }
\cs_new_protected:Npn \@@_math_robust_aux:NN #1#2
  {
    \exp_args:Ne \str_case:nnTF { \cs_replacement_spec:N #1 }
      {
        { \x@protect #1 \protect #2 } { }
        { \protect #2 } { }
      }
      { \@@_math_robust:NN #1#2 }
      { \@@_math_robust:NN #1#1 }
  }
\cs_new_protected:Npn \@@_math_robust:NN #1#2
  {
    \str_if_eq:eeTF { \cs_argument_spec:N #2 } { }
      {
        \exp_args:No \tl_if_head_eq_meaning:nNTF {#2} \scan_stop:
          {
            \cs_gset_protected:Npx #1
              { \tl_tail:N #2 }
          }
          {
            \cs_if_eq:NNTF #1 \ensuremath
              {
                \cs_gset_protected:Npx #1
                  { \exp_not:o {#2} }
              }
              {
                \@@_warning:nxx { robust-failure }
                  { \token_to_str:N #1 } { \token_to_meaning:N #2 }
              }
          }
      }
      {
        \@@_warning:nxx { robust-failure }
          { \token_to_str:N #1 } { \token_to_meaning:N #2 }
      }
  }
\@@_msg_new:nnn { robust-failure }
  { xeCJK~can~not~make~`#1'~robust. }
  {
    The~current~meaning~of~`#1'~is:\\
    \iow_indent:n {#2}
  }
\cs_if_eq:NNTF \( \math
  {
    \@@_math_robust:N \(
    \cs_set_eq:NN \math \(
  }
  {
    \@@_math_robust:N \(
    \@@_math_robust:N \math
  }
\cs_if_eq:NNTF \) \endmath
  {
    \@@_math_robust:N \)
    \cs_set_eq:NN \endmath \)
  }
  {
    \@@_math_robust:N \)
    \@@_math_robust:N \endmath
  }
\@@_math_robust:N \ensuremath
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \changes{v3.2.5}{2013/07/25}{è§£å†³ \pkg{fixltx2e} å’Œ \pkg{amsthm} çš„å†²çªã€‚}
% \changes{v3.3.1}{2015/04/15}{åˆ&nbsp;åŽ» \pkg{fixltx2e} å’Œ \pkg{amsthm} çš„å†²çªè¡¥ä¸ã€‚}
%
% \changes{v3.1.2}{2013/01/01}
% {ä¿®æ­£éž \tn{UTFencname} ç¼–ç&nbsp;ä¸‹é¢ \pkg{xunicode} é‡å®šä¹‰çš„ \tn{nobreakspace} ä¼šå¤±æ•ˆçš„é—®é¢˜ã€‚}
% \changes{v3.2.5}{2013/07/18}{æ¢å¤ \tn{nobreakspace} çš„åŽŸå§‹å®šä¹‰ã€‚}
% \changes{v3.7.0}{2018/03/18}{å¯¹ \tn{nobreakspace} çš„æ¢å¤æ”¾åˆ° \pkg{xunicode-addon} ä¸­å¤„ç†ã€‚}
%
% \changes{v3.1.1}{2012/12/13}{å¯¹äºŽä¸Ž \pkg{xltxtra} çš„å†²çªç»™å‡ºé”™è¯¯è­¦å‘Šã€‚}
% \changes{v3.8.0}{2020/02/09}{åˆ&nbsp;é™¤ \pkg{realscripts} è¡¥ä¸ã€‚}
%
% \changes{v3.8.6}{2020/10/17}{å…¼å®¹ \LaTeX\ 2020/10/01 çš„ \pkg{NFSS} é’©å­æœºåˆ¶ã€‚}
%
% \begin{macro}[int]{\fontfamily}
% \begin{macro}[int]{\xeCJK@fontfamily,\xeCJK@family}
% \changes{v3.1.1}{2012/12/06}{ä¿®æ”¹ä¸»è¦ \texttt{CJK} å­—ä½“æ—çš„è‡ªåŠ¨æ›´æ–°æ–¹å¼ã€‚}
% \changes{v3.1.2}{2013/01/01}{ä¸å°†å‚æ•°å®Œå…¨å±•å¼€ã€‚}
% \changes{v3.4.6}{2017/02/23}
%   {å°†æ—åå‚æ•°å®Œå…¨å±•å¼€ï¼Œä»¥è§£å†³ä¸Ž \pkg{fontspec} 2017/01/24 v2.5d çš„å…¼å®¹é—®é¢˜ã€‚}
% å¯¹äºŽ \LaTeXe\ 2020/02/02 ä¹‹å‰çš„ç‰ˆæœ¬ï¼Œä¿®æ”¹ \tn{fontfamily}ï¼Œ
% ä½¿ä¸»è¦ |CJK| å­—ä½“æ—èƒ½éšè¥¿æ–‡ä¸»è¦å­—ä½“æ›´æ–°ï¼Œä¹‹åŽçš„ç‰ˆæœ¬å¯ä»¥ä½¿ç”¨ \tn{@rmfamilyhook} ç­‰æ–°é’©å­å¤„ç†ã€‚
% \LaTeXe\ 2020/10/01 æä¾›äº†æ–°çš„çš„ \pkg{NFSS} é’©å­ã€‚
%    \begin{macrocode}
\ctex_if_format_at_least:nTF { 2020/10/01 }
  {
    \cs_set_eq:NN \xeCJK@family \xeCJK_switch_family:e
    \ctex_gadd_ltxhook:nn { rmfamily }   { \xeCJK@family { \CJKrmdefault } }
    \ctex_gadd_ltxhook:nn { sffamily }   { \xeCJK@family { \CJKsfdefault } }
    \ctex_gadd_ltxhook:nn { ttfamily }   { \xeCJK@family { \CJKttdefault } }
    \ctex_gadd_ltxhook:nn { normalfont } { \xeCJK@family { \CJKfamilydefault } }
  }
  {
    \cs_if_exist:NTF \@rmfamilyhook
      {
        \cs_set_eq:NN \xeCJK@family \xeCJK_switch_family:e
        \g@addto@macro \@rmfamilyhook { \xeCJK@family { \CJKrmdefault } }
        \g@addto@macro \@sffamilyhook { \xeCJK@family { \CJKsfdefault } }
        \g@addto@macro \@ttfamilyhook { \xeCJK@family { \CJKttdefault } }
        \exp_args:Nc \g@addto@macro
          {
            \cs_if_exist:NTF \@defaultfamilyhook
              { @defaultfamilyhook } { normalfont ~ }
          }
          { \xeCJK@family { \CJKfamilydefault } }
      }
      {
        \RenewDocumentCommand \fontfamily { m }
          {
            \tl_set:Nx \f@family {#1}
            \xeCJK@fontfamily {#1}
          }
        \cs_new_protected:Npn \xeCJK@fontfamily #1
          {
            \str_if_eq:nnTF {#1} { \familydefault }
              { \xeCJK_switch_family:e { \CJKfamilydefault } }
              { \@@_update_family_aux: }
          }
        \cs_new_protected:Npn \@@_update_family_aux:
          {
            \str_case_e:nn { \f@family }
              {
                { \rmdefault }     { \xeCJK_switch_family:e { \CJKrmdefault } }
                { \sfdefault }     { \xeCJK_switch_family:e { \CJKsfdefault } }
                { \ttdefault }     { \xeCJK_switch_family:e { \CJKttdefault } }
                { \familydefault } { \xeCJK_switch_family:e { \CJKfamilydefault } }
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
%&lt;@@=&gt;
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK@fix@penalty}
% \changes{v3.1.0}{2012/11/13}{é‡‡ç”¨é€šè¿‡ä¸ä¿®æ”¹åŽŸè¯­ \tn{/} çš„æ–¹å¼å¯¹ä¿®å¤å€¾æ–œæ&nbsp;¡æ­£ã€‚}
% å¯¹ \LaTeXe å†…æ&nbsp;¸ä¸­çš„ \tn{fix@penalty} è¢«ç”¨äºŽè¯¸å¦‚ \tn{textit} ä¹‹ç±»çš„æ–‡æ¡£
% å­—ä½“è½¬æ¢å‘½ä»¤çš„å®šä¹‰ä¹‹ä¸­ã€‚è¿™é‡Œå¯¹å®ƒè¿›è¡Œè¡¥ä¸çš„ç›®çš„æ˜¯ä¿®å¤å…¶ä¸­çš„å€¾æ–œæ&nbsp;¡æ­£ï¼Œå¹¶ä½¿å¾—è¿™äº›
% æ–‡æ¡£å‘½ä»¤ä¸Žç´§éšå…¶åŽçš„æ±‰å­—ä¹‹é—´å¯ä»¥æ­£ç¡®çš„æ’å…¥ \tn{CJKecglue} æˆ–è€…å¿½ç•¥å…¶ä¸­çš„ç©ºæ&nbsp;¼ã€‚
% ä¾‹å¦‚ \verb*|è¿™æ˜¯ \emph{å¼ºè°ƒ} æ–‡æœ¬|ï¼Œç¬¬äºŒä¸ªç©ºæ&nbsp;¼å¯ä»¥è¢«å¿½ç•¥æŽ‰ã€‚å¦‚æžœä½¿ç”¨ |xCJKecglue|
% é€‰é¡¹ï¼Œç¬¬ä¸€ä¸ªç©ºæ&nbsp;¼ä¹Ÿå¯ä»¥è¢«çœç•¥ã€‚äº‹å®žä¸Šï¼Œåœ¨ \tn{sw@slant} çš„å®šä¹‰ä¸­ï¼Œ\tn{@@italiccorr}
% å‰é¢çš„ \tn{lastskip} å’Œ \tn{lastpenalty} æœ‰å››ç§æƒ…å†µï¼Œè¿™é‡Œåªå¯¹å®ƒä»¬éƒ½ä¸ºé›¶çš„æƒ…å†µè¿›è¡Œ
% å¤„ç†ã€‚
%    \begin{macrocode}
\cs_new_eq:NN \xeCJK@fix@penalty \fix@penalty
\tl_replace_once:Nnn \xeCJK@fix@penalty { \@@italiccorr } { \xeCJK@italiccorr }
\tl_replace_once:Nnn \sw@slant          { \fix@penalty }  { \xeCJK@fix@penalty }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK@italiccorr}
% ä¿®å¤å€¾æ–œæ&nbsp;¡æ­£ï¼Œå¹¶å¤„ç†æ±‰å­—åŽé¢çš„ç©ºæ&nbsp;¼ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK@italiccorr
  {
    \int_compare:nNnTF \tex_XeTeXinterchartokenstate:D &gt; \c_zero_int
      { \xeCJK_italic_correction: }
      { \@@italiccorr }
  }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%&lt;@@=xeCJK&gt;
%    \end{macrocode}
%
% \begin{macro}[int]{\xeCJK_italic_correction:}
% ä¿®å¤å€¾æ–œæ&nbsp;¡æ­£ï¼Œå¹¶å¤„ç†æ±‰å­—åŽé¢çš„ç©ºæ&nbsp;¼ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_italic_correction:
  { \@@_if_last_kern:T { \@@_italic_correction: } }
\cs_new_protected:Npn \@@_italic_correction:
  {
    \dim_case:nnF { \tex_lastkern:D }
      {
        { \@@_node:n { default } }
        {
          \xeCJK_remove_node: \tex_italiccorrection:D
          \xeCJK_make_node:n { default }
        }
        { \@@_node:n { CJK } }
        {
          \xeCJK_remove_node: \tex_italiccorrection:D
          \xeCJK_make_node:n { CJK }
          \@@_italic_correction_aux:
        }
        { \@@_node:n { CJK-space } }
        {
          \xeCJK_remove_node: \tex_italiccorrection:D
          \xeCJK_make_node:n { CJK-space }
          \@@_italic_correction_aux:
        }
      }
      { \tex_italiccorrection:D }
  }
%    \end{macrocode}
% \cs{xeCJK_ignore_spaces:w} é‡Œé¢ç”¨åˆ° |peek| å‡½æ•°æ¥åˆ¤æ–­åŽé¢æ˜¯ä¸æ˜¯ç©ºæ&nbsp;¼ï¼Œè€Œæ­¤æ—¶å®ƒ
% åŽé¢è¿˜æœ‰ $4$ ä¸ª \tn{fi} æˆ–è€… |\else...\fi| æ²¡æœ‰è¢«å±•å¼€ï¼Œå°†å½±å“ |peek| å‡½æ•°çš„
% åˆ¤æ–­ã€‚å›&nbsp;æ­¤æˆ‘ä»¬éœ€è¦ç”¨ $2^4-1=15$ ä¸ª \cs{exp_after:wN} æ¥å±•å¼€å®ƒä»¬ã€‚
% æ˜¾ç„¶ï¼Œè¿™é‡Œç”¨ \cs{exp_last_unbraced:Nf} ä¼šæ¯”è¾ƒæ–¹ä¾¿ï¼Œä½†æ˜¯å®ƒä¼šåƒæŽ‰
% \verb*|\textit{...} | ç­‰åŽé¢åŽŸæ¥å­˜åœ¨çš„ç©ºæ&nbsp;¼ä½œä¸ºå®Œå…¨å±•å¼€çš„ç»“æŸã€‚è¦æ­£ç¡®ä½¿ç”¨å®ƒè¿˜
% éœ€è¦å¦å¤–çš„å¤„ç†ï¼ˆä½¿ç”¨ \cs{exp_stop_f:}ï¼‰ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_italic_correction_aux:
  {
                  \exp_after:wN \exp_after:wN \exp_after:wN
    \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN
    \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN
    \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN
    \xeCJK_ignore_spaces:w
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\g_@@_xetex_allocator_int}
% \changes{v3.3.1}{2015/04/14}{å…¼å®¹ \LaTeXe{} 2015ã€‚}
% \changes{v3.3.2}{2015/05/15}{\tn{xe@alloc@intercharclass} æ€»æ˜¯æœ‰å®šä¹‰çš„ã€‚}
% \LaTeXe{} 2015/01/01 æŽ¥ç®¡äº† \tn{newXeTeXintercharclass}ã€‚
%    \begin{macrocode}
\cs_new_eq:NN \g_@@_xetex_allocator_int \xe@alloc@intercharclass
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}{\@@_set_others_toks:n}
% ç®€å•å¤„ç†ä¸ŽåŒæ&nbsp;·ä½¿ç”¨ \tn{XeTeXinterchartoks} æœºåˆ¶çš„å®åŒ…çš„å…¼å®¹é—®é¢˜ã€‚
%     \begin{macrocode}
\@@_after_end_preamble:n
  {
    \int_compare:nNnF
      { \c_@@_class_begin_int + \seq_count:N \g_@@_new_class_seq } =
      { \g_@@_xetex_allocator_int }
      {
        \int_step_inline:nnn
          { \c_@@_class_begin_int + 1 }
          { \g_@@_xetex_allocator_int }
          {
            \seq_if_in:NnF \g_@@_new_class_seq {#1}
              { \@@_set_others_toks:n {#1} }
          }
      }
  }
\cs_new_protected:Npn \@@_set_others_toks:n #1
  {
    \int_set:cn { \@@_class_csname:n { Others } } {#1}
    \seq_map_inline:Nn \g_@@_CJK_class_seq
      {
        \xeCJK_copy_inter_class_toks:nnnn {##1} { Others } {##1} { NormalSpace }
        \xeCJK_copy_inter_class_toks:nnnn { Others } {##1} { NormalSpace } {##1}
        \xeCJK_app_inter_class_toks:nne {##1} { Others }
          { \xeCJK_get_inter_class_toks:nn { Default } { Others } }
        \xeCJK_pre_inter_class_toks:nne { Others } {##1}
          { \xeCJK_get_inter_class_toks:nn { Others } { Default } }
        \tl_if_blank:eT
          { \xeCJK_get_inter_class_toks:nn { Others } { Boundary } }
          {
            \xeCJK_copy_inter_class_toks:nnnn
              { Others } { Boundary } { Default } { Boundary }
          }
        \tl_if_blank:eT
          { \xeCJK_get_inter_class_toks:nn { Boundary } { Others } }
          {
            \xeCJK_copy_inter_class_toks:nnnn
              { Boundary } { Others } { Boundary } { Default }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_inactive_group_begin:,\@@_inactive_group_end:}
% ç”¨äºŽä¿æŠ¤ä¸‹é¢æ­§ä¹‰å®½åº¦æ&nbsp;‡ç‚¹çš„åˆ†ç»„ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_inactive_group_begin:
  { \group_begin: \makexeCJKinactive }
\cs_new_eq:NN \@@_inactive_group_end: \group_end:
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_patch_text_command:}
% \begin{variable}{\c_@@_ambiguous_char_prop}
% å•ç‹¬å¤„ç†å®½åº¦æœ‰åˆ†æ­§çš„å‡&nbsp;ä¸ªæ&nbsp;‡ç‚¹ï¼šåŒ…æ‹¬çœç•¥å·ã€ç&nbsp;´æŠ˜å·ã€é—´éš”å·ã€å¼•å·ç­‰ä¸­è¥¿æ–‡æ··ç”¨çš„
% ç¬¦å·ï¼Œ ä¿è¯å…¶å‘½ä»¤å½¢å¼è¾“å‡ºçš„æ˜¯è¥¿æ–‡å­—ä½“ã€‚
% å¦‚æžœ \pkg{xunicode} å®åŒ…è¢«è½½å…¥ï¼Œåˆ™é€šè¿‡ \pkg{xunicode-addon} å¤„ç†ã€‚
%    \begin{macrocode}
\prop_const_from_keyval:Nn \c_@@_ambiguous_char_prop
  {
    "00B7 = \textperiodcentered \textcentereddot \textcdot ,
    "2013 = \textendash ,
    "2014 = \textemdash ,
    "2018 = \textquoteleft \textgrq ,
    "2019 = \textquoteright ,
    "201C = \textquotedblleft \textgrqq ,
    "201D = \textquotedblright ,
    "2025 = \texthdotfor ,
    "2026 = \textellipsis ,
    "2027 = \texthyphenationpoint ,
    "2E3A = \texttwoemdash
  }
\@@_at_end_preamble:n { \@@_patch_text_command: }
\cs_new_protected:Npn \@@_patch_text_command:
  {
    \xeCJK_if_package_loaded:nTF { xunicode }
      { \@@_patch_xunicode_ambiguous_char: }
      {
        \exp_args:Ne \@@_patch_tuenc_ambiguous_char:n
          { \UnicodeEncodingName }
        \@@_patch_tuenc_accent:
        \@@_patch_tuenc_composite:
      }
  }
\cs_new_protected:Npn \@@_patch_xunicode_ambiguous_char:
  {
    \RequirePackage { xunicode-addon }
    \prop_map_inline:Nn \c_@@_ambiguous_char_prop
      {
        \tl_map_inline:nn { ##2 }
          {
            \xunadd_set_begin_hook:nn { ####1 }
              { \@@_inactive_group_begin: }
            \xunadd_set_end_hook:nn { ####1 }
              { \@@_inactive_group_end: }
          }
      }
    \xunadd_append_begin_hook:n { \xeCJK_make_boundary: }
  }
\cs_new_protected:Npn \@@_patch_tuenc_ambiguous_char:n #1
  {
    \prop_map_inline:Nn \c_@@_ambiguous_char_prop
      {
        \tl_map_inline:nn { ##2 }
          {
            \cs_if_exist:NF ####1
              { \DeclareTextSymbol ####1 {#1} { ##1 } }
            \@@_patch_ambiguous_char:nN {#1} ####1
          }
      }
  }
\cs_new_protected:Npn \@@_patch_ambiguous_char:nN #1#2
  {
    \exp_args:Ne \@@_patch_ambiguous_char:nn
      { #1 \token_to_str:N #2 }
      { #1 - #2 }
  }
\cs_new_protected:Npx \@@_patch_ambiguous_char:nNn #1#2#3
  {
    \exp_not:N \exp_args:Ne
    \exp_not:N \@@_patch_ambiguous_char:nn
      {
        \c_backslash_str #1
        \exp_not:N \token_to_str:N #2 -
        \exp_not:N \token_to_str:N #3
      }
      { #1 - #2#3 }
  }
\cs_new_protected:Npn \@@_patch_ambiguous_char:nn #1#2
  {
    \cs_if_free:cF {#1}
      { \exp_args:Nc \@@_patch_ambiguous_char:Nn {#1} {#2} }
  }
\cs_new_protected:Npn \@@_patch_ambiguous_char:Nn #1#2
  {
    \token_if_chardef:NTF #1
      {
        \prop_gput:Nne \c_@@_ambiguous_slot_prop {#2}
          { \int_eval:n {#1} }
        \cs_set_protected:Npx #1
          { \@@_ambiguous_char:n { \tex_Uchar:D #1 } }
      }
      {
        \prop_gput:Nne \c_@@_ambiguous_slot_prop {#2}
          { \int_eval:n { \exp_after:wN ` #1 } }
        \cs_set_protected:Npx #1
          { \@@_ambiguous_char:n { \exp_not:o {#1} } }
      }
  }
\cs_new_protected:Npn \@@_ambiguous_char:n #1
  {
    \int_compare:nNnTF \tex_XeTeXinterchartokenstate:D &gt; \c_zero_int
      { \@@_inactive_group_begin: #1 \@@_inactive_group_end: }
      {#1}
  }
\prop_new:N \c_@@_ambiguous_slot_prop
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
% \begin{macro}{\@@_patch_tuenc_composite:}
% \changes{v3.7.2}{2018/05/02}{ä¿®å¤è¡¥ä¸é”™è¯¯ã€‚}
% \tn{DeclareUnicodeComposite} å…·æœ‰æ£€æŸ¥å­—ç¬¦æ˜¯å¦å­˜åœ¨çš„åŠŸèƒ½ï¼Œ
% å½“ç¬¦å·å‘½ä»¤ç´§è·Ÿåœ¨ CJK å­—ç¬¦ç±»åŽé¢æ—¶ï¼Œéœ€è¦ä½¿å­—ä½“å›žåˆ°è¥¿æ–‡çŠ¶æ€
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_text_composite_patch:
  {
    \str_if_eq:eeT { \f@encoding } { \UnicodeEncodingName }
      { \xeCJK_make_boundary: }
  }
%    \end{macrocode}
% æ³¨æ„ \cs{xeCJK_text_composite_patch:} å¯èƒ½ä¼šç»“æŸåˆ†ç»„ï¼Œä»Žè€Œå¯¼è‡´ |##1| æ²¡æœ‰å®šä¹‰æ—¶æ˜¯
% \tn{undefined} è€Œä¸æ˜¯ \tn{relax}ï¼Œæ‰€ä»¥ä¸èƒ½å°†å®ƒä¸Ž \tn{relax} ä½œæ¯”è¾ƒã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_patch_tuenc_composite:
  {
    \cs_set_nopar:Npn \@text@composite@x
      {
        \xeCJK_text_composite_patch:
        \cs_if_exist_use:NF
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_patch_tuenc_accent:}
% \tn{add@unicode@accent} å®šä¹‰æœ€åŽç”¨äºŽæˆªæ–­æ•°å­—å±•å¼€çš„ \tn{relax} ä¼šé€&nbsp;æˆè¾¹ç•Œï¼Œå¯èƒ½ä¼šå½±å“ç»„åˆæ&nbsp;‡è®°ã€‚
%    \begin{macrocode}
\group_begin:
\char_set_catcode_other:n { "A0 }
\cs_new_protected:Npn \@@_patch_tuenc_accent:
  {
    \cs_set_protected_nopar:Npn \add@unicode@accent ##1 ##2
      {
        \tl_if_blank:nTF { ##2 } { ^^a0 } { ##2 }
        \tex_Uchar:D \tex_numexpr:D ##1 \scan_stop:
      }
  }
\group_end:
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_patch_middle_dot:}
% \begin{variable}{\c_@@_middle_dot_prop}
% \changes{v3.2.9}{2013/12/08}
% {å®Œæ•´å¤„ç† \file{encguide.pdf} çš„ç¼–ç&nbsp;ç¬¦å·è¡¨ä¸­ï¼Œä¸Žæ—§ç¼–ç&nbsp;çš„ \texttt{U+00B7} å†²çªã€‚}
% å¸¸è¢«ç”¨ä½œä¸­æ–‡é—´éš”å·çš„ \texttt{U+00B7} ä¸Ž T1 ç­‰æ—§å­—ä½“ç¼–ç&nbsp;ä¸‹å®šä¹‰çš„ç¬¦å·å‘½ä»¤å†²çªã€‚
% åœ¨ \file{encguide.pdf} çš„ç¼–ç&nbsp;ç¬¦å·è¡¨ä¸­ï¼Œå¦‚ä¸‹å®šä¹‰æœ‰å†²çªã€‚
% \begin{verbatim}
%   \DeclareTextComposite{\r}{T1}{u}{183}
%   \DeclareTextSymbol{\cyrchvcrs}{T2A}{183}
%   \DeclareTextSymbol{\cyrchldsc}{T2B}{183}
%   \DeclareTextSymbol{\cyrabhha}{T2C}{183}
%   \DeclareTextSymbol\textvibyy{T3}{183}
%   \DeclareTextComposite{\B}{T4}{t}{183}
%   \DeclareTextComposite{\`}{T5}{\ecircumflex}{183}
%   \DeclareTextDoubleComposite{\`}{T5}{\^}{e}{183}
%   \DeclareTextSymbol{\textperiodcentered}{TS1}{183}
%   \DeclareTextSymbol{\cyrchldsc}{X2}{183}
%   \DeclareTextSymbol{\textperiodcentered}{LY1}{183}
% \end{verbatim}
% LGR ç¼–ç&nbsp;çš„ç¬¦å·è¡¨æœ‰ \texttt{183} å·å­—ç¬¦ï¼Œä½†åœ¨ \file{lgrenc.def} ä¸­æœªæ‰¾åˆ°ç›¸åº”çš„
% ç¬¦å·å‘½ä»¤ã€‚
%    \begin{macrocode}
\prop_const_from_keyval:Nn \c_@@_middle_dot_prop
  {
    T2A = \cyrchvcrs ,
    T2B = \cyrchldsc ,
    T2C = \cyrabhha ,
    X2  = \cyrchldsc ,
    TS1 = \textperiodcentered ,
    LY1 = \textperiodcentered ,
    T1  = \r u ,
    T4  = \B t ,
    T5  = \` \ecircumflex
  }
\@@_at_end_preamble:n { \@@_patch_middle_dot: }
\cs_new_protected:Npn \@@_patch_middle_dot:
  {
    \prop_map_inline:Nn \c_@@_middle_dot_prop
      { \@@_patch_middle_dot:nw { ##1 } ##2 \q_stop }
    \@@_patch_ambiguous_char:nNn { T5 } \` { \^ - e }
  }
\cs_new_protected:Npn \@@_patch_middle_dot:nw #1#2#3 \q_stop
  {
    \tl_if_empty:nTF {#3}
      { \@@_patch_ambiguous_char:nN {#1} #2 }
      { \@@_patch_ambiguous_char:nNn {#1} #2 {#3} }
  }
%    \end{macrocode}
% \pkg{pifont} å®åŒ…çš„ç¬¦å· |\ding{183}| ä¹Ÿæœ‰å†²çªã€‚
%    \begin{macrocode}
\@@_package_hook:nn { pifont }
  {
    \RenewDocumentCommand \Pifont { m }
      { \makexeCJKinactive \usefont { U } {#1} { m } { n } }
  }
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
% \changes{v3.8.3}{2020/04/09}{å…¼å®¹ \pkg{unicode-math} å’Œ \opt{CJKmath} é€‰é¡¹ã€‚}
%
% \begin{macro}{\@@_save_um_char:, \@@_save_um_char:}
% å…¼å®¹ \pkg{unicode-math} å’Œ \opt{CJKmath} é€‰é¡¹ï¼Œ
% é¿å…å°†ä¸€äº›ä¸­è¥¿æ–‡æ··ç”¨çš„æ&nbsp;‡ç‚¹è®¾ç½®ä¸º CJK å­—ä½“ã€‚
%    \begin{macrocode}
\@@_package_hook:nn { unicode-math }
  {
    \prop_const_from_keyval:Nn \c_@@_um_ambiguous_char_prop
      {
        "00B7 = \cdotp ,
        "2025 = \enleadertwodots ,
        "2026 = \unicodeellipsis
      }
    \cs_new_protected:Npn \@@_save_um_char:
      {
        \cs_set_protected:Npx \@@_restore_um_char:
          {
            \prop_map_function:NN
              \c_@@_um_ambiguous_char_prop
              \@@_restore_um_char_aux:nn
          }
      }
    \cs_new_eq:NN \@@_restore_um_char: \prg_do_nothing:
    \cs_new:Npn \@@_restore_um_char_aux:nn #1#2
      {
        \@@_gset_mathcodenum:nn
          { \int_value:w #1 }
          { \int_value:w \tex_Umathcodenum:D #1 }
      }
    \cs_new_protected:Npn \@@_gset_mathcodenum:nn #1#2
      {
        \int_compare:nNnF { \tex_Umathcodenum:D #1 } = {#2}
          { \tex_global:D \tex_Umathcodenum:D #1 = #2 ~ }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.8.5}{2020/06/25}{è¿›ä¸€æ­¥å…¼å®¹ \pkg{microtype}ã€‚}
%
% \begin{macro}{\@@_patch_microtype_get_slot:}
% å…¼å®¹ \pkg{microtype}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_patch_microtype_get_slot:
  {
    \cs_new_eq:NN \xeCJK@original@get@slot \MT@get@slot@
    \cs_set_eq:NN \MT@get@slot@ \xeCJK@microtype@get@slot
    \cs_set_eq:NN \MT@warn@unknown@once \use_none:n
  }
\cs_new_protected_nopar:Npn \xeCJK@microtype@get@slot
  {
    \int_compare:nNnT \MT@char &lt; \c_zero_int
      { \@@_get_ambiguous_slot: }
    \xeCJK@original@get@slot
  }
\cs_new_protected:Npn \@@_get_ambiguous_slot:
  {
    \prop_get:NeNT \c_@@_ambiguous_slot_prop
      { \MT@encoding - \tex_the:D \MT@toks } \l_@@_tmp_tl
      { \cs_set_eq:NN \MT@char \l_@@_tmp_tl }
  }
\cs_new_protected:Npn \xeCJK@microtype@restore@pickupfont
  { \@@_gadd_font_initial_hook:n { \MT@ltx@pickupfont } }
\@@_package_hook:nn { microtype }
  {
    \cs_if_free:NF \MT@get@slot@
      { \@@_patch_microtype_get_slot: }
    \MT@addto@setup { \xeCJK@microtype@restore@pickupfont }
  }
%    \end{macrocode}
% \end{macro}
%
% ç®€å•å¤„ç†ä¸Ž \pkg{hyperref} å®åŒ…çš„å…¼å®¹é—®é¢˜ã€‚
%    \begin{macrocode}
\@@_package_hook:nn { hyperref }
  {
    \pdfstringdefDisableCommands
      {
        \@@_gobble_CJKfamily:
        \xeCJK_cs_clear:N \@@_inactive_group_begin:
        \xeCJK_cs_clear:N \@@_inactive_group_end:
        \xeCJK_cs_clear:N \makexeCJKinactive
        \xeCJK_cs_clear:N \xeCJK_text_composite_patch:
      }
  }
%    \end{macrocode}
%
% \changes{v3.1.0}{2012/11/13}{å–æ¶ˆ \tn{cprotect} çš„å¤–éƒ¨å®é™åˆ¶ã€‚}
% å½“æŽ¢æµ‹åˆ° \pkg{cprotect} å®åŒ…è¢«å¼•å…¥æ—¶ï¼Œåˆ™å–æ¶ˆ \tn{cprotect} å®çš„ \tn{outer} å®šä¹‰ã€‚
%    \begin{macrocode}
\@@_package_hook:nn { cprotect }
  {
    \cs_if_free:NF \icprotect
      { \exp_after:wN \tex_let:D \cs:w cprotect \cs_end: \icprotect }
  }
%    \end{macrocode}
%
% \changes{v3.2.11}{2014/03/14}{åˆ&nbsp;é™¤ \tn{xeCJKcaption}ã€‚}
% \changes{v3.8.0}{2020/02/09}{åˆ&nbsp;é™¤ \pkg{CJKfntef} è¡¥ä¸ã€‚}
%
% åœ¨ \pkg{listings} å®åŒ…åŽè‡ªåŠ¨è½½å…¥ \pkg{xeCJK-listings}ã€‚
%    \begin{macrocode}
\@@_package_hook:nn { listings }
  { \RequirePackage { xeCJK-listings } }
%    \end{macrocode}
%
%
% \changes{v3.3.3}{2015/12/12}{è§£å†³ä¸Ž \pkg{microtype} å®åŒ…çš„å…¼å®¹é—®é¢˜ã€‚}
% ç”±äºŽ \pkg{xeCJK} å‡è£… \pkg{CJK} å·²ç»è¢«å¼•å…¥äº†ï¼Œè¿™ä¼šå¯èƒ½å¯¼è‡´æ—§ç‰ˆæœ¬çš„ \pkg{everysel} åŒ…åˆ¤æ–­é”™è¯¯ã€‚
% éœ€è¦åœ¨å®ƒä»¬åˆ¤æ–­ä¹‹å‰å–æ¶ˆå®šä¹‰ã€‚
%    \begin{macrocode}
\@@_package_hook:nn { everysel }
  {
    \cs_if_exist:NF \@EverySelectfont@Legacy
      { \cs_undefine:c { ver@CJK . \c_@@_package_ext_tl } }
  }
%    \end{macrocode}
%
% \changes{v3.2.4}{2013/06/25}{ä¸å†ä½¿ç”¨ \texttt{CJKnumber} é€‰é¡¹ï¼Œå¯ä»¥åœ¨
% \pkg{xeCJK} ä¹‹åŽç›´æŽ¥ä½¿ç”¨ \pkg{CJKnumb} å®åŒ…å¾—åˆ°ä¸­æ–‡æ•°å­—ã€‚}
% \changes{v3.8.7}{2021/06/04}{æ›´å¥½åœ°å…¼å®¹ \pkg{CJKnumb}ã€‚}
%
% \begin{macro}[int]{\CJKaddEncHook}
% ä¸ºä½¿ç”¨ \pkg{CJKnumb} å®åŒ…è€Œä½œä¸€äº›å¤„ç†ã€‚å¦å¤– \pkg{CJKnumb} ä½¿ç”¨çš„æ˜¯ä¼&nbsp;ç»Ÿæ±‰å­—â€œè¬â€
% å’Œâ€œå„„â€ï¼Œæˆ‘ä»¬åœ¨è¿™é‡ŒæŠŠå®ƒä»¬ä¿®æ­£ä¸ºç®€ä½“å­—ã€‚
% \changes{v3.2.10}{2014/03/01}{ä½¿ç”¨ \pkg{CJKnumb} æ—¶ï¼Œè®© \tn{Unicode} æœ‰å®šä¹‰ã€‚}
% \changes{v3.3.1}{2015/05/08}{åº”ç”¨ \texttt{0.99992} ç‰ˆçš„æ–°åŽŸè¯­ \tn{Ucharcat}ã€‚}
%    \begin{macrocode}
\ctex_at_begin_package:nn { CJKnumb }
  {
    \tl_new:N \l_@@_CJK_version_tl
    \tl_set_eq:Nc \l_@@_CJK_version_tl { ver@CJK . \c_@@_package_ext_tl }
    \tl_set:cn { ver@CJK . \c_@@_package_ext_tl } { 9999/99/99 }
    \cs_new_protected:Npn \CJKaddEncHook #1#2
      {
        \str_if_eq:nnT {#1} { \CJK@UnicodeEnc }
          {
            \group_begin:
              \cs_set_eq:NN \Unicode \xeCJK_unicode_char:nn
              \cs_set_eq:NN \def \xdef
              #2
            \group_end:
            \str_gset:Nn \CJK@tenthousand    { ^^^^4e07 }
            \str_gset:Nn \CJK@hundredmillion { ^^^^4ebf }
            \tl_if_exist:NF \CJK@UnicodeEnc
              { \tl_const:Nn \CJK@UnicodeEnc { UTF8 } }
            \cs_if_exist:NF \Unicode
              { \cs_new_eq:NN \Unicode \xeCJK_unicode_char:nn }
          }
      }
    \cs_new:Npn \xeCJK_unicode_char:nn #1#2
      { \tex_Uchar:D \tex_numexpr:D (#1) * 256 + (#2) \scan_stop: }
  }
\ctex_at_end_package:nn { CJKnumb }
  { \tl_set_eq:cN { ver@CJK . \c_@@_package_ext_tl } \l_@@_CJK_version_tl }
%    \end{macrocode}
% \end{macro}
%
% æœ€åŽå¼•å…¥æœ¬åœ°é…ç½®æ–‡ä»¶ã€‚
%    \begin{macrocode}
\bool_if:NT \g_@@_config_bool
  {
    \ExplSyntaxOff
    \file_input:n { \g_@@_config_name_tl .cfg }
    \ExplSyntaxOn
  }
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/package&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJKfntef}}
%
% \changes{v3.1.1}{2012/12/08}{å¢žåŠ&nbsp;å°å®åŒ… \pkg{xeCJKfntef}ï¼Œç”¨äºŽå¤„ç†ä¸‹åˆ’çº¿çš„é—®é¢˜ã€‚}
% \changes{v3.2.4}{2013/06/23}{ä¿®æ­£ \pkg{xeCJKfntef} ä¸Ž \pkg{natbib} ç­‰çš„å†²çªã€‚}
% \changes{v3.2.14}{2014/10/31}{å®Œå–„ \tn{varCJKunderline} çš„å®žçŽ°ã€‚}
% \changes{v3.2.14}{2014/10/31}{è§£å†³ä¸‹åˆ’çº¿å‰åŽæ²¡æœ‰ \tn{CJKglue} æˆ– \tn{CJKecglue} çš„é—®é¢˜ã€‚}
% \changes{v3.2.14}{2014/11/03}{\pkg{xeCJKfntef} ä¸å†ä¾èµ– \pkg{CJKfntef}ã€‚}
% \changes{v3.2.15}{2014/11/07}{\pkg{xeCJKfntef} å¢žåŠ&nbsp; \texttt{hidden} é€‰é¡¹ã€‚}
%
%    \begin{macrocode}
%&lt;*fntef&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\PassOptionsToPackage { normalem } { ulem }
\DeclareOption* { \PassOptionsToPackage { \CurrentOption } { ulem } }
\ProcessOptions \scan_stop:
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage { xeCJK }
\RequirePackage { ulem }
%    \end{macrocode}
%
%    \begin{macrocode}
\addto@hook \UL@hook { \xeCJK_hook_for_ulem: }
%    \end{macrocode}
%
% \changes{v3.4.1}{2016/06/03}{æ–°çš„ä¸‹åˆ’çº¿é€‰é¡¹ \texttt{textformat}ã€‚}
%
% \begin{macro}[int]{\xeCJK_hook_for_ulem:}
% \changes{v3.1.0}{2012/11/16}{ç®€åŒ–å¯¹ \pkg{ulem} å®åŒ…çš„å…¼å®¹è¡¥ä¸ã€‚}
% \changes{v3.1.1}{2012/12/08}{å®Œå…¨å¤„ç†ä¸‹åˆ’çº¿é‡Œçš„æ&nbsp;‡ç‚¹ç¬¦å·çš„æœ‰å…³é—®é¢˜ã€‚}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_hook_for_ulem:
  {
    \xeCJK_ulem_detect_node:
    \l_@@_ulem_text_format_tl
    \bool_if:NF \l_@@_ulem_hook_used_bool
      {
        \bool_set_true:N \l_@@_ulem_hook_used_bool
        \@@_ulem_hook:
      }
    \xeCJK_ulem_begin_node:
  }
\cs_new_protected:Npn \@@_ulem_hook:
  {
    \@@_ulem_initial:
    \bool_if:NT \l_@@_ulem_subtract_bool
      {
        \xeCJK_swap_cs:NN \UL@leaders \xeCJK_ulem_leaders:
        \cs_set_eq:NN \@@_ulem_var_leaders: \xeCJK_ulem_var_leaders:
        \cs_set_eq:NN \xeCJK_ulem_right_skip: \@@_ulem_right_skip:
      }
    \bool_if:NT \l_@@_ulem_hidden_bool
      { \cs_set_eq:NN \UL@putbox \@@_ulem_hidden_box: }
    \bool_if:NTF \l_@@_ulem_skip_bool
      {
        \cs_set_eq:NN \@@_ulem_putbox: \UL@putbox
        \cs_set_eq:NN \@@_ulem_hskip_aux:n \xeCJK_ulem_hskip:n
      }
      {
        \xeCJK_swap_cs:NN \@@_punct_hskip:n \@@_ulem_punct_hskip:n
        \xeCJK_cs_clear:N \@@_ulem_skip_punct_begin:
        \xeCJK_cs_clear:N \@@_ulem_skip_punct_end:
      }
    \xeCJK_glue_to_skip:nN
      {
        \cs_set_eq:NN \  \tex_space:D
        \cs_set_eq:NN \penalty \tex_penalty:D
        \cs_set_eq:NN \hskip \skip_horizontal:N
        \CJKglue
      } \l_@@_ccglue_skip
    \xeCJK_glue_to_skip:nN
      {
        \cs_set_eq:NN \  \tex_space:D
        \cs_set_eq:NN \penalty \tex_penalty:D
        \cs_set_eq:NN \hskip \skip_horizontal:N
        \CJKecglue
      } \l_@@_ecglue_skip
    \xeCJK_glue_to_skip:nN { \xeCJK_space_glue: } \l_@@_space_skip
    \cs_set_protected:Npn \CJKglue
      { \@@_ulem_glue:n \l_@@_ccglue_skip }
    \cs_set_protected:Npn \CJKecglue
      { \@@_ulem_glue:n \l_@@_ecglue_skip }
    \cs_set_protected:Npn \xeCJK_space_glue:
      { \@@_ulem_glue:n \l_@@_space_skip }
    \cs_set_eq:NN \xeCJK_punct_node:N \use_none:n
    \cs_set_eq:NN \xeCJK_if_last_punct:TF \use_ii:nn
    \keys_set:nn { xeCJK / options }
      { CheckFullRight = false , xCJKecglue = false }
  }
\skip_new:N \l_@@_space_skip
\bool_new:N \l_@@_ulem_hook_used_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\UL@word,\xeCJK_ulem_word:nw}
% ä¿®æ”¹ \tn{UL@word}ï¼Œç›®çš„æ˜¯å–å¾—åˆ†ç»„ä¸­çš„ \tn{UL@leadtype}ï¼Œä»¥ä¾¿åŠ&nbsp;å…¥ \cs{xeCJK_ulem_right_skip:}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_ulem_word:nw #1 ~
  {
    \@@_ulem_start:w #1 ~
    \exp_after:wN \if_meaning:w \exp_after:wN \UL@end #1
      \exp_after:wN \@@_ulem_end:
    \else:
      \exp_after:wN \@@_ulem_loop:nw
    \fi:
  }
\cs_new_protected:Npn \@@_ulem_end:
  {
        \c_group_end_token
      \c_group_end_token
      \tex_unskip:D \tex_unskip:D \tex_unskip:D
      \xeCJK_ulem_right_skip:
    \xeCJK_ulem_group_end:
    \xeCJK_ulem_right_node:
    \int_set:Nn \tex_spacefactor:D { \UL@spfactor }
  }
\cs_new_protected:Npn \@@_ulem_loop:nw
  {
    \reverse_if:N \if_mode_math:
      \reverse_if:N \if_dim:w \tex_lastskip:D = \c_zero_dim
        \skip_gset_eq:NN \UL@skip \tex_lastskip:D
        \tex_unskip:D
        \UL@stop \UL@leaders
      \fi:
    \fi:
    \xeCJK_ulem_word:nw \prg_do_nothing:
  }
\cs_new_protected:Npn \@@_ulem_start:w
  { \exp_after:wN \UL@start }
\cs_set_eq:NN \UL@word \xeCJK_ulem_word:nw
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_ulem_left:, \xeCJK_ulem_detect_node:}
% åœ¨ä¸‹åˆ’çº¿å¼€å§‹ä¹‹å‰æŽ¢æµ‹ä¹‹å‰çš„ \texttt{node}ï¼Œä»¥ä¾¿éšåŽæ’å…¥ \tn{CJKglue} æˆ– \tn{CJKecglue}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_ulem_left:
  {
    \xeCJK_ulem_left_node:
    \xeCJK_make_group_tag:
  }
\cs_new_eq:NN \xeCJK_ulem_left_node: \prg_do_nothing:
\cs_new_protected:Npn \xeCJK_ulem_detect_node:
  {
    \scan_stop:
    \dim_compare:nNnTF \tex_lastkern:D = \c_zero_dim
      {
        \xeCJK_cs_clear:N \xeCJK_ulem_left_node:
        \xeCJK_cs_clear:N \xeCJK_ulem_begin_node:
        \cs_set_eq:NN \@@_ulem_hskip:n \xeCJK_ulem_hskip:n
      }
      {
        \dim_set_eq:NN \l_@@_tmp_dim \tex_lastkern:D
        \tex_unkern:D
        \dim_compare:nNnTF \tex_lastkern:D = { - \l_@@_tmp_dim }
          {
            \tex_unkern:D
            \cs_set_protected:Npx \xeCJK_ulem_left_node:
              {
                \tex_kern:D - \dim_use:N \l_@@_tmp_dim \exp_stop_f:
                \tex_kern:D   \dim_use:N \l_@@_tmp_dim \exp_stop_f:
              }
            \cs_set_protected:Npn \xeCJK_ulem_begin_node:
              { { \xeCJK_make_node:n { ulem-begin } } }
            \cs_set_eq:NN \@@_ulem_hskip:n \@@_ulem_hskip_first:n
          }
          {
            \tex_kern:D \l_@@_tmp_dim
            \xeCJK_cs_clear:N \xeCJK_ulem_left_node:
            \xeCJK_cs_clear:N \xeCJK_ulem_begin_node:
            \cs_set_eq:NN \@@_ulem_hskip:n \xeCJK_ulem_hskip:n
          }
      }
  }
\xeCJK_declare_node:n { ulem-begin }
\cs_new_eq:NN \xeCJK_ulem_begin_node: \prg_do_nothing:
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_hskip_first:n, \xeCJK_ulem_hskip:n}
% å¦‚æžœç¬¬ä¸€æ¬¡è°ƒç”¨çš„ \tn{CJKglue} æˆ– \tn{CJKecglue} ç”±ä¸‹åˆ’çº¿ä¸­çš„ç¬¬ä¸€ä¸ªæ–‡å­—å’Œä¹‹å‰çš„
% å†…å®¹äº§ç”Ÿï¼Œå°±ä¸ç”¨ç”»ä¸‹åˆ’çº¿ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_hskip_first:n #1
  {
    \xeCJK_if_last_node:nTF { ulem-begin }
      {
        \xeCJK_remove_node:
        \skip_horizontal:n {#1}
      }
      { \xeCJK_ulem_hskip:n {#1} }
    \cs_set_eq:NN \@@_ulem_hskip:n \xeCJK_ulem_hskip:n
  }
\cs_new_eq:NN \@@_ulem_hskip:n \@@_ulem_hskip_first:n
\cs_new_protected:Npn \xeCJK_ulem_hskip:n #1
  { { \skip_set:Nn \UL@skip {#1} \UL@leaders } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_ulem_right:, \xeCJK_ulem_right_node:}
% åœ¨ä¸‹åˆ’çº¿æœ€åŽçš„ä½ç½®ä¿å­˜ \texttt{node}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_ulem_right:
  {
    \scan_stop:
    \dim_compare:nNnTF \tex_lastkern:D = \c_zero_dim
      { \xeCJK_cs_gclear:N \xeCJK_ulem_right_node: }
      {
        \dim_compare:nNnTF \tex_lastkern:D = { 3sp }
          { \xeCJK_cs_gclear:N \xeCJK_ulem_right_node: }
          {
            \exp_args:NNo \tex_unkern:D
            \@@_ulem_right_aux:n { \dim_use:N \tex_lastkern:D }
          }
      }
  }
\cs_new_protected:Npn \@@_ulem_right_aux:n #1
  {
    \dim_compare:nNnTF \tex_lastkern:D = { - #1 }
      {
        \tex_unkern:D
        \cs_gset_protected:Npn \xeCJK_ulem_right_node:
          {
            \tex_kern:D - #1 \exp_stop_f:
            \tex_kern:D   #1 \exp_stop_f:
          }
        \tl_gset:Nx \UL@spfactor { \int_use:N \tex_spacefactor:D }
      }
      {
        \tex_kern:D #1 \exp_stop_f:
        \xeCJK_cs_gclear:N \xeCJK_ulem_right_node:
      }
  }
\cs_new_eq:NN \xeCJK_ulem_right_node: \prg_do_nothing:
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_ulem_var_leaders:}
% ç¬¬ä¸€æ¬¡ç”»ä¸‹åˆ’çº¿æ—¶ï¼Œä¸éœ€è¦å‘å·¦å¹³ç§» \tn{UL@pixel}ï¼Œè®©å·¦ä¾§æœ‰é—´è·ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_ulem_leaders:
  { \@@_ulem_var_leaders: }
\cs_new_protected:Npn \xeCJK_ulem_var_leaders:
  {
    \scan_stop:
    \skip_if_eq:nnF { \UL@skip } { \c_zero_skip }
      {
        \UL@leadtype \skip_horizontal:n { \UL@skip + \UL@pixel }
        \skip_horizontal:n { - \UL@pixel }
        \cs_gset_eq:NN \@@_ulem_var_leaders: \xeCJK_ulem_leaders:
      }
  }
\cs_new_eq:NN \@@_ulem_var_leaders: \xeCJK_ulem_var_leaders:
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_ulem_right_skip:}
% åœ¨ä¸‹åˆ’çº¿å®Œå…¨ç”»å¥½ä¹‹åŽï¼Œæˆ‘ä»¬æ£€æµ‹æœ€åŽçš„æƒ…å†µã€‚ç”¨ \tn{unskip} åŽ»æŽ‰æœ€åŽä¸€ä¸ªä¸‹åˆ’çº¿ï¼Œå†
% é‡æ–°ç”»ä¸€ä¸ªå‡å°‘ \tn{UL@pixel} çš„ã€‚
%    \begin{macrocode}
\cs_new_eq:NN \xeCJK_ulem_right_skip: \prg_do_nothing:
\cs_new_protected:Npn \@@_ulem_right_skip:
  {
    \int_case:nn { \tex_lastnodetype:D }
      {
        { \c_@@_hlist_node }   { \@@_ulem_right_skip_hbox: }
        { \c_@@_glue_node }    { \@@_ulem_right_skip_glue: }
        { \c_@@_penalty_node } { \@@_ulem_right_skip_penalty: }
      }
  }
\cs_new_protected:Npn \@@_ulem_right_skip_hbox:
  {
    \box_set_to_last:N \l_@@_tmp_box
    \@@_if_last_kern:TF
      { \@@_ulem_right_skip_kern: }
      { \@@_ulem_right_skip_glue: }
    \box_use_drop:N \l_@@_tmp_box
  }
\cs_new_protected:Npn \@@_ulem_right_skip_kern:
  {
    \dim_set:Nn \l_@@_tmp_dim { - \box_wd:N \l_@@_tmp_box }
    \dim_compare:nNnT \tex_lastkern:D = \l_@@_tmp_dim
      {
        \tex_unkern:D
        \@@_ulem_right_skip_glue:
        \tex_kern:D \l_@@_tmp_dim
      }
  }
\cs_new_protected:Npn \@@_ulem_right_skip_glue:
  {
    \skip_if_eq:nnT { \tex_lastskip:D } { - \UL@pixel }
      {
        \tex_unskip:D
        \skip_set:Nn \l_@@_tmp_skip { \tex_lastskip:D - \UL@pixel }
        \tex_unskip:D
        \UL@leadtype \skip_horizontal:N \l_@@_tmp_skip
      }
  }
\cs_new_protected:Npn \@@_ulem_right_skip_penalty:
  {
    \int_set_eq:NN \l_@@_tmp_int \tex_lastpenalty:D
    \tex_unpenalty:D
    \@@_if_last_hlist:T
      { \@@_ulem_right_skip_hbox: }
    \tex_penalty:D \l_@@_tmp_int
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.8.3}{2020/04/23}{\opt{hidden} é€‰é¡¹ä¿ç•™åŽŸå†…å®¹çš„é«˜åº¦å’Œæ·±åº¦ã€‚}
%
% \begin{macro}{\@@_ulem_hidden_box:}
% åªç”»çº¿ï¼Œä¸è¾“å‡ºç›’å­ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_hidden_box:
  {
    \tl_if_empty:NF \UL@start
      {
        \box_set_ht:Nn \l_@@_hidden_box { \box_ht:N \UL@box }
        \box_set_dp:Nn \l_@@_hidden_box { \box_dp:N \UL@box }
        \box_use:N \l_@@_hidden_box
        \xeCJK_no_break:
        \xeCJK_ulem_hskip:n { \box_wd:N \UL@box }
        \box_use:N \l_@@_hidden_box
      }
  }
\box_new:N \l_@@_hidden_box
\hbox_set:Nn \l_@@_hidden_box { }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_skip_punct_begin:,\@@_ulem_skip_punct_end:}
% è®©ä¸‹åˆ’çº¿è·³è¿‡æ&nbsp;‡ç‚¹ç¬¦å·çš„è®¾ç½®ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_skip_punct_begin:
  {
    \cs_set_eq:NN \UL@putbox \@@_ulem_skip_putbox:
    \cs_set_eq:NN \xeCJK_ulem_hskip:n \skip_horizontal:n
  }
\cs_new_protected:Npn \@@_ulem_skip_punct_end:
  {
    \cs_set_eq:NN \UL@putbox \@@_ulem_putbox:
    \cs_set_eq:NN \xeCJK_ulem_hskip:n \@@_ulem_hskip_aux:n
  }
\cs_new_eq:NN \@@_ulem_putbox: \UL@putbox
\cs_new_protected:Npn \@@_ulem_skip_putbox:
  {
    \tl_if_empty:NF \UL@start
      { \box_use_drop:N \UL@box }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_initial:}
% è¿™é‡Œçš„è®¾ç½®æ˜¯ä¸ºäº†åœ¨ä¸‹åˆ’çº¿çŠ¶æ€ä¸‹ï¼Œä¸‹åˆ’çº¿å¯ä»¥è‡ªåŠ¨è·³è¿‡å…¨è§’æ&nbsp;‡ç‚¹ç¬¦å·å’Œæ­£ç¡®çš„åœ¨å®ƒä»¬
% å‰/åŽæ–­è¡Œï¼Œå¹¶ä¸”ä¸Žè¡Œé¦–è¡Œæœ«å¯¹é½ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_initial:
  {
    \@@_ulem_swap_cs:NN
    \xeCJK_FullLeft_and_Default:   \@@_ulem_FullLeft_and_Default:
    \xeCJK_FullLeft_and_CJK:       \@@_ulem_FullLeft_and_CJK:
    \xeCJK_FullLeft_and_Boundary:  \@@_ulem_FullLeft_and_Boundary:
    \xeCJK_FullRight_and_Default:  \@@_ulem_FullRight_and_Default:
    \xeCJK_FullRight_and_CJK:      \@@_ulem_FullRight_and_CJK:
    \xeCJK_FullRight_and_Boundary: \@@_ulem_FullRight_and_Boundary:
    \xeCJK_CJK_and_CJK:N           \@@_ulem_CJK_and_CJK:N
    \xeCJK_CJK_and_Boundary:w      \@@_ulem_CJK_and_Boundary:w
    \xeCJK@fix@penalty             \@@_ulem_fix_penalty:
    \@@_punct_breakable_kern:n       \@@_ulem_punct_breakable_kern:n
    \@@_Default_and_FullLeft_glue:N  \@@_ulem_Default_and_FullLeft_glue:N
    \@@_Default_and_FullRight_glue:N \@@_ulem_Default_and_FullRight_glue:N
    \@@_CJK_and_FullLeft_glue:N      \@@_ulem_CJK_and_FullLeft_glue:N
    \@@_CJK_and_FullRight_glue:N     \@@_ulem_CJK_and_FullRight_glue:N
    \@@_Boundary_and_FullLeft_glue:N \@@_ulem_Boundary_and_FullLeft_glue:N
    \q_recursion_tail \q_nil \q_recursion_stop
    \seq_map_inline:Nn \g_@@_CJK_sub_class_seq
      {
        \seq_map_inline:Nn \g_@@_CJK_sub_class_seq
          {
            \str_if_eq:nnTF {##1} {####1}
              {
                \xeCJK_inter_class_toks:nnn { CJK } { CJK/##1 }
                  { \@@_ulem_between_CJK_blocks:nnN { CJK } {##1} }
                \xeCJK_inter_class_toks:nnn { CJK/##1 } { CJK/##1 }
                  { \@@_ulem_between_CJK_blocks:nnN { CJK } {##1} }
              }
              {
                \xeCJK_inter_class_toks:nnn { CJK/##1 } { CJK/####1 }
                  { \@@_ulem_between_CJK_blocks:nnN {##1} {####1} }
              }
          }
      }
  }
\cs_new_protected:Npn \@@_ulem_swap_cs:NN #1#2
  {
    \quark_if_recursion_tail_stop:N #1
    \xeCJK_swap_cs:NN #1#2
    \@@_ulem_swap_cs:NN
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.1.2}{2012/12/27}{è§£å†³åœ¨ä¸‹åˆ’çº¿çŠ¶æ€ä¸‹ä½¿ç”¨ \tn{makebox} æ—¶çš„é”™è¯¯ã€‚}
%
% \begin{macro}[int]{\xeCJK_if_ulem_patch:TF}
% åœ¨ä¸‹åˆ’çº¿çŠ¶æ€ä¸‹ï¼Œ\pkg{ulem} å®åŒ…åœ¨æ•°å­¦æ¨¡å¼æˆ–è€…ç›’å­ä¸­ä½¿ç”¨ \tn{UL@hrest} æ¢å¤
% \verb*|\ | ç­‰çš„å®šä¹‰ï¼Œæ­¤æ—¶ä¸éœ€è¦ä½¿ç”¨ \tn{UL@stop} å’Œ \tn{UL@start} æ¥æ–­å¼€ä¸‹åˆ’çº¿è€Œ
% äº§ç”Ÿæ–­ç‚¹ã€‚
%    \begin{macrocode}
\cs_new:Npn \xeCJK_if_ulem_patch:TF
  {
    \if_meaning:w \  \LA@space
      \exp_after:wN \use_ii:nn
    \else:
      \exp_after:wN \use_i:nn
    \fi:
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.9.1}{2022/07/28}{ä¿®å¤ä¸‹åˆ’çº¿ä¸­æ•°å­¦å…¬å¼çš„é”™è¯¯å¤„ç†ã€‚}
%
% \begin{macro}{\@@_ulem_CJK_and_Boundary:w}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_CJK_and_Boundary:w
  {
    \xeCJK_if_ulem_patch:TF
      {
        \xeCJK_peek_catcode_ignore_spaces:NTF \c_math_toggle_token
          { \xeCJK_class_group_end: \CJKecglue }
          {
            \bool_if:NTF \l_@@_peek_ignore_spaces_bool
              { \@@_ulem_peek_math:w }
              { \@@_ulem_group_end:n { CJK } }
          }
      }
      { \@@_ulem_CJK_and_Boundary:w }
  }
\cs_new_protected:Npn \@@_ulem_group_end:n #1
  {
    \xeCJK_class_group_end: \UL@stop
    \UL@start { \xeCJK_make_node:n {#1} }
    \xeCJK_make_group_tag:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_peek_math:w}
% ç”¨äºŽå¤„ç†ä¸‹åˆ’çº¿ä¸­ï¼Œæ±‰å­—ä¸Ž |$| ä¹‹é—´æœ‰ç©ºæ&nbsp;¼çš„æƒ…å†µ^^A
% \footnote{\url{https://github.com/CTeX-org/ctex-kit/issues/614}}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_peek_math:w
  {
    \cs_set_eq:NN \@@_ulem_start:w \@@_ulem_exp_stop:w
    \exp_after:wN \peek_after:Nw
    \exp_after:wN \@@_ulem_peek_math_branches:w
    \exp:w \exp_end_continue_f:w
  }
\cs_new_protected:Npn \@@_ulem_peek_math_branches:w
  {
    \token_if_math_toggle:NTF \l_peek_token
      { \xeCJK_class_group_end: \CJKecglue }
      { \@@_ulem_group_end:n { CJK-space } }
  }
\cs_new_protected:Npn \@@_ulem_exp_stop:w
  {
    \cs_if_eq:NNTF \UL@start \@empty
      { \exp_after:wN \exp_stop_f: }
      { \exp_after:wN \UL@start }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_fix_penalty:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_fix_penalty:
  {
    \xeCJK_if_ulem_patch:TF
      { \fix@penalty }
      { \@@_ulem_fix_penalty: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_CJK_and_CJK:N}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_CJK_and_CJK:N
  {
    \xeCJK_if_ulem_patch:TF
      {
        \xeCJK_class_group_end:
        \UL@stop \@@_ulem_ccglue: \UL@start
        \@@_ulem_class_group_begin:
        \xeCJK_select_font:
        \xeCJK_fallback_symbol:NN
        \CJKsymbol
      }
      { \@@_ulem_CJK_and_CJK:N }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_class_group_begin:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_class_group_begin:
  {
    \xeCJK_class_group_begin:
    \xeCJK_clear_Boundary_and_CJK_toks:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_between_CJK_blocks:nnN}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_between_CJK_blocks:nnN #1#2
  {
    \xeCJK_if_ulem_patch:TF
      {
        \xeCJK_class_group_end:
        \UL@stop \@@_ulem_ccglue: \UL@start
        \xeCJK_class_group_begin:
        \xeCJK_clear_Boundary_and_CJK_toks:
        \@@_switch_font:nn {#1} {#2}
        \xeCJK_fallback_symbol:NN
        \CJKsymbol
      }
      {
        \skip_horizontal:N \l_@@_ccglue_skip
        \@@_switch_font:nn {#1} {#2}
        \xeCJK_fallback_symbol:NN
        \CJKsymbol
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_Default_and_FullLeft_glue:N}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_Default_and_FullLeft_glue:N #1
  {
    \xeCJK_if_ulem_patch:TF
      {
        \UL@stop
        \@@_ulem_skip_punct_begin:
        \@@_punct_glue:NN \c_@@_left_tl #1
        \UL@start
      }
      { \@@_ulem_Default_and_FullLeft_glue:N #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_Boundary_and_FullLeft_glue:N}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_Boundary_and_FullLeft_glue:N #1
  {
    \xeCJK_if_ulem_patch:TF
      {
        \UL@stop
        \@@_ulem_skip_punct_begin:
        \@@_punct_glue:NN \c_@@_left_tl #1
        \UL@start
      }
      { \@@_ulem_Boundary_and_FullLeft_glue:N #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_CJK_and_FullLeft_glue:N}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_CJK_and_FullLeft_glue:N #1
  {
    \xeCJK_if_ulem_patch:TF
      {
        \xeCJK_class_group_end:
        \UL@stop
        \@@_ulem_skip_punct_begin:
        \@@_ulem_punct_ccglue:
        \@@_punct_glue:NN \c_@@_left_tl #1
        \UL@start
        \@@_ulem_class_group_begin:
        \xeCJK_select_punct_font:
      }
      { \@@_ulem_CJK_and_FullLeft_glue:N #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_Default_and_FullRight_glue:N}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_Default_and_FullRight_glue:N #1
  {
    \xeCJK_if_ulem_patch:TF
      {
        \UL@stop
        \@@_ulem_skip_punct_begin:
        \@@_punct_if_long:NTF #1
          { \xeCJK_allow_break: }
          { \xeCJK_no_break: }
        \@@_punct_if_middle:NT #1
          {
            \@@_punct_glue:NN \c_@@_right_tl #1
            \@@_punct_rule:NN \c_@@_left_tl #1
          }
        \UL@start
      }
      { \@@_ulem_Default_and_FullRight_glue:N #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_CJK_and_FullRight_glue:N}
% \changes{v3.2.2}{2013/05/30}{ä¿®æ­£ä¸‹åˆ’çº¿ä¸èƒ½è·³è¿‡å…¨è§’å³æ&nbsp;‡ç‚¹çš„é—®é¢˜ã€‚}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_CJK_and_FullRight_glue:N #1
  {
    \xeCJK_if_ulem_patch:TF
      {
        \xeCJK_class_group_end:
        \UL@stop
        \@@_ulem_skip_punct_begin:
        \@@_punct_if_long:NTF #1
          { \xeCJK_allow_break: }
          { \xeCJK_no_break: }
        \@@_punct_if_middle:NT #1
          {
            \@@_ulem_punct_ccglue:
            \@@_punct_glue:NN \c_@@_right_tl #1
            \@@_punct_rule:NN \c_@@_left_tl #1
          }
        \UL@start
        \@@_ulem_class_group_begin:
        \xeCJK_select_punct_font:
      }
      { \@@_ulem_CJK_and_FullRight_glue:N #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_FullLeft_and_Default:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_FullLeft_and_Default:
  {
    \xeCJK_if_ulem_patch:TF
      {
        \@@_punct_if_middle:NTF \g_@@_last_punct_tl
          {
            \xeCJK_get_punct_bounds:No \c_@@_left_tl \g_@@_last_punct_tl
            \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
            \xeCJK_class_group_end: \UL@stop \xeCJK_no_break:
            \@@_punct_glue:NN \c_@@_left_tl  \g_@@_last_punct_tl
          }
          { \xeCJK_class_group_end: \UL@stop }
        \@@_ulem_skip_punct_end:
        \xeCJK_no_break:
        \UL@start
      }
      { \@@_ulem_FullLeft_and_Default: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_FullLeft_and_Boundary:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_FullLeft_and_Boundary:
  {
    \xeCJK_if_ulem_patch:TF
      {
        \@@_punct_if_middle:NTF \g_@@_last_punct_tl
          {
            \xeCJK_get_punct_bounds:No \c_@@_left_tl \g_@@_last_punct_tl
            \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
            \xeCJK_class_group_end: \UL@stop \xeCJK_no_break:
            \@@_punct_glue:NN \c_@@_left_tl  \g_@@_last_punct_tl
          }
          { \xeCJK_class_group_end: \UL@stop }
        \@@_ulem_skip_punct_end:
        \xeCJK_no_break:
        \UL@start
        \tex_ignorespaces:D
      }
      { \@@_ulem_FullLeft_and_Boundary: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_FullLeft_and_CJK:}
% \changes{v3.2.3}{2013/06/04}
% {ä¿®æ­£å…¨è§’å·¦æ&nbsp;‡ç‚¹åŽä¸‹åˆ’çº¿ä¸Ž \tn{CJKunderdot} è¿žç”¨æ—¶ç»“æžœä¸æ­£å¸¸çš„é—®é¢˜ã€‚}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_FullLeft_and_CJK:
  {
    \xeCJK_if_ulem_patch:TF
      {
        \xeCJK_FullLeft_and_Default:
        \@@_ulem_class_group_begin:
        \xeCJK_select_font:
      }
      { \@@_ulem_FullLeft_and_CJK: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_FullRight_and_Default:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_FullRight_and_Default:
  {
    \xeCJK_if_ulem_patch:TF
      {
        \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
        \xeCJK_class_group_end:
        \UL@stop
        \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl
        \@@_ulem_skip_punct_end:
        \UL@start
      }
      { \@@_ulem_FullRight_and_Default: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_FullRight_and_Boundary:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_FullRight_and_Boundary:
  {
    \xeCJK_if_ulem_patch:TF
      {
        \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
        \xeCJK_class_group_end:
        \UL@stop
        \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl
        \@@_ulem_skip_punct_end:
        \UL@start
        \tex_ignorespaces:D
      }
      { \@@_ulem_FullRight_and_Boundary: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_FullRight_and_CJK:}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_FullRight_and_CJK:
  {
    \xeCJK_if_ulem_patch:TF
      {
        \@@_punct_rule:NN \c_@@_right_tl \g_@@_last_punct_tl
        \xeCJK_class_group_end:
        \UL@stop
        \@@_punct_glue:NN \c_@@_right_tl \g_@@_last_punct_tl
        \@@_ulem_punct_ccglue:
        \@@_ulem_skip_punct_end:
        \UL@start
        \@@_ulem_class_group_begin:
        \xeCJK_select_font:
      }
      { \@@_ulem_FullRight_and_CJK: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_punct_hskip:n}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_punct_hskip:n
  {
    \xeCJK_if_ulem_patch:TF
      { \xeCJK_ulem_hskip:n }
      { \@@_ulem_punct_hskip:n }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_punct_breakable_kern:n}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_punct_breakable_kern:n #1
  {
    \xeCJK_if_ulem_patch:TF
      {
        \xeCJK_class_group_end:
        \UL@stop \xeCJK_ulem_hskip:n {#1} \UL@start
        \@@_ulem_class_group_begin:
        \xeCJK_select_punct_font:
      }
      { \@@_ulem_punct_breakable_kern:n {#1} }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_ulem_glue:n,\@@_ulem_ccglue:,\@@_ulem_punct_ccglue:}
% åœ¨ä¸‹åˆ’çº¿çŠ¶æ€ä¸‹çš„åˆ†åˆ«ä»£æ›¿ \tn{CJKglue} ç­‰ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_ulem_glue:n #1
  {
    \xeCJK_if_ulem_patch:TF
      {
        \tl_if_empty:NTF \l_@@_group_tag_tl
          { \UL@stop \@@_ulem_hskip:n {#1} \UL@start }
          {
            \str_if_eq:eeTF { \l_@@_group_tag_tl } { \c_@@_group_tag_tl }
              { \UL@stop \@@_ulem_hskip:n {#1} \UL@start }
              { \skip_horizontal:n {#1} }
          }
      }
      { \skip_horizontal:n {#1} }
  }
\cs_new_protected:Npn \xeCJK_make_group_tag:
  { \tl_set:Nx \l_@@_group_tag_tl { \c_@@_group_tag_tl } }
\tl_new:N \l_@@_group_tag_tl
\tl_const:Nn \c_@@_group_tag_tl
  {
    T \int_use:N \tex_currentgrouptype:D
    L \int_use:N \tex_currentgrouplevel:D
  }
\cs_new_protected:Npn \@@_ulem_ccglue:
  { { \skip_set_eq:NN \UL@skip \l_@@_ccglue_skip \UL@leaders } }
\cs_new_protected:Npn \@@_ulem_punct_ccglue:
  { \@@_punct_hskip:n { \l_@@_ccglue_skip } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_ulem_group_begin:,\xeCJK_ulem_group_end:,\xeCJK_ulem_on:n}
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_ulem_group_begin:
  {
    \mode_leave_vertical:
    \c_group_begin_token
  }
\cs_new_protected:Npn \xeCJK_ulem_group_end:
  { \c_group_end_token }
\cs_new_protected:Npn \xeCJK_ulem_on:n
  { \ULon }
\cs_new_eq:NN \@@_ulem_on:n \UL@on
\cs_set_protected:Npn \UL@on #1
  { \@@_ulem_on:n { \xeCJK_ulem_left: #1 \xeCJK_ulem_right: } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\xeCJKfntefon}
% \changes{v3.2.15}{2014/11/07}{å®Œå–„é€‰é¡¹ã€‚}
% æ‰©å±• \tn{ULon} çš„å‚æ•°ã€‚
%    \begin{macrocode}
\NewDocumentCommand \xeCJKfntefon { s t- s o }
  {
    \mode_leave_vertical:
    \xeCJK_ulem_boot:NNNn #1#2#3 {#4}
    \xeCJK_ulem_on:n
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CJKunderline}
%    \begin{macrocode}
\NewDocumentCommand \CJKunderline { s t- s o }
  {
    \xeCJK_ulem_group_begin:
      \xeCJK_fntef_boot:nnNNNn { underline } { uline } #1#2#3 {#4}
      \xeCJK_fntef_initial:nnn
        { \l_@@_uline_depth_tl }
        { \l_@@_uline_sep_tl }
        {
          \l_@@_uline_format_tl
          \tex_vrule:D
            height \dim_eval:n { \l_@@_uline_thickness_tl }
            depth \c_zero_dim
            width .2em
        }
      \xeCJK_ulem_on:n
  }
\NewDocumentCommand \varCJKunderline { }
  { \CJKunderline - }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CJKunderwave}
%    \begin{macrocode}
\NewDocumentCommand \CJKunderwave { s t- s o }
  {
    \xeCJK_ulem_group_begin:
      \xeCJK_fntef_boot:nnNNNn { underwave } { uwave } #1#2#3 {#4}
      \xeCJK_fntef_initial:nnn
        { \l_@@_uwave_depth_tl }
        { \l_@@_uwave_sep_tl }
        { \l_@@_uwave_format_tl \l_@@_uwave_symbol_tl }
      \xeCJK_ulem_on:n
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CJKunderdblline}
%    \begin{macrocode}
\NewDocumentCommand \CJKunderdblline { s t- s o }
  {
    \xeCJK_ulem_group_begin:
      \xeCJK_fntef_boot:nnNNNn { underdblline } { udbline } #1#2#3 {#4}
      \xeCJK_fntef_initial:nnn
        { \l_@@_udbline_depth_tl }
        { \l_@@_udbline_sep_tl }
        {
          \l_@@_udbline_format_tl
          \vbox_top:n
            {
              \tex_hrule:D
                height \dim_eval:n { \l_@@_udbline_thickness_tl }
                depth \c_zero_dim
                width .2em
              \tex_kern:D \dim_eval:n { \l_@@_udbline_gap_tl }
              \tex_hrule:D
                height \dim_eval:n { \l_@@_udbline_thickness_tl }
                depth \c_zero_dim
                width .2em
            }
        }
      \xeCJK_ulem_on:n
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CJKsout}
%    \begin{macrocode}
\NewDocumentCommand \CJKsout { s t- s o }
  {
    \xeCJK_ulem_group_begin:
      \xeCJK_fntef_boot:nnNNNn { sout } { sout } #1#2#3 {#4}
      \xeCJK_fntef_initial:nn
        {
          \l_@@_sout_format_tl
          \tex_vrule:D
            height \dim_eval:n { \l_@@_sout_thickness_tl }
            depth \c_zero_dim
            width .2em
        }
        {
          \box_move_up:nn
            { \l_@@_sout_height_tl - \box_ht:N \l_@@_fntef_box / 2 }
            { \box_use:N \l_@@_fntef_box }
        }
      \xeCJK_ulem_on:n
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CJKxout}
%    \begin{macrocode}
\NewDocumentCommand \CJKxout { s t- s o }
  {
    \xeCJK_ulem_group_begin:
      \xeCJK_fntef_boot:nnNNNn { xout } { xout } #1#2#3 {#4}
      \xeCJK_fntef_initial:nn
        {
          \l_@@_xout_format_tl
          \tex_kern:D -.1 em $/$
          \tex_kern:D -.1 em
        }
        {
          \box_move_up:nn
            { \box_dp:N \l_@@_fntef_box / 2 }
            { \box_use:N \l_@@_fntef_box }
        }
      \xeCJK_ulem_on:n
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CJKunderanyline}
% \changes{v3.2.15}{2014/11/07}{å®Œå–„é€‰é¡¹ã€‚}
%    \begin{macrocode}
\NewDocumentCommand \CJKunderanyline { s t- s o m m }
  {
    \xeCJK_ulem_group_begin:
      \xeCJK_ulem_boot:NNNn #1#2#3 {#4}
      \xeCJK_fntef_initial:nn
        {#6}
        {
          \box_move_down:nn
            {#5}
            { \box_use:N \l_@@_fntef_box }
        }
      \tl_if_empty:NF \l_@@_ulem_boxdepth_tl
        { \box_set_dp:Nn \ULC@box { \l_@@_ulem_boxdepth_tl } }
      \tl_if_empty:NF \l_@@_ulem_sep_tl
        {
          \bool_set_true:N \l_@@_fntef_bool
          \dim_set:Nn \l_@@_fntef_dim
            { \l_@@_ulem_sep_tl + \box_dp:N \ULC@box }
        }
      \xeCJK_ulem_on:n
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_fntef_boot:nnNNNn}
% å¤„ç†å‚æ•°é—®é¢˜ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_fntef_boot:nnNNNn #1#2#3#4#5#6
  {
    \bool_lazy_or:nnT {#3} {#5}
      { \bool_set_false:c { l_@@_#2_skip_bool } }
    \bool_if:NT #4
      { \bool_set_true:c { l_@@_#2_subtract_bool } }
    \tl_if_novalue:nF {#6}
      { \keys_set:nn { xeCJK / options / #1 } {#6} }
    \bool_set_eq:Nc \l_@@_ulem_skip_bool { l_@@_#2_skip_bool }
    \bool_set_eq:Nc \l_@@_ulem_hidden_bool { l_@@_#2_hidden_bool }
    \bool_set_eq:Nc \l_@@_ulem_subtract_bool { l_@@_#2_subtract_bool }
    \tl_set_eq:Nc \l_@@_ulem_text_format_tl { l_@@_#2_text_format_tl }
  }
\cs_new_protected:Npn \xeCJK_ulem_boot:NNNn #1#2#3#4
  {
    \bool_lazy_or:nnT {#1} {#3}
      { \bool_set_false:N \l_@@_ulem_skip_bool }
    \bool_if:NT #2
      { \bool_set_true:N \l_@@_ulem_subtract_bool }
    \tl_if_novalue:nF {#4}
      { \keys_set:nn { xeCJK / options / ulem } {#4} }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_fntef_initial:n}
% ä¸æ”¯æŒä¸‹åˆ’çº¿çš„åµŒå¥—ä½¿ç”¨ã€‚ä¸‹åˆ’çº¿åµŒå¥—ä½¿ç”¨æ—¶ï¼Œé‡Œå±‚çš„ä¸‹åˆ’çº¿ä¼šè¢«æ”¾åœ¨ç›’å­é‡Œï¼Œä¸èƒ½æŠ˜è¡Œã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_fntef_initial:n
  {
    \bool_if:NTF \l_@@_nest_bool
      { \@@_warning:n { fntef-nesting } }
      {
        \bool_set_true:N \l_@@_nest_bool
        \@@_restore_shipout_fntef:
      }
    \xeCJK_fntef_sbox:n
  }
\cs_new_protected:Npn \xeCJK_fntef_initial:nn #1
  {
    \xeCJK_fntef_initial:n {#1}
    \bool_if:NF \l_@@_fntef_bool
      { \dim_zero:N \l_@@_fntef_dim }
    \markoverwith
  }
\cs_new_protected:Npn \xeCJK_fntef_initial:nnn #1#2#3
  {
    \xeCJK_fntef_initial:n {#3}
    \bool_if:NF \l_@@_fntef_bool
      {
        \bool_set_true:N \l_@@_fntef_bool
        \dim_set:Nn \l_@@_fntef_dim {#1}
      }
    \markoverwith
      {
        \box_move_down:nn
          { \l_@@_fntef_dim + \box_ht:N \l_@@_fntef_box }
          { \box_use:N \l_@@_fntef_box }
      }
    \dim_set:Nn \l_@@_fntef_dim { #2 + \box_dp:N \ULC@box }
  }
\box_new:N \l_@@_fntef_box
\cs_new_eq:NN \xeCJKfntefbox \l_@@_fntef_box
\bool_new:N \l_@@_nest_bool
\bool_new:N \l_@@_fntef_bool
\@@_msg_new:nn { fntef-nesting }
  { Nesting~is~not~supported. }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}{\l_@@_fntef_dim}
% è®°å½•ä¸‹åˆ’çº¿æˆ–è€…ä¸‹åˆ’ç¬¦å·çš„æ·±åº¦ï¼Œä»¥ä¾¿å®ƒä»¬åµŒå¥—ä½¿ç”¨æ—¶èƒ½è‡ªåŠ¨è°ƒæ•´å¥½è·ç¦»ã€‚
% \tn{ULdepth} è¢« \pkg{ulem} åˆå§‹åŒ–ä¸º \tn{maxdimen}ã€‚ä¸‹åˆ’çº¿åµŒå¥—æ—¶ï¼Œ\pkg{ulem}
% è¦ä½¿ç”¨å®ƒä½œè®¡ç®—ï¼Œå¯èƒ½ä¼šæº¢å‡ºã€‚ä¸ºç®€ä¾¿èµ·è§ï¼Œ\cs{l_@@_fntef_dim} ä¸Ž \tn{ULdepth}
% å…±ç”¨ä¸€ä¸ªå¯„å­˜å™¨ã€‚
%    \begin{macrocode}
\cs_new_eq:NN \l_@@_fntef_dim \ULdepth
%    \end{macrocode}
% \end{variable}
%
% \begin{macro}[int]{\xeCJK_fntef_sbox:n}
% ä¸Ž \cs{hcoffin_set:Nn} å’Œ \LaTeXe{} çš„ \tn{sbox} åŠŸèƒ½ç±»ä¼¼ï¼Œç¡®ä¿é¢œè‰²çš„æ­£ç¡®ã€‚
% è™½ç„¶ \texttt{coffin} å¯ä»¥æ›´æ–¹ä¾¿çš„æ“ä½œç›’å­ï¼Œä½†é€Ÿåº¦è¦æ…¢ä¸€ç‚¹ã€‚å¹¶ä¸”ï¼Œæˆ‘ä»¬çš„éœ€æ±‚
% ä¹Ÿæ¯”è¾ƒç®€å•ï¼Œå°±ä¸ç”¨å®ƒäº†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_fntef_sbox:n #1
  {
    \hbox_set:Nn \l_@@_fntef_box
      { \color_ensure_current: #1 }
  }
%    \end{macrocode}
% \end{macro}
%
% æœ€åˆé€‚çš„æ˜¯ç”¨ \pkg{xtemplate} å®åŒ…æ¥å®žçŽ°ï¼Œä½†æ˜¯æ¯”è¾ƒéš¾äºŽç”¨ \tn{xeCJKsetup} æ¥ç»Ÿä¸€
% è®¾ç½®ï¼Œæ‰€ä»¥è¿™é‡Œè¿˜æ˜¯ç”¨åœŸåŠžæ³•ã€‚
%    \begin{macrocode}
\keys_define:nn { xeCJK / options }
  {
    underdot / symbol          .tl_set:N = \l_@@_udot_symbol_tl ,
    underdot / depth           .tl_set:N = \l_@@_udot_depth_tl ,
    underdot / sep             .tl_set:N = \l_@@_udot_sep_tl ,
    underdot / format          .tl_set:N = \l_@@_udot_format_tl ,
    underdot / textformat      .tl_set:N = \l_@@_udot_text_format_tl ,
    underdot / boxdepth        .tl_set:N = \l_@@_udot_boxdepth_tl ,
    symbol / sep               .tl_set:N = \l_@@_symbol_sep_tl ,
    symbol / boxdepth          .tl_set:N = \l_@@_symbol_boxdepth_tl ,
    symbol / textformat        .tl_set:N = \l_@@_symbol_text_format_tl ,
    underline / skip         .bool_set:N = \l_@@_uline_skip_bool ,
    underline / hidden       .bool_set:N = \l_@@_uline_hidden_bool ,
    underline / subtract     .bool_set:N = \l_@@_uline_subtract_bool ,
    underline / thickness      .tl_set:N = \l_@@_uline_thickness_tl ,
    underline / depth          .tl_set:N = \l_@@_uline_depth_tl ,
    underline / sep            .tl_set:N = \l_@@_uline_sep_tl ,
    underline / format         .tl_set:N = \l_@@_uline_format_tl ,
    underline / textformat     .tl_set:N = \l_@@_uline_text_format_tl ,
    underdblline / skip      .bool_set:N = \l_@@_udbline_skip_bool ,
    underdblline / hidden    .bool_set:N = \l_@@_udbline_hidden_bool ,
    underdblline / subtract  .bool_set:N = \l_@@_udbline_subtract_bool ,
    underdblline / thickness   .tl_set:N = \l_@@_udbline_thickness_tl ,
    underdblline / depth       .tl_set:N = \l_@@_udbline_depth_tl ,
    underdblline / sep         .tl_set:N = \l_@@_udbline_sep_tl ,
    underdblline / format      .tl_set:N = \l_@@_udbline_format_tl ,
    underdblline / textformat  .tl_set:N = \l_@@_udbline_text_format_tl ,
    underdblline / gap         .tl_set:N = \l_@@_udbline_gap_tl ,
    underwave / skip         .bool_set:N = \l_@@_uwave_skip_bool ,
    underwave / hidden       .bool_set:N = \l_@@_uwave_hidden_bool ,
    underwave / subtract     .bool_set:N = \l_@@_uwave_subtract_bool ,
    underwave / symbol         .tl_set:N = \l_@@_uwave_symbol_tl ,
    underwave / depth          .tl_set:N = \l_@@_uwave_depth_tl ,
    underwave / sep            .tl_set:N = \l_@@_uwave_sep_tl ,
    underwave / format         .tl_set:N = \l_@@_uwave_format_tl ,
    underwave / textformat     .tl_set:N = \l_@@_uwave_text_format_tl ,
    sout / skip              .bool_set:N = \l_@@_sout_skip_bool ,
    sout / hidden            .bool_set:N = \l_@@_sout_hidden_bool ,
    sout / subtract          .bool_set:N = \l_@@_sout_subtract_bool ,
    sout / thickness           .tl_set:N = \l_@@_sout_thickness_tl ,
    sout / height              .tl_set:N = \l_@@_sout_height_tl ,
    sout / format              .tl_set:N = \l_@@_sout_format_tl ,
    sout / textformat          .tl_set:N = \l_@@_sout_text_format_tl ,
    xout / skip              .bool_set:N = \l_@@_xout_skip_bool ,
    xout / hidden            .bool_set:N = \l_@@_xout_hidden_bool ,
    xout / subtract          .bool_set:N = \l_@@_xout_subtract_bool ,
    xout / format              .tl_set:N = \l_@@_xout_format_tl ,
    xout / textformat          .tl_set:N = \l_@@_xout_text_format_tl ,
    ulem / skip              .bool_set:N = \l_@@_ulem_skip_bool ,
    ulem / hidden            .bool_set:N = \l_@@_ulem_hidden_bool ,
    ulem / subtract          .bool_set:N = \l_@@_ulem_subtract_bool ,
    ulem / sep                 .tl_set:N = \l_@@_ulem_sep_tl ,
    ulem / boxdepth            .tl_set:N = \l_@@_ulem_boxdepth_tl ,
    ulem / textformat          .tl_set:N = \l_@@_ulem_text_format_tl
  }
\clist_map_inline:nn
  { underdot , underline , underdblline , underwave , sout , xout , ulem }
  {
    \keys_define:nn { xeCJK / options }
      { #1 .meta:nn = { xeCJK / options / #1 } { ##1 } }
  }
\keys_set:nn { xeCJK / options }
  {
    underdot / symbol        = \normalfont . ,
    underdot / depth         = 0.20 em ,
    underdot / sep           = 0.04 em ,
    symbol / sep             = \c_zero_dim ,
    underline / skip         = true ,
    underline / thickness    = \ULthickness ,
    underline / depth        = 0.20 em ,
    underline / sep          = 0.07 em ,
    underdblline / skip      = true ,
    underdblline / thickness = \ULthickness ,
    underdblline / depth     = 0.20 em ,
    underdblline / sep       = 0.17 em ,
    underdblline / gap       = 1.1 pt ,
    underwave / skip         = true ,
    underwave / symbol       = \sixly \tex_char:D 58 \exp_stop_f: ,
    underwave / depth        = 0.20 em ,
    underwave / sep          = 0.00 em ,
    sout / skip              = true ,
    sout / thickness         = \ULthickness ,
    sout / height            = 0.35 em ,
    xout / skip              = true
  }
%    \end{macrocode}
%
% \changes{v3.8.3}{2020/04/07}{å–æ¶ˆ \pkg{xeCJKfntef} çš„åˆå§‹å½©è‰²è®¾ç½®ã€‚}
%
% \begin{macro}{\CJKunderanysymbol}
%    \begin{macrocode}
\NewDocumentCommand \CJKunderanysymbol { o m m m }
  {
    \xeCJK_under_symbol:nnnnnn { symbol } { symbol } {#1} {#2} {#3} {#4}
    \tex_ignorespaces:D
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CJKunderdot}
% \tn{CJKunderdot} æ˜¯ \tn{CJKunderanysymbol} çš„ç‰¹æ®Šæƒ…å†µã€‚\pkg{CJKfntef} åŽŸæ¥ä½¿ç”¨
% çš„æ˜¯æ•°å­¦ç¬¦å· \tn{cdot}ï¼Œè¿™é‡Œæ”¹æˆæ›´åˆé€‚çš„ |.|ã€‚
%    \begin{macrocode}
\NewDocumentCommand \CJKunderdot { o m }
  {
    \xeCJK_under_symbol:nnnnnn { underdot } { udot }
      {#1}
      { \l_@@_udot_depth_tl }
      { \l_@@_udot_format_tl \l_@@_udot_symbol_tl }
      {#2}
    \tex_ignorespaces:D
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_under_symbol:nnnnnn}
% å½“å¤„åœ¨ä¸‹åˆ’çº¿ä¸­æ—¶ï¼Œæˆ‘ä»¬å…ˆæ–­å¼€ä¸‹åˆ’çº¿ï¼Œåœ¨åˆ†ç»„å¤–è®¾ç½®ä¸‹åˆ’ç¬¦å·ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_under_symbol:nnnnnn
  {
    \xeCJK_if_ulem_patch:TF
      { \@@_under_symbol_auxi:nnnnnn }
      { \@@_under_symbol_auxii:nnnnnn }
  }
\cs_new_protected:Npn \@@_under_symbol_auxi:nnnnnn #1#2#3#4#5#6
  {
    \xeCJK_ulem_right: \UL@stop
    \group_begin:
      \xeCJK_under_symbol_initial:nnnnn {#1} {#2} {#3} {#4} {#5}
      \use:c { l_@@_#2_text_format_tl }
      \UL@start \xeCJK_ulem_right_node:
        #6
      \xeCJK_ulem_right: \UL@stop
    \group_end:
    \UL@start \xeCJK_ulem_right_node:
  }
\cs_new_protected:Npn \@@_under_symbol_auxii:nnnnnn #1#2#3#4#5#6
  {
    \mode_leave_vertical:
    \group_begin:
      \xeCJK_under_symbol_initial:nnnnn {#1} {#2} {#3} {#4} {#5}
      \@@_under_symbol_text_format:c { l_@@_#2_text_format_tl }
      #6
      \xeCJK_ulem_right:
    \group_end:
    \xeCJK_ulem_right_node:
  }
\cs_new_protected:Npn \xeCJK_under_symbol_initial:nnnnn #1#2#3#4#5
  {
    \tl_if_novalue:nF {#3}
      { \keys_set:nn { xeCJK / options / #1 } {#3} }
    \xeCJK_fntef_sbox:n {#5}
    \bool_if:NTF \l_@@_fntef_bool
      { \xeCJK_make_under_symbol:n { \l_@@_fntef_dim } }
      {
        \bool_set_true:N \l_@@_fntef_bool
        \xeCJK_make_under_symbol:n {#4}
      }
    \tl_if_empty:cF { l_@@_#2_boxdepth_tl }
      {
        \box_set_dp:Nn \l_@@_under_symbol_box
          { \use:c { l_@@_#2_boxdepth_tl } }
      }
    \dim_set:Nn \l_@@_fntef_dim
      { \use:c { l_@@_#2_sep_tl } + \box_dp:N \l_@@_under_symbol_box }
    \xeCJK_swap_cs:NN \CJKsymbol \@@_under_CJKsymbol:N
    \@@_restore_shipout_CJKsymbol:
  }
\cs_new_protected:Npn \@@_under_symbol_text_format:N #1
  {
    \tl_if_empty:NF #1
      { \xeCJK_ulem_right: #1 \xeCJK_ulem_right_node: }
  }
\cs_generate_variant:Nn \@@_under_symbol_text_format:N { c }
\box_new:N \l_@@_under_symbol_box
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_make_under_symbol:n}
% æˆ‘ä»¬é‡å–â€œä¸€â€çš„å®½åº¦ä½œä¸ºæ±‰å­—çš„å®½åº¦ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_make_under_symbol:n #1
  {
    \hbox_set:Nn \l_@@_under_symbol_box
      {
        \box_move_down:nn { #1 + \box_ht:N \l_@@_fntef_box }
          {
            \hbox_to_zero:n
              {
                \xeCJK_select_font:
                \tex_kern:D \tex_fontcharwd:D \tex_font:D "4E00 \exp_stop_f:
                \tex_hss:D \box_use:N \l_@@_fntef_box \tex_hss:D
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_restore_shipout_CJKsymbol:}
% \changes{v3.2.3}{2013/06/04}{è§£å†³ \tn{CJKunderdot} è·¨é¡µä½¿ç”¨æ—¶å½±å“åˆ°é¡µçœ‰é¡µè„šçš„é—®é¢˜ã€‚}
% \tn{CJKunderdot} ä¸­å¯¹ \tn{CJKsymbol} çš„ä¿®æ”¹ä¼šå½±å“åˆ°é¡µçœ‰å’Œé¡µè„šï¼Œéœ€è¦å°å¿ƒå¤„ç†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_restore_shipout_CJKsymbol:
  {
    \tl_put_right:Nn \l_@@_fntef_shipout_tl
      { \xeCJK_swap_cs:NN \CJKsymbol \@@_under_CJKsymbol:N }
    \@@_restore_shipout_fntef:
    \xeCJK_cs_clear:N \@@_restore_shipout_CJKsymbol:
  }
\cs_new_protected:Npn \@@_restore_shipout_fntef:
  {
    \tl_put_right:Nn \l_@@_fntef_shipout_tl
      {
        \bool_set_false:N \l_@@_fntef_bool
        \dim_zero:N \l_@@_fntef_dim
      }
    \xeCJK_cs_clear:N \@@_restore_shipout_fntef:
  }
\tl_new:N \l_@@_fntef_shipout_tl
\xeCJK_add_to_shipout:n { \l_@@_fntef_shipout_tl }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_under_CJKsymbol:N}
% ç›’å­æ”¾åœ¨æ±‰å­—çš„å·¦ä¾§ï¼Œæ¯”è¾ƒå®¹æ˜“å¤„ç†çŠ¶æ€è½¬ç§»çš„é—®é¢˜ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_under_CJKsymbol:N
  {
    \box_use:N \l_@@_under_symbol_box
    \xeCJK_no_break: \@@_under_CJKsymbol:N
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.7.2}{2019/03/24}{æ”¹ç”¨ \pkg{xparse} çš„æ–°å‚æ•°ç±»åž‹ \texttt{b}
%   å®šä¹‰ \env{CJKfilltwosides*} çŽ¯å¢ƒï¼Œä¸å†ä¾èµ– \pkg{environ} åŒ…ã€‚}
%
% \begin{macro}{CJKfilltwosides}
% \changes{v3.2.4}{2013/06/26}{æ”¹ç”¨ \texttt{minipage} å’Œ \LaTeX è¡¨æ&nbsp;¼ï¼ˆ\texttt{tabular}ï¼‰æ¥å®žçŽ°ã€‚}
% \changes{v3.3.3}{2015/05/30}{ç¡®ä¿è¿›å…¥æ°´å¹³æ¨¡å¼ã€‚}
% ä½¿ç”¨ \texttt{minipage} å’Œ \LaTeX è¡¨æ&nbsp;¼ï¼ˆ\texttt{tabular}ï¼‰æ¥å®šä¹‰ |CJKfilltwosides| çŽ¯å¢ƒã€‚
% å¯é€‰å‚æ•° |#1| è¡¨ç¤ºçŽ¯å¢ƒçš„åž‚ç›´å¯¹é½ä½ç½®ï¼Œé»˜è®¤å±…ä¸­ï¼›å‚æ•° |#2| è¡¨ç¤ºçŽ¯å¢ƒçš„å®½åº¦ã€‚
% å¸¦æ˜Ÿå·çš„çŽ¯å¢ƒï¼Œå¦‚æžœ |#2| ä¸å¤§äºŽé›¶æˆ–è€…ä¸å¤§äºŽçŽ¯å¢ƒæœ€é•¿æ–‡æœ¬è¡Œçš„å®½åº¦ï¼Œåˆ™å–çŽ¯å¢ƒçš„è‡ªç„¶å®½åº¦ã€‚
%    \begin{macrocode}
\NewDocumentEnvironment { CJKfilltwosides } { O { c } m }
  {
    \use:e { \exp_not:N \minipage [#1] { \dim_eval:n {#2} } }
    \cs_set_eq:NN \CJKglue \xeCJK_fntef_hfilll:
  }
  {
    \endminipage
    \ignorespacesafterend
  }
\NewDocumentEnvironment { CJKfilltwosides* } { O { c } m +b }
  {
    \mode_leave_vertical:
    \cs_set_eq:NN \CJKglue \xeCJK_fntef_hfilll:
    \tl_set:Nn \arraystretch { 1 }
    \cs_if_free:NF \extrarowheight
      { \cs_set_eq:NN \extrarowheight \c_zero_dim }
    \use:e { \@@_fill_two_sides:nnn {#1} { \dim_eval:n {#2} } } {#3}
  }
  { \ignorespacesafterend }
\cs_new_protected:Npn \@@_fill_two_sides:nnn #1#2#3
  {
    \dim_compare:nNnTF {#2} &gt; \c_zero_dim
      {
        \hbox_set:Nn \l_@@_tmp_box
          { \tabular [#1] { @ { } c @ { } }      #3 \endtabular }
        \dim_compare:nNnTF {#2} &gt; { \box_wd:N \l_@@_tmp_box }
          { \tabular [#1] { @ { } p {#2} @ { } } #3 \endtabular }
          { \box_use:N \l_@@_tmp_box }
      }
      { \tabular [#1] { @ { } c @ { } }          #3 \endtabular }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xeCJK_fntef_hfilll:}
% \pkg{colortbl} å°†è¡¨æ&nbsp;¼ |c| åˆ—ç”¨äºŽå¡«å……çš„ \tn{hfil} æ”¹ä¸ºäº†æ›´é«˜é˜¶çš„ \texttt{fill}ï¼Œ
% å½±å“åˆ°äº† \env{CJKfilltwosides*}ã€‚å›&nbsp;æ­¤ï¼Œæˆ‘ä»¬ä¹Ÿè¦ç”¨é«˜é˜¶çš„ \texttt{filll}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xeCJK_fntef_hfilll:
  { \skip_horizontal:N \c_@@_filll_skip }
\skip_const:Nn \c_@@_filll_skip { \c_zero_dim plus 1 filll }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%&lt;/fntef&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-listings}}
%
% \changes{v3.2.2}{2013/06/04}{å¢žåŠ&nbsp;å°å®åŒ… \pkg{xeCJK-listings}ï¼Œç”¨äºŽæ”¯æŒ \pkg{listings} å®åŒ…ã€‚}
% \changes{v3.2.3}{2013/06/06}{å®Œå–„å¯¹ \pkg{listings} å®åŒ…çš„æ”¯æŒã€‚}
%
% ä»¿ç…§ \package{luatexja} å®åŒ…ä¸­ \pkg{lltjp-listings} çš„å¤„ç†ï¼Œæ”¯æŒ \package{listings} å®åŒ…ã€‚
%
%    \begin{macrocode}
%&lt;*listings&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareOption* { \PassOptionsToPackage { \CurrentOption } { xeCJK } }
\ProcessOptions \scan_stop:
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage { xeCJK }
\RequirePackage { listings }
%    \end{macrocode}
%
%    \begin{macrocode}
\lst@AddToHook { Init } { \@@_listings_initial_hook: }
\lst@AddToHook { SelectCharTable } { \@@_listings_toks_hook: }
\lst@AddToHook { OutputBox }
  {
    \tl_set_eq:NN \l_xeCJK_punct_style_tl \c_@@_punct_style_plain_tl
    \l_@@_restore_listings_toks_tl
    \@@_listings_output_CM:
  }
\lst@AddToHook { PreSet } { \bool_set_true:N \l_@@_listings_env_bool }
%    \end{macrocode}
%
% \begin{macro}{\@@_listings_initial_hook:}
% \changes{v3.2.3}{2013/06/04}
% {è§£å†³ \texttt{listings} åå¢ƒä¸­ä»£ç&nbsp;è¡Œå·è¾“å‡ºä¸æ­£ç¡®çš„é—®é¢˜ï¼Œå¹¶è§£å†³åœ¨å…¶ä¸­è·¨é¡µæ—¶å¯¹é¡µçœ‰
%  å’Œé¡µè„šçš„å½±å“ã€‚}
% \changes{v3.2.15}{2014/11/10}{ä¿®æ­£ \texttt{breaklines} æ—&nbsp;æ•ˆçš„é—®é¢˜ã€‚}
% \changes{v3.3.1}{2015/04/20}
% {è§£å†³ \texttt{prebreak} å’Œ \texttt{postbreak} åŠŸèƒ½å¤±æ•ˆçš„é—®é¢˜ã€‚}
% ä¸ºä½¿ä»£ç&nbsp;è¡Œå·ç»“æžœæ­£ç¡®ï¼Œéœ€è¦åœ¨ \tn{lst@numberstyle} ä¸­æ¢å¤ \tn{XeTeXinterchartoks}ã€‚
% åœ¨ \texttt{listings} çŽ¯å¢ƒä¸­æ¢é¡µæ—¶ï¼Œå¯¹ \tn{XeTeXinterchartoks} çš„ä¿®æ”¹ä¼šå½±å“åˆ°
% é¡µçœ‰å’Œé¡µè„šï¼Œéœ€è¦åœ¨ \tn{shipout} ç›’å­ä¸­æ¢å¤æˆæ­£å¸¸å®šä¹‰ã€‚åŠ&nbsp;å…¥ \cs{tex_noindent:D}
% æ˜¯ä¸ºäº†è¿›å…¥æ°´å¹³æ¨¡å¼ï¼Œé˜²æ­¢æ±‰å­—å‡ºçŽ°åœ¨é¦–è¡Œçš„æ—¶å€™å¯èƒ½ä¼šäº§ç”Ÿé¢å¤–ç©ºè¡Œã€‚
% \tn{lst@prebreak} å’Œ \tn{lst@postbreak} æ˜¯åœ¨ \tn{discretionary} ä¸­ç›´æŽ¥è¾“å‡ºçš„ï¼Œ
% åº”è¯¥æ¢å¤æ­£å¸¸çš„ \tn{XeTeXinterchartoks}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_initial_hook:
  {
    \tex_noindent:D
    \bool_gset_false:N \g_@@_listings_CM_bool
    \tl_put_left:Nn \lst@numberstyle { \l_@@_restore_listings_toks_tl }
    \xeCJK_add_to_shipout:n { \l_@@_restore_listings_toks_tl }
    \lst@ifbreaklines
      \cs_set_eq:NN \@@_listings_CJK_toks_hook: \@@_listings_breaklines_toks:
      \tl_if_empty:NF \lst@prebreak
        { \tl_put_left:Nn \lst@prebreak { \l_@@_restore_listings_toks_tl } }
      \tl_if_empty:NF \lst@postbreak
        { \tl_put_left:Nn \lst@postbreak { \l_@@_restore_listings_toks_tl } }
    \fi:
    \int_set:Nn \l_@@_listings_max_char_int
      { \lst@ifec 255 \else: 127 \fi: }
  }
\int_new:N \l_@@_listings_max_char_int
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_toks_hook:}
% é‡‡ç”¨ä¸åŒçš„ \tn{XeTeXinterchartoks} å¤„ç†æ–¹å¼ï¼Œè¾“å…¥çš„æ—¶å€™æ˜¯å°†æ±‰å­—åŠ&nbsp;å…¥åˆ° \pkg{listings}
% çš„è¾“å‡ºé˜Ÿåˆ—ï¼Œå®žé™…è¾“å‡ºçš„æ—¶å€™æ˜¯æ™®é€šæ–‡å­—ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_toks_hook:
  {
    \tl_clear:N \l_@@_restore_listings_toks_tl
    \seq_map_function:NN
      \g_@@_class_seq \@@_backup_inter_class_toks:n
    \seq_map_inline:Nn \g_@@_non_CJK_class_seq
      {
        \str_if_eq:nnF { ##1 } { Boundary }
          {
            \xeCJK_inter_class_toks:nnn { Boundary } { ##1 }
              { \@@_listings_process_Default:nN { ##1 } }
          }
      }
    \xeCJK_inter_class_toks:nnn { Boundary } { CM }
      { \@@_listings_process_CM:nN { 0 } }
    \@@_listings_CJK_toks_hook:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_backup_inter_class_toks:n}
% æ³¨æ„ï¼Œç»™ \tn{XeTeXinterchartoks} èµ‹ç©ºå€¼ï¼Œä¼šå¯¼è‡´ \XeTeX å´©æºƒï¼
%    \begin{macrocode}
\cs_new_protected:Npn \@@_backup_inter_class_toks:n #1
  {
    \tl_set:Nx \l_@@_tmp_tl
      { \xeCJK_get_inter_class_toks:nn { Boundary } {#1} }
    \tl_put_right:Nx \l_@@_restore_listings_toks_tl
      {
        \xeCJK_inter_class_toks:nnn { Boundary } {#1}
          {
            \tl_if_empty:NTF \l_@@_tmp_tl
              { \exp_not:N \prg_do_nothing: }
              { \exp_not:o \l_@@_tmp_tl }
          }
      }
  }
\tl_new:N \l_@@_restore_listings_toks_tl
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_CJK_toks_hook:,\@@_listings_breaklines_toks:}
% æ&nbsp;¹æ® \texttt{breaklines} é€‰é¡¹çš„ä½¿ç”¨ä¸Žå¦ï¼Œé€‰æ‹©ä¸åŒçš„å¤„ç†æ–¹å¼ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_CJK_toks_hook:
  {
    \xeCJK_inter_class_toks:nnn { Boundary } { CJK }
      { \@@_listings_process_CJK:nN { 2 } }
    \xeCJK_inter_class_toks:nnn { Boundary } { FullLeft }
      { \@@_listings_process_CJK:nN { 2 } }
    \xeCJK_inter_class_toks:nnn { Boundary } { FullRight }
      { \@@_listings_process_CJK:nN { 2 } }
    \xeCJK_inter_class_toks:nnn { Boundary } { HangulJamo }
      { \@@_listings_process_CJK:nN { 2 } }
    \seq_map_inline:Nn \g_@@_CJK_sub_class_seq
      {
        \xeCJK_inter_class_toks:nnn { Boundary } { CJK/##1 }
          { \@@_listings_process_CJK:nN { 2 } }
      }
  }
\cs_new_protected:Npn \@@_listings_breaklines_toks:
  {
    \xeCJK_inter_class_toks:nnn { Boundary } { CJK }
      { \@@_listings_process_breaklines_CJK:nN { 2 } }
    \xeCJK_inter_class_toks:nnn { Boundary } { HangulJamo }
      { \@@_listings_process_breaklines_CJK:nN { 2 } }
    \xeCJK_inter_class_toks:nnn { Boundary } { FullLeft }
      { \@@_listings_process_FullLeft:nN { 2 } }
    \xeCJK_inter_class_toks:nnn { Boundary } { FullRight }
      { \@@_listings_process_FullRight:nN { 2 } }
    \seq_map_inline:Nn \g_@@_CJK_sub_class_seq
      {
        \xeCJK_inter_class_toks:nnn { Boundary } { CJK/##1 }
          { \@@_listings_process_breaklines_CJK:nN { 2 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_process_Default:nN}
% \changes{v3.2.3}{2013/06/08}{åœ¨ \texttt{listings} åå¢ƒä¸­å¯¹ \tn{charcode} å¤§äºŽ
% $255$ çš„å­—ç¬¦æ&nbsp;¹æ®å…¶ \tn{catcode} åŒºåˆ† \texttt{letter} å’Œ \texttt{other}ã€‚}
% \changes{v3.3.1}{2015/01/27}{å¯¹ \pkg{listings} çš„å­—ç¬¦æ‰©å±•ä¸å½±å“åˆ°å…¶ç¬¦å·è¡¨ä¸­çš„
% ä¸ƒä½æˆ–å…«ä½å­—ç¬¦ã€‚}
% å¯¹äºŽ \tn{charcode} å¤§äºŽ $255$ çš„å­—ç¬¦ï¼Œæ&nbsp;¹æ® \tn{catcode} è¿›è¡Œå¤„ç†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_process_Default:nN #1#2
  {
    \int_compare:nNnTF
      { \xeCJK_token_value_charcode:N #2 } &gt; \l_@@_listings_max_char_int
      {
        \token_if_letter:NTF #2
          { \lst@ProcessLetter #2 }
          { \lst@ProcessOther  #2 }
      }
      { \@@_listings_output_Default:nN {#1} #2 }
  }
%    \end{macrocode}
% è¾“å‡ºæ—¶ï¼Œè¦æ³¨æ„æŠŠå¯¹åº”çš„ \tn{XeTeXinterchartoks} æ¸…ç©ºæŽ‰ï¼Œå¦åˆ™ä¼šé€&nbsp;æˆæ­»å¾ªçŽ¯ã€‚
% \cs{scan_stop:} æ˜¯é€&nbsp;è¾¹ç•Œï¼Œè¾“å‡º \cs{group_end:}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_output_Default:nN #1#2
  {
    \group_begin:
      \xeCJK_clear_inter_class_toks:nn { Boundary } {#1}
      \xeCJK_inter_class_toks:nnn {#1} { Boundary } { \group_end: }
      #2
      \scan_stop:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_process_CJK:nN}
% å¯¹ CJK å­—ç¬¦ç±»çš„å¤„ç†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_process_CJK:nN #1#2
  {
    \token_if_letter:NTF #2
      { \@@_listings_process_letter:nN {#1} #2 }
      { \@@_listings_process_other:nN  {#1} #2 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_append:nN}
% æ™®é€š CJK å­—ç¬¦çš„å®½åº¦ä¸ºä¸€èˆ¬åŸºæœ¬å®½åº¦çš„ä¸¤å€ï¼ŒCM ç±»ä¸å¢žåŠ&nbsp;å®½åº¦ã€‚è¿™é‡Œæœ‰ä¸€ä¸ªé—®é¢˜ï¼Œ
% å¯¹ CJK å­—ç¬¦ç±»ä¸­çš„ä¸€äº›åŠè§’å­—ç¬¦ï¼ˆä¾‹å¦‚åŠè§’æ—¥æ–‡å‡åï¼‰æ²¡æœ‰åŒºåˆ†å¼€ã€‚\pkg{listings} é€šè¿‡
% é‡å®šä¹‰ \tn{lst@Append} å°†ä»£ç&nbsp;å†™å…¥å¤–éƒ¨æ–‡ä»¶ï¼Œå›&nbsp;æ­¤éœ€è¦ä¿ç•™ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_append:nN #1#2
  {
    \int_add:Nn \lst@length { #1 - 1 }
    \lst@Append #2
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_process_letter:nN,\@@_listings_process_other:nN}
% åœ¨ \texttt{letter} ç±»ä¸­åŒºåˆ†æ±‰å­—å’Œè¥¿æ–‡å­—æ¯ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_process_letter:nN
  {
    \lst@whitespacefalse
    \bool_if:NTF \l_@@_listings_letter_bool
      { \lst@lettertrue }
      {
        \lst@ifletter \lst@Output \else: \lst@OutputOther \lst@lettertrue \fi:
        \bool_set_true:N \l_@@_listings_letter_bool
      }
    \@@_listings_append:nN
  }
\bool_new:N \l_@@_listings_letter_bool
\cs_new_protected:Npn \@@_listings_process_other:nN #1#2
  {
    \lst@whitespacefalse
    \bool_if:NTF \l_@@_listings_letter_bool
      {
        \lst@Output \lst@letterfalse
        \bool_set_false:N \l_@@_listings_letter_bool
      }
      { \lst@ifletter \lst@Output \lst@letterfalse \fi: }
    \cs_set_eq:NN \lst@lastother #2
    \@@_listings_append:nN {#1} #2
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.4}{2013/07/05}
% {ä½¿ \pkg{listings} çš„ \texttt{breaklines} é€‰é¡¹å¯¹ CJK å­—ç¬¦ç±»å¯ç”¨ï¼Œå¹¶ä¿æŒæ&nbsp;‡ç‚¹ç¬¦å·çš„ç¦åˆ™ã€‚}
%
% \begin{macro}
% {\@@_listings_process_breaklines_CJK:nN,
%  \@@_listings_process_FullLeft:nN,
%  \@@_listings_process_FullRight:nN}
% å½“ä½¿ç”¨ \texttt{breaklines} é€‰é¡¹æ—¶ï¼Œç«‹å³è¾“å‡ºä¹‹å‰çš„å•ä¸ªæ–‡å­—ï¼Œä»¥ä¾¿äºŽæ–­è¡Œã€‚å¹¶å°†æ&nbsp;‡ç‚¹
% ä¸Žå®ƒå‰/åŽçš„ CJK æ–‡å­—æ”¾åœ¨åŒä¸€ä¸ªç›’å­ä¸­ï¼Œä»¥ä¿æŒç¦åˆ™ã€‚ä½†æ˜¯ä¸èƒ½åŒºåˆ† letter å’Œ otherã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_process_breaklines_CJK:nN
  {
    \lst@whitespacefalse
    \bool_if:NTF \l_@@_listings_letter_bool
      {
        \int_compare:nNnF \l_@@_listings_flag_int = 2 { \lst@Output }
        \lst@lettertrue
      }
      {
        \lst@ifletter \lst@Output \else: \lst@OutputOther \lst@lettertrue \fi:
        \bool_set_true:N \l_@@_listings_letter_bool
      }
    \int_set_eq:NN \l_@@_listings_flag_int \c_one_int
    \@@_listings_append:nN
  }
\cs_new_protected:Npn \@@_listings_process_FullLeft:nN #1#2
  {
    \lst@whitespacefalse
    \bool_if:NTF \l_@@_listings_letter_bool
      {
        \int_compare:nNnF \l_@@_listings_flag_int = 2
          {
            \int_compare:nNnTF \l_@@_listings_flag_int = 3
              { \bool_if:NT \l_@@_punct_breakable_bool { \lst@Output } }
              { \lst@Output }
          }
        \lst@lettertrue
      }
      {
        \lst@ifletter \lst@Output \else: \lst@OutputOther \lst@lettertrue \fi:
        \bool_set_true:N \l_@@_listings_letter_bool
      }
    \int_set:Nn \l_@@_listings_flag_int { 2 }
    \@@_listings_append:nN {#1} #2
  }
\cs_new_protected:Npn \@@_listings_process_FullRight:nN #1#2
  {
    \lst@whitespacefalse
    \bool_if:NTF \l_@@_listings_letter_bool
      {
        \int_compare:nNnT \l_@@_listings_flag_int &lt; 2
          { \@@_punct_if_long:NT #2 { \lst@Output } }
        \lst@lettertrue
      }
      {
        \lst@ifletter \lst@Output \else: \lst@OutputOther \lst@lettertrue \fi:
        \bool_set_true:N \l_@@_listings_letter_bool
      }
    \int_set:Nn \l_@@_listings_flag_int { 3 }
    \@@_listings_append:nN {#1} #2
  }
\int_new:N \l_@@_listings_flag_int
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\lst@AppendLetter,\lst@AppendOther}
%    \begin{macrocode}
\cs_set_protected:Npn \lst@AppendLetter
  {
    \bool_if:NTF \l_@@_listings_letter_bool
      {
        \lst@Output \lst@lettertrue
        \bool_set_false:N \l_@@_listings_letter_bool
      }
      { \reverse_if:N \lst@ifletter \lst@OutputOther \lst@lettertrue \fi: }
    \lst@ifbreaklines \int_zero:N \l_@@_listings_flag_int \fi:
    \lst@Append
  }
\cs_set_protected:Npn \lst@AppendOther
  {
    \bool_if:NTF \l_@@_listings_letter_bool
      {
        \lst@Output \lst@letterfalse
        \bool_set_false:N \l_@@_listings_letter_bool
      }
      { \lst@ifletter \lst@Output \lst@letterfalse \fi: }
    \lst@ifbreaklines \int_zero:N \l_@@_listings_flag_int \fi:
    \tex_futurelet:D \lst@lastother \lst@Append
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_process_CM:nN}
% \texttt{CM} ç±»ä½œä¸º \texttt{letter} å¤„ç†ï¼Œä¸ç”¨å¢žåŠ&nbsp; \tn{lst@length}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_process_CM:nN
  {
    \reverse_if:N \lst@ifflexible
      \bool_gset_true:N \g_@@_listings_CM_bool
    \fi:
    \@@_listings_process_letter:nN
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_output_CM:}
% åœ¨ä½¿ç”¨ \texttt{columns=fixed} é€‰é¡¹æ—¶ï¼Œ\pkg{listings} ä¼šåœ¨è¾“å‡ºç›’å­é‡Œçš„æ¯ä¸ªå­—ç¬¦
% ä¹‹é—´åŠ&nbsp;å…¥ \tn{hss}ï¼Œè¿™å°±ç&nbsp;´åäº† \XeTeX å°†åŸºæœ¬å­—å’Œç»„åˆæ&nbsp;‡è¯†æ­£ç¡®çš„ç»„åˆèµ·æ¥ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_output_CM:
  {
    \reverse_if:N \lst@ifflexible
      \bool_if:NT \g_@@_listings_CM_bool
        {
          \bool_gset_false:N \g_@@_listings_CM_bool
          \xeCJK_cs_clear:N \lst@FillOutputBox
          \cs_set_eq:NN \CJKglue \tex_hss:D
        }
    \fi:
  }
\bool_new:N \g_@@_listings_CM_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_peek_active_loop:TF}
% \tn{lstinline} é€šè¿‡åˆ¤æ–­å‚æ•°ä¸­ç¬¬ä¸€ä¸ªå­—ç¬¦æ˜¯å¦æ˜¯ \texttt{active} ç±»æ¥åŒºåˆ†
% å®ƒæ˜¯å¦è¢«ç”¨åœ¨å…¶ä»–å®çš„å‚æ•°ä¹‹ä¸­ã€‚å¦‚æžœè¿™ç¬¬ä¸€ä¸ªå­—ç¬¦ä¸åœ¨ \pkg{listings} é¢„å®šä¹‰çš„
% ç¬¦å·è¡¨ä¸­ï¼Œåˆ¤æ–­å°±ä¼šå‡ºé—®é¢˜ã€‚æˆ‘ä»¬åœ¨è¿™é‡Œé€šè¿‡ä¸€ä¸ªå¾ªçŽ¯è·³è¿‡è¿™äº›å­—ç¬¦ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_peek_active_loop:TF #1#2#3
  {
    \token_if_active:NTF #3
      { #1#3 }
      {
        \token_if_cs:NTF #3
          { #2#3 }
          {
            \int_compare:nNnTF { `#3 } &gt; { \l_@@_listings_max_char_int }
              { \@@_listings_peek_active_loop:TF { #1#3 } { #2#3 } }
              { #2#3 }
          }
      }
  }
\cs_set_eq:NN \lst@IfNextCharActive \@@_listings_peek_active_loop:TF
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_rescan:Nn,
%  \@@_listings_inside_convert:nw,\@@_listings_inline_group:w}
% å½“ \tn{lstinline} è¢«ä½¿ç”¨åœ¨å‚æ•°ä¸­æ—¶ï¼Œ\pkg{listings} ä¼šä½¿ç”¨ä¸€ä¸ªå¾ªçŽ¯é€ä¸ªå°†
% \tn{lstinline} å‚æ•°ä¸­çš„å­—ç¬¦è®¾ç½®ä¸ºæ´»åŠ¨å­—ç¬¦ã€‚æˆ‘ä»¬å¯ä»¥é€šè¿‡ \cs{tl_set_rescan:Nnn}
% æ¥å®Œæˆè¿™é‡Œçš„ \tn{catcode} è½¬æ¢ï¼Œé¿å…å°† \tn{charcode} è¶…è¿‡ $255$ çš„å­—ç¬¦éƒ½è®¾ç½®ä¸º
% æ´»åŠ¨å­—ç¬¦ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_listings_rescan:Nn #1#2
  {
    \@@_listings_set_escape:
    \tl_set:Nn \l_@@_tmp_tl {#2}
    \@@_listings_escape_backslash:
    \tl_set_rescan:Nno #1 { } { \l_@@_tmp_tl }
  }
\cs_new_protected:Npn \@@_listings_inside_convert:nw #1 ~ \@empty
  {
    \@@_listings_rescan:Nn \l_@@_tmp_tl {#1}
    \tl_put_right:No \lst@arg { \l_@@_tmp_tl }
  }
\cs_set_eq:NN \lst@InsideConvert@ \@@_listings_inside_convert:nw
\cs_new_protected:Npn \@@_listings_inline_group:w
  {
    \exp_after:wN \@@_listings_inline_group:n
    \exp_after:wN { \if_int_compare:w `} = \c_zero_int \fi:
  }
\cs_set_eq:NN \lst@InlineGJ \@@_listings_inline_group:w
\cs_new_protected:Npn \@@_listings_inline_group:n #1
  {
    \@@_listings_rescan:Nn \lst@arg {#1}
    \lst@InlineGJEnd
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_listings_set_escape:}
% ç”±äºŽæˆ‘ä»¬åœ¨ä¸Šé¢çš„ä¿®æ”¹ï¼Œéœ€è¦ä¿ç•™ |\| ç”¨äºŽè½¬ä¹‰ \tn{lstinline} å‚æ•°ä¸­çš„æŸäº› \TeX
% ç‰¹æ®Šå­—ç¬¦ï¼Œä¸ŽåŽŸæ¥å®åŒ…ä¸€è‡´ã€‚
%    \begin{macrocode}
\group_begin:
\cs_set:Npn \@@_tmp:w #1
  {
    \group_end:
    \cs_new_protected:Npn \@@_listings_set_escape:
      { \xeCJK_swap_cs:NN #1 \@@_listings_escape:N }
    \cs_new_protected:Npn \@@_listings_escape:N ##1
      { \cs_if_eq:NNTF #1 ##1 { \@@_listings_escape:N } {##1} }
  }
\use:n
  {
    \char_set_catcode_active:N \\
    \@@_tmp:w
  }
  { \ }
%    \end{macrocode}
% \end{macro}
%
%
% \changes{v3.4.8}{2017/05/15}{è½¬ä¹‰ \tn{lstinline} å‚æ•°ä¸­çš„ $\texttt{\textbackslash}_{12}$ã€‚}
% \begin{macro}{\@@_listings_escape_backslash:}
% \tn{catcode} ä¸º $12$ çš„ |\| éœ€è¦åŒå†™è½¬ä¹‰ã€‚
%    \begin{macrocode}
\cs_new_protected:Npx \@@_listings_escape_backslash:
  {
    \tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl
      { \c_backslash_str }
      { \c_backslash_str \c_backslash_str }
  }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%&lt;/listings&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;@@=xunadd&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xunicode-addon}}
%
% \changes{v3.2.5}{2013/07/18}
% {å¢žåŠ&nbsp;å°å®åŒ… \pkg{xunicode-addon}ï¼Œä¸º \pkg{xunicode} æä¾›åˆ¤æ–­å­—ç¬¦æ˜¯å¦å­˜åœ¨çš„åŠŸèƒ½ã€‚}
% \changes{v3.2.9}{2013/12/08}
% {æ–‡æ¡£éƒ¨åˆ†å¢žåŠ&nbsp; \pkg{xunicode} å®šä¹‰çš„ç¬¦å·è¡¨ã€‚}
%
%    \begin{macrocode}
%&lt;*xunicode&gt;
%    \end{macrocode}
%
% \pkg{xunicode} å¯¹ç¼–ç&nbsp;ç›¸å…³çš„ç¬¦å·å‘½ä»¤çš„å®šä¹‰ä¸­ç”¨çš„æ˜¯è¯¸å¦‚ |\char"0022\relax| çš„å½¢å¼ã€‚
% ä¾‹å¦‚ \tn{textbar} è¢«å±•å¼€ä¸º |\char"007C\relax|ã€‚å¹¶ä¸”è¯¸å¦‚ä¸‹è¿°çš„å®šä¹‰æ˜¯æ—&nbsp;æ•ˆçš„ï¼š
% \begin{verbatim}
%   \DeclareUTFcomposite[\UTFencname]{x1EBF}{\'}{\^e}
% \end{verbatim}
% æˆ‘ä»¬åœ¨è¿™é‡Œåšçš„ä¿®æ”¹æ˜¯æŠŠç¬¦å·å‘½ä»¤å®šä¹‰ä¸ºå®žé™…çš„å­—ç¬¦å¹¶ä¸”ä½¿ä¸Šè¿°å®šä¹‰ç”Ÿæ•ˆã€‚å¦å¤–åœ¨ä½¿ç”¨
% è¿™äº›ç¬¦å·å‘½ä»¤çš„æ—¶å€™ï¼Œå…ˆåˆ¤æ–­å½“å‰å­—ä½“ä¸­æ˜¯å¦å­˜åœ¨å¯¹åº”çš„å­—ç¬¦ï¼Œå¦‚æžœä¸å­˜åœ¨ï¼Œåˆ™ä½¿ç”¨è¿™
% äº›ç¬¦å·å‘½ä»¤çš„é»˜è®¤è®¾ç½®ã€‚
%
%    \begin{macrocode}
\bool_lazy_or:nnF
  { \sys_if_engine_xetex_p: }
  { \sys_if_engine_luatex_p: }
  {
    \msg_new:nnnn { xunicode-addon } { xetex-luatex }
      { This~package~requires~either~XeTeX~or~LuaTeX~to~function.}
      {
        You~must~change~your~typesetting~engine~to,~e.g.,\\
        "xelatex"~or~"lualatex"~instead~of~plain~"latex"~or~"pdflatex".
      }
    \msg_critical:nn { xunicode-addon } { xetex-luatex }
  }
\RequirePackage { xparse }
%    \end{macrocode}
%
% å®åŒ…é€‰é¡¹æ˜¯ç¼–ç&nbsp;çš„åå­—ã€‚
%
%    \begin{macrocode}
\clist_new:N \g_@@_encname_clist
\tl_if_exist:NT \UTFencname
  { \clist_gput_right:Nx \g_@@_encname_clist { \UTFencname } }
\DeclareOption*
  { \clist_gput_right:No \g_@@_encname_clist \CurrentOption }
\ProcessOptions \scan_stop:
%    \end{macrocode}
%
% è‹¥ \pkg{xunicode} å·²ç»è¢«è°ƒç”¨ï¼Œåˆ™åœ¨å®åŒ…ç»“æŸçš„æ—¶å€™ï¼Œé‡æ–°è®¾ç½® \tn{UTFencname}
% å¯¹åº”çš„ç¼–ç&nbsp;å‘½ä»¤ã€‚å¦åˆ™è®¾ç½® \tn{UTFencname}ï¼Œå¦‚æžœä½¿ç”¨çš„æ˜¯ \hologo{LuaLaTeX}ï¼Œåˆ™
% éœ€è¦ä½œä¸€äº›è®¾ç½®ï¼Œä½¿å¾— \pkg{xunicode} å¯ç”¨ã€‚
%
% \changes{v3.3.3}{2016/02/01}{ä½¿ç”¨æ–°çš„ Unicode ç¼–ç&nbsp;åç§° \texttt{TU}ã€‚}
%
%    \begin{macrocode}
\@ifpackageloaded { xunicode } { }
  {
    \clist_get:NNF \g_@@_encname_clist \UTFencname
      {
        \cs_if_exist:NTF \UnicodeEncodingName
          { \tl_set:Nx \UTFencname { \UnicodeEncodingName } }
          {
            \sys_if_engine_xetex:TF
              { \tl_set:Nn \UTFencname { EU1 } }
              { \tl_set:Nn \UTFencname { EU2 } }
          }
        \clist_gset_eq:NN \g_@@_encname_clist \UTFencname
      }
    \sys_if_engine_xetex:TF
      { \RequirePackage { xunicode } }
      {
        \cs_set_eq:NN \@@_tmp:w \XeTeXpicfile
        \cs_set_eq:NN \XeTeXpicfile \prg_do_nothing:
        \RequirePackage { xunicode }
        \cs_set_eq:NN \XeTeXpicfile \@@_tmp:w
      }
  }
\AtEndOfPackage { \@@_reload:N \g_@@_encname_clist }
%    \end{macrocode}
%
% \begin{macro}[int]{\ReloadXunicode}
% å‚æ•°å¯ä»¥æ˜¯å¤šä¸ªç¼–ç&nbsp;ï¼Œè®¾ç½®è¿™äº›ç¼–ç&nbsp;å¯¹åº”çš„å‘½ä»¤ã€‚å¦‚æžœç¼–ç&nbsp;æ²¡æœ‰é¢„å…ˆå£°æ˜Žï¼Œåˆ™ç»™å‡º
% ä¸€ä¸ªé”™è¯¯è­¦å‘Šã€‚
%    \begin{macrocode}
\RenewDocumentCommand \ReloadXunicode { m }
  {
    \clist_set:Nx \l_@@_encname_clist {#1}
    \@@_reload:N \l_@@_encname_clist
  }
\cs_new_protected:Npn \@@_reload:N #1
  {
    \cs_set_eq:NN \@@_tmp:w \iftipaonetoken
    \cs_set_eq:NN \iftipaonetoken \scan_stop:
    \use:e
      {
        \ExplSyntaxOff
        \char_set_catcode_letter:n { 64 }
        \exp_not:N \clist_map_function:NN \exp_not:N #1 \@@_reload_aux:n
        \bool_if:NTF \l__kernel_expl_bool
          { \ExplSyntaxOn }
          { \ExplSyntaxOff }
        \char_set_catcode:nn { 64 } { \char_value_catcode:n { 64 } }
      }
    \cs_set_eq:NN \iftipaonetoken \@@_tmp:w
  }
\cs_new_protected:Npn \@@_reload_aux:n #1
  {
    \cs_if_exist:cTF { T@ #1 }
      {
        \tl_set:Nn \UTFencname {#1}
        \clist_if_in:NnF \g_@@_encname_clist {#1}
          { \clist_gput_right:Nn \g_@@_encname_clist {#1} }
        \file_input:n { xunicode.sty }
        \file_input:n { xunicode-extra.def }
      }
      { \msg_error:nnn { xunicode-addon } { encoding-unknown } {#1} }
  }
\clist_new:N \l_@@_encname_clist
\msg_new:nnnn { xunicode-addon } { encoding-unknown }
  { Encoding~scheme~"#1"~unknown. }
  {
    You~may~use \\\\
    \token_to_str:N \usepackage [ #1 , \encodingdefault ] \{fontenc\} \\\\
    before~xunicode-addon~or~xunicode.
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFmathsymbols}
% \changes{v3.2.8}{2013/12/04}{ä¿®æ­£ \tn{UseMathAsText} çš„åŠŸèƒ½ï¼Œæ¢å¤ \tn{hbar}
% å’Œå¢žåŠ&nbsp;ä»¥ \texttt{text} æ‰“å¤´çš„æ–‡æœ¬ç¬¦å·å‘½ä»¤ã€‚}
% å°†æ–‡æœ¬ç¬¦å·å®šä¹‰ä¸º \tn{protected} å®åŽï¼Œä¸ºäº†ä¸Ž \pkg{hyperref} çš„ä¹¦ç­¾åŠŸèƒ½å…¼å®¹
% éœ€è¦ä½œä¸€ç‚¹é¢å¤–å¤„ç†ã€‚
%    \begin{macrocode}
\RenewDocumentCommand \DeclareUTFmathsymbols { m }
  {
    \bool_if:NT \l_@@_math_as_UTF_text_bool
      {
        \seq_map_inline:Nn \l_@@_math_as_UTF_text_seq
          { \@@_declare_math_as_UTF_text:n {##1} }
        \bool_set_false:N \l_@@_math_as_UTF_text_bool
      }
  }
\seq_new:N \l_@@_math_as_UTF_text_seq
\seq_set_from_clist:Nn \l_@@_math_as_UTF_text_seq
  { hbar , Finv , aleph , beth , gimel , daleth , Game }
\bool_new:N \l_@@_math_as_UTF_text_bool
\RenewDocumentCommand \UseMathAsText { }
  {
    \math@s@text@true
    \bool_set_true:N \l_@@_math_as_UTF_text_bool
  }
\@onlypreamble \UseMathAsText
\cs_new_protected:Npn \@@_declare_math_as_UTF_text:n #1
  {
    \cs_if_exist:cTF {#1}
      {
        \cs_new_eq:cc { keepmathUTF #1 } {#1}
        \cs_gset_protected:cpx {#1}
          {
            \exp_not:N \mode_if_math:TF
              { \exp_not:c { keepmathUTF #1 } }
              { \exp_not:c { text #1 } }
          }
        \tl_put_right:Nx \l_@@_hyperref_hook_tl
          { \cs_set_eq:NN \exp_not:c {#1} \exp_not:c { text #1 } }
      }
      { \cs_new:cpx {#1} { \exp_not:c { text #1 } } }
  }
\tl_new:N \l_@@_hyperref_hook_tl
\AtBeginDocument
  {
    \cs_if_free:NF \pdfstringdefDisableCommands
      { \pdfstringdefDisableCommands { \l_@@_hyperref_hook_tl } }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[pTF]{\@@_glyph_if_exist:n}
% åˆ¤æ–­å­—ç¬¦åœ¨å½“å‰å­—ä½“ä¸­æ˜¯å¦å­˜åœ¨ã€‚
%    \begin{macrocode}
\prg_new_conditional:Npnn \@@_glyph_if_exist:n #1 { p , T , F , TF }
  {
    \tex_iffontchar:D \tex_font:D \tex_numexpr:D #1 \scan_stop:
      \prg_return_true: \else: \prg_return_false: \fi:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\UndeclareUTFcharacter}
% å–æ¶ˆç¼–ç&nbsp; |#1| ä¸‹çš„ç¬¦å·å‘½ä»¤ |#3|ã€‚
%    \begin{macrocode}
\RenewDocumentCommand \UndeclareUTFcharacter { O { \UTFencname } m m }
  {
    \@@_if_csname:nTF {#3}
      { \UndeclareTextCommand {#3} }
      { \exp_args:Nc \UndeclareTextCommand { \tl_to_str:n {#3} } }
      {#1}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\UndeclareUTFcomposite}
% å–æ¶ˆç¼–ç&nbsp; |#1| ä¸‹çš„å¤åˆç¬¦å·å‘½ä»¤ |#3{#4}|ã€‚
%    \begin{macrocode}
\RenewDocumentCommand \UndeclareUTFcomposite { O { \UTFencname } m m m }
  {
    \@@_if_csname:nTF {#3}
      { \@@_undeclare_composite:Nnnn #3 }
      { \exp_args:Nc \@@_undeclare_composite:Nnnn { \tl_to_str:n {#3} } }
      {#1} {#4} {#2}
  }
\cs_new_protected:Npn \@@_undeclare_composite:Nnnn #1#2#3#4
  { \cs_undefine:c { \@@_composite_cs:Nnn #1 {#2} {#3} } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_composite_cs:Nnn,\@@_composite_cs:nnn}
%    \begin{macrocode}
\cs_new:Npx \@@_composite_cs:Nnn #1#2#3
  { \c_backslash_str #2 \exp_not:N \token_to_str:N #1 - \exp_not:N \tl_to_str:n {#3} }
\cs_new:Npx \@@_composite_cs:nnn #1#2#3
  { \c_backslash_str #2 #1 - \exp_not:N \tl_to_str:n {#3} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_if_csname:nTF}
% åˆ¤æ–­ |#1| æ˜¯å¦å¯ä»¥ä½œä¸ºæŽ§åˆ¶åºåˆ—çš„åå­—ã€‚è¿™æ˜¯å›&nbsp;ä¸º \pkg{xunicide} ä½¿ç”¨äº†ä¸‹é¢çš„å®šä¹‰ã€‚
% \begin{verbatim}
%   \DeclareUTFcharacter[\UTFencname]{x0149}{'n}
% \end{verbatim}
%    \begin{macrocode}
\prg_new_conditional:Npnn \@@_if_csname:n #1 { TF }
  {
    \tl_if_single_token:nTF {#1}
      {
        \token_if_cs:NTF #1
          { \prg_return_true: }
          {
            \token_if_active:NTF #1
              { \prg_return_true: }
              { \prg_return_false: }
          }
      }
      { \prg_return_false: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFcharacter}
% å®šä¹‰ç¼–ç&nbsp; |#1| ä¸‹çš„ç¬¦å·å‘½ä»¤ |#3|ï¼Œå…¶å¯¹åº”ç¬¦å·çš„ Unicode æ˜¯ |#2|ã€‚
%    \begin{macrocode}
\RenewDocumentCommand \DeclareUTFcharacter { O { \UTFencname } m m }
  {
    \cs_if_exist_use:cF
      { @@_restore_ \tl_to_str:n {#3} : }
      {
        \@@_if_csname:nTF {#3}
          { \@@_declare_character:Nnn #3 }
          { \@@_declare_character:cnn { \tl_to_str:n {#3} } }
        {#1} {#2}
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_restore_cmd:N}
% æ¢å¤ \tn{hbar} å’Œ \tn{nobreakspace} ä¸ºåŽŸæœ¬å®šä¹‰ã€‚
%    \begin{macrocode}
\cs_new_protected:cpn
  { @@_restore_ \tl_to_str:n { \hbar } : }
  { \@@_restore_cmd:N \hbar }
\cs_new_protected:cpn
  { @@_restore_ \tl_to_str:n { \nobreakspace } : }
  { \@@_restore_cmd:N \nobreakspace }
\cs_new_protected:Npn \@@_restore_cmd:N #1
  { \@@_restore_cmd:Ne #1 { ? - \token_to_str:N #1 } }
\cs_new_protected:Npn \@@_restore_cmd:Nn #1#2
  {
    \cs_if_free:cF {#2}
      { \@@_restore_cmd:Nc #1 {#2} }
  }
\cs_new_protected:Npn \@@_restore_cmd:NN #1#2
  {
    \cs_gset_eq:NN #1 #2
    \cs_undefine:N #2
  }
\cs_generate_variant:Nn \@@_restore_cmd:Nn { Ne }
\cs_generate_variant:Nn \@@_restore_cmd:NN { Nc }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_declare_character:Nnn}
% é€šè¿‡ \cs{tex_Uchar:D} ç›´æŽ¥ç”± Unicode |#3| å¾—åˆ°ç¼–ç&nbsp; |#2| ä¸‹çš„ç¬¦å·å‘½ä»¤
% |#1| å¯¹åº”çš„å®žé™…å­—ç¬¦ã€‚\tn{DeclareUTFSymbol} çš„å‚æ•°æ&nbsp;¼å¼ä¸Ž \tn{DeclareTextSymbol}
% å®Œå…¨ä¸€è‡´ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_declare_character:Nnn #1#2#3
  {
    \@@_provide_text_command_default:N #1
    \exp_after:wN \@@_declare_character:NNen
      \tex_Uchar:D \@@_check_slot:n {#3} \exp_stop_f:
      #1 { \token_to_str:N #1 } {#2}
  }
\cs_generate_variant:Nn \@@_declare_character:Nnn { c }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFSymbol,\DeclareUTFCommand}
% \tn{DeclareUTFCommand} åªèƒ½ç”¨äºŽå®šä¹‰ä¸å¸¦å‚æ•°çš„ç¬¦å·å‘½ä»¤ã€‚
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFSymbol { m O { \UTFencname } m }
  { \@@_declare_character:Nnn #1 {#2} {#3} }
\NewDocumentCommand \DeclareUTFCommand { m O { \UTFencname } m }
  { \@@_text_command:Nonn #1 { \token_to_str:N #1 } {#2} {#3} }
\cs_new_protected:Npn \@@_text_command:Nnnn #1#2#3#4
  { \DeclareTextCommand #1 {#3} { \@@_text_command:nn {#2} {#4} } }
\cs_generate_variant:Nn \@@_text_command:Nnnn { No }
\cs_new_protected:Npn \@@_text_command:nn #1#2
  {
    \@@_begin_hook:nn {#1} {#2}
    #2
    \@@_end_hook:nn {#1} {#2}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_provide_text_command_default:N}
% å¦‚æžœæŽ§åˆ¶åºåˆ— |#1| å·²ç»å­˜åœ¨ï¼Œä½†ä¸æ˜¯ç¬¦å·å‘½ä»¤ï¼Œ\pkg{xunicode} ä¼šå°†å®ƒå®šä¹‰ä¸º
% \tn{UTFencname} ç¼–ç&nbsp;ä¸‹çš„ç¬¦å·å‘½ä»¤ã€‚ä½†æ˜¯ç¼–ç&nbsp;è¢«è½¬æ¢ä¹‹åŽï¼Œå†ä½¿ç”¨è¿™äº›æŽ§åˆ¶åºåˆ—ï¼Œ
% \pkg{NFSS} å°±ä¼šæŠ¥é”™ã€‚ä¸ºæ­¤éœ€è¦ç»™å‡ºè¿™äº›ç¬¦å·å‘½ä»¤çš„é»˜è®¤å®šä¹‰ï¼Œä¸ŽåŽŸæ¥çš„æ„ä¹‰ç›¸åŒã€‚
% è¿™äº›å‘½ä»¤åŒ…æ‹¬
% \begin{verbatim}
%   \nobreakspace   macro:-&gt;\protect \nobreakspace
%   \copyright      macro:-&gt;\protect \copyright
%   \AA             macro:-&gt;\r A
%   \aa             macro:-&gt;\r a
%   \textrhookopeno \long macro:-&gt;\textrethookbelow {\textopeno }
%   \hbar           macro:-&gt;{\mathchar '26\mkern -9muh}
%   \textaolig      macro:-&gt;{a\kern -.25em o}
% \end{verbatim}
% å½±å“æ¯”è¾ƒå¤§çš„æ˜¯ \tn{nobreakspace}ã€\tn{copyright} å’Œ \tn{hbar}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_provide_text_command_default:N #1
  {
    \cs_if_exist:cF { ? \token_to_str:N #1 }
      {
        \cs_if_free:cF { ? - \token_to_str:N #1 }
          {
            \exp_args:NNv \ProvideTextCommandDefault #1
              { ? - \token_to_str:N #1 }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_declare_character:NNnn}
% ä½¿ç”¨ç¼–ç&nbsp; |#4| ä¸‹çš„ç¬¦å·å‘½ä»¤ |#2| çš„æ—¶å€™å…ˆåˆ¤æ–­å®ƒå¯¹åº”çš„å®žé™…å­—ç¬¦ |#1| åœ¨å½“å‰å­—ä½“ä¸­
% æ˜¯å¦å­˜åœ¨ã€‚å¦‚æžœä¸å­˜åœ¨åˆ™è½¬æ¢åˆ° \tn{DeclareTextSymbolDefault} ä¸­è®¾ç½®çš„ç¼–ç&nbsp;æˆ–è€…ä½¿ç”¨
% \cs{Declare\-Text\-Command\-Default} ä¸­è®¾ç½®çš„å‘½ä»¤ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_declare_character:NNnn #1#2#3#4
  { \DeclareTextCommand #2 {#4} { \@@_text_character:nN {#3} {#1} } }
\cs_new_protected:Npn \@@_text_character:nN #1#2
  {
    \@@_begin_hook:nn {#1} {#2}
    \@@_glyph_if_exist:nTF { `#2 }
      {#2} { \cs_if_exist_use:cF { ? #1 } {#2} }
    \@@_end_hook:nn {#1} {#2}
  }
\cs_generate_variant:Nn \@@_declare_character:NNnn { NNe }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_check_slot:n}
% \pkg{xunicode} ä¸­ä½¿ç”¨çš„ Unicode æ&nbsp;¼å¼æ˜¯è¯¸å¦‚ |x0022| çš„å½¢å¼ï¼Œè¿™å°±éœ€è¦ä¸€äº›è½¬æ¢ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_check_slot:n #1
  {
    \int_eval:n
      {
        \tl_if_head_eq_charcode:nNTF {#1} x
          { " \use_none:n #1 } {#1}
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFcomposite}
% è®¾ç½®ç¼–ç&nbsp; |#1| ä¸‹çš„ç¬¦å·å‘½ä»¤ |#3| ä¸Žå®ƒçš„å‚æ•° |#4| çš„å¤åˆå¯¹åº”çš„ç¬¦å·çš„ Unicode æ˜¯ |#2|ã€‚
%    \begin{macrocode}
\RenewDocumentCommand \DeclareUTFcomposite { O { \UTFencname } m m m }
  {
    \@@_if_csname:nTF {#3}
      { \@@_declare_composite:Nnnn #3 }
      { \@@_declare_composite:cnnn { \tl_to_str:n {#3} } }
      {#1} {#4} {#2}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_declare_composite:Nnnn}
% è¿™é‡Œä½¿ç”¨ \cs{tex_afterassignment:D} æ˜¯å›&nbsp;ä¸º \pkg{xunicode} æœ‰å¦‚ä¸‹çš„å®šä¹‰ã€‚
% \begin{verbatim}
%   \DeclareUTFcomposite[\UTFencname]{x02E8\char"02E5}{\tonebar}{25}
%   \DeclareUTFcomposite[\UTFencname]{x02E5\char"02E8}{\tonebar}{52}
% \end{verbatim}
% å¯¹å¤åˆç¬¦å·å‘½ä»¤çš„å®šä¹‰ç”¨çš„æ˜¯ \tn{chardef}ï¼Œè¿™æœ‰åˆ©äºŽä¸‹é¢å­—ç¬¦æ˜¯å¦å­˜åœ¨çš„åˆ¤æ–­ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_declare_composite:Nnnn #1#2#3#4
  {
    \tex_afterassignment:D \use_none_delimit_by_q_stop:w
    \@@_chardef:cn { \@@_composite_cs:Nnn #1 {#2} {#3} }
      { \@@_check_slot:n {#4} }
    \q_stop
  }
\cs_new_protected:Npn \@@_chardef:Nn #1#2
  { \tex_chardef:D #1 = \tex_numexpr:D #2 \scan_stop: }
\cs_generate_variant:Nn \@@_chardef:Nn { c }
\cs_generate_variant:Nn \@@_declare_composite:Nnnn { c }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFCompositeCommand}
% è®¾ç½®ç¼–ç&nbsp; |#2| ä¸‹çš„ç¬¦å·å‘½ä»¤ |#1| ä¸Žå®ƒçš„å‚æ•° |#3| çš„å¤åˆå¯¹åº”ç»“æžœæ˜¯ |#4|ã€‚ä¸èƒ½ç›´æŽ¥ç”¨
% \cs{Declare\-Text\-Composite\-Command} æ¥å®šä¹‰ï¼Œå®ƒä¸Žæˆ‘ä»¬çš„æœºåˆ¶å†²çªã€‚
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFCompositeCommand { m O { \UTFencname } m m }
  { \cs_set_protected:cpn { \@@_composite_cs:Nnn #1 {#2} {#3} } {#4} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFCompositeSymbol}
% è®¾ç½®ç¼–ç&nbsp; |#2| ä¸‹çš„ç¬¦å·å‘½ä»¤ |#1| ä¸Žå®ƒçš„å‚æ•° |#3| çš„å¤åˆå¯¹åº”ç»“æžœæ˜¯ |#4|ã€‚ä¸èƒ½ç›´æŽ¥ç”¨
% \cs{Declare\-Text\-Composite} æ¥å®šä¹‰ï¼Œå®ƒä¸Žæˆ‘ä»¬çš„æœºåˆ¶å†²çªã€‚
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFCompositeSymbol { m O { \UTFencname } m m }
  {
    \@@_chardef:cn { \@@_composite_cs:Nnn #1 {#2} {#3} }
      { \@@_check_slot:n {#4} }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFComposite}
% å°† |#1| è®¾ç½®ä¸ºç¼–ç&nbsp; |#2| ä¸‹çš„å¸¦ä¸€ä¸ªå‚æ•°çš„å¤åˆç¬¦å·å‘½ä»¤ã€‚
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFComposite { m O { \UTFencname } }
  { \use:e { \@@_declare_composite:Nnn \exp_not:N #1 { \token_to_str:N #1 } {#2} } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFEncodedAccent}
% |#1| æ˜¯é‡éŸ³å‘½ä»¤ï¼Œ|#2| æ˜¯ç¼–ç&nbsp;ï¼Œ|#3| æ˜¯ç»„åˆé‡éŸ³ç¬¦å·çš„ Unicodeï¼Œ|#4| æ˜¯åŸºæœ¬é‡éŸ³ç¬¦å·
% çš„ Unicodeã€‚å½“ |#1| çš„å‚æ•°ä¸ºç©ºæ—¶ï¼Œè¾“å‡º |#4|ï¼Œå¦åˆ™æ˜¯ |#1| çš„å‚æ•°ä¸Ž |#3| çš„ç»„åˆã€‚
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFEncodedAccent { m O { \UTFencname } m m }
  { \@@_declare_encoded:NNnnn \@@_combine_accent:nnNNn #1 {#2} {#3} {#4} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFEncodedAccents}
% |#1| æ˜¯é‡éŸ³å‘½ä»¤ï¼Œ|#2| æ˜¯ç¼–ç&nbsp;ï¼Œ|#3| å’Œ |#4| éƒ½æ˜¯ç»„åˆé‡éŸ³ç¬¦å·çš„ Unicodeã€‚
% è¾“å‡º |#1| ä¸Ž |#3|ã€|#4| çš„ç»„åˆã€‚
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFEncodedAccents { m O { \UTFencname } m m }
  { \@@_declare_encoded:NNnnn \@@_combine_accents:nnNNn #1 {#2} {#3} {#4} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFEncodedSymbol}
% |#1| æ˜¯å¸¦å‚æ•°çš„ç¬¦å·å‘½ä»¤ï¼Œ|#2| æ˜¯ç¼–ç&nbsp;ï¼Œ|#3| æ˜¯ç»„åˆç¬¦å·çš„ Unicodeï¼Œ|#4| æ˜¯åŸºæœ¬ç¬¦å·çš„
% Unicodeã€‚å½“ |#1| çš„å‚æ•°ä¸ºç©ºæ—¶ï¼Œè¾“å‡º |#4|ï¼Œå¦åˆ™æ˜¯ |#1| çš„å‚æ•°ä¸Ž |#3| çš„ç»„åˆã€‚
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFEncodedSymbol { m O { \UTFencname } m m }
  { \@@_declare_encoded:NNnnn \@@_combine_symbol:nnNNn #1 {#2} {#3} {#4} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFEncodedCircle}
% |#1| æ˜¯å¸¦å‚æ•°çš„åœ†åœˆç¬¦å·å‘½ä»¤ï¼Œ|#2| æ˜¯ç¼–ç&nbsp;ï¼Œ|#3| æ˜¯ç»„åˆåœ†åœˆç¬¦å·çš„ Unicodeï¼Œ|#4|
% æ˜¯åœ†åœˆç¬¦å·çš„ Unicodeã€‚å½“ |#1| çš„å‚æ•°ä¸ºç©ºæ—¶ï¼Œè¾“å‡º |#4|ï¼Œå¦åˆ™æ˜¯ |#1| çš„å‚æ•°ä¸Ž |#4| çš„ç»„åˆã€‚
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFEncodedCircle { m O { \UTFencname } m m }
  { \@@_declare_encoded:NNnnn \@@_combine_circle:nnNNn #1 {#2} {#3} {#4} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareEncodedCompositeCharacter}
%    \begin{macrocode}
\RenewDocumentCommand \DeclareEncodedCompositeCharacter { m m m m }
  { \DeclareUTFEncodedSymbol #2 [#1] { "#3 } { "0#4 } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareEncodedCompositeAccents}
% \changes{v3.2.9}{2013/12/07}{ä¿®æ­£ \pkg{xunicode} ä¸­çš„é”™è¯¯å®šä¹‰ã€‚}
%    \begin{macrocode}
\RenewDocumentCommand \DeclareEncodedCompositeAccents { m m m m }
  { \DeclareUTFEncodedAccents #2 [#1] { "#4 } { "#3 } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFDoubleEncodedAccent}
% \changes{v3.2.10}{2014/02/20}{æ”¹è¿› \tn{t} ç­‰çš„å®šä¹‰æ–¹å¼ã€‚}
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFDoubleEncodedAccent { m O { \UTFencname } m m }
  { \@@_declare_encoded:NNnnn \@@_combine_double_accent:nnNNn #1 {#2} {#3} {#4} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFDoubleEncodedSymbol}
% \changes{v3.2.10}{2014/02/21}{æ”¹è¿› \tn{sliding} ç­‰çš„å®šä¹‰æ–¹å¼ã€‚}
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFDoubleEncodedSymbol { m O { \UTFencname } m m }
  { \@@_declare_encoded:NNnnn \@@_combine_double_symbol:nnNNn #1 {#2} {#3} {#4} }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_declare_composite:Nnn}
% é€šè¿‡ \texttt{lowercase} æŠ€å·§ï¼Œç›´æŽ¥ç”±é‡éŸ³ç¬¦å·çš„ Unicode å¾—åˆ°å®žé™…å­—ç¬¦ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_declare_composite:Nnn #1#2#3
  { \DeclareTextCommand #1 {#3} { \@@_text_composite:nnn {#2} {#3} } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_text_composite:nnn}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_text_composite:nnn #1#2#3
  {
    \@@_begin_hook:nn {#1} {#3}
    \cs_if_exist:cTF { \@@_composite_cs:nnn {#1} {#2} {#3} }
      {
        \@@_text_composite:cnn
          { \@@_composite_cs:nnn {#1} {#2} {#3} } {#1} {#3}
      }
      { \cs_if_exist_use:cTF { ? #1 } { {#3} } {#3} }
    \@@_end_hook:nn {#1} {#3}
  }
\cs_new_protected:Npn \@@_text_composite:Nnn #1#2#3
  {
    \token_if_chardef:NTF #1
      {
        \@@_glyph_if_exist:nTF {#1}
          {#1} { \cs_if_exist_use:cTF { ? #2 } { {#3} } {#3} }
      }
      {#1}
  }
\cs_generate_variant:Nn \@@_text_composite:Nnn { c }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_declare_encoded:NNnnn}
% é€šè¿‡ \cs{tex_Uchar:D} ç›´æŽ¥ç”±é‡éŸ³ç¬¦å·çš„ Unicode å¾—åˆ°å®žé™…å­—ç¬¦ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_declare_encoded:NNnnn #1#2#3#4#5
  {
    \exp_after:wN \@@_declare_encoded:NNNNee
      \tex_Uchar:D \@@_check_slot:n {#4} \exp_after:wN \exp_stop_f:
      \tex_Uchar:D \@@_check_slot:n {#5} \exp_stop_f:
      #1 #2 { \token_to_str:N #2 } {#3}
  }
\cs_new_protected:Npn \@@_declare_encoded:NNNNnn #1#2#3#4#5#6
  { \DeclareTextCommand #4 {#6} { #3 {#5} {#6} {#1} {#2} } }
\cs_generate_variant:Nn \@@_declare_encoded:NNnnn { c }
\cs_generate_variant:Nn \@@_declare_encoded:NNNNnn { NNNNee }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_text_combine:NnnNNn}
% è‹¥é‡éŸ³å‘½ä»¤ |#2| ä¸Žå®ƒçš„å‚æ•° |#6| çš„å¤åˆå·²ç»ç”± \tn{DeclareUTFcomposite} è®¾ç½®ï¼Œ
% å¹¶ä¸”åœ¨å½“å‰å­—ä½“ä¸­å­˜åœ¨è¯¥å­—ç¬¦ï¼Œåˆ™ç›´æŽ¥ä½¿ç”¨ã€‚å¦åˆ™ä½¿ç”¨ç»„åˆå‘½ä»¤ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_text_combine:NnnNNn #1#2#3#4#5#6
  {
    \@@_begin_hook:nn {#2} {#6}
    \cs_if_exist:cTF { \@@_composite_cs:nnn {#2} {#3} {#6} }
      {
        \@@_text_combine:cNnNNn
          { \@@_composite_cs:nnn {#2} {#3} {#6} } #1 {#2} {#4} {#5} {#6}
      }
      { #1 {#6} {#2} {#4} {#5} }
    \@@_end_hook:nn {#2} {#6}
  }
\cs_new_protected:Npn \@@_text_combine:NNnNNn #1#2#3#4#5#6
  {
    \token_if_chardef:NTF #1
      { \@@_glyph_if_exist:nTF {#1} {#1} { #2 {#6} {#3} {#4} {#5} } }
      {#1}
  }
\cs_generate_variant:Nn \@@_text_combine:NNnNNn { c }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_combine_symbol:nnNNn}
%     \begin{macrocode}
\cs_new_protected:Npn \@@_combine_symbol:nnNNn
  { \@@_text_combine:NnnNNn \@@_add_symbol:nnNN }
\cs_new_protected:Npn \@@_add_symbol:nnNN #1#2#3#4
  {
    \tl_if_blank:nTF {#1}
      {
        \@@_glyph_if_exist:nTF { `#4 }
          {#4}
          { \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
      }
      {
        \@@_glyph_if_exist:nTF { `#3 }
          { #1#3 }
          { \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_combine_accent:nnNNn,\@@_add_accent:nnNN}
% è‹¥ç»„åˆé‡éŸ³ç¬¦å·çš„ |#3| å’ŒåŸºæœ¬é‡éŸ³ç¬¦å· |#4| åœ¨å½“å‰å­—ä½“ä¸­éƒ½ä¸å­˜åœ¨ï¼Œåˆ™è½¬æ¢åˆ°
% \cs{Declare\-Text\-Accent\-Default} è®¾ç½®çš„ç¼–ç&nbsp;æˆ–è€…ä½¿ç”¨
% \tn{DeclareTextCommandDefault} ä¸­è®¾ç½®çš„å‘½ä»¤ã€‚\texttt{0.9999} ç‰ˆä»¥å‰çš„ \XeTeX
% éœ€è¦è®¾ç½® \tn{XeTeXinputnormalization} ä¸º $1$ï¼Œæ‰èƒ½ä½¿ç”¨å­—ä½“ä¸­ç”±åŸºç¡€å­—ç¬¦å’Œç»„åˆç¬¦å·
% å¯¹åº”çš„å®žé™…å­—ç¬¦ï¼›è€Œ \texttt{0.9999} ç‰ˆä»¥åŽçš„ \XeTeX é»˜è®¤å°±å¯ç”¨è¿™ä¸ªåŠŸèƒ½ï¼Œ^^A
% \tn{XeTeXinputnormalization} ä¼¼ä¹Žæ˜¯æ—&nbsp;æ•ˆçš„ï¼Œæ€€ç–‘æ˜¯ä½¿ç”¨ HarfBuzz åº“æ›¿ä»£ ICU è¿›è¡Œ
% å­—ä½“æŽ’ç‰ˆçš„ç¼˜æ•…\footnote{\url{http://tug.org/pipermail/xetex/2013-July/024579.html}}ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_combine_accent:nnNNn
  { \@@_text_combine:NnnNNn \@@_add_accent:nnNN }
\cs_new_protected:Npn \@@_add_accent:nnNN #1#2#3#4
  {
    \tl_if_blank:nTF {#1}
      {
        \@@_glyph_if_exist:nTF { `#4 }
          {#4}
          { \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
      }
      {
        \@@_glyph_if_exist:nTF { `#3 }
          { #1#3 }
          {
            \@@_glyph_if_exist:nTF { `#4 }
              { \add@accent { `#4 } {#1} }
              { \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3 } }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_combine_accents:nnNNn,\@@_add_accents:nnNN}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_combine_accents:nnNNn
  { \@@_text_combine:NnnNNn \@@_add_accents:nnNN }
\cs_new_protected:Npn \@@_add_accents:nnNN #1#2#3#4
  {
    \tl_if_blank:nTF {#1}
      { \cs_if_exist_use:cTF { ? #2 } { {#1} } {#1} }
      {
        \@@_glyph_if_exist:nTF { `#3 }
          { \@@_glyph_if_exist:nTF { `#4 } }
          { \use_ii:nn }
          { #1#3#4 }
          { \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3#4 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_combine_circle:nnNNn,\@@_add_circle:nnNN,\@@_add_circle:nN}
% å¯¹åœ†åœˆä¸­çš„æ•°å­—æˆ–è€…å­—æ¯é€‚å½“ç¼©å°ï¼Œä»¥é€‚åˆåœ†åœˆçš„å¤§å°ã€‚åªæœ‰å­—ä½“ä¸­å­˜åœ¨
% \texttt{U+25EF} æ—¶ï¼Œæ‰ä½¿ç”¨è¿™é‡Œçš„è®¾ç½®ï¼Œå¦åˆ™è¿˜è¿˜æ˜¯ \LaTeX\ ä¸­çš„è®¾ç½®ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_combine_circle:nnNNn
  { \@@_text_combine:NnnNNn \@@_add_circle:nnNN }
\cs_new_protected:Npn \@@_add_circle:nnNN #1#2#3#4
  {
    \tl_if_blank:nTF {#1}
      {
        \@@_glyph_if_exist:nTF { `#4 }
          {#4}
          { \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
      }
      {
        \@@_glyph_if_exist:nTF { `#4 }
          { \@@_add_circle:nN {#1} #4 }
          { \cs_if_exist_use:cTF { ? #2 } { {#1} } {#1} }
      }
  }
\cs_new_protected:Npn \@@_add_circle:nN #1#2
  {
    \hcoffin_set:Nn \l_@@_tmp_coffin {#1}
    \hcoffin_set:Nn \l_@@_circle_coffin {#2}
    \fp_set:Nn \l_@@_circle_scale_fp
      {
        \dim_to_decimal_in_unit:nn
          {
            \fp_use:N \l_@@_circle_ratio_fp
            \coffin_wd:N \l_@@_circle_coffin
          }
          { \coffin_wd:N \l_@@_tmp_coffin }
      }
    \coffin_scale:Nnn \l_@@_tmp_coffin
      { \l_@@_circle_scale_fp } { \l_@@_circle_scale_fp }
    \coffin_attach:NnnNnnnn
      \l_@@_circle_coffin { hc } { vc }
      \l_@@_tmp_coffin    { hc } { vc } { \c_zero_dim } { \c_zero_dim }
    \coffin_typeset:Nnnnn \l_@@_circle_coffin
      { H } { l } { \c_zero_dim } { \c_zero_dim }
  }
\fp_new:N \l_@@_circle_scale_fp
\coffin_new:N \l_@@_tmp_coffin
\coffin_new:N \l_@@_circle_coffin
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\settextcircledratio}
% è®¾ç½®åœ†åœˆä¸­æ–‡å­—çš„å®½åº¦ä¸Žåœ†åœˆå®½åº¦çš„æ¯”ä¾‹ï¼Œé¢„è®¾ä¸º \texttt{0.7}ã€‚
%    \begin{macrocode}
\NewDocumentCommand \settextcircledratio { m }
  { \fp_set:Nn \l_@@_circle_ratio_fp {#1} }
\fp_new:N \l_@@_circle_ratio_fp
\settextcircledratio { 0.7 }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_combine_double_accent:nnNNn}
% ä½¿ \tn{t} ç­‰ç»„åˆé‡éŸ³ç¬¦å·æ”¾åœ¨å‚æ•°çš„ç¬¬ä¸€ä¸ªå­—æ¯çš„å³è¾¹ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_combine_double_accent:nnNNn
  { \@@_text_combine:NnnNNn \@@_add_double_accent:nnNN }
\cs_new_protected:Npn \@@_add_double_accent:nnNN #1#2#3#4
  {
    \tl_if_blank:nTF {#1}
      {
        \@@_glyph_if_exist:nTF { `#4 }
          {#4}
          { \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
      }
      {
        \@@_glyph_if_exist:nTF { `#3 }
          { \@@_add_double_symbol:nN {#1} #3 }
          {
            \@@_glyph_if_exist:nTF { `#4 }
              { \add@accent { `#4 } {#1} }
              { \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3 } }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_combine_double_symbol:nnNNn}
% ä½¿ \tn{sliding} ç­‰ç»„åˆé‡éŸ³ç¬¦å·æ”¾åœ¨å‚æ•°çš„ç¬¬ä¸€ä¸ªå­—æ¯çš„å³è¾¹ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_combine_double_symbol:nnNNn
  { \@@_text_combine:NnnNNn \@@_add_double_symbol:nnNN }
\cs_new_protected:Npn \@@_add_double_symbol:nnNN #1#2#3#4
  {
    \tl_if_blank:nTF {#1}
      {
        \@@_glyph_if_exist:nTF { `#4 }
          {#4}
          { \cs_if_exist_use:cTF { ? #2 } { {#1} } {#4} }
      }
      {
        \@@_glyph_if_exist:nTF { `#3 }
          { \@@_add_double_symbol:nN {#1} #3 }
          { \cs_if_exist_use:cTF { ? #2 } { {#1} } { #1#3 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_add_double_symbol:nN}
% å¦‚æžœå‚æ•°çš„ç¬¬ä¸€ä¸ªè®°å·æ˜¯å­—æ¯ç±»ã€å…¶ä»–ç¬¦å·ç±»æˆ–è€…ç”± \tn{chardef} å®šä¹‰ï¼Œåˆ™å°†ç»„åˆç¬¦å·
% æ”¾åœ¨å®ƒçš„å³è¾¹ï¼Œå¦åˆ™ä¸ä½œå¤„ç†ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \@@_add_double_symbol:nN #1#2
  {
    \tl_if_head_is_N_type:nTF {#1}
      {
        \exp_after:wN \exp_after:wN \exp_after:wN
        \@@_add_double_symbol_aux:NnN \exp_after:wN \exp_after:wN
          \tl_head:w #1 \q_stop \exp_after:wN { \use_none:n #1 } #2
      }
      { #1#2 }
  }
\cs_new_protected:Npn \@@_add_double_symbol_aux:NnN #1#2#3
  {
    \bool_lazy_any:nTF
      {
        { \token_if_letter_p:N #1 }
        { \token_if_other_p:N #1 }
        { \token_if_chardef_p:N #1 }
      }
      { #1#3#2 }
      { #1#2#3 }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\AtBeginUTFCommand,\AtEndUTFCommand}
% è®¾ç½®åœ¨ç¬¦å·å‘½ä»¤å‰åŽä½¿ç”¨çš„é’©å­ï¼Œå¯é€‰å‚æ•°ç”¨äºŽæŒ‡å®šå•ä¸ªç¬¦å·å‘½åã€‚å¯ä»¥ç”¨ |#1|
% å¼•ç”¨å¸¦å‚æ•°çš„ç»„åˆç¬¦å·å‘½ä»¤çš„å‚æ•°æˆ–è€…ç¬¦å·å‘½ä»¤å¯¹åº”çš„ç¬¦å·ã€‚
% \changes{v3.2.6}{2013/08/15}{å¯ä»¥æŒ‡å®šç‰¹å®šç¬¦å·å‘½ä»¤ä½¿ç”¨çš„é’©å­ã€‚}
% \changes{v3.7.1}{2018/04/30}{ä¿®å¤ä»£ç&nbsp;é‡æž„è€Œå¼•å…¥çš„æ–°é”™è¯¯ã€‚}
%    \begin{macrocode}
\NewDocumentCommand \AtBeginUTFCommand { s O { } +m }
  {
    \tl_if_blank:nTF {#2}
      {
        \IfBooleanTF {#1}
          { \xunadd_set_begin_hook:n }
          { \xunadd_append_begin_hook:n }
      }
      { \xunadd_set_begin_hook:nn {#2} }
      {#3}
  }
\NewDocumentCommand \AtEndUTFCommand { s O { } +m }
  {
    \tl_if_blank:nTF {#2}
      {
        \IfBooleanTF {#1}
          { \xunadd_set_end_hook:n }
          { \xunadd_append_end_hook:n }
      }
      { \xunadd_set_end_hook:nn {#2} }
      {#3}
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xunadd_set_begin_hook:n,\xunadd_set_end_hook:n}
%    \begin{macrocode}
\cs_new_protected:Npn \xunadd_set_begin_hook:n
  { \tl_set:Nn \l_@@_begin_hook_tl }
\cs_new_protected:Npn \xunadd_append_begin_hook:n
  { \tl_put_right:Nn \l_@@_begin_hook_tl }
\cs_new_protected:Npn \xunadd_set_end_hook:n
  { \tl_set:Nn \l_@@_end_hook_tl }
\cs_new_protected:Npn \xunadd_append_end_hook:n
  { \tl_put_right:Nn \l_@@_end_hook_tl }
\cs_new_protected:Npn \xunadd_set_begin_hook:nn
  { \@@_set_cmd_hook:nnn { begin } }
\cs_new_protected:Npn \xunadd_set_end_hook:nn
  { \@@_set_cmd_hook:nnn { end } }
\cs_new_protected:Npn \@@_set_cmd_hook:nnn #1#2#3
  {
    \cs_set_protected:cpn
      {
        \tl_if_single:nTF {#2}
          { \use:c { @@_#1_csname:n } { \token_to_str:N #2 } }
          { \@@_set_cmd_hook_aux:Nnwn #2 \q_stop {#1} }
      } ##1
      {#3}
  }
\cs_new:Npn \@@_set_cmd_hook_aux:Nnwn #1#2 \q_stop #3
  { \use:c { @@_#3_csname:n } { \token_to_str:N #1 - \tl_to_str:n {#2} } }
\cs_new:Npn \@@_begin_csname:n #1 { @@_begin_#1_hook:n }
\cs_new:Npn \@@_end_csname:n #1   { @@_end_#1_hook:n }
\tl_new:N \l_@@_begin_hook_tl
\tl_new:N \l_@@_end_hook_tl
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_begin_hook:nn,\@@_end_hook:nn}
%    \begin{macrocode}
\cs_new_protected:Npn \@@_begin_hook:nn #1#2
  {
    \tl_use:N \l_@@_begin_hook_tl
    \cs_if_exist_use:cF { \@@_begin_csname:n { #1 - \tl_to_str:n {#2} } }
      { \cs_if_exist_use:cF { \@@_begin_csname:n {#1} } { \use_none:n } }
      {#2}
  }
\cs_new_protected:Npn \@@_end_hook:nn #1#2
  {
    \cs_if_exist_use:cF { \@@_end_csname:n { #1 - \tl_to_str:n {#2} } }
      { \cs_if_exist_use:cF { \@@_end_csname:n {#1} } { \use_none:n } }
      {#2}
    \tl_use:N \l_@@_end_hook_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\DeclareUTFTIPACommand}
% \changes{v3.2.10}{2014/02/20}{æ£€æŸ¥ \tn{t} å’Œ \tn{sliding} çš„å‚æ•°æ˜¯å¦ä»¥ \tn{textipa} å¼€å¤´ã€‚}
%    \begin{macrocode}
\NewDocumentCommand \DeclareUTFTIPACommand { O { \UTFencname } m }
  { \use:e { \@@_text_tipa_command:Nnn \exp_not:N #2 { \token_to_str:N #2 } {#1} } }
\cs_new_protected:Npn \@@_text_tipa_command:Nnn #1#2#3
  {
    \cs_set_eq:cc { UTF/#3#2 } { #3#2 }
    \DeclareTextCommand #1 {#3} { \@@_text_tipa_command:nnn {#3} {#2} }
  }
\cs_new_protected:Npn \@@_text_tipa_command:nnn #1#2#3
  {
    \exp_args:Ncc \@@_check_for_tipa:NNn
      { \use_none:n #2 } { UTF/#1#2 } {#3}
  }
\cs_new_protected:Npn \@@_check_for_tipa:NNn #1#2#3
  {
    \tl_if_head_eq_meaning:nNTF {#3} \textipa
      {
        \exp_after:wN \tipacatchonechar \exp_after:wN
          { \exp_after:wN #1 \use_none:n #3 }
      }
      { #2 {#3} }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\xunadd_get_slot:nn}
% |#1| æ˜¯ç¼–ç&nbsp;ï¼Œ|#2| æ˜¯è¯¸å¦‚ \tn{textendash} æˆ– |\v C| ç­‰å½¢å¼çš„æ–‡æœ¬å‘½ä»¤ï¼Œå–å¾—ä»–ä»¬å¯¹åº”çš„å­—ç¬¦ç¼–ç&nbsp;ã€‚
%    \begin{macrocode}
\cs_new_protected:Npn \xunadd_get_slot:nn #1#2
  { \@@_get_slot:wn #2 \q_nil \q_stop {#1} }
\cs_new_protected:Npn \@@_get_slot:wn #1#2#3 \q_stop #4
  {
    \int_set:Nn \l_xunadd_slot_int { -1 }
    \bool_set_false:N \l_xunadd_rest_bool
    \group_begin: \exp_args:Nccc \group_end:
    { @@_get_slot:NNnn }
      { #4 \token_to_str:N #1 }
      { \@@_composite_cs:Nnn #1 {#4} {#2} }
      {#2}
      {#3}
  }
\int_new:N \l_xunadd_slot_int
\bool_new:N \l_xunadd_rest_bool
\cs_new_protected:Npn \@@_get_slot:NNnn #1#2#3#4
  {
    \cs_if_free:NF #1
      {
        \cs_if_exist:NTF #2
          { \@@_get_composite_slot:Nn #2 {#4} }
          { \@@_get_character_slot:Nn #1 { #3 #4 } }
      }
  }
\cs_new_protected:Npn \@@_get_composite_slot:Nn #1#2
  {
    \token_if_chardef:NT #1
      {
        \int_set:Nn \l_xunadd_slot_int {#1}
        \quark_if_nil:nF {#2}
          { \bool_set_true:N \l_xunadd_rest_bool }
      }
  }
\cs_new_protected:Npn \@@_get_character_slot:Nn #1
  {
    \exp_after:wN \@@_get_character_slot_aux:wn #1
      \@@_text_character:nN \q_nil \q_nil \q_stop
  }
\cs_new_protected:Npn \@@_get_character_slot_aux:wn
  #1 \@@_text_character:nN #2#3#4 \q_stop #5
  {
    \quark_if_nil:nF {#2}
      {
        \int_set:Nn \l_xunadd_slot_int { `#3 }
        \quark_if_nil:nF {#5}
          { \bool_set_true:N \l_xunadd_rest_bool }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.7.2}{2018/05/12}{è§£å†³ä¸Ž \pkg{microtype} å®åŒ…çš„å…¼å®¹é—®é¢˜ã€‚}
%
% \begin{macro}[int]{\xunadd@microtype@is@charx}
% \pkg{microtype} å®åŒ…ä¸­ä½¿ç”¨çš„å‡½æ•°ï¼Œæˆ‘ä»¬é€šè¿‡å¯¹ \tn{MT@is@charx} æ‰“è¡¥ä¸æ¥å®žçŽ°åŠŸèƒ½ã€‚
%    \begin{macrocode}
\cs_new_protected_nopar:Npn \xunadd@microtype@is@charx #1 \relax
  {
    \use:e
      { \xunadd_get_slot:nn { \MT@encoding } { \tex_the:D \MT@toks } }
    \int_compare:nNnTF \l_xunadd_slot_int &lt; \c_zero_int
      { \xunadd@original@is@charx #1 \relax }
      {
        \cs_set_nopar:Npx \MT@char@ { \int_use:N \l_xunadd_slot_int }
        \bool_if:NT \l_xunadd_rest_bool { \MT@norestfalse }
      }
  }
\cs_new_protected_nopar:Npn \xunadd@microtype@hook
  {
    \cs_if_free:NF \MT@is@charx
      {
        \cs_new_eq:NN \xunadd@original@is@charx \MT@is@charx
        \cs_set_eq:NN \MT@is@charx \xunadd@microtype@is@charx
        \cs_set_eq:NN \MT@warn@unknown@once \use_none:n
      }
  }
\@ifpackageloaded { microtype }
  { \use:n } { \AtBeginDocument }
  { \xunadd@microtype@hook }
%    \end{macrocode}
% \end{macro}
%
% \changes{v3.2.8}{2013/12/05}{å¯ç”¨ \pkg{xunicode} ä¸­çš„å¸¦åœˆæ•°å­—å’Œå­—æ¯è®¾ç½®ã€‚}
%
%    \begin{macrocode}
%&lt;/xunicode&gt;
%&lt;*xunextra&gt;
%    \end{macrocode}
%
% \changes{v3.7.0}{2018/03/16}{è¡¥å……å®šä¹‰ \tn{texthyphenationpoint} å’Œ \tn{texttwoemdash}ã€‚}
%
% æˆ‘ä»¬è¡¥å……å®šä¹‰ HYPHENATION POINT å’Œ TWO-EM DASHï¼Œä»–ä»¬é»˜è®¤è¢«å½’å…¥ CJK æ&nbsp;‡ç‚¹ç¬¦å·ã€‚
%    \begin{macrocode}
\DeclareUTFSymbol\texthyphenationpoint{"2027}
\DeclareUTFSymbol\texttwoemdash{"2E3A}
%    \end{macrocode}
%
% ä»¥ä¸‹å†…å®¹é€‰è‡ª \pkg{xunicode}ï¼Œå¹¶åšäº†é€‚å½“ä¿®æ”¹ã€‚
%    \begin{macrocode}
\DeclareUTFComposite\textsuperscript
\DeclareUTFComposite\textsubscript
\DeclareUTFEncodedAccent\textsbleftarrow{"20EE}{"20FF}
\DeclareUTFEncodedAccent\`{"0300}{"02CB}
\DeclareUTFEncodedAccent\capitalgrave{"0300}{"02CB}
\DeclareUTFEncodedAccent\'{"0301}{"02CA}
\DeclareUTFEncodedAccent\capitalacute{"0301}{"02CA}
\DeclareUTFEncodedAccent\^{"0302}{"02C6}
\DeclareUTFEncodedAccent\capitalcircumflex{"0302}{"02C6}
\DeclareUTFEncodedAccent\~{"0303}{"02DC}
\DeclareUTFEncodedAccent\capitaltilde{"0303}{"02DC}
\DeclareUTFEncodedAccent\={"0304}{"02C9}
\DeclareUTFEncodedAccent\capitalmacron{"0304}{"02C9}
\DeclareUTFEncodedAccent\textoverline{"0305}{"203E}
\DeclareUTFEncodedAccent\u{"0306}{"02D8}
\DeclareUTFEncodedAccent\capitalbreve{"0306}{"02D8}
\DeclareUTFEncodedAccent\.{"0307}{"02D9}
\DeclareUTFEncodedAccent\capitaldotaccent{"0307}{"02D9}
\DeclareUTFEncodedAccent\"{"0308}{"00A8}
\DeclareUTFEncodedAccent\capitaldieresis{"0308}{"00A8}
\DeclareUTFEncodedAccent\m{"0309}{"0309}
\DeclareUTFEncodedAccent\texthookabove{"0309}{"0309}
\DeclareUTFEncodedAccent\r{"030A}{"02DA}
\DeclareUTFEncodedAccent\capitalring{"030A}{"02DA}
\DeclareUTFEncodedAccent\H{"030B}{"02DD}
\DeclareUTFEncodedAccent\capitalhungarumlaut{"030B}{"02DD}
\DeclareUTFEncodedAccent\v{"030C}{"02C7}
\DeclareUTFEncodedAccent\capitalcaron{"030C}{"02C7}
\DeclareUTFEncodedAccent\textvbaraccent{"030D}{"02C8}
\DeclareUTFEncodedAccent\textdoublevbaraccent{"030E}{"0022}
\DeclareUTFEncodedAccent\U{"030E}{"0022}
\DeclareUTFEncodedAccent\textdoublegrave{"030F}{"02F5}
\DeclareUTFEncodedAccent\G{"030F}{"02F5}
\DeclareUTFEncodedAccent\textdotbreve{"0310}{"0310}
\DeclareUTFEncodedAccent\textroundcap{"0311}{"0311}
\DeclareUTFEncodedAccent\newtie{"0311}{"0311}
\DeclareUTFEncodedAccent\capitalnewtie{"0311}{"0311}
\DeclareUTFEncodedAccent\textturncommaabove{"0312}{"02BB}
\DeclareUTFEncodedAccent\textcommaabove{"0313}{"02BC}
\DeclareUTFEncodedAccent\textrevcommaabove{"0314}{"02BD}
\DeclareUTFEncodedAccent\overbridge{"0346}{"0346}
\DeclareUTFEncodedAccent\crtilde{"034A}{"034A}
\DeclareUTFEncodedAccent\dottedtilde{"034B}{"034B}
\DeclareUTFEncodedAccent\doubletilde{"034C}{"034C}
\DeclareUTFEncodedAccent\textrightarrowhead{"0350}{"02C3}
\DeclareUTFEncodedAccent\textlefthalfring{"0351}{"02D3}
\DeclareUTFEncodedAccent\textrighthalfring{"0357}{"02D2}
\DeclareUTFDoubleEncodedSymbol\textdoublebrevebelow{"035C}{"035C}
\DeclareUTFDoubleEncodedAccent\textdoublebreve{"035D}{"035D}
\DeclareUTFDoubleEncodedAccent\textdoublemacron{"035E}{"035E}
\DeclareUTFDoubleEncodedSymbol\textdoublemacronbelow{"035F}{"035F}
\DeclareUTFDoubleEncodedAccent\textdoubletilde{"0360}{"0360}
\DeclareUTFDoubleEncodedAccent\t{"0361}{"0361}
\DeclareUTFDoubleEncodedAccent\capitaltie{"0361}{"0361}
\DeclareUTFDoubleEncodedAccent\texttoptiebar{"0361}{"0361}
\DeclareUTFDoubleEncodedSymbol\sliding{"0362}{"0362}
\DeclareUTFTIPACommand\t
\DeclareUTFTIPACommand\capitaltie
\DeclareUTFTIPACommand\texttoptiebar
\DeclareUTFTIPACommand\sliding
\DeclareUTFEncodedAccent\texthighrise{"1DC4}{"1DC4}
\DeclareUTFEncodedAccent\textlowrise{"1DC5}{"1DC5}
\DeclareUTFEncodedAccent\textrisefall{"1DC8}{"1DC8}
\DeclareUTFEncodedAccent\textfallrise{"1DC9}{"1DC9}
\DeclareUTFEncodedAccent\textaolig{"1DD5}{"1DD5}
\DeclareUTFCompositeSymbol\textundertie{H}{"1E2A}
\DeclareUTFCompositeSymbol\textundertie{h}{"1E2B}
\DeclareUTFEncodedAccents\textcircumgrave{"0302}{"0301}
\DeclareUTFSymbol\textFinv{"2132}
\DeclareUTFSymbol\textaleph{"2135}
\DeclareUTFSymbol\textbeth{"2136}
\DeclareUTFSymbol\textgimel{"2137}
\DeclareUTFSymbol\textdaleth{"2138}
\DeclareUTFSymbol\textGame{"2141}
\DeclareUTFCompositeCommand\tonebar{25}{\tonebar{2}\tonebar{5}}
\DeclareUTFCompositeCommand\tonebar{52}{\tonebar{5}\tonebar{2}}
\DeclareUTFSymbol\textbigcircle{"25EF}
\DeclareUTFEncodedCircle\textcircled{"20DD}{"25EF}
\DeclareUTFCompositeSymbol\textcircled{0}{"24EA}
\DeclareUTFCompositeSymbol\textcircled{1}{"2460}
\DeclareUTFCompositeSymbol\textcircled{2}{"2461}
\DeclareUTFCompositeSymbol\textcircled{3}{"2462}
\DeclareUTFCompositeSymbol\textcircled{4}{"2463}
\DeclareUTFCompositeSymbol\textcircled{5}{"2464}
\DeclareUTFCompositeSymbol\textcircled{6}{"2465}
\DeclareUTFCompositeSymbol\textcircled{7}{"2466}
\DeclareUTFCompositeSymbol\textcircled{8}{"2467}
\DeclareUTFCompositeSymbol\textcircled{9}{"2468}
\DeclareUTFCompositeSymbol\textcircled{10}{"2469}
\DeclareUTFCompositeSymbol\textcircled{11}{"246A}
\DeclareUTFCompositeSymbol\textcircled{12}{"246B}
\DeclareUTFCompositeSymbol\textcircled{13}{"246C}
\DeclareUTFCompositeSymbol\textcircled{14}{"246D}
\DeclareUTFCompositeSymbol\textcircled{15}{"246E}
\DeclareUTFCompositeSymbol\textcircled{16}{"246F}
\DeclareUTFCompositeSymbol\textcircled{17}{"2470}
\DeclareUTFCompositeSymbol\textcircled{18}{"2471}
\DeclareUTFCompositeSymbol\textcircled{19}{"2472}
\DeclareUTFCompositeSymbol\textcircled{20}{"2473}
\DeclareUTFCompositeSymbol\textcircled{21}{"3251}
\DeclareUTFCompositeSymbol\textcircled{22}{"3252}
\DeclareUTFCompositeSymbol\textcircled{23}{"3253}
\DeclareUTFCompositeSymbol\textcircled{24}{"3254}
\DeclareUTFCompositeSymbol\textcircled{25}{"3255}
\DeclareUTFCompositeSymbol\textcircled{26}{"3256}
\DeclareUTFCompositeSymbol\textcircled{27}{"3257}
\DeclareUTFCompositeSymbol\textcircled{28}{"3258}
\DeclareUTFCompositeSymbol\textcircled{29}{"3259}
\DeclareUTFCompositeSymbol\textcircled{30}{"325A}
\DeclareUTFCompositeSymbol\textcircled{31}{"325B}
\DeclareUTFCompositeSymbol\textcircled{32}{"325C}
\DeclareUTFCompositeSymbol\textcircled{33}{"325D}
\DeclareUTFCompositeSymbol\textcircled{34}{"325E}
\DeclareUTFCompositeSymbol\textcircled{35}{"325F}
\DeclareUTFCompositeSymbol\textcircled{36}{"32B1}
\DeclareUTFCompositeSymbol\textcircled{37}{"32B2}
\DeclareUTFCompositeSymbol\textcircled{38}{"32B3}
\DeclareUTFCompositeSymbol\textcircled{39}{"32B4}
\DeclareUTFCompositeSymbol\textcircled{40}{"32B5}
\DeclareUTFCompositeSymbol\textcircled{41}{"32B6}
\DeclareUTFCompositeSymbol\textcircled{42}{"32B7}
\DeclareUTFCompositeSymbol\textcircled{43}{"32B8}
\DeclareUTFCompositeSymbol\textcircled{44}{"32B9}
\DeclareUTFCompositeSymbol\textcircled{45}{"32BA}
\DeclareUTFCompositeSymbol\textcircled{46}{"32BB}
\DeclareUTFCompositeSymbol\textcircled{47}{"32BC}
\DeclareUTFCompositeSymbol\textcircled{48}{"32BD}
\DeclareUTFCompositeSymbol\textcircled{49}{"32BE}
\DeclareUTFCompositeSymbol\textcircled{50}{"32BF}
\DeclareUTFCompositeSymbol\textcircled{A}{"24B6}
\DeclareUTFCompositeSymbol\textcircled{B}{"24B7}
\DeclareUTFCompositeSymbol\textcircled{C}{"24B8}
\DeclareUTFCompositeSymbol\textcircled{D}{"24B9}
\DeclareUTFCompositeSymbol\textcircled{E}{"24BA}
\DeclareUTFCompositeSymbol\textcircled{F}{"24BB}
\DeclareUTFCompositeSymbol\textcircled{G}{"24BC}
\DeclareUTFCompositeSymbol\textcircled{H}{"24BD}
\DeclareUTFCompositeSymbol\textcircled{I}{"24BE}
\DeclareUTFCompositeSymbol\textcircled{J}{"24BF}
\DeclareUTFCompositeSymbol\textcircled{K}{"24C0}
\DeclareUTFCompositeSymbol\textcircled{L}{"24C1}
\DeclareUTFCompositeSymbol\textcircled{M}{"24C2}
\DeclareUTFCompositeSymbol\textcircled{N}{"24C3}
\DeclareUTFCompositeSymbol\textcircled{O}{"24C4}
\DeclareUTFCompositeSymbol\textcircled{P}{"24C5}
\DeclareUTFCompositeSymbol\textcircled{Q}{"24C6}
\DeclareUTFCompositeSymbol\textcircled{R}{"24C7}
\DeclareUTFCompositeSymbol\textcircled{S}{"24C8}
\DeclareUTFCompositeSymbol\textcircled{T}{"24C9}
\DeclareUTFCompositeSymbol\textcircled{U}{"24CA}
\DeclareUTFCompositeSymbol\textcircled{V}{"24CB}
\DeclareUTFCompositeSymbol\textcircled{W}{"24CC}
\DeclareUTFCompositeSymbol\textcircled{X}{"24CD}
\DeclareUTFCompositeSymbol\textcircled{Y}{"24CE}
\DeclareUTFCompositeSymbol\textcircled{Z}{"24CF}
\DeclareUTFCompositeSymbol\textcircled{a}{"24D0}
\DeclareUTFCompositeSymbol\textcircled{b}{"24D1}
\DeclareUTFCompositeSymbol\textcircled{c}{"24D2}
\DeclareUTFCompositeSymbol\textcircled{d}{"24D3}
\DeclareUTFCompositeSymbol\textcircled{e}{"24D4}
\DeclareUTFCompositeSymbol\textcircled{f}{"24D5}
\DeclareUTFCompositeSymbol\textcircled{g}{"24D6}
\DeclareUTFCompositeSymbol\textcircled{h}{"24D7}
\DeclareUTFCompositeSymbol\textcircled{i}{"24D8}
\DeclareUTFCompositeSymbol\textcircled{j}{"24D9}
\DeclareUTFCompositeSymbol\textcircled{k}{"24DA}
\DeclareUTFCompositeSymbol\textcircled{l}{"24DB}
\DeclareUTFCompositeSymbol\textcircled{m}{"24DC}
\DeclareUTFCompositeSymbol\textcircled{n}{"24DD}
\DeclareUTFCompositeSymbol\textcircled{o}{"24DE}
\DeclareUTFCompositeSymbol\textcircled{p}{"24DF}
\DeclareUTFCompositeSymbol\textcircled{q}{"24E0}
\DeclareUTFCompositeSymbol\textcircled{r}{"24E1}
\DeclareUTFCompositeSymbol\textcircled{s}{"24E2}
\DeclareUTFCompositeSymbol\textcircled{t}{"24E3}
\DeclareUTFCompositeSymbol\textcircled{u}{"24E4}
\DeclareUTFCompositeSymbol\textcircled{v}{"24E5}
\DeclareUTFCompositeSymbol\textcircled{w}{"24E6}
\DeclareUTFCompositeSymbol\textcircled{x}{"24E7}
\DeclareUTFCompositeSymbol\textcircled{y}{"24E8}
\DeclareUTFCompositeSymbol\textcircled{z}{"24E9}
\DeclareUTFCompositeSymbol\textsuperscript{h}{"02B0}
\DeclareUTFCompositeSymbol\textsuperscript{\texthth}{"02B1}
\DeclareUTFCompositeSymbol\textsuperscript{j}{"02B2}
\DeclareUTFCompositeSymbol\textsuperscript{r}{"02B3}
\DeclareUTFCompositeSymbol\textsuperscript{\textturnr}{"02B4}
\DeclareUTFCompositeSymbol\textsuperscript{\textturnrrtail}{"02B5}
\DeclareUTFCompositeSymbol\textsuperscript{\textinvscr}{"02B6}
\DeclareUTFCompositeSymbol\textsuperscript{w}{"02B7}
\DeclareUTFCompositeSymbol\textsuperscript{y}{"02B8}
\DeclareUTFCompositeSymbol\textsuperscript{\textbabygamma}{"02E0}
\DeclareUTFCompositeSymbol\textsuperscript{\textgammalatinsmall}{"02E0}
\DeclareUTFCompositeSymbol\textsuperscript{l}{"02E1}
\DeclareUTFCompositeSymbol\textsuperscript{s}{"02E2}
\DeclareUTFCompositeSymbol\textsuperscript{x}{"02E3}
\DeclareUTFCompositeSymbol\textsuperscript{\textrevglotstop}{"02E4}
\DeclareUTFCompositeSymbol\textsuperscript{\textrevepsilon}{"1D4C}
\DeclareUTFCompositeSymbol\textsuperscript{\cyrn}{"1D78}
\DeclareUTFCompositeSymbol\textsuperscript{\textbarsci}{"1DA7}
\DeclareUTFCompositeSymbol\textsuperscript{V}{"2C7D}
\DeclareUTFCompositeSymbol\textsuperscript{\textHbar}{"A7F8}
\DeclareUTFCompositeSymbol\textsuperscript{\textHslash}{"A7F8}
\DeclareUTFCompositeSymbol\textsuperscript{\oe}{"A7F9}
\DeclareUTFCompositeSymbol\textsubscript{h}{"2095}
\DeclareUTFCompositeSymbol\textsubscript{k}{"2096}
\DeclareUTFCompositeSymbol\textsubscript{l}{"2097}
\DeclareUTFCompositeSymbol\textsubscript{m}{"2098}
\DeclareUTFCompositeSymbol\textsubscript{n}{"2099}
\DeclareUTFCompositeSymbol\textsubscript{p}{"209A}
\DeclareUTFCompositeSymbol\textsubscript{s}{"209B}
\DeclareUTFCompositeSymbol\textsubscript{t}{"209C}
%    \end{macrocode}
%
% \changes{v3.2.9}{2013/12/07}
% {å¢žåŠ&nbsp; \file{xunicode-extra.def} ä¸­ï¼Œç”¨äºŽåŠ&nbsp;å…¥ \file{puenc.def} ä¸­çš„ç¬¦å·å®šä¹‰ã€‚}
%
% ä»¥ä¸‹å®šä¹‰å–è‡ª \pkg{hyperref} çš„ \file{puenc.def}ã€‚
%    \begin{macrocode}
\DeclareUTFEncodedAccent\textinvbreve{"0311}{"0311}
\DeclareUTFEncodedSymbol\textsubbreve{"032E}{"203F}
\DeclareUTFSymbol\textHT{"0009}
\DeclareUTFSymbol\textLF{"000A}
\DeclareUTFSymbol\textCR{"000D}
\DeclareUTFSymbol\textnumbersign{"0023}
\DeclareUTFSymbol\textparenleft{"0028}
\DeclareUTFSymbol\textparenright{"0029}
\DeclareUTFSymbol\textMVPlus{"002B}
\DeclareUTFSymbol\textMVComma{"002C}
\DeclareUTFSymbol\textMVMinus{"002D}
\DeclareUTFSymbol\textMVPeriod{"002E}
\DeclareUTFSymbol\textMVDivision{"002F}
\DeclareUTFSymbol\textMVZero{"0030}
\DeclareUTFSymbol\textMVOne{"0031}
\DeclareUTFSymbol\textMVTwo{"0032}
\DeclareUTFSymbol\textMVThree{"0033}
\DeclareUTFSymbol\textMVFour{"0034}
\DeclareUTFSymbol\textMVFive{"0035}
\DeclareUTFSymbol\textMVSix{"0036}
\DeclareUTFSymbol\textMVSeven{"0037}
\DeclareUTFSymbol\textMVEight{"0038}
\DeclareUTFSymbol\textMVNine{"0039}
\DeclareUTFSymbol\textMVAt{"0040}
\DeclareUTFCompositeCommand\.{\i}{i}
\DeclareUTFCompositeCommand\.{i}{i}
\DeclareUTFSymbol\textlnot{"00AC}
\DeclareUTFSymbol\textplusminus{"00B1}
\DeclareUTFSymbol\textcedilla{"00B8}
\DeclareUTFSymbol\textmultiply{"00D7}
\DeclareUTFSymbol\textThorn{"00DE}
\DeclareUTFSymbol\textdivide{"00F7}
\DeclareUTFSymbol\textHslash{"0126}
\DeclareUTFCompositeSymbol\k{\i}{"012F}
\DeclareUTFCompositeSymbol\.{L}{"013F}
\DeclareUTFCompositeSymbol\.{l}{"0140}
\DeclareUTFSymbol\textnapostrophe{"0149}
\DeclareUTFSymbol\textTslash{"0166}
\DeclareUTFSymbol\texttslash{"0167}
\DeclareUTFSymbol\textlongs{"017F}
\DeclareUTFSymbol\texthausaB{"0181}
\DeclareUTFSymbol\texthausaD{"018A}
\DeclareUTFSymbol\textrevE{"018E}
\DeclareUTFSymbol\texthausaK{"0198}
\DeclareUTFSymbol\textPUnrleg{"019E}
\DeclareUTFSymbol\textinve{"01DD}
\DeclareUTFSymbol\textGslash{"01E4}
\DeclareUTFSymbol\textgslash{"01E5}
\DeclareUTFCompositeSymbol\textinvbreve{E}{"0206}
\DeclareUTFCompositeSymbol\textinvbreve{e}{"0207}
\DeclareUTFCompositeSymbol\textinvbreve{I}{"020A}
\DeclareUTFCompositeSymbol\textinvbreve{i}{"020B}
\DeclareUTFCompositeSymbol\textinvbreve{\i}{"020B}
\DeclareUTFCompositeSymbol\textinvbreve{O}{"020E}
\DeclareUTFCompositeSymbol\textinvbreve{o}{"020F}
\DeclareUTFCompositeSymbol\textinvbreve{U}{"0216}
\DeclareUTFCompositeSymbol\textinvbreve{u}{"0217}
\DeclareUTFSymbol\j{"0237}
\DeclareUTFSymbol\textPUdblig{"0238}
\DeclareUTFSymbol\textPUqplig{"0239}
\DeclareUTFSymbol\textslashc{"023C}
\DeclareUTFSymbol\textniepsilon{"025B}
\DeclareUTFSymbol\textipagamma{"0263}
\DeclareUTFSymbol\textniiota{"0269}
\DeclareUTFSymbol\textniphi{"0278}
\DeclareUTFSymbol\textniupsilon{"028A}
\DeclareUTFSymbol\textring{"02DA}
\DeclareUTFSymbol\texttilde{"02DC}
\DeclareUTFSymbol\texthungarumlaut{"02DD}
\DeclareUTFSymbol\textringlow{"02F3}
\DeclareUTFSymbol\texttildelow{"02F7}
\DeclareUTFCommand\textnewtie{\textinvbreve\ }
\DeclareUTFCommand\textdotbelow{\d\ }
\DeclareUTFSymbol\textmacronbelow{"02CD}
\DeclareUTFCommand\texttie{\t\ }
\DeclareUTFSymbol\textnumeralsigngreek{"0374}
\DeclareUTFSymbol\textnumeralsignlowergreek{"0375}
\DeclareUTFCompositeSymbol\'{\textAlpha}{"0386}
\DeclareUTFCompositeSymbol\'{\textEpsilon}{"0388}
\DeclareUTFCompositeSymbol\'{\textEta}{"0389}
\DeclareUTFCompositeSymbol\'{\textIota}{"038A}
\DeclareUTFCompositeSymbol\'{\textOmicron}{"038C}
\DeclareUTFCompositeSymbol\'{\textUpsilon}{"038E}
\DeclareUTFCompositeSymbol\'{\textOmega}{"038F}
\DeclareUTFCompositeSymbol\'{\textIotadieresis}{"0390}
\DeclareUTFSymbol\textIotadieresis{"03AA}
\DeclareUTFCompositeSymbol\"{\textIota}{"03AA}
\DeclareUTFCompositeSymbol\"{\textUpsilon}{"03AB}
\DeclareUTFCompositeSymbol\'{\textalpha}{"03AC}
\DeclareUTFCompositeSymbol\'{\textepsilon}{"03AD}
\DeclareUTFCompositeSymbol\'{\texteta}{"03AE}
\DeclareUTFCompositeSymbol\'{\textiota}{"03AF}
\DeclareUTFCompositeSymbol\"{\textupsilonacute}{"03B0}
\DeclareUTFSymbol\textmugreek{"03BC}
\DeclareUTFSymbol\textvarsigma{"03C2}
\DeclareUTFCompositeSymbol\"{\textiota}{"03CA}
\DeclareUTFCompositeSymbol\"{\textupsilon}{"03CB}
\DeclareUTFCompositeSymbol\'{\textomicron}{"03CC}
\DeclareUTFSymbol\textupsilonacute{"03CD}
\DeclareUTFCompositeSymbol\'{\textupsilon}{"03CD}
\DeclareUTFCompositeSymbol\'{\textomega}{"03CE}
\DeclareUTFSymbol\textStigmagreek{"03DA}
\DeclareUTFSymbol\textstigmagreek{"03DB}
\DeclareUTFSymbol\textDigammagreek{"03DC}
\DeclareUTFSymbol\textdigammagreek{"03DD}
\DeclareUTFSymbol\textKoppagreek{"03DE}
\DeclareUTFSymbol\textkoppagreek{"03DF}
\DeclareUTFSymbol\textSampigreek{"03E0}
\DeclareUTFSymbol\textsampigreek{"03E1}
\DeclareUTFSymbol\textbackepsilon{"03F6}
\DeclareUTFCompositeSymbol\`{\CYRE}{"0400}
\DeclareUTFSymbol\CYRYO{"0401}
\DeclareUTFCompositeSymbol\"{\CYRE}{"0401}
\DeclareUTFSymbol\CYRDJE{"0402}
\DeclareUTFCompositeSymbol\'{\CYRG}{"0403}
\DeclareUTFSymbol\CYRIE{"0404}
\DeclareUTFSymbol\CYRDZE{"0405}
\DeclareUTFSymbol\CYRII{"0406}
\DeclareUTFSymbol\CYRYI{"0407}
\DeclareUTFCompositeSymbol\"{\CYRII}{"0407}
\DeclareUTFSymbol\CYRJE{"0408}
\DeclareUTFSymbol\CYRLJE{"0409}
\DeclareUTFSymbol\CYRNJE{"040A}
\DeclareUTFSymbol\CYRTSHE{"040B}
\DeclareUTFCompositeSymbol\'{\CYRK}{"040C}
\DeclareUTFCompositeSymbol\`{\CYRI}{"040D}
\DeclareUTFSymbol\CYRUSHRT{"040E}
\DeclareUTFCompositeSymbol\U{\CYRU}{"040E}
\DeclareUTFSymbol\CYRDZHE{"040F}
\DeclareUTFSymbol\CYRA{"0410}
\DeclareUTFSymbol\CYRB{"0411}
\DeclareUTFSymbol\CYRV{"0412}
\DeclareUTFSymbol\CYRG{"0413}
\DeclareUTFSymbol\CYRD{"0414}
\DeclareUTFSymbol\CYRE{"0415}
\DeclareUTFSymbol\CYRZH{"0416}
\DeclareUTFSymbol\CYRZ{"0417}
\DeclareUTFSymbol\CYRI{"0418}
\DeclareUTFSymbol\CYRISHRT{"0419}
\DeclareUTFCompositeSymbol\U{\CYRI}{"0419}
\DeclareUTFSymbol\CYRK{"041A}
\DeclareUTFSymbol\CYRL{"041B}
\DeclareUTFSymbol\CYRM{"041C}
\DeclareUTFSymbol\CYRN{"041D}
\DeclareUTFSymbol\CYRO{"041E}
\DeclareUTFSymbol\CYRP{"041F}
\DeclareUTFSymbol\CYRR{"0420}
\DeclareUTFSymbol\CYRS{"0421}
\DeclareUTFSymbol\CYRT{"0422}
\DeclareUTFSymbol\CYRU{"0423}
\DeclareUTFSymbol\CYRF{"0424}
\DeclareUTFSymbol\CYRH{"0425}
\DeclareUTFSymbol\CYRC{"0426}
\DeclareUTFSymbol\CYRCH{"0427}
\DeclareUTFSymbol\CYRSH{"0428}
\DeclareUTFSymbol\CYRSHCH{"0429}
\DeclareUTFSymbol\CYRHRDSN{"042A}
\DeclareUTFSymbol\CYRERY{"042B}
\DeclareUTFSymbol\CYRSFTSN{"042C}
\DeclareUTFSymbol\CYREREV{"042D}
\DeclareUTFSymbol\CYRYU{"042E}
\DeclareUTFSymbol\CYRYA{"042F}
\DeclareUTFSymbol\cyra{"0430}
\DeclareUTFSymbol\cyrb{"0431}
\DeclareUTFSymbol\cyrv{"0432}
\DeclareUTFSymbol\cyrg{"0433}
\DeclareUTFSymbol\cyrd{"0434}
\DeclareUTFSymbol\cyre{"0435}
\DeclareUTFSymbol\cyrzh{"0436}
\DeclareUTFSymbol\cyrz{"0437}
\DeclareUTFSymbol\cyri{"0438}
\DeclareUTFSymbol\cyrishrt{"0439}
\DeclareUTFCompositeSymbol\U{\cyri}{"0439}
\DeclareUTFSymbol\cyrk{"043A}
\DeclareUTFSymbol\cyrl{"043B}
\DeclareUTFSymbol\cyrm{"043C}
\DeclareUTFSymbol\cyrn{"043D}
\DeclareUTFSymbol\cyro{"043E}
\DeclareUTFSymbol\cyrp{"043F}
\DeclareUTFSymbol\cyrr{"0440}
\DeclareUTFSymbol\cyrs{"0441}
\DeclareUTFSymbol\cyrt{"0442}
\DeclareUTFSymbol\cyru{"0443}
\DeclareUTFSymbol\cyrf{"0444}
\DeclareUTFSymbol\cyrh{"0445}
\DeclareUTFSymbol\cyrc{"0446}
\DeclareUTFSymbol\cyrch{"0447}
\DeclareUTFSymbol\cyrsh{"0448}
\DeclareUTFSymbol\cyrshch{"0449}
\DeclareUTFSymbol\cyrhrdsn{"044A}
\DeclareUTFSymbol\cyrery{"044B}
\DeclareUTFSymbol\cyrsftsn{"044C}
\DeclareUTFSymbol\cyrerev{"044D}
\DeclareUTFSymbol\cyryu{"044E}
\DeclareUTFSymbol\cyrya{"044F}
\DeclareUTFCompositeSymbol\`{\cyre}{"0450}
\DeclareUTFSymbol\cyryo{"0451}
\DeclareUTFCompositeSymbol\"{\cyre}{"0451}
\DeclareUTFSymbol\cyrdje{"0452}
\DeclareUTFCompositeSymbol\'{\cyrg}{"0453}
\DeclareUTFSymbol\cyrie{"0454}
\DeclareUTFSymbol\cyrdze{"0455}
\DeclareUTFSymbol\cyrii{"0456}
\DeclareUTFSymbol\cyryi{"0457}
\DeclareUTFCompositeSymbol\"{\cyrii}{"0457}
\DeclareUTFSymbol\cyrje{"0458}
\DeclareUTFSymbol\cyrlje{"0459}
\DeclareUTFSymbol\cyrnje{"045A}
\DeclareUTFSymbol\cyrtshe{"045B}
\DeclareUTFCompositeSymbol\'{\cyrk}{"045C}
\DeclareUTFCompositeSymbol\`{\cyri}{"045D}
\DeclareUTFSymbol\cyrushrt{"045E}
\DeclareUTFCompositeSymbol\U{\curu}{"045E}
\DeclareUTFSymbol\cyrdzhe{"045F}
\DeclareUTFSymbol\CYROMEGA{"0460}
\DeclareUTFSymbol\cyromega{"0461}
\DeclareUTFSymbol\CYRYAT{"0462}
\DeclareUTFSymbol\cyryat{"0463}
\DeclareUTFSymbol\CYRIOTE{"0464}
\DeclareUTFSymbol\cyriote{"0465}
\DeclareUTFSymbol\CYRLYUS{"0466}
\DeclareUTFSymbol\cyrlyus{"0467}
\DeclareUTFSymbol\CYRIOTLYUS{"0468}
\DeclareUTFSymbol\cyriotlyus{"0469}
\DeclareUTFSymbol\CYRBYUS{"046A}
\DeclareUTFSymbol\cyrbyus{"046B}
\DeclareUTFSymbol\CYRIOTBYUS{"046C}
\DeclareUTFSymbol\cyriotbyus{"046D}
\DeclareUTFSymbol\CYRKSI{"046E}
\DeclareUTFSymbol\cyrksi{"046F}
\DeclareUTFSymbol\CYRPSI{"0470}
\DeclareUTFSymbol\cyrpsi{"0471}
\DeclareUTFSymbol\CYRFITA{"0472}
\DeclareUTFSymbol\cyrfita{"0473}
\DeclareUTFSymbol\CYRIZH{"0474}
\DeclareUTFSymbol\cyrizh{"0475}
\DeclareUTFCompositeSymbol\C{\CYRIZH}{"0476}
\DeclareUTFCompositeSymbol\C{\cyrizh}{"0477}
\DeclareUTFSymbol\CYRUK{"0478}
\DeclareUTFSymbol\cyruk{"0479}
\DeclareUTFSymbol\CYROMEGARND{"047A}
\DeclareUTFSymbol\cyromegarnd{"047B}
\DeclareUTFSymbol\CYROMEGATITLO{"047C}
\DeclareUTFSymbol\cyromegatitlo{"047D}
\DeclareUTFSymbol\CYROT{"047E}
\DeclareUTFSymbol\cyrot{"047F}
\DeclareUTFSymbol\CYRKOPPA{"0480}
\DeclareUTFSymbol\cyrkoppa{"0481}
\DeclareUTFSymbol\cyrthousands{"0482}
\DeclareUTFSymbol\CYRISHRTDSC{"048A}
\DeclareUTFSymbol\cyrishrtdsc{"048B}
\DeclareUTFSymbol\CYRSEMISFTSN{"048C}
\DeclareUTFSymbol\cyrsemisftsn{"048D}
\DeclareUTFSymbol\CYRRTICK{"048E}
\DeclareUTFSymbol\cyrrtick{"048F}
\DeclareUTFSymbol\CYRGUP{"0490}
\DeclareUTFSymbol\cyrgup{"0491}
\DeclareUTFSymbol\CYRGHCRS{"0492}
\DeclareUTFSymbol\cyrghcrs{"0493}
\DeclareUTFSymbol\CYRGHK{"0494}
\DeclareUTFSymbol\cyrghk{"0495}
\DeclareUTFSymbol\CYRZHDSC{"0496}
\DeclareUTFSymbol\cyrzhdsc{"0497}
\DeclareUTFSymbol\CYRZDSC{"0498}
\DeclareUTFCompositeSymbol\c{\CYRZ}{"0498}
\DeclareUTFSymbol\cyrzdsc{"0499}
\DeclareUTFCompositeSymbol\c{\cyrz}{"0499}
\DeclareUTFSymbol\CYRKDSC{"049A}
\DeclareUTFSymbol\cyrkdsc{"049B}
\DeclareUTFSymbol\CYRKVCRS{"049C}
\DeclareUTFSymbol\cyrkvcrs{"049D}
\DeclareUTFSymbol\CYRKHCRS{"049E}
\DeclareUTFSymbol\cyrkhcrs{"049F}
\DeclareUTFSymbol\CYRKBEAK{"04A0}
\DeclareUTFSymbol\cyrkbeak{"04A1}
\DeclareUTFSymbol\CYRNDSC{"04A2}
\DeclareUTFSymbol\cyrndsc{"04A3}
\DeclareUTFSymbol\CYRNG{"04A4}
\DeclareUTFSymbol\cyrng{"04A5}
\DeclareUTFSymbol\CYRPHK{"04A6}
\DeclareUTFSymbol\cyrphk{"04A7}
\DeclareUTFSymbol\CYRABHHA{"04A8}
\DeclareUTFSymbol\cyrabhha{"04A9}
\DeclareUTFSymbol\CYRSDSC{"04AA}
\DeclareUTFCompositeSymbol\CYRSDSC{\CYRS}{"04AA}
\DeclareUTFSymbol\cyrsdsc{"04AB}
\DeclareUTFCompositeSymbol\k{\cyrs}{"04AB}
\DeclareUTFSymbol\CYRTDSC{"04AC}
\DeclareUTFSymbol\cyrtdsc{"04AD}
\DeclareUTFSymbol\CYRY{"04AE}
\DeclareUTFSymbol\cyry{"04AF}
\DeclareUTFSymbol\CYRYHCRS{"04B0}
\DeclareUTFSymbol\cyryhcrs{"04B1}
\DeclareUTFSymbol\CYRHDSC{"04B2}
\DeclareUTFSymbol\cyrhdsc{"04B3}
\DeclareUTFSymbol\CYRTETSE{"04B4}
\DeclareUTFSymbol\cyrtetse{"04B5}
\DeclareUTFSymbol\CYRCHRDSC{"04B6}
\DeclareUTFSymbol\cyrchrdsc{"04B7}
\DeclareUTFSymbol\CYRCHVCRS{"04B8}
\DeclareUTFSymbol\cyrchvcrs{"04B9}
\DeclareUTFSymbol\CYRSHHA{"04BA}
\DeclareUTFSymbol\cyrshha{"04BB}
\DeclareUTFSymbol\CYRABHCH{"04BC}
\DeclareUTFSymbol\cyrabhch{"04BD}
\DeclareUTFSymbol\CYRABHCHDSC{"04BE}
\DeclareUTFCompositeSymbol\k{\CYRABHCH}{"04BE}
\DeclareUTFSymbol\cyrabhchdsc{"04BF}
\DeclareUTFCompositeSymbol\k{\cyrabhch}{"04BF}
\DeclareUTFSymbol\CYRpalochka{"04C0}
\DeclareUTFCompositeSymbol\U{\CYRZH}{"04C1}
\DeclareUTFCompositeSymbol\U{\cyrzh}{"04C2}
\DeclareUTFSymbol\CYRKHK{"04C3}
\DeclareUTFSymbol\cyrkhk{"04C4}
\DeclareUTFSymbol\CYRLDSC{"04C5}
\DeclareUTFSymbol\cyrldsc{"04C6}
\DeclareUTFSymbol\CYRNHK{"04C7}
\DeclareUTFSymbol\cyrnhk{"04C8}
\DeclareUTFSymbol\CYRCHLDSC{"04CB}
\DeclareUTFSymbol\cyrchldsc{"04CC}
\DeclareUTFSymbol\CYRMDSC{"04CD}
\DeclareUTFSymbol\cyrmdsc{"04CE}
\DeclareUTFCompositeSymbol\U{\CYRA}{"04D0}
\DeclareUTFCompositeSymbol\U{\cyra}{"04D1}
\DeclareUTFCompositeSymbol\"{\CYRA}{"04D2}
\DeclareUTFCompositeSymbol\"{\cyra}{"04D3}
\DeclareUTFSymbol\CYRAE{"04D4}
\DeclareUTFSymbol\cyrae{"04D5}
\DeclareUTFCompositeSymbol\U{\CYRE}{"04D6}
\DeclareUTFCompositeSymbol\U{\cyre}{"04D7}
\DeclareUTFSymbol\CYRSCHWA{"04D8}
\DeclareUTFSymbol\cyrschwa{"04D9}
\DeclareUTFCompositeSymbol\"{\CYRSCHWA}{"04DA}
\DeclareUTFCompositeSymbol\"{\cyrschwa}{"04DB}
\DeclareUTFCompositeSymbol\"{\CYRZH}{"04DC}
\DeclareUTFCompositeSymbol\"{\cyrzh}{"04DD}
\DeclareUTFCompositeSymbol\"{\CYRZ}{"04DE}
\DeclareUTFCompositeSymbol\"{\cyrz}{"04DF}
\DeclareUTFSymbol\CYRABHDZE{"04E0}
\DeclareUTFSymbol\cyrabhdze{"04E1}
\DeclareUTFCompositeSymbol\={\CYRI}{"04E2}
\DeclareUTFCompositeSymbol\={\cyri}{"04E3}
\DeclareUTFCompositeSymbol\"{\CYRI}{"04E4}
\DeclareUTFCompositeSymbol\"{\cyri}{"04E5}
\DeclareUTFCompositeSymbol\"{\CYRO}{"04E6}
\DeclareUTFCompositeSymbol\"{\cyro}{"04E7}
\DeclareUTFSymbol\CYROTLD{"04E8}
\DeclareUTFSymbol\cyrotld{"04E9}
\DeclareUTFCompositeSymbol\"{\CYROTLD}{"04EA}
\DeclareUTFCompositeSymbol\"{\cyrotld}{"04EB}
\DeclareUTFCompositeSymbol\"{\CYREREV}{"04EC}
\DeclareUTFCompositeSymbol\"{\cyreref}{"04ED}
\DeclareUTFCompositeSymbol\={\CYRU}{"04EE}
\DeclareUTFCompositeSymbol\={\cyru}{"04EF}
\DeclareUTFCompositeSymbol\"{\CYRU}{"04F0}
\DeclareUTFCompositeSymbol\"{\cyru}{"04F1}
\DeclareUTFCompositeSymbol\H{\CYRU}{"04F2}
\DeclareUTFCompositeSymbol\H{\cyru}{"04F3}
\DeclareUTFCompositeSymbol\"{\CYRCH}{"04F4}
\DeclareUTFCompositeSymbol\"{\cyrch}{"04F5}
\DeclareUTFSymbol\CYRGDSC{"04F6}
\DeclareUTFSymbol\cyrgdsc{"04F7}
\DeclareUTFCompositeSymbol\"{\CYRERY}{"04F8}
\DeclareUTFCompositeSymbol\"{\cyrery}{"04F9}
\DeclareUTFSymbol\CYRHHK{"04FC}
\DeclareUTFSymbol\cyrhhk{"04FD}
\DeclareUTFSymbol\sofpasuq{"05C3}
\DeclareUTFSymbol\hebalef{"05D0}
\DeclareUTFSymbol\hebbet{"05D1}
\DeclareUTFSymbol\hebgimel{"05D2}
\DeclareUTFSymbol\hebdalet{"05D3}
\DeclareUTFSymbol\hebhe{"05D4}
\DeclareUTFSymbol\hebvav{"05D5}
\DeclareUTFSymbol\hebzayin{"05D6}
\DeclareUTFSymbol\hebhet{"05D7}
\DeclareUTFSymbol\hebtet{"05D8}
\DeclareUTFSymbol\hebyod{"05D9}
\DeclareUTFSymbol\hebfinalkaf{"05DA}
\DeclareUTFSymbol\hebkaf{"05DB}
\DeclareUTFSymbol\heblamed{"05DC}
\DeclareUTFSymbol\hebfinalmem{"05DD}
\DeclareUTFSymbol\hebmem{"05DE}
\DeclareUTFSymbol\hebfinalnun{"05DF}
\DeclareUTFSymbol\hebnun{"05E0}
\DeclareUTFSymbol\hebsamekh{"05E1}
\DeclareUTFSymbol\hebayin{"05E2}
\DeclareUTFSymbol\hebfinalpe{"05E3}
\DeclareUTFSymbol\hebpe{"05E4}
\DeclareUTFSymbol\hebfinaltsadi{"05E5}
\DeclareUTFSymbol\hebtsadi{"05E6}
\DeclareUTFSymbol\hebqof{"05E7}
\DeclareUTFSymbol\hebresh{"05E8}
\DeclareUTFSymbol\hebshin{"05E9}
\DeclareUTFSymbol\hebtav{"05EA}
\DeclareUTFSymbol\doublevav{"05F0}
\DeclareUTFSymbol\vavyod{"05F1}
\DeclareUTFSymbol\doubleyod{"05F2}
\DeclareUTFSymbol\textscd{"1D05}
\DeclareUTFSymbol\textPUsck{"1D0B}
\DeclareUTFSymbol\textPUscm{"1D0D}
\DeclareUTFSymbol\textPUscp{"1D18}
\DeclareUTFSymbol\textPUrevscr{"1D19}
\DeclareUTFSymbol\textiinferior{"1D62}
\DeclareUTFSymbol\textrinferior{"1D63}
\DeclareUTFSymbol\textuinferior{"1D64}
\DeclareUTFSymbol\textvinferior{"1D65}
\DeclareUTFSymbol\textbetainferior{"1D66}
\DeclareUTFSymbol\textgammainferior{"1D67}
\DeclareUTFSymbol\textrhoinferior{"1D68}
\DeclareUTFSymbol\textphiinferior{"1D69}
\DeclareUTFSymbol\textchiinferior{"1D6A}
\DeclareUTFSymbol\textbarsci{"1D7B}
\DeclareUTFSymbol\textbarp{"1D7D}
\DeclareUTFSymbol\textbarscu{"1D7E}
\DeclareUTFSymbol\textPUrhooka{"1D8F}
\DeclareUTFSymbol\textPUrhooke{"1D92}
\DeclareUTFSymbol\textPUrhookepsilon{"1D93}
\DeclareUTFSymbol\textPUrhookopeno{"1D97}
\DeclareUTFCompositeSymbol\textsubbreve{H}{"1E2A}
\DeclareUTFCompositeSymbol\textsubbreve{h}{"1E2B}
\DeclareUTFCompositeSymbol\.{\textlongs}{"1E9B}
\DeclareUTFSymbol\textcompwordmark{"200C}
\DeclareUTFSymbol\texthdotfor{"2025}
\DeclareUTFSymbol\textprime{"2032}
\DeclareUTFSymbol\textsecond{"2033}
\DeclareUTFSymbol\textthird{"2034}
\DeclareUTFSymbol\textbackprime{"2035}
\DeclareUTFSymbol\textlefttherefore{"2056}
\DeclareUTFSymbol\textfourth{"2057}
\DeclareUTFSymbol\textdiamonddots{"2058}
\DeclareUTFSymbol\textzerosuperior{"2070}
\DeclareUTFSymbol\textisuperior{"2071}
\DeclareUTFSymbol\textfoursuperior{"2074}
\DeclareUTFSymbol\textfivesuperior{"2075}
\DeclareUTFSymbol\textsixsuperior{"2076}
\DeclareUTFSymbol\textsevensuperior{"2077}
\DeclareUTFSymbol\texteightsuperior{"2078}
\DeclareUTFSymbol\textninesuperior{"2079}
\DeclareUTFSymbol\textplussuperior{"207A}
\DeclareUTFSymbol\textminussuperior{"207B}
\DeclareUTFSymbol\textequalsuperior{"207C}
\DeclareUTFSymbol\textparenleftsuperior{"207D}
\DeclareUTFSymbol\textparenrightsuperior{"207E}
\DeclareUTFSymbol\textnsuperior{"207F}
\DeclareUTFSymbol\textzeroinferior{"2080}
\DeclareUTFSymbol\textoneinferior{"2081}
\DeclareUTFSymbol\texttwoinferior{"2082}
\DeclareUTFSymbol\textthreeinferior{"2083}
\DeclareUTFSymbol\textfourinferior{"2084}
\DeclareUTFSymbol\textfiveinferior{"2085}
\DeclareUTFSymbol\textsixinferior{"2086}
\DeclareUTFSymbol\textseveninferior{"2087}
\DeclareUTFSymbol\texteightinferior{"2088}
\DeclareUTFSymbol\textnineinferior{"2089}
\DeclareUTFSymbol\textplusinferior{"208A}
\DeclareUTFSymbol\textminusinferior{"208B}
\DeclareUTFSymbol\textequalsinferior{"208C}
\DeclareUTFSymbol\textparenleftinferior{"208D}
\DeclareUTFSymbol\textparenrightinferior{"208E}
\DeclareUTFSymbol\textainferior{"2090}
\DeclareUTFSymbol\texteinferior{"2091}
\DeclareUTFSymbol\textoinferior{"2092}
\DeclareUTFSymbol\textxinferior{"2093}
\DeclareUTFSymbol\textschwainferior{"2094}
\DeclareUTFSymbol\texthinferior{"2095}
\DeclareUTFSymbol\textkinferior{"2096}
\DeclareUTFSymbol\textlinferior{"2097}
\DeclareUTFSymbol\textminferior{"2098}
\DeclareUTFSymbol\textninferior{"2099}
\DeclareUTFSymbol\textpinferior{"209A}
\DeclareUTFSymbol\textsinferior{"209B}
\DeclareUTFSymbol\texttinferior{"209C}
\DeclareUTFSymbol\textpeseta{"20A7}
\DeclareUTFSymbol\textDeleatur{"20B0}
\DeclareUTFSymbol\textguarani{"20B2}
\DeclareUTFSymbol\texthslash{"210F}
\DeclareUTFSymbol\textIm{"2111}
\DeclareUTFSymbol\textell{"2113}
\DeclareUTFSymbol\textwp{"2118}
\DeclareUTFSymbol\textRe{"211C}
\DeclareUTFSymbol\textriota{"2129}
\DeclareUTFSymbol\textangstrom{"212B}
\DeclareUTFSymbol\textfax{"213B}
\DeclareUTFSymbol\textinvamp{"214B}
\DeclareUTFSymbol\textoneseventh{"2150}
\DeclareUTFSymbol\textoneninth{"2151}
\DeclareUTFSymbol\textonetenth{"2152}
\DeclareUTFSymbol\textonethird{"2153}
\DeclareUTFSymbol\texttwothirds{"2154}
\DeclareUTFSymbol\textonefifth{"2155}
\DeclareUTFSymbol\texttwofifths{"2156}
\DeclareUTFSymbol\textthreefifths{"2157}
\DeclareUTFSymbol\textfourfifths{"2158}
\DeclareUTFSymbol\textonesixth{"2159}
\DeclareUTFSymbol\textfivesixths{"215A}
\DeclareUTFSymbol\textoneeighth{"215B}
\DeclareUTFSymbol\textthreeeighths{"215C}
\DeclareUTFSymbol\textfiveeighths{"215D}
\DeclareUTFSymbol\textseveneighths{"215E}
\DeclareUTFSymbol\textrevc{"2184}
\DeclareUTFSymbol\textzerothirds{"2189}
\DeclareUTFSymbol\textnleftarrow{"219A}
\DeclareUTFSymbol\textnrightarrow{"219B}
\DeclareUTFSymbol\texttwoheadleftarrow{"219E}
\DeclareUTFCommand\textntwoheadleftarrow{\textlstrikethru\texttwoheadleftarrow}
\DeclareUTFSymbol\texttwoheaduparrow{"219F}
\DeclareUTFSymbol\texttwoheadrightarrow{"21A0}
\DeclareUTFCommand\textntwoheadrightarrow{\textlstrikethru\texttwoheadrightarrow}
\DeclareUTFSymbol\texttwoheaddownarrow{"21A1}
\DeclareUTFSymbol\textleftarrowtail{"21A2}
\DeclareUTFSymbol\textrightarrowtail{"21A3}
\DeclareUTFSymbol\textmapsto{"21A6}
\DeclareUTFSymbol\texthookleftarrow{"21A9}
\DeclareUTFSymbol\texthookrightarrow{"21AA}
\DeclareUTFSymbol\textlooparrowleft{"21AB}
\DeclareUTFSymbol\textlooparrowright{"21AC}
\DeclareUTFSymbol\textnleftrightarrow{"21AE}
\DeclareUTFSymbol\textlightning{"21AF}
\DeclareUTFSymbol\textdlsh{"21B5}
\DeclareUTFSymbol\textcurvearrowleft{"21B6}
\DeclareUTFSymbol\textcurvearrowright{"21B7}
\DeclareUTFSymbol\textleftharpoonup{"21BC}
\DeclareUTFSymbol\textleftharpoondown{"21BD}
\DeclareUTFSymbol\textupharpoonright{"21BE}
\DeclareUTFSymbol\textupharpoonleft{"21BF}
\DeclareUTFSymbol\textrightharpoonup{"21C0}
\DeclareUTFSymbol\textrightharpoondown{"21C1}
\DeclareUTFSymbol\textdownharpoonright{"21C2}
\DeclareUTFSymbol\textdownharpoonleft{"21C3}
\DeclareUTFSymbol\textrightleftarrows{"21C4}
\DeclareUTFSymbol\textupdownarrows{"21C5}
\DeclareUTFSymbol\textleftrightarrows{"21C6}
\DeclareUTFSymbol\textleftleftarrows{"21C7}
\DeclareUTFSymbol\textupuparrows{"21C8}
\DeclareUTFSymbol\textrightrightarrows{"21C9}
\DeclareUTFSymbol\textdowndownarrows{"21CA}
\DeclareUTFSymbol\textleftrightharpoons{"21CB}
\DeclareUTFSymbol\textrightleftharpoons{"21CC}
\DeclareUTFSymbol\textnLeftarrow{"21CD}
\DeclareUTFSymbol\textnLeftrightarrow{"21CE}
\DeclareUTFSymbol\textnRightarrow{"21CF}
\DeclareUTFSymbol\textLeftarrow{"21D0}
\DeclareUTFSymbol\textUparrow{"21D1}
\DeclareUTFSymbol\textRightarrow{"21D2}
\DeclareUTFSymbol\textDownarrow{"21D3}
\DeclareUTFSymbol\textLeftrightarrow{"21D4}
\DeclareUTFSymbol\textUpdownarrow{"21D5}
\DeclareUTFSymbol\textNwarrow{"21D6}
\DeclareUTFSymbol\textNearrow{"21D7}
\DeclareUTFSymbol\textSearrow{"21D8}
\DeclareUTFSymbol\textSwarrow{"21D9}
\DeclareUTFSymbol\textLleftarrow{"21DA}
\DeclareUTFSymbol\textRrightarrow{"21DB}
\DeclareUTFSymbol\textleftsquigarrow{"21DC}
\DeclareUTFSymbol\textrightsquigarrow{"21DD}
\DeclareUTFSymbol\textdashleftarrow{"21E0}
\DeclareUTFSymbol\textdasheduparrow{"21E1}
\DeclareUTFSymbol\textdashrightarrow{"21E2}
\DeclareUTFSymbol\textdasheddownarrow{"21E3}
\DeclareUTFSymbol\textpointer{"21E8}
\DeclareUTFSymbol\textdownuparrows{"21F5}
\DeclareUTFSymbol\textleftarrowtriangle{"21FD}
\DeclareUTFSymbol\textrightarrowtriangle{"21FE}
\DeclareUTFSymbol\textleftrightarrowtriangle{"21FF}
\DeclareUTFSymbol\textforall{"2200}
\DeclareUTFSymbol\textcomplement{"2201}
\DeclareUTFSymbol\textpartial{"2202}
\DeclareUTFSymbol\textexists{"2203}
\DeclareUTFSymbol\textnexists{"2204}
\DeclareUTFSymbol\textemptyset{"2205}
\DeclareUTFSymbol\texttriangle{"2206}
\DeclareUTFSymbol\textnabla{"2207}
\DeclareUTFSymbol\textin{"2208}
\DeclareUTFSymbol\textnotin{"2209}
\DeclareUTFSymbol\textsmallin{"220A}
\DeclareUTFSymbol\textni{"220B}
\DeclareUTFSymbol\textnotowner{"220C}
\DeclareUTFSymbol\textsmallowns{"220D}
\DeclareUTFSymbol\textprod{"220F}
\DeclareUTFSymbol\textamalg{"2210}
\DeclareUTFSymbol\textsum{"2211}
\DeclareUTFSymbol\textmp{"2213}
\DeclareUTFSymbol\textdotplus{"2214}
\DeclareUTFSymbol\textDivides{"2215}
\DeclareUTFSymbol\textsetminus{"2216}
\DeclareUTFSymbol\textast{"2217}
\DeclareUTFSymbol\textcirc{"2218}
\DeclareUTFSymbol\textbulletoperator{"2219}
\DeclareUTFSymbol\textpropto{"221D}
\DeclareUTFSymbol\textinfty{"221E}
\DeclareUTFSymbol\textangle{"2220}
\DeclareUTFSymbol\textmeasuredangle{"2221}
\DeclareUTFSymbol\textsphericalangle{"2222}
\DeclareUTFSymbol\textmid{"2223}
\DeclareUTFSymbol\textnmid{"2224}
\DeclareUTFSymbol\textparallel{"2225}
\DeclareUTFSymbol\textnparallel{"2226}
\DeclareUTFSymbol\textwedge{"2227}
\DeclareUTFCommand\textowedge{\textcircled\textwedge}
\DeclareUTFSymbol\textvee{"2228}
\DeclareUTFCommand\textovee{\textcircled\textvee}
\DeclareUTFSymbol\textcap{"2229}
\DeclareUTFSymbol\textcup{"222A}
\DeclareUTFSymbol\textint{"222B}
\DeclareUTFSymbol\textiint{"222C}
\DeclareUTFSymbol\textiiint{"222D}
\DeclareUTFSymbol\textoint{"222E}
\DeclareUTFSymbol\textoiint{"222F}
\DeclareUTFSymbol\textointclockwise{"2232}
\DeclareUTFSymbol\textointctrclockwise{"2233}
\DeclareUTFSymbol\texttherefore{"2234}
\DeclareUTFSymbol\textbecause{"2235}
\DeclareUTFSymbol\textvdotdot{"2236}
\DeclareUTFSymbol\textsquaredots{"2237}
\DeclareUTFSymbol\textdotminus{"2238}
\DeclareUTFSymbol\texteqcolon{"2239}
\DeclareUTFSymbol\textsim{"223C}
\DeclareUTFSymbol\textbacksim{"223D}
\DeclareUTFCommand\textnbacksim{\textlstrikethru\textnbacksim}
\DeclareUTFSymbol\textwr{"2240}
\DeclareUTFSymbol\textnsim{"2241}
\DeclareUTFSymbol\texteqsim{"2242}
\DeclareUTFCommand\textneqsim{\textlstrikethru\texteqsim}
\DeclareUTFSymbol\textsimeq{"2243}
\DeclareUTFSymbol\textnsimeq{"2244}
\DeclareUTFSymbol\textcong{"2245}
\DeclareUTFSymbol\textncong{"2247}
\DeclareUTFSymbol\textapprox{"2248}
\DeclareUTFSymbol\textnapprox{"2249}
\DeclareUTFSymbol\textapproxeq{"224A}
\DeclareUTFCommand\textnapproxeq{\textlstrikethru\textapproxeq}
\DeclareUTFSymbol\texttriplesim{"224B}
\DeclareUTFCommand\textntriplesim{\textlstrikethru\texttriplesim}
\DeclareUTFSymbol\textbackcong{"224C}
\DeclareUTFCommand\textnbackcong{\textlstrikethru\textbackcong}
\DeclareUTFSymbol\textasymp{"224D}
\DeclareUTFCommand\textnasymp{\textlstrikethru\textasymp}
\DeclareUTFSymbol\textBumpeq{"224E}
\DeclareUTFCommand\textnBumpeq{\textlstrikethru\textBumpeq}
\DeclareUTFSymbol\textbumpeq{"224F}
\DeclareUTFCommand\textnbumpeq{\textlstrikethru\textbumpeq}
\DeclareUTFSymbol\textdoteq{"2250}
\DeclareUTFCommand\textndoteq{\textlstrikethru\textdoteq}
\DeclareUTFSymbol\textdoteqdot{"2251}
\DeclareUTFCommand\textnDoteq{\textlstrikethru\textdoteqdot}
\DeclareUTFSymbol\textfallingdoteq{"2252}
\DeclareUTFCommand\textnfallingdoteq{\textlstrikethru\textfallingdoteq}
\DeclareUTFSymbol\textrisingdoteq{"2253}
\DeclareUTFCommand\textnrisingdoteq{\textlstrikethru\textrisingdoteq}
\DeclareUTFSymbol\textcolonequals{"2254}
\DeclareUTFSymbol\textequalscolon{"2255}
\DeclareUTFSymbol\texteqcirc{"2256}
\DeclareUTFCommand\textneqcirc{\textlstrikethru\texteqcirc}
\DeclareUTFSymbol\textcirceq{"2257}
\DeclareUTFCommand\textncirceq{\textlstrikethru\textcirceq}
\DeclareUTFSymbol\texthateq{"2259}
\DeclareUTFCommand\textnhateq{\textlstrikethru\texthateq}
\DeclareUTFSymbol\texttriangleeq{"225C}
\DeclareUTFSymbol\textneq{"2260}
\DeclareUTFSymbol\textne{"2260}
\DeclareUTFSymbol\textequiv{"2261}
\DeclareUTFSymbol\textnequiv{"2262}
\DeclareUTFSymbol\textleq{"2264}
\DeclareUTFSymbol\textle{"2264}
\DeclareUTFSymbol\textgeq{"2265}
\DeclareUTFSymbol\textge{"2265}
\DeclareUTFSymbol\textleqq{"2266}
\DeclareUTFCommand\textnleqq{\textlstrikethru\textleqq}
\DeclareUTFSymbol\textgeqq{"2267}
\DeclareUTFCommand\textngeqq{\textlstrikethru\textgeqq}
\DeclareUTFSymbol\textlneqq{"2268}
\DeclareUTFSymbol\textgneqq{"2269}
\DeclareUTFSymbol\textll{"226A}
\DeclareUTFCommand\textnll{\textlstrikethru\textll}
\DeclareUTFSymbol\textgg{"226B}
\DeclareUTFCommand\textngg{\textlstrikethru\textgg}
\DeclareUTFSymbol\textbetween{"226C}
\DeclareUTFSymbol\textnless{"226E}
\DeclareUTFSymbol\textngtr{"226F}
\DeclareUTFSymbol\textnleq{"2270}
\DeclareUTFSymbol\textngeq{"2271}
\DeclareUTFSymbol\textlesssim{"2272}
\DeclareUTFSymbol\textgtrsim{"2273}
\DeclareUTFSymbol\textnlesssim{"2274}
\DeclareUTFSymbol\textngtrsim{"2275}
\DeclareUTFSymbol\textlessgtr{"2276}
\DeclareUTFSymbol\textgtrless{"2277}
\DeclareUTFSymbol\textngtrless{"2278}
\DeclareUTFSymbol\textnlessgtr{"2279}
\DeclareUTFSymbol\textprec{"227A}
\DeclareUTFSymbol\textsucc{"227B}
\DeclareUTFSymbol\textpreccurlyeq{"227C}
\DeclareUTFSymbol\textsucccurlyeq{"227D}
\DeclareUTFSymbol\textprecsim{"227E}
\DeclareUTFCommand\textnprecsim{\textlstrikethru\textprecsim}
\DeclareUTFSymbol\textsuccsim{"227F}
\DeclareUTFCommand\textnsuccsim{\textlstrikethru\textsuccsim}
\DeclareUTFSymbol\textnprec{"2280}
\DeclareUTFSymbol\textnsucc{"2281}
\DeclareUTFSymbol\textsubset{"2282}
\DeclareUTFSymbol\textsupset{"2283}
\DeclareUTFSymbol\textnsubset{"2284}
\DeclareUTFSymbol\textnsupset{"2285}
\DeclareUTFSymbol\textsubseteq{"2286}
\DeclareUTFSymbol\textsupseteq{"2287}
\DeclareUTFSymbol\textnsubseteq{"2288}
\DeclareUTFSymbol\textnsupseteq{"2289}
\DeclareUTFSymbol\textsubsetneq{"228A}
\DeclareUTFSymbol\textsupsetneq{"228B}
\DeclareUTFSymbol\textcupdot{"228D}
\DeclareUTFSymbol\textcupplus{"228E}
\DeclareUTFSymbol\textsqsubset{"228F}
\DeclareUTFCommand\textnsqsubset{\textlstrikethru\textsqsubset}
\DeclareUTFSymbol\textsqsupset{"2290}
\DeclareUTFCommand\textnsqsupset{\textlstrikethru\textsqsupset}
\DeclareUTFSymbol\textsqsubseteq{"2291}
\DeclareUTFCommand\textnsqsubseteq{\textlstrikethru\textsqsubseteq}
\DeclareUTFSymbol\textsqsupseteq{"2292}
\DeclareUTFCommand\textnsqsupseteq{\textlstrikethru\textsqsupseteq}
\DeclareUTFSymbol\textsqcap{"2293}
\DeclareUTFSymbol\textsqcup{"2294}
\DeclareUTFSymbol\textoplus{"2295}
\DeclareUTFSymbol\textominus{"2296}
\DeclareUTFSymbol\textotimes{"2297}
\DeclareUTFSymbol\textoslash{"2298}
\DeclareUTFSymbol\textodot{"2299}
\DeclareUTFSymbol\textcircledcirc{"229A}
\DeclareUTFSymbol\textcircledast{"229B}
\DeclareUTFSymbol\textcircleddash{"229D}
\DeclareUTFSymbol\textboxplus{"229E}
\DeclareUTFSymbol\textboxminus{"229F}
\DeclareUTFSymbol\textboxtimes{"22A0}
\DeclareUTFSymbol\textboxdot{"22A1}
\DeclareUTFSymbol\textvdash{"22A2}
\DeclareUTFSymbol\textdashv{"22A3}
\DeclareUTFCommand\textndashv{\textlstrikethru\textdashv}
\DeclareUTFSymbol\texttop{"22A4}
\DeclareUTFCommand\textndownvdash{\textlstrikethru\texttop}
\DeclareUTFSymbol\textbot{"22A5}
\DeclareUTFCommand\textnupvdash{\textlstrikethru\textbot}
\DeclareUTFSymbol\textvDash{"22A8}
\DeclareUTFSymbol\textVdash{"22A9}
\DeclareUTFSymbol\textVvdash{"22AA}
\DeclareUTFCommand\textnVvash{\textlstrikethru\textVvdash}
\DeclareUTFSymbol\textVDash{"22AB}
\DeclareUTFSymbol\textnvdash{"22AC}
\DeclareUTFSymbol\textnvDash{"22AD}
\DeclareUTFSymbol\textnVdash{"22AE}
\DeclareUTFSymbol\textnVDash{"22AF}
\DeclareUTFSymbol\textlhd{"22B2}
\DeclareUTFSymbol\textrhd{"22B3}
\DeclareUTFSymbol\textunlhd{"22B4}
\DeclareUTFSymbol\textunrhd{"22B5}
\DeclareUTFSymbol\textmultimapdotbothA{"22B6}
\DeclareUTFSymbol\textmultimapdotbothB{"22B7}
\DeclareUTFSymbol\textmultimap{"22B8}
\DeclareUTFSymbol\textveebar{"22BB}
\DeclareUTFSymbol\textbarwedge{"22BC}
\DeclareUTFSymbol\textstar{"22C6}
\DeclareUTFSymbol\textdivideontimes{"22C7}
\DeclareUTFSymbol\textbowtie{"22C8}
\DeclareUTFSymbol\textltimes{"22C9}
\DeclareUTFSymbol\textrtimes{"22CA}
\DeclareUTFSymbol\textleftthreetimes{"22CB}
\DeclareUTFSymbol\textrightthreetimes{"22CC}
\DeclareUTFSymbol\textbacksimeq{"22CD}
\DeclareUTFCommand\textnbacksimeq{\textlstrikethru\textbacksimeq}
\DeclareUTFSymbol\textcurlyvee{"22CE}
\DeclareUTFSymbol\textcurlywedge{"22CF}
\DeclareUTFSymbol\textSubset{"22D0}
\DeclareUTFCommand\textnSubset{\textlstrikethru\textSubset}
\DeclareUTFSymbol\textSupset{"22D1}
\DeclareUTFCommand\textnSupset{\textlstrikethru\textSupset}
\DeclareUTFSymbol\textCap{"22D2}
\DeclareUTFSymbol\textCup{"22D3}
\DeclareUTFSymbol\textpitchfork{"22D4}
\DeclareUTFSymbol\textlessdot{"22D6}
\DeclareUTFSymbol\textgtrdot{"22D7}
\DeclareUTFSymbol\textlll{"22D8}
\DeclareUTFSymbol\textggg{"22D9}
\DeclareUTFSymbol\textlesseqgtr{"22DA}
\DeclareUTFSymbol\textgtreqless{"22DB}
\DeclareUTFSymbol\textcurlyeqprec{"22DE}
\DeclareUTFCommand\textncurlyeqprec{\textlstrikethru\textcurlyeqprec}
\DeclareUTFSymbol\textcurlyeqsucc{"22DF}
\DeclareUTFCommand\textncurlyeqsucc{\textlstrikethru\textcurlyeqsucc}
\DeclareUTFSymbol\textnpreccurlyeq{"22E0}
\DeclareUTFSymbol\textnsucccurlyeq{"22E1}
\DeclareUTFSymbol\textnqsubseteq{"22E2}
\DeclareUTFSymbol\textnqsupseteq{"22E3}
\DeclareUTFSymbol\textsqsubsetneq{"22E4}
\DeclareUTFSymbol\textsqsupsetneq{"22E5}
\DeclareUTFSymbol\textlnsim{"22E6}
\DeclareUTFSymbol\textgnsim{"22E7}
\DeclareUTFSymbol\textprecnsim{"22E8}
\DeclareUTFSymbol\textsuccnsim{"22E9}
\DeclareUTFSymbol\textntriangleleft{"22EA}
\DeclareUTFSymbol\textntriangleright{"22EB}
\DeclareUTFSymbol\textntrianglelefteq{"22EC}
\DeclareUTFSymbol\textntrianglerighteq{"22ED}
\DeclareUTFSymbol\textvdots{"22EE}
\DeclareUTFSymbol\textcdots{"22EF}
\DeclareUTFSymbol\textudots{"22F0}
\DeclareUTFSymbol\textddots{"22F1}
\DeclareUTFSymbol\textbarin{"22F6}
\DeclareUTFSymbol\textdiameter{"2300}
\DeclareUTFSymbol\textbackneg{"2310}
\DeclareUTFSymbol\textwasylozenge{"2311}
\DeclareUTFSymbol\textinvbackneg{"2319}
\DeclareUTFSymbol\textclock{"231A}
\DeclareUTFSymbol\textulcorner{"231C}
\DeclareUTFSymbol\texturcorner{"231D}
\DeclareUTFSymbol\textllcorner{"231E}
\DeclareUTFSymbol\textlrcorner{"231F}
\DeclareUTFSymbol\textfrown{"2322}
\DeclareUTFSymbol\textsmile{"2323}
\DeclareUTFSymbol\textKeyboard{"2328}
\DeclareUTFSymbol\textlangle{"2329}
\DeclareUTFSymbol\textrangle{"232A}
\DeclareUTFSymbol\textAPLinv{"2339}
\DeclareUTFSymbol\textTumbler{"233C}
\DeclareUTFSymbol\textstmaryrdbaro{"233D}
\DeclareUTFSymbol\textnotslash{"233F}
\DeclareUTFSymbol\textnotbackslash{"2340}
\DeclareUTFSymbol\textboxbackslash{"2342}
\DeclareUTFSymbol\textAPLleftarrowbox{"2347}
\DeclareUTFSymbol\textAPLrightarrowbox{"2348}
\DeclareUTFSymbol\textAPLuparrowbox{"2350}
\DeclareUTFSymbol\textAPLdownarrowbox{"2357}
\DeclareUTFSymbol\textAPLinput{"235E}
\DeclareUTFSymbol\textRequest{"2370}
\DeclareUTFSymbol\textBeam{"2393}
\DeclareUTFSymbol\texthexagon{"2394}
\DeclareUTFSymbol\textAPLbox{"2395}
\DeclareUTFSymbol\textForwardToIndex{"23ED}
\DeclareUTFSymbol\textRewindToIndex{"23EE}
\DeclareUTFSymbol\textbbslash{"244A}
\DeclareUTFSymbol\textCircledA{"24B6}
\DeclareUTFSymbol\textCleaningF{"24BB}
\DeclareUTFCommand\textCleaningFF{\b\textCleaningF}
\DeclareUTFSymbol\textCleaningP{"24C5}
\DeclareUTFCommand\textCleaningPP{\b\textCleaningP}
\DeclareUTFSymbol\textCuttingLine{"2504}
\DeclareUTFSymbol\textUParrow{"25B2}
\DeclareUTFSymbol\textbigtriangleup{"25B3}
\DeclareUTFSymbol\textForward{"25B6}
\DeclareUTFSymbol\texttriangleright{"25B7}
\DeclareUTFSymbol\textRHD{"25BA}
\DeclareUTFSymbol\textDOWNarrow{"25BC}
\DeclareUTFSymbol\textbigtriangledown{"25BD}
\DeclareUTFSymbol\textRewind{"25C0}
\DeclareUTFSymbol\texttriangleleft{"25C1}
\DeclareUTFSymbol\textLHD{"25C4}
\DeclareUTFSymbol\textdiamond{"25C7}
\DeclareUTFSymbol\textlozenge{"25CA}
\DeclareUTFSymbol\textLEFTCIRCLE{"25D6}
\DeclareUTFSymbol\textRIGHTCIRCLE{"25D7}
\DeclareUTFSymbol\textboxbar{"25EB}
\DeclareUTFSymbol\textCloud{"2601}
\DeclareUTFSymbol\textFiveStar{"2605}
\DeclareUTFSymbol\textFiveStarOpen{"2606}
\DeclareUTFSymbol\textPhone{"260E}
\DeclareUTFSymbol\textboxempty{"2610}
\DeclareUTFSymbol\textCheckedbox{"2611}
\DeclareUTFSymbol\textCrossedbox{"2612}
\DeclareUTFSymbol\textCoffeecup{"2615}
\DeclareUTFSymbol\textHandCuffLeft{"261A}
\DeclareUTFSymbol\textHandCuffRight{"261B}
\DeclareUTFSymbol\textHandLeft{"261C}
\DeclareUTFSymbol\textHandRight{"261E}
\DeclareUTFSymbol\textRadioactivity{"2622}
\DeclareUTFSymbol\textBiohazard{"2623}
\DeclareUTFSymbol\textAnkh{"2625}
\DeclareUTFSymbol\textYinYang{"262F}
\DeclareUTFSymbol\textfrownie{"2639}
\DeclareUTFSymbol\textsmiley{"263A}
\DeclareUTFSymbol\textblacksmiley{"263B}
\DeclareUTFSymbol\textsun{"263C}
\DeclareUTFSymbol\textleftmoon{"263D}
\DeclareUTFSymbol\textrightmoon{"263E}
\DeclareUTFSymbol\textmercury{"263F}
\DeclareUTFSymbol\textPUfemale{"2640}
\DeclareUTFSymbol\textearth{"2641}
\DeclareUTFSymbol\textmale{"2642}
\DeclareUTFSymbol\textjupiter{"2643}
\DeclareUTFSymbol\textsaturn{"2644}
\DeclareUTFSymbol\texturanus{"2645}
\DeclareUTFSymbol\textneptune{"2646}
\DeclareUTFSymbol\textpluto{"2647}
\DeclareUTFSymbol\textaries{"2648}
\DeclareUTFSymbol\texttaurus{"2649}
\DeclareUTFSymbol\textgemini{"264A}
\DeclareUTFSymbol\textcancer{"264B}
\DeclareUTFSymbol\textleo{"264C}
\DeclareUTFSymbol\textvirgo{"264D}
\DeclareUTFSymbol\textlibra{"264E}
\DeclareUTFSymbol\textscorpio{"264F}
\DeclareUTFSymbol\textsagittarius{"2650}
\DeclareUTFSymbol\textcapricornus{"2651}
\DeclareUTFSymbol\textaquarius{"2652}
\DeclareUTFSymbol\textpisces{"2653}
\DeclareUTFSymbol\textspadesuitblack{"2660}
\DeclareUTFSymbol\textheartsuitwhite{"2661}
\DeclareUTFSymbol\textdiamondsuitwhite{"2662}
\DeclareUTFSymbol\textclubsuitblack{"2663}
\DeclareUTFSymbol\textspadesuitwhite{"2664}
\DeclareUTFSymbol\textheartsuitblack{"2665}
\DeclareUTFSymbol\textdiamondsuitblack{"2666}
\DeclareUTFSymbol\textclubsuitwhite{"2667}
\DeclareUTFSymbol\textquarternote{"2669}
\DeclareUTFSymbol\texttwonotes{"266B}
\DeclareUTFSymbol\textsixteenthnote{"266C}
\DeclareUTFSymbol\textflat{"266D}
\DeclareUTFSymbol\textnatural{"266E}
\DeclareUTFSymbol\textsharp{"266F}
\DeclareUTFSymbol\textrecycle{"2672}
\DeclareUTFSymbol\textWheelchair{"267F}
\DeclareUTFSymbol\textFlag{"2691}
\DeclareUTFSymbol\textMineSign{"2692}
\DeclareUTFSymbol\textdsmilitary{"2694}
\DeclareUTFSymbol\textdsmedical{"2695}
\DeclareUTFSymbol\textdsjuridical{"2696}
\DeclareUTFSymbol\textdschemical{"2697}
\DeclareUTFSymbol\textdsbiological{"2698}
\DeclareUTFSymbol\textdscommercial{"269A}
\DeclareUTFSymbol\textmanstar{"269D}
\DeclareUTFSymbol\textdanger{"26A0}
\DeclareUTFSymbol\textFemaleFemale{"26A2}
\DeclareUTFSymbol\textMaleMale{"26A3}
\DeclareUTFSymbol\textFemaleMale{"26A4}
\DeclareUTFSymbol\textHermaphrodite{"26A5}
\DeclareUTFSymbol\textNeutral{"26AA}
\DeclareUTFSymbol\textPUuncrfemale{"26B2}
\DeclareUTFSymbol\texthexstar{"26B9}
\DeclareUTFSymbol\textSoccerBall{"26BD}
\DeclareUTFSymbol\textSunCload{"26C5}
\DeclareUTFSymbol\textRain{"26C6}
\DeclareUTFSymbol\textnoway{"26D4}
\DeclareUTFSymbol\textMountain{"26F0}
\DeclareUTFSymbol\textTent{"26FA}
\DeclareUTFSymbol\textScissorRightBrokenBottom{"2701}
\DeclareUTFSymbol\textScissorRight{"2702}
\DeclareUTFSymbol\textScissorRightBrokenTop{"2703}
\DeclareUTFSymbol\textScissorHollowRight{"2704}
\DeclareUTFSymbol\textPhoneHandset{"2706}
\DeclareUTFSymbol\textTape{"2707}
\DeclareUTFSymbol\textPlane{"2708}
\DeclareUTFSymbol\textEnvelope{"2709}
\DeclareUTFSymbol\textPeace{"270C}
\DeclareUTFSymbol\textWritingHand{"270D}
\DeclareUTFSymbol\textPencilRightDown{"270E}
\DeclareUTFSymbol\textPencilRight{"270F}
\DeclareUTFSymbol\textPencilRightUp{"2710}
\DeclareUTFSymbol\textNibRight{"2711}
\DeclareUTFSymbol\textNibSolidRight{"2712}
\DeclareUTFSymbol\textCheckmark{"2713}
\DeclareUTFSymbol\textCheckmarkBold{"2714}
\DeclareUTFSymbol\textXSolid{"2715}
\DeclareUTFSymbol\textXSolidBold{"2716}
\DeclareUTFSymbol\textXSolidBrush{"2717}
\DeclareUTFSymbol\textPlusOutline{"2719}
\DeclareUTFSymbol\textPlus{"271A}
\DeclareUTFSymbol\textPlusThinCenterOpen{"271B}
\DeclareUTFSymbol\textPlusCenterOpen{"271C}
\DeclareUTFSymbol\textCross{"271D}
\DeclareUTFSymbol\textCrossOpenShadow{"271E}
\DeclareUTFSymbol\textCrossOutline{"271F}
\DeclareUTFSymbol\textCrossMaltese{"2720}
\DeclareUTFSymbol\textDavidStar{"2721}
\DeclareUTFSymbol\textFourAsterisk{"2722}
\DeclareUTFSymbol\textJackStar{"2723}
\DeclareUTFSymbol\textJackStarBold{"2724}
\DeclareUTFSymbol\textClowerTips{"2725}
\DeclareUTFSymbol\textFourStar{"2726}
\DeclareUTFSymbol\textFourStarOpen{"2727}
\DeclareUTFSymbol\textFiveStarOpenCircled{"272A}
\DeclareUTFSymbol\textFiveStarCenterOpen{"272B}
\DeclareUTFSymbol\textFiveStarOpenDotted{"272C}
\DeclareUTFSymbol\textFiveStarOutline{"272D}
\DeclareUTFSymbol\textFiveStarOutlineHeavy{"272E}
\DeclareUTFSymbol\textFiveStarConvex{"272F}
\DeclareUTFSymbol\textFiveStarShadow{"2730}
\DeclareUTFSymbol\textAsteriskBold{"2731}
\DeclareUTFSymbol\textAsteriskCenterOpen{"2732}
\DeclareUTFSymbol\textEightStarTaper{"2734}
\DeclareUTFSymbol\textEightStarConvex{"2735}
\DeclareUTFSymbol\textSixStar{"2736}
\DeclareUTFSymbol\textEightStar{"2737}
\DeclareUTFSymbol\textEightStarBold{"2738}
\DeclareUTFSymbol\textTwelveStar{"2739}
\DeclareUTFSymbol\textSixteenStarLight{"273A}
\DeclareUTFSymbol\textSixFlowerPetalRemoved{"273B}
\DeclareUTFSymbol\textSixFlowerOpenCenter{"273C}
\DeclareUTFSymbol\textAsterisk{"273D}
\DeclareUTFSymbol\textSixFlowerAlternate{"273E}
\DeclareUTFSymbol\textFiveFlowerPetal{"273F}
\DeclareUTFSymbol\textFiveFlowerOpen{"2740}
\DeclareUTFSymbol\textEightFlowerPetal{"2741}
\DeclareUTFSymbol\textSunshineOpenCircled{"2742}
\DeclareUTFSymbol\textSixFlowerAltPetal{"2743}
\DeclareUTFSymbol\textSnowflakeChevron{"2744}
\DeclareUTFSymbol\textSnowflake{"2745}
\DeclareUTFSymbol\textSnowflakeChevronBold{"2746}
\DeclareUTFSymbol\textSparkle{"2747}
\DeclareUTFSymbol\textSparkleBold{"2748}
\DeclareUTFSymbol\textAsteriskRoundedEnds{"2749}
\DeclareUTFSymbol\textEightFlowerPetalRemoved{"274A}
\DeclareUTFSymbol\textEightAsterisk{"274B}
\DeclareUTFSymbol\textCircleShadow{"274D}
\DeclareUTFSymbol\textSquareShadowBottomRight{"274F}
\DeclareUTFSymbol\textSquareTopRight{"2750}
\DeclareUTFSymbol\textSquareCastShadowBottomRight{"2751}
\DeclareUTFSymbol\textSquareCastShadowTopRight{"2752}
\DeclareUTFSymbol\textDiamandSolid{"2756}
\DeclareUTFSymbol\textRectangleThin{"2758}
\DeclareUTFSymbol\textRectangle{"2759}
\DeclareUTFSymbol\textRectangleBold{"275A}
\DeclareUTFSymbol\textperp{"27C2}
\DeclareUTFCommand\textnotperp{\textlstrikethru\textperp}
\DeclareUTFSymbol\textveedot{"27C7}
\DeclareUTFSymbol\textwedgedot{"27D1}
\DeclareUTFSymbol\textleftspoon{"27DC}
\DeclareUTFSymbol\textlbrackdbl{"27E6}
\DeclareUTFSymbol\textrbrackdbl{"27E7}
\DeclareUTFSymbol\textcirclearrowleft{"27F2}
\DeclareUTFSymbol\textcirclearrowright{"27F3}
\DeclareUTFSymbol\textlongleftarrow{"27F5}
\DeclareUTFSymbol\textlongrightarrow{"27F6}
\DeclareUTFSymbol\textlongleftrightarrow{"27F7}
\DeclareUTFSymbol\textLongleftarrow{"27F8}
\DeclareUTFSymbol\textLongrightarrow{"27F9}
\DeclareUTFSymbol\textLongleftrightarrow{"27FA}
\DeclareUTFSymbol\textlongmapsto{"27FC}
\DeclareUTFSymbol\textLongmapsfrom{"27FD}
\DeclareUTFSymbol\textLongmapsto{"27FE}
\DeclareUTFSymbol\textnwsearrow{"2921}
\DeclareUTFSymbol\textneswarrow{"2922}
\DeclareUTFSymbol\textlhooknwarrow{"2923}
\DeclareUTFSymbol\textrhooknearrow{"2924}
\DeclareUTFSymbol\textlhooksearrow{"2925}
\DeclareUTFSymbol\textrhookswarrow{"2926}
\DeclareUTFSymbol\textleadsto{"2933}
\DeclareUTFSymbol\textrcurvearrowne{"2934}
\DeclareUTFSymbol\textlcurvearrowse{"2935}
\DeclareUTFSymbol\textlcurvearrowsw{"2936}
\DeclareUTFSymbol\textrcurvearrowse{"2937}
\DeclareUTFSymbol\textlcurvearrowdown{"2938}
\DeclareUTFSymbol\textrcurvearrowdown{"2939}
\DeclareUTFSymbol\textrcurvearrowleft{"293A}
\DeclareUTFSymbol\textrcurvearrowright{"293B}
\DeclareUTFSymbol\textleftrightharpoon{"294A}
\DeclareUTFSymbol\textrightleftharpoon{"294B}
\DeclareUTFSymbol\textupdownharpoonrightleft{"294C}
\DeclareUTFSymbol\textupdownharpoonleftright{"294D}
\DeclareUTFSymbol\textleftleftharpoons{"2962}
\DeclareUTFSymbol\textupupharpoons{"2963}
\DeclareUTFSymbol\textrightrightharpoons{"2964}
\DeclareUTFSymbol\textdowndownharpoons{"2965}
\DeclareUTFSymbol\textleftbarharpoon{"296A}
\DeclareUTFSymbol\textbarleftharpoon{"296B}
\DeclareUTFSymbol\textrightbarharpoon{"296C}
\DeclareUTFSymbol\textbarrightharpoon{"296D}
\DeclareUTFSymbol\textupdownharpoons{"296E}
\DeclareUTFSymbol\textdownupharpoons{"296F}
\DeclareUTFSymbol\textllparenthesis{"2987}
\DeclareUTFSymbol\textrrparenthesis{"2988}
\DeclareUTFSymbol\textinvdiameter{"29B0}
\DeclareUTFSymbol\textobar{"29B6}
\DeclareUTFSymbol\textobslash{"29B8}
\DeclareUTFSymbol\textobot{"29BA}
\DeclareUTFSymbol\textNoChemicalCleaning{"29BB}
\DeclareUTFSymbol\textolessthan{"29C0}
\DeclareUTFSymbol\textogreaterthan{"29C1}
\DeclareUTFSymbol\textboxslash{"29C4}
\DeclareUTFSymbol\textboxbslash{"29C5}
\DeclareUTFSymbol\textboxast{"29C6}
\DeclareUTFSymbol\textboxcircle{"29C7}
\DeclareUTFSymbol\textboxbox{"29C8}
\DeclareUTFSymbol\textValve{"29D3}
\DeclareUTFSymbol\textmultimapboth{"29DF}
\DeclareUTFSymbol\textshuffle{"29E2}
\DeclareUTFSymbol\textuplus{"2A04}
\DeclareUTFSymbol\textbigdoublewedge{"2A07}
\DeclareUTFSymbol\textbigdoublevee{"2A08}
\DeclareUTFSymbol\textJoin{"2A1D}
\DeclareUTFSymbol\textfatsemi{"2A1F}
\DeclareUTFSymbol\textcircplus{"2A22}
\DeclareUTFSymbol\textminusdot{"2A2A}
\DeclareUTFSymbol\textdottimes{"2A30}
\DeclareUTFSymbol\textdtimes{"2A32}
\DeclareUTFSymbol\textodiv{"2A38}
\DeclareUTFSymbol\textinvneg{"2A3C}
\DeclareUTFSymbol\textsqdoublecap{"2A4E}
\DeclareUTFSymbol\textcapdot{"2A40}
\DeclareUTFSymbol\textsqdoublecup{"2A4F}
\DeclareUTFSymbol\textdoublewedge{"2A55}
\DeclareUTFSymbol\textdoublevee{"2A56}
\DeclareUTFSymbol\textdoublebarwedge{"2A5E}
\DeclareUTFSymbol\textveedoublebar{"2A63}
\DeclareUTFSymbol\texteqdot{"2A66}
\DeclareUTFCommand\textneqdot{\textlstrikethru\texteqdot}
\DeclareUTFSymbol\textcoloncolonequals{"2A74}
\DeclareUTFSymbol\textleqslant{"2A7D}
\DeclareUTFCommand\textnleqslant{\textlstrikethrux\textleqslant}
\DeclareUTFSymbol\textgeqslant{"2A7E}
\DeclareUTFCommand\textngeqslant{\textlstrikethru\textgeqslant}
\DeclareUTFSymbol\textlessapprox{"2A85}
\DeclareUTFCommand\textnlessapprox{\textlstrikethru\textnlessapprox}
\DeclareUTFSymbol\textgtrapprox{"2A86}
\DeclareUTFCommand\textngtrapprox{\textlstrikethru\textgtrapprox}
\DeclareUTFSymbol\textlneq{"2A87}
\DeclareUTFSymbol\textgneq{"2A88}
\DeclareUTFSymbol\textlnapprox{"2A89}
\DeclareUTFSymbol\textgnapprox{"2A8A}
\DeclareUTFSymbol\textlesseqqgtr{"2A8B}
\DeclareUTFSymbol\textgtreqqless{"2A8C}
\DeclareUTFSymbol\texteqslantless{"2A95}
\DeclareUTFSymbol\texteqslantgtr{"2A96}
\DeclareUTFSymbol\textleftslice{"2AA6}
\DeclareUTFSymbol\textrightslice{"2AA7}
\DeclareUTFSymbol\textpreceq{"2AAF}
\DeclareUTFCommand\textnpreceq{\textlstrikethru\textpreceq}
\DeclareUTFSymbol\textsucceq{"2AB0}
\DeclareUTFCommand\textnsucceq{\textlstrikethru\textsucceq}
\DeclareUTFSymbol\textprecneq{"2AB1}
\DeclareUTFSymbol\textsuccneq{"2AB2}
\DeclareUTFSymbol\textpreceqq{"2AB3}
\DeclareUTFCommand\textnpreceqq{\textlstrikethru\textpreceqq}
\DeclareUTFSymbol\textsucceqq{"2AB4}
\DeclareUTFCommand\textnsucceqq{\textlstrikethru\textsucceqq}
\DeclareUTFSymbol\textprecneqq{"2AB5}
\DeclareUTFSymbol\textsuccneqq{"2AB6}
\DeclareUTFSymbol\textprecapprox{"2AB7}
\DeclareUTFCommand\textnprecapprox{\textlstrikethru\textprecapprox}
\DeclareUTFSymbol\textsuccapprox{"2AB8}
\DeclareUTFCommand\textnsuccapprox{\textlstrikethru\textsuccapprox}
\DeclareUTFSymbol\textprecnapprox{"2AB9}
\DeclareUTFSymbol\textsuccnapprox{"2ABA}
\DeclareUTFSymbol\textsubseteqq{"2AC5}
\DeclareUTFCommand\textnsubseteqq{\textlstrikethru\textsubseteqq}
\DeclareUTFSymbol\textsupseteqq{"2AC6}
\DeclareUTFCommand\textnsupseteqq{\textlstrikethru\textsupseteqq}
\DeclareUTFSymbol\textdashV{"2AE3}
\DeclareUTFCommand\textndashV{\textlstrikethru\textdashV}
\DeclareUTFSymbol\textDashv{"2AE4}
\DeclareUTFCommand\textnDashv{\textlstrikethru\textDashv}
\DeclareUTFSymbol\textDashV{"2AE5}
\DeclareUTFCommand\textnDashV{\textlstrikethru\textDashV}
\DeclareUTFSymbol\textdownmodels{"2AEA}
\DeclareUTFCommand\textndownmodels{\textlstrikethru\textdownmodels}
\DeclareUTFSymbol\textupmodels{"2AEB}
\DeclareUTFCommand\textnupmodels{\textlstrikethru\textupmodels}
\DeclareUTFSymbol\textupspoon{"2AEF}
\DeclareUTFSymbol\textinterleave{"2AF4}
\DeclareUTFSymbol\textsslash{"2AFD}
\DeclareUTFSymbol\textpentagon{"2B20}
\DeclareUTFSymbol\textvarhexagon{"2B21}
\DeclareUTFSymbol\textjinferior{"2C7C}
\DeclareUTFSymbol\textslashdiv{"2E13}
\DeclareUTFSymbol\textinterrobangdown{"2E18}
\DeclareUTFSymbol\textfivedots{"2E2D}
\DeclareUTFSymbol\textPUheng{"A727}
\DeclareUTFSymbol\textPUlhookfour{"A72C}
\DeclareUTFSymbol\textPUscf{"A730}
\DeclareUTFSymbol\textPUaolig{"A735}
\DeclareUTFSymbol\textoo{"A74F}
\DeclareUTFSymbol\textcircumlow{"A788}
\DeclareUTFSymbol\textfi{"FB01}
\DeclareUTFSymbol\textfl{"FB02}
\DeclareUTFSymbol\textGaPa{"1D13B}
\DeclareUTFSymbol\textHaPa{"1D13C}
\DeclareUTFSymbol\textViPa{"1D13D}
\DeclareUTFSymbol\textAcPa{"1D13E}
\DeclareUTFSymbol\textSePa{"1D13F}
\DeclareUTFSymbol\textZwPa{"1D140}
\DeclareUTFSymbol\textfullnote{"1D15D}
\DeclareUTFSymbol\texthalfnote{"1D15E}
\DeclareUTFSymbol\textVier{"1D15F}
\DeclareUTFSymbol\textAcht{"1D160}
\DeclareUTFSymbol\textSech{"1D161}
\DeclareUTFSymbol\textZwdr{"1D162}
\DeclareUTFSymbol\textMundus{"1F30D}
\DeclareUTFSymbol\textMoon{"1F319}
\DeclareUTFSymbol\textManFace{"1F468}
\DeclareUTFSymbol\textWomanFace{"1F469}
\DeclareUTFSymbol\textFax{"1F4E0}
\DeclareUTFSymbol\textFire{"1F525}
\DeclareUTFSymbol\textBicycle{"1F6B2}
\DeclareUTFSymbol\textGentsroom{"1F6B9}
\DeclareUTFSymbol\textLadiesroom{"1F6BA}
\DeclareUTFCommand\textcopyleft{\textcircled\textrevc}
\DeclareUTFCommand\textccsa{\textcircled\textcirclearrowleft}
\DeclareUTFSymbol\textglqq{"201E}
\DeclareUTFSymbol\textgrqq{"201C}
\DeclareUTFSymbol\textglq{"201A}
\DeclareUTFSymbol\textgrq{"2018}
\DeclareUTFSymbol\textflqq{"00AB}
\DeclareUTFSymbol\textfrqq{"00BB}
\DeclareUTFSymbol\textflq{"2039}
\DeclareUTFSymbol\textfrq{"203A}
\DeclareUTFSymbol\textneg{"00AC}
\DeclareUTFSymbol\textcdot{"00B7}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/xunextra&gt;
%    \end{macrocode}
%
% \end{implementation}
%
%    \begin{macrocode}
%&lt;@@=xeCJK&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK.cfg}}
%
%    \begin{macrocode}
%&lt;*config&gt;
%    \end{macrocode}
%
% é¢„è®¾çš„é…ç½®æ–‡ä»¶ \file{xeCJK.cfg} ä¸ºä¸€ä¸ªç©ºæ–‡ä»¶ã€‚å¯ä»¥åœ¨é‡Œé¢å¢žåŠ&nbsp;è®¾ç½®ï¼Œç„¶åŽä¿å­˜åˆ°
% æœ¬åœ°ç›®å½•ä¸‹é¢ã€‚
%    \begin{macrocode}

%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/config&gt;
%    \end{macrocode}
%
% \Finale
%
% \endinput
%
% \DisableImplementation
%
% \begin{implementation}
%
% \makeatletter
% \let\special@index\@gobble
% \makeatother
%
% \section{ä¾‹å­}
%
% \subsection{\pkg{xeCJK-example-autofake.tex}}
%
%    \begin{macrocode}
%&lt;*ex-autofake&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{article}
\usepackage[AutoFakeBold,AutoFakeSlant]{xeCJK}
\setCJKmainfont[BoldFont=simhei.ttf, SlantedFont=simkai.ttf]{simsun.ttc}
\setCJKsansfont[AutoFakeSlant=false,
  BoldFont=simhei.ttf, SlantedFont=simkai.ttf]{simsun.ttc}
\setCJKmonofont[ItalicFont=simkai.ttf]{simsun.ttc}
\begin{document}
\centering
\begin{tabular}{lllll}
\hline
 {\bf rm} &amp; md &amp; up &amp; \verb|\rmfamily\mdseries\upshape| &amp;
                      {\rmfamily\mdseries\upshape English ä¸­æ–‡å­—ä½“} \\
          &amp; md &amp; it &amp; \verb|\rmfamily\mdseries\itshape| &amp;
                      {\rmfamily\mdseries\itshape English ä¸­æ–‡å­—ä½“} \\
          &amp; md &amp; sl &amp; \verb|\rmfamily\mdseries\slshape| &amp;
                      {\rmfamily\mdseries\slshape English ä¸­æ–‡å­—ä½“} \\ \cline{2-5}
          &amp; bf &amp; up &amp; \verb|\rmfamily\bfseries\upshape| &amp;
                      {\rmfamily\bfseries\upshape English ä¸­æ–‡å­—ä½“} \\
          &amp; bf &amp; it &amp; \verb|\rmfamily\bfseries\itshape| &amp;
                      {\rmfamily\bfseries\itshape English ä¸­æ–‡å­—ä½“} \\
          &amp; bf &amp; sl &amp; \verb|\rmfamily\bfseries\slshape| &amp;
                      {\rmfamily\bfseries\slshape English ä¸­æ–‡å­—ä½“} \\ \hline
 {\bf sf} &amp; md &amp; up &amp; \verb|\sffamily\mdseries\upshape| &amp;
                      {\sffamily\mdseries\upshape English ä¸­æ–‡å­—ä½“} \\
          &amp; md &amp; it &amp; \verb|\sffamily\mdseries\itshape| &amp;
                      {\sffamily\mdseries\itshape English ä¸­æ–‡å­—ä½“} \\
          &amp; md &amp; sl &amp; \verb|\sffamily\mdseries\slshape| &amp;
                      {\sffamily\mdseries\slshape English ä¸­æ–‡å­—ä½“} \\ \cline{2-5}
          &amp; bf &amp; up &amp; \verb|\sffamily\bfseries\upshape| &amp;
                      {\sffamily\bfseries\upshape English ä¸­æ–‡å­—ä½“} \\
          &amp; bf &amp; it &amp; \verb|\sffamily\bfseries\itshape| &amp;
                      {\sffamily\bfseries\itshape English ä¸­æ–‡å­—ä½“} \\
          &amp; bf &amp; sl &amp; \verb|\sffamily\bfseries\slshape| &amp;
                      {\sffamily\bfseries\slshape English ä¸­æ–‡å­—ä½“} \\ \hline
 {\bf tt} &amp; md &amp; up &amp; \verb|\ttfamily\mdseries\upshape| &amp;
                      {\ttfamily\mdseries\upshape English ä¸­æ–‡å­—ä½“} \\
          &amp; md &amp; it &amp; \verb|\ttfamily\mdseries\itshape| &amp;
                      {\ttfamily\mdseries\itshape English ä¸­æ–‡å­—ä½“} \\
          &amp; md &amp; sl &amp; \verb|\ttfamily\mdseries\slshape| &amp;
                      {\ttfamily\mdseries\slshape English ä¸­æ–‡å­—ä½“} \\ \cline{2-5}
          &amp; bf &amp; up &amp; \verb|\ttfamily\bfseries\upshape| &amp;
                      {\ttfamily\bfseries\upshape English ä¸­æ–‡å­—ä½“} \\
          &amp; bf &amp; it &amp; \verb|\ttfamily\bfseries\itshape| &amp;
                      {\ttfamily\bfseries\itshape English ä¸­æ–‡å­—ä½“} \\
          &amp; bf &amp; sl &amp; \verb|\ttfamily\bfseries\slshape| &amp;
                      {\ttfamily\bfseries\slshape English ä¸­æ–‡å­—ä½“} \\ \hline
\end{tabular}
\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-autofake&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-example-fallback.tex}}
%
%    \begin{macrocode}
%&lt;*ex-fallback&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{article}
\usepackage[AutoFallBack]{xeCJK}
\usepackage{xeCJKfntef}
\usepackage{array}
\setCJKmainfont[AutoFakeBold,AutoFakeSlant]{KaiTi_GB2312}
\setCJKfallbackfamilyfont{\CJKrmdefault}[BoldFont=SimHei]
  { [SlantedFont=FangSong]{SimSun} ,
    [BoldFont=*]          {SimSun-ExtB} }
\begin{document}
æ¼¢å­—æºð£´‘è€ƒ

\textbf{æ¼¢å­—æºð£´‘è€ƒ}

\textsl{æ¼¢å­—æºð£´‘è€ƒ}

\CJKunderwave{æ¼¢å­—æºð£´‘è€ƒ}
\begin{table}[ht]
\caption{ç”Ÿåƒ»å­—æµ‹è¯•}
\medskip\centering
\begin{tabular}{*4{|c&gt;{\ttfamily U+}l}|}
ã€ &amp; 3400  &amp; ã &amp; 3401  &amp; ã‚ &amp; 3402  &amp; ãƒ &amp; 3403  \\
ã„ &amp; 3404  &amp; ã… &amp; 3405  &amp; ã† &amp; 3406  &amp; ã‡ &amp; 3407  \\
ãˆ &amp; 3408  &amp; ã‰ &amp; 3409  &amp; ãŠ &amp; 340A  &amp; ã‹ &amp; 340B  \\
ãŒ &amp; 340C  &amp; ã &amp; 340D  &amp; ãŽ &amp; 340E  &amp; ã &amp; 341F  \\
ã &amp; 3410  &amp; ã‘ &amp; 3411  &amp; ã’ &amp; 3412  &amp; ã“ &amp; 3413  \\
ã” &amp; 3414  &amp; ã• &amp; 3415  &amp; ã– &amp; 3416  &amp; ã— &amp; 3417  \\
ã˜ &amp; 3418  &amp; ã™ &amp; 3419  &amp; ãš &amp; 341A  &amp; ã› &amp; 341B  \\
ãœ &amp; 341C  &amp; ã &amp; 341D  &amp; ãž &amp; 341E  &amp; ãŸ &amp; 341F  \\[1ex]
ð&nbsp;€€ &amp; 20000 &amp; ð&nbsp;€ &amp; 20001 &amp; ð&nbsp;€‚ &amp; 20002 &amp; ð&nbsp;€ƒ &amp; 20003 \\
ð&nbsp;€„ &amp; 20004 &amp; ð&nbsp;€… &amp; 20005 &amp; ð&nbsp;€† &amp; 20006 &amp; ð&nbsp;€‡ &amp; 20007 \\
ð&nbsp;€ˆ &amp; 20008 &amp; ð&nbsp;€‰ &amp; 20009 &amp; ð&nbsp;€Š &amp; 2000A &amp; ð&nbsp;€‹ &amp; 2000B \\
ð&nbsp;€Œ &amp; 2000C &amp; ð&nbsp;€ &amp; 2000D &amp; ð&nbsp;€Ž &amp; 2000E &amp; ð&nbsp;€ &amp; 2000F \\
ð&nbsp;€ &amp; 20010 &amp; ð&nbsp;€‘ &amp; 20011 &amp; ð&nbsp;€’ &amp; 20012 &amp; ð&nbsp;€“ &amp; 20013 \\
ð&nbsp;€” &amp; 20014 &amp; ð&nbsp;€• &amp; 20015 &amp; ð&nbsp;€– &amp; 20016 &amp; ð&nbsp;€— &amp; 20017 \\
ð&nbsp;€˜ &amp; 20018 &amp; ð&nbsp;€™ &amp; 20019 &amp; ð&nbsp;€š &amp; 2001A &amp; ð&nbsp;€› &amp; 2001B \\
ð&nbsp;€œ &amp; 2001C &amp; ð&nbsp;€ &amp; 2001D &amp; ð&nbsp;€ž &amp; 2001E &amp; ð&nbsp;€Ÿ &amp; 2001F \\
\end{tabular}
\end{table}
\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-fallback&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-example-subCJKblock.tex}}
%
%    \begin{macrocode}
%&lt;*ex-block&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{article}
\usepackage{xeCJK}
\usepackage{array}
\xeCJKDeclareSubCJKBlock{Ext-A} { "3400 -&gt; "4DBF }
\xeCJKDeclareSubCJKBlock{Ext-B} { "20000 -&gt; "2A6DF }
\xeCJKDeclareSubCJKBlock{Kana}  { "3040 -&gt; "309F, "30A0 -&gt; "30FF, "31F0 -&gt; "31FF, }
\xeCJKDeclareSubCJKBlock{Hangul}{ "1100 -&gt; "11FF, "3130 -&gt; "318F, "A960 -&gt; "A97F, "AC00 -&gt; "D7AF }
\setCJKmainfont[Ext-A=SimHei,Ext-B=SimSun-ExtB]{SimSun}
\setCJKmainfont[Kana]{Meiryo}
\setCJKmainfont[Hangul]{Malgun Gothic}
\parindent=2em
\begin{document}
\long\def\showtext{%
ä¸­æ—¥éŸ©è¶Šç»Ÿä¸€è¡¨æ„æ–‡å­—ï¼ˆè‹±è¯­ï¼šCJKV Unified Ideographsï¼‰ï¼Œæ—§ç§°ä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—ï¼ˆè‹±è¯­ï¼šCJK Unified Ideographsï¼‰ï¼Œä¹Ÿç§°ç»Ÿä¸€æ±‰å­—ï¼ˆè‹±è¯­ï¼šUnihanï¼‰ï¼Œç›®çš„æ˜¯è¦æŠŠåˆ†åˆ«æ¥è‡ªä¸­æ–‡ã€æ—¥æ–‡ã€éŸ©æ–‡ã€è¶Šæ–‡ã€å£®æ–‡ä¸­ï¼Œå¯¹äºŽç›¸åŒèµ·æºã€æœ¬ä¹‰ç›¸åŒã€å½¢çŠ¶ä¸€æ&nbsp;·æˆ–ç¨å¼‚çš„è¡¨æ„æ–‡å­—ï¼ˆä¸»è¦ä¸ºæ±‰å­—ï¼Œä½†ä¹Ÿæœ‰ä»¿æ±‰å­—å¦‚ï¼šæ–¹å—å£®å­—ã€æ—¥æ–‡æ±‰å­—ï¼ˆã‹ã‚“ã˜ / kanjiï¼‰ã€éŸ©æ–‡æ±‰å­—ï¼ˆí•œìž / hanjaï¼‰ã€è¶Šå—çš„å–ƒå­—ï¼ˆChá»¯ NÃ´mï¼‰ä¸Žè¶Šæ–‡æ±‰å­—ï¼ˆChá»¯ Nhoï¼Œåœ¨è¶Šå—ä¹Ÿç§°ä½œå„’å­—ï¼‰ï¼Œåº”èµ‹äºˆå…¶åœ¨ISO 10646åŠç»Ÿä¸€ç&nbsp;æ&nbsp;‡å‡†ä¸­æœ‰ç›¸åŒç¼–ç&nbsp;ã€‚æ­¤è®¡åˆ’åŽŸæœ¬åªåŒ…å«ä¸­æ–‡ã€æ—¥æ–‡åŠéŸ©æ–‡ä¸­æ‰€ä½¿ç”¨çš„æ±‰å­—ï¼Œæ˜¯ä»¥æ—§ç§°ä¸­æ—¥éŸ©ç»Ÿä¸€è¡¨æ„æ–‡å­—ï¼ˆCJKï¼‰ã€‚åŽæ¥ï¼Œæ­¤è®¡åˆ’åŠ&nbsp;å…¥äº†è¶Šæ–‡çš„å–ƒå­—ï¼Œæ‰€ä»¥åˆç§°ä¸­æ—¥éŸ©è¶Šç»Ÿä¸€è¡¨æ„æ–‡å­—ï¼ˆCJKVï¼‰ã€‚

CJKçµ±åˆæ¼¢å­—ï¼ˆã‚·ãƒ¼ã‚¸ã‚§ãƒ¼ã‚±ãƒ¼ã¨ã†ã”ã†ã‹ã‚“ã˜ã€CJK Unified Ideographsï¼‰ã¯ã€ISO/IEC 10646 (Universal Multiple-Octet Coded Character Set, ç•¥ç§° UCS) ãŠã‚ˆã³ Unicodeã«ã¦æŽ¡ç”¨ã•ã‚Œã¦ã„ã‚‹ç¬¦å·åŒ–ç”¨æ¼¢å­—é›†åˆãŠã‚ˆã³ãã®ç¬¦å·è¡¨ã§ã‚ã‚‹ã€‚CJKçµ±åˆæ¼¢å­—ã®åç§°ã¯ã€ä¸­å›½èªž(Chinese)ã€æ—¥æœ¬èªž(Japanese)ã€éŸ“å›½èªž(Korean)ã§ä½¿ã‚ã‚Œã¦ã„ã‚‹æ¼¢å­—ã‚’ã²ã¨ã¾ã¨ã‚ã«ã—ãŸã“ã¨ã‹ã‚‰ãã¦ã„ã‚‹ã€‚CJKçµ±åˆæ¼¢å­—ã®åˆç‰ˆã§ã‚ã‚‹ Unified Repertoire and Ordering (URO) ç¬¬äºŒç‰ˆã¯1992å¹´ã«åˆ¶å®šã•ã‚ŒãŸãŒã€1994å¹´ã«ãƒ™ãƒˆãƒŠãƒ&nbsp;ã§ä½¿ã‚ã‚Œã¦ã„ãŸæ¼¢å­—ã‚‚å«ã‚ã‚‹ã“ã¨ã«ã—ãŸãŸã‚ã€CJKVã¨å‘¼ã°ã‚Œã‚‹äº‹ã‚‚ã‚ã‚‹ã€‚CJKVã¯ã€ä¸­å›½èªžãƒ»æ—¥æœ¬èªžãƒ»éŸ“å›½èªžãƒ»ãƒ™ãƒˆãƒŠãƒ&nbsp;èªž (è‹±èªž: Chinese-Japanese-Korean-Vietnamese) ã®ç•¥ã€‚ç‰¹ã«ã€ãã®4è¨€èªžã§å…±é€šã—ã¦ä½¿ã‚ã‚Œã‚‹ã€ã¾ãŸã¯ä½¿ã‚ã‚Œã¦ã„ãŸæ–‡å­—ä½“ç³»ã§ã‚ã‚‹æ¼¢å­—ï¼ˆãƒãƒ¥ãƒŽãƒ&nbsp;ã‚’å«ã‚€ï¼‰ã®ã“ã¨ã€‚ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®å›½éš›åŒ–ã€ä¸­ã§ã‚‚æ–‡å­—ã‚³ãƒ¼ãƒ‰ã«é–¢ã™ã‚‹åˆ†é‡Žã§ç”¨ã„ã‚‰ã‚Œã‚‹ã€‚

\CJKspace
í•œì¤‘ì¼ì›” í†µí•© í•œìž(ë˜ëŠ” í•œì¤‘ì¼ í†µí•© í•œìž)ëŠ” ìœ&nbsp;ë‹ˆì½”ë“œì— ë‹´ê²¨ ìžˆëŠ” í•œìžë“¤ì˜ ì§‘í•©ìœ¼ë¡œ, í•œêµ­, ì¤‘êµ­, ì¼ë³¸ì—ì„œ ì“°ì´ëŠ” í•œìžë¥¼ ë¬¶ì€ ê²ƒì´ê¸° ë•Œë¬¸ì— ë¨¸ë¦¬ ê¸€ìžë¥¼ ë”°ì„œ í•œì¤‘ì¼(CJK) í†µí•© í•œìžë¼ê³&nbsp; ë¶ˆë&nbsp;€ëŠ”ë°, ìµœê·¼ì—ëŠ” ë²&nbsp;íŠ¸ë‚¨ì—ì„œ ì“°ì´ëŠ” í•œìžë„ ì¶”ê°€ë˜ì—ˆê¸°ì— í•œì¤‘ì¼ì›”(CJKV) í†µí•© í•œìžë¡œ ë¶€ë¥´ê²Œ ë˜ì—ˆë‹¤.

ì²˜ìŒì— ìœ&nbsp;ë‹ˆì½”ë“œì—ëŠ” 65,536($=2^{16}$)ìžë§Œ ë“¤ì–´ê°ˆ ìˆ˜ ìžˆì—ˆê¸° ë•Œë¬¸ì—, ê°€ìž¥ ë§Žì€ ë¬¸ìžê°€ ë°°ë‹¹ë˜ëŠ” í•œìžë¥¼ ìœ„í•´ì„œ í•œêµ­, ì¤‘êµ­, ì¼ë³¸ì—ì„œ ì‚¬ìš©í•˜ëŠ” í•œìž ì¤‘ì— ëª¨ì–‘ì´ ìœ&nbsp;ì‚¬í•˜ë©° ê·¸ ëœ»ì´ ê°™ì€ ê¸€ìžë¥¼ ê°™ì€ ì½”ë“œë¡œ í†µí•©í–ˆë‹¤. ë”°ë¼ì„œ ë¬¸ìž ì½”ë“œë§Œìœ¼ë¡œ ê·¸ í•œìžê°€ ì‚¬ìš©ë˜ëŠ” ì–¸ì–´ë¥¼ ì•Œì•„ ë‚¼ ìˆ˜ ì—†ëŠ”ë°, ë‹¤ë§Œ ì¤‘êµ­ì˜ ê°„ì²´ìžë‚˜ ë²ˆì²´ìž, ì¼ë³¸ì˜ êµ¬ìžì²´ë‚˜ ì‹&nbsp;ìžì²´ ë“± ë¶„ëª…í•˜ê²Œ ëª¨ì–‘ì´ ë‹¤ë¥¸ ê¸€ìžëŠ” ë³„ë„ì˜ ë¶€í˜¸ë¥¼ í•&nbsp;ë‹¹í•˜ê³&nbsp; ìžˆë‹¤. ì´ëŸ° ë¬¸ìž í•&nbsp;ë‹¹ ì&nbsp;•ì±…ì— ë°˜ë°œí•˜ì—¬ TRONê³¼ ê°™ì€ ì¸ì½”ë”©ì´ ë§Œë“¤ì–´ì§€ê¸°ë„ í–ˆìœ¼ë‚˜, ì‹¤ì&nbsp;œë¡œ í†µí•©ëœ í•œìžì˜ ì°¨ì´ê°€ ë³„ë¡œ í¬ì§€ ì•Šê¸° ë•Œë¬¸ì— ë¬¸ì&nbsp;œê°€ ë˜ì§€ ì•ŠëŠ”ë‹¤ëŠ” ì˜ê²¬ë„ ìžˆë‹¤.
\CJKnospace}
\showtext

\bigskip
\xeCJKCancelSubCJKBlock{Kana,Hangul}
\showtext

\bigskip
\xeCJKRestoreSubCJKBlock{Hangul}
\showtext

\begin{table}[ht]
\caption{ç”Ÿåƒ»å­—æµ‹è¯•}
\medskip\centering
\begin{tabular}{*4{|c&gt;{\ttfamily U+}l}|}
ã€ &amp; 3400  &amp; ã &amp; 3401  &amp; ã‚ &amp; 3402  &amp; ãƒ &amp; 3403  \\
ã„ &amp; 3404  &amp; ã… &amp; 3405  &amp; ã† &amp; 3406  &amp; ã‡ &amp; 3407  \\
ãˆ &amp; 3408  &amp; ã‰ &amp; 3409  &amp; ãŠ &amp; 340A  &amp; ã‹ &amp; 340B  \\
ãŒ &amp; 340C  &amp; ã &amp; 340D  &amp; ãŽ &amp; 340E  &amp; ã &amp; 341F  \\
ã &amp; 3410  &amp; ã‘ &amp; 3411  &amp; ã’ &amp; 3412  &amp; ã“ &amp; 3413  \\
ã” &amp; 3414  &amp; ã• &amp; 3415  &amp; ã– &amp; 3416  &amp; ã— &amp; 3417  \\
ã˜ &amp; 3418  &amp; ã™ &amp; 3419  &amp; ãš &amp; 341A  &amp; ã› &amp; 341B  \\
ãœ &amp; 341C  &amp; ã &amp; 341D  &amp; ãž &amp; 341E  &amp; ãŸ &amp; 341F  \\[1ex]
ð&nbsp;€€ &amp; 20000 &amp; ð&nbsp;€ &amp; 20001 &amp; ð&nbsp;€‚ &amp; 20002 &amp; ð&nbsp;€ƒ &amp; 20003 \\
ð&nbsp;€„ &amp; 20004 &amp; ð&nbsp;€… &amp; 20005 &amp; ð&nbsp;€† &amp; 20006 &amp; ð&nbsp;€‡ &amp; 20007 \\
ð&nbsp;€ˆ &amp; 20008 &amp; ð&nbsp;€‰ &amp; 20009 &amp; ð&nbsp;€Š &amp; 2000A &amp; ð&nbsp;€‹ &amp; 2000B \\
ð&nbsp;€Œ &amp; 2000C &amp; ð&nbsp;€ &amp; 2000D &amp; ð&nbsp;€Ž &amp; 2000E &amp; ð&nbsp;€ &amp; 2000F \\
ð&nbsp;€ &amp; 20010 &amp; ð&nbsp;€‘ &amp; 20011 &amp; ð&nbsp;€’ &amp; 20012 &amp; ð&nbsp;€“ &amp; 20013 \\
ð&nbsp;€” &amp; 20014 &amp; ð&nbsp;€• &amp; 20015 &amp; ð&nbsp;€– &amp; 20016 &amp; ð&nbsp;€— &amp; 20017 \\
ð&nbsp;€˜ &amp; 20018 &amp; ð&nbsp;€™ &amp; 20019 &amp; ð&nbsp;€š &amp; 2001A &amp; ð&nbsp;€› &amp; 2001B \\
ð&nbsp;€œ &amp; 2001C &amp; ð&nbsp;€ &amp; 2001D &amp; ð&nbsp;€ž &amp; 2001E &amp; ð&nbsp;€Ÿ &amp; 2001F \\
\end{tabular}
\end{table}
\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-block&gt;
%    \end{macrocode}
%
%
% \subsection{\pkg{xeCJK-example-CJKecglue.tex}}
%
%    \begin{macrocode}
%&lt;*ex-ecglue&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{minimal}
\usepackage{xeCJK}
\setCJKmainfont[BoldFont=SimHei]{SimSun}
\long\def\showtext{%
 è¿™æ˜¯ English ä¸­æ–‡ {\itshape Chinese} ä¸­æ–‡    \TeX\
  é—´éš” \textit{Italic} ä¸­æ–‡\textbf{å­—ä½“} a æ•°å­¦ $b$ æ•°å­¦ $c$ $d$\par
 è¿™æ˜¯Englishä¸­æ–‡{\itshape Chinese}ä¸­æ–‡\TeX\
 é—´éš”\textit{Italic}ä¸­æ–‡\textbf{å­—ä½“}aæ•°å­¦$b$æ•°å­¦$c$ $d$\par
This is an example. è¿™æ˜¯ä¸€ä¸ªä¾‹å­}
\begin{document}
\showtext

\hrulefill\bigskip

\xeCJKsetup{xCJKecglue=\quad}
\showtext
\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-ecglue&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-example-checksingle.tex}}
%
%    \begin{macrocode}
%&lt;*ex-single&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{minimal}
\usepackage{xeCJK}
\setCJKmainfont{SimSun}
\long\def\showtext{ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åã€‚
\[x^2+y^2\]
ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åã€‚
$$x^2+y^2$$
ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åã€‚
\begin{equation}
x^2+y^2
\end{equation}
ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹åã€‚}
\begin{document}
\hsize=30em
\parindent=0pt
\showtext

\hrulefill\bigskip

\xeCJKsetup{CheckSingle}
\showtext

\hrulefill\bigskip

\xeCJKsetup{PlainEquation}
\showtext
\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-single&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-example-CJKfntef.tex}}
%
%    \begin{macrocode}
%&lt;*ex-fntef&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{ctexart}
\usepackage{xcolor}
\usepackage{xeCJKfntef}
\xeCJKDeclareSubCJKBlock{test}{ `æ®† , `å·² }
\setCJKmainfont[test=SimHei]{SimSun}

\def\showtext{%
  åº„å­æ›°ï¼šâ€œå¾ç”Ÿä¹Ÿæœ‰æ¶¯ï¼Œè€ŒçŸ¥ä¹Ÿæ—&nbsp;æ¶¯ã€‚ä»¥æœ‰æ¶¯éšæ—&nbsp;æ¶¯ï¼Œæ®†å·²ï¼å·²è€Œä¸ºçŸ¥è€…ï¼Œæ®†è€Œå·²çŸ£ï¼%
  ä¸ºå–„æ—&nbsp;è¿‘åï¼Œä¸ºæ¶æ—&nbsp;è¿‘åˆ‘ï¼Œç¼˜ç£ä»¥ä¸ºç»ï¼Œå¯ä»¥ä¿èº«ï¼Œå¯ä»¥å…¨ç”Ÿï¼Œå¯ä»¥å…»äº²ï¼Œå¯ä»¥å°½å¹´ã€‚â€}
\newcommand\CJKfntef[1]{%
  \csname#1\endcsname{\showtext}\par
  \csname#1\endcsname*{\showtext}\par
  \CJKunderdot{\showtext\csname#1\endcsname{\showtext}}\par
  \CJKunderdot{\showtext\csname#1\endcsname*{\showtext}}\par
  \csname#1\endcsname{\showtext\CJKunderdot{\showtext}}\par
  \csname#1\endcsname*{\showtext\CJKunderdot{\showtext}}\par\bigskip}

\begin{document}

\section{\textsf{xeCJKfntef} çš„\CJKunderdot{ç®€å•æµ‹è¯•æ–‡ä»¶}}

\CJKunderline{æ±‰ å­—}\CJKunderline{åŠ&nbsp;ä¸‹åˆ’çº¿}
\varCJKunderline{æ±‰å­—}\varCJKunderline{åŠ&nbsp;ä¸‹åˆ’çº¿}
\CJKunderanyline{0.5em}{\sixly \kern-.021em\char58 \kern-.021em}{è‡ªå®šä¹‰ä¸‹åˆ’çº¿}
\CJKunderanyline{0.2em}{\kern-.03em\vtop{\kern.2ex\hrule width.2em\kern 0.11em
  \hrule height 0.1em}\kern-.03em}{è‡ªå®šä¹‰ä¸‹åˆ’çº¿}

\CJKunderanyline{0.5em}{-}{\showtext}

\CJKunderanysymbol{0.2em}{-}{\showtext}

\CJKunderdot{\showtext}

\hrule depth \dp\strutbox width 0 pt \relax

\begin{CJKfilltwosides}{40mm}
ä¸¤ç«¯åˆ†æ•£å¯¹é½\\
åˆ†æ•£å¯¹é½\\
\CJKunderdot{æ±‰å­—å¯åŠ&nbsp;ç‚¹}\\
\CJKunderline{æ±‰å­—å¯åŠ&nbsp;ä¸‹åˆ’çº¿}
\end{CJKfilltwosides}

\hrule depth \dp\strutbox width 0 pt \relax

\CJKfntef{CJKunderline}
\CJKfntef{CJKunderwave}
\CJKfntef{CJKunderdblline}
\CJKfntef{CJKsout}
\CJKfntef{CJKxout}

\def\Book{\CJKunderwave-}
\def\Noun{\CJKunderline-}

å¦‚ä¸Šæ‰€è¿°ï¼Œ\Book{ä¸­åœ‹æ–‡å­¸å²}åŽŸæ˜¯\Noun{å¾©æ—¦å¤§å­¸å‡ºç‰ˆç¤¾}å‡ºç‰ˆçš„ï¼Œ\Book{ä¸­åœ‹æ–‡å­¸å²æ–°è‘—}å‰‡ç”±\Noun{ä¸Šæµ·æ–‡è—å‡ºç‰ˆç¤¾}å‡ºç‰ˆã€‚ç¾æ‰¿\Noun{å¾©æ—¦å¤§å­¸å‡ºç‰ˆç¤¾}\Noun{è³€è–é‚}å…ˆç”Ÿçš„ç››æƒ…å’Œ\Noun{ä¸Šæµ·æ–‡è—å‡ºç‰ˆç¸½ç¤¾}\Noun{æ¥Šç›Šè}ã€\Noun{ä½•æ‰¿å‰}å…ˆç”Ÿä»¥åŠæœ‰é—œè²&nbsp;è²¬äºº\Noun{é™³é³´è¯}å…ˆç”Ÿçš„é«˜èª¼ï¼Œæ­¤æ›¸å¢žè¨‚æœ¬æ”¹ç”±å…©ç¤¾è¯åˆå‡ºç‰ˆã€‚\Noun{è³€è–é‚}å…ˆç”Ÿä¸¦èˆ‡\Noun{æœæ¦®æ&nbsp;¹}å‰¯ç¤¾é•·ã€\Noun{éŸ“çµæ&nbsp;¹}ç·¨å¯©å…±åŒæ“”ä»»æ­¤æ›¸çš„è²¬ä»»ç·¨è¼¯ã€‚å°ä¸Šè¿°è«¸ä½å…ˆç”Ÿè¬¹åœ¨é€™è£¡è¡¨ç¤ºè¡·å¿ƒçš„æ„Ÿè¬ã€‚å°\Book{ä¸­åœ‹æ–‡å­¸å²æ–°è‘—}åŽŸç‰ˆçš„è²¬ä»»ç·¨è¼¯\Noun{æˆ´ä¿Š}å…ˆç”Ÿï¼ˆç¾ç‚º\Noun{ä¸Šæµ·ä¸‰è¯æ›¸åº—}å‰¯ç¸½ç¶“ç†ï¼‰ä¹Ÿåœ¨æ­¤ä¸€ä½µè‡´è¬ã€‚

\Noun{èˆ‡æ–‡å­¸å²çš„}\Noun{æ‡‰æœ‰ä»»å‹™}\Noun{å°æ–‡å­¸ç™¼å±•éŽç¨‹}\Noun{çš„å…§åœ¨è¯ç¹«çš„æè¿°}\Noun{é‚„æœ‰å¾ˆå¤§çš„è·é›¢}\Noun{è‡³æ–¼è·é›¢çš„æ‰€åœ¨}\Noun{æœ¬æ›¸åŽŸå·²æœ‰èªªæ˜Ž}\Book{æ­¤ä¸è´…è¿°}\Book{ç‚ºäº†å°å­¸è¡“è²&nbsp;è²¬}\Book{æˆ‘å€‘æ±ºå®šé‡å¯«ä¸€éƒ¨ä¸¦è¿…å³å‡ºç‰ˆ}

\Noun{å—æœ}\Noun{æ¢}\Noun{åŠ‰å‹°}\Book{æ–‡å¿ƒé›•é¾}\Book{é¤Šæ°£}

\Noun{éŽŒæ±&nbsp;å’Œé¦¬}\Book{é­”æ³•ç¦æ›¸ç›®éŒ„}\Book{æŸç§‘å­¸çš„è¶…é›»ç£ç&nbsp;²}

\Noun{è¥¿å°¾ç¶­æ–°}\Book{åŒ–ç‰©èªž}\Book{å½ç‰©èªž}\Book{è²“ç‰©èªž}%
\Book{å‚¾ç‰©è¯­}\Book{å›¤ç‰©èªž}\Book{é¬¼ç‰©èªž}\Book{æˆ€ç‰©èªž}\Book{èŠ±ç‰©èªž}

\Noun{å²¡ç”°éº¿é‡Œ}\Book{æˆ‘å€‘ä»æœªçŸ¥é“é‚£å¤©æ‰€çœ‹è¦‹çš„èŠ±çš„åå­—ã€‚}\Book{çµ•åœ’çš„æš´é¢¨é›¨}

\Noun{è™šæ·µçŽ„}\Book{Fate/Zero}\Book{PSYCHO-PASS}\Book{ALDNOAH.ZERO}

\Noun{åŠ‰æµ·æ´‹}\Book{\LaTeX å…¥é–€}

\def\NAME{%
  \x{å¾¡å‚ç¾Žç´}\x{ç™½äº•é»‘å­}\x{æˆ°å&nbsp;´åŽŸç·‹å¤šæœ¨}\x{é˜¿è‰¯è‰¯æœ¨æ­·}%
  \x{å®¿æµ·ä»å¤ª}\x{æœ¬é–“èŠ½è¡£å­}\x{ç€§å·å‰é‡Ž}\x{éŽ–éƒ¨è‘‰é¢¨}%
  \x{è¡›å®®åˆ‡å—£}\x{è¨€å³°ç¶ºç¦®}\x{å¸¸å®ˆæœ±}\x{ç‹¡åš™æ…Žä¹Ÿ}%
  \x{ç•Œå¡šä¼Šå¥ˆå¸†}\x*{è‰¾ç‘Ÿä¾æ‹‰å§†Â·æ²ƒæ–¯Â·è‰¾èŽ‰æ­æ–¯äºž}}

\let\x\Noun\NAME

\let\x\Book\NAME

\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-fntef&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-example-punctstyle.tex}}
%
%    \begin{macrocode}
%&lt;*ex-punctstyle&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{article}
\usepackage[draft,columns=1,margin=false,headings=false]{typogrid}
\usepackage{xeCJK}
\usepackage{xeCJKfntef}
\setCJKmainfont{SimSun}
\xeCJKsetup{AllowBreakBetweenPuncts}
\xeCJKDeclarePunctStyle { mine }
  {
    fixed-punct-ratio       = nan ,
    fixed-margin-width      = 0 pt ,
    mixed-margin-width      = \maxdimen ,
    mixed-margin-ratio      = 0.5 ,
    middle-margin-width     = \maxdimen ,
    middle-margin-ratio     = 0.5 ,
    add-min-bound-to-margin = true ,
    min-bound-to-kerning    = true ,
    kerning-margin-minimum  = 0.1 em ,
    bound-punct-width       = 0 em ,
    enabled-hanging         = true
  }
\xeCJKDeclarePunctStyle { JIS } { bound-punct-ratio = .5 }

\begin{document}
\setlength\parindent{2em}
\newcommand\showexample[1]{%
  \texttt{------ #1 ------}\par\xeCJKsetup{PunctStyle=#1}\showtexts\par}

\newcommand\showtexts{%
ã€Šç¬¬ä¸€å›ž\quad ç”„å£«éšæ¢¦å¹»è¯†é€šçµ\quad è´¾é›¨æ‘é£Žå°˜æ€€é—ºç§€ã€‹\\
ã€Šç¬¬ä¸€å›ž\quad ç”„å£«éšæ¢¦å¹»è¯†é€šçµ\quad è´¾é›¨æ‘é£Žå°˜æ€€é—ºç§€ã€‹

åˆ—ä½çœ‹å®˜ï¼šä½&nbsp;é“æ­¤ä¹¦ä»Žä½•è€Œæ¥ï¼Ÿè¯´èµ·æ&nbsp;¹ç”±ï¼Œè™½è¿‘è’å”ï¼Œç»†æŒ‰åˆ™æ·±æœ‰è¶£å‘³ã€‚å¾…åœ¨ä¸‹å°†æ­¤æ¥åŽ†æ³¨æ˜Žï¼Œæ–¹ä½¿é˜…è€…äº†ç„¶ä¸æƒ‘ã€‚

\CJKunderline*{åŽŸæ¥å¥³å¨²æ°ç‚¼çŸ³è¡¥å¤©ä¹‹æ—¶ï¼ŒäºŽå¤§è’å±±æ—&nbsp;ç¨½å´–ç‚¼æˆé«˜ç»åäºŒä¸ˆã€æ–¹ç»äºŒåå››ä¸ˆé¡½çŸ³ä¸‰ä¸‡å…­åƒäº”ç™¾é›¶ä¸€å—ã€‚å¨²çš‡æ°åªç”¨äº†ä¸‰ä¸‡å…­åƒäº”ç™¾å—ï¼Œåªå•å•å‰©äº†ä¸€å—æœªç”¨ï¼Œä¾¿å¼ƒåœ¨æ­¤å±±é’åŸ‚å³°ä¸‹ã€‚è°çŸ¥æ­¤çŸ³è‡ªç»ç…†ç‚¼ä¹‹åŽï¼Œçµæ€§å·²é€šï¼Œå›&nbsp;è§ä¼—çŸ³ä¿±å¾—è¡¥å¤©ï¼Œç‹¬è‡ªå·±æ—&nbsp;æä¸å&nbsp;ªå…¥é€‰ï¼Œé‚è‡ªæ€¨è‡ªå¹ï¼Œæ—¥å¤œæ‚²å·æƒ­æ„§ã€‚}

ä¸€æ—¥ï¼Œæ­£å½“å—Ÿæ‚¼ä¹‹é™…ï¼Œä¿„è§ä¸€åƒ§ä¸€é“è¿œè¿œè€Œæ¥ï¼Œç”Ÿå¾—éª¨æ&nbsp;¼ä¸å‡¡ï¼Œä¸°ç¥žè¿¥åˆ«ï¼Œè¯´è¯´ç¬‘ç¬‘ï¼Œæ¥è‡³å³°ä¸‹ï¼ŒåäºŽçŸ³è¾¹ï¼Œé«˜è°ˆå¿«è®ºï¼šå…ˆæ˜¯è¯´äº›äº‘å±±é›¾æµ·ã€ç¥žä»™çŽ„å¹»ä¹‹äº‹ï¼ŒåŽä¾¿è¯´åˆ°çº¢å°˜ä¸­è£åŽå¯Œè´µã€‚æ­¤çŸ³å¬äº†ï¼Œä¸è§‰æ‰“åŠ¨å‡¡å¿ƒï¼Œä¹Ÿæƒ³è¦åˆ°äººé—´åŽ»äº«ä¸€äº«è¿™è£åŽå¯Œè´µï¼Œä½†è‡ªæ¨ç²—è&nbsp;¢ï¼Œä¸å¾—å·²ï¼Œä¾¿å£åäººè¨€ï¼Œå‘é‚£åƒ§é“è¯´é“ï¼šâ€œå¤§å¸ˆï¼Œå¼Ÿå­è&nbsp;¢ç‰©ï¼Œä¸èƒ½è§ç¤¼äº†ï¼é€‚é—»äºŒä½è°ˆé‚£äººä¸–é—´è£è€€ç¹åŽï¼Œå¿ƒåˆ‡æ…•ä¹‹ã€‚å¼Ÿå­è´¨è™½ç²—è&nbsp;¢ï¼Œæ€§å´ç¨é€šï¼Œå†µè§äºŒå¸ˆä»™å½¢é“ä½“ï¼Œå®šéžå‡¡å“ï¼Œå¿…æœ‰è¡¥å¤©æµŽä¸–ä¹‹æï¼Œåˆ©ç‰©æµŽäººä¹‹å¾·ã€‚å¦‚è’™å‘ä¸€ç‚¹æ…ˆå¿ƒï¼Œæºå¸¦å¼Ÿå­å¾—å…¥çº¢å°˜ï¼Œåœ¨é‚£å¯Œè´µåœºä¸­ï¼Œæ¸©æŸ”ä¹¡é‡Œå—äº«å‡&nbsp;å¹´ï¼Œè‡ªå½“æ°¸ä½©æ´ªæ©ï¼Œä¸‡åŠ«ä¸å¿˜ä¹Ÿï¼â€äºŒä»™å¸ˆå¬æ¯•ï¼Œé½æ†¨ç¬‘é“ï¼šâ€œå–„å“‰ï¼Œå–„å“‰ï¼é‚£çº¢å°˜ä¸­æœ‰å´æœ‰äº›ä¹äº‹ï¼Œä½†ä¸èƒ½æ°¸è¿œä¾æƒï¼›å†µåˆæœ‰â€˜ç¾Žä¸­ä¸è¶³ï¼Œå¥½äº‹å¤šç£¨â€™å…«ä¸ªå­—ç´§ç›¸è¿žå±žï¼Œçž¬æ¯é—´åˆ™åˆä¹æžæ‚²ç”Ÿï¼Œäººéžç‰©æ¢ï¼Œç©¶ç«Ÿæ˜¯åˆ°å¤´ä¸€æ¢¦ï¼Œä¸‡å¢ƒå½’ç©ºï¼Œå€’ä¸å¦‚ä¸åŽ»çš„å¥½ã€‚â€è¿™çŸ³å‡¡å¿ƒå·²ç‚½ï¼Œé‚£é‡Œå¬å¾—è¿›è¿™è¯åŽ»ï¼Œä¹ƒå¤è‹¦æ±‚å†å››ã€‚äºŒä»™çŸ¥ä¸å¯å¼ºåˆ¶ï¼Œä¹ƒå¹é“ï¼šâ€œæ­¤äº¦é™æžæ€åŠ¨ï¼Œæ—&nbsp;ä¸­ç”Ÿæœ‰ä¹‹æ•°ä¹Ÿï¼æ—¢å¦‚æ­¤ï¼Œæˆ‘ä»¬ä¾¿æºä½&nbsp;åŽ»å—äº«å—äº«ï¼Œåªæ˜¯åˆ°ä¸å¾—æ„æ—¶ï¼Œåˆ‡èŽ«åŽæ‚”ï¼â€çŸ³é“ï¼šâ€œè‡ªç„¶ï¼Œè‡ªç„¶ã€‚â€é‚£åƒ§åˆé“ï¼šâ€œè‹¥è¯´ä½&nbsp;æ€§çµï¼Œå´åˆå¦‚æ­¤è´¨è&nbsp;¢ï¼Œå¹¶æ›´æ—&nbsp;å¥‡è´µä¹‹å¤„ã€‚å¦‚æ­¤ä¹Ÿåªå¥½è¸®è„šè€Œå·²ã€‚ä¹Ÿç½¢ï¼æˆ‘å¦‚ä»Šå¤§æ–½ä½›æ³•ï¼ŒåŠ©ä½&nbsp;åŠ©ï¼Œå¾…åŠ«ç»ˆä¹‹æ—¥ï¼Œå¤è¿˜æœ¬è´¨ï¼Œä»¥äº†æ­¤æ¡ˆã€‚ä½&nbsp;é“å¥½å¦ï¼Ÿâ€çŸ³å¤´å¬äº†ï¼Œæ„Ÿè°¢ä¸å°½ã€‚é‚£åƒ§ä¾¿å¿µå’’ä¹¦ç¬¦ï¼Œå¤§å±•å¹»æœ¯ï¼Œå°†ä¸€å—å¤§çŸ³ç™»æ—¶å˜æˆä¸€å—é²œæ˜ŽèŽ¹æ´çš„ç¾ŽçŽ‰ï¼Œä¸”åˆç¼©æˆæ‰‡å&nbsp;å¤§å°çš„å¯ä½©å¯æ‹¿ã€‚é‚£åƒ§æ‰˜äºŽæŽŒä¸Šï¼Œç¬‘é“ï¼šâ€œå½¢ä½“å€’ä¹Ÿæ˜¯ä¸ªå®ç‰©äº†ï¼è¿˜åªæ²¡æœ‰å®žåœ¨çš„å¥½å¤„ï¼Œé¡»å¾—å†é•Œä¸Šæ•°å­—ï¼Œä½¿äººä¸€è§ä¾¿çŸ¥æ˜¯å¥‡ç‰©æ–¹å¦™ã€‚ç„¶åŽå¥½æºä½&nbsp;åˆ°é‚£æ˜Œæ˜Žéš†ç››ä¹‹é‚¦ã€è¯—ç¤¼ç°ªç¼¨ä¹‹æ—ã€èŠ±æŸ³ç¹åŽåœ°ã€æ¸©æŸ”å¯Œè´µä¹¡åŽ»å®‰èº«ä¹ä¸šã€‚â€çŸ³å¤´å¬äº†ï¼Œå–œä¸èƒ½ç¦ï¼Œä¹ƒé—®ï¼šâ€œä¸çŸ¥èµäº†å¼Ÿå­é‚£å“ªå‡&nbsp;ä»¶å¥‡å¤„ï¼Ÿåˆä¸çŸ¥æºäº†å¼Ÿå­åˆ°ä½•åœ°æ–¹ï¼Ÿæœ›ä¹žæ˜Žç¤ºï¼Œä½¿å¼Ÿå­ä¸æƒ‘ã€‚â€é‚£åƒ§ç¬‘é“ï¼šâ€œä½&nbsp;ä¸”èŽ«é—®ï¼Œæ—¥åŽè‡ªç„¶æ˜Žç™½çš„ã€‚â€è¯´ç€ï¼Œä¾¿è¢–äº†è¿™çŸ³ï¼ŒåŒé‚£é“äººé£˜ç„¶è€ŒåŽ»ï¼Œç«Ÿä¸çŸ¥æŠ•å¥”ä½•æ–¹ä½•èˆã€‚

\hfill
â€”â€”æ›¹é›ªèŠ¹ã€Šçº¢æ¥¼æ¢¦ã€‹\unskip\unkern}


\showexample{mine}
\showexample{quanjiao}
\showexample{JIS}
\showexample{banjiao}
\showexample{CCT}
\showexample{kaiming}
\showexample{hangmobanjiao}
\showexample{plain}

\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-punctstyle&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-example-verbatim.tex}}
%
%    \begin{macrocode}
%&lt;*ex-verb&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass[a4paper]{article}
\usepackage{xeCJK}
\usepackage{fullpage}
\xeCJKDeclareSubCJKBlock{Hangul}
  { "1100 -&gt; "11FF, "3130 -&gt; "318F, "A960 -&gt; "A97F, "AC00 -&gt; "D7AF }
\setCJKmainfont{Adobe Song Std}
\setCJKmainfont[Hangul]{Adobe Myungjo Std}
%%\setmonofont{Inconsolata}
%%\setmonofont{Source Code Pro}
%%\setCJKmonofont{Adobe Kaiti Std}
\setmonofont{TeX Gyre Cursor}
\setCJKmonofont{Adobe Fangsong Std}
\begin{document}

\begin{verbatim}
*************************************************************
*                                                           *
*      ç²¾è‡´ç”²ç‰ˆçº¢æ¥¼æ¢¦ - ç²¾è‡´å·¥ä½œå®¤ç‰¹åˆ«å¥‰çŒ®ï¼ˆ2010å¹´9æœˆï¼‰     *
*                                                           *
*        GBKç®€ä½“ã€GBKç¹ä½“ã€Big5ç¹ä½“ã€PDFç®€ä½“ã€PDFç¹ä½“       *
*                                                           *
*  ä¸º GBKã€Big5 ç‰¹åˆ«åº¦èº«è®¢åˆ¶ï¼Œå¹¶ç»åå¤ä¿®è®¢ï¼Œæ–¹ä¾¿çº¯æ–‡æœ¬é˜…è¯»  *
*                                                           *
*  ç²¾è‡´ç”²ã€ä¹™ç‰ˆçº¢æ¥¼æ¢¦ä¸‹è½½ä¸“é¡µ                               *
*  http://www.speedy7.com/cn/stguru/gb2312/redmansions.htm  *
*  http://www.speedy7.com/cn/stguru/big5/redmansions.htm    *
*                                                           *
*  æ­¤ç”µå­æ–‡ä»¶å¯éšæ„ä¼&nbsp;æ’­ã€å‘å¸ƒã€ä¸‹è½½ã€‚                       *
*  ä¼&nbsp;æ’­æ—¶å»ºè®®ä¿ç•™æ­¤ç‰ˆæœ¬è¯´æ˜Žä¾›æŸ¥é˜…ä¸Žè¯†åˆ«ã€‚                   *
*  æœªç»ä¿®è®¢è€…åŒæ„ï¼Œä¸å¾—å°†æ­¤ç‰ˆæœ¬ç”¨äºŽå•†ä¸šç”¨é€”ã€‚               *
*  å¦‚æ‚¨å¯¹çº¢æ¥¼æ¢¦ä¸å…·æ·±å…¥äº†è§£ï¼Œè¯·å‹¿éšä¾¿ä¿®æ”¹å…¶ä¸­çš„å†…å®¹ã€‚       *
*                                                           *
*************************************************************
\end{verbatim}

\verb|a æ±‰ å­— b|

\verb*|a æ±‰ å­— b|

\begin{verbatim}
lang_set = {
  ["English"]   = lang.en,
  ["FranÃ§ais"]  = lang.fr,
  ["EspaÃ±ol"]   = lang.es,
  ["ä¸­æ–‡"]      = lang.zh,
  ["æ—¥æœ¬èªž"]    = lang.ja,
  ["í•œêµ­ì–´"]    = lang.ko,
}
\end{verbatim}

\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-verb&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-example-CM.tex}}
%
%    \begin{macrocode}
%&lt;*ex-cm&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{article}
\usepackage{xeCJK}
\usepackage{hologo}

\setCJKmainfont{HanaMinA} %% http://fonts.jp/hanazono/

\begin{document}

\hologo{XeTeX} ã§IVSã‚’ä½¿ã†ãƒ†ã‚¹ãƒˆã€‚

æ¶ˆó&nbsp;„€åŒ–ó&nbsp;„€å™¨ó&nbsp;„‚ / æ¶ˆó&nbsp;„ç«å™¨ó&nbsp;„ƒ / æ¶ˆó&nbsp;„‚åŒ–ó&nbsp;„å™¨ó&nbsp;„„

æ¶ˆó&nbsp;„ƒç«å™¨ó&nbsp;„… / æ¶ˆåŒ–ó&nbsp;„‚å™¨ó&nbsp;„† / æ¶ˆç«å™¨ó&nbsp;„‡

æ¶ˆåŒ–ó&nbsp;„ƒå™¨ó&nbsp;„ˆ / æ¶ˆç«å™¨ó&nbsp;„‰ / è¾»ó&nbsp;„‚è¾»ó&nbsp;„ƒè¾»ó&nbsp;„„è¾»ó&nbsp;„…ã€€

\CJKfontspec{Meiryo}

ã‹

ã‹ã‚™ã‹ã‚š

ã¼ã½

ã»ã‚™ã»ã‚š

ã°ã±

ã¯ã‚™ã¯ã‚š

\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-cm&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-example-listings.tex}}
%
%    \begin{macrocode}
%&lt;*ex-listings&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{listings,xcolor}
\usepackage{showexpl}

\usepackage{xeCJK}
\setCJKmainfont{HanaMinA}
\setCJKmonofont{SimSun}
\xeCJKDeclareSubCJKBlock{Kana}  { "3040 -&gt; "309F, "30A0 -&gt; "30FF, "31F0 -&gt; "31FF }
\setCJKmonofont[Kana]{Meiryo}
\setmonofont{Latin Modern Mono Light}

\makeatletter
\lstset{%
  basicstyle=\small\ttfamily,breakindent=4\lst@width,
  numbers=left,numberstyle=\tiny\color{gray},
  commentstyle=\color{green!50!black},keywordstyle=\color{blue}\bfseries,
  identifierstyle=\color{violet},stringstyle=\color{brown},
  escapebegin=\normalfont}
\lstnewenvironment{cppcode}[1][]
  {\lstset{language=C++,#1}}
  {}
\makeatother

\begin{document}

\section{\lstinline{\\lstinline} æµ‹è¯•}

\section{\lstinline|ç”²*ä¹™| æµ‹è¯•}

\lstinline|abcæ±‰å­—abc|

\lstinline|ç”²*ä¹™|

\lstinline[mathescape]|æ•°å­¦å…¬å¼$x^2+y^2$|

\section{\lstinline{lstlisting} çŽ¯å¢ƒæµ‹è¯•}

\begin{lstlisting}[basicstyle=\rmfamily]
çº¯æ–‡å­—textæµ‹è¯•
    çº¯æ–‡å­—textæµ‹è¯•
æ–‡å­—+æ–‡å­—
æ–‡å­—ï¼ˆç¬¦å·ï¼‰æ–‡å­—
è¾»ó&nbsp;„‚è¾»ó&nbsp;„ƒè¾»ó&nbsp;„„è¾»ó&nbsp;„…
ã‹ã‹ã‚™ã‹ã‚š
\end{lstlisting}

\begin{lstlisting}
textçº¯æ–‡å­—æµ‹è¯•
\end{lstlisting}

\begin{lstlisting}
text çº¯æ–‡å­—æµ‹è¯•
\end{lstlisting}

\begin{lstlisting}
text,çº¯æ–‡å­—æµ‹è¯•
\end{lstlisting}

\section{è‡ªå®šä¹‰çŽ¯å¢ƒæµ‹è¯•}

\begin{LTXexample}[pos=t,varwidth,numbersep=5pt,columns=fixed]
\begin{cppcode}[escapechar=`,morekeywords=è¿”å›ž]
#define è¿”å›ž return
#include &lt;iostream&gt;
/*
 * å—æ³¨é‡Š
 * `é€ƒé€¸å­—ç¬¦ï¼Œæµ‹è¯•$f(x)$`
 */
int main()
{
    // è¡Œæ³¨é‡Š
    const char *æ¬¢è¿Ž = "hello ä¸–ç•Œï¼ˆãƒ¯ãƒ¼ãƒ«ãƒ‰ï¼‰";
    std::cout &lt;&lt; æ¬¢è¿Ž &lt;&lt; std::endl;
    è¿”å›ž 0;
}
\end{cppcode}
\end{LTXexample}

\section{\texttt{breaklines} æµ‹è¯•}

\begin{lstlisting}[linewidth=10em,frame=single,rulecolor=\color{black},breaklines]
æ–­è¡Œæ–‡å­—textæµ‹è¯•ï¼Œæ–­è¡Œæ–‡å­—textæµ‹è¯•ï¼Œæ–­è¡Œæ–‡å­—textæµ‹è¯•ï¼Œæ–­è¡Œæ–‡å­—textæµ‹è¯•
æ–­è¡Œæ–‡å­—textæµ‹è¯•ï¼Œæ–­è¡Œæ–‡å­—textæµ‹è¯•ï¼Œæ–­è¡Œæ–‡å­—textæµ‹è¯•ï¼Œæ–­è¡Œæ–‡å­—textæµ‹è¯•
\end{lstlisting}

\section{\lstinline|\\lstinputlisting| æµ‹è¯•}

\lstinputlisting[language={[AlLaTeX]TeX}]{\jobname}

\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-listings&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xeCJK-example-mathblock.tex}}
%
%    \begin{macrocode}
%&lt;*ex-mathblock&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass{article}

\usepackage{url}
\usepackage[CJKmath]{xeCJK}

\setCJKmainfont[BoldFont=SimHei]{SimSun}
\setCJKmonofont{KaiTi}

\ExplSyntaxOn
\tl_const:Nn \c_test_text_tl { å¤©åœ°çŽ„é»ƒå®‡å®™æ´ªè’æ—¥æœˆç›ˆæ˜ƒè¾°å®¿åˆ—å¼µå¯’ä¾†æš‘å¾€ç§‹æ”¶å†¬è—é–é¤˜æˆæ­²å¾‹å‘‚èª¿é™½ }
\cs_new:Npn \test_color:n #1
  { \exp_args:No \str_range:nnn { \mdfivesum {#1} } { 1 } { 6 } }
\tl_map_inline:Nn \c_test_text_tl
  {
    \xeCJKDeclareSubCJKBlock {#1} { `#1 }
    \setCJKmainfont
      [ #1 , Color = \test_color:n {#1} , BoldFont = SimHei ] { SimSun }
    \setCJKmonofont [ #1 ] { KaiTi }
  }
\cs_new_protected:Npn \TEST
  {
    \exp_args:No \path { \c_test_text_tl } \par
    \c_test_text_tl \par
    $ \c_test_text_tl $
  }
\ExplSyntaxOff

\begin{document}

\TEST

\bigskip

\bfseries\mathversion{bold}\TEST

\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/ex-mathblock&gt;
%    \end{macrocode}
%
% \subsection{\pkg{xunicode-symbols.tex}}
%
%    \begin{macrocode}
%&lt;*xunicode-symbols&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;@@=xunsym&gt;
%    \end{macrocode}
%
%    \begin{macrocode}
\documentclass[a4paper]{article}
\usepackage[margin=2cm]{geometry}
\usepackage{fontspec}
\usepackage{xunicode-addon}
\usepackage{array,longtable,booktabs}
\usepackage{zref-base}

\setmainfont{FreeSerif}
\newfontfamily\falllbackfont{Segoe UI Symbol}

\makeatletter
\ExplSyntaxOn
\cs_new_protected:Npx \@@_restore_catcode:
  { \char_set_catcode:nn { 0 } { \char_value_catcode:n { 0 } } }
\file_if_exist:nTF { xunicode-commands.tex }
  { \char_set_catcode_comment:n { 0 } }
  { \char_set_catcode_ignore:n { 0 } }
^^@ \tl_new:N \l_@@_command_tl
^^@ \int_new:N \l_@@_command_int
^^@ \iow_new:N \g_@@_command_iow
^^@ \iow_new:N \g_@@_combine_mark_iow
^^@ \ior_new:N \g_@@_unicode_ior
^^@ \prop_new:N \l_@@_command_prop
^^@ \prop_new:N \l_@@_combine_mark_prop
^^@ \prop_new:N \l_@@_combine_marks_prop
^^@ \cs_new_protected:Npn \SaveUTFCommands
^^@   {
^^@     \group_begin:
^^@     \@@_restore_catcode:
^^@     \cs_set_eq:NN \DeclareTextAccent \use_none:nnn
^^@     \cs_set_eq:NN \DeclareUTFComposite \use_none:n
^^@     \cs_set_eq:NN \DeclareUTFEncodedAccent \use_none:nnn
^^@     \cs_set_eq:NN \DeclareUTFDoubleEncodedAccent \use_none:nnn
^^@     \cs_set_eq:NN \DeclareUTFDoubleEncodedSymbol \use_none:nnn
^^@     \cs_set_eq:NN \DeclareUTFCommand \use_none:nn
^^@     \cs_set_eq:NN \DeclareUTFTIPACommand \use_none:n
^^@     \cs_set_eq:NN \DeclareUTFCompositeCommand \use_none:nnn
^^@     \cs_set_eq:NN \DeclareUTFSymbol \@@_save_UTF_command:Nn
^^@     \cs_set_eq:NN \DeclareUTFCompositeSymbol \@@_save_UTF_command:Nnn
^^@     \cs_set_eq:NN \DeclareEncodedCompositeCharacter \@@_save_combine_mark:nnnn
^^@     \cs_set_eq:NN \DeclareEncodedCompositeAccents \@@_save_combine_marks:nnnn
^^@     \DeclareDocumentCommand \DeclareUTFcharacter { O { \UTFencname } m m }
^^@       { \@@_save_UTF_command:NNn \l_@@_command_prop {##3} {##2} }
^^@     \DeclareDocumentCommand \DeclareUTFcomposite { O { \UTFencname } m m m }
^^@       { \@@_save_UTF_command:NNnn \l_@@_command_prop {##3} {##4} {##2} }
^^@     \ReloadXunicode { \UTFencname }
^^@     \ior_open:NnTF \g_@@_unicode_ior { UnicodeData.txt }
^^@       {
^^@         \iow_open:Nn \g_@@_command_iow { xunicode-commands.tex }
^^@         \iow_open:Nn \g_@@_combine_mark_iow { xunicode-combine-marks.tex }
^^@         \ior_map_inline:Nn \g_@@_unicode_ior { \@@_make_table:w ##1 \q_stop }
^^@         \@@_write_combine_marks:
^^@         \ior_close:N \g_@@_unicode_ior
^^@         \iow_close:N \g_@@_command_iow
^^@         \iow_close:N \g_@@_combine_mark_iow
^^@         \group_end:
^^@       }
^^@       {
^^@         \group_end:
^^@         \msg_fatal:nn { @@ } { UnicodeData }
^^@       }
^^@   }
^^@ \msg_new:nnn { @@ } { UnicodeData }
^^@   { File~`UnicodeData.txt`~not~found. }
^^@ \cs_new_protected:Npn \@@_save_UTF_command:Nn
^^@   { \@@_save_UTF_command:NNn \l_@@_command_prop }
^^@ \cs_new_protected:Npn \@@_save_UTF_command:Nnn
^^@   { \@@_save_UTF_command:NNnn \l_@@_command_prop }
^^@ \cs_new_protected:Npn \@@_save_UTF_command:NNn #1#2#3
^^@   { \@@_save_UTF_text_command:Nxx #1 { \use_none:n #3 } { \token_to_str:N #2 } }
^^@ \cs_new_protected:Npn \@@_save_UTF_command:NNnn #1#2#3#4
^^@   {
^^@     \@@_save_UTF_text_command:Nxx #1 { \use_none:n #4 }
^^@       {
^^@         \token_to_str:N #2 \c_left_brace_str
^^@         \tl_if_single:nTF {#3} { \token_to_str:N #3 } { \tl_to_str:n {#3} }
^^@         \c_right_brace_str
^^@       }
^^@   }
^^@ \cs_new_protected:Npn \@@_save_combine_mark:nnnn #1#2#3#4
^^@   { \@@_save_UTF_text_command:Nxx \l_@@_combine_mark_prop {#3} { \token_to_str:N #2 } }
^^@ \cs_new_protected:Npn \@@_save_combine_marks:nnnn #1#2#3#4
^^@   { \@@_save_UTF_text_command:Nxx \l_@@_combine_marks_prop { { "#4 } { "#3 } } { \token_to_str:N #2 } }
^^@ \cs_new_protected:Npn \@@_save_UTF_text_command:Nxx #1#2#3
^^@   { \use:e { \@@_save_UTF_text_command:Nnn \exp_not:N #1 {#2} {#3} } }
^^@ \cs_new_protected:Npn \@@_save_UTF_text_command:Nnn #1#2#3
^^@   {
^^@     \prop_get:NnNTF #1 {#2} \l_@@_command_tl
^^@       { \prop_put:Nno #1 {#2} { \l_@@_command_tl , #3 } }
^^@       { \prop_put:Nnn #1 {#2} {#3} }
^^@   }
^^@ \cs_new_protected:Npn \@@_make_table:w #1 ; #2 ; #3 \q_stop
^^@   {
^^@     \prop_get:NnNT \l_@@_command_prop {#1} \l_@@_command_tl
^^@       {
^^@         \iow_now:Nx \g_@@_command_iow
^^@           { \token_to_str:N \UnicodeTextSymbol { "#1 } { \l_@@_command_tl } {#2} }
^^@       }
^^@     \prop_get:NnNT \l_@@_combine_mark_prop {#1} \l_@@_command_tl
^^@       {
^^@         \iow_now:Nx \g_@@_combine_mark_iow
^^@           { \token_to_str:N \UnicodeCombineMark { "#1 } { \l_@@_command_tl } {#2} }
^^@       }
^^@   }
^^@ \cs_new_protected:Npn \@@_write_combine_marks:
^^@   {
^^@     \prop_map_inline:Nn \l_@@_combine_marks_prop
^^@       {
^^@         \iow_now:Nx \g_@@_combine_mark_iow
^^@           { \token_to_str:N \UnicodeCombineMarks ##1 {##2} }
^^@       }
^^@   }
^^@ \ExplSyntaxOff
^^@ \SaveUTFCommands
^^@ \ExplSyntaxOn
\@@_restore_catcode:
\int_new:N \g_@@_symbol_int
\int_new:N \g_@@_table_int
\DeclareDocumentCommand \UnicodeTextSymbol { m v m }
  {
    \int_gincr:N \g_@@_symbol_int
    \use_none:n #1 &amp;
    \scan_stop:
    \reverse_if:N \tex_iffontchar:D \tex_font:D #1 \exp_stop_f: \falllbackfont \fi:
    \tex_char:D #1 \exp_stop_f: &amp;
    \tl_set:Nn \l_tmpa_clist {#2}
    \clist_use:Nn \l_tmpa_clist { \par }
    \strut
    &amp; #3 \\
  }
\cs_set_eq:NN \UnicodeCombineMark \UnicodeTextSymbol
\DeclareDocumentCommand \UnicodeCombineMarks { m m v }
  {
    \int_gincr:N \g_@@_symbol_int
    \use_none:n #1 ~ \use_none:n #2 &amp;
    \tex_char:D #1 \exp_stop_f: \tex_char:D #2 \exp_stop_f: &amp;
    \tl_set:Nn \l_tmpa_clist {#3}
    \clist_use:Nn \l_tmpa_clist { \par }
    \strut \\
  }
\DeclareDocumentCommand \UTFTABLE { m m }
  {
    \int_gincr:N \g_@@_table_int
    \exp_args:Nx \@@_make_table:nnn { UTFTABLE - \int_use:N \g_@@_table_int } {#1} {#2}
  }
\cs_new_protected:Npn \@@_make_table:nnn #1#2#3
  {
    \section{#2~(\zref@extractdefault{#1}{default}{0})}
    \zref@refused{#1}
    \noindent
    \begin{longtable}[c]{&gt;{\ttfamily\footnotesize}rc&gt;{\ttfamily\footnotesize}p{55mm}&gt;{\tiny}l}
      \toprule
      \multicolumn1c{\normalfont\normalsize USV} &amp;
      \normalfont\normalsize Symbol &amp;
      \normalfont\normalsize Macro(s) &amp;
      \normalfont\normalsize Description \\
      \midrule \endhead
      \bottomrule \endfoot
      \int_gzero:N \g_@@_symbol_int
      \input{#3}
    \end{longtable}
    \group_begin:
      \zref@setcurrent{default}{\int_use:N\g_@@_symbol_int}
      \zref@wrapper@immediate{\zref@labelbyprops{#1}{default}}
    \group_end:
  }
\cs_generate_variant:Nn \@@_make_table:nnn { x }
\ExplSyntaxOff

\begin{document}

\UTFTABLE{Symbols}{xunicode-commands.tex}

\UTFTABLE{Combining Marks}{xunicode-combine-marks.tex}

\end{document}
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/xunicode-symbols&gt;
%    \end{macrocode}
%
% \end{implementation}
%
\endinput
</pre></body></html>