From 61f0c1ea7acefd4a1ab37a9464f28c1331d1d897 Mon Sep 17 00:00:00 2001 From: Karl Berry 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). % %<*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} -% \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} +% +%\ProvidesExplPackage{\ExplFileName} + {\ExplFileDate}{1.4}{\ExplFileDescription} +%<*driver> +\ExplSyntaxOff +% % % %<*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). % % \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} % -% \fi +% \end{macrocode} % % \end{implementation} % -- cgit v1.2.3