3

xpinyin defines vsep that can move pinyin below the charater, but how to move pinyin to the left or right of a charachter? Is there a way to rotate pinyin to the left? TKS!

enter image description here

HERE is MWE:

\documentclass{article}
\usepackage{xeCJK}
\usepackage{adjustbox}

\usepackage{xpinyin}

\begin{document} \Huge\sffamily

\xpinyin[vsep={0.97em}]{举}{ju3} \xpinyin[vsep={-0.57em}]{举}{ju3} \xpinyin{\rotatebox[origin=c]{90}{举}} \xpinyin{\rotatebox[origin=c]{-90}{举}}

\end{document}

Marcus
  • 91

1 Answers1

1

It might be worthwhile asking the package maintainer to add a new feature.

Certainly, the information is in the Pinyin database, and, once read in, items can be positioned anywhere, including multiple readings.

Demonstration (using lualatex)

experiment

MWE

\documentclass{article}
%\usepackage{xeCJK}
%\usepackage{adjustbox}
%\usepackage{xpinyin}
\usepackage{fontspec}
\newfontfamily\cjk{NotoSerifCJKtc-Regular}
\newfontfamily\cjkb{MingLiu-ExtB}

%------------------------------------------------------------- \ExplSyntaxOn

% Adapted from xpinyin.sty: % #1 (character), rather than #2 (Unicode codepoint), % becomes part of the control sequence name. % #3 is the pinyin. All three are in the database. \cs_new_protected:Npn \xpinyin_customary:nnn #1#2 { \cs_gset_nopar:cpn { c__xpinyin_#1_tl } } \cs_new_protected:Npn \xpinyin_multiple:nnn #1#2 { \cs_gset_nopar:cpn { c__xpinyin_multiple_#1_clist } } \group_begin: \cs_set_eq:NN \XPYU \xpinyin_customary:nnn \cs_set_eq:NN \XPYUM \xpinyin_multiple:nnn \file_input:n { xpinyin-database.def } \group_end: %==============================

    \cs_generate_variant:Nn 
        \tl_replace_all:Nnn 
        { Nxx }


\bool_new:N \g__mpy_printfirstvar_bool \NewDocumentCommand \xpppinyin { s m } { \IfBooleanTF {#1 } { \bool_gset_false:N \g__mpy_printfirstvar_bool } { \bool_gset_true:N \g__mpy_printfirstvar_bool }

    \tl_set:Nn \l_tmpa_tl { #2 }

    \tl_map_function:NN
    \l_tmpa_tl 
    \gl_funcxpp:n 

    \tl_use:N \l_tmpa_tl

}

%----------------------------- \cs_set:Npn \gl_funcxpp:n #1 { \tl_set:Nn \l_tmpb_tl { #1 } % \tl_show:N \l_tmpb_tl

\tl_replace_all:Nxx \l_tmpa_tl { \l_tmpb_tl } { \clist_if_exist:cTF { c__xpinyin_multiple_ \l_tmpb_tl clist } { % there is a comma list for the character \bool_if:NTF \g__mpy_printfirstvar_bool { % bool true = print first reading \clist_item:cn { c__xpinyin_multiple \l_tmpb_tl clist } { 1 } * %=multi } { % bool false = print all readings
( \clist_use:cn
{ c__xpinyin_multiple
\l_tmpb_tl clist } { , } )
} \tex_space:D } { % not a comma list = only one reading \cs_if_exist:cT { c__xpinyin
\l_tmpb_tl tl } { \use:c { c__xpinyin \l_tmpb_tl _tl } \tex_space:D } } }

% \cs_show:c { c__xpinyin_ \l_tmpb_tl _tl } }

    \cs_generate_variant:Nn 
                \seq_set_split:Nnn 
            { cnx }

%----------------------------- \keys_define:nn { mpy } { mpya .tl_set:c = { l_mpy_char1_tl }, mpya .initial:n = { }, mpya .default:n = { }, mpyb .tl_set:c = { l_mpy_char2_tl }, mpyb .initial:n = { }, mpyb .default:n = { }, mpyc .tl_set:c = { l_mpy_char3_tl }, mpyc .initial:n = { }, mpyc .default:n = { }, } \seq_new:c { l_mpy_char1_seq } \seq_new:c { l_mpy_char2_seq } \seq_new:c { l_mpy_char3_seq }

\int_new:c { l_mpy_char1item_int } \int_new:c { l_mpy_char2item_int } \int_new:c { l_mpy_char3item_int }

\int_new:c { l_mpy_char1py_int } \int_new:c { l_mpy_char2py_int } \int_new:c { l_mpy_char3py_int }

\int_new:c { l_mpy_char1count_int } \NewDocumentCommand \xppname { O{ } m } {

 \int_gset:cn { l_mpy_char1count_int } { 0 }
 \int_gset:cn { l_mpy_char1item_int  } { 0 } 
 \int_gset:cn { l_mpy_char2item_int  } { 0 } 
 \int_gset:cn { l_mpy_char3item_int  } { 0 } 

  \IfNoValueF{#1}
{
    \keys_set:nn { mpy } { #1 } 
    }


%----- if the option has been set \tl_if_empty:cF { l_mpy_char1_tl } {
%----- store the record \seq_set_split:cnx { l_mpy_char1_seq } { ; } % separator { \tl_use:c { l_mpy_char1_tl } } %----- store the fields \int_set:cn { l_mpy_char1item_int } { \seq_item:cn { l_mpy_char1_seq } { 1 } %the i-th character } \int_set:cn { l_mpy_char1py_int } { \seq_item:cn { l_mpy_char1_seq } { 2 } %the k-th pinyin reading }

    }%end1

%----- if the option has been set \tl_if_empty:cF { l_mpy_char2_tl } {
%----- store the record \seq_set_split:cnx { l_mpy_char2_seq } { ; } % separator { \tl_use:c { l_mpy_char2_tl } } %----- store the fields \int_set:cn { l_mpy_char2item_int } { \seq_item:cn { l_mpy_char2_seq } { 1 } %the i-th character } \int_set:cn { l_mpy_char2py_int } { \seq_item:cn { l_mpy_char2_seq } { 2 } %the k-th pinyin reading }

    }%end2

%----- if the option has been set \tl_if_empty:cF { l_mpy_char3_tl } {
%----- store the record \seq_set_split:cnx { l_mpy_char3_seq } { ; } % separator { \tl_use:c { l_mpy_char3_tl } } %----- store the fields \int_set:cn { l_mpy_char3item_int } { \seq_item:cn { l_mpy_char3_seq } { 1 } %the i-th character } \int_set:cn { l_mpy_char3py_int } { \seq_item:cn { l_mpy_char3_seq } { 2 } %the k-th pinyin reading }

    }%end3








%----- \tl_set:Nn \l_tmpa_tl { #2 }

    \tl_map_function:NN
    \l_tmpa_tl
    \gl_funcxppname:n 

    \seq_set_split:NnV \l_tmpa_seq { ~ } \l_tmpa_tl

\seq_map_function:NN 
            \l_tmpa_seq 
            \gl_functitlecase:n

}

%----------------------------- \cs_set:Npn \gl_funcxppname:n #1 {

    \int_gincr:c { l_mpy_char1count_int }

 \tl_set:Nn \l_tmpb_tl { #1 }

\tl_replace_all:Nxx \l_tmpa_tl { \l_tmpb_tl } { \clist_if_exist:cTF { c__xpinyin_multiple_ \l_tmpb_tl clist } { % there is a comma list for the character % nth character's mth pinyin \int_compare:nNnTF { \int_use:c { l_mpy_char1count_int } } = { \int_use:c { l_mpy_char2item_int } } { \clist_item:cn { c__xpinyin_multiple \l_tmpb_tl clist } { \int_use:c { l_mpy_char2py_int } } }%% { %not 2
% nth character's mth pinyin \int_compare:nNnTF { \int_use:c { l_mpy_char1count_int } } = { \int_use:c { l_mpy_char3item_int } } { \clist_item:cn { c__xpinyin_multiple
\l_tmpb_tl clist } { \int_use:c { l_mpy_char3py_int } } }%% { % not 3 % nth character's mth pinyin \int_compare:nNnTF { \int_use:c { l_mpy_char1count_int } } = { \int_use:c { l_mpy_char1item_int } } { \clist_item:cn { c__xpinyin_multiple \l_tmpb_tl clist } { \int_use:c { l_mpy_char1py_int } } }%% { % not 1, therefore 1st pinyin \clist_item:cn { c__xpinyin_multiple \l_tmpb_tl clist } { 1 } }%false1 }%false2 }%false3 } { % not a comma list = only one reading \cs_if_exist:cTF { c__xpinyin \l_tmpb_tl tl } { \use:c { c__xpinyin \l_tmpb_tl _tl } } { % anything else #1 } } } }

\tl_new:N \l_gl_item_tl %----------------------------- \cs_set:Npn \gl_functitlecase:n #1 {~ \tl_set:Nn \l_gl_item_tl { #1 } \text_titlecase:nn {en} { \tl_use:N \l_gl_item_tl } % \tex_space:D } %-----------------------------

\ExplSyntaxOff

\begin{document} \Huge

{\cjk 举} $\mapsto$ \xpppinyin{举}

{\cjk 我诸葛亮} $\mapsto$ \xpppinyin{我诸葛亮}

{\cjk 我诸葛亮} $\mapsto$ \xpppinyin*{我诸葛亮}

{\cjkb } = \xpppinyin*{}

\xppname[mpya=3;2]{ }

\end{document}

Cicada
  • 10,129