% \iffalse meta-comment
%
% File: ctex-fontset.dtx
% -----------------------------------------------------------------------
%   Copyright (C) 2003--2026
%   CTEX.ORG and any individual authors listed elsewhere in this file.
% -----------------------------------------------------------------------
%   This work may be distributed and/or modified under the conditions   *
%   of the LaTeX Project Public License (LPPL), either version 1.3c of  *
%   this license or (at your option) any later version.                 *
%   The latest version of this license is in                            *
%                                                                       *
%       http://www.latex-project.org/lppl.txt                           *
%                                                                       *
%   and version 1.3c or later is part of all distributions of LaTeX     *
%   version 2008 or later.                                              *
%                                                                       *
%   This work has the LPPL maintenance status `maintained'.             *
% -----------------------------------------------------------------------
%   This work consists of the files ctex.dtx,                           *
%                                   ctex-kernel.dtx,                    *
%                                   ctex-engine.dtx,                    *
%                                   ctex-scheme.dtx,                    *
%                                   ctex-auxpkg.dtx,                    *
%                                   ctex-fontset.dtx,                   *
%                                   ctexpunct.spa,                      *
%                                   ctxdoc.cls,                         *
%                                   ctxdocstrip.tex,                    *
%                                   ctex-zhconv.lua,                    *
%                                   ctex-zhconv-index.lua,              *
%                                   ctex-zhconv-make.lua,               *
%                 the derived files ctex.ins,                           *
%                                   ctex.sty,                           *
%                                   ctexsize.sty,                       *
%                                   ctexheading.sty,                    *
%                                   ctexart.cls,                        *
%                                   ctexbook.cls,                       *
%                                   ctexrep.cls,                        *
%                                   ctexbeamer.cls,                     *
%                                   ctexcap.sty,                        *
%                                   ctexhook.sty,                       *
%                                   ctexpatch.sty,                      *
%                                   ctex-c5size.clo,                    *
%                                   ctex-cs4size.clo,                   *
%                                   ctex-heading-article.def,           *
%                                   ctex-heading-book.def,              *
%                                   ctex-heading-report.def,            *
%                                   ctex-heading-beamer.def,            *
%                                   ctexbackend.cfg,                    *
%                                   ctex-engine-pdftex.def,             *
%                                   ctex-engine-xetex.def,              *
%                                   ctex-engine-luatex.def,             *
%                                   ctex-engine-aptex.def,              *
%                                   ctex-engine-uptex.def,              *
%                                   ctex-name-utf8.cfg,                 *
%                                   ctex-name-gbk.cfg,                  *
%                                   ctex.cfg,                           *
%                                   ctexopts.cfg,                       *
%                                   ctex-scheme-plain.def,              *
%                                   ctex-scheme-plain-article.def,      *
%                                   ctex-scheme-plain-book.def,         *
%                                   ctex-scheme-plain-report.def,       *
%                                   ctex-scheme-plain-beamer.def,       *
%                                   ctex-scheme-chinese.def,            *
%                                   ctex-scheme-chinese-article.def,    *
%                                   ctex-scheme-chinese-book.def,       *
%                                   ctex-scheme-chinese-report.def,     *
%                                   ctex-scheme-chinese-beamer.def,     *
%                                   ctex-fontset-adobe.def,             *
%                                   ctex-fontset-fandol.def,            *
%                                   ctex-fontset-founder.def,           *
%                                   ctex-fontset-hanyi.def,             *
%                                   ctex-fontset-mac.def,               *
%                                   ctex-fontset-macnew.def,            *
%                                   ctex-fontset-macold.def,            *
%                                   ctex-fontset-ubuntu.def,            *
%                                   ctex-fontset-windows.def,           *
%                                   c19rm.fd,                           *
%                                   c19sf.fd,                           *
%                                   c19tt.fd,                           *
%                                   c70rm.fd,                           *
%                                   c70sf.fd,                           *
%                                   c70tt.fd,                           *
%                                   jy2zhrm.fd,                         *
%                                   jy2zhsf.fd,                         *
%                                   jy2zhtt.fd,                         *
%                                   jt2zhrm.fd,                         *
%                                   jt2zhsf.fd,                         *
%                                   jt2zhtt.fd,                         *
%                                   ctexspa.def,                        *
%                     translator-theorem-dictionary-ChineseUTF8.dict,   *
%                     translator-theorem-dictionary-ChineseGBK.dict,    *
%                                   ctex-spa-make.tex,                  *
%                                   ctex-spa-macro.tex,                 *
%                                   ctex-zhmap-adobe.tex,               *
%                                   ctex-zhmap-fandol.tex,              *
%                                   ctex-zhmap-founder.tex,             *
%                                   ctex-zhmap-hanyi.tex,               *
%                                   ctex-zhmap-mac.tex,                 *
%                                   ctex-zhmap-ubuntu.tex,              *
%                                   ctex-zhmap-windows.tex,             *
%           the documentation files ctex.pdf,                           *
%                               and README.md.                          *
% -----------------------------------------------------------------------
%                                                                       *
%   Any modification of this file should ensure that the copyright and  *
%   license information is placed in the derived files.                 *
%                                                                       *
% -----------------------------------------------------------------------
%
%<*!driver>
%<*fd|zhmap>
%<fd>\catcode`\ 10\relax \catcode`\^^I9\relax \catcode`\^^M5\relax
\def \GetIdInfo $Id: #1.#2 #3 #4-#5-#6 #7$ #8{%
  \edef \ExplFileDate       {#4/#5/#6}%
  \edef \ExplFileVersion    {#3}%
  \edef \ExplFileDescription{#8}}%
%</fd|zhmap>
%<*!spa>
%<+!driver>\GetIdInfo $Id: ctex-fontset.dtx 2.6.2 2026-07-06 02:16:01 +0800 5dd4f341 Liam <liamhuang0205@gmail.com>$
%</!spa>
%<*fontset>
%<windows>  {Windows fonts definition (CTEX)}
%<windows>\ProvidesExplFile{ctex-fontset-windows.def}
%<adobe>  {Adobe fonts definition (CTEX)}
%<adobe>\ProvidesExplFile{ctex-fontset-adobe.def}
%<fandol>  {Fandol fonts definition (CTEX)}
%<fandol>\ProvidesExplFile{ctex-fontset-fandol.def}
%<mac>  {macOS fonts definition (CTEX)}
%<mac>\ProvidesExplFile{ctex-fontset-mac.def}
%<macnew>  {macOS fonts definition for El Capitan or later version (CTEX)}
%<macnew>\ProvidesExplFile{ctex-fontset-macnew.def}
%<macold>  {macOS fonts definition for Yosemite or earlier version (CTEX)}
%<macold>\ProvidesExplFile{ctex-fontset-macold.def}
%<founder>  {Founder fonts definition (CTEX)}
%<founder>\ProvidesExplFile{ctex-fontset-founder.def}
%<hanyi>  {Hanyi fonts definition (CTEX)}
%<hanyi>\ProvidesExplFile{ctex-fontset-hanyi.def}
%<ubuntu>  {Ubuntu fonts definition (CTEX)}
%<ubuntu>\ProvidesExplFile{ctex-fontset-ubuntu.def}
%<fontset>  {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
%</fontset>
%<*zhmap>
%<adobe>  {Adobe font map loader for DVIPDFMx (CTEX)}%
%<fandol>  {Fandol font map loader for DVIPDFMx (CTEX)}%
%<founder>  {Founder font map loader for pdfTeX and DVIPDFMx (CTEX)}%
%<hanyi>  {Hanyi font map loader for pdfTeX and DVIPDFMx (CTEX)}%
%<mac>  {Mac font map loader for DVIPDFMx (CTEX)}%
%<ubuntu>  {Ubuntu font map loader for DVIPDFMx (CTEX)}%
%<windows>  {Windows font map loader for pdfTeX and DVIPDFMx (CTEX)}%
%</zhmap>
%<*fd|ctexspa>
%<fd>  {Chinese font definition (CTEX)}%
%<fd>\catcode`\ 9\relax \catcode`\^^I9\relax \catcode`\^^M9\relax
%<ctexspa>  {Space info for CJKpunct (CTEX)}
%<c19&rm>\ProvidesFile{c19rm.fd}%
%<c19&sf>\ProvidesFile{c19sf.fd}%
%<c19&tt>\ProvidesFile{c19tt.fd}%
%<c70&rm>\ProvidesFile{c70rm.fd}%
%<c70&sf>\ProvidesFile{c70sf.fd}%
%<c70&tt>\ProvidesFile{c70tt.fd}%
%<jy2&rm>\ProvidesFile{jy2zhrm.fd}%
%<jy2&sf>\ProvidesFile{jy2zhsf.fd}%
%<jy2&tt>\ProvidesFile{jy2zhtt.fd}%
%<jt2&rm>\ProvidesFile{jt2zhrm.fd}%
%<jt2&sf>\ProvidesFile{jt2zhsf.fd}%
%<jt2&tt>\ProvidesFile{jt2zhtt.fd}%
%<ctexspa>\ProvidesFile{ctexspa.def}%
%<fd|ctexspa>  [\ExplFileDate\space v\ExplFileVersion\space \ExplFileDescription]
%</fd|ctexspa>
%</!driver>
%
% \fi
%
% \begin{implementation}
%
% \paragraph*{\fbox{\file{\jobname-fontset.dtx}}}
%
%    \begin{macrocode}
%<@@=ctex>
%    \end{macrocode}
%
% \subsubsection{预定义字库}
%
%    \begin{macrocode}
%<*fontset>
%    \end{macrocode}
%
% \paragraph{\opt{adobe}}
%
% \tn{pdfmapline} 不支持 OpenType 字体，因而 \opt{adobe} 字体集在 pdf 模式下
% 就没有定义。\opt{fandol} 的情况类似。
%    \begin{macrocode}
%<*adobe>
\ctex_fontset_case:nnnn
  { \ctex_fontset_error:n { adobe } }
  {
    \ctex_zhmap_case:nnn
      {
        \setCJKmainfont  { AdobeSongStd-Light.otf }
          [
            cmap       = UniGB-UTF16-H,
            BoldFont   = AdobeHeitiStd-Regular.otf,
            ItalicFont = AdobeKaitiStd-Regular.otf
          ]
        \setCJKsansfont { AdobeHeitiStd-Regular.otf }
          [ cmap = UniGB-UTF16-H ]
        \setCJKmonofont { AdobeFangsongStd-Regular.otf }
          [ cmap = UniGB-UTF16-H ]
        \setCJKfamilyfont { zhsong } { AdobeSongStd-Light.otf       }
          [ cmap = UniGB-UTF16-H ]
        \setCJKfamilyfont { zhhei  } { AdobeHeitiStd-Regular.otf    }
          [ cmap = UniGB-UTF16-H ]
        \setCJKfamilyfont { zhkai  } { AdobeKaitiStd-Regular.otf    }
          [ cmap = UniGB-UTF16-H ]
        \setCJKfamilyfont { zhfs   } { AdobeFangsongStd-Regular.otf }
          [ cmap = UniGB-UTF16-H ]
        \ctex_punct_set:n { adobe }
        \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
        \ctex_punct_map_family:nn   { \CJKsfdefault } { zhhei  }
        \ctex_punct_map_family:nn   { \CJKttdefault } { zhfs   }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
      }
      {
        \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { adobe }
        \ctex_punct_set:n { adobe }
        \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
      }
      { \ctex_fontset_error:n { adobe } }
  }
  {
    \ctex_set_upfonts:nnnnnn
      { AdobeSongStd-Light.otf       }
      { AdobeHeitiStd-Regular.otf    }
      { AdobeKaitiStd-Regular.otf    }
      { AdobeHeitiStd-Regular.otf    }
      { AdobeHeitiStd-Regular.otf    }
      { AdobeFangsongStd-Regular.otf }
    \ctex_set_upfamily:nnn { zhsong } { upzhserif   } {}
    \ctex_set_upfamily:nnn { zhhei  } { upzhsans    } {}
    \ctex_set_upfamily:nnn { zhfs   } { upzhmono    } {}
    \ctex_set_upfamily:nnn { zhkai  } { upzhserifit } {}
  }
  {
    \setCJKmainfont { AdobeSongStd-Light       }
      [ BoldFont = AdobeHeitiStd-Regular, ItalicFont = AdobeKaitiStd-Regular ]
    \setCJKsansfont { AdobeHeitiStd-Regular    }
    \setCJKmonofont { AdobeFangsongStd-Regular }
    \setCJKfamilyfont { zhsong } { AdobeSongStd-Light       }
    \setCJKfamilyfont { zhhei  } { AdobeHeitiStd-Regular    }
    \setCJKfamilyfont { zhfs   } { AdobeFangsongStd-Regular }
    \setCJKfamilyfont { zhkai  } { AdobeKaitiStd-Regular    }
  }
%</adobe>
%    \end{macrocode}
%
% \paragraph{\opt{fandol}}
%
%    \begin{macrocode}
%<*fandol>
\ctex_fontset_case:nnnn
  { \ctex_fontset_error:n { fandol } }
  {
    \ctex_zhmap_case:nnn
      {
        \setCJKmainfont { FandolSong-Regular.otf }
          [
            cmap       = UniGB-UTF16-H,
            BoldFont   = FandolSong-Bold.otf,
            ItalicFont = FandolKai-Regular.otf
          ]
        \setCJKsansfont { FandolHei-Regular.otf }
          [ cmap = UniGB-UTF16-H, BoldFont = FandolHei-Bold.otf ]
        \setCJKmonofont { FandolFang-Regular.otf }
          [ cmap = UniGB-UTF16-H ]
        \setCJKfamilyfont { zhsong } { FandolSong-Regular.otf }
          [ cmap = UniGB-UTF16-H, BoldFont = FandolSong-Bold.otf ]
        \setCJKfamilyfont { zhhei  } { FandolHei-Regular.otf  }
          [ cmap = UniGB-UTF16-H, BoldFont = FandolHei-Bold.otf  ]
        \setCJKfamilyfont { zhfs   } { FandolFang-Regular.otf }
          [ cmap = UniGB-UTF16-H ]
        \setCJKfamilyfont { zhkai  } { FandolKai-Regular.otf  }
          [ cmap = UniGB-UTF16-H ]
        \ctex_punct_set:n { fandol }
        \ctex_punct_map_family:nn   { \CJKrmdefault         } { zhsong  }
        \ctex_punct_map_family:nn   { \CJKsfdefault         } { zhhei   }
        \ctex_punct_map_family:nn   { \CJKttdefault         } { zhfs    }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault, zhsong } { zhsongb }
        \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhhei  } { zhheib  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault         } { zhkai   }
      }
      {
        \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { fandol }
        \ctex_punct_set:n { fandol }
        \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
      }
      { \ctex_fontset_error:n { fandol } }
  }
  {
    \ctex_set_upfonts:nnnnnn
      { FandolSong-Regular.otf }
      { FandolSong-Bold.otf    }
      { FandolKai-Regular.otf  }
      { FandolHei-Regular.otf  }
      { FandolHei-Bold.otf     }
      { FandolFang-Regular.otf }
    \ctex_set_upfamily:nnn { zhsong } { upzhserif   } { upzhserifb }
    \ctex_set_upfamily:nnn { zhhei  } { upzhsans    } { upzhsansb  }
    \ctex_set_upfamily:nnn { zhfs   } { upzhmono    } {}
    \ctex_set_upfamily:nnn { zhkai  } { upzhserifit } {}
  }
  {
    \setCJKmainfont { FandolSong-Regular }
      [
        Extension  = .otf,
        BoldFont   = FandolSong-Bold,
        ItalicFont = FandolKai-Regular
      ]
    \setCJKsansfont { FandolHei-Regular  }
      [ Extension = .otf, BoldFont = FandolHei-Bold ]
    \setCJKmonofont { FandolFang-Regular }
      [ Extension = .otf ]
    \setCJKfamilyfont { zhsong } { FandolSong-Regular }
      [ Extension = .otf, BoldFont = FandolSong-Bold ]
    \setCJKfamilyfont { zhhei  } { FandolHei-Regular  }
      [ Extension = .otf, BoldFont = FandolHei-Bold  ]
    \setCJKfamilyfont { zhfs   } { FandolFang-Regular }
      [ Extension = .otf ]
    \setCJKfamilyfont { zhkai  } { FandolKai-Regular  }
      [ Extension = .otf ]
  }
%</fandol>
%    \end{macrocode}
%
% \paragraph{\opt{founder}}
%
% \changes{v2.4.15}{2019/03/28}{统一“方正细黑一\_GBK”的名称为 \texttt{FZXiHeiI-Z08}。}
%
%    \begin{macrocode}
%<*founder>
\ctex_fontset_case:nnn
  {
    \ctex_zhmap_case:nnn
      {
        \setCJKmainfont { FZSSK.TTF }
          [ BoldFont = FZXBSK.TTF, ItalicFont = FZKTK.TTF ]
        \setCJKsansfont { FZXH1K.TTF } [ BoldFont = FZHTK.TTF ]
        \setCJKmonofont { FZFSK.TTF }
        \setCJKfamilyfont { zhsong } { FZSSK.TTF } [ BoldFont = FZXBSK.TTF ]
        \setCJKfamilyfont { zhhei  } { FZHTK.TTF }
        \setCJKfamilyfont { zhkai  } { FZKTK.TTF }
        \setCJKfamilyfont { zhfs   } { FZFSK.TTF }
        \setCJKfamilyfont { zhli   } { FZLSK.TTF }
        \setCJKfamilyfont { zhyou  } { FZY1K.TTF } [ BoldFont = FZY3K.TTF ]
        \ctex_punct_set:n { founder }
        \ctex_punct_map_family:nn   { \CJKrmdefault         } { zhsong  }
        \ctex_punct_map_family:nn   { \CJKsfdefault         } { zhheil  }
        \ctex_punct_map_family:nn   { \CJKttdefault         } { zhfs    }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault         } { zhkai   }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault, zhsong } { zhsongb }
        \ctex_punct_map_bfseries:nn { \CJKsfdefault         } { zhhei   }
        \ctex_punct_map_bfseries:nn { zhyou                 } { zhyoub  }
      }
      {
        \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { founder }
        \ctex_punct_set:n { founder }
        \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
      }
      { \ctex_fontset_error:n { founder } }
  }
  {
    \ctex_set_upfonts:nnnnnn
      { FZSSK.TTF  }
      { FZXBSK.TTF }
      { FZKTK.TTF  }
      { FZXH1K.TTF }
      { FZHTK.TTF  }
      { FZFSK.TTF  }
    \ctex_set_upfamily:nnn { zhsong } { upzhserif   } { upzhserifb }
    \ctex_set_upfamily:nnn { zhhei  } { upzhsans    } { upzhsansb  }
    \ctex_set_upfamily:nnn { zhfs   } { upzhmono    } {}
    \ctex_set_upfamily:nnn { zhkai  } { upzhserifit } {}
    \ctex_set_upfamily:nnn { zhli   } { upschrm     } {}
    \ctex_set_upfamily:nnn { zhyou  } { upschgt     } {}
    \ctex_set_upmap:nnn    { upstsl } { FZLSK.TTF } {}
    \ctex_set_upmap:nnn    { upstht } { FZY1K.TTF } {}
  }
  {
    \setCJKmainfont { FZShuSong-Z01 }
      [ BoldFont = FZXiaoBiaoSong-B05, ItalicFont = FZKai-Z03 ]
    \setCJKsansfont { FZXiHeiI-Z08 } [ BoldFont = FZHei-B01 ]
    \setCJKmonofont { FZFangSong-Z02 }
    \setCJKfamilyfont { zhsong } { FZShuSong-Z01  }
      [ BoldFont = FZXiaoBiaoSong-B05 ]
    \setCJKfamilyfont { zhhei  } { FZHei-B01      }
    \setCJKfamilyfont { zhkai  } { FZKai-Z03      }
    \setCJKfamilyfont { zhfs   } { FZFangSong-Z02 }
    \setCJKfamilyfont { zhli   } { FZLiShu-S01    }
    \setCJKfamilyfont { zhyou  } { FZXiYuan-M01   }
      [ BoldFont = FZZhunYuan-M02 ]
  }
%</founder>
%    \end{macrocode}
%
% \paragraph{\opt{hanyi}}
%
%    \begin{macrocode}
%<*hanyi>
\ctex_fontset_case:nnn
  {
    \ctex_zhmap_case:nnn
      {
        \setCJKmainfont { HYShuSongErS.ttf }
          [ BoldFont = HYZhongSongS.ttf, ItalicFont = HYKaiTiS.ttf ]
        \setCJKsansfont { HYZhongHeiS.ttf  } [ BoldFont = HYDaHeiS.ttf ]
        \setCJKmonofont { HYFangSongS.ttf  }
        \setCJKfamilyfont { zhsong } { HYShuSongErS.ttf }
          [ BoldFont = HYZhongSongS.ttf ]
        \setCJKfamilyfont { zhhei  } { HYZhongHeiS.ttf  }
          [ BoldFont = HYDaHeiS.ttf     ]
        \setCJKfamilyfont { zhkai  } { HYKaiTiS.ttf     }
        \setCJKfamilyfont { zhfs   } { HYFangSongS.ttf  }
        \ctex_punct_set:n { hanyi }
        \ctex_punct_map_family:nn   { \CJKrmdefault         } { zhsong  }
        \ctex_punct_map_family:nn   { \CJKsfdefault         } { zhhei   }
        \ctex_punct_map_family:nn   { \CJKttdefault         } { zhfs    }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault, zhsong } { zhsongb }
        \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhhei  } { zhheib  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault         } { zhkai   }
      }
      {
        \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { hanyi }
        \ctex_punct_set:n { hanyi }
        \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
      }
      { \ctex_fontset_error:n { hanyi } }
  }
  {
    \ctex_set_upfonts:nnnnnn
      { HYShuSongErS.ttf }
      { HYZhongSongS.ttf }
      { HYKaiTiS.ttf     }
      { HYZhongHeiS.ttf  }
      { HYDaHeiS.ttf     }
      { HYFangSongS.ttf  }
    \ctex_set_upfamily:nnn { zhsong } { upzhserif   } { upzhserifb }
    \ctex_set_upfamily:nnn { zhhei  } { upzhsans    } { upzhsansb  }
    \ctex_set_upfamily:nnn { zhfs   } { upzhmono    } {}
    \ctex_set_upfamily:nnn { zhkai  } { upzhserifit } {}
  }
  {
    \setCJKmainfont { HYShuSongEr~S }
      [ BoldFont = HYZhongSong~S, ItalicFont = HYKaiTi~S ]
    \setCJKsansfont { HYZhongHei~S  } [ BoldFont = HYDaHei~S ]
    \setCJKmonofont { HYFangSong~S  }
    \setCJKfamilyfont { zhsong } { HYShuSongEr~S }
      [ BoldFont = HYZhongSong~S ]
    \setCJKfamilyfont { zhhei  } { HYZhongHei~S  }
      [ BoldFont = HYDaHei~S     ]
    \setCJKfamilyfont { zhkai  } { HYKaiTi~S     }
    \setCJKfamilyfont { zhfs   } { HYFangSong~S  }
  }
%</hanyi>
%    \end{macrocode}
%
% \changes{v2.5.2}{2020/05/06}
%   {修正 \opt{macnew} 和 \opt{ubuntu} 字库的 \pkg{CJKpunct} 标点信息。}
%
% \paragraph{\opt{mac} 相关}
%
% \changes{v2.4.14}{2018/05/01}{区分 \opt{macold} 及 \opt{macnew}。}
% \changes{v2.6.0}{2026/04/29}{\opt{macnew} 增加 macOS~15+ 兼容，字体运行时检测。}
%
% 按 \href{https://github.com/CTeX-org/ctex-kit/issues/351}{Issue 351}
% 的讨论，以 El Capitan 为分界，分别设置 |macold|（El Capitan 之前）
% 和 |macnew|（El Capitan 及之后）。检测方式则以 El Capitan 及之后
% 的苹方字体为准。从 macOS~15 (Sequoia) 开始，苹方字体转为
% \emph{downloadable}，不再位于传统路径，故增加版本号检测作为后备。
%
%    \begin{macrocode}
%<*mac>
\tl_new:N \g_@@_macos_ver_tl
\msg_new:nnn { ctex } { macos-version-detect-failed }
  { Cannot~detect~macOS~version.~Falling~back~to~macold~fontset. }
%    \end{macrocode}
% 为方便人类阅读，把 \LuaTeX{} 分支挪到后面，在不忽略空格的 catcode scheme 下编写。
% 这样 Lua 代码就不必以 |~| 代替空格。非 \LuaTeX{} 分支，在末尾使用
% \cs{use_none_delimit_by_q_stop:w} 来跳过 \LuaTeX{} 分支。
%    \begin{macrocode}
\sys_if_engine_luatex:F
  {
    \ior_new:N \g_@@_macos_ver_ior
    \bool_new:N \g_@@_macos_ver_found_bool
    \file_if_exist:nT { /System/Library/CoreServices/SystemVersion.plist }
      {
        \ior_open:Nn \g_@@_macos_ver_ior
          { /System/Library/CoreServices/SystemVersion.plist }
        \ior_map_inline:Nn \g_@@_macos_ver_ior
          {
            \bool_if:NTF \g_@@_macos_ver_found_bool
              {
                \tl_set:Nn \l_tmpa_tl {#1}
                \regex_replace_once:nnN
                  { .*? <string> (\d+) .* } { \1 } \l_tmpa_tl
                \tl_gset:NV \g_@@_macos_ver_tl \l_tmpa_tl
                \ior_map_break:
              }
              {
                \tl_if_in:nnT {#1} { ProductVersion }
                  { \bool_gset_true:N \g_@@_macos_ver_found_bool }
              }
          }
        \ior_close:N \g_@@_macos_ver_ior
      }
    \use_none_delimit_by_q_stop:w
  }
\char_set_catcode_space:n { 32 }
\lua_now:n
  {
    local f = io.open("/System/Library/CoreServices/SystemVersion.plist", "r");
    if f then
      local content = f:read("*a");
      f:close();
      local ver = content:match("ProductVersion.-<string>(.-)</string>");
      if ver then
        local dot = ver:find(".", 1, true);
        local major = dot and ver:sub(1, dot - 1) or ver;
        if major then
          token.set_macro("g_@@_macos_ver_tl", major, "global");
        end;
      end;
    end
  }
\char_set_catcode_ignore:n { 32 }
\use_none_delimit_by_q_stop:w \q_stop
\file_if_exist:nTF { /System/Library/Fonts/PingFang.ttc }
  { \ctex_file_input:n { ctex-fontset-macnew.def } }
  {
    \tl_if_empty:NTF \g_@@_macos_ver_tl
      {
        \msg_warning:nn { ctex } { macos-version-detect-failed }
        \ctex_file_input:n { ctex-fontset-macold.def }
      }
      {
        \int_compare:nNnTF { \g_@@_macos_ver_tl } < { 15 }
          { \ctex_file_input:n { ctex-fontset-macold.def } }
          { \ctex_file_input:n { ctex-fontset-macnew.def } }
      }
  }
%</mac>
%    \end{macrocode}
%
% \changes{v2.4.14}{2018/05/01}{配置 \opt{macnew} 的默认字体设置。}
% \changes{v2.5}{2019/11/05}{为 \opt{macnew} 增加粗楷体、隶书和圆体的定义。}
% \changes{v2.5}{2019/11/07}{允许 \opt{macnew} 在 \LaTeX{} 和 \upLaTeX{} 下使用。}
%
% |macold| 的设置参考了
% \href{https://github.com/CTeX-org/ctex-kit/wiki/OS-X-Mavericks-(10.9)-预装的主要简体中文字体}^^A
% {OS X Mavericks (10.9) 预装的主要简体中文字体列表}。
%
% |macnew| 在默认字体设置方面，引入了多字重的宋体作为罗马字族，
% 以及引入了苹方黑体作为无衬线字族。
% 由于 Songti SC Light 的字重与 STSong 及 Windows 上的 SimSun 更接近，故默认字重
% 使用 Songti SC Light，而不带后缀的正常字重事实上没有使用。黑体、圆体等设置
% 也有类似的情况。
%
%    \begin{macrocode}
%<*macold|macnew>
\ctex_fontset_case:nnnn
  {
    \ctex_fontset_error:n { mac }
    \use_none_delimit_by_q_stop:w
  }
%<*macold>
  { \ctex_fontset_error:n { macold } }
  { \ctex_fontset_error:n { macold } }
%</macold>
%<*macnew>
  {
    \ctex_zhmap_case:nnn
      {
        \setCJKmainfont { :3:Songti.ttc }
          [
            BoldFont       = :1:Songti.ttc,
            ItalicFont     = :0:Kaiti.ttc,
            BoldItalicFont = :3:Kaiti.ttc,
          ]
        \setCJKsansfont { :2:PingFang.ttc } [ BoldFont = :8:PingFang.ttc ]
        \setCJKmonofont { STFANGSO.ttf    }
        \setCJKfamilyfont { zhsong } { :3:Songti.ttc   } [ BoldFont = :1:Songti.ttc   ]
        \setCJKfamilyfont { zhhei  } { :2:PingFang.ttc } [ BoldFont = :8:PingFang.ttc ]
        \setCJKfamilyfont { zhkai  } { :0:Kaiti.ttc    } [ BoldFont = :3:Kaiti.ttc    ]
        \setCJKfamilyfont { zhfs   } { STFANGSO.ttf    }
        \setCJKfamilyfont { zhli   } { :0:Baoli.ttc    }
        \setCJKfamilyfont { zhyou  } { :4:Yuanti.ttc   } [ BoldFont = :0:Yuanti.ttc   ]
        \ctex_punct_set:n { mac }
        \ctex_punct_map_family:nn   { \CJKrmdefault         } { zhsong  }
        \ctex_punct_map_family:nn   { \CJKsfdefault         } { zhpf    }
        \ctex_punct_map_family:nn   { \CJKttdefault         } { zhfs    }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault         } { zhkai   }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault, zhsong } { zhsongb }
        \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhhei  } { zhpfb   }
        \ctex_punct_map_bfseries:nn { zhyou                 } { zhyoub  }
      }
      {
        \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { mac }
        \ctex_punct_set:n { mac }
        \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
        \ctex_punct_map_family:nn   { \CJKsfdefault } { zhpf   }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhpf   }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
      }
      { \ctex_fontset_error:n { macnew } }
    \use_none_delimit_by_q_stop:w
  }
  {
    \ctex_set_upmap:nnn { upserif   } { :3:Songti.ttc } { :1:Songti.ttc }
    \ctex_set_upmap:nnn { upserifit } { :0:Kaiti.ttc  } { }
    \ctex_set_upmap:nnn { upstsl    } { :0:Baoli.ttc  } { }
    \ctex_set_upmap:nnn { upstht    } { :4:Yuanti.ttc } { }
    \ctex_set_upmap_unicode:nnn { upsans } { :2:PingFang.ttc } { :8:PingFang.ttc }
    \ctex_set_upmap_unicode:nnn { upmono } { STFANGSO.ttf    } { }
    \ctex_set_upfamily:nnn { zhsong } { upzhserif   } { upzhserifb }
    \ctex_set_upfamily:nnn { zhhei  } { upzhsans    } { upzhsansb  }
    \ctex_set_upfamily:nnn { zhfs   } { upzhmono    } { }
    \ctex_set_upfamily:nnn { zhkai  } { upzhserifit } { }
    \ctex_set_upfamily:nnn { zhli   } { upschrm     } { }
    \ctex_set_upfamily:nnn { zhyou  } { upschgt     } { }
    \use_none_delimit_by_q_stop:w
  }
%</macnew>
  {
%<*macold>
    \setCJKmainfont { STSong     }
      [ BoldFont = STHeiti, ItalicFont = STKaiti ]
    \setCJKsansfont { STXihei    } [ BoldFont = STHeiti ]
    \setCJKmonofont { STFangsong }
    \setCJKfamilyfont { zhsong } { STSong     }
    \setCJKfamilyfont { zhhei  } { STHeiti    }
    \setCJKfamilyfont { zhfs   } { STFangsong }
    \setCJKfamilyfont { zhkai  } { STKaiti    }
%</macold>
%<*macnew>
    \bool_new:N \g_@@_mac_pingfang_bool
%    \end{macrocode}
% 为方便人类阅读，把 \LuaTeX{} 分支挪到 \cs{ctex_fontset_case:nnnn} 之后，在不忽略
% 空格的 catcode scheme 下编写。这样 Lua 代码就不必以 |~| 代替空格。
% |macnew| 的其他 \cs{ctex_fontset_case:nnnn} 和其他 \cs{ctex_zhmap_case:nnn}
% 分支，末尾均使用 \cs{use_none_delimit_by_q_stop:w} 来跳过 \LuaTeX{} 分支。
%    \begin{macrocode}
    \sys_if_engine_luatex:F
      {
        \fontspec_font_if_exist:nTF { Kaiti~SC }
          {
            \setCJKmainfont { Songti~SC~Light }
              [
                BoldFont       = Songti~SC~Bold ,
                ItalicFont     = Kaiti~SC ,
                BoldItalicFont = Kaiti~SC~Bold ,
              ]
          }
          {
            \setCJKmainfont { Songti~SC~Light }
              [ BoldFont = Songti~SC~Bold ]
          }
        \setCJKfamilyfont { zhsong } { Songti~SC~Light }
          [ BoldFont = Songti~SC~Bold ]
        \setCJKfamilyfont { zhhei  } { Heiti~SC~Light  }
          [ BoldFont = Heiti~SC~Medium ]
        \fontspec_font_if_exist:nTF { PingFang~SC }
          {
            \setCJKsansfont { PingFang~SC }
            \setCJKfamilyfont { zhpf } { PingFang~SC }
            \bool_gset_true:N \g_@@_mac_pingfang_bool
          }
          { \setCJKsansfont { Heiti~SC~Light } [ BoldFont = Heiti~SC~Medium ] }
        \fontspec_font_if_exist:nTF { STFangsong }
          {
            \setCJKmonofont { STFangsong }
            \setCJKfamilyfont { zhfs } { STFangsong }
          }
          { \setCJKmonofont { Heiti~SC~Light } }
        \fontspec_font_if_exist:nT { Kaiti~SC }
          {
            \setCJKfamilyfont { zhkai } { Kaiti~SC }
              [ BoldFont = Kaiti~SC~Bold ]
          }
        \fontspec_font_if_exist:nT { Baoli~SC }
          { \setCJKfamilyfont { zhli } { Baoli~SC } }
        \fontspec_font_if_exist:nT { Yuanti~SC~Light }
          {
            \setCJKfamilyfont { zhyou } { Yuanti~SC~Light }
              [ BoldFont = Yuanti~SC~Regular ]
          }
        \use_none_delimit_by_q_stop:w
      }
%</macnew>
  }
%<*macnew>
\char_set_catcode_space:n { 32 }
\lua_now:n
  {
    local lfs = require("lfs");
    local search_bases = {};
    local asset_roots = {
      "/System/Library/AssetsV2",
      "/System/Library/AssetsV2/PreinstalledAssetsV2/InstallWithOs",
    };
    for _, root in ipairs(asset_roots) do
      local ok, iter, obj = pcall(lfs.dir, root);
      if ok then
        for d in iter, obj do
          if d:find("^com_apple_MobileAsset_Font") then
            table.insert(search_bases, root .. "/" .. d);
          end;
        end;
      end;
    end;
    local function find_font_dir(filename)
      for _, base in ipairs(search_bases) do
        local ok, iter, obj = pcall(lfs.dir, base);
        if ok then
          for entry in iter, obj do
            if not (entry == "." or entry == "..") then
              local p = base .. "/" .. entry
                .. "/AssetData/" .. filename;
              if lfs.attributes(p, "mode") then
                return base .. "/" .. entry .. "/AssetData/";
              end;
            end;
          end;
        end;
      end;
      return nil;
    end;
    local fonts = {
      {"PingFang.ttc", "g_@@_mac_pingfang_dir_tl"},
      {"Kaiti.ttc",    "g_@@_mac_kaiti_dir_tl"},
      {"STFANGSO.ttf", "g_@@_mac_stfangso_dir_tl"},
      {"Baoli.ttc",    "g_@@_mac_baoli_dir_tl"},
      {"Yuanti.ttc",   "g_@@_mac_yuanti_dir_tl"},
    };
    for _, f in ipairs(fonts) do
      local dir = find_font_dir(f[1]);
      token.set_macro(f[2], dir or "", "global");
    end
  }
\char_set_catcode_ignore:n { 32 }
\tl_if_empty:NTF \g_@@_mac_kaiti_dir_tl
  {
    \setCJKmainfont { Songti~SC~Light }
      [ BoldFont = Songti~SC~Bold ]
  }
  {
    \setCJKmainfont { Songti~SC~Light }
      [
        BoldFont       = Songti~SC~Bold ,
        ItalicFont     = Kaiti.ttc ,
        ItalicFeatures = { Path = \g_@@_mac_kaiti_dir_tl , FontIndex = 0 } ,
        BoldItalicFont = Kaiti.ttc ,
        BoldItalicFeatures = { Path = \g_@@_mac_kaiti_dir_tl , FontIndex = 3 } ,
      ]
  }
\setCJKfamilyfont { zhsong } { Songti~SC~Light }
  [ BoldFont = Songti~SC~Bold ]
\setCJKfamilyfont { zhhei  } { Heiti~SC~Light  }
  [ BoldFont = Heiti~SC~Medium ]
\tl_if_empty:NTF \g_@@_mac_pingfang_dir_tl
  { \setCJKsansfont { Heiti~SC~Light } [ BoldFont = Heiti~SC~Medium ] }
  {
    \setCJKsansfont { PingFang.ttc }
      [
        Path          = \g_@@_mac_pingfang_dir_tl ,
        FontIndex     = 2 ,
        BoldFont      = PingFang.ttc ,
        BoldFontIndex = 8 ,
      ]
    \setCJKfamilyfont { zhpf } { PingFang.ttc }
      [ Path = \g_@@_mac_pingfang_dir_tl , FontIndex = 2 ]
    \bool_gset_true:N \g_@@_mac_pingfang_bool
  }
\tl_if_empty:NTF \g_@@_mac_stfangso_dir_tl
  { \setCJKmonofont { Heiti~SC~Light } }
  {
    \setCJKmonofont { STFANGSO.ttf }
      [ Path = \g_@@_mac_stfangso_dir_tl ]
    \setCJKfamilyfont { zhfs } { STFANGSO.ttf }
      [ Path = \g_@@_mac_stfangso_dir_tl ]
  }
\tl_if_empty:NF \g_@@_mac_kaiti_dir_tl
  {
    \setCJKfamilyfont { zhkai } { Kaiti.ttc }
      [
        Path          = \g_@@_mac_kaiti_dir_tl ,
        FontIndex     = 0 ,
        BoldFont      = Kaiti.ttc ,
        BoldFontIndex = 3 ,
      ]
  }
\tl_if_empty:NF \g_@@_mac_baoli_dir_tl
  {
    \setCJKfamilyfont { zhli } { Baoli.ttc }
      [ Path = \g_@@_mac_baoli_dir_tl , FontIndex = 0 ]
  }
\tl_if_empty:NF \g_@@_mac_yuanti_dir_tl
  {
    \setCJKfamilyfont { zhyou } { Yuanti.ttc }
      [
        Path          = \g_@@_mac_yuanti_dir_tl ,
        FontIndex     = 4 ,
        BoldFont      = Yuanti.ttc ,
        BoldFontIndex = 0 ,
      ]
  }
\use_none_delimit_by_q_stop:w \q_stop
%</macnew>
%</macold|macnew>
%    \end{macrocode}
%
% \paragraph{\opt{ubuntu}}
%
% \changes{v2.5}{2019/11/07}{\opt{ubuntu} 改用思源（Noto CJK）和文鼎字库，不再
% 支持使用 \pdfLaTeX{} 编译。}
% \changes{v2.6.2}{2026/07/05}{\opt{ubuntu} 字库新增仿宋配置和 \tn{fangsong}
%   命令。使用 \XeLaTeX{} 或 \LuaLaTeX{} 编译时，按朱雀仿宋、FandolFang、
%   思源宋体的顺序自动选用（\#908）。}
%
% 仿宋在 \XeTeX{} 和 \LuaTeX{} 下按朱雀仿宋（\pkg{lxgw-fonts} 宏包）、
% FandolFang、思源宋体的顺序检测选用，等宽字体（\tn{ttfamily}）与之保持一致。
% 其他编译方式无法在运行时检测字体，仿宋直接使用静态映射的思源宋体。
%
%    \begin{macrocode}
%<*ubuntu>
\ctex_fontset_case:nnnn
  { \ctex_fontset_error:n { ubuntu } }
  {
    \ctex_zhmap_case:nnn
      {
        \setCJKmainfont { :2:NotoSerifCJK-Regular.ttc }
          [ BoldFont = :2:NotoSerifCJK-Bold.ttc, ItalicFont = gkai00mp.ttf ]
        \setCJKsansfont { :2:NotoSansCJK-Regular.ttc  }
          [ BoldFont = :2:NotoSansCJK-Bold.ttc  ]
        \setCJKmonofont { :2:NotoSerifCJK-Regular.ttc }
          [ BoldFont = :2:NotoSerifCJK-Bold.ttc ]
        \setCJKfamilyfont { zhsong } { :2:NotoSerifCJK-Regular.ttc }
          [ BoldFont = :2:NotoSerifCJK-Bold.ttc ]
        \setCJKfamilyfont { zhhei  } { :2:NotoSansCJK-Regular.ttc  }
          [ BoldFont = :2:NotoSansCJK-Bold.ttc  ]
        \setCJKfamilyfont { zhfs   } { :2:NotoSerifCJK-Regular.ttc }
        \setCJKfamilyfont { zhkai  } { gkai00mp.ttf  }
        \ctex_punct_set:n { ubuntu }
        \ctex_punct_map_family:nn   { \CJKrmdefault        } { zhsong  }
        \ctex_punct_map_family:nn   { \CJKsfdefault        } { zhhei   }
        \ctex_punct_map_family:nn   { \CJKttdefault        } { zhsong  }
        \ctex_punct_map_family:nn   { zhfs                 } { zhsong  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault        } { zhkai   }
        \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhhei } { zhheib  }
        \ctex_punct_map_bfseries:nn
          { \CJKrmdefault, \CJKttdefault, zhsong }
          { zhsongb }
      }
      {
        \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { ubuntu }
        \ctex_punct_set:n { ubuntu }
        \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
        \ctex_punct_map_family:nn   { \CJKttdefault } { zhsong }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
      }
      { \ctex_fontset_error:n { ubuntu } }
  }
  {
    \ctex_set_upmap_unicode:nnn { upserif }
      { :2:NotoSerifCJK-Regular.ttc } { :2:NotoSerifCJK-Bold.ttc }
    \ctex_set_upmap_unicode:nnn { upsans  }
      { :2:NotoSansCJK-Regular.ttc  } { :2:NotoSansCJK-Bold.ttc  }
    \ctex_set_upmap_unicode:nnn { upmono  }
      { :2:NotoSerifCJK-Regular.ttc } { }
    \ctex_set_upmap:nnn { upserifit } { gkai00mp.ttf  } { }
    \ctex_set_upfamily:nnn { zhsong } { upzhserif   } { upzhserifb }
    \ctex_set_upfamily:nnn { zhhei  } { upzhsans    } { upzhsansb  }
    \ctex_set_upfamily:nnn { zhfs   } { upzhmono    } { }
    \ctex_set_upfamily:nnn { zhkai  } { upzhserifit } { }
  }
  {
    \setCJKmainfont { Noto~Serif~CJK~SC }
      [ BoldFont = Noto~Serif~CJK~SC~Bold, ItalicFont = AR~PL~KaitiM~GB ]
    \setCJKsansfont { Noto~Sans~CJK~SC  }
      [ BoldFont = Noto~Sans~CJK~SC~Bold ]
    \fontspec_font_if_exist:nTF { LXGWZhuqueFangsong-Regular.ttf }
      {
        \setCJKmonofont { LXGWZhuqueFangsong-Regular.ttf }
        \setCJKfamilyfont { zhfs } { LXGWZhuqueFangsong-Regular.ttf }
      }
      {
        \fontspec_font_if_exist:nTF { FandolFang-Regular.otf }
          {
            \setCJKmonofont { FandolFang-Regular.otf }
            \setCJKfamilyfont { zhfs } { FandolFang-Regular.otf }
          }
          {
            \setCJKmonofont { Noto~Serif~CJK~SC }
            \setCJKfamilyfont { zhfs } { Noto~Serif~CJK~SC }
          }
      }
    \setCJKfamilyfont { zhsong } { Noto~Serif~CJK~SC }
      [ BoldFont = Noto~Serif~CJK~SC~Bold ]
    \setCJKfamilyfont { zhhei  } { Noto~Sans~CJK~SC  }
      [ BoldFont = Noto~Sans~CJK~SC~Bold ]
    \setCJKfamilyfont { zhkai  } { AR~PL~KaitiM~GB   }
  }
%</ubuntu>
%    \end{macrocode}
%
% \paragraph{\opt{windows}}
%
% \changes{v2.4.1}{2016/05/14}{使用 \file{bootfont.bin} 判断 Windows XP 以避免
%   权限问题。}
% \changes{v2.5}{2019/11/04}{使用环境变量代替绝对路径查找字体。}
% \changes{v2.5}{2019/11/05}{不再支持 Windows XP 系统，\opt{windowsold} 和
%   \opt{windowsnew} 成为过时字库选项。}
% \changes{v2.6.1}{2026/07/01}{补全字库选项 \opt{windows} 的 \pdfTeX{} 分支中，
%   \cs{ctex_zhmap_case:nnn} 的第三个子分支 \opt{zhmap != false} 缺失的报错。}
%
% \begin{variable}{ \c_@@_msyh_suffix_tl}
% Windows 8 以后，微软雅黑由原来的 \file{.ttf} 后缀改为 \file{.ttc} 后缀，需要
% 加以区分。
%    \begin{macrocode}
%<*windows>
\file_if_exist:nTF { \c_dollar_str WINDIR/Fonts/msyh.ttc }
  { \tl_const:Nn \c_@@_msyh_suffix_tl { ttc } }
  {
    \file_if_exist:nTF { msyh.ttc }
      { \tl_const:Nn \c_@@_msyh_suffix_tl { ttc } }
      { \tl_const:Nn \c_@@_msyh_suffix_tl { ttf } }
  }
%    \end{macrocode}
% \end{variable}
%
%    \begin{macrocode}
\ctex_fontset_case:nnn
  {
    \ctex_zhmap_case:nnn
      {
        \ctex_punct_set:n { windows }
        \setCJKmainfont { simsun.ttc }
          [ BoldFont = simhei.ttf, ItalicFont = simkai.ttf ]
        \setCJKsansfont { msyh.\c_@@_msyh_suffix_tl }
          [ BoldFont = msyhbd.\c_@@_msyh_suffix_tl ]
        \setCJKmonofont { simfang.ttf }
        \setCJKfamilyfont { zhsong  } { simsun.ttc  }
        \setCJKfamilyfont { zhhei   } { simhei.ttf  }
        \setCJKfamilyfont { zhfs    } { simfang.ttf }
        \setCJKfamilyfont { zhkai   } { simkai.ttf  }
        \setCJKfamilyfont { zhyahei } { msyh.\c_@@_msyh_suffix_tl }
          [ BoldFont = msyhbd.\c_@@_msyh_suffix_tl ]
        \setCJKfamilyfont { zhli    } { simli.ttf   }
        \setCJKfamilyfont { zhyou   } { simyou.ttf  }
        \ctex_punct_map_family:nn   { \CJKrmdefault          } { zhsong   }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault          } { zhhei    }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault          } { zhkai    }
        \ctex_punct_map_family:nn   { \CJKsfdefault          } { zhyahei  }
        \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhyahei } { zhyaheib }
        \ctex_punct_map_family:nn   { \CJKttdefault          } { zhfs     }
      }
      {
        \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { windows }
        \ctex_punct_set:n { windows }
        \ctex_punct_map_family:nn   { \CJKrmdefault } { zhsong }
        \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei  }
        \ctex_punct_map_itshape:nn  { \CJKrmdefault } { zhkai  }
      }
      { \ctex_fontset_error:n { windows } }
  }
  {
    \ctex_set_upfonts:nnnnnn
      { simsun.ttc                   }
      { simhei.ttf                   }
      { simkai.ttf                   }
      { msyh.\c_@@_msyh_suffix_tl    }
      { msyhbd.\c_@@_msyh_suffix_tl  }
      { simfang.ttf                  }
    \ctex_set_upfamily:nnn { zhsong  } { upzhserif   } {}
    \ctex_set_upfamily:nnn { zhhei   } { upzhserifb  } {}
    \ctex_set_upfamily:nnn { zhfs    } { upzhmono    } {}
    \ctex_set_upfamily:nnn { zhkai   } { upzhserifit } {}
    \ctex_set_upfamily:nnn { zhyahei } { upzhsans    } { upzhsansb }
    \ctex_set_upfamily:nnn { zhli    } { upschrm     } {}
    \ctex_set_upfamily:nnn { zhyou   } { upschgt     } {}
    \ctex_set_upmap:nnn { upstsl } { simli.ttf  } {}
    \ctex_set_upmap:nnn { upstht } { simyou.ttf } {}
  }
  {
    \setCJKmainfont   { SimSun } [ BoldFont = SimHei , ItalicFont = KaiTi ]
    \setCJKsansfont   { Microsoft~YaHei } [ BoldFont = *~Bold ]
    \setCJKmonofont   { FangSong }
    \setCJKfamilyfont { zhsong  } { SimSun          }
    \setCJKfamilyfont { zhhei   } { SimHei          }
    \setCJKfamilyfont { zhfs    } { FangSong        }
    \setCJKfamilyfont { zhkai   } { KaiTi           }
    \setCJKfamilyfont { zhyahei } { Microsoft~YaHei } [ BoldFont = *~Bold ]
    \setCJKfamilyfont { zhli    } { LiSu            }
    \setCJKfamilyfont { zhyou   } { YouYuan         }
  }
%</windows>
%    \end{macrocode}
%
% \subsubsection{中文字体命令}
% \changes{v2.4.14}{2018/05/01}{为 \opt{macnew} 配置字体命令。}
%
% \begin{macro}{\songti,\heiti,\fangsong,\kaishu,\lishu,\youyuan,\yahei,\pingfang}
% 使用 \upLaTeX{} 编译时，\opt{macnew} 字库中由于传统黑体（黑体-简）无法使用，
% 我们用苹方来代替。同时 \tn{yahei}、\tn{pingfang} 命令被设置为与 \tn{heiti} 相同。
%    \begin{macrocode}
%<*!mac>
\NewDocumentCommand \songti   { } { \CJKfamily { zhsong  } }
\NewDocumentCommand \heiti    { } { \CJKfamily { zhhei   } }
\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs    } }
\NewDocumentCommand \kaishu   { } { \CJKfamily { zhkai   } }
%<*windows|founder|macnew>
\NewDocumentCommand \lishu    { } { \CJKfamily { zhli    } }
\NewDocumentCommand \youyuan  { } { \CJKfamily { zhyou   } }
%</windows|founder|macnew>
%<windows>\NewDocumentCommand \yahei    { } { \CJKfamily { zhyahei } }
%<*macnew>
\bool_lazy_or:nnTF
  { \sys_if_engine_pdftex_p: }
  { \sys_if_engine_uptex_p:  }
  {
    \cs_new_eq:NN \yahei    \heiti
    \cs_new_eq:NN \pingfang \heiti
  }
  {
    \bool_if:NTF \g_@@_mac_pingfang_bool
      {
        \NewDocumentCommand \yahei    { } { \CJKfamily { zhpf } }
        \NewDocumentCommand \pingfang { } { \CJKfamily { zhpf } }
      }
      {
        \cs_new_eq:NN \yahei    \heiti
        \cs_new_eq:NN \pingfang \heiti
      }
  }
%</macnew>
%</!mac>
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</fontset>
%    \end{macrocode}
%
% \subsubsection{\pkg{zhmetrics} 的字体映射}
%
% \changes{v2.5.2}{2020/05/05}{\file{zhadobefonts.tex} 等字体映射文件更名为
%   \file{ctex-zhmap-*.tex}。}
%
% 确认 \tn{catcode}，没有重复载入检查。
%    \begin{macrocode}
%<*zhmap>
\begingroup\catcode61\catcode48\catcode32=10\relax%
  \catcode 35=6  % #
  \catcode 45=12 % -
  \catcode123=1  % {
  \catcode125=2  % }
  \toks0{\endlinechar=\the\endlinechar\relax}%
  \toks2{\endlinechar=-1 }%
  \def\x#1 #2 {%
    \toks0\expandafter{\the\toks0 \catcode#1=\the\catcode#1\relax}%
    \toks2\expandafter{\the\toks2 \catcode#1=#2 }}%
  \x  13  5 % carriage return
  \x  32 10 % space
  \x  35  6 % #
  \x  40 12 % (
  \x  41 12 % )
  \x  45 12 % -
  \x  46 12 % .
  \x  47 12 % /
  \x  58 12 % :
  \x  60 12 % <
  \x  61 12 % =
  \x  64 11 % @
  \x  91 12 % [
  \x  93 12 % ]
  \x 123  1 % {
  \x 125  2 % }
  \edef\x#1{\endgroup%
    \edef\noexpand#1{%
      \the\toks0 %
      \let\noexpand\noexpand\noexpand#1%
          \noexpand\noexpand\noexpand\undefined%
      \noexpand\noexpand\noexpand\endinput}%
    \the\toks2}%
\expandafter\x\csname ctex@zhmap@endinput\endcsname
%    \end{macrocode}
%
% \begin{macro}[int]{\ifzhmappdf}
%    \begin{macrocode}
\begingroup\expandafter\endgroup
\expandafter\let\csname ifzhmappdf\expandafter\endcsname\csname
  \expandafter\ifx\csname ifctexpdf\endcsname\relax
    \expandafter\ifx\csname pdfoutput\endcsname\relax
      iffalse\else\ifnum\pdfoutput < 1 iffalse\else iftrue\fi\fi
  \else ifctexpdf\fi
\endcsname
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\ProvidesFile}
% 提供非 \LaTeX{} 格式下的 \tn{ProvidesFile}。
%    \begin{macrocode}
\begingroup
\expandafter\ifx\csname ProvidesFile\endcsname\relax
  \long\def\x#1\ProvidesFile#2[#3]{%
    #1%
    \immediate\write-1{File: #2 #3}%
    \expandafter\xdef\csname ver@#2\endcsname{#3}}
  \expandafter\x%
\fi
\endgroup
%    \end{macrocode}
% \end{macro}
%
% 文件标识信息。
%    \begin{macrocode}
%<*zhmap>
%<adobe>\ProvidesFile{ctex-zhmap-adobe.tex}%
%<fandol>\ProvidesFile{ctex-zhmap-fandol.tex}%
%<founder>\ProvidesFile{ctex-zhmap-founder.tex}%
%<hanyi>\ProvidesFile{ctex-zhmap-hanyi.tex}%
%<mac>\ProvidesFile{ctex-zhmap-mac.tex}%
%<ubuntu>\ProvidesFile{ctex-zhmap-ubuntu.tex}%
%<windows>\ProvidesFile{ctex-zhmap-windows.tex}%
%<zhmap>  [\ExplFileDate\space v\ExplFileVersion\space \ExplFileDescription]
%</zhmap>
%    \end{macrocode}
%
% \paragraph{\pkg{ctex-zhmap-adobe.tex}}
%
%    \begin{macrocode}
%<*adobe>
\ifzhmappdf
%% pdfTeX does not support OTF fonts
\else
  \special{pdf:mapline gbk@UGBK@          UniGB-UTF16-H AdobeSongStd-Light.otf}
  \special{pdf:mapline gbksong@UGBK@      UniGB-UTF16-H AdobeSongStd-Light.otf}
  \special{pdf:mapline gbkkai@UGBK@       UniGB-UTF16-H AdobeKaitiStd-Regular.otf}
  \special{pdf:mapline gbkhei@UGBK@       UniGB-UTF16-H AdobeHeitiStd-Regular.otf}
  \special{pdf:mapline gbkfs@UGBK@        UniGB-UTF16-H AdobeFangsongStd-Regular.otf}
  \special{pdf:mapline cyberb@Unicode@    UniGB-UTF16-H AdobeSongStd-Light.otf}
  \special{pdf:mapline unisong@Unicode@   UniGB-UTF16-H AdobeSongStd-Light.otf}
  \special{pdf:mapline unikai@Unicode@    UniGB-UTF16-H AdobeKaitiStd-Regular.otf}
  \special{pdf:mapline unihei@Unicode@    UniGB-UTF16-H AdobeHeitiStd-Regular.otf}
  \special{pdf:mapline unifs@Unicode@     UniGB-UTF16-H AdobeFangsongStd-Regular.otf}
  \special{pdf:mapline gbksongsl@UGBK@    UniGB-UTF16-H AdobeSongStd-Light.otf       -s .167}
  \special{pdf:mapline gbkkaisl@UGBK@     UniGB-UTF16-H AdobeKaitiStd-Regular.otf    -s .167}
  \special{pdf:mapline gbkheisl@UGBK@     UniGB-UTF16-H AdobeHeitiStd-Regular.otf    -s .167}
  \special{pdf:mapline gbkfssl@UGBK@      UniGB-UTF16-H AdobeFangsongStd-Regular.otf -s .167}
  \special{pdf:mapline unisongsl@Unicode@ UniGB-UTF16-H AdobeSongStd-Light.otf       -s .167}
  \special{pdf:mapline unikaisl@Unicode@  UniGB-UTF16-H AdobeKaitiStd-Regular.otf    -s .167}
  \special{pdf:mapline uniheisl@Unicode@  UniGB-UTF16-H AdobeHeitiStd-Regular.otf    -s .167}
  \special{pdf:mapline unifssl@Unicode@   UniGB-UTF16-H AdobeFangsongStd-Regular.otf -s .167}
\fi
%</adobe>
%    \end{macrocode}
%
% \paragraph{\pkg{ctex-zhmap-fandol.tex}}
%
%    \begin{macrocode}
%<*fandol>
\ifzhmappdf
%% pdfTeX does not support OTF fonts
\else
  \special{pdf:mapline gbk@UGBK@          UniGB-UTF16-H FandolSong-Regular.otf}
  \special{pdf:mapline gbksong@UGBK@      UniGB-UTF16-H FandolSong-Regular.otf}
  \special{pdf:mapline gbkkai@UGBK@       UniGB-UTF16-H FandolKai-Regular.otf}
  \special{pdf:mapline gbkhei@UGBK@       UniGB-UTF16-H FandolHei-Regular.otf}
  \special{pdf:mapline gbkfs@UGBK@        UniGB-UTF16-H FandolFang-Regular.otf}
  \special{pdf:mapline cyberb@Unicode@    UniGB-UTF16-H FandolSong-Regular.otf}
  \special{pdf:mapline unisong@Unicode@   UniGB-UTF16-H FandolSong-Regular.otf}
  \special{pdf:mapline unikai@Unicode@    UniGB-UTF16-H FandolKai-Regular.otf}
  \special{pdf:mapline unihei@Unicode@    UniGB-UTF16-H FandolHei-Regular.otf}
  \special{pdf:mapline unifs@Unicode@     UniGB-UTF16-H FandolFang-Regular.otf}
  \special{pdf:mapline gbksongsl@UGBK@    UniGB-UTF16-H FandolSong-Regular.otf -s .167}
  \special{pdf:mapline gbkkaisl@UGBK@     UniGB-UTF16-H FandolKai-Regular.otf  -s .167}
  \special{pdf:mapline gbkheisl@UGBK@     UniGB-UTF16-H FandolHei-Regular.otf  -s .167}
  \special{pdf:mapline gbkfssl@UGBK@      UniGB-UTF16-H FandolFang-Regular.otf -s .167}
  \special{pdf:mapline unisongsl@Unicode@ UniGB-UTF16-H FandolSong-Regular.otf -s .167}
  \special{pdf:mapline unikaisl@Unicode@  UniGB-UTF16-H FandolKai-Regular.otf  -s .167}
  \special{pdf:mapline uniheisl@Unicode@  UniGB-UTF16-H FandolHei-Regular.otf  -s .167}
  \special{pdf:mapline unifssl@Unicode@   UniGB-UTF16-H FandolFang-Regular.otf -s .167}
\fi
%</fandol>
%    \end{macrocode}
%
% \paragraph{\pkg{ctex-zhmap-founder.tex}}
%
%    \begin{macrocode}
%<*founder>
\ifzhmappdf
  \pdfmapline{=gbk@UGBK@          <FZSSK.TTF}
  \pdfmapline{=gbksong@UGBK@      <FZSSK.TTF}
  \pdfmapline{=gbkkai@UGBK@       <FZKTK.TTF}
  \pdfmapline{=gbkhei@UGBK@       <FZHTK.TTF}
  \pdfmapline{=gbkfs@UGBK@        <FZFSK.TTF}
  \pdfmapline{=gbkli@UGBK@        <FZLSK.TTF}
  \pdfmapline{=gbkyou@UGBK@       <FZY1K.TTF}
  \pdfmapline{=cyberb@Unicode@    <FZSSK.TTF}
  \pdfmapline{=unisong@Unicode@   <FZSSK.TTF}
  \pdfmapline{=unikai@Unicode@    <FZKTK.TTF}
  \pdfmapline{=unihei@Unicode@    <FZHTK.TTF}
  \pdfmapline{=unifs@Unicode@     <FZFSK.TTF}
  \pdfmapline{=unili@Unicode@     <FZLSK.TTF}
  \pdfmapline{=uniyou@Unicode@    <FZY1K.TTF}
  \pdfmapline{=gbksongsl@UGBK@    <FZSSK.TTF}
  \pdfmapline{=gbkkaisl@UGBK@     <FZKTK.TTF}
  \pdfmapline{=gbkheisl@UGBK@     <FZHTK.TTF}
  \pdfmapline{=gbkfssl@UGBK@      <FZFSK.TTF}
  \pdfmapline{=gbklisl@UGBK@      <FZLSK.TTF}
  \pdfmapline{=gbkyousl@UGBK@     <FZY1K.TTF}
  \pdfmapline{=unisongsl@Unicode@ <FZSSK.TTF}
  \pdfmapline{=unikaisl@Unicode@  <FZKTK.TTF}
  \pdfmapline{=uniheisl@Unicode@  <FZHTK.TTF}
  \pdfmapline{=unifssl@Unicode@   <FZFSK.TTF}
  \pdfmapline{=unilisl@Unicode@   <FZLSK.TTF}
  \pdfmapline{=uniyousl@Unicode@  <FZY1K.TTF}
\else
  \special{pdf:mapline gbk@UGBK@          unicode FZSSK.TTF}
  \special{pdf:mapline gbksong@UGBK@      unicode FZSSK.TTF}
  \special{pdf:mapline gbkkai@UGBK@       unicode FZKTK.TTF}
  \special{pdf:mapline gbkhei@UGBK@       unicode FZHTK.TTF}
  \special{pdf:mapline gbkfs@UGBK@        unicode FZFSK.TTF}
  \special{pdf:mapline gbkli@UGBK@        unicode FZLSK.TTF}
  \special{pdf:mapline gbkyou@UGBK@       unicode FZY1K.TTF}
  \special{pdf:mapline cyberb@Unicode@    unicode FZSSK.TTF}
  \special{pdf:mapline unisong@Unicode@   unicode FZSSK.TTF}
  \special{pdf:mapline unikai@Unicode@    unicode FZKTK.TTF}
  \special{pdf:mapline unihei@Unicode@    unicode FZHTK.TTF}
  \special{pdf:mapline unifs@Unicode@     unicode FZFSK.TTF}
  \special{pdf:mapline unili@Unicode@     unicode FZLSK.TTF}
  \special{pdf:mapline uniyou@Unicode@    unicode FZY1K.TTF}
  \special{pdf:mapline gbksongsl@UGBK@    unicode FZSSK.TTF -s .167}
  \special{pdf:mapline gbkkaisl@UGBK@     unicode FZKTK.TTF -s .167}
  \special{pdf:mapline gbkheisl@UGBK@     unicode FZHTK.TTF -s .167}
  \special{pdf:mapline gbkfssl@UGBK@      unicode FZFSK.TTF -s .167}
  \special{pdf:mapline gbklisl@UGBK@      unicode FZLSK.TTF -s .167}
  \special{pdf:mapline gbkyousl@UGBK@     unicode FZY1K.TTF -s .167}
  \special{pdf:mapline unisongsl@Unicode@ unicode FZSSK.TTF -s .167}
  \special{pdf:mapline unikaisl@Unicode@  unicode FZKTK.TTF -s .167}
  \special{pdf:mapline uniheisl@Unicode@  unicode FZHTK.TTF -s .167}
  \special{pdf:mapline unifssl@Unicode@   unicode FZFSK.TTF -s .167}
  \special{pdf:mapline unilisl@Unicode@   unicode FZLSK.TTF -s .167}
  \special{pdf:mapline uniyousl@Unicode@  unicode FZY1K.TTF -s .167}
\fi
%</founder>
%    \end{macrocode}
%
% \paragraph{\pkg{ctex-zhmap-hanyi.tex}}
%
%    \begin{macrocode}
%<*hanyi>
\ifzhmappdf
  \pdfmapline{=gbk@UGBK@          <HYShuSongErS.ttf}
  \pdfmapline{=gbksong@UGBK@      <HYShuSongErS.ttf}
  \pdfmapline{=gbkkai@UGBK@       <HYKaiTiS.ttf}
  \pdfmapline{=gbkhei@UGBK@       <HYZhongHeiS.ttf}
  \pdfmapline{=gbkfs@UGBK@        <HYFangSongS.ttf}
  \pdfmapline{=cyberb@Unicode@    <HYShuSongErS.ttf}
  \pdfmapline{=unisong@Unicode@   <HYShuSongErS.ttf}
  \pdfmapline{=unikai@Unicode@    <HYKaiTiS.ttf}
  \pdfmapline{=unihei@Unicode@    <HYZhongHeiS.ttf}
  \pdfmapline{=unifs@Unicode@     <HYFangSongS.ttf}
  \pdfmapline{=gbksongsl@UGBK@    <HYShuSongErS.ttf}
  \pdfmapline{=gbkkaisl@UGBK@     <HYKaiTiS.ttf}
  \pdfmapline{=gbkheisl@UGBK@     <HYZhongHeiS.ttf}
  \pdfmapline{=gbkfssl@UGBK@      <HYFangSongS.ttf}
  \pdfmapline{=unisongsl@Unicode@ <HYShuSongErS.ttf}
  \pdfmapline{=unikaisl@Unicode@  <HYKaiTiS.ttf}
  \pdfmapline{=uniheisl@Unicode@  <HYZhongHeiS.ttf}
  \pdfmapline{=unifssl@Unicode@   <HYFangSongS.ttf}
\else
  \special{pdf:mapline gbk@UGBK@          unicode HYShuSongErS.ttf}
  \special{pdf:mapline gbksong@UGBK@      unicode HYShuSongErS.ttf}
  \special{pdf:mapline gbkkai@UGBK@       unicode HYKaiTiS.ttf}
  \special{pdf:mapline gbkhei@UGBK@       unicode HYZhongHeiS.ttf}
  \special{pdf:mapline gbkfs@UGBK@        unicode HYFangSongS.ttf}
  \special{pdf:mapline cyberb@Unicode@    unicode HYShuSongErS.ttf}
  \special{pdf:mapline unisong@Unicode@   unicode HYShuSongErS.ttf}
  \special{pdf:mapline unikai@Unicode@    unicode HYKaiTiS.ttf}
  \special{pdf:mapline unihei@Unicode@    unicode HYZhongHeiS.ttf}
  \special{pdf:mapline unifs@Unicode@     unicode HYFangSongS.ttf}
  \special{pdf:mapline gbksongsl@UGBK@    unicode HYShuSongErS.ttf -s .167}
  \special{pdf:mapline gbkkaisl@UGBK@     unicode HYKaiTiS.ttf     -s .167}
  \special{pdf:mapline gbkheisl@UGBK@     unicode HYZhongHeiS.ttf  -s .167}
  \special{pdf:mapline gbkfssl@UGBK@      unicode HYFangSongS.ttf  -s .167}
  \special{pdf:mapline unisongsl@Unicode@ unicode HYShuSongErS.ttf -s .167}
  \special{pdf:mapline unikaisl@Unicode@  unicode HYKaiTiS.ttf     -s .167}
  \special{pdf:mapline uniheisl@Unicode@  unicode HYZhongHeiS.ttf  -s .167}
  \special{pdf:mapline unifssl@Unicode@   unicode HYFangSongS.ttf  -s .167}
\fi
%</hanyi>
%    \end{macrocode}
%
% \paragraph{\pkg{ctex-zhmap-mac.tex}}
%
% \changes{v2.5}{2020/01/15}{增加字体映射文件 \file{zhmacfonts.tex}。}
%
%    \begin{macrocode}
%<*mac>
\ifzhmappdf
%% pdfTeX does not support OTF fonts
\else
  \special{pdf:mapline gbk@UGBK@          UniGB-UTF16-H :3:Songti.ttc}
  \special{pdf:mapline gbksong@UGBK@      UniGB-UTF16-H :3:Songti.ttc}
  \special{pdf:mapline gbkkai@UGBK@       UniGB-UTF16-H :0:Kaiti.ttc}
  \special{pdf:mapline gbkhei@UGBK@       unicode       :2:PingFang.ttc}
  \special{pdf:mapline gbkfs@UGBK@        unicode       STFANGSO.ttf}
  \special{pdf:mapline gbkli@UGBK@        UniGB-UTF16-H :0:Baoli.ttc}
  \special{pdf:mapline gbkyou@UGBK@       UniGB-UTF16-H :4:Yuanti.ttc}
  \special{pdf:mapline cyberb@Unicode@    UniGB-UTF16-H :3:Songti.ttc}
  \special{pdf:mapline unisong@Unicode@   UniGB-UTF16-H :3:Songti.ttc}
  \special{pdf:mapline unikai@Unicode@    UniGB-UTF16-H :0:Kaiti.ttc}
  \special{pdf:mapline unihei@Unicode@    unicode       :2:PingFang.ttc}
  \special{pdf:mapline unifs@Unicode@     unicode       STFANGSO.ttf}
  \special{pdf:mapline unili@Unicode@     UniGB-UTF16-H :0:Baoli.ttc}
  \special{pdf:mapline uniyou@Unicode@    UniGB-UTF16-H :4:Yuanti.ttc}
  \special{pdf:mapline gbksongsl@UGBK@    UniGB-UTF16-H :3:Songti.ttc   -s .167}
  \special{pdf:mapline gbkkaisl@UGBK@     UniGB-UTF16-H :0:Kaiti.ttc    -s .167}
  \special{pdf:mapline gbkheisl@UGBK@     unicode       :2:PingFang.ttc -s .167}
  \special{pdf:mapline gbkfssl@UGBK@      unicode       STFANGSO.ttf    -s .167}
  \special{pdf:mapline gbklisl@UGBK@      UniGB-UTF16-H :0:Baoli.ttc    -s .167}
  \special{pdf:mapline gbkyousl@UGBK@     UniGB-UTF16-H :4:Yuanti.ttc   -s .167}
  \special{pdf:mapline unisongsl@Unicode@ UniGB-UTF16-H :3:Songti.ttc   -s .167}
  \special{pdf:mapline unikaisl@Unicode@  UniGB-UTF16-H :0:Kaiti.ttc    -s .167}
  \special{pdf:mapline uniheisl@Unicode@  unicode       :2:PingFang.ttc -s .167}
  \special{pdf:mapline unifssl@Unicode@   unicode       STFANGSO.ttf    -s .167}
  \special{pdf:mapline unilisl@Unicode@   UniGB-UTF16-H :0:Baoli.ttc    -s .167}
  \special{pdf:mapline uniyousl@Unicode@  UniGB-UTF16-H :4:Yuanti.ttc   -s .167}
\fi
%</mac>
%    \end{macrocode}
%
% \paragraph{\pkg{ctex-zhmap-ubuntu.tex}}
%
%    \begin{macrocode}
%<*ubuntu>
\ifzhmappdf
%% pdfTeX does not support OTF fonts
\else
  \special{pdf:mapline gbk@UGBK@          unicode :2:NotoSerifCJK-Regular.ttc}
  \special{pdf:mapline gbksong@UGBK@      unicode :2:NotoSerifCJK-Regular.ttc}
  \special{pdf:mapline gbkkai@UGBK@       unicode gkai00mp.ttf}
  \special{pdf:mapline gbkhei@UGBK@       unicode :2:NotoSansCJK-Regular.ttc}
  \special{pdf:mapline gbkfs@UGBK@        unicode :2:NotoSerifCJK-Regular.ttc}
  \special{pdf:mapline cyberb@Unicode@    unicode :2:NotoSerifCJK-Regular.ttc}
  \special{pdf:mapline unisong@Unicode@   unicode :2:NotoSerifCJK-Regular.ttc}
  \special{pdf:mapline unikai@Unicode@    unicode gkai00mp.ttf}
  \special{pdf:mapline unihei@Unicode@    unicode :2:NotoSansCJK-Regular.ttc}
  \special{pdf:mapline unifs@Unicode@     unicode :2:NotoSerifCJK-Regular.ttc}
  \special{pdf:mapline gbksongsl@UGBK@    unicode :2:NotoSerifCJK-Regular.ttc -s .167}
  \special{pdf:mapline gbkkaisl@UGBK@     unicode gkai00mp.ttf                -s .167}
  \special{pdf:mapline gbkheisl@UGBK@     unicode :2:NotoSansCJK-Regular.ttc  -s .167}
  \special{pdf:mapline gbkfssl@UGBK@      unicode :2:NotoSerifCJK-Regular.ttc -s .167}
  \special{pdf:mapline unisongsl@Unicode@ unicode :2:NotoSerifCJK-Regular.ttc -s .167}
  \special{pdf:mapline unikaisl@Unicode@  unicode gkai00mp.ttf                -s .167}
  \special{pdf:mapline uniheisl@Unicode@  unicode :2:NotoSansCJK-Regular.ttc  -s .167}
  \special{pdf:mapline unifssl@Unicode@   unicode :2:NotoSerifCJK-Regular.ttc -s .167}
\fi
%</ubuntu>
%    \end{macrocode}
%
% \paragraph{\pkg{ctex-zhmap-windows.tex}}
%
%    \begin{macrocode}
%<*windows>
\ifzhmappdf
  \pdfmapline{=gbk@UGBK@          <simsun.ttc}
  \pdfmapline{=gbksong@UGBK@      <simsun.ttc}
  \pdfmapline{=gbkkai@UGBK@       <simkai.ttf}
  \pdfmapline{=gbkhei@UGBK@       <simhei.ttf}
  \pdfmapline{=gbkfs@UGBK@        <simfang.ttf}
  \pdfmapline{=gbkli@UGBK@        <simli.ttf}
  \pdfmapline{=gbkyou@UGBK@       <simyou.ttf}
  \pdfmapline{=cyberb@Unicode@    <simsun.ttc}
  \pdfmapline{=unisong@Unicode@   <simsun.ttc}
  \pdfmapline{=unikai@Unicode@    <simkai.ttf}
  \pdfmapline{=unihei@Unicode@    <simhei.ttf}
  \pdfmapline{=unifs@Unicode@     <simfang.ttf}
  \pdfmapline{=unili@Unicode@     <simli.ttf}
  \pdfmapline{=uniyou@Unicode@    <simyou.ttf}
  \pdfmapline{=gbksongsl@UGBK@    <simsun.ttc}
  \pdfmapline{=gbkkaisl@UGBK@     <simkai.ttf}
  \pdfmapline{=gbkheisl@UGBK@     <simhei.ttf}
  \pdfmapline{=gbkfssl@UGBK@      <simfang.ttf}
  \pdfmapline{=gbklisl@UGBK@      <simli.ttf}
  \pdfmapline{=gbkyousl@UGBK@     <simyou.ttf}
  \pdfmapline{=unisongsl@Unicode@ <simsun.ttc}
  \pdfmapline{=unikaisl@Unicode@  <simkai.ttf}
  \pdfmapline{=uniheisl@Unicode@  <simhei.ttf}
  \pdfmapline{=unifssl@Unicode@   <simfang.ttf}
  \pdfmapline{=unilisl@Unicode@   <simli.ttf}
  \pdfmapline{=uniyousl@Unicode@  <simyou.ttf}
\else
  \special{pdf:mapline gbk@UGBK@          unicode :0:simsun.ttc -v 50}
  \special{pdf:mapline gbksong@UGBK@      unicode :0:simsun.ttc -v 50}
  \special{pdf:mapline gbkkai@UGBK@       unicode simkai.ttf    -v 70}
  \special{pdf:mapline gbkhei@UGBK@       unicode simhei.ttf    -v 150}
  \special{pdf:mapline gbkfs@UGBK@        unicode simfang.ttf   -v 50}
  \special{pdf:mapline gbkli@UGBK@        unicode simli.ttf     -v 150}
  \special{pdf:mapline gbkyou@UGBK@       unicode simyou.ttf    -v 60}
  \special{pdf:mapline cyberb@Unicode@    unicode :0:simsun.ttc -v 50}
  \special{pdf:mapline unisong@Unicode@   unicode :0:simsun.ttc -v 50}
  \special{pdf:mapline unikai@Unicode@    unicode simkai.ttf    -v 70}
  \special{pdf:mapline unihei@Unicode@    unicode simhei.ttf    -v 150}
  \special{pdf:mapline unifs@Unicode@     unicode simfang.ttf   -v 50}
  \special{pdf:mapline unili@Unicode@     unicode simli.ttf     -v 150}
  \special{pdf:mapline uniyou@Unicode@    unicode simyou.ttf    -v 60}
  \special{pdf:mapline gbksongsl@UGBK@    unicode :0:simsun.ttc -v 50  -s .167}
  \special{pdf:mapline gbkkaisl@UGBK@     unicode simkai.ttf    -v 70  -s .167}
  \special{pdf:mapline gbkheisl@UGBK@     unicode simhei.ttf    -v 150 -s .167}
  \special{pdf:mapline gbkfssl@UGBK@      unicode simfang.ttf   -v 50  -s .167}
  \special{pdf:mapline gbklisl@UGBK@      unicode simli.ttf     -v 150 -s .167}
  \special{pdf:mapline gbkyousl@UGBK@     unicode simyou.ttf    -v 60  -s .167}
  \special{pdf:mapline unisongsl@Unicode@ unicode :0:simsun.ttc -v 50  -s .167}
  \special{pdf:mapline unikaisl@Unicode@  unicode simkai.ttf    -v 70  -s .167}
  \special{pdf:mapline uniheisl@Unicode@  unicode simhei.ttf    -v 150 -s .167}
  \special{pdf:mapline unifssl@Unicode@   unicode simfang.ttf   -v 50  -s .167}
  \special{pdf:mapline unilisl@Unicode@   unicode simli.ttf     -v 150 -s .167}
  \special{pdf:mapline uniyousl@Unicode@  unicode simyou.ttf    -v 60  -s .167}
\fi
%</windows>
%    \end{macrocode}
%
%    \begin{macrocode}
\ctex@zhmap@endinput
%</zhmap>
%    \end{macrocode}
%
% \subsubsection{制作 \texttt{spa} 文件}
%
% \changes{v2.5.2}
%   {2020/05/05}{\file{ctexmakespa.tex} 更名为 \file{ctex-spa-make.tex}。}
% \changes{v2.5.2}
%   {2020/05/05}{\file{ctexspamacro.tex} 更名为 \file{ctex-spa-macro.tex}。}
% \changes{v2.6.0}{2026/04/30}
%   {修复了 \TeX\ tree 字体无法制作 \file{.spa} 文件的问题。}
%
% 我们通过 \XeTeX{} 的 \tn{XeTeXglyphbounds} 取得字体中标点符号的边界信息，为
% \pkg{CJKpunct} 宏包制作 \file{spa}。
%
%    \begin{macrocode}
%<*spa>
%<*macro>
\input expl3-generic %
\ExplSyntaxOn
\sys_if_engine_xetex:F
  {
    \msg_new:nnn { ctex } { xetex }
      { XeTeX~is~required~to~compile~this~document! }
    \msg_fatal:nn { ctex } { xetex }
  }
%    \end{macrocode}
%
% \pkg{CJKpunct} 定义的标点符号是：
% \begin{verbatim}
%   ‘“「『〔（［｛〈《〖【
%   —…、。，．：；！？％〕）］｝〉》〗】’”」』
% \end{verbatim}
% 注意顺序不能改变。
%    \begin{macrocode}
\seq_const_from_clist:Nn \c_@@_punct_seq
  {
    "2018 , "201C , "300C , "300E , "3014 , "FF08 , "FF3B , "FF5B ,
    "3008 , "300A , "3016 , "3010 ,
    "2014 , "2026 , "3001 , "3002 , "FF0C , "FF0E , "FF1A , "FF1B ,
    "FF01 , "FF1F , "FF05 , "3015 , "FF09 , "FF3D , "FF5D , "3009 ,
    "300B , "3017 , "3011 , "2019 , "201D , "300D , "300F
  }
%    \end{macrocode}
%
% \begin{macro}[int]{\ctex_make_spa:nn}
% |#1| 是 \file{spa} 文件名，|#2| 是由 CJK 族名与字体构成的逗号列表。
%    \begin{macrocode}
\cs_new_protected:Npn \ctex_make_spa:nn #1#2
  {
    \iow_open:Nn \g_@@_spa_iow {#1}
    \clist_map_inline:nn {#2}
      { \@@_write_family:nn ##1 }
    \iow_close:N \g_@@_spa_iow
  }
\iow_new:N \g_@@_spa_iow
\cs_new_eq:NN \MAKESPA \ctex_make_spa:nn
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\cs_new_protected:Npn \@@_write_family:nn #1#2
  {
    \group_begin:
      \@@_if_font_exists:nTF {#2}
        { \tex_font:D \l_@@_punct_font = "[#2]" ~ at ~ 100 pt \scan_stop: }
        { \tex_font:D \l_@@_punct_font =  "#2"  ~ at ~ 100 pt \scan_stop: }
      \l_@@_punct_font
      \clist_clear:N \l_@@_punct_bounds_clist
      \seq_map_inline:Nn \c_@@_punct_seq
        {
          \exp_args:No \@@_save_bounds:n
            { \int_use:N \tex_XeTeXcharglyph:D ##1 }
        }
      \iow_now:Ne \g_@@_spa_iow
        {
          \token_to_str:N \ctexspadef {#1}
%    \end{macrocode}
% 最后这三个逗号对 \pkg{CJKpunct} 来说是必要的。
%    \begin{macrocode}
            { \l_@@_punct_bounds_clist , , , }
        }
    \group_end:
  }
%    \end{macrocode}
%
% \begin{macro}{\@@_if_font_exists:nTF}
% 优先搜索字体是否为 \TeX\ Tree 字体或是否存在于当前路径下\footnote{^^A
%   事实上 \path{TEXINPUTS} 也会被一并优先搜索。}，
% 如果不存在，\cs{@@_write_family:nn} 会根据结果在 |shell| 中调用 |kpathsea| 查文件
% 或 |fontconfig| 查名称\footnote{^^A
%   如果用户把字体目录加入到了 \path{TEXINPUTS} 中，
%   \cs{file_if_exist_p:n} 可能找到一个 \XeTeX\ |"[basename]"| 加载不了的文件，
%   因为 \XeTeX\ 搜索字体专属路径 \path{OPENTYPEFONTS}/\path{TTFONTS}，
%   不搜索 \path{TEXINPUTS}）。
% }。
%    \begin{macrocode}
\prg_new_protected_conditional:Nnn \@@_if_font_exists:n { TF }
  {
    \tl_clear:N \l_@@_if_otf_exists_tl
    \tl_clear:N \l_@@_if_ttf_exists_tl
    \bool_case:nF
      {
        { \file_if_exist_p:n { #1.otf }          }
        { \tl_set:Nn \l_@@_if_otf_exists_tl {#1} }
        { \file_if_exist_p:n { #1.ttf }          }
        { \tl_set:Nn \l_@@_if_ttf_exists_tl {#1} }
      }
      {
        \sys_get_shell:nnN { kpsewhich ~ #1.otf } { \endlinechar=-1 }
          \l_@@_if_otf_exists_tl
        \sys_get_shell:nnN { kpsewhich ~ #1.ttf } { \endlinechar=-1 }
          \l_@@_if_ttf_exists_tl
      }
    \bool_lazy_and:nnTF
      { \tl_if_blank_p:V \l_@@_if_otf_exists_tl }
      { \tl_if_blank_p:V \l_@@_if_ttf_exists_tl }
      { \prg_return_false: } { \prg_return_true: }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{variable}
%   {\l_@@_if_otf_exists_tl, \l_@@_if_ttf_exists_tl}
% 用于存储 |shell| 输出的 |kpsewhich| 结果。
%    \begin{macrocode}
\tl_clear_new:N \l_@@_if_otf_exists_tl
\tl_clear_new:N \l_@@_if_ttf_exists_tl
%    \end{macrocode}
% \end{variable}
%
%    \begin{macrocode}
\cs_new_protected:Npn \@@_save_bounds:n #1
  {
    \clist_put_right:Ne \l_@@_punct_bounds_clist
      {
        \@@_calc_bounds:nn { 1 } {#1} ,
        \@@_calc_bounds:nn { 3 } {#1}
      }
  }
\clist_new:N \l_@@_punct_bounds_clist
%    \end{macrocode}
%
% \pkg{CJKpunct} 要求的格式是边界空白宽度与 1\,em 的比值的一百倍。
%    \begin{macrocode}
\cs_new:Npn \@@_calc_bounds:nn #1#2
  {
    \fp_eval:n
      {
        round
          (
            \dim_to_decimal_in_unit:nn
              { 100 \tex_XeTeXglyphbounds:D #1 ~ #2 }
              { 1 em }
          )
      }
  }
\ExplSyntaxOff
%</macro>
%    \end{macrocode}
%
% 下面是 \CTeX{} 定义的一些字体。
%    \begin{macrocode}
%<*make>
\input ctex-spa-macro %
\MAKESPA {ctexpunct.spa}
  {
    {adobezhsong}     {AdobeSongStd-Light} ,
    {adobezhhei}      {AdobeHeitiStd-Regular} ,
    {adobezhkai}      {AdobeKaitiStd-Regular} ,
    {adobezhfs}       {AdobeFangsongStd-Regular} ,
%
    {fandolzhsong}    {FandolSong-Regular} ,
    {fandolzhsongb}   {FandolSong-Bold} ,
    {fandolzhhei}     {FandolHei-Regular} ,
    {fandolzhheib}    {FandolHei-Bold} ,
    {fandolzhkai}     {FandolKai-Regular} ,
    {fandolzhfs}      {FandolFang-Regular} ,
%
    {founderzhsong}   {FZShuSong-Z01} ,
    {founderzhsongb}  {FZXiaoBiaoSong-B05} ,
    {founderzhhei}    {FZHei-B01} ,
    {founderzhheil}   {FZXiHeiI-Z08} ,
    {founderzhkai}    {FZKai-Z03} ,
    {founderzhfs}     {FZFangSong-Z02} ,
    {founderzhli}     {FZLiShu-S01} ,
    {founderzhyou}    {FZXiYuan-M01} ,
    {founderzhyoub}   {FZZhunYuan-M02} ,
%
    {hanyizhsong}     {HYShuSongEr S} ,
    {hanyizhsongb}    {HYZhongSong S} ,
    {hanyizhhei}      {HYZhongHei S} ,
    {hanyizhheib}     {HYDaHei S} ,
    {hanyizhkai}      {HYKaiTi S} ,
    {hanyizhfs}       {HYFangSong S} ,
%
    {maczhsong}       {Songti SC Light} ,
    {maczhsongb}      {Songti SC Bold} ,
    {maczhhei}        {Heiti SC Medium} ,
    {maczhheil}       {Heiti SC Light} ,
    {maczhkai}        {Kaiti SC} ,
    {maczhkaib}       {Kaiti SC Bold} ,
    {maczhfs}         {STFangsong} ,
    {maczhli}         {Baoli SC} ,
    {maczhyou}        {Yuanti SC Light} ,
    {maczhyoub}       {Yuanti SC Regular} ,
    {maczhpf}         {PingFang SC} ,
    {maczhpfb}        {PingFang SC Semibold} ,
%
    {ubuntuzhsong}    {Noto Serif CJK SC} ,
    {ubuntuzhsongb}   {Noto Serif CJK SC Bold} ,
    {ubuntuzhhei}     {Noto Sans CJK SC} ,
    {ubuntuzhheib}    {Noto Sans CJK SC Bold} ,
    {ubuntuzhkai}     {AR PL KaitiM GB} ,
%
    {windowszhsong}   {SimSun} ,
    {windowszhhei}    {SimHei} ,
    {windowszhkai}    {KaiTi} ,
    {windowszhfs}     {FangSong} ,
    {windowszhli}     {LiSu} ,
    {windowszhyou}    {YouYuan} ,
    {windowszhyahei}  {Microsoft YaHei} ,
    {windowszhyaheib} {Microsoft YaHei Bold}
  }
\primitive\end
%</make>
%</spa>
%    \end{macrocode}
%
% \subsection{字体定义文件}
%
% \subsubsection{传统定义方式}
%
% \changes{v2.4.15}{2019/04/05}{将 \texttt{JY2} 和 \texttt{JT2} 编码的字体定义提取到单独的文件中。}
%
%    \begin{macrocode}
%<*c19|c70>
%%
%% Chinese characters
%%
%<c19>%% character set: GBK (extension of GB 2312)
%<c70>%% character set: Unicode
%% font encoding: Unicode
%%
%</c19|c70>
%    \end{macrocode}
%
% \pkg{CJK} 宏包使用的字体族。
%    \begin{macrocode}
%<rm&c19>\DeclareFontFamily{C19}{rm}{\hyphenchar\font\m@ne}
%<rm&c70>\DeclareFontFamily{C70}{rm}{\hyphenchar\font\m@ne}
%<sf&c19>\DeclareFontFamily{C19}{sf}{\hyphenchar\font\m@ne}
%<sf&c70>\DeclareFontFamily{C70}{sf}{\hyphenchar\font\m@ne}
%<tt&c19>\DeclareFontFamily{C19}{tt}{\hyphenchar\font\m@ne}
%<tt&c70>\DeclareFontFamily{C70}{tt}{\hyphenchar\font\m@ne}
%    \end{macrocode}
%
% \changes{v2.4}{2016/04/25}{提供 \upLaTeX{} 的 NFSS 字体定义。}
% \upLaTeX{} 使用的字体族。\upLaTeX\ 在 NFSS 下使用字体编码 |JY2| 和 |JT2| 来分别
% 表示横排与直排的日文。
%    \begin{macrocode}
%<rm&jy2>\DeclareKanjiFamily{JY2}{zhrm}{}
%<rm&jt2>\DeclareKanjiFamily{JT2}{zhrm}{}
%<sf&jy2>\DeclareKanjiFamily{JY2}{zhsf}{}
%<sf&jt2>\DeclareKanjiFamily{JT2}{zhsf}{}
%<tt&jy2>\DeclareKanjiFamily{JY2}{zhtt}{}
%<tt&jt2>\DeclareKanjiFamily{JT2}{zhtt}{}
%    \end{macrocode}
%
% \changes{v2.6.0}{2026/05/16}{补全 \upLaTeX\ 字体编码 JY2 和 JT2 的
% Fallback 机制。}
% 在 \upLaTeX\ 字体族 |zhrm| 下采用如下 Fallback 机制：
% 形状 |sl| 优先保留加粗字重，形状 |it| 优先保留楷书字形。
%    \begin{macrocode}
%<*rm>
%<*c19>
\DeclareFontShape{C19}{rm}{m}{n}{<-> CJK * gbksong}{\CJKnormal}
\DeclareFontShape{C19}{rm}{b}{n}{<-> CJK * gbkhei}{\CJKnormal}
\DeclareFontShape{C19}{rm}{bx}{n}{<-> CJK * gbkhei}{\CJKnormal}
\DeclareFontShape{C19}{rm}{m}{sl}{<-> CJK * gbksongsl}{\CJKnormal}
\DeclareFontShape{C19}{rm}{b}{sl}{<-> CJK * gbkheisl}{\CJKnormal}
\DeclareFontShape{C19}{rm}{bx}{sl}{<-> CJK * gbkheisl}{\CJKnormal}
\DeclareFontShape{C19}{rm}{m}{it}{<-> CJK * gbkkai}{\CJKnormal}
\DeclareFontShape{C19}{rm}{b}{it}{<-> CJKb * gbkkai}{\CJKbold}
\DeclareFontShape{C19}{rm}{bx}{it}{<-> CJKb * gbkkai}{\CJKbold}
%</c19>
%<*c70>
\DeclareFontShape{C70}{rm}{m}{n}{<-> CJK * unisong}{\CJKnormal}
\DeclareFontShape{C70}{rm}{b}{n}{<-> CJK * unihei}{\CJKnormal}
\DeclareFontShape{C70}{rm}{bx}{n}{<-> CJK * unihei}{\CJKnormal}
\DeclareFontShape{C70}{rm}{m}{sl}{<-> CJK * unisongsl}{\CJKnormal}
\DeclareFontShape{C70}{rm}{b}{sl}{<-> CJK * uniheisl}{\CJKnormal}
\DeclareFontShape{C70}{rm}{bx}{sl}{<-> CJK * uniheisl}{\CJKnormal}
\DeclareFontShape{C70}{rm}{m}{it}{<-> CJK * unikai}{\CJKnormal}
\DeclareFontShape{C70}{rm}{b}{it}{<-> CJKb * unikai}{\CJKbold}
\DeclareFontShape{C70}{rm}{bx}{it}{<-> CJKb * unikai}{\CJKbold}
%</c70>
%<*jy2>
\DeclareFontShape{JY2}{zhrm}{m}{n}{<-> upzhserif-h}{}
\DeclareFontShape{JY2}{zhrm}{b}{n}{<-> upzhserifb-h}{}
\DeclareFontShape{JY2}{zhrm}{bx}{n}{<-> upzhserifb-h}{}
\DeclareFontShape{JY2}{zhrm}{m}{sl}{<-> upzhserifit-h}{}
\DeclareFontShape{JY2}{zhrm}{b}{sl}{<-> upzhserifb-h}{}
\DeclareFontShape{JY2}{zhrm}{bx}{sl}{<-> upzhserifb-h}{}
\DeclareFontShape{JY2}{zhrm}{m}{it}{<-> upzhserifit-h}{}
\DeclareFontShape{JY2}{zhrm}{b}{it}{<-> upzhserifit-h}{}
\DeclareFontShape{JY2}{zhrm}{bx}{it}{<-> upzhserifit-h}{}
%</jy2>
%<*jt2>
\DeclareFontShape{JT2}{zhrm}{m}{n}{<-> upzhserif-v}{}
\DeclareFontShape{JT2}{zhrm}{b}{n}{<-> upzhserifb-v}{}
\DeclareFontShape{JT2}{zhrm}{bx}{n}{<-> upzhserifb-v}{}
\DeclareFontShape{JT2}{zhrm}{m}{sl}{<-> upzhserifit-v}{}
\DeclareFontShape{JT2}{zhrm}{b}{sl}{<-> upzhserifb-v}{}
\DeclareFontShape{JT2}{zhrm}{bx}{sl}{<-> upzhserifb-v}{}
\DeclareFontShape{JT2}{zhrm}{m}{it}{<-> upzhserifit-v}{}
\DeclareFontShape{JT2}{zhrm}{b}{it}{<-> upzhserifit-v}{}
\DeclareFontShape{JT2}{zhrm}{bx}{it}{<-> upzhserifit-v}{}
%</jt2>
%</rm>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*sf>
%<*c19>
\DeclareFontShape{C19}{sf}{m}{n}{<-> CJK * gbkyou}{\CJKnormal}
\DeclareFontShape{C19}{sf}{b}{n}{<-> CJKb * gbkyou}{\CJKbold}
\DeclareFontShape{C19}{sf}{bx}{n}{<-> CJKb * gbkyou}{\CJKbold}
\DeclareFontShape{C19}{sf}{m}{sl}{<-> CJK * gbkyousl}{\CJKnormal}
\DeclareFontShape{C19}{sf}{b}{sl}{<-> CJKb * gbkyousl}{\CJKbold}
\DeclareFontShape{C19}{sf}{bx}{sl}{<-> CJKb * gbkyousl}{\CJKbold}
\DeclareFontShape{C19}{sf}{m}{it}{<-> CJK * gbkyou}{\CJKnormal}
\DeclareFontShape{C19}{sf}{b}{it}{<-> CJKb * gbkyou}{\CJKbold}
\DeclareFontShape{C19}{sf}{bx}{it}{<-> CJKb * gbkyou}{\CJKbold}
%</c19>
%<*c70>
\DeclareFontShape{C70}{sf}{m}{n}{<-> CJK * uniyou}{\CJKnormal}
\DeclareFontShape{C70}{sf}{b}{n}{<-> CJKb * uniyou}{\CJKbold}
\DeclareFontShape{C70}{sf}{bx}{n}{<-> CJKb * uniyou}{\CJKbold}
\DeclareFontShape{C70}{sf}{m}{sl}{<-> CJK * uniyousl}{\CJKnormal}
\DeclareFontShape{C70}{sf}{b}{sl}{<-> CJKb * uniyousl}{\CJKbold}
\DeclareFontShape{C70}{sf}{bx}{sl}{<-> CJKb * uniyousl}{\CJKbold}
\DeclareFontShape{C70}{sf}{m}{it}{<-> CJK * uniyou}{\CJKnormal}
\DeclareFontShape{C70}{sf}{b}{it}{<-> CJKb * uniyou}{\CJKbold}
\DeclareFontShape{C70}{sf}{bx}{it}{<-> CJKb * uniyou}{\CJKbold}
%</c70>
%<*jy2>
\DeclareFontShape{JY2}{zhsf}{m}{n}{<-> upzhsans-h}{}
\DeclareFontShape{JY2}{zhsf}{b}{n}{<-> upzhsansb-h}{}
\DeclareFontShape{JY2}{zhsf}{bx}{n}{<-> upzhsansb-h}{}
\DeclareFontShape{JY2}{zhsf}{m}{sl}{<-> upzhsans-h}{}
\DeclareFontShape{JY2}{zhsf}{b}{sl}{<-> upzhsansb-h}{}
\DeclareFontShape{JY2}{zhsf}{bx}{sl}{<-> upzhsansb-h}{}
\DeclareFontShape{JY2}{zhsf}{m}{it}{<-> upzhsans-h}{}
\DeclareFontShape{JY2}{zhsf}{b}{it}{<-> upzhsansb-h}{}
\DeclareFontShape{JY2}{zhsf}{bx}{it}{<-> upzhsansb-h}{}
%</jy2>
%<*jt2>
\DeclareFontShape{JT2}{zhsf}{m}{n}{<-> upzhsans-v}{}
\DeclareFontShape{JT2}{zhsf}{b}{n}{<-> upzhsansb-v}{}
\DeclareFontShape{JT2}{zhsf}{bx}{n}{<-> upzhsansb-v}{}
\DeclareFontShape{JT2}{zhsf}{m}{sl}{<-> upzhsans-v}{}
\DeclareFontShape{JT2}{zhsf}{b}{sl}{<-> upzhsansb-v}{}
\DeclareFontShape{JT2}{zhsf}{bx}{sl}{<-> upzhsansb-v}{}
\DeclareFontShape{JT2}{zhsf}{m}{it}{<-> upzhsans-v}{}
\DeclareFontShape{JT2}{zhsf}{b}{it}{<-> upzhsansb-v}{}
\DeclareFontShape{JT2}{zhsf}{bx}{it}{<-> upzhsansb-v}{}
%</jt2>
%</sf>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*tt>
%<*c19>
\DeclareFontShape{C19}{tt}{m}{n}{<-> CJK * gbkfs}{\CJKnormal}
\DeclareFontShape{C19}{tt}{b}{n}{<-> CJKb * gbkfs}{\CJKbold}
\DeclareFontShape{C19}{tt}{bx}{n}{<-> CJKb * gbkfs}{\CJKbold}
\DeclareFontShape{C19}{tt}{m}{sl}{<-> CJK * gbkfssl}{\CJKnormal}
\DeclareFontShape{C19}{tt}{b}{sl}{<-> CJKb * gbkfssl}{\CJKbold}
\DeclareFontShape{C19}{tt}{bx}{sl}{<-> CJKb * gbkfssl}{\CJKbold}
\DeclareFontShape{C19}{tt}{m}{it}{<-> CJK * gbkfs}{\CJKnormal}
\DeclareFontShape{C19}{tt}{b}{it}{<-> CJKb * gbkfs}{\CJKbold}
\DeclareFontShape{C19}{tt}{bx}{it}{<-> CJKb * gbkfs}{\CJKbold}
%</c19>
%<*c70>
\DeclareFontShape{C70}{tt}{m}{n}{<-> CJK * unifs}{\CJKnormal}
\DeclareFontShape{C70}{tt}{b}{n}{<-> CJKb * unifs}{\CJKbold}
\DeclareFontShape{C70}{tt}{bx}{n}{<-> CJKb * unifs}{\CJKbold}
\DeclareFontShape{C70}{tt}{m}{sl}{<-> CJK * unifssl}{\CJKnormal}
\DeclareFontShape{C70}{tt}{b}{sl}{<-> CJKb * unifssl}{\CJKbold}
\DeclareFontShape{C70}{tt}{bx}{sl}{<-> CJKb * unifssl}{\CJKbold}
\DeclareFontShape{C70}{tt}{m}{it}{<-> CJK * unifs}{\CJKnormal}
\DeclareFontShape{C70}{tt}{b}{it}{<-> CJKb * unifs}{\CJKbold}
\DeclareFontShape{C70}{tt}{bx}{it}{<-> CJKb * unifs}{\CJKbold}
%</c70>
%<*jy2>
\DeclareFontShape{JY2}{zhtt}{m}{n}{<-> upzhmono-h}{}
\DeclareFontShape{JY2}{zhtt}{b}{n}{<-> upzhmono-h}{}
\DeclareFontShape{JY2}{zhtt}{bx}{n}{<-> upzhmono-h}{}
\DeclareFontShape{JY2}{zhtt}{m}{sl}{<-> upzhmono-h}{}
\DeclareFontShape{JY2}{zhtt}{b}{sl}{<-> upzhmono-h}{}
\DeclareFontShape{JY2}{zhtt}{bx}{sl}{<-> upzhmono-h}{}
\DeclareFontShape{JY2}{zhtt}{m}{it}{<-> upzhmono-h}{}
\DeclareFontShape{JY2}{zhtt}{b}{it}{<-> upzhmono-h}{}
\DeclareFontShape{JY2}{zhtt}{bx}{it}{<-> upzhmono-h}{}
%</jy2>
%<*jt2>
\DeclareFontShape{JT2}{zhtt}{m}{n}{<-> upzhmono-v}{}
\DeclareFontShape{JT2}{zhtt}{b}{n}{<-> upzhmono-v}{}
\DeclareFontShape{JT2}{zhtt}{bx}{n}{<-> upzhmono-v}{}
\DeclareFontShape{JT2}{zhtt}{m}{sl}{<-> upzhmono-v}{}
\DeclareFontShape{JT2}{zhtt}{b}{sl}{<-> upzhmono-v}{}
\DeclareFontShape{JT2}{zhtt}{bx}{sl}{<-> upzhmono-v}{}
\DeclareFontShape{JT2}{zhtt}{m}{it}{<-> upzhmono-v}{}
\DeclareFontShape{JT2}{zhtt}{b}{it}{<-> upzhmono-v}{}
\DeclareFontShape{JT2}{zhtt}{bx}{it}{<-> upzhmono-v}{}
%</jt2>
%</tt>
%    \end{macrocode}
%
%    \begin{macrocode}
%<@@=>
%    \end{macrocode}
%
% \end{implementation}
