texlive[54816] Master/texmf-dist: xepersian-hm (20apr20)

commits+karl at tug.org commits+karl at tug.org
Mon Apr 20 23:15:05 CEST 2020


Revision: 54816
          http://tug.org/svn/texlive?view=revision&revision=54816
Author:   karl
Date:     2020-04-20 23:15:05 +0200 (Mon, 20 Apr 2020)
Log Message:
-----------
xepersian-hm (20apr20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/README.txt
    trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/kashida-example.pdf
    trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/kashida-example.tex
    trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/xepersian-hm.pdf
    trunk/Master/texmf-dist/source/xelatex/xepersian-hm/xepersian-hm.dtx
    trunk/Master/texmf-dist/tex/xelatex/xepersian-hm/kashida-xepersian-hm.def
    trunk/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm.sty

Modified: trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/README.txt
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/README.txt	2020-04-20 21:11:31 UTC (rev 54815)
+++ trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/README.txt	2020-04-20 21:15:05 UTC (rev 54816)
@@ -23,8 +23,9 @@
 The file `texmf-dist/doc/xelatex/xepersian-hm/kashida-example.tex' can be used as
 a simple example of the usage of the package.
 
-Any comments or suggestions would be gratefully appreciated.
-Please report any bugs or issues to `dma8hm1334 at gmail.com'.
+Please use the Bitbucket issue tracker:
+https://bitbucket.org/dma8hm1334/xepersian-hm/issues
+to report a bug, request a feature or if you have a comment.
 
 I will do my best to fix all the bugs you report, but, unfortunately,
 time is a big hurdle to overcome; so, my apologies in advance for those

Modified: trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/kashida-example.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/kashida-example.tex
===================================================================
--- trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/kashida-example.tex	2020-04-20 21:11:31 UTC (rev 54815)
+++ trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/kashida-example.tex	2020-04-20 21:15:05 UTC (rev 54816)
@@ -1,32 +1,77 @@
 % \PassOptionsToPackage{Kashida=off,RTLdocument=on}{xepersian}  % Load xepersian with a few options
 \documentclass{report}
-\usepackage{xcolor}
-% \usepackage[Kashida]{xepersian}                                     % Fails
-\usepackage[Kashida,kashidastretch=0.14 em plus 0.5 em]{xepersian-hm} % Succeeds
-% \usepackage[Kashida,kashidastretch=noskip]{xepersian-hm}            % Succeeds
-% \usepackage[Kashida,kashidastretch=default]{xepersian-hm}           % Succeeds
-% \usepackage[Kashida,kashidastretch=kayhan]{xepersian-hm}            % Succeeds
-% \usepackage[Kashida,kashidastretch=khorramshahr]{xepersian-hm}      % Succeeds
+% \textwidth=345.0pt
+% \textheight=550.0pt
+% \textheight=620pt
+% \usepackage[Kashida]{xepersian}  % Fails
+% \usepackage{xepersian-hm}  % Succeeds
+% \usepackage[Kashida=hrule,kashidastretch=0.14 em plus 0.5 em]{xepersian-hm}  % Succeeds
+% \usepackage[Kashida=hrule,kashidastretch=0.14 em plus 5.5 em]{xepersian-hm}  % Succeeds
+\usepackage[Kashida=glyph,linebreakpenalty=8,kashidastretch=0.14 em plus 5.5 em]{xepersian-hm}  % Succeeds
+% \usepackage[Kashida=glyph,kashidastretch=kayhan]{xepersian-hm}  % Succeeds
+% \usepackage[Kashida,kashidastretch=0.14 em plus 0.5 em]{xepersian-hm}  % Succeeds
+% \usepackage[Kashida,kashidastretch=noskip]{xepersian-hm}  % Succeeds
+% \usepackage[Kashida,kashidastretch=default]{xepersian-hm}  % Succeeds
+% \usepackage[Kashida,kashidastretch=kayhan]{xepersian-hm}  % Succeeds
+% \usepackage[Kashida,kashidastretch=khorramshahr]{xepersian-hm}  % Succeeds
 
 % \settextfont[Scale=4.5,Colour=darkgray]{XB Kayhan}
-\settextfont[Scale=4.5,Colour=darkgray]{HM XKayhan}
+\settextfont[Scale=4.5]{HM XKayhan}
 % \settextfont[Scale=4.5,Colour=darkgray]{HM XNiloofar} 
 % \settextfont[Scale=4.5,Colour=darkgray]{HM XYas} 
 % \settextfont[Scale=4.5,Colour=darkgray]{HM XZar} 
+% \settextfont[Scale=1,Colour=darkgray]{HM XKayhan}
 
-% \setlatintextfont[Scale=2.5,Colour=teal]{XB Kayhan}
-\setlatintextfont[Scale=2.5,Colour=teal]{HM XKayhan}
+% \setlatintextfont[Scale=2.5,Colour=0000FF]{XB Kayhan}
+\setlatintextfont[Scale=1.5,Colour=0000FF]{HM XKayhan}
 
-\def\SampleText{راهی جایی تابی چاپی چاههی تلاشهایی شتابهایی تابی چاپی راهی تلاشهــایی که کتابهایی که کلاههایی که}
+\defpersianfont\HMXKayhanIt[Scale=4.5]{HM XKayhan Italic}
+\defpersianfont\HMXKayhanOb[Scale=4.5]{HM XKayhanOb Oblique}
+\defpersianfont\HMXKayhanOl[Scale=4.5]{HM XKayhan Outline}
+\defpersianfont\HMXKayhanSd[Scale=4.5]{HM XKayhan Shadow}
 
+\def\SampleText{\discouragebadlinebreaks{
+ راهی جایی تابی چاپی چاههی تلاشهایی
+ شتابهایی تابی چاپی راهی تلاشهــایی
+ که کتابهایی که کلاههایی که کتابهایی }}
+
 \setlength\parindent{0pt}
 \pagestyle{empty}
+
 \begin{document}
-\color{red}
 
-\KashidaOff \SampleText \lr{(Kashida Off)~}
+\KashidaOff\lr{(Kashida Off, Regular)}
 
-\KashidaOn \SampleText \lr{(Kashida On)~}
+\SampleText
 
+\newpage
+
+\KashidaOn\lr{(Kashida On, Regular)}
+
+\SampleText
+
+\newpage
+
+\KashidaOn\lr{(Kashida On, Italic)}
+
+{\HMXKayhanIt \SampleText}
+
+\newpage
+
+\KashidaOn\lr{(Kashida On, Oblique)}
+
+{\HMXKayhanOb \SampleText}
+
+\newpage
+
+\KashidaOn\lr{(Kashida On, Outline)}
+
+{\HMXKayhanOl \SampleText}
+
+\newpage
+
+\KashidaOn\lr{(Kashida On, Shadow)}
+
+{\HMXKayhanSd \SampleText}
+
 \end{document}
-

Modified: trunk/Master/texmf-dist/doc/xelatex/xepersian-hm/xepersian-hm.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/xelatex/xepersian-hm/xepersian-hm.dtx
===================================================================
--- trunk/Master/texmf-dist/source/xelatex/xepersian-hm/xepersian-hm.dtx	2020-04-20 21:11:31 UTC (rev 54815)
+++ trunk/Master/texmf-dist/source/xelatex/xepersian-hm/xepersian-hm.dtx	2020-04-20 21:15:05 UTC (rev 54816)
@@ -15,8 +15,9 @@
 The file `texmf-dist/doc/xelatex/xepersian-hm/kashida-example.tex' can be used as
 a simple example of the usage of the package.
 
-Any comments or suggestions would be gratefully appreciated. 
-Please report any bugs or issues to `dma8hm1334 at gmail.com'.
+Please use the Bitbucket issue tracker:
+https://bitbucket.org/dma8hm1334/xepersian-hm/issues
+to report a bug, request a feature or if you have a comment.
 
 I will do my best to fix all the bugs you report, but, unfortunately,
 time is a big hurdle to overcome; so, my apologies in advance for those
@@ -34,13 +35,6 @@
 % version 1.3c or higher (your choice). The latest version of
 % this license is at: http://www.latex-project.org/lppl.txt
 %
-% \iffalse
-%<kashida-xepersian-hm> 
-%<kashida-xepersian-hm>% Copyright notice: the following code is partly adapted from the code in
-%<kashida-xepersian-hm>% 'kashida-xepersian.def' from xepersian package (v22.8).
-%<kashida-xepersian-hm>
-% \fi
-%
 %<*driver|package>
 % The version of expl3 required is tested as early as possible, as
 % some really old versions do not define \ProvidesExplPackage.
@@ -61,6 +55,7 @@
 %</driver|package>
 %<*driver>
 \documentclass[full]{l3doc}
+\usepackage{longtable}
 \usepackage{hypdoc}
 \addtolength{\hoffset}{-10mm}
 \begin{document}
@@ -70,24 +65,24 @@
 % \fi
 %
 % \title{^^A
-%   The \textsf{xepersian-hm} package\\ Fixes issues in xepersian package^^A
+%   The \textsf{xepersian-hm} package\\Fixing kashida in xepersian^^A
 % }
-%
+% 
 % \author{^^A
 %  Hossein Movahhedian\thanks
 %    {^^A
 %      E-mail:
 %        \href{mailto:dma8hm1334 at gmail.com}
-%          {dma8hm1334 at gmail.com}^^A
+%          {\textsf{dma8hm1334 at gmail.com}}
 %    }^^A
 % }
-%
-% \date{Released 2020-03-26}
-%
+% 
+% \date{Released 2020-04-20 \qquad v0.5a}
+% 
+% \begin{documentation}
+% 
 % \maketitle
-%
-% \begin{documentation}
-%
+% 
 % Kashida feature in \textsf{xepersian} has problems with some fonts such as \texttt{HM Series}
 % fonts available at
 % \href{https://dma8hm1334.bitbucket.io}{\texttt{https://dma8hm1334.bitbucket.io}}
@@ -98,16 +93,19 @@
 % The file \texttt{texmf-dist/doc/xelatex/xepersian-hm/kashida-example.tex} can be
 % used as a simple example of the usage of the package.
 % 
-% Any comments or suggestions would be gratefully appreciated. 
-% Please report any bug or issue to \href{mailto:dma8hm1334 at gmail.com}{\textsf{dma8hm1334 at gmail.com}}.
+% Please use the Bitbucket issue tracker:
+% \href{https://bitbucket.org/dma8hm1334/xepersian-hm/issues}{\textsf{https://bitbucket.org/dma8hm1334/xepersian-hm/issues}}
+% to report a bug, request a feature or if you have a comment.
 % 
 % I will do my best to fix all the bugs you report, but, unfortunately,
 % time is a big hurdle to overcome; so, my apologies in advance for those
 % which I cannot make time to fix.
 % 
+% \section{Package loading and options}
+% 
 % Please note that \textsf{xepersian-hm} loads \textsf{xepersian} automatically,
 % so you may only pass options to the package using the command
-% \verb|\PassOptionsToPackage| before \verb|\documentclass|, for example:
+% \verb|\PassOptionsToPackage| before \verb|\documentclass|. For example:
 % 
 % \begin{verbatim}
 % \PassOptionsToPackage{Kashida=off,RTLdocument=on}{xepersian}
@@ -118,15 +116,33 @@
 % 
 % The options available in \textsf{xepersian-hm} are:
 % \begin{itemize}
-%   \item \texttt{Kashida}: with two possible values, \texttt{on} which enables
-%     \texttt{Kashida} feature and \texttt{off} which disables that feature. For
-%     example \texttt{Kashida=on} enables \texttt{Kashida} feature.
+%   \item \texttt{Kashida}: which implements kashida feature with two possible values:
+%     \begin{itemize}
+%       \item \texttt{glyph}: which uses the \texttt{Kashida} character to stretch the text.
+%         Please note that this feature is still experimental and is not regarded as stable.
+%         If you are going to use this option be ready for unpredictable results.
+%       \item \texttt{hrule}: which uses a horizontal rule (\verb|\hrule|) to stretch the text.
+%     \end{itemize}
+%     For example \texttt{Kashida=glyph} inserts a stretched \texttt{Kashida} glyph where ever it is needed.
+%   \item \texttt{linebreakpenalty}: which specifies the amount of penalty for preventing bad line-breaking.
+%     You may strictly specify the value of this option. For example \texttt{'linebreakpenalty=8'} or you
+%     may use the default values. The available default values of penalties which are put into the
+%     horizontal list output are the negative of the followings:
+% 
+%     \begin{longtable}{ll}
+%       \texttt{min}:    & \texttt{0} \\
+%       \texttt{low}:    & \texttt{8} \\
+%       \texttt{medium}: & \texttt{15} \\
+%       \texttt{high}:   & \texttt{25} \\
+%       \texttt{max}:    & \texttt{10000} \\
+%     \end{longtable}
+% 
 %   \item \texttt{kashidastretch}: which specifies the amount of extra stretching
 %     for some combinations of characters. You may strictly specify the value of
 %     this option. For example \texttt{'kashidastretch=0.14 em plus 0.5 em'} or you
 %     may use the default values. The available default values are:
 % 
-%     \begin{tabular}{ll}
+%     \begin{longtable}{lll}
 %       \texttt{kayhan}       & \texttt{0.14  em plus 0.5 em} \\
 %       \texttt{khorramshahr} & \texttt{0.131 em plus 0.5 em} \\
 %       \texttt{kayhannavaar} & \texttt{0.129 em plus 0.5 em} \\
@@ -158,11 +174,20 @@
 %       \texttt{ziba}         & \texttt{0.119 em plus 0.5 em} \\
 %       \texttt{default}      & \texttt{0.14  em plus 0.5 em} \\
 %       \texttt{noskip}       & \texttt{0     em plus 0.5 em}
-%     \end{tabular}
+%     \end{longtable}
 % 
 %     For example: \mbox{\texttt{'kashidastretch=titr'}} is equivalent to\linebreak
 %     \mbox{\texttt{'kashidastretch=0.12  em plus 0.5 em'}}
 % \end{itemize}
+% 
+% \section{Commands}
+% 
+% \begin{description}
+%   \item \verb|\discouragebadlinebreaks{|{\it text}\verb|}|  {\it text} may not contain paragraph breaks.
+%     This command puts a penalty after each Persian word.
+%     The value of the penalty is set by the option \texttt{linebreakpenalty}.
+%     The default value is 8.
+% \end{description}
 %
 % \end{documentation}
 %
@@ -178,85 +203,133 @@
 %
 %    \begin{macrocode}
 \RequirePackage{l3keys2e}
+\RequirePackage{graphicx}[2019-11-30]
+\RequirePackage{zref-savepos}[2020-03-03]
 \RequirePackage{xepersian}
 \ExplSyntaxOn
-\ProvidesExplPackage {xepersian-hm} {2020-03-26} {0.4} { Fixes~issues~in~xepersian~package }
+\ProvidesExplPackage {xepersian-hm} {2020-04-20} {0.5a} { Fixes~issues~in~xepersian~package }
 
-\tl_set:Nn \l_kayhan_tl       { kayhan }
-\tl_set:Nn \l_khorramshahr_tl { khorramshahr }
-\tl_set:Nn \l_kayhannavaar_tl { kayhannavaar }  
-\tl_set:Nn \l_kayhanpook_tl   { kayhanpook }  
-\tl_set:Nn \l_kayhansayeh_tl  { kayhansayeh } 
-\tl_set:Nn \l_khoramshahr_tl  { khoramshahr } 
-\tl_set:Nn \l_khorramshahr_tl { khorramshahr }
-\tl_set:Nn \l_niloofar_tl     { niloofar }    
-\tl_set:Nn \l_paatch_tl       { paatch }      
-\tl_set:Nn \l_riyaz_tl        { riyaz }       
-\tl_set:Nn \l_roya_tl         { roya }        
-\tl_set:Nn \l_shafigh_tl      { shafigh }     
-\tl_set:Nn \l_shafighKurd_tl  { shafighKurd } 
-\tl_set:Nn \l_shafighUzbek_tl { shafighUzbek }
-\tl_set:Nn \l_shiraz_tl       { shiraz }      
-\tl_set:Nn \l_sols_tl         { sols }        
-\tl_set:Nn \l_tabriz_tl       { tabriz }      
-\tl_set:Nn \l_titr_tl         { titr }        
-\tl_set:Nn \l_titre_tl        { titre }       
-\tl_set:Nn \l_traffic_tl      { traffic }     
-\tl_set:Nn \l_vahid_tl        { vahid }       
-\tl_set:Nn \l_vosta_tl        { vosta }       
-\tl_set:Nn \l_yaghut_tl       { yaghut }      
-\tl_set:Nn \l_yagut_tl        { yagut }       
-\tl_set:Nn \l_yas_tl          { yas }         
-\tl_set:Nn \l_yekan_tl        { yekan }       
-\tl_set:Nn \l_yermook_tl      { yermook }     
-\tl_set:Nn \l_zar_tl          { zar }         
-\tl_set:Nn \l_ziba_tl         { ziba }        
-\tl_set:Nn \l_default_tl      { default }        
-\tl_set:Nn \l_noskip_tl       { noskip }        
+\bool_set_false:N \l_xephm_kashida_hm_fix_bool
 
+\tl_new:N \l_xephm_gap_filler_tl
+
+\bool_set_false:N \l_xephm_linebreakpenalty_bool
+
+\int_new:N \l_xephm_line_break_penalty_int
+\int_new:N \l_xephm_min_penalty_int
+\int_new:N \l_xephm_low_penalty_int
+\int_new:N \l_xephm_med_penalty_int
+\int_new:N \l_xephm_high_penalty_int
+\int_new:N \l_xephm_max_penalty_int
+
+\int_set:Nn \l_xephm_min_penalty_int { 0 }
+\int_set:Nn \l_xephm_low_penalty_int { 8 }
+\int_set:Nn \l_xephm_med_penalty_int { 15 }
+\int_set:Nn \l_xephm_high_penalty_int { 25 }
+\int_set:Nn \l_xephm_max_penalty_int { 10000 }
+
+\tl_set:Nn \l_xephm_stretch_glyph_tl { glyph }
+\tl_set:Nn \l_xephm_stretch_hrule_tl { hrule }
+
+\tl_set:Nn \l_xephm_kayhan_tl       { kayhan }
+\tl_set:Nn \l_xephm_khorramshahr_tl { khorramshahr }
+\tl_set:Nn \l_xephm_kayhannavaar_tl { kayhannavaar }
+\tl_set:Nn \l_xephm_kayhanpook_tl   { kayhanpook }
+\tl_set:Nn \l_xephm_kayhansayeh_tl  { kayhansayeh }
+\tl_set:Nn \l_xephm_khoramshahr_tl  { khoramshahr }
+\tl_set:Nn \l_xephm_khorramshahr_tl { khorramshahr }
+\tl_set:Nn \l_xephm_niloofar_tl     { niloofar }
+\tl_set:Nn \l_xephm_paatch_tl       { paatch }
+\tl_set:Nn \l_xephm_riyaz_tl        { riyaz }
+\tl_set:Nn \l_xephm_roya_tl         { roya }
+\tl_set:Nn \l_xephm_shafigh_tl      { shafigh }
+\tl_set:Nn \l_xephm_shafighKurd_tl  { shafighKurd }
+\tl_set:Nn \l_xephm_shafighUzbek_tl { shafighUzbek }
+\tl_set:Nn \l_xephm_shiraz_tl       { shiraz }
+\tl_set:Nn \l_xephm_sols_tl         { sols }
+\tl_set:Nn \l_xephm_tabriz_tl       { tabriz }
+\tl_set:Nn \l_xephm_titr_tl         { titr }
+\tl_set:Nn \l_xephm_titre_tl        { titre }
+\tl_set:Nn \l_xephm_traffic_tl      { traffic }
+\tl_set:Nn \l_xephm_vahid_tl        { vahid }
+\tl_set:Nn \l_xephm_vosta_tl        { vosta }
+\tl_set:Nn \l_xephm_yaghut_tl       { yaghut }
+\tl_set:Nn \l_xephm_yagut_tl        { yagut }
+\tl_set:Nn \l_xephm_yas_tl          { yas }
+\tl_set:Nn \l_xephm_yekan_tl        { yekan }
+\tl_set:Nn \l_xephm_yermook_tl      { yermook }
+\tl_set:Nn \l_xephm_zar_tl          { zar }
+\tl_set:Nn \l_xephm_ziba_tl         { ziba }
+\tl_set:Nn \l_xephm_default_tl      { default }
+\tl_set:Nn \l_xephm_noskip_tl       { noskip }
+
 \keys_define:nn { xepersian-hm }
   {
-    Kashida        .code:n = \tex_input:D { kashida-xepersian-hm.def } ,
-
-    kashidastretch .code:n =
+    Kashida .code:n = 
       {
         \tl_set:Nn \l_tmpa_tl { #1 }
         \tl_case:NnTF \l_tmpa_tl
           {
-             \l_kayhan_tl       { \tl_set:Nn \l_hskip_default_tl { 0.14  em plus 0.5 em } }
-             \l_khorramshahr_tl { \tl_set:Nn \l_hskip_default_tl { 0.131 em plus 0.5 em } }
-             \l_kayhannavaar_tl { \tl_set:Nn \l_hskip_default_tl { 0.129 em plus 0.5 em } }
-             \l_kayhanpook_tl   { \tl_set:Nn \l_hskip_default_tl { 0.133 em plus 0.5 em } }
-             \l_kayhansayeh_tl  { \tl_set:Nn \l_hskip_default_tl { 0.135 em plus 0.5 em } }
-             \l_khoramshahr_tl  { \tl_set:Nn \l_hskip_default_tl { 0.128 em plus 0.5 em } }
-             \l_khorramshahr_tl { \tl_set:Nn \l_hskip_default_tl { 0.13  em plus 0.5 em } }
-             \l_niloofar_tl     { \tl_set:Nn \l_hskip_default_tl { 0.132 em plus 0.5 em } }
-             \l_paatch_tl       { \tl_set:Nn \l_hskip_default_tl { 0.127 em plus 0.5 em } }
-             \l_riyaz_tl        { \tl_set:Nn \l_hskip_default_tl { 0.125 em plus 0.5 em } }
-             \l_roya_tl         { \tl_set:Nn \l_hskip_default_tl { 0.142 em plus 0.5 em } }
-             \l_shafigh_tl      { \tl_set:Nn \l_hskip_default_tl { 0.143 em plus 0.5 em } }
-             \l_shafighKurd_tl  { \tl_set:Nn \l_hskip_default_tl { 0.126 em plus 0.5 em } }
-             \l_shafighUzbek_tl { \tl_set:Nn \l_hskip_default_tl { 0.123 em plus 0.5 em } }
-             \l_shiraz_tl       { \tl_set:Nn \l_hskip_default_tl { 0.122 em plus 0.5 em } }
-             \l_sols_tl         { \tl_set:Nn \l_hskip_default_tl { 0.124 em plus 0.5 em } }
-             \l_tabriz_tl       { \tl_set:Nn \l_hskip_default_tl { 0.119 em plus 0.5 em } }
-             \l_titr_tl         { \tl_set:Nn \l_hskip_default_tl { 0.12  em plus 0.5 em } }
-             \l_titre_tl        { \tl_set:Nn \l_hskip_default_tl { 0.121 em plus 0.5 em } }
-             \l_traffic_tl      { \tl_set:Nn \l_hskip_default_tl { 0.124 em plus 0.5 em } }
-             \l_vahid_tl        { \tl_set:Nn \l_hskip_default_tl { 0.134 em plus 0.5 em } }
-             \l_vosta_tl        { \tl_set:Nn \l_hskip_default_tl { 0.136 em plus 0.5 em } }
-             \l_yaghut_tl       { \tl_set:Nn \l_hskip_default_tl { 0.138 em plus 0.5 em } }
-             \l_yagut_tl        { \tl_set:Nn \l_hskip_default_tl { 0.137 em plus 0.5 em } }
-             \l_yas_tl          { \tl_set:Nn \l_hskip_default_tl { 0.126 em plus 0.5 em } }
-             \l_yekan_tl        { \tl_set:Nn \l_hskip_default_tl { 0.141 em plus 0.5 em } }
-             \l_yermook_tl      { \tl_set:Nn \l_hskip_default_tl { 0.139 em plus 0.5 em } }
-             \l_zar_tl          { \tl_set:Nn \l_hskip_default_tl { 0.116 em plus 0.5 em } }
-             \l_ziba_tl         { \tl_set:Nn \l_hskip_default_tl { 0.119 em plus 0.5 em } }
-             \l_default_tl      { \tl_set:Nn \l_hskip_default_tl { 0.14  em plus 0.5 em } }
-             \l_noskip_tl       { \tl_set:Nn \l_hskip_default_tl { 0     em plus 0.5 em } }
-          } { } { \tl_set:Nn \l_hskip_default_tl { #1 } }
+            \l_xephm_stretch_glyph_tl { \tl_set:Nn \l_xephm_gap_filler_tl { \l_xephm_stretch_glyph_tl } }
+            \l_xephm_stretch_hrule_tl { \tl_set:Nn \l_xephm_gap_filler_tl { \l_xephm_stretch_hrule_tl } }
+          } { } { \tl_set:Nn \l_xephm_filler_default_tl { #1 } }
+        \bool_set_true:N \l_xephm_kashida_hm_fix_bool
+        \tex_input:D { kashida-xepersian-hm.def }
       } ,
-    kashidastretch .default:n = \tl_set:Nn \l_hskip_default_tl { 0 em plus 0.5 em } ,
+
+    linebreakpenalty .code:n = 
+      {
+        \int_set:Nn \l_tmpa_int { #1 }
+        \int_case:nnTF \l_tmpa_int
+          {
+            \l_xephm_min_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_min_penalty_int } }
+            \l_xephm_low_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_low_penalty_int } }
+            \l_xephm_med_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_med_penalty_int } }
+            \l_xephm_high_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_high_penalty_int } }
+            \l_xephm_max_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_max_penalty_int } }
+          } { } { \int_set:Nn \l_xephm_line_break_penalty_int { #1 } }
+        \bool_set_true:N \l_xephm_linebreakpenalty_bool
+      } ,
+
+    kashidastretch .code:n =
+      {
+        \tl_set:Nn \l_tmpb_tl { #1 }
+        \tl_case:NnTF \l_tmpb_tl
+          {
+             \l_xephm_kayhan_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.14  em plus 0.5 em } }
+             \l_xephm_khorramshahr_tl { \tl_set:Nn \l_xephm_hskip_default_tl { 0.131 em plus 0.5 em } }
+             \l_xephm_kayhannavaar_tl { \tl_set:Nn \l_xephm_hskip_default_tl { 0.129 em plus 0.5 em } }
+             \l_xephm_kayhanpook_tl   { \tl_set:Nn \l_xephm_hskip_default_tl { 0.133 em plus 0.5 em } }
+             \l_xephm_kayhansayeh_tl  { \tl_set:Nn \l_xephm_hskip_default_tl { 0.135 em plus 0.5 em } }
+             \l_xephm_khoramshahr_tl  { \tl_set:Nn \l_xephm_hskip_default_tl { 0.128 em plus 0.5 em } }
+             \l_xephm_khorramshahr_tl { \tl_set:Nn \l_xephm_hskip_default_tl { 0.13  em plus 0.5 em } }
+             \l_xephm_niloofar_tl     { \tl_set:Nn \l_xephm_hskip_default_tl { 0.132 em plus 0.5 em } }
+             \l_xephm_paatch_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.127 em plus 0.5 em } }
+             \l_xephm_riyaz_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.125 em plus 0.5 em } }
+             \l_xephm_roya_tl         { \tl_set:Nn \l_xephm_hskip_default_tl { 0.142 em plus 0.5 em } }
+             \l_xephm_shafigh_tl      { \tl_set:Nn \l_xephm_hskip_default_tl { 0.143 em plus 0.5 em } }
+             \l_xephm_shafighKurd_tl  { \tl_set:Nn \l_xephm_hskip_default_tl { 0.126 em plus 0.5 em } }
+             \l_xephm_shafighUzbek_tl { \tl_set:Nn \l_xephm_hskip_default_tl { 0.123 em plus 0.5 em } }
+             \l_xephm_shiraz_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.122 em plus 0.5 em } }
+             \l_xephm_sols_tl         { \tl_set:Nn \l_xephm_hskip_default_tl { 0.124 em plus 0.5 em } }
+             \l_xephm_tabriz_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.119 em plus 0.5 em } }
+             \l_xephm_titr_tl         { \tl_set:Nn \l_xephm_hskip_default_tl { 0.12  em plus 0.5 em } }
+             \l_xephm_titre_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.121 em plus 0.5 em } }
+             \l_xephm_traffic_tl      { \tl_set:Nn \l_xephm_hskip_default_tl { 0.124 em plus 0.5 em } }
+             \l_xephm_vahid_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.134 em plus 0.5 em } }
+             \l_xephm_vosta_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.136 em plus 0.5 em } }
+             \l_xephm_yaghut_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.138 em plus 0.5 em } }
+             \l_xephm_yagut_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.137 em plus 0.5 em } }
+             \l_xephm_yas_tl          { \tl_set:Nn \l_xephm_hskip_default_tl { 0.126 em plus 0.5 em } }
+             \l_xephm_yekan_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.141 em plus 0.5 em } }
+             \l_xephm_yermook_tl      { \tl_set:Nn \l_xephm_hskip_default_tl { 0.139 em plus 0.5 em } }
+             \l_xephm_zar_tl          { \tl_set:Nn \l_xephm_hskip_default_tl { 0.116 em plus 0.5 em } }
+             \l_xephm_ziba_tl         { \tl_set:Nn \l_xephm_hskip_default_tl { 0.119 em plus 0.5 em } }
+             \l_xephm_default_tl      { \tl_set:Nn \l_xephm_hskip_default_tl { 0.14  em plus 0.5 em } }
+             \l_xephm_noskip_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0     em plus 0.5 em } }
+          } { } { \tl_set:Nn \l_xephm_hskip_default_tl { #1 } }
+      } ,
+    kashidastretch .default:n = \tl_set:Nn \l_xephm_hskip_default_tl { 0 em plus 0.5 em } ,
   }
 
 \ProcessKeysOptions { xepersian-hm }
@@ -274,121 +347,264 @@
 %    \begin{macrocode}
 %<*kashida-xepersian-hm>
 \ExplSyntaxOn
-\ProvidesExplFile {kashida-xepersian-hm.def} {2020-03-26} {0.4} { Fixes~implementation~of~Kashida~in~xepersian~package }
+\ProvidesExplFile {kashida-xepersian-hm.def} {2020-04-20} {0.5a} { Fixes~implementation~of~Kashida~in~xepersian~package }
 
-\int_const:Nn \c_xepersianhm_zwj_int {"200D} % zero-width joiner
-\int_const:Nn \c_xepersianhm_lrm_int {"200E} % left-right-mark
-\int_const:Nn \c_xepersianhm_two_int {2} % 2
-\int_const:Nn \c_xepersianhm_four_int {4} % 4
-\int_const:Nn \c_xepersianhm_ksh_int {"0640} % kashida
-\int_const:Nn \c_xepersianhm_d_int {10} % dual-joiner class
-\int_const:Nn \c_xepersianhm_l_int {11} % lam
-\int_const:Nn \c_xepersianhm_r_int {12} % right-joiner
-\int_const:Nn \c_xepersianhm_a_int {13} % alef
-\int_const:Nn \c_xepersianhm_h_int {14} % heh
-\int_const:Nn \c_xepersianhm_y_int {15} % yeh
-\int_const:Nn \c_xepersianhm_v_int {4096} % vowel or other combining mark (to be ignored)
+\int_const:Nn \c_xephm_zwj_int {"200D} % zero-width joiner
+\int_const:Nn \c_xephm_lrm_int {"200E} % left-right-mark
+\int_const:Nn \c_xephm_two_int {2} % 2
+\int_const:Nn \c_xephm_four_int {4} % 4
+\int_const:Nn \c_xephm_ksh_int {"0640} % kashida
 
-\bool_new:N \l_kashida_on_bool
-\bool_new:N \l_kashida_hm_fix_bool
-\bool_new:N \l_kashida_xb_fix_bool
+\int_new:N \l_xephm_counter_int
 
-\tl_new:N \l_hskip_zero_tl
-\tl_new:N \l_hskip_default_tl
+\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
 
-\cs_new:Npn \xepersian_kashida #1
+\tl_new:N \l_xephm_hskip_zero_tl
+\tl_new:N \l_xephm_hskip_default_tl
+
+\dim_new:N \l_xephm_diff_pos_dim
+
+%% 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 } { m }
+ {
+  \xephm_put_line_breaks:n { #1 }
+ }
+
+\tl_new:N \l_xephm_line_break_tl
+
+\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
+ }
+
+%% 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_hm_fix_bool
   {
-    \bool_if:NT \l_kashida_on_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 { pos_\tex_romannumeral:D \l_xephm_counter_int }
+    \tl_set:Nx \l_xephm_zref_tl { zref_\tex_romannumeral:D \l_xephm_counter_int }
+
+    \zsaveposx{x_i_\l_xephm_zref_tl}
+    \tl_set:Nx \l_tmpa_tl
+      {
+        \iow_now:cx { @auxout }
+        {
+          \ExplSyntaxOn
+          \tl_gset:Nn \exp_after:wN \token_to_str:N \cs:w get_x_i\l_xephm_pos_tl \cs_end: { \zposx{ x_i_\l_xephm_zref_tl } }
+          \ExplSyntaxOff
+        }
+      }
+    \l_tmpa_tl
+    \skip_horizontal:n { #1 }
+    \zsaveposx{x_f_\l_xephm_zref_tl}
+    \tl_set:Nx \l_tmpa_tl
+      {
+        \iow_now:cx { @auxout }
+        {
+          \ExplSyntaxOn
+          \tl_gset:Nn \exp_after:wN \token_to_str:N \cs:w get_x_f\l_xephm_pos_tl \cs_end: { \zposx{ x_f_\l_xephm_zref_tl } }
+          \ExplSyntaxOff
+        }
+      }
+    \l_tmpa_tl
+    \exp_after:wN
+    \if_meaning:w
+      \cs:w get_x_i\l_xephm_pos_tl \cs_end: \tex_relax:D
+    \else:
+      \dim_set:Nn \l_xephm_diff_pos_dim
+        {
+          \dim_eval:n { \cs:w get_x_i\l_xephm_pos_tl \cs_end: sp - \cs:w get_x_f\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 } { \c_xephm_ksh_int } } }
+    \fi:
+  }
+}
+
+%% 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.
+\cs_new:Npn \xephm_kashida_hrule #1
+  {
+    \bool_if:NT \l_xephm_kashida_hm_fix_bool
     {
-      \c_xepersianhm_lrm_int\c_xepersianhm_zwj_int\tex_penalty:D 10000
-      \tex_leaders:D \tex_hrule:D height \XeTeXglyphbounds \c_xepersianhm_two_int
-      \int_use:N \XeTeXcharglyph \c_xepersianhm_ksh_int depth \XeTeXglyphbounds \c_xepersianhm_four_int
-      \int_use:N \XeTeXcharglyph \c_xepersianhm_ksh_int \skip_horizontal:n { #1 }
-      \c_xepersianhm_zwj_int
+      \c_xephm_lrm_int\c_xephm_zwj_int\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_xepersianhm_a_clist { 0622,0623,0625,0627 } % ‏ا، إ، أ، آ‏
-\clist_map_inline:Nn \l_xepersianhm_a_clist
+\clist_set:Nn \l_xephm_a_clist { 0622,0623,0625,0627 } % ‏ا، إ، أ، آ‏
+\clist_map_inline:Nn \l_xephm_a_clist
   {
-    \XeTeXcharclass "#1 \c_xepersianhm_a_int
+    \XeTeXcharclass "#1 \c_xephm_a_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_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_xepersianhm_d_clist
+\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_xepersianhm_d_int
+    \XeTeXcharclass "#1 \c_xephm_d_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_l_clist { 0644 } % ‏ل‏
-\clist_map_inline:Nn \l_xepersianhm_l_clist
+\clist_set:Nn \l_xephm_l_clist { 0644 } % ‏ل‏
+\clist_map_inline:Nn \l_xephm_l_clist
   {
-    \XeTeXcharclass "#1 \c_xepersianhm_l_int
+    \XeTeXcharclass "#1 \c_xephm_l_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_r_clist { 0624,0629,062F,0630,0631,0632,0648,0698 } % ‏ؤ,ة,د,ذ,ر,ز,و,ژ‏
-\clist_map_inline:Nn \l_xepersianhm_r_clist
+\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_xepersianhm_r_int
+    \XeTeXcharclass "#1 \c_xephm_r_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_v_clist { 064B,064C,064D,064E,064F,0650,0651,0652 } % ‏ً,ٌ,ٍ,َ,ُ,ِ,ّ,ْ‏
-\clist_map_inline:Nn \l_xepersianhm_v_clist
+\clist_set:Nn \l_xephm_y_clist { 0649,064A,06CC } % ‏ی,ي,ى‏
+\clist_map_inline:Nn \l_xephm_y_clist
   {
-    \XeTeXcharclass "#1 \c_xepersianhm_v_int
+    \XeTeXcharclass "#1 \c_xephm_y_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_y_clist { 0649,064A,06CC }
-\clist_map_inline:Nn \l_xepersianhm_y_clist
+\msg_new:nnx { xepersian-hm } { value-not-available-for-kashida-option }
   {
-    \XeTeXcharclass "#1 \c_xepersianhm_y_int
+    Sorry,~ value~ `\l_xephm_gap_filler_tl'~ is~ not~ available~ for~ kashida~ option~ yet!
   }
 
-\XeTeXinterchartoks \c_xepersianhm_y_int \c_xepersianhm_y_int = {\bool_if:NTF \l_kashida_hm_fix_bool {\xepersian_kashida {\l_hskip_default_tl}} {\xepersian_kashida \l_hskip_zero_tl}}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_y_int = {\bool_if:NTF \l_kashida_hm_fix_bool {\xepersian_kashida {\l_hskip_default_tl}} {\xepersian_kashida \l_hskip_zero_tl}}
-\XeTeXinterchartoks \c_xepersianhm_y_int \c_xepersianhm_d_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_d_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_l_int \c_xepersianhm_d_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_l_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_l_int \c_xepersianhm_l_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_r_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_a_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_l_int \c_xepersianhm_r_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_l_int \c_xepersianhm_a_int = {}
+\str_case:VnTF \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_hm_fix_bool
+            { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_default_tl \c_xephm_zwj_int }
+            { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+          }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_y_charclass =
+          {
+            \bool_if:NTF \l_xephm_kashida_hm_fix_bool
+            { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_default_tl \c_xephm_zwj_int }
+            { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+          }
+        \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_d_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_d_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_d_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_l_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_l_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_r_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_a_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_r_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_a_charclass =
+          { }
+      }
+    \l_xephm_stretch_hrule_tl
+      {
+        \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_y_charclass =
+          {
+            \bool_if:NTF \l_xephm_kashida_hm_fix_bool
+            { \xephm_kashida_hrule \l_xephm_hskip_default_tl }
+            { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+          }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_y_charclass =
+          {
+            \bool_if:NTF \l_xephm_kashida_hm_fix_bool
+            { \xephm_kashida_hrule \l_xephm_hskip_default_tl }
+            { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+          }
+        \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_d_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_d_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_d_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_l_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_l_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_r_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_a_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_r_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_a_charclass =
+          { }
+      }
+  } { } { \msg_error:nn { xepersian-hm } { value-not-available-for-kashida-option } }
 
-\NewDocumentCommand \KashidaOn {} { \bool_set_true:N \l_kashida_on_bool }
-\NewDocumentCommand \KashidaOff {} { \bool_set_false:N \l_kashida_on_bool }
+\NewDocumentCommand \KashidaHMFixOn {} { \bool_set_true:N \l_xephm_kashida_hm_fix_bool }
+\NewDocumentCommand \KashidaHMFixOff {} { \bool_set_false:N \l_xephm_kashida_hm_fix_bool }
 
-\NewDocumentCommand \KashidaXBFixOn {} { \bool_set_true:N \l_kashida_xb_fix_bool }
-\NewDocumentCommand \KashidaXBFixOff {} { \bool_set_false:N \l_kashida_xb_fix_bool }
+\tex_let:D \KashidaOn \KashidaHMFixOn
+\tex_let:D \KashidaOff \KashidaHMFixOff
 
-\NewDocumentCommand \KashidaHMFixOn {} { \bool_set_true:N \l_kashida_hm_fix_bool }
-\NewDocumentCommand \KashidaHMFixOff {} { \bool_set_false:N \l_kashida_hm_fix_bool }
+\tl_set:Nn \l_xephm_hskip_zero_tl { 0 em plus 0.5 em }
 
+\bool_if:NTF \l_xephm_kashida_hm_fix_bool
+  {
+    \tl_if_empty:NT \l_xephm_hskip_default_tl { \tl_set:Nn \l_xephm_hskip_default_tl  { 0.14 em plus 0.5 em } }
+  }
+  {
+    \tl_set:NV \l_xephm_hskip_default_tl  \l_xephm_hskip_zero_tl
+  }
+
 \ExplSyntaxOff
+
 \makeatletter
 \newif\if at Kashida@on
 \newif\if at Kashida@XB at fix
 \makeatother
-\ExplSyntaxOn
 
-\KashidaHMFixOn
-
-\tl_set:Nn \l_hskip_zero_tl { 0 em plus 0.5 em }
-
-\bool_if:NTF \l_kashida_hm_fix_bool
-  {
-    \tl_if_empty:NT \l_hskip_default_tl { \tl_set:Nn \l_hskip_default_tl  { 0.14 em plus 0.5 em } }
-  }
-  {
-    \tl_set:NV \l_hskip_default_tl  \l_hskip_zero_tl
-  }
-
-\KashidaOn
-
-\ExplSyntaxOff
  \endinput
 %</kashida-xepersian-hm>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/tex/xelatex/xepersian-hm/kashida-xepersian-hm.def
===================================================================
--- trunk/Master/texmf-dist/tex/xelatex/xepersian-hm/kashida-xepersian-hm.def	2020-04-20 21:11:31 UTC (rev 54815)
+++ trunk/Master/texmf-dist/tex/xelatex/xepersian-hm/kashida-xepersian-hm.def	2020-04-20 21:15:05 UTC (rev 54816)
@@ -13,126 +13,265 @@
 %% this license is at: http://www.latex-project.org/lppl.txt
 %% 
 %% File: xepersian-hm.dtx
+\ExplSyntaxOn
+\ProvidesExplFile {kashida-xepersian-hm.def} {2020-04-20} {0.5a} { Fixes~implementation~of~Kashida~in~xepersian~package }
 
-% Copyright notice: the following code is partly adapted from the code in
-% 'kashida-xepersian.def' from xepersian package (v22.8).
+\int_const:Nn \c_xephm_zwj_int {"200D} % zero-width joiner
+\int_const:Nn \c_xephm_lrm_int {"200E} % left-right-mark
+\int_const:Nn \c_xephm_two_int {2} % 2
+\int_const:Nn \c_xephm_four_int {4} % 4
+\int_const:Nn \c_xephm_ksh_int {"0640} % kashida
 
-\ExplSyntaxOn
-\ProvidesExplFile {kashida-xepersian-hm.def} {2020-03-26} {0.4} { Fixes~implementation~of~Kashida~in~xepersian~package }
+\int_new:N \l_xephm_counter_int
 
-\int_const:Nn \c_xepersianhm_zwj_int {"200D} % zero-width joiner
-\int_const:Nn \c_xepersianhm_lrm_int {"200E} % left-right-mark
-\int_const:Nn \c_xepersianhm_two_int {2} % 2
-\int_const:Nn \c_xepersianhm_four_int {4} % 4
-\int_const:Nn \c_xepersianhm_ksh_int {"0640} % kashida
-\int_const:Nn \c_xepersianhm_d_int {10} % dual-joiner class
-\int_const:Nn \c_xepersianhm_l_int {11} % lam
-\int_const:Nn \c_xepersianhm_r_int {12} % right-joiner
-\int_const:Nn \c_xepersianhm_a_int {13} % alef
-\int_const:Nn \c_xepersianhm_h_int {14} % heh
-\int_const:Nn \c_xepersianhm_y_int {15} % yeh
-\int_const:Nn \c_xepersianhm_v_int {4096} % vowel or other combining mark (to be ignored)
+\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
 
-\bool_new:N \l_kashida_on_bool
-\bool_new:N \l_kashida_hm_fix_bool
-\bool_new:N \l_kashida_xb_fix_bool
+\tl_new:N \l_xephm_hskip_zero_tl
+\tl_new:N \l_xephm_hskip_default_tl
 
-\tl_new:N \l_hskip_zero_tl
-\tl_new:N \l_hskip_default_tl
+\dim_new:N \l_xephm_diff_pos_dim
 
-\cs_new:Npn \xepersian_kashida #1
+%% 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 } { m }
+ {
+  \xephm_put_line_breaks:n { #1 }
+ }
+
+\tl_new:N \l_xephm_line_break_tl
+
+\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
+ }
+
+%% 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_hm_fix_bool
   {
-    \bool_if:NT \l_kashida_on_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 { pos_\tex_romannumeral:D \l_xephm_counter_int }
+    \tl_set:Nx \l_xephm_zref_tl { zref_\tex_romannumeral:D \l_xephm_counter_int }
+
+    \zsaveposx{x_i_\l_xephm_zref_tl}
+    \tl_set:Nx \l_tmpa_tl
+      {
+        \iow_now:cx { @auxout }
+        {
+          \ExplSyntaxOn
+          \tl_gset:Nn \exp_after:wN \token_to_str:N \cs:w get_x_i\l_xephm_pos_tl \cs_end: { \zposx{ x_i_\l_xephm_zref_tl } }
+          \ExplSyntaxOff
+        }
+      }
+    \l_tmpa_tl
+    \skip_horizontal:n { #1 }
+    \zsaveposx{x_f_\l_xephm_zref_tl}
+    \tl_set:Nx \l_tmpa_tl
+      {
+        \iow_now:cx { @auxout }
+        {
+          \ExplSyntaxOn
+          \tl_gset:Nn \exp_after:wN \token_to_str:N \cs:w get_x_f\l_xephm_pos_tl \cs_end: { \zposx{ x_f_\l_xephm_zref_tl } }
+          \ExplSyntaxOff
+        }
+      }
+    \l_tmpa_tl
+    \exp_after:wN
+    \if_meaning:w
+      \cs:w get_x_i\l_xephm_pos_tl \cs_end: \tex_relax:D
+    \else:
+      \dim_set:Nn \l_xephm_diff_pos_dim
+        {
+          \dim_eval:n { \cs:w get_x_i\l_xephm_pos_tl \cs_end: sp - \cs:w get_x_f\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 } { \c_xephm_ksh_int } } }
+    \fi:
+  }
+}
+
+%% 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.
+\cs_new:Npn \xephm_kashida_hrule #1
+  {
+    \bool_if:NT \l_xephm_kashida_hm_fix_bool
     {
-      \c_xepersianhm_lrm_int\c_xepersianhm_zwj_int\tex_penalty:D 10000
-      \tex_leaders:D \tex_hrule:D height \XeTeXglyphbounds \c_xepersianhm_two_int
-      \int_use:N \XeTeXcharglyph \c_xepersianhm_ksh_int depth \XeTeXglyphbounds \c_xepersianhm_four_int
-      \int_use:N \XeTeXcharglyph \c_xepersianhm_ksh_int \skip_horizontal:n { #1 }
-      \c_xepersianhm_zwj_int
+      \c_xephm_lrm_int\c_xephm_zwj_int\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_xepersianhm_a_clist { 0622,0623,0625,0627 } % ‏ا، إ، أ، آ‏
-\clist_map_inline:Nn \l_xepersianhm_a_clist
+\clist_set:Nn \l_xephm_a_clist { 0622,0623,0625,0627 } % ‏ا، إ، أ، آ‏
+\clist_map_inline:Nn \l_xephm_a_clist
   {
-    \XeTeXcharclass "#1 \c_xepersianhm_a_int
+    \XeTeXcharclass "#1 \c_xephm_a_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_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_xepersianhm_d_clist
+\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_xepersianhm_d_int
+    \XeTeXcharclass "#1 \c_xephm_d_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_l_clist { 0644 } % ‏ل‏
-\clist_map_inline:Nn \l_xepersianhm_l_clist
+\clist_set:Nn \l_xephm_l_clist { 0644 } % ‏ل‏
+\clist_map_inline:Nn \l_xephm_l_clist
   {
-    \XeTeXcharclass "#1 \c_xepersianhm_l_int
+    \XeTeXcharclass "#1 \c_xephm_l_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_r_clist { 0624,0629,062F,0630,0631,0632,0648,0698 } % ‏ؤ,ة,د,ذ,ر,ز,و,ژ‏
-\clist_map_inline:Nn \l_xepersianhm_r_clist
+\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_xepersianhm_r_int
+    \XeTeXcharclass "#1 \c_xephm_r_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_v_clist { 064B,064C,064D,064E,064F,0650,0651,0652 } % ‏ً,ٌ,ٍ,َ,ُ,ِ,ّ,ْ‏
-\clist_map_inline:Nn \l_xepersianhm_v_clist
+\clist_set:Nn \l_xephm_y_clist { 0649,064A,06CC } % ‏ی,ي,ى‏
+\clist_map_inline:Nn \l_xephm_y_clist
   {
-    \XeTeXcharclass "#1 \c_xepersianhm_v_int
+    \XeTeXcharclass "#1 \c_xephm_y_charclass
   }
 
-\clist_set:Nn \l_xepersianhm_y_clist { 0649,064A,06CC }
-\clist_map_inline:Nn \l_xepersianhm_y_clist
+\msg_new:nnx { xepersian-hm } { value-not-available-for-kashida-option }
   {
-    \XeTeXcharclass "#1 \c_xepersianhm_y_int
+    Sorry,~ value~ `\l_xephm_gap_filler_tl'~ is~ not~ available~ for~ kashida~ option~ yet!
   }
 
-\XeTeXinterchartoks \c_xepersianhm_y_int \c_xepersianhm_y_int = {\bool_if:NTF \l_kashida_hm_fix_bool {\xepersian_kashida {\l_hskip_default_tl}} {\xepersian_kashida \l_hskip_zero_tl}}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_y_int = {\bool_if:NTF \l_kashida_hm_fix_bool {\xepersian_kashida {\l_hskip_default_tl}} {\xepersian_kashida \l_hskip_zero_tl}}
-\XeTeXinterchartoks \c_xepersianhm_y_int \c_xepersianhm_d_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_d_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_l_int \c_xepersianhm_d_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_l_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_l_int \c_xepersianhm_l_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_r_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_d_int \c_xepersianhm_a_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_l_int \c_xepersianhm_r_int = {\xepersian_kashida \l_hskip_zero_tl}
-\XeTeXinterchartoks \c_xepersianhm_l_int \c_xepersianhm_a_int = {}
+\str_case:VnTF \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_hm_fix_bool
+            { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_default_tl \c_xephm_zwj_int }
+            { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+          }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_y_charclass =
+          {
+            \bool_if:NTF \l_xephm_kashida_hm_fix_bool
+            { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_default_tl \c_xephm_zwj_int }
+            { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+          }
+        \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_d_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_d_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_d_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_l_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_l_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_r_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_a_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_r_charclass =
+          { \c_xephm_zwj_int \xephm_kashida_glyph \l_xephm_hskip_zero_tl \c_xephm_zwj_int }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_a_charclass =
+          { }
+      }
+    \l_xephm_stretch_hrule_tl
+      {
+        \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_y_charclass =
+          {
+            \bool_if:NTF \l_xephm_kashida_hm_fix_bool
+            { \xephm_kashida_hrule \l_xephm_hskip_default_tl }
+            { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+          }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_y_charclass =
+          {
+            \bool_if:NTF \l_xephm_kashida_hm_fix_bool
+            { \xephm_kashida_hrule \l_xephm_hskip_default_tl }
+            { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+          }
+        \XeTeXinterchartoks \c_xephm_y_charclass \c_xephm_d_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_d_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_d_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_l_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_l_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_r_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_d_charclass \c_xephm_a_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_r_charclass =
+          { \xephm_kashida_hrule \l_xephm_hskip_zero_tl }
+        \XeTeXinterchartoks \c_xephm_l_charclass \c_xephm_a_charclass =
+          { }
+      }
+  } { } { \msg_error:nn { xepersian-hm } { value-not-available-for-kashida-option } }
 
-\NewDocumentCommand \KashidaOn {} { \bool_set_true:N \l_kashida_on_bool }
-\NewDocumentCommand \KashidaOff {} { \bool_set_false:N \l_kashida_on_bool }
+\NewDocumentCommand \KashidaHMFixOn {} { \bool_set_true:N \l_xephm_kashida_hm_fix_bool }
+\NewDocumentCommand \KashidaHMFixOff {} { \bool_set_false:N \l_xephm_kashida_hm_fix_bool }
 
-\NewDocumentCommand \KashidaXBFixOn {} { \bool_set_true:N \l_kashida_xb_fix_bool }
-\NewDocumentCommand \KashidaXBFixOff {} { \bool_set_false:N \l_kashida_xb_fix_bool }
+\tex_let:D \KashidaOn \KashidaHMFixOn
+\tex_let:D \KashidaOff \KashidaHMFixOff
 
-\NewDocumentCommand \KashidaHMFixOn {} { \bool_set_true:N \l_kashida_hm_fix_bool }
-\NewDocumentCommand \KashidaHMFixOff {} { \bool_set_false:N \l_kashida_hm_fix_bool }
+\tl_set:Nn \l_xephm_hskip_zero_tl { 0 em plus 0.5 em }
 
+\bool_if:NTF \l_xephm_kashida_hm_fix_bool
+  {
+    \tl_if_empty:NT \l_xephm_hskip_default_tl { \tl_set:Nn \l_xephm_hskip_default_tl  { 0.14 em plus 0.5 em } }
+  }
+  {
+    \tl_set:NV \l_xephm_hskip_default_tl  \l_xephm_hskip_zero_tl
+  }
+
 \ExplSyntaxOff
+
 \makeatletter
 \newif\if at Kashida@on
 \newif\if at Kashida@XB at fix
 \makeatother
-\ExplSyntaxOn
 
-\KashidaHMFixOn
-
-\tl_set:Nn \l_hskip_zero_tl { 0 em plus 0.5 em }
-
-\bool_if:NTF \l_kashida_hm_fix_bool
-  {
-    \tl_if_empty:NT \l_hskip_default_tl { \tl_set:Nn \l_hskip_default_tl  { 0.14 em plus 0.5 em } }
-  }
-  {
-    \tl_set:NV \l_hskip_default_tl  \l_hskip_zero_tl
-  }
-
-\KashidaOn
-
-\ExplSyntaxOff
  \endinput
 %% 
 %%

Modified: trunk/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm.sty
===================================================================
--- trunk/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm.sty	2020-04-20 21:11:31 UTC (rev 54815)
+++ trunk/Master/texmf-dist/tex/xelatex/xepersian-hm/xepersian-hm.sty	2020-04-20 21:15:05 UTC (rev 54816)
@@ -28,85 +28,133 @@
     \endinput
   }
 \RequirePackage{l3keys2e}
+\RequirePackage{graphicx}[2019-11-30]
+\RequirePackage{zref-savepos}[2020-03-03]
 \RequirePackage{xepersian}
 \ExplSyntaxOn
-\ProvidesExplPackage {xepersian-hm} {2020-03-26} {0.4} { Fixes~issues~in~xepersian~package }
+\ProvidesExplPackage {xepersian-hm} {2020-04-20} {0.5a} { Fixes~issues~in~xepersian~package }
 
-\tl_set:Nn \l_kayhan_tl       { kayhan }
-\tl_set:Nn \l_khorramshahr_tl { khorramshahr }
-\tl_set:Nn \l_kayhannavaar_tl { kayhannavaar }
-\tl_set:Nn \l_kayhanpook_tl   { kayhanpook }
-\tl_set:Nn \l_kayhansayeh_tl  { kayhansayeh }
-\tl_set:Nn \l_khoramshahr_tl  { khoramshahr }
-\tl_set:Nn \l_khorramshahr_tl { khorramshahr }
-\tl_set:Nn \l_niloofar_tl     { niloofar }
-\tl_set:Nn \l_paatch_tl       { paatch }
-\tl_set:Nn \l_riyaz_tl        { riyaz }
-\tl_set:Nn \l_roya_tl         { roya }
-\tl_set:Nn \l_shafigh_tl      { shafigh }
-\tl_set:Nn \l_shafighKurd_tl  { shafighKurd }
-\tl_set:Nn \l_shafighUzbek_tl { shafighUzbek }
-\tl_set:Nn \l_shiraz_tl       { shiraz }
-\tl_set:Nn \l_sols_tl         { sols }
-\tl_set:Nn \l_tabriz_tl       { tabriz }
-\tl_set:Nn \l_titr_tl         { titr }
-\tl_set:Nn \l_titre_tl        { titre }
-\tl_set:Nn \l_traffic_tl      { traffic }
-\tl_set:Nn \l_vahid_tl        { vahid }
-\tl_set:Nn \l_vosta_tl        { vosta }
-\tl_set:Nn \l_yaghut_tl       { yaghut }
-\tl_set:Nn \l_yagut_tl        { yagut }
-\tl_set:Nn \l_yas_tl          { yas }
-\tl_set:Nn \l_yekan_tl        { yekan }
-\tl_set:Nn \l_yermook_tl      { yermook }
-\tl_set:Nn \l_zar_tl          { zar }
-\tl_set:Nn \l_ziba_tl         { ziba }
-\tl_set:Nn \l_default_tl      { default }
-\tl_set:Nn \l_noskip_tl       { noskip }
+\bool_set_false:N \l_xephm_kashida_hm_fix_bool
 
+\tl_new:N \l_xephm_gap_filler_tl
+
+\bool_set_false:N \l_xephm_linebreakpenalty_bool
+
+\int_new:N \l_xephm_line_break_penalty_int
+\int_new:N \l_xephm_min_penalty_int
+\int_new:N \l_xephm_low_penalty_int
+\int_new:N \l_xephm_med_penalty_int
+\int_new:N \l_xephm_high_penalty_int
+\int_new:N \l_xephm_max_penalty_int
+
+\int_set:Nn \l_xephm_min_penalty_int { 0 }
+\int_set:Nn \l_xephm_low_penalty_int { 8 }
+\int_set:Nn \l_xephm_med_penalty_int { 15 }
+\int_set:Nn \l_xephm_high_penalty_int { 25 }
+\int_set:Nn \l_xephm_max_penalty_int { 10000 }
+
+\tl_set:Nn \l_xephm_stretch_glyph_tl { glyph }
+\tl_set:Nn \l_xephm_stretch_hrule_tl { hrule }
+
+\tl_set:Nn \l_xephm_kayhan_tl       { kayhan }
+\tl_set:Nn \l_xephm_khorramshahr_tl { khorramshahr }
+\tl_set:Nn \l_xephm_kayhannavaar_tl { kayhannavaar }
+\tl_set:Nn \l_xephm_kayhanpook_tl   { kayhanpook }
+\tl_set:Nn \l_xephm_kayhansayeh_tl  { kayhansayeh }
+\tl_set:Nn \l_xephm_khoramshahr_tl  { khoramshahr }
+\tl_set:Nn \l_xephm_khorramshahr_tl { khorramshahr }
+\tl_set:Nn \l_xephm_niloofar_tl     { niloofar }
+\tl_set:Nn \l_xephm_paatch_tl       { paatch }
+\tl_set:Nn \l_xephm_riyaz_tl        { riyaz }
+\tl_set:Nn \l_xephm_roya_tl         { roya }
+\tl_set:Nn \l_xephm_shafigh_tl      { shafigh }
+\tl_set:Nn \l_xephm_shafighKurd_tl  { shafighKurd }
+\tl_set:Nn \l_xephm_shafighUzbek_tl { shafighUzbek }
+\tl_set:Nn \l_xephm_shiraz_tl       { shiraz }
+\tl_set:Nn \l_xephm_sols_tl         { sols }
+\tl_set:Nn \l_xephm_tabriz_tl       { tabriz }
+\tl_set:Nn \l_xephm_titr_tl         { titr }
+\tl_set:Nn \l_xephm_titre_tl        { titre }
+\tl_set:Nn \l_xephm_traffic_tl      { traffic }
+\tl_set:Nn \l_xephm_vahid_tl        { vahid }
+\tl_set:Nn \l_xephm_vosta_tl        { vosta }
+\tl_set:Nn \l_xephm_yaghut_tl       { yaghut }
+\tl_set:Nn \l_xephm_yagut_tl        { yagut }
+\tl_set:Nn \l_xephm_yas_tl          { yas }
+\tl_set:Nn \l_xephm_yekan_tl        { yekan }
+\tl_set:Nn \l_xephm_yermook_tl      { yermook }
+\tl_set:Nn \l_xephm_zar_tl          { zar }
+\tl_set:Nn \l_xephm_ziba_tl         { ziba }
+\tl_set:Nn \l_xephm_default_tl      { default }
+\tl_set:Nn \l_xephm_noskip_tl       { noskip }
+
 \keys_define:nn { xepersian-hm }
   {
-    Kashida        .code:n = \tex_input:D { kashida-xepersian-hm.def } ,
-
-    kashidastretch .code:n =
+    Kashida .code:n =
       {
         \tl_set:Nn \l_tmpa_tl { #1 }
         \tl_case:NnTF \l_tmpa_tl
           {
-             \l_kayhan_tl       { \tl_set:Nn \l_hskip_default_tl { 0.14  em plus 0.5 em } }
-             \l_khorramshahr_tl { \tl_set:Nn \l_hskip_default_tl { 0.131 em plus 0.5 em } }
-             \l_kayhannavaar_tl { \tl_set:Nn \l_hskip_default_tl { 0.129 em plus 0.5 em } }
-             \l_kayhanpook_tl   { \tl_set:Nn \l_hskip_default_tl { 0.133 em plus 0.5 em } }
-             \l_kayhansayeh_tl  { \tl_set:Nn \l_hskip_default_tl { 0.135 em plus 0.5 em } }
-             \l_khoramshahr_tl  { \tl_set:Nn \l_hskip_default_tl { 0.128 em plus 0.5 em } }
-             \l_khorramshahr_tl { \tl_set:Nn \l_hskip_default_tl { 0.13  em plus 0.5 em } }
-             \l_niloofar_tl     { \tl_set:Nn \l_hskip_default_tl { 0.132 em plus 0.5 em } }
-             \l_paatch_tl       { \tl_set:Nn \l_hskip_default_tl { 0.127 em plus 0.5 em } }
-             \l_riyaz_tl        { \tl_set:Nn \l_hskip_default_tl { 0.125 em plus 0.5 em } }
-             \l_roya_tl         { \tl_set:Nn \l_hskip_default_tl { 0.142 em plus 0.5 em } }
-             \l_shafigh_tl      { \tl_set:Nn \l_hskip_default_tl { 0.143 em plus 0.5 em } }
-             \l_shafighKurd_tl  { \tl_set:Nn \l_hskip_default_tl { 0.126 em plus 0.5 em } }
-             \l_shafighUzbek_tl { \tl_set:Nn \l_hskip_default_tl { 0.123 em plus 0.5 em } }
-             \l_shiraz_tl       { \tl_set:Nn \l_hskip_default_tl { 0.122 em plus 0.5 em } }
-             \l_sols_tl         { \tl_set:Nn \l_hskip_default_tl { 0.124 em plus 0.5 em } }
-             \l_tabriz_tl       { \tl_set:Nn \l_hskip_default_tl { 0.119 em plus 0.5 em } }
-             \l_titr_tl         { \tl_set:Nn \l_hskip_default_tl { 0.12  em plus 0.5 em } }
-             \l_titre_tl        { \tl_set:Nn \l_hskip_default_tl { 0.121 em plus 0.5 em } }
-             \l_traffic_tl      { \tl_set:Nn \l_hskip_default_tl { 0.124 em plus 0.5 em } }
-             \l_vahid_tl        { \tl_set:Nn \l_hskip_default_tl { 0.134 em plus 0.5 em } }
-             \l_vosta_tl        { \tl_set:Nn \l_hskip_default_tl { 0.136 em plus 0.5 em } }
-             \l_yaghut_tl       { \tl_set:Nn \l_hskip_default_tl { 0.138 em plus 0.5 em } }
-             \l_yagut_tl        { \tl_set:Nn \l_hskip_default_tl { 0.137 em plus 0.5 em } }
-             \l_yas_tl          { \tl_set:Nn \l_hskip_default_tl { 0.126 em plus 0.5 em } }
-             \l_yekan_tl        { \tl_set:Nn \l_hskip_default_tl { 0.141 em plus 0.5 em } }
-             \l_yermook_tl      { \tl_set:Nn \l_hskip_default_tl { 0.139 em plus 0.5 em } }
-             \l_zar_tl          { \tl_set:Nn \l_hskip_default_tl { 0.116 em plus 0.5 em } }
-             \l_ziba_tl         { \tl_set:Nn \l_hskip_default_tl { 0.119 em plus 0.5 em } }
-             \l_default_tl      { \tl_set:Nn \l_hskip_default_tl { 0.14  em plus 0.5 em } }
-             \l_noskip_tl       { \tl_set:Nn \l_hskip_default_tl { 0     em plus 0.5 em } }
-          } { } { \tl_set:Nn \l_hskip_default_tl { #1 } }
+            \l_xephm_stretch_glyph_tl { \tl_set:Nn \l_xephm_gap_filler_tl { \l_xephm_stretch_glyph_tl } }
+            \l_xephm_stretch_hrule_tl { \tl_set:Nn \l_xephm_gap_filler_tl { \l_xephm_stretch_hrule_tl } }
+          } { } { \tl_set:Nn \l_xephm_filler_default_tl { #1 } }
+        \bool_set_true:N \l_xephm_kashida_hm_fix_bool
+        \tex_input:D { kashida-xepersian-hm.def }
       } ,
-    kashidastretch .default:n = \tl_set:Nn \l_hskip_default_tl { 0 em plus 0.5 em } ,
+
+    linebreakpenalty .code:n =
+      {
+        \int_set:Nn \l_tmpa_int { #1 }
+        \int_case:nnTF \l_tmpa_int
+          {
+            \l_xephm_min_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_min_penalty_int } }
+            \l_xephm_low_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_low_penalty_int } }
+            \l_xephm_med_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_med_penalty_int } }
+            \l_xephm_high_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_high_penalty_int } }
+            \l_xephm_max_penalty_int { \int_set:Nn \l_xephm_line_break_penalty_int { \l_xephm_max_penalty_int } }
+          } { } { \int_set:Nn \l_xephm_line_break_penalty_int { #1 } }
+        \bool_set_true:N \l_xephm_linebreakpenalty_bool
+      } ,
+
+    kashidastretch .code:n =
+      {
+        \tl_set:Nn \l_tmpb_tl { #1 }
+        \tl_case:NnTF \l_tmpb_tl
+          {
+             \l_xephm_kayhan_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.14  em plus 0.5 em } }
+             \l_xephm_khorramshahr_tl { \tl_set:Nn \l_xephm_hskip_default_tl { 0.131 em plus 0.5 em } }
+             \l_xephm_kayhannavaar_tl { \tl_set:Nn \l_xephm_hskip_default_tl { 0.129 em plus 0.5 em } }
+             \l_xephm_kayhanpook_tl   { \tl_set:Nn \l_xephm_hskip_default_tl { 0.133 em plus 0.5 em } }
+             \l_xephm_kayhansayeh_tl  { \tl_set:Nn \l_xephm_hskip_default_tl { 0.135 em plus 0.5 em } }
+             \l_xephm_khoramshahr_tl  { \tl_set:Nn \l_xephm_hskip_default_tl { 0.128 em plus 0.5 em } }
+             \l_xephm_khorramshahr_tl { \tl_set:Nn \l_xephm_hskip_default_tl { 0.13  em plus 0.5 em } }
+             \l_xephm_niloofar_tl     { \tl_set:Nn \l_xephm_hskip_default_tl { 0.132 em plus 0.5 em } }
+             \l_xephm_paatch_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.127 em plus 0.5 em } }
+             \l_xephm_riyaz_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.125 em plus 0.5 em } }
+             \l_xephm_roya_tl         { \tl_set:Nn \l_xephm_hskip_default_tl { 0.142 em plus 0.5 em } }
+             \l_xephm_shafigh_tl      { \tl_set:Nn \l_xephm_hskip_default_tl { 0.143 em plus 0.5 em } }
+             \l_xephm_shafighKurd_tl  { \tl_set:Nn \l_xephm_hskip_default_tl { 0.126 em plus 0.5 em } }
+             \l_xephm_shafighUzbek_tl { \tl_set:Nn \l_xephm_hskip_default_tl { 0.123 em plus 0.5 em } }
+             \l_xephm_shiraz_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.122 em plus 0.5 em } }
+             \l_xephm_sols_tl         { \tl_set:Nn \l_xephm_hskip_default_tl { 0.124 em plus 0.5 em } }
+             \l_xephm_tabriz_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.119 em plus 0.5 em } }
+             \l_xephm_titr_tl         { \tl_set:Nn \l_xephm_hskip_default_tl { 0.12  em plus 0.5 em } }
+             \l_xephm_titre_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.121 em plus 0.5 em } }
+             \l_xephm_traffic_tl      { \tl_set:Nn \l_xephm_hskip_default_tl { 0.124 em plus 0.5 em } }
+             \l_xephm_vahid_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.134 em plus 0.5 em } }
+             \l_xephm_vosta_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.136 em plus 0.5 em } }
+             \l_xephm_yaghut_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0.138 em plus 0.5 em } }
+             \l_xephm_yagut_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.137 em plus 0.5 em } }
+             \l_xephm_yas_tl          { \tl_set:Nn \l_xephm_hskip_default_tl { 0.126 em plus 0.5 em } }
+             \l_xephm_yekan_tl        { \tl_set:Nn \l_xephm_hskip_default_tl { 0.141 em plus 0.5 em } }
+             \l_xephm_yermook_tl      { \tl_set:Nn \l_xephm_hskip_default_tl { 0.139 em plus 0.5 em } }
+             \l_xephm_zar_tl          { \tl_set:Nn \l_xephm_hskip_default_tl { 0.116 em plus 0.5 em } }
+             \l_xephm_ziba_tl         { \tl_set:Nn \l_xephm_hskip_default_tl { 0.119 em plus 0.5 em } }
+             \l_xephm_default_tl      { \tl_set:Nn \l_xephm_hskip_default_tl { 0.14  em plus 0.5 em } }
+             \l_xephm_noskip_tl       { \tl_set:Nn \l_xephm_hskip_default_tl { 0     em plus 0.5 em } }
+          } { } { \tl_set:Nn \l_xephm_hskip_default_tl { #1 } }
+      } ,
+    kashidastretch .default:n = \tl_set:Nn \l_xephm_hskip_default_tl { 0 em plus 0.5 em } ,
   }
 
 \ProcessKeysOptions { xepersian-hm }



More information about the tex-live-commits mailing list.