summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/xpinyin/xpinyin.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/xpinyin/xpinyin.sty')
-rw-r--r--Master/texmf-dist/tex/latex/xpinyin/xpinyin.sty527
1 files changed, 315 insertions, 212 deletions
diff --git a/Master/texmf-dist/tex/latex/xpinyin/xpinyin.sty b/Master/texmf-dist/tex/latex/xpinyin/xpinyin.sty
index f6e6d79e7d8..dd0a6116271 100644
--- a/Master/texmf-dist/tex/latex/xpinyin/xpinyin.sty
+++ b/Master/texmf-dist/tex/latex/xpinyin/xpinyin.sty
@@ -21,9 +21,10 @@
%%
\NeedsTeXFormat{LaTeX2e}
\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}
-\ProvidesExplPackage{\ExplFileName}{\ExplFileDate}{1.3}{\ExplFileDescription}
+\ProvidesExplPackage{\ExplFileName}
+ {\ExplFileDate}{1.4}{\ExplFileDescription}
\msg_new:nnn { xpinyin } { no-LuaTeX }
{
The~xpinyin~package~is~not~supported~in~LuaTeX.\\\\
@@ -33,335 +34,432 @@
\luatex_if_engine:T { \msg_critical:nn { xpinyin } { no-LuaTeX } }
\RequirePackage{xparse}
\RequirePackage{l3keys2e}
-\box_new:N \l_xpinyin_tmpa_box
-\box_new:N \l_xpinyin_tmpb_box
-\cs_new_nopar:Nn \xpinyin_make_box:nn
- { \xpinyin_save_CJKsymbol:n {#1} \xpinyin_make_pinyin_box:nn {#1} {#2} }
-\cs_new_nopar:Nn \xpinyin_make_pinyin_box:nn
+\prop_new:N \c__xpinyin_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__xpinyin_tone_prop #1 }
+\cs_new_protected_nopar:Npn \__xpinyin_UTF_char:nn #1#2
+ {
+ \cs_if_exist:cF { u8:#1 }
+ { \cs_new_protected_nopar:cpn { u8:#1 } {#2} }
+ }
+\cs_new_protected_nopar:Npn \__xpinyin_GBK_char:nn #1#2
+ {
+ \__xpinyin_UTF_char:nn {#1} {#2}
+ \exp_args:Nx \__xpinyin_GBK_char_aux:nn { \tl_head:n {#1} } {#1}
+ }
+\cs_new_protected_nopar:Npn \__xpinyin_GBK_char_aux:nn #1#2
+ { \exp_args:Nf \__xpinyin_GBK_char_aux:nnn { \int_eval:n { `#1 } } {#1} {#2} }
+\cs_new_protected_nopar:Npn \__xpinyin_GBK_char_aux:nnn #1#2#3
+ {
+ \cs_if_exist:cF { __xpinyin_UTF_ #1 :w }
+ {
+ \exp_args:Nf \__xpinyin_GBK_char_def:nnn
+ {
+ \int_case:nn { \tl_count:n {#3} }
+ {
+ { \c_two } { ##1 }
+ { \c_three } { ##1##2 }
+ { \c_four } { ##1##2##3 }
+ }
+ }
+ {#1} {#2}
+ \exp_args:Nc \__xpinyin_save_UTF_cs:Nn { __xpinyin_UTF_ #1 :w } {#1}
+ \tl_gput_right:Nx \c__xpinyin_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 \__xpinyin_GBK_char_def:nnn #1#2#3
+ {
+ \cs_new_protected_nopar:cpn { __xpinyin_UTF_ #2 :w } #1
+ { \use:c { u8: \tl_to_str:n { #3#1 } } }
+ }
+\tl_new:N \c__xpinyin_reset_UTF_catcode_tl
+\group_begin:
+\char_set_catcode_active:n { \c_zero }
+\cs_new_protected_nopar:Npn \__xpinyin_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__xpinyin_reset_UTF_cs_tl { \cs_set_eq:NN ^^00 #1 }
+ }
+ }
+\group_end:
+\tl_new:N \c__xpinyin_reset_UTF_cs_tl
+\bool_new:N \g__xpinyin_GBK_bool
+\@ifpackageloaded { xeCJK }
+ { \AtEndOfPackage { \__xpinyin_adjust_xeCJK_hook: } }
+ {
+ \@ifpackageloaded { CJKutf8 }
+ {
+ \prop_map_function:NN \c__xpinyin_tone_prop \__xpinyin_UTF_char:nn
+ \AtEndOfPackage { \__xpinyin_adjust_CJK_hook: }
+ }
+ {
+ \@ifpackageloaded { CJK }
+ {
+ \RequirePackage { xCJK2uni }
+ \prop_map_function:NN \c__xpinyin_tone_prop \__xpinyin_GBK_char:nn
+ \AtEndOfPackage
+ {
+ \tl_put_right:Nn \l__xpinyin_pinyin_box_hook_tl
+ { \c__xpinyin_reset_UTF_cs_tl }
+ \__xpinyin_adjust_CJK_hook:
+ \tl_use:N \c__xpinyin_reset_UTF_catcode_tl
+ }
+ \bool_gset_true:N \g__xpinyin_GBK_bool
+ }
+ {
+ \xetex_if_engine:TF
+ {
+ \RequirePackage { xeCJK }
+ \AtEndOfPackage { \__xpinyin_adjust_xeCJK_hook: }
+ }
+ {
+ \RequirePackage { CJKutf8 }
+ \prop_map_function:NN \c__xpinyin_tone_prop \__xpinyin_UTF_char:nn
+ \AtEndOfPackage { \__xpinyin_adjust_CJK_hook: }
+ }
+ }
+ }
+ }
+\box_new:N \l__xpinyin_tmpa_box
+\box_new:N \l__xpinyin_tmpb_box
+\cs_new_protected_nopar:Npn \__xpinyin_make_box:nn #1#2
+ {
+ \__xpinyin_save_CJKsymbol:n {#1}
+ \__xpinyin_make_pinyin_box:xnn { \__xpinyin_to_unicode:n {#1} } {#1} {#2}
+ }
+\cs_new_protected_nopar:Npn \__xpinyin_make_pinyin_box:nnn #1#2#3
{
\hbox_overlap_left:n
{
- \hbox_set:Nn \l_xpinyin_tmpa_box
- { \xpinyin_CJKsymbol_hook: \xpinyin_save_CJKsymbol:n {#1} }
- \hbox_set:Nn \l_xpinyin_tmpb_box
+ \hbox_set:Nn \l__xpinyin_tmpa_box
+ { \__xpinyin_CJKsymbol_hook: \__xpinyin_save_CJKsymbol:n {#2} }
+ \hbox_set:Nn \l__xpinyin_tmpb_box
{
+ \l__xpinyin_pinyin_box_hook_tl
\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}
+ \__xpinyin_select_font:
+ \clist_if_exist:cTF { c__xpinyin_multiple_ #1 _clist }
+ { \l__xpinyin_multiple_tl \l__xpinyin_format_tl }
+ { \l__xpinyin_format_tl }
+ {#3}
\color_group_end:
}
\dim_compare:nNnT
- { \box_wd:N \l_xpinyin_tmpb_box } >
- { \box_wd:N \l_xpinyin_tmpa_box + \l_xpinyin_CJKglue_dim }
+ { \box_wd:N \l__xpinyin_tmpb_box } >
+ { \box_wd:N \l__xpinyin_tmpa_box + \l__xpinyin_CJKglue_dim }
{
- \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 }
+ \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 }
}
- \box_move_up:nn { \l_xpinyin_vsep_tl }
+ \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 }
+ \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 }
}
}
- { \xpinyin_CJK_node: }
- \xpinyin_CJK_ignorespaces:
+ { \__xpinyin_CJK_node: }
+ \__xpinyin_ignore_spaces:w
+ }
+\tl_new:N \l__xpinyin_pinyin_box_hook_tl
+\cs_generate_variant:Nn \__xpinyin_make_pinyin_box:nnn { x }
+\cs_new_protected_nopar:Npn \__xpinyin_CJKsymbol:n #1
+ { \__xpinyin_CJKsymbol:xn { \__xpinyin_to_unicode:n {#1} } {#1} }
+\cs_new_protected_nopar:Npn \__xpinyin_CJKsymbol:nn #1#2
+ {
+ \__xpinyin_save_CJKsymbol:n {#2}
+ \__xpinyin_make_pinyin_box:nnn {#1} {#2} { \use:c { c__xpinyin_ #1 _tl } }
}
-\cs_new_nopar:Nn \xpinyin_CJKsymbol:n
- { \xpinyin_make_box:nn {#1} { \xpinyin_to_pinyin:n {#1} } }
-\cs_new_nopar:Nn \xpinyin_to_pinyin:n
- { \use:c { c_xpinyin_ \xpinyin_CJKsymbol_to_unicode:n {#1} _tl } }
-\NewDocumentEnvironment { pinyinscope } { O{} }
+\cs_generate_variant:Nn \__xpinyin_CJKsymbol:nn { x }
+\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__xpinyin_hsep_tl
+ { \cs_set_nopar:Npn \CJKglue { \skip_horizontal:n { \l__xpinyin_hsep_tl } } }
+ \settowidth \l__xpinyin_CJKglue_dim { \CJKglue }
+ \__xpinyin_replace_CJKsymbol:
}
- { \cs_gset_eq:NN \CJKsymbol \xpinyin_save_CJKsymbol:n }
-\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__xpinyin_hsep_tl
+ { \cs_set_nopar:Npn \CJKglue { \skip_horizontal:n { \l__xpinyin_hsep_tl } } }
+ \settowidth \l__xpinyin_CJKglue_dim { \CJKglue }
+ \__xpinyin_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__xpinyin_CJKglue_dim { \CJKglue }
+ \__xpinyin_single_aux:nn {#3}
}
}
-\dim_new:N \l_xpinyin_CJKglue_dim
-\cs_new_nopar:Nn \xpinyin_xpinyin_single_aux:nn
+\dim_new:N \l__xpinyin_CJKglue_dim
+\cs_new_protected_nopar:Npn \__xpinyin_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} }
+ \__xpinyin_single_hook:n
+ { \cs_set_eq:NN \__xpinyin_save_CJKsymbol:n \use:n }
+ \cs_set_eq:NN \__xpinyin_to_unicode:n \__xpinyin_char_to_unicode:n
+ \__xpinyin_make_box:nn {#1} { \__xpinyin_pinyin:n {#2} }
\group_end:
}
-\cs_new_nopar:Nn \xpinyin_replace_CJKsymbol_aux:
+\cs_new_protected_nopar:Npn \__xpinyin_replace_CJKsymbol_aux:
{
- \cs_if_eq:NNF \CJKsymbol \xpinyin_CJKsymbol:n
+ \cs_if_eq:NNF \CJKsymbol \__xpinyin_CJKsymbol:n
{
- \cs_set_eq:NN \xpinyin_save_CJKsymbol:n \CJKsymbol
- \cs_set_eq:NN \CJKsymbol \xpinyin_CJKsymbol:n
+ \cs_set_eq:NN \__xpinyin_save_CJKsymbol:n \CJKsymbol
+ \cs_set_eq:NN \CJKsymbol \__xpinyin_CJKsymbol:n
}
}
-\cs_new_nopar:Npn \xpinyin_xpinyin_single_hook_aux:n
+\cs_new_protected_nopar:Npn \__xpinyin_single_hook_aux:n
{
- \cs_if_eq:NNTF \CJKsymbol \xpinyin_CJKsymbol:n
+ \cs_if_eq:NNTF \CJKsymbol \__xpinyin_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 \__xpinyin_save_CJKsymbol:n
+ \cs_set_eq:NN \__xpinyin_save_CJKsymbol:n \use:n
}
}
-\cs_new_nopar:Nn \xpinyin_select_font_xetex:
+\cs_new_protected_nopar:Npn \__xpinyin_select_font_xetex:
{
- \cs_if_exist_use:cF { \l_xpinyin_coor_tl }
+ \cs_if_exist_use:cF { \l__xpinyin_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__xpinyin_current_coor_tl { \l__xpinyin_coor_tl }
+ \__xpinyin_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__xpinyin_current_coor_tl \tex_font:D
}
}
}
-\cs_new_nopar:Nn \xpinyin_select_font_aux:
+\cs_new_protected_nopar:Npn \__xpinyin_select_font_aux:
{
\fontsize
- { \l_xpinyin_ratio_tl \etex_dimexpr:D \f@size pt \scan_stop: }
- { \c_zero_skip }
- \l_xpinyin_font_tl
+ { \l__xpinyin_ratio_tl \etex_dimexpr:D \f@size pt \scan_stop: }
+ { \f@baselineskip }
+ \l__xpinyin_font_tl
\selectfont
}
-\cs_new_nopar:Nn \xpinyin_CJKsymbol_to_unicode_xetex:n { \int_to_hexadecimal:n {`#1} }
-\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 \__xpinyin_to_unicode_xetex:n #1
+ { \int_to_hexadecimal:n { `#1 } }
+\cs_new_nopar:Npn \__xpinyin_UTF_to_unicode:n #1
+ {
+ \int_to_hexadecimal:n
+ { \exp_args:No \int_from_hexadecimal: { \CJK@plane } * "100 + #1 }
+ }
+\cs_new_nopar:Npn \__xpinyin_UTFchar_to_unicode:n #1
+ { \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
{
\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 }
-\cs_new_nopar:Nn \xpinyin_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_nopar:Nn \xpinyin_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:
+\cs_new_nopar:Npn \__xpinyin_GBK_to_unicode:n #1
+ { \CJKtu_sfd_map:nn { \CJK@plane } {#1} }
+\cs_new_nopar:Npn \__xpinyin_GBKchar_to_unicode:n #1
+ { \CJKchartouni {#1} }
+\cs_new_protected_nopar:Npn \__xpinyin_adjust_xeCJK_hook:
+ {
+ \cs_new_eq:NN \__xpinyin_select_font: \__xpinyin_select_font_xetex:
+ \cs_new_eq:NN \__xpinyin_to_unicode:n \__xpinyin_to_unicode_xetex:n
+ \cs_new_eq:NN \__xpinyin_char_to_unicode:n \__xpinyin_to_unicode:n
+ \cs_new_eq:NN \__xpinyin_replace_CJKsymbol: \__xpinyin_replace_CJKsymbol_aux:
+ \cs_new_protected_nopar:Npn \__xpinyin_ignore_spaces:w { \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_protected_nopar:Npn \__xpinyin_CJKsymbol_hook:
+ { \makexeCJKinactive \xeCJK_select_font: }
+ \cs_new_protected_nopar:Npn \__xpinyin_single_hook:n
+ { \cs_if_eq:NNTF \CJKsymbol \__xpinyin_CJKsymbol:n { \cs_set_eq:NN \CJKsymbol \use:n } }
+ }
+\cs_new_protected_nopar:Npn \__xpinyin_adjust_CJK_hook:
+ {
+ \bool_if:NTF \g__xpinyin_GBK_bool
+ {
+ \cs_new_eq:NN \__xpinyin_to_unicode:n \__xpinyin_GBK_to_unicode:n
+ \cs_new_eq:NN \__xpinyin_char_to_unicode:n \__xpinyin_GBKchar_to_unicode:n
+ }
+ {
+ \cs_new_eq:NN \__xpinyin_to_unicode:n \__xpinyin_UTF_to_unicode:n
+ \cs_new_eq:NN \__xpinyin_char_to_unicode:n \__xpinyin_UTFchar_to_unicode:n
+ }
+ \cs_new_eq:NN \__xpinyin_select_font: \__xpinyin_select_font_aux:
+ \cs_new_eq:NN \__xpinyin_CJKsymbol_hook: \prg_do_nothing:
+ \cs_new_protected_nopar:Npn \__xpinyin_CJK_node: { \CJK@CJK }
+ \cs_new_protected_nopar:Npn \__xpinyin_ignore_spaces:w { \CJK@ignorespaces }
\@ifpackageloaded { CJKpunct }
- { \xpinyin_adjust_CJKpunct_hook: }
+ { \__xpinyin_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 \__xpinyin_single_hook:n \__xpinyin_single_hook_aux:n
+ \cs_new_eq:NN \__xpinyin_replace_CJKsymbol: \__xpinyin_replace_CJKsymbol_aux:
+ \AtBeginDocument
+ {
+ \@ifpackageloaded { CJKpunct }
+ {
+ \cs_undefine:N \__xpinyin_single_hook:n
+ \cs_undefine:N \__xpinyin_replace_CJKsymbol:
+ \__xpinyin_adjust_CJKpunct_hook:
+ } { }
+ }
}
- \prop_map_function:NN \g_xpinyin_tone_prop \DeclareUnicodeCharacter
}
-\cs_new_nopar:Nn \xpinyin_adjust_CJKpunct_hook:
+\cs_new_protected_nopar:Npn \__xpinyin_adjust_CJKpunct_hook:
{
- \cs_new_nopar:Nn \xpinyin_replace_CJKsymbol:
+ \cs_new_protected_nopar:Npn \__xpinyin_replace_CJKsymbol:
{
\int_compare:nNnTF { \CJKpunct@punctstyle } = { \CJKpunct@ps@plain }
- { \xpinyin_replace_CJKsymbol_aux: }
+ { \__xpinyin_replace_CJKsymbol_aux: }
{
- \cs_if_eq:NNF \CJKosymbol \xpinyin_CJKsymbol:n
+ \cs_if_eq:NNF \CJKosymbol \__xpinyin_CJKsymbol:n
{
- \cs_set_eq:NN \xpinyin_save_CJKsymbol:n \CJKosymbol
- \cs_set_eq:NN \CJKosymbol \xpinyin_CJKsymbol:n
+ \cs_set_eq:NN \__xpinyin_save_CJKsymbol:n \CJKosymbol
+ \cs_set_eq:NN \CJKosymbol \__xpinyin_CJKsymbol:n
}
}
}
- \cs_new_nopar:Npn \xpinyin_xpinyin_single_hook:n
+ \cs_new_protected_nopar:Npn \__xpinyin_single_hook:n
{
\int_compare:nNnTF { \CJKpunct@punctstyle } = { \CJKpunct@ps@plain }
- { \xpinyin_xpinyin_single_hook_aux:n }
+ { \__xpinyin_single_hook_aux:n }
{
- \cs_if_eq:NNTF \CJKosymbol \xpinyin_CJKsymbol:n
+ \cs_if_eq:NNTF \CJKosymbol \__xpinyin_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 \__xpinyin_save_CJKsymbol:n
+ \cs_set_eq:NN \__xpinyin_save_CJKsymbol:n \use:n
}
}
}
}
-\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.\\
- }
-\NewDocumentCommand \pinyin { O{} m }
+\NewDocumentCommand \pinyin { O { } m }
{
\group_begin:
\keys_set:nn { xpinyin } {#1}
- \l_xpinyin_font_tl
- \l_xpinyin_format_tl
+ \l__xpinyin_font_tl
+ \l__xpinyin_format_tl
\selectfont
- \xpinyin_pinyin:n {#2}
+ \c__xpinyin_reset_UTF_cs_tl
+ \__xpinyin_pinyin:n {#2}
\group_end:
}
-\cs_new_nopar:Nn \xpinyin_pinyin:n
+\cs_new_protected_nopar:Npn \__xpinyin_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
+ \__xpinyin_pinyin_init:
+ \bool_set_true:N \l__xpinyin_first_bool
+ \tl_set:Nn \l__xpinyin_save_tl {#1}
+ \__xpinyin_pinyin_aux:n #1 \q_recursion_tail \q_recursion_stop
}
-\cs_new_nopar:Nn \xpinyin_xpinyin_aux:N
+\cs_new_protected_nopar:Npn \__xpinyin_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__xpinyin_first_bool { \l__xpinyin_save_tl }
+ { \tl_if_empty:NF \l__xpinyin_item_tl { \l__xpinyin_pysep_tl \l__xpinyin_item_tl } }
}
- \xpinyin_if_number:NTF {#1}
+ \__xpinyin_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__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_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__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} }
{
- \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__xpinyin_tone_tl {#1}
+ \tl_set_eq:NN \l__xpinyin_pre_tl \l__xpinyin_item_tl
+ \tl_clear:N \l__xpinyin_post_tl
}
- \tl_put_right:Nx \l_xpinyin_item_tl { \xpinyin_replace_v:N {#1} }
+ \tl_put_right:Nx \l__xpinyin_item_tl { \__xpinyin_replace_v:n {#1} }
}
- \xpinyin_xpinyin_aux:N
+ \__xpinyin_pinyin_aux:n
}
-\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_nopar:Nn \xpinyin_replace_v:N
+\cs_new_protected_nopar:Npn \__xpinyin_tone:Nn #1#2
+ { \use:c { __xpinyin_num_to_tone_ #1 :Nn } {#1} {#2} }
+\cs_generate_variant:Nn \__xpinyin_tone:Nn { V }
+\cs_new_nopar:Npn \__xpinyin_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__xpinyin_item_tl }
+ { { l } { } { n } { } { L } { } { N } { } }
+ { \exp_not:n { ü } } { u }
}
{ \exp_not:n {#1} }
}
-\cs_new_nopar:Nn \xpinyin_xpinyin_init:
+\cs_new_nopar:Npn \__xpinyin_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__xpinyin_pre_tl \tl_clear:N \l__xpinyin_post_tl
+ \tl_clear:N \l__xpinyin_item_tl \tl_clear:N \l__xpinyin_tone_tl
}
-\prg_new_conditional:Nnn \xpinyin_if_number:N { p , T , F , TF }
+\prg_new_conditional:Npnn \__xpinyin_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:
}
-\bool_new:N \l_xpinyin_first_bool
-\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 }
-\cs_new_nopar:Nn \xpinyin_num_to_tone:Nn
+\bool_new:N \l__xpinyin_first_bool
+\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 }
+\cs_new_protected_nopar:Npn \__xpinyin_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 { __xpinyin_num_to_tone_ #1 :Nn } \__xpinyin_num_to_tone:Nn }
+\cs_new_nopar:Npn \__xpinyin_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 \__xpinyin_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__xpinyin_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} }
+ { \__xpinyin_num_to_tone:Nn u {#2} }
}
-\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 }
\NewDocumentCommand \xpinyinsetup { m } { \keys_set:nn { xpinyin } {#1} }
\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__xpinyin_ #1 _tl } } }
\keys_set:nn { xpinyin }
{
ratio = .4 ,
@@ -372,16 +470,21 @@
\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__xpinyin_ #1 _tl } {#2} }
+\cs_set_nopar:Npn V+ #1 ~ #2 ~
+ { \clist_gset:cn { c__xpinyin_multiple_ #1 _clist } {#2} }
+\use:n
+ {
+ \char_set_catcode_space:N \
+ \file_input:n { xpinyin-map.cfg }
+ }
\group_end:
\NewDocumentCommand \setpinyin { m m }
{
\tl_set:cn
- { c_xpinyin_ \xpinyin_CJKchar_to_unicode:n {#1} _tl }
- { \xpinyin_pinyin:n {#2} }
+ { c__xpinyin_ \__xpinyin_char_to_unicode:n {#1} _tl }
+ { \__xpinyin_pinyin:n {#2} }
}
\ProcessKeysOptions { xpinyin }
%%