diff options
author | Karl Berry <karl@freefriends.org> | 2020-09-05 21:53:42 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-09-05 21:53:42 +0000 |
commit | b1e7b9169e074d4c7f3a454994966badf12e975d (patch) | |
tree | 58c75412e84e201b114d51a8c4e8424fc705ada2 /Master/texmf-dist/tex | |
parent | 823d20684e4a1f6f587b839ceecccb12f7f484da (diff) |
xepersian-*kashida.tex file locations (5sep20)
git-svn-id: svn://tug.org/texlive/trunk@56272 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm-common-kashida.tex | 87 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm-kashida.tex | 213 |
2 files changed, 300 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm-common-kashida.tex b/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm-common-kashida.tex new file mode 100644 index 00000000000..e8f18375b6e --- /dev/null +++ b/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm-common-kashida.tex @@ -0,0 +1,87 @@ +%% +%% This is file `xepersian-hm-common-kashida.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% xepersian-hm.dtx (with options: `xepersian-hm-common-kashida-tex') +%% +%% Copyright (C) 2020 Hossein Movahhedian +%% +%% It may be distributed and/or modified under the LaTeX Project Public License, +%% version 1.3c or higher (your choice). The latest version of +%% this license is at: http://www.latex-project.org/lppl.txt +%% +\ProvidesExplFile {xepersian-hm-common-kashida.tex} {2020-09-04} {1.1a} { Fixes~implementation~of~Kashida~in~xepersian~package } + +\bool_if:NT \l_xephm_ligature_bool +{ + \clist_new:N \l_xephm_ligatures_clist + \int_new:N \l_xephm_lig_names_len_int + \int_set:Nn \l_xephm_lig_names_len_int { \clist_count:N \l_xephm_lig_names_clist } + \int_step_inline:nnnn { 1 } { 2 } { \l_xephm_lig_names_len_int } + { + \int_set:Nn \l_tmpa_int { #1 } + \int_set:Nn \l_tmpb_int { \int_eval:n { \l_tmpa_int + 1 } } + \tl_set:Nf \l_tmpa_tl { \clist_item:Nn \l_xephm_lig_names_clist { \l_tmpa_int } } + \clist_set:Nx \l_tmpa_clist { { \clist_item:Nn \l_xephm_lig_names_clist { \l_tmpb_int } } } + \bool_if:nT { \tl_if_eq_p:NN \l_xephm_active_ligs_tl \l_tmpa_tl || \tl_if_eq_p:NN \l_xephm_active_ligs_tl \l_xephm_lig_default_tl } + { + \clist_put_left:Nx \l_xephm_ligatures_clist { \l_tmpa_clist } + } + } + \clist_map_inline:Nn \l_xephm_ligatures_clist + { + \seq_set_split:Nnn \l_tmpa_seq { = } { #1 } + \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl { } { } + \seq_pop_left:NN \l_tmpa_seq \l_tmpb_tl { } { } + \tl_const:cx { \tl_use:N \l_tmpb_tl } { \char"\l_tmpa_tl \ } + } +} + +\bool_if:NT \l_xephm_linebreakpenalty_bool +{ + %% Partly adapted from LaTeX2e source + \cs_new:Nn \xephm_line_break: { + \if_mode_vertical: + \GenericError{ + \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space + }{ + LaTeX Error: There’s no line here to end + }{ + See the LaTeX manual or LaTeX Companion for explanation. + }{ + Your command was ignored.\MessageBreak + Type \space I <command> <return> \space to replace it~ + with another command,\MessageBreak + or \space <return> \space to continue without it.} + \else: + \l_tmpa_skip \tex_lastskip:D + \tex_unskip:D + \tex_penalty:D -\l_xephm_line_break_penalty_int + \dim_compare:nT { \l_tmpa_skip > \c_zero_skip } + { \skip_horizontal:N \l_tmpa_skip \tex_ignorespaces:D } + \fi: + } + + \NewDocumentCommand { \discouragebadlinebreaks } { O{\l_xephm_line_break_penalty_int} O{\c_xephm_skip_b_tl} m } + { + \IfNoValueF {#1} + { \int_set:Nn \l_xephm_line_break_penalty_int {#1} } + \IfNoValueF {#2} + { \tl_set:Nn \l_xephm_skip_default_tl {#2} } + \xephm_put_line_breaks:n { #3 } + } + + \cs_new_protected:Nn \xephm_put_line_breaks:n + { + \tl_set:Nn \l_xephm_line_break_tl { #1 } + \regex_replace_all:nnN { ([ابپتثجحخچدذرزژسشعغصضفقطظکگلمنوهیـ])+ } { \ \0 \ \c{xephm_line_break:}\ } \l_xephm_line_break_tl + \tl_use:N \l_xephm_line_break_tl + } +} + + \endinput +%% +%% +%% End of file `xepersian-hm-common-kashida.tex'. diff --git a/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm-kashida.tex b/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm-kashida.tex new file mode 100644 index 00000000000..56bf3319d6c --- /dev/null +++ b/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm-kashida.tex @@ -0,0 +1,213 @@ +%% +%% This is file `xepersian-hm-kashida.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% xepersian-hm.dtx (with options: `xepersian-hm-kashida-tex') +%% +%% Copyright (C) 2020 Hossein Movahhedian +%% +%% It may be distributed and/or modified under the LaTeX Project Public License, +%% version 1.3c or higher (your choice). The latest version of +%% this license is at: http://www.latex-project.org/lppl.txt +%% +\ProvidesExplFile {xepersian-hm-kashida.tex} {2020-09-04} {1.1a} { Fixes~implementation~of~Kashida~in~xepersian~package } + +\tex_input:D { xepersian-hm-common-kashida.tex } + +\newXeTeXintercharclass \c_xephm_d_charclass % dual-joiner class +\newXeTeXintercharclass \c_xephm_l_charclass % lam +\newXeTeXintercharclass \c_xephm_r_charclass % right-joiner +\newXeTeXintercharclass \c_xephm_a_charclass % alef +\newXeTeXintercharclass \c_xephm_y_charclass % yeh + +\tl_set:Nn \l_xephm_use_color_tl + { + \bool_if:NTF \l_xephm_color_bool + { + \colorlet{default}{\l_xephm_color_tl} + } + { + \colorlet{default}{.} + } + \color{default} + } + +%% Partly adapted from the code provided by David Carlisle in: +%% https://tex.stackexchange.com/questions/356709/how-to-know-the-width-and-fill-the-glue-space-between-two-characters-when-using/356721#356721 +\cs_new:Npn \xephm_kashida_glyph #1 +{ + \bool_if:NT \l_xephm_kashida_fix_bool + { + \c_xephm_lrm_int\tex_penalty:D 10000 + \mode_leave_vertical: + \tex_global:D \tex_advance:D \l_xephm_counter_int \c_one_int + + \tl_set:Nx \l_xephm_pos_tl { p\tex_romannumeral:D \l_xephm_counter_int } + \tl_set:Nx \l_xephm_zref_tl { z\tex_romannumeral:D \l_xephm_counter_int } + + \zsaveposx{x_i_\l_xephm_zref_tl} + \tl_set:Nx \l_tmpa_tl + { + \iow_now:cx { @auxout } + { + \token_to_str:N \gdef \exp_after:wN \token_to_str:N \cs:w xi\l_xephm_pos_tl \cs_end: { \zposx{ x_i_\l_xephm_zref_tl } } + } + } + \l_tmpa_tl + \skip_horizontal:n { #1 } + \zsaveposx{x_f_\l_xephm_zref_tl} + \tl_set:Nx \l_tmpa_tl + { + \iow_now:cx { @auxout } + { + \token_to_str:N \gdef \exp_after:wN \token_to_str:N \cs:w xf\l_xephm_pos_tl \cs_end: { \zposx{ x_f_\l_xephm_zref_tl } } + } + } + \l_tmpa_tl + \exp_after:wN + \if_meaning:w + \cs:w xi\l_xephm_pos_tl \cs_end: \tex_relax:D + \else: + \dim_set:Nn \l_xephm_diff_pos_dim + { + \dim_eval:n { \cs:w xi\l_xephm_pos_tl \cs_end: sp - \cs:w xf\l_xephm_pos_tl \cs_end: sp } + } + \dim_compare:nTF { \l_xephm_diff_pos_dim == 0sp } + { } + { \llap { \resizebox { \l_xephm_diff_pos_dim \tex_relax:D } { \height } { \l_xephm_use_color_tl \c_xephm_ksh_int } } } + \fi: + } +} + +\cs_new:Npn \xephm_kashida_leaders #1 +{ + \bool_if:NT \l_xephm_kashida_fix_bool + { + \tl_if_eq:NNTF \l_xephm_gap_filler_tl \l_xephm_stretch_leaders_glyph_tl + { + \tl_set:Nx \l_xephm_font_full_tl { \tex_fontname:D \tex_the:D \tex_font:D } + \tl_set:Nx \l_xephm_font_name_tl { \l_xephm_font_full_tl } + \tl_set:Nx \l_xephm_font_init_tl { \l_xephm_font_name_tl } + \regex_replace_once:nnN { ^"\[?(HM)[\_\ ](X|F).* } { \1\2 } \l_xephm_font_init_tl\relax + \tl_set:Nn \l_tmpa_tl { HMF } + \tl_set:Nn \l_tmpb_tl { HMX } + \bool_if:nTF { \str_if_eq_p:NN { \l_xephm_font_init_tl } { \l_tmpa_tl } || \str_if_eq_p:NN { \l_xephm_font_init_tl } { \l_tmpb_tl } } + { + \hbox_set:Nn \l_xephm_ksh_box { \l_xephm_use_color_tl \XeTeXglyph\XeTeXglyphindex"kashida" } + \c_xephm_zwj_int \tex_penalty:D 10000 + \tex_leaders:D \copy\l_xephm_ksh_box \skip_horizontal:n { #1 } + \c_xephm_zwj_int + } + { + \msg_error:nnx { xepersian-hm } { hm-series-font-not-found } { \l_xephm_font_name_tl } + } + } + { + %% Partly adapted from the code provided by Jonathan Kew in: + %% https://tug.org/pipermail/xetex/2009-February/012307.html. + %% Somebody notified me that the code in 'kashida-xepersian.def' from xepersian + %% package is an exact copy of Jonathan Kew's code. Being unaware of this, in + %% the earlier versions of this package I made a mistake and acknowledged + %% Vafa Khalighi instead of Jonathan Kew. A sincere thank you to Jonathan Kew + %% for his excellent code. + \c_xephm_lrm_int\c_xephm_zwj_int + {\l_xephm_use_color_tl\tex_penalty:D 10000 + \tex_leaders:D \tex_hrule:D height \XeTeXglyphbounds \c_xephm_two_int + \int_use:N \XeTeXcharglyph \c_xephm_ksh_int depth \XeTeXglyphbounds \c_xephm_four_int + \int_use:N \XeTeXcharglyph \c_xephm_ksh_int \skip_horizontal:n { #1 } + } + \c_xephm_zwj_int + } + } +} + +\XeTeXinterchartokenstate = 1 + +\clist_set:Nn \l_xephm_a_clist { 0622,0623,0625,0627 } % ا، إ، أ، آ +\clist_map_inline:Nn \l_xephm_a_clist + { + \XeTeXcharclass "#1 \c_xephm_a_charclass + } + +\clist_set:Nn \l_xephm_d_clist { 0626,0628,062A,062B,062C,062D,062E,0633,0634,0635,0636,0637,0638,0639,063A,0640,0641,0642,0643,0645,0646,0647,067E,0686,06A9,06AF } % ئ,ب,ت,ث,ج,ح,خ,س,ش,ص,ض,ط,ظ,ع,غ,ـ,ف,ق,ك,م,ن,ه,پ,چ,ک,گ +\clist_map_inline:Nn \l_xephm_d_clist + { + \XeTeXcharclass "#1 \c_xephm_d_charclass + } + +\clist_set:Nn \l_xephm_l_clist { 0644 } % ل +\clist_map_inline:Nn \l_xephm_l_clist + { + \XeTeXcharclass "#1 \c_xephm_l_charclass + } + +\clist_set:Nn \l_xephm_r_clist { 0624,0629,062F,0630,0631,0632,0648,0698 } % ؤ,ة,د,ذ,ر,ز,و,ژ +\clist_map_inline:Nn \l_xephm_r_clist + { + \XeTeXcharclass "#1 \c_xephm_r_charclass + } + +\clist_set:Nn \l_xephm_y_clist { 0649,064A,06CC } % ی,ي,ى +\clist_map_inline:Nn \l_xephm_y_clist + { + \XeTeXcharclass "#1 \c_xephm_y_charclass + } + +\tl_if_eq:NNTF \l_xephm_gap_filler_tl \l_xephm_stretch_glyph_tl { + \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_y_charclass = { + \bool_if:NTF \l_xephm_kashida_fix_bool + { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_skip_default_tl \c_xephm_zwj_int } + { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_y_charclass = { + \bool_if:NTF \l_xephm_kashida_fix_bool + { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_skip_default_tl \c_xephm_zwj_int } + { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + } + \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_d_charclass = { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_d_charclass = { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_d_charclass = { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_l_charclass = { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_l_charclass = { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_r_charclass = { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_a_charclass = { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_r_charclass = { \c_xephm_zwj_int \xephm_kashida_glyph \c_xephm_skip_a_tl \c_xephm_zwj_int } + \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_a_charclass = { } +} +{ + \bool_if:nTF { + \tl_if_eq_p:NN \l_xephm_gap_filler_tl \l_xephm_stretch_leaders_glyph_tl || + \tl_if_eq_p:NN \l_xephm_gap_filler_tl \l_xephm_stretch_leaders_hrule_tl + } + { + \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_y_charclass = { + \bool_if:NTF \l_xephm_kashida_fix_bool + { \xephm_kashida_leaders \l_xephm_skip_default_tl } + { \xephm_kashida_leaders \c_xephm_skip_a_tl } + } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_y_charclass = { + \bool_if:NTF \l_xephm_kashida_fix_bool + { \xephm_kashida_leaders \l_xephm_skip_default_tl } + { \xephm_kashida_leaders \c_xephm_skip_a_tl } + } + \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_d_charclass = { \xephm_kashida_leaders \c_xephm_skip_a_tl } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_d_charclass = { \xephm_kashida_leaders \c_xephm_skip_a_tl } + \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_d_charclass = { \xephm_kashida_leaders \c_xephm_skip_a_tl } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_l_charclass = { \xephm_kashida_leaders \c_xephm_skip_a_tl } + \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_l_charclass = { \xephm_kashida_leaders \c_xephm_skip_a_tl } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_r_charclass = { \xephm_kashida_leaders \c_xephm_skip_a_tl } + \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_a_charclass = { \xephm_kashida_leaders \c_xephm_skip_a_tl } + \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_r_charclass = { \xephm_kashida_leaders \c_xephm_skip_a_tl } + \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_a_charclass = { } + } + { + \msg_error:nnx { xepersian-hm } { error-value-not-available-for-kashida-option } { \l_xephm_gap_filler_tl } + } +} + + \endinput +%% +%% +%% End of file `xepersian-hm-kashida.tex'. |