اگر به کد موجود در فایل kashida-xepersian.def
نگاه کنید، کاری که انجام میشود این است که برای کشیدگی تعداد خطی (\hrule
) با استفاده از دستور \leaders
وارد میشود تا فضای موجود را پر کند. ارتفاع و عمق این خطها برابر با عمق و ارتفاع کاراکتر U+0640
(یا همان کاراکتر کشیده است) بنابراین بین حروف پارسی، خود کاراکتر کشیده وارد نمیشود بلکه \hrule
ای با ارتفاع و عمق کاراکتر کشیده وارد میشود. برای اینکه حروف چسبان خاصتیت چسبان بودن خود را ار دست ندهند بین این حروف (قبل از وارد کردن \hrule
) کاراکتر U+200D
یا zero-width joiner
قرار گرفته میشود.
برای اینکه ببینید چه قلمی مناسب است و چه قلمی مناسب نیست (بدون استفاده از گزینه کشیده)، میتوانید با قلم موجود نحوه خروجی کد زیر را ببینید:
ه\char"200D\char"0640
مشکل روش حاضر کشیده این است که حروف باید در انتهای خود صاف باشند. آیا این بهترین روش موجود است؟ خیر اما متأسفانه تنها راهحل است. برای اینکه بتوان راهحل بهتری پیادهسازی کرد، باید الگوریتم شکستن پاراگراف را تغییر داد که متأسفانه در زیتک امکان آن وجود ندارد.
راهحل دیگر آن است که به جای قرار دادن خط، کاراکتر کشیده را به اندازه فضای موجود sclae
کرد اما متأسفانه این روش با قلمهایی که به حالت cursive هستند مشکل خواهد داشت. برای دیدن این موضوع کد نمونه زیر و خروجی آن را ببینید:
\documentclass{article}
\usepackage{graphicx}
\usepackage{trimclip}
\usepackage{xepersian}
\settextfont[ExternalLocation,Scale=3]{amiri-regular}
\newcommand*{\Kashida}[4]{%
\leavevmode
#1\char"200D %
\llap{\clipbox{-1ex 0pt {\width} 0pt}{#2}}%
\resizebox{#3}{\height}{\clipbox{0pt}{#2}}%
\rlap{\clipbox{{\width} 0pt -1ex 0pt}{#2}}%
\char"200D #4%
}
\begin{document}
مــــــــــــــــــــــن
\medskip
\Kashida{م}{ـ}{100pt}{ن}
\Kashida{م}{ـ}{200pt}{ن}
\end{document}
راهحل دیگر آن است که به اندازه فضای موجود، کاراکتر کشیده را وارد کرد و اگر فضای اضافه دیگری وجود داشت، کاراکتر کشیده را به اندازه این فضا scale کرد:
\documentclass{article}
\usepackage{graphicx}
\usepackage{trimclip}
\usepackage{xepersian}
\settextfont[ExternalLocation,Scale=3]{amiri-regular}
\makeatletter
\newcommand*{\Kashida}[4]{%
\leavevmode
#1\char"200D %
\ifdim#3>\z@ % 0pt
\begingroup
\def\glyphline{#2}%
\settowidth{\dimen@}{\glyphline}%
\let\next@glyphline\glyphline
\@whiledim#3>\dimen@\do{%
\let\glyphline\next@glyphline
\expandafter
\def\expandafter\next@glyphline\expandafter{\glyphline#2}%
\settowidth{\dimen@}{\next@glyphline}%
}%
\llap{\clipbox{-1ex 0pt {\width} 0pt}{\glyphline}}%
\resizebox{#3}{\height}{\clipbox{0pt}{\glyphline}}%
\rlap{\clipbox{{\width} 0pt -1ex 0pt}{\glyphline}}%
\endgroup
\fi
\char"200D #4%
}
\makeatother
\begin{document}
مــــــــــــــــــــــن
\Kashida{م}{ـ}{50pt}{ن}
\Kashida{م}{ـ}{100pt}{ن}
\Kashida{م}{ـ}{150pt}{ن}
\Kashida{م}{ـ}{200pt}{ن}
\end{document}
این روش از روش قبلی و روش موجود در زیپرشین بهتر است اما همان مشکل روش پیشفرض زیپرشین را خواهد داشت یعنی هر قلمی که با
ه\char"200D\char"0640
اینجا هم مشکل خواهد داشت.
در آخر برای اینکه ببینید چرا این مشکل، مشکل قلم است و نه کد، کافی است خروجی کد زیر را ببینید:
\documentclass{article}
\usepackage{xepersian}
\settextfont[Scale=30]{XB Yas}
\begin{document}
ه%
\char"200D
\char"0640
\char"200D
م
\end{document}
همانطور که میبینید در این نمونه حتی از گزینه کشیده هم استفاده نشده است.