diff options
author | Karl Berry <karl@freefriends.org> | 2020-05-23 20:59:20 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-05-23 20:59:20 +0000 |
commit | 7b64c4b97c69692b53e046a8d4615591913c9a84 (patch) | |
tree | 52a5e5724f99e34f0f9a88e34be4eca432adfa69 /Master/texmf-dist/tex | |
parent | ec79c0450025998e7a787b41386690143e222881 (diff) |
akshar (23may20)
git-svn-id: svn://tug.org/texlive/trunk@55249 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/akshar/akshar.sty | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/akshar/akshar.sty b/Master/texmf-dist/tex/latex/akshar/akshar.sty new file mode 100644 index 00000000000..f3bf2b5d9cb --- /dev/null +++ b/Master/texmf-dist/tex/latex/akshar/akshar.sty @@ -0,0 +1,334 @@ +%% +%% This is file `akshar.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% akshar.dtx (with options: `package') +%% +%% --------------------------------------------------------------------------- +%% Package: akshar +%% Author: Vu Van Dung +%% Description: Support for syllables in the Devanagari script +%% Repository: https://github.com/joulev/akshar +%% Bug tracker: https://github.com/joulev/akshar/issues +%% License: The LaTeX Project Public License v1.3c or later +%% --------------------------------------------------------------------------- +%% This work may be distributed and/or modified under the conditions of the +%% LaTeX Project Public License, either version 1.3c of this license or (at +%% your option) any later version. +%% +%% The latest version of this license is in +%% +%% http://www.latex-project.org/lppl.txt. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Vu Van Dung. +%% +%% This work consists of the files akshar.dtx +%% akshar.ins +%% and the derived file akshar.sty. +%% --------------------------------------------------------------------------- +%% +\def\aksharPackageName{akshar} +\def\aksharPackageVersion{0.1} +\def\aksharPackageDate{2020/05/23} +\def\aksharPackageDescription{Support for syllables in the Devanagari script (JV)} +\RequirePackage{fontspec} +\ProvidesExplPackage {\aksharPackageName} + {\aksharPackageDate} {\aksharPackageVersion} {\aksharPackageDescription} +\tl_const:Nn \c__akshar_joining_tl { ्} +\tl_const:Nn \c__akshar_diacritics_tl + { + ा, ि, ी, ु, ू, े, ै, ो, ौ, ं, ः, ॢ, ृ, ॅ, ँ, ़, ॆ, ॊ, + ॉ, ॎ, ॏ, ॑, ॒, ॓, ॔, ॕ, ॖ, ॗ, ॄ, ऺ, ऻ, ꣠, ꣡, ꣢, ꣣, ꣤, ꣥, + ꣦, ꣧, ꣨, ꣩, ꣪, ꣫, ꣬, ꣭, ꣮, ꣯, ꣰, ꣱, ꣿ + } +\bool_new:N \l__akshar_prev_joining_bool +\seq_new:N \l__akshar_char_seq +\tl_new:N \l__akshar_tmpa_tl +\tl_new:N \l__akshar_tmpb_tl +\seq_new:N \l__akshar_tmpa_seq +\seq_new:N \l__akshar_tmpb_seq +\seq_new:N \l__akshar_tmpc_seq +\seq_new:N \l__akshar_tmpd_seq +\seq_new:N \l__akshar_tmpe_seq +\int_new:N \l__akshar_tmpa_int +\int_new:N \l__akshar_tmpb_int +\msg_new:nnnn { akshar } { err_not_a_sequence_variable } + { #1 ~ is ~ not ~ a ~ valid ~ LaTeX3 ~ sequence ~ variable. } + { + You ~ have ~ requested ~ me ~ to ~ assign ~ some ~ value ~ to ~ + the ~ control ~ sequence ~ #1, ~ but ~ it ~ is ~ not ~ a ~ valid ~ + sequence ~ variable. ~ Read ~ the ~ documentation ~ of ~ expl3 ~ + for ~ more ~ information. ~ Proceed ~ and ~ I ~ will ~ pretend ~ + that ~ #1 ~ is ~ a ~ local ~ sequence ~ variable ~ (beware ~ that ~ + unexpected ~ behaviours ~ may ~ occur). + } +\msg_new:nnnn { akshar } { err_character_out_of_bound } + { Character ~ index ~ out ~ of ~ bound. } + { + You ~ are ~ trying ~ to ~ get ~ the ~ #2 ~ character ~ of ~ the ~ + string ~ #1. ~ However ~ that ~ character ~ doesn't ~ exist. ~ + Make ~ sure ~ that ~ you ~ use ~ a ~ number ~ between ~ and ~ not ~ + including ~ 0 ~ and ~ #3, ~ so ~ that ~ I ~ can ~ return ~ a ~ + good ~ output. ~ Proceed ~ and ~ I ~ will ~ return ~ + \token_to_str:N \scan_stop:. + } +\msg_new:nnnn { akshar } { err_string_empty } + { The ~ input ~ string ~ is ~ empty. } + { + To ~ get ~ the ~ #1 ~ character ~ of ~ a ~ string, ~ that ~ string ~ + must ~ not ~ be ~ empty, ~ but ~ the ~ input ~ string ~ is ~ empty. + Make ~ sure ~ the ~ string ~ contains ~ something, ~ or ~ proceed ~ + and ~ I ~ will ~ use ~ \token_to_str:N \scan_stop:. + } +\prg_generate_conditional_variant:Nnn \tl_if_in:Nn { No } { TF } +\cs_generate_variant:Nn \seq_set_split:Nnn { Nxx } +\cs_generate_variant:Nn \msg_error:nnn { nnx } +\cs_generate_variant:Nn \msg_error:nnnnn { nnnxx } +\tl_const:Nx \c__akshar_str_g_tl { \tl_to_str:n {g} } +\tl_const:Nx \c__akshar_str_seq_tl { \tl_to_str:n {seq} } +\prg_new_conditional:Npnn \__akshar_var_if_global:N #1 { T, F, TF } + { + \bool_if:nTF + { \exp_last_unbraced:Nf \use_iii:nnn { \cs_split_function:N #1 } } + { + \msg_error:nnx { akshar } { err_not_a_sequence_variable } + { \token_to_str:N #1 } + \prg_return_false: + } + { + \seq_set_split:Nxx \l__akshar_tmpb_seq { \token_to_str:N _ } + { \exp_last_unbraced:Nf \use_i:nnn { \cs_split_function:N #1 } } + \seq_get_left:NN \l__akshar_tmpb_seq \l__akshar_tmpa_tl + \seq_get_right:NN \l__akshar_tmpb_seq \l__akshar_tmpb_tl + \tl_if_eq:NNTF \c__akshar_str_seq_tl \l__akshar_tmpb_tl + { + \tl_if_eq:NNTF \c__akshar_str_g_tl \l__akshar_tmpa_tl + { \prg_return_true: } { \prg_return_false: } + } + { + \msg_error:nnx { akshar } { err_not_a_sequence_variable } + { \token_to_str:N #1 } + \prg_return_false: + } + } + } +\cs_new:Npn \__akshar_int_append_ordinal:n #1 + { + #1 + \int_case:nnF { #1 } + { + { 11 } { th } + { 12 } { th } + { 13 } { th } + { -11 } { th } + { -12 } { th } + { -13 } { th } + } + { + \int_compare:nNnTF { #1 } > { -1 } + { + \int_case:nnF { #1 - 10 * (#1 / 10) } + { + { 1 } { st } + { 2 } { nd } + { 3 } { rd } + } { th } + } + { + \int_case:nnF { (- #1) - 10 * ((- #1) / 10) } + { + { 1 } { st } + { 2 } { nd } + { 3 } { rd } + } { th } + } + } + } +\cs_new:Npn \akshar_convert:Nn #1 #2 + { + \seq_clear:N \l__akshar_char_seq + \bool_set_false:N \l__akshar_prev_joining_bool + \tl_map_variable:NNn {#2} \l__akshar_map_tl + { + \tl_if_in:NoTF \c__akshar_diacritics_tl {\l__akshar_map_tl} + { + \seq_pop_right:NN \l__akshar_char_seq \l__akshar_tmpa_tl + \seq_put_right:Nx \l__akshar_char_seq + { \l__akshar_tmpa_tl \l__akshar_map_tl } + } + { + \tl_if_eq:NNTF \l__akshar_map_tl \c__akshar_joining_tl + { + \seq_pop_right:NN \l__akshar_char_seq \l__akshar_tmpa_tl + \seq_put_right:Nx \l__akshar_char_seq + { \l__akshar_tmpa_tl \l__akshar_map_tl } + \bool_set_true:N \l__akshar_prev_joining_bool + } + { + \bool_if:NTF \l__akshar_prev_joining_bool + { + \seq_pop_right:NN \l__akshar_char_seq \l__akshar_tmpa_tl + \seq_put_right:Nx \l__akshar_char_seq + { \l__akshar_tmpa_tl \l__akshar_map_tl } + \bool_set_false:N \l__akshar_prev_joining_bool + } + { + \seq_put_right:Nx + \l__akshar_char_seq { \l__akshar_map_tl } + } + } + } + } + \__akshar_var_if_global:NTF #1 + { \seq_gset_eq:NN #1 \l__akshar_char_seq } + { \seq_set_eq:NN #1 \l__akshar_char_seq } + } +\cs_generate_variant:Nn \akshar_convert:Nn { cn, Nx, cx } +\cs_new:Npn \__akshar_seq_push_seq:NN #1 #2 + { \seq_map_inline:Nn #2 { \seq_put_right:Nn #1 { ##1 } } } +\cs_new:Npn \__akshar_replace:NnnnN #1 #2 #3 #4 #5 + { + \akshar_convert:Nn \l__akshar_tmpc_seq {#2} + \akshar_convert:Nn \l__akshar_tmpd_seq {#3} + \akshar_convert:Nn \l__akshar_tmpe_seq {#4} + \seq_clear:N \l__akshar_tmpa_seq + \seq_clear:N \l__akshar_tmpb_seq + \int_set:Nn \l__akshar_tmpa_int { 1 } + \int_set:Nn \l__akshar_tmpb_int { 0 } + \seq_map_variable:NNn \l__akshar_tmpc_seq \l__akshar_map_tl + { + \int_compare:nNnTF { \l__akshar_tmpb_int } > { 0 } + { \seq_put_right:NV \l__akshar_tmpb_seq \l__akshar_map_tl } + { + \int_compare:nNnTF + {\l__akshar_tmpa_int} = {1 + \seq_count:N \l__akshar_tmpd_seq} + { + \bool_if:NT {#5} + { \int_incr:N \l__akshar_tmpb_int } + \seq_clear:N \l__akshar_tmpb_seq + \__akshar_seq_push_seq:NN + \l__akshar_tmpa_seq \l__akshar_tmpe_seq + \int_set:Nn \l__akshar_tmpa_int { 1 } + \tl_set:Nx \l__akshar_tmpa_tl + { \seq_item:Nn \l__akshar_tmpd_seq { 1 } } + \tl_if_eq:NNTF \l__akshar_map_tl \l__akshar_tmpa_tl + { + \int_incr:N \l__akshar_tmpa_int + \seq_put_right:NV \l__akshar_tmpb_seq \l__akshar_map_tl + } + { + \seq_put_right:NV \l__akshar_tmpa_seq \l__akshar_map_tl + } + } + { + \tl_set:Nx \l__akshar_tmpa_tl + { + \seq_item:Nn \l__akshar_tmpd_seq { \l__akshar_tmpa_int } + } + \tl_if_eq:NNTF \l__akshar_map_tl \l__akshar_tmpa_tl + { + \int_incr:N \l__akshar_tmpa_int + \seq_put_right:NV \l__akshar_tmpb_seq \l__akshar_map_tl + } + { + \int_set:Nn \l__akshar_tmpa_int { 1 } + \__akshar_seq_push_seq:NN + \l__akshar_tmpa_seq \l__akshar_tmpb_seq + \seq_clear:N \l__akshar_tmpb_seq + \tl_set:Nx \l__akshar_tmpa_tl + { \seq_item:Nn \l__akshar_tmpd_seq { 1 } } + \tl_if_eq:NNTF \l__akshar_map_tl \l__akshar_tmpa_tl + { + \int_incr:N \l__akshar_tmpa_int + \seq_put_right:NV + \l__akshar_tmpb_seq \l__akshar_map_tl + } + { + \seq_put_right:NV + \l__akshar_tmpa_seq \l__akshar_map_tl + } + } + } + } + } + \__akshar_seq_push_seq:NN \l__akshar_tmpa_seq \l__akshar_tmpb_seq + \__akshar_var_if_global:NTF #1 + { \seq_gset_eq:NN #1 \l__akshar_tmpa_seq } + { \seq_set_eq:NN #1 \l__akshar_tmpa_seq } + } +\NewExpandableDocumentCommand \aksharStrLen {m} + { + \akshar_convert:Nn \l__akshar_tmpa_seq {#1} + \seq_count:N \l__akshar_tmpa_seq + } +\NewExpandableDocumentCommand \aksharStrChar {mm} + { + \akshar_convert:Nn \l__akshar_tmpa_seq {#1} + \bool_if:nTF + { + \int_compare_p:nNn {#2} > {0} && + \int_compare_p:nNn {#2} < {1 + \seq_count:N \l__akshar_tmpa_seq} + } + { \seq_item:Nn \l__akshar_tmpa_seq { #2 } } + { + \msg_error:nnnxx { akshar } { err_character_out_of_bound } + { #1 } { \__akshar_int_append_ordinal:n { #2 } } + { \int_eval:n { 1 + \seq_count:N \l__akshar_tmpa_seq } } + \scan_stop: + } + } +\NewExpandableDocumentCommand \aksharStrHead {m} + { + \akshar_convert:Nn \l__akshar_tmpa_seq {#1} + \int_compare:nNnTF { \seq_count:N \l__akshar_tmpa_seq } = {0} + { + \msg_error:nnn { akshar } { err_character_out_of_bound } + { first } + \scan_stop: + } + { \seq_item:Nn \l__akshar_tmpa_seq { 1 } } + } +\NewExpandableDocumentCommand \aksharStrTail {m} + { + \akshar_convert:Nn \l__akshar_tmpa_seq {#1} + \int_compare:nNnTF { \seq_count:N \l__akshar_tmpa_seq } = {0} + { + \msg_error:nnn { akshar } { err_character_out_of_bound } + { last } + \scan_stop: + } + { \seq_item:Nn \l__akshar_tmpa_seq {\seq_count:N \l__akshar_tmpa_seq} } + } +\NewExpandableDocumentCommand \aksharStrReplace {smmm} + { + \IfBooleanTF {#1} + { + \__akshar_replace:NnnnN \l__akshar_tmpa_seq + {#2} {#3} {#4} \c_true_bool + } + { + \__akshar_replace:NnnnN \l__akshar_tmpa_seq + {#2} {#3} {#4} \c_false_bool + } + \seq_use:Nn \l__akshar_tmpa_seq {} + } +\NewExpandableDocumentCommand \aksharStrRemove {smm} + { + \IfBooleanTF {#1} + { + \__akshar_replace:NnnnN \l__akshar_tmpa_seq + {#2} {#3} {} \c_true_bool + } + { + \__akshar_replace:NnnnN \l__akshar_tmpa_seq + {#2} {#3} {} \c_false_bool + } + \seq_use:Nn \l__akshar_tmpa_seq {} + } +\endinput +%% +%% End of file `akshar.sty'. |