From 61f0c1ea7acefd4a1ab37a9464f28c1331d1d897 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Sun, 18 Aug 2013 23:35:59 +0000
Subject: xpinyin (18aug13)

git-svn-id: svn://tug.org/texlive/trunk@31465 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx | 676 ++++++++++++---------
 1 file changed, 401 insertions(+), 275 deletions(-)

(limited to 'Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx')

diff --git a/Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx b/Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx
index 7ad60df7fa4..df07517417d 100644
--- a/Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx
+++ b/Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx
@@ -8,7 +8,7 @@ Introduction
 ------------
 xpinyin is a LaTeX package written to simplify the input of Hanyu Pinyin.
 The package provides macros to automatically add pinyin to Chinese characters.
-It can only be used in conjunction with xeCJK or CJKutf8 package.
+It can only be used in conjunction with xeCJK or CJK/CJKutf8 package.
 
 Given that the implementation of pinyin package of CJK bundle is not very
 well, it seems that xpinyin is a good replacement of it.
@@ -71,7 +71,7 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 %</internal>
 %<*install>
 
-\input docstrip.tex
+\input l3docstrip.tex
 \keepsilent
 \askforoverwritefalse
 \preamble
@@ -106,7 +106,7 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
   \usedir{tex/latex/xpinyin}
   \file{\jobname.sty}{\from{\jobname.dtx}{package}}
   \nopreamble\nopostamble
-  \usedir{doc/latex/zhnumber}
+  \usedir{doc/latex/xpinyin}
   \file{README.txt}{\from{\jobname.dtx}{readme}}
 }
 
@@ -118,12 +118,17 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 %
 %<*driver|package>
 \NeedsTeXFormat{LaTeX2e}
-%<*driver>
-\ProvidesFile{xpinyin.dtx}
-%</driver>
 \RequirePackage{expl3}
-\GetIdInfo$Id: xpinyin.dtx 407 2013-05-20 02:19:35Z sobenlee $
+\GetIdInfo$Id: xpinyin.dtx 512 2013-08-17 15:03:03Z sobenlee $
   {Automatically add pinyin to Chinese characters}
+%<*driver>
+\ProvidesExplFile{\ExplFileName.\ExplFileExtension}
+%</driver>
+%<package>\ProvidesExplPackage{\ExplFileName}
+  {\ExplFileDate}{1.4}{\ExplFileDescription}
+%<*driver>
+\ExplSyntaxOff
+%</driver>
 %</driver|package>
 %
 %<*driver>
@@ -131,21 +136,21 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 \usepackage{xeCJK}
 \usepackage{xpinyin}
 \usepackage{fvrb-ex}
-\usepackage{metalogo}
 \usepackage{geometry}
 \hypersetup{pdfstartview=FitH}
 \geometry{includemp,hmargin={0mm,15mm},vmargin=15mm,footskip=7mm}
 \BeforeBeginEnvironment{SideBySideExample}{\vskip1ex\relax}
 \fvset{formatcom=\xeCJKVerbAddon}
 \linespread{1.1}
-\setmainfont{TeX Gyre Pagella}
-\setmonofont{Inconsolata}
+\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}
+\setmonofont{CMU Typewriter Text}
 \setCJKmainfont[BoldFont=Adobe Heiti Std,ItalicFont=Adobe Kaiti Std]{Adobe Song Std}
 \setCJKmonofont{Adobe Kaiti Std}
 \xeCJKsetup{PunctStyle=kaiming}
 \newfontfamily\PinYinFont{TeX Gyre Adventor}
 \xpinyinsetup{font=\PinYinFont,multiple=\color{red}}
-\def\MacroFont{\small\normalfont\ttfamily}\ExplSyntaxOn
+\def\MacroFont{\linespread{1}\small\normalfont\ttfamily}
+\ExplSyntaxOn
 \DeclareDocumentCommand \package { o m }
   {
     \href
@@ -157,13 +162,14 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
   }
 \ExplSyntaxOff
 \makeatletter
-\let\orig@meta\meta
-\def\meta#1{\orig@meta{\normalfont\itshape#1}}
+\def\LaTeX{\hologo{LaTeX}}
+\def\pdfLaTeX{\hologo{pdfLaTeX}}
+\def\XeLaTeX{\hologo{XeLaTeX}}
 \def\TF{true\orvar{}false}
 \def\TTF{\defaultvar{true}\orvar{}false}
 \def\TFF{true\orvar\defaultvar{false}}
-\def\orvar{\char`\|}
-\let\defaultvar\textbf
+\def\orvar{\textup{\textbar}}
+\def\defaultvar#1{\textbf{\textup{#1}}}
 \def\argbrace#1{\{#1\}}
 \makeatother
 \def\indexname{代码索引}
@@ -180,8 +186,8 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 %</driver>
 % \fi
 %
-% \CheckSum{534}
-% \GetFileInfo{\jobname.sty}
+% \CheckSum{622}
+% \GetFileInfo{\jobname.dtx}
 %
 % \title{\bfseries\pkg{xpinyin} 宏包}
 % \author{李清\\ \path{sobenlee@gmail.com}}
@@ -196,10 +202,15 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 %
 % \section{基本用法}
 %
-% \pkg{xpinyin} 只支持采用 |UTF-8| 编码的 \TeX 源文件。如果使用 \LaTeX 或 pdf\LaTeX 的
-% 编译方式，则 \pkg{xpinyin} 依赖 \package[cjk]{CJKutf8} 宏包；如果使用 \XeLaTeX，
-% 则依赖 \package{xeCJK} 宏包。\pkg{xpinyin} 不会自动载入 \pkg{CJKutf8} 或 \pkg{xeCJK}
-% 宏包，应该在它之前或之后自行载入。
+% \pkg{xpinyin} 支持采用 \texttt{GBK} 和 \texttt{UTF-8} 编码的 \TeX 源文件，建议
+% 总是使用 \texttt{UTF-8}。如果使用 \LaTeX 或 \pdfLaTeX\ 的编译方式，则根据编码的
+% 情况，\pkg{xpinyin} 依赖 \package{CJK} 或者 \package[cjk]{CJKutf8} 宏包。
+% 如果使用 \XeLaTeX，则依赖 \package{xeCJK} 宏包。如果它们没有在 \pkg{xpinyin}
+% 之前被载入，\pkg{xpinyin} 将根据编译方式自动选择，\LaTeX 或 \pdfLaTeX\ 将使用
+% \pkg{CJKutf8}。
+%
+% \pkg{xpinyin} 还依赖 \package{l3kernel} 和 \package{l3packages}，使用 (pdf)\LaTeX
+% 下的 \texttt{GBK} 编码时，还将依赖 \package{xCJK2uni}。
 %
 % 需要注意的是，\pkg{xpinyin} 缺省将拼音的字体设置为与文档的主字体（\cs{normalfont}）相同，
 % 所以为了保证声调字母的正确输出，应该选用合适的西文主字体。也可以通过将在下一节介绍的
@@ -256,9 +267,10 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 %     待在下将此来历注明，方使阅者\xpinyin{了}{liao3}然不惑。
 %     \end{pinyinscope}
 %   \end{Example}
-%   可选项 \meta{options} 用于局部设置拼音的格式，将在下面说明。
 % \end{function}
 %
+%   可选项 \meta{options} 用于局部设置拼音的格式，将在下面说明。
+%
 % \begin{function}{\xpinyin}
 %   \begin{syntax}
 %     \cs{xpinyin} \oarg{options} \Arg{单个汉字} \Arg{拼音}
@@ -369,12 +381,9 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 %
 % \section{代码实现}
 %
-% \iffalse
-%<*package>
-% \fi
-%
 %    \begin{macrocode}
-\ProvidesExplPackage{\ExplFileName}{\ExplFileDate}{1.3}{\ExplFileDescription}
+%<*package>
+%<@@=xpinyin>
 %    \end{macrocode}
 %
 %    \begin{macrocode}
@@ -392,277 +401,435 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 \RequirePackage{l3keys2e}
 %    \end{macrocode}
 %
-% \begin{macro}[internal,var]{\l_xpinyin_tmpa_box,\l_xpinyin_tmpb_box}
+% \begin{macro}[internal]{\c_@@_tone_prop}
 %    \begin{macrocode}
-\box_new:N \l_xpinyin_tmpa_box
-\box_new:N \l_xpinyin_tmpb_box
+\prop_new:N \c_@@_tone_prop
+\clist_map_inline:nn
+  {
+    { ā }{ \= a } , { á }{ \' a } , { ǎ }{ \v a } , { à }{ \` a } ,
+    { ō }{ \= o } , { ó }{ \' o } , { ǒ }{ \v o } , { ò }{ \` o } ,
+    { ē }{ \= e } , { é }{ \' e } , { ě }{ \v e } , { è }{ \` e } ,
+    { ī }{ \=\i } , { í }{ \'\i } , { ǐ }{ \v\i } , { ì }{ \`\i } ,
+    { ū }{ \= u } , { ú }{ \' u } , { ǔ }{ \v u } , { ù }{ \` u } ,
+    { ḿ }{ \' m } , { ń }{ \' n } , { ň }{ \v n } , { ǹ }{ \` n } ,
+    { ü }{ \" u } ,
+    { ǖ }{ \= { \" u } } , { ǘ }{ \' { \" u } } ,
+    { ǚ }{ \v { \" u } } , { ǜ }{ \` { \" u } }
+  }
+  { \prop_gput:Nnn \c_@@_tone_prop #1 }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_make_box:nn}
+%
+% \begin{macro}[internal]{\@@_UTF_char:nn}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_make_box:nn
-  { \xpinyin_save_CJKsymbol:n {#1} \xpinyin_make_pinyin_box:nn {#1} {#2} }
+\cs_new_protected_nopar:Npn \@@_UTF_char:nn #1#2
+  {
+    \cs_if_exist:cF { u8:#1 }
+      { \cs_new_protected_nopar:cpn { u8:#1 } {#2} }
+  }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_make_pinyin_box:nn}
+%
+% \begin{macro}[internal]{\@@_GBK_char:nn}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_make_pinyin_box:nn
+\cs_new_protected_nopar:Npn \@@_GBK_char:nn #1#2
   {
-    \hbox_overlap_left:n
+    \@@_UTF_char:nn {#1} {#2}
+    \exp_args:Nx \@@_GBK_char_aux:nn { \tl_head:n {#1} } {#1}
+  }
+\cs_new_protected_nopar:Npn \@@_GBK_char_aux:nn #1#2
+  { \exp_args:Nf \@@_GBK_char_aux:nnn { \int_eval:n { `#1 } } {#1} {#2} }
+\cs_new_protected_nopar:Npn \@@_GBK_char_aux:nnn #1#2#3
+  {
+    \cs_if_exist:cF { @@_UTF_ #1 :w }
       {
-        \hbox_set:Nn \l_xpinyin_tmpa_box
-          { \xpinyin_CJKsymbol_hook: \xpinyin_save_CJKsymbol:n {#1} }
-        \hbox_set:Nn \l_xpinyin_tmpb_box
+        \exp_args:Nf \@@_GBK_char_def:nnn
           {
-            \color_group_begin: \color_ensure_current:
-            \xpinyin_select_font:
-            \l_xpinyin_format_tl
-            \clist_if_exist:cT
-              { c_xpinyin_multiple_ \xpinyin_CJKsymbol_to_unicode:n {#1} _clist }
-              { \l_xpinyin_multiple_tl }
-            {#2}
-            \color_group_end:
+            \int_case:nn { \tl_count:n {#3} }
+              {
+                { \c_two   } { ##1 }
+                { \c_three } { ##1##2 }
+                { \c_four  } { ##1##2##3 }
+              }
           }
-        \dim_compare:nNnT
-          { \box_wd:N \l_xpinyin_tmpb_box } >
-          { \box_wd:N \l_xpinyin_tmpa_box + \l_xpinyin_CJKglue_dim }
+          {#1} {#2}
+        \exp_args:Nc \@@_save_UTF_cs:Nn { @@_UTF_ #1 :w } {#1}
+        \tl_gput_right:Nx \c_@@_reset_UTF_catcode_tl
+          { \char_set_catcode:nn {#1} { \char_value_catcode:n {#1} } }
+        \char_set_catcode_active:n {#1}
+      }
+  }
+\cs_new_protected_nopar:Npn \@@_GBK_char_def:nnn #1#2#3
+  {
+    \cs_new_protected_nopar:cpn { @@_UTF_ #2 :w } #1
+      { \use:c { u8: \tl_to_str:n { #3#1 } } }
+  }
+\tl_new:N \c_@@_reset_UTF_catcode_tl
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\@@_save_UTF_cs:Nn}
+%    \begin{macrocode}
+\group_begin:
+\char_set_catcode_active:n { \c_zero }
+\cs_new_protected_nopar:Npn \@@_save_UTF_cs:Nn #1#2
+  {
+    \group_begin:
+    \char_set_lccode:nn { \c_zero } {#2}
+    \tl_to_lowercase:n
+      {
+        \group_end:
+        \tl_gput_right:Nn \c_@@_reset_UTF_cs_tl { \cs_set_eq:NN ^^00 #1 }
+      }
+  }
+\group_end:
+\tl_new:N \c_@@_reset_UTF_cs_tl
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\bool_new:N \g_@@_GBK_bool
+\@ifpackageloaded { xeCJK }
+  { \AtEndOfPackage { \@@_adjust_xeCJK_hook: } }
+  {
+    \@ifpackageloaded { CJKutf8 }
+      {
+        \prop_map_function:NN \c_@@_tone_prop \@@_UTF_char:nn
+        \AtEndOfPackage { \@@_adjust_CJK_hook: }
+      }
+      {
+        \@ifpackageloaded { CJK }
           {
-            \box_resize:Nnn \l_xpinyin_tmpb_box
-              { \box_wd:N \l_xpinyin_tmpa_box + \l_xpinyin_CJKglue_dim }
-              { \box_ht:N \l_xpinyin_tmpb_box + \box_dp:N \l_xpinyin_tmpb_box }
+            \RequirePackage { xCJK2uni }
+            \prop_map_function:NN \c_@@_tone_prop \@@_GBK_char:nn
+            \AtEndOfPackage
+              {
+                \tl_put_right:Nn \l_@@_pinyin_box_hook_tl
+                  { \c_@@_reset_UTF_cs_tl }
+                \@@_adjust_CJK_hook:
+                \tl_use:N \c_@@_reset_UTF_catcode_tl
+              }
+            \bool_gset_true:N \g_@@_GBK_bool
           }
-        \box_move_up:nn { \l_xpinyin_vsep_tl }
           {
-            \hbox_to_wd:nn { \box_wd:N \l_xpinyin_tmpa_box }
-              { \tex_hss:D  \box_use_clear:N \l_xpinyin_tmpb_box \tex_hss:D }
+            \xetex_if_engine:TF
+              {
+                \RequirePackage { xeCJK }
+                \AtEndOfPackage { \@@_adjust_xeCJK_hook: }
+              }
+              {
+                \RequirePackage { CJKutf8 }
+                \prop_map_function:NN \c_@@_tone_prop \@@_UTF_char:nn
+                \AtEndOfPackage { \@@_adjust_CJK_hook: }
+              }
           }
       }
-    { \xpinyin_CJK_node: }
-    \xpinyin_CJK_ignorespaces:
+  }
+%    \end{macrocode}
+%
+% \begin{macro}[internal,var]{\l_@@_tmpa_box,\l_@@_tmpb_box}
+%    \begin{macrocode}
+\box_new:N \l_@@_tmpa_box
+\box_new:N \l_@@_tmpb_box
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\@@_make_box:nn}
+%    \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_make_box:nn #1#2
+  {
+    \@@_save_CJKsymbol:n {#1}
+    \@@_make_pinyin_box:xnn { \@@_to_unicode:n {#1} } {#1} {#2}
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_CJKsymbol:n}
+% \begin{macro}[internal]{\@@_make_pinyin_box:nnn}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_CJKsymbol:n
-  { \xpinyin_make_box:nn {#1} { \xpinyin_to_pinyin:n {#1} } }
+\cs_new_protected_nopar:Npn \@@_make_pinyin_box:nnn #1#2#3
+  {
+    \hbox_overlap_left:n
+      {
+        \hbox_set:Nn \l_@@_tmpa_box
+          { \@@_CJKsymbol_hook: \@@_save_CJKsymbol:n {#2} }
+        \hbox_set:Nn \l_@@_tmpb_box
+          {
+            \l_@@_pinyin_box_hook_tl
+            \color_group_begin: \color_ensure_current:
+            \@@_select_font:
+            \clist_if_exist:cTF { c_@@_multiple_ #1 _clist }
+              { \l_@@_multiple_tl \l_@@_format_tl }
+              { \l_@@_format_tl }
+            {#3}
+            \color_group_end:
+          }
+        \dim_compare:nNnT
+          { \box_wd:N \l_@@_tmpb_box } >
+          { \box_wd:N \l_@@_tmpa_box + \l_@@_CJKglue_dim }
+          {
+            \box_resize:Nnn \l_@@_tmpb_box
+              { \box_wd:N \l_@@_tmpa_box + \l_@@_CJKglue_dim }
+              { \box_ht:N \l_@@_tmpb_box + \box_dp:N \l_@@_tmpb_box }
+          }
+        \box_move_up:nn { \l_@@_vsep_tl }
+          {
+            \hbox_to_wd:nn { \box_wd:N \l_@@_tmpa_box }
+              { \tex_hss:D  \box_use_clear:N \l_@@_tmpb_box \tex_hss:D }
+          }
+      }
+    { \@@_CJK_node: }
+    \@@_ignore_spaces:w
+  }
+\tl_new:N \l_@@_pinyin_box_hook_tl
+\cs_generate_variant:Nn \@@_make_pinyin_box:nnn { x }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_to_pinyin:n}
+% \begin{macro}[internal]{\@@_CJKsymbol:n}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_to_pinyin:n
-  { \use:c { c_xpinyin_ \xpinyin_CJKsymbol_to_unicode:n {#1} _tl } }
+\cs_new_protected_nopar:Npn \@@_CJKsymbol:n #1
+  { \@@_CJKsymbol:xn { \@@_to_unicode:n {#1} } {#1} }
+\cs_new_protected_nopar:Npn \@@_CJKsymbol:nn #1#2
+  {
+    \@@_save_CJKsymbol:n {#2}
+    \@@_make_pinyin_box:nnn {#1} {#2} { \use:c { c_@@_ #1 _tl } }
+  }
+\cs_generate_variant:Nn \@@_CJKsymbol:nn { x }
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}{pinyinscope}
 %    \begin{macrocode}
-\NewDocumentEnvironment { pinyinscope } { O{} }
+\NewDocumentEnvironment { pinyinscope } { O { } }
   {
     \keys_set:nn { xpinyin } {#1}
-    \tl_if_empty:NF \l_xpinyin_hsep_tl
-      { \cs_set_nopar:Npn \CJKglue { \skip_horizontal:n { \l_xpinyin_hsep_tl } } }
-    \settowidth \l_xpinyin_CJKglue_dim { \CJKglue }
-    \xpinyin_replace_CJKsymbol:
+    \tl_if_empty:NF \l_@@_hsep_tl
+      { \cs_set_nopar:Npn \CJKglue { \skip_horizontal:n { \l_@@_hsep_tl } } }
+    \settowidth \l_@@_CJKglue_dim { \CJKglue }
+    \@@_replace_CJKsymbol:
   }
-  { \cs_gset_eq:NN \CJKsymbol \xpinyin_save_CJKsymbol:n }
+  { }
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}{\xpinyin}
 %    \begin{macrocode}
-\NewDocumentCommand \xpinyin { s O{} m }
+\NewDocumentCommand \xpinyin { s O { } m }
   {
     \IfBooleanTF {#1}
       {
         \group_begin:
         \keys_set:nn { xpinyin } {#2}
-        \tl_if_empty:NF \l_xpinyin_hsep_tl
-          { \cs_set_nopar:Npn \CJKglue { \skip_horizontal:n { \l_xpinyin_hsep_tl } } }
-        \settowidth \l_xpinyin_CJKglue_dim { \CJKglue }
-        \xpinyin_replace_CJKsymbol:
+        \tl_if_empty:NF \l_@@_hsep_tl
+          { \cs_set_nopar:Npn \CJKglue { \skip_horizontal:n { \l_@@_hsep_tl } } }
+        \settowidth \l_@@_CJKglue_dim { \CJKglue }
+        \@@_replace_CJKsymbol:
         #3
         \group_end:
       }
       {
         \group_begin:
         \keys_set:nn { xpinyin } {#2}
-        \settowidth \l_xpinyin_CJKglue_dim { \CJKglue }
-        \xpinyin_xpinyin_single_aux:nn {#3}
+        \settowidth \l_@@_CJKglue_dim { \CJKglue }
+        \@@_single_aux:nn {#3}
       }
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal,var]{\l_xpinyin_CJKglue_dim}
+% \begin{macro}[internal,var]{\l_@@_CJKglue_dim}
 %    \begin{macrocode}
-\dim_new:N \l_xpinyin_CJKglue_dim
+\dim_new:N \l_@@_CJKglue_dim
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_xpinyin_single_aux:nn}
+% \begin{macro}[internal]{\@@_single_aux:nn}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_xpinyin_single_aux:nn
+\cs_new_protected_nopar:Npn \@@_single_aux:nn #1#2
   {
-    \xpinyin_xpinyin_single_hook:n
-      { \cs_set_eq:NN \xpinyin_save_CJKsymbol:n \use:n }
-    \cs_set_eq:NN \xpinyin_CJKsymbol_to_unicode:n \xpinyin_CJKchar_to_unicode:n
-    \xpinyin_make_box:nn {#1} { \xpinyin_pinyin:n {#2} }
+    \@@_single_hook:n
+      { \cs_set_eq:NN \@@_save_CJKsymbol:n \use:n }
+    \cs_set_eq:NN \@@_to_unicode:n \@@_char_to_unicode:n
+    \@@_make_box:nn {#1} { \@@_pinyin:n {#2} }
     \group_end:
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_replace_CJKsymbol_aux:}
+% \begin{macro}[internal]{\@@_replace_CJKsymbol_aux:}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_replace_CJKsymbol_aux:
+\cs_new_protected_nopar:Npn \@@_replace_CJKsymbol_aux:
   {
-    \cs_if_eq:NNF \CJKsymbol \xpinyin_CJKsymbol:n
+    \cs_if_eq:NNF \CJKsymbol \@@_CJKsymbol:n
       {
-        \cs_set_eq:NN \xpinyin_save_CJKsymbol:n \CJKsymbol
-        \cs_set_eq:NN \CJKsymbol \xpinyin_CJKsymbol:n
+        \cs_set_eq:NN \@@_save_CJKsymbol:n \CJKsymbol
+        \cs_set_eq:NN \CJKsymbol \@@_CJKsymbol:n
       }
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_xpinyin_single_hook_aux:n}
+% \begin{macro}[internal]{\@@_single_hook_aux:n}
 %    \begin{macrocode}
-\cs_new_nopar:Npn \xpinyin_xpinyin_single_hook_aux:n
+\cs_new_protected_nopar:Npn \@@_single_hook_aux:n
   {
-    \cs_if_eq:NNTF \CJKsymbol \xpinyin_CJKsymbol:n
+    \cs_if_eq:NNTF \CJKsymbol \@@_CJKsymbol:n
       {
-        \cs_set_eq:NN \CJKsymbol \xpinyin_save_CJKsymbol:n
-        \cs_set_eq:NN \xpinyin_save_CJKsymbol:n \use:n
+        \cs_set_eq:NN \CJKsymbol \@@_save_CJKsymbol:n
+        \cs_set_eq:NN \@@_save_CJKsymbol:n \use:n
       }
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_select_font_xetex:}
+% \begin{macro}[internal]{\@@_select_font_xetex:}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_select_font_xetex:
+\cs_new_protected_nopar:Npn \@@_select_font_xetex:
   {
-    \cs_if_exist_use:cF { \l_xpinyin_coor_tl }
+    \cs_if_exist_use:cF { \l_@@_coor_tl }
       {
-        \tl_set:Nx \l_xpinyin_current_coor_tl { \l_xpinyin_coor_tl }
-        \xpinyin_select_font_aux:
-        \int_compare:nNnT { \XeTeXfonttype \tex_font:D } > \c_zero
+        \tl_set:Nx \l_@@_current_coor_tl { \l_@@_coor_tl }
+        \@@_select_font_aux:
+        \int_compare:nNnF { \XeTeXfonttype \tex_font:D } = \c_zero
           {
             \exp_last_unbraced:NNV
-            \cs_gset_eq:cN \l_xpinyin_current_coor_tl \tex_font:D
+            \cs_gset_eq:cN \l_@@_current_coor_tl \tex_font:D
           }
       }
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_select_font_aux:}
+% \begin{macro}[internal]{\@@_select_font_aux:}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_select_font_aux:
+\cs_new_protected_nopar:Npn \@@_select_font_aux:
   {
     \fontsize
-      { \l_xpinyin_ratio_tl \etex_dimexpr:D \f@size pt \scan_stop: }
-      { \c_zero_skip }
-    \l_xpinyin_font_tl
+      { \l_@@_ratio_tl \etex_dimexpr:D \f@size pt \scan_stop: }
+      { \f@baselineskip }
+    \l_@@_font_tl
     \selectfont
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_CJKsymbol_to_unicode_xetex:n}
+% \begin{macro}[internal]{\@@_to_unicode_xetex:n}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_CJKsymbol_to_unicode_xetex:n { \int_to_hexadecimal:n {`#1} }
+\cs_new_nopar:Npn \@@_to_unicode_xetex:n #1
+  { \int_to_hexadecimal:n { `#1 } }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]
-% {\xpinyin_CJKsymbol_to_unicode_pdftex:n,\xpinyin_CJKchar_to_unicode_pdftex:n}
+% \begin{macro}[internal]{\@@_UTF_to_unicode:n,\@@_UTFchar_to_unicode:n}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_CJKsymbol_to_unicode_pdftex:n
-  { \int_to_hexadecimal:n { \int_from_hexadecimal:V \CJK@plane * "100 + #1 } }
-\cs_new_nopar:Nn \xpinyin_CJKchar_to_unicode_pdftex:n
-  { \int_to_hexadecimal:n { \xpinyin_UTF_viii_to_unicode:NNNw #1 \q_stop } }
-\cs_new_nopar:Npn \xpinyin_UTF_viii_to_unicode:NNNw #1#2#3#4 \q_stop
+\cs_new_nopar:Npn \@@_UTF_to_unicode:n #1
+  {
+    \int_to_hexadecimal:n
+      { \exp_args:No \int_from_hexadecimal: { \CJK@plane } * "100 + #1 }
+  }
+\cs_new_nopar:Npn \@@_UTFchar_to_unicode:n #1
+  { \int_to_hexadecimal:n { \@@_UTF_viii_to_unicode:NNNw #1 \q_stop } }
+\cs_new_nopar:Npn \@@_UTF_viii_to_unicode:NNNw #1#2#3#4 \q_stop
   {
     \tl_if_empty:nTF {#4}
       { ( `#1 - "E0 ) * "1000 + ( `#2 - "80 ) * "40 + ( `#3 - "80 ) }
       { ( `#1 - "F0 ) * "4000 + ( `#2 - "80 ) * "1000 + ( `#3 - "80 ) * "40 + ( `#4 - "80 ) }
   }
-\cs_generate_variant:Nn \int_from_hexadecimal:n { V }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_adjust_xeCJK_hook:}
+% \begin{macro}[internal]{\@@_GBK_to_unicode:n,\@@_GBKchar_to_unicode:n}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_adjust_xeCJK_hook:
+\cs_new_nopar:Npn \@@_GBK_to_unicode:n #1
+  { \CJKtu_sfd_map:nn { \CJK@plane } {#1} }
+\cs_new_nopar:Npn \@@_GBKchar_to_unicode:n #1
+  { \CJKchartouni {#1} }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\@@_adjust_xeCJK_hook:}
+%    \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_adjust_xeCJK_hook:
   {
-    \cs_new_eq:NN \xpinyin_select_font:           \xpinyin_select_font_xetex:
-    \cs_new_eq:NN \xpinyin_CJKsymbol_to_unicode:n \xpinyin_CJKsymbol_to_unicode_xetex:n
-    \cs_new_eq:NN \xpinyin_CJKchar_to_unicode:n   \xpinyin_CJKsymbol_to_unicode:n
-    \cs_new_eq:NN \xpinyin_replace_CJKsymbol:     \xpinyin_replace_CJKsymbol_aux:
-    \cs_new_eq:NN \xpinyin_CJK_node:              \xeCJK_CJK_kern:
-    \cs_new_eq:NN \xpinyin_CJK_ignorespaces:      \xeCJK_ignore_spaces:w
-    \cs_new_protected_nopar:Npn \xpinyin_CJK_node: { \xeCJK_make_node:n { CJK } }
-    \tl_gset:Nn \l_xpinyin_coor_tl
-      { (\cs_meaning:N \l_xpinyin_font_tl)/\l_xeCJK_current_font_tl/\l_xpinyin_ratio_tl }
-    \cs_new_nopar:Nn \xpinyin_CJKsymbol_hook: { \makexeCJKinactive \xeCJK_select_font: }
-    \cs_new_nopar:Npn \xpinyin_xpinyin_single_hook:n
-      { \cs_if_eq:NNTF \CJKsymbol \xpinyin_CJKsymbol:n { \cs_set_eq:NN \CJKsymbol \use:n } }
+    \cs_new_eq:NN \@@_select_font:       \@@_select_font_xetex:
+    \cs_new_eq:NN \@@_to_unicode:n       \@@_to_unicode_xetex:n
+    \cs_new_eq:NN \@@_char_to_unicode:n  \@@_to_unicode:n
+    \cs_new_eq:NN \@@_replace_CJKsymbol: \@@_replace_CJKsymbol_aux:
+    \cs_new_protected_nopar:Npn \@@_ignore_spaces:w { \xeCJK_ignore_spaces:w }
+    \cs_new_protected_nopar:Npn \@@_CJK_node: { \xeCJK_make_node:n { CJK } }
+    \tl_gset:Nn \l_@@_coor_tl
+      { (\cs_meaning:N \l_@@_font_tl)/\l_xeCJK_current_font_tl/\l_@@_ratio_tl }
+    \cs_new_protected_nopar:Npn \@@_CJKsymbol_hook:
+      { \makexeCJKinactive \xeCJK_select_font: }
+    \cs_new_protected_nopar:Npn \@@_single_hook:n
+      { \cs_if_eq:NNTF \CJKsymbol \@@_CJKsymbol:n { \cs_set_eq:NN \CJKsymbol \use:n } }
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_adjust_CJK_hook:}
+% \begin{macro}[internal]{\@@_adjust_CJK_hook:}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_adjust_CJK_hook:
+\cs_new_protected_nopar:Npn \@@_adjust_CJK_hook:
   {
-    \cs_new_eq:NN \xpinyin_select_font:           \xpinyin_select_font_aux:
-    \cs_new_eq:NN \xpinyin_CJKsymbol_to_unicode:n \xpinyin_CJKsymbol_to_unicode_pdftex:n
-    \cs_new_eq:NN \xpinyin_CJKchar_to_unicode:n   \xpinyin_CJKchar_to_unicode_pdftex:n
-    \cs_new_eq:NN \xpinyin_CJKsymbol_hook:        \prg_do_nothing:
-    \cs_new_eq:NN \xpinyin_CJK_node:              \CJK@CJK
-    \cs_new_eq:NN \xpinyin_CJK_ignorespaces:      \prg_do_nothing:
+    \bool_if:NTF \g_@@_GBK_bool
+      {
+        \cs_new_eq:NN \@@_to_unicode:n      \@@_GBK_to_unicode:n
+        \cs_new_eq:NN \@@_char_to_unicode:n \@@_GBKchar_to_unicode:n
+      }
+      {
+        \cs_new_eq:NN \@@_to_unicode:n      \@@_UTF_to_unicode:n
+        \cs_new_eq:NN \@@_char_to_unicode:n \@@_UTFchar_to_unicode:n
+      }
+    \cs_new_eq:NN \@@_select_font:    \@@_select_font_aux:
+    \cs_new_eq:NN \@@_CJKsymbol_hook: \prg_do_nothing:
+    \cs_new_protected_nopar:Npn \@@_CJK_node: { \CJK@CJK }
+    \cs_new_protected_nopar:Npn \@@_ignore_spaces:w { \CJK@ignorespaces }
     \@ifpackageloaded { CJKpunct }
-      { \xpinyin_adjust_CJKpunct_hook: }
+      { \@@_adjust_CJKpunct_hook: }
       {
-        \cs_new_eq:NN \xpinyin_replace_CJKsymbol:   \xpinyin_replace_CJKsymbol_aux:
-        \cs_new_eq:NN \xpinyin_xpinyin_single_hook:n \xpinyin_xpinyin_single_hook_aux:n
+        \cs_new_eq:NN \@@_single_hook:n \@@_single_hook_aux:n
+        \cs_new_eq:NN \@@_replace_CJKsymbol: \@@_replace_CJKsymbol_aux:
+        \AtBeginDocument
+          {
+            \@ifpackageloaded { CJKpunct }
+              {
+                \cs_undefine:N \@@_single_hook:n
+                \cs_undefine:N \@@_replace_CJKsymbol:
+                \@@_adjust_CJKpunct_hook:
+              } { }
+          }
       }
-    \prop_map_function:NN \g_xpinyin_tone_prop \DeclareUnicodeCharacter
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_adjust_CJKpunct_hook:}
+% \begin{macro}[internal]{\@@_adjust_CJKpunct_hook:}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_adjust_CJKpunct_hook:
+\cs_new_protected_nopar:Npn \@@_adjust_CJKpunct_hook:
   {
-    \cs_new_nopar:Nn \xpinyin_replace_CJKsymbol:
+    \cs_new_protected_nopar:Npn \@@_replace_CJKsymbol:
       {
         \int_compare:nNnTF { \CJKpunct@punctstyle } = { \CJKpunct@ps@plain }
-          { \xpinyin_replace_CJKsymbol_aux: }
+          { \@@_replace_CJKsymbol_aux: }
           {
-            \cs_if_eq:NNF \CJKosymbol \xpinyin_CJKsymbol:n
+            \cs_if_eq:NNF \CJKosymbol \@@_CJKsymbol:n
               {
-                \cs_set_eq:NN \xpinyin_save_CJKsymbol:n \CJKosymbol
-                \cs_set_eq:NN \CJKosymbol \xpinyin_CJKsymbol:n
+                \cs_set_eq:NN \@@_save_CJKsymbol:n \CJKosymbol
+                \cs_set_eq:NN \CJKosymbol \@@_CJKsymbol:n
               }
           }
       }
-    \cs_new_nopar:Npn \xpinyin_xpinyin_single_hook:n
+    \cs_new_protected_nopar:Npn \@@_single_hook:n
       {
         \int_compare:nNnTF { \CJKpunct@punctstyle } = { \CJKpunct@ps@plain }
-          { \xpinyin_xpinyin_single_hook_aux:n }
+          { \@@_single_hook_aux:n }
           {
-            \cs_if_eq:NNTF \CJKosymbol \xpinyin_CJKsymbol:n
+            \cs_if_eq:NNTF \CJKosymbol \@@_CJKsymbol:n
               {
-                \cs_set_eq:NN \CJKosymbol \xpinyin_save_CJKsymbol:n
-                \cs_set_eq:NN \xpinyin_save_CJKsymbol:n \use:n
+                \cs_set_eq:NN \CJKosymbol \@@_save_CJKsymbol:n
+                \cs_set_eq:NN \@@_save_CJKsymbol:n \use:n
               }
           }
       }
@@ -670,204 +837,158 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macrocode}
-\AtBeginDocument
-  {
-    \@ifpackageloaded { xeCJK }
-      { \xpinyin_adjust_xeCJK_hook: }
-      {
-        \@ifpackageloaded { CJKutf8 }
-          { \xpinyin_adjust_CJK_hook: }
-          { \msg_warning:nn { xpinyin } { invalid } }
-      }
-  }
-\msg_new:nnn { xpinyin } { invalid }
-  {
-    If~you~want~to~use~xpinyin~in~the~right~way,~you\\
-    should~load~the~\xetex_if_engine:TF { xeCJK } { CJKutf8 }~
-    package~in~the~preamble.\\
-  }
-%    \end{macrocode}
-%
 % \begin{macro}{\pinyin}
 %    \begin{macrocode}
-\NewDocumentCommand \pinyin { O{} m }
+\NewDocumentCommand \pinyin { O { } m }
   {
     \group_begin:
     \keys_set:nn { xpinyin } {#1}
-    \l_xpinyin_font_tl
-    \l_xpinyin_format_tl
+    \l_@@_font_tl
+    \l_@@_format_tl
     \selectfont
-    \xpinyin_pinyin:n {#2}
+    \c_@@_reset_UTF_cs_tl
+    \@@_pinyin:n {#2}
     \group_end:
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_pinyin:n}
+% \begin{macro}[internal]{\@@_pinyin:n}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_pinyin:n
+\cs_new_protected_nopar:Npn \@@_pinyin:n #1
   {
-    \xpinyin_xpinyin_init:
-    \bool_set_true:N \l_xpinyin_first_bool
-    \tl_set:Nn \l_xpinyin_save_tl {#1}
-    \xpinyin_xpinyin_aux:N #1 \q_recursion_tail \q_recursion_stop
+    \@@_pinyin_init:
+    \bool_set_true:N \l_@@_first_bool
+    \tl_set:Nn \l_@@_save_tl {#1}
+    \@@_pinyin_aux:n #1 \q_recursion_tail \q_recursion_stop
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_xpinyin_aux:N}
+% \begin{macro}[internal]{\@@_pinyin_aux:n}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_xpinyin_aux:N
+\cs_new_protected_nopar:Npn \@@_pinyin_aux:n #1
   {
-    \quark_if_recursion_tail_stop_do:Nn #1
+    \quark_if_recursion_tail_stop_do:nn {#1}
       {
-        \bool_if:NTF \l_xpinyin_first_bool { \l_xpinyin_save_tl }
-          { \tl_if_empty:NF \l_xpinyin_item_tl { \l_xpinyin_pysep_tl \l_xpinyin_item_tl } }
+        \bool_if:NTF \l_@@_first_bool { \l_@@_save_tl }
+          { \tl_if_empty:NF \l_@@_item_tl { \l_@@_pysep_tl \l_@@_item_tl } }
       }
-    \xpinyin_if_number:NTF {#1}
+    \@@_if_number:nTF {#1}
       {
-        \bool_if:NTF \l_xpinyin_first_bool
-          { \bool_set_false:N \l_xpinyin_first_bool }
-          { \l_xpinyin_pysep_tl }
-        \l_xpinyin_pre_tl
-        \xpinyin_tone:Vn \l_xpinyin_tone_tl {#1}
-        \l_xpinyin_post_tl
-        \xpinyin_xpinyin_init:
+        \bool_if:NTF \l_@@_first_bool
+          { \bool_set_false:N \l_@@_first_bool }
+          { \l_@@_pysep_tl }
+        \l_@@_pre_tl
+        \@@_tone:Vn \l_@@_tone_tl {#1}
+        \l_@@_post_tl
+        \@@_pinyin_init:
       }
       {
         \int_compare:nNnTF
-          { 0 \cs_if_exist_use:c { c_xpinyin_ \tl_to_str:N \l_xpinyin_tone_tl _tl } } >
-          { 0 \cs_if_exist_use:c { c_xpinyin_ \tl_to_str:n {#1} _tl } }
-          { \tl_put_right:Nn \l_xpinyin_post_tl {#1} }
+          { 0 \cs_if_exist_use:c { c_@@_ \tl_to_str:N \l_@@_tone_tl _tl } } >
+          { 0 \cs_if_exist_use:c { c_@@_ \tl_to_str:n {#1} _tl } }
+          { \tl_put_right:Nn \l_@@_post_tl {#1} }
           {
-            \tl_set:Nn \l_xpinyin_tone_tl {#1}
-            \tl_set_eq:NN \l_xpinyin_pre_tl \l_xpinyin_item_tl
-            \tl_clear:N \l_xpinyin_post_tl
+            \tl_set:Nn \l_@@_tone_tl {#1}
+            \tl_set_eq:NN \l_@@_pre_tl \l_@@_item_tl
+            \tl_clear:N \l_@@_post_tl
           }
-        \tl_put_right:Nx \l_xpinyin_item_tl { \xpinyin_replace_v:N {#1} }
+        \tl_put_right:Nx \l_@@_item_tl { \@@_replace_v:n {#1} }
       }
-    \xpinyin_xpinyin_aux:N
+    \@@_pinyin_aux:n
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_tone:Nn}
+% \begin{macro}[internal]{\@@_tone:Nn}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_tone:Nn
-  { \use:c { xpinyin_num_to_tone_ #1 :Nn } {#1} {#2} }
-\cs_generate_variant:Nn \xpinyin_tone:Nn { V }
+\cs_new_protected_nopar:Npn \@@_tone:Nn #1#2
+  { \use:c { @@_num_to_tone_ #1 :Nn } {#1} {#2} }
+\cs_generate_variant:Nn \@@_tone:Nn { V }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_replace_v:N}
+% \begin{macro}[internal]{\@@_replace_v:n}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_replace_v:N
+\cs_new_nopar:Npn \@@_replace_v:n #1
   {
     \str_if_eq:nnTF {#1} { v }
       {
-        \bool_if:nTF
-          {
-            \str_if_eq_p:Vn \l_xpinyin_item_tl { l } ||
-            \str_if_eq_p:Vn \l_xpinyin_item_tl { n } ||
-            \str_if_eq_p:Vn \l_xpinyin_item_tl { L } ||
-            \str_if_eq_p:Vn \l_xpinyin_item_tl { N }
-          }
-          { \exp_not:n { ü} } { u }
+        \str_case:onTF { \l_@@_item_tl }
+          { { l } { } { n } { } { L } { } { N } { } }
+          { \exp_not:n { ü } } { u }
       }
       { \exp_not:n {#1} }
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_xpinyin_init:}
+% \begin{macro}[internal]{\@@_pinyin_init:}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_xpinyin_init:
+\cs_new_nopar:Npn \@@_pinyin_init:
   {
-    \tl_clear:N \l_xpinyin_pre_tl   \tl_clear:N \l_xpinyin_post_tl
-    \tl_clear:N \l_xpinyin_item_tl  \tl_clear:N \l_xpinyin_tone_tl
+    \tl_clear:N \l_@@_pre_tl   \tl_clear:N \l_@@_post_tl
+    \tl_clear:N \l_@@_item_tl  \tl_clear:N \l_@@_tone_tl
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal,pTF]{\xpinyin_if_number:N}
+% \begin{macro}[internal]{\@@_if_number:nTF}
 %    \begin{macrocode}
-\prg_new_conditional:Nnn \xpinyin_if_number:N { p , T , F , TF }
+\prg_new_conditional:Npnn \@@_if_number:n #1 { TF }
   {
-    \if_int_compare:w \c_one < 1 #1 \exp_stop_f:
+    \if_int_compare:w \c_one < 1 \tl_to_str:n {#1} \exp_stop_f:
       \prg_return_true: \else: \prg_return_false: \fi:
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal,var]{\l_xpinyin_first_bool}
+% \begin{macro}[internal,var]{\l_@@_first_bool}
 %    \begin{macrocode}
-\bool_new:N \l_xpinyin_first_bool
+\bool_new:N \l_@@_first_bool
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}[internal,var]
-% {\c_xpinyin_a_tl,\c_xpinyin_o_tl,\c_xpinyin_e_tl,\c_xpinyin_i_tl,
-% \c_xpinyin_u_tl,\c_xpinyin_v_tl}
+% {\c_@@_a_tl,\c_@@_o_tl,\c_@@_e_tl,\c_@@_i_tl,\c_@@_u_tl,\c_@@_v_tl}
 %    \begin{macrocode}
-\tl_const:Nn \c_xpinyin_a_tl { 3 }
-\tl_const:Nn \c_xpinyin_o_tl { 2 }
-\tl_const:Nn \c_xpinyin_e_tl { 2 }
-\tl_const:Nn \c_xpinyin_i_tl { 1 }
-\tl_const:Nn \c_xpinyin_u_tl { 1 }
-\tl_const:Nn \c_xpinyin_v_tl { 1 }
+\tl_const:Nn \c_@@_a_tl { 3 }
+\tl_const:Nn \c_@@_o_tl { 2 }
+\tl_const:Nn \c_@@_e_tl { 2 }
+\tl_const:Nn \c_@@_i_tl { 1 }
+\tl_const:Nn \c_@@_u_tl { 1 }
+\tl_const:Nn \c_@@_v_tl { 1 }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\xpinyin_num_to_tone:Nn}
+% \begin{macro}[internal]{\@@_num_to_tone:Nn}
 %    \begin{macrocode}
-\cs_new_nopar:Nn \xpinyin_num_to_tone:Nn
+\cs_new_protected_nopar:Npn \@@_num_to_tone:Nn #1#2
   {
     \if_case:w \int_eval:n { #2 - \c_one } \exp_stop_f:
       \= {#1}  \or: \'{#1}  \or: \v {#1}  \or: \` {#1}  \else: #1 \fi:
   }
 \tl_map_inline:nn { a o e u }
-  { \cs_new_eq:cN { xpinyin_num_to_tone_ #1 :Nn } \xpinyin_num_to_tone:Nn }
-\cs_new_nopar:Nn \xpinyin_num_to_tone_i:Nn
+  { \cs_new_eq:cN { @@_num_to_tone_ #1 :Nn } \@@_num_to_tone:Nn }
+\cs_new_nopar:Npn \@@_num_to_tone_i:Nn #1#2
   {
     \if_case:w \int_eval:n { #2 - \c_one } \exp_stop_f:
       ī  \or: í  \or: ǐ  \or: ì \else: i \fi:
   }
-\cs_new_nopar:Nn \xpinyin_num_to_tone_v:Nn
+\cs_new_protected_nopar:Npn \@@_num_to_tone_v:Nn #1#2
   {
-    \bool_if:nTF
-      {
-        \str_if_eq_p:Vn \l_xpinyin_pre_tl { l } ||
-        \str_if_eq_p:Vn \l_xpinyin_pre_tl { n } ||
-        \str_if_eq_p:Vn \l_xpinyin_pre_tl { L } ||
-        \str_if_eq_p:Vn \l_xpinyin_pre_tl { N }
-      }
+    \str_case:onTF { \l_@@_pre_tl }
+      { { l } { }  { n } { }  { L } { } { N } { } }
       {
         \if_case:w \int_eval:n { #2 - \c_one } \exp_stop_f:
           ǖ  \or: ǘ  \or: ǚ  \or: ǜ \else: ü \fi:
       }
-      { \xpinyin_num_to_tone:Nn u {#2} }
+      { \@@_num_to_tone:Nn u {#2} }
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\g_xpinyin_tone_prop,\xpinyin_prop_put_aux:n}
-%    \begin{macrocode}
-\prop_new:N \g_xpinyin_tone_prop
-\clist_map_inline:nn
-  {
-    {0101}{\=a} ,     {00E1}{\'a} ,     {01CE}{\v{a}} ,   {00E0}{\`a} ,
-    {014D}{\=o} ,     {00F3}{\'o} ,     {01D2}{\v{o}} ,   {00F2}{\`o} ,
-    {0113}{\=e} ,     {00E9}{\'e} ,     {011B}{\v{e}} ,   {00E8}{\`e} ,
-    {012B}{\={\i}} ,  {00ED}{\'{\i}} ,  {01D0}{\v{\i}} ,  {00EC}{\`{\i}} ,
-    {016B}{\=u} ,     {00FA}{\'u} ,     {01D4}{\v{u}} ,   {00F9}{\`u} ,
-    {00FC}{\"u} ,
-    {01D6}{\={\"u}} , {01D8}{\'{\"u}} , {01DA}{\v{\"u}} , {01DC}{\`{\"u}}
-  }
-  { \prop_gput:Nnn \g_xpinyin_tone_prop #1 }
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}{\xpinyinsetup}
 %    \begin{macrocode}
 \NewDocumentCommand \xpinyinsetup { m } { \keys_set:nn { xpinyin } {#1} }
@@ -878,7 +999,7 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 %    \begin{macrocode}
 \clist_map_inline:nn
   { ratio , vsep , hsep , pysep , font , format , multiple }
-  { \keys_define:nn { xpinyin } { #1 .tl_set:c = { l_xpinyin_ #1 _tl } } }
+  { \keys_define:nn { xpinyin } { #1 .tl_set:c = { l_@@_ #1 _tl } } }
 \keys_set:nn { xpinyin }
   {
     ratio   = .4 ,
@@ -894,10 +1015,15 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 \group_begin:
 \char_set_catcode_active:N \U
 \char_set_catcode_active:N \V
-\cs_set_nopar:Npn U+ #1 ~ #2 ~ { \tl_gset:cn { c_xpinyin_ #1 _tl } {#2} }
-\cs_set_nopar:Npn V+ #1 ~ #2 ~ { \clist_gset:cn { c_xpinyin_multiple_ #1 _clist } {#2} }
-\char_set_catcode_space:N \
-\file_input:n {xpinyin-map.cfg}
+\cs_set_nopar:Npn U+ #1 ~ #2 ~
+  { \tl_gset:cn { c_@@_ #1 _tl } {#2} }
+\cs_set_nopar:Npn V+ #1 ~ #2 ~
+  { \clist_gset:cn { c_@@_multiple_ #1 _clist } {#2} }
+\use:n
+  {
+    \char_set_catcode_space:N \
+    \file_input:n { xpinyin-map.cfg }
+  }
 \group_end:
 %    \end{macrocode}
 % \end{macro}
@@ -907,8 +1033,8 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 \NewDocumentCommand \setpinyin { m m }
   {
     \tl_set:cn
-      { c_xpinyin_ \xpinyin_CJKchar_to_unicode:n {#1} _tl }
-      { \xpinyin_pinyin:n {#2} }
+      { c_@@_ \@@_char_to_unicode:n {#1} _tl }
+      { \@@_pinyin:n {#2} }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -917,9 +1043,9 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
 \ProcessKeysOptions { xpinyin }
 %    \end{macrocode}
 %
-% \iffalse
+%    \begin{macrocode}
 %</package>
-% \fi
+%    \end{macrocode}
 %
 % \end{implementation}
 %
-- 
cgit v1.2.3

