این بسته همون کد بسته زیپرشین برای کشیده رو برداشته و دقیقا همون کد تک رو به زبان برنامهنویسی لاتک ۳ ترجمه کرده. تنها کار اضافهای که این بسته انجام میده این هست که در بسته زیپرشین کشیده توسط یک خط افقی (توسط دستور بدوی \hrule
قرار میگیره) در واقع بصورت دقیقتر این بصورت \leaders\hrule
هست که طبق قوانین تک بعد باید شما یک glue یا چسب قرار بدهید. مقدار این چسب در بسته زیپرشین 0pt plus 0.5em
هست. کاری که این بسته جدید انجام میده اینه که برای قامهای مختلف چسبهای مختلف تعریف کرده و این اجازه رو به کاربر میده که مقدار چسب رو خودش مشخص کنه (در صورت استفاده از قلمهای دیگر یا در صورت نیاز). این تنها تفاوتش با کد اصلی در بسته زیپرشین هست.
برای استفاده از بسته میتونی راهنمای بسته رو ببینی. این درست نیست که من بگم و بهتره که افراد دیگر که بیطرف هستند با دیدن کد بسته نظر بدهند ولی این بسته کار خاصی انجام نمیده و این روش درست کردن کشیده کیفیت پایینی داره و اصولی نیست (این فقط یک وصلهکاری هست). بنابراین من استفاده از این بسته رو پیشنهاد نمیکنم. نکته دیگر اینه که این بسته رابط کاربری خیلی ضعیفی داره. این بسته، بسته زیپرشین رو فراخوانی میکنه اما شما نمیتونید گزینههای بسته زیپرشین رو از طریق این بسته استفاده کنید.
ویرایش
تغییراتی که این بسته در کد زیپرشین میده بصورت زیر هست.
\ProvidesFile{kashida-xepersian.def}[2018/01/04 v0.6 implementation of Kashida for xepersian package]
\chardef\xepersian@zwj="200D % zero-width joiner
\chardef\xepersian@lrm="200E
\chardef\xepersian@kashidachar="0640 % kashida
\chardef\xepersian@D=10 % dual-joiner class
\chardef\xepersian@L=11 % lam
\chardef\xepersian@R=12 % right-joiner
\chardef\xepersian@A=13 % alef
%\chardef\xepersian@H=14 % heh
\chardef\xepersian@Y=14 % yeh
\chardef\xepersian@V=4096 % vowel or other combining mark (to be ignored)
\newif\if@Kashida@on
\newif\if@Kashida@XB@fix
\newskip\xepersian@hrule@glue
\xepersian@hrule@glue=0pt plus .5em
\def\xepersian@kashida@Fix@XB{%
\if@Kashida@XB@fix
\xepersian@hrule@glue=.14em plus .5em
\fi
\xepersian@kashida
\if@Kashida@XB@fix
\xepersian@hrule@glue=0pt plus .5em
\fi
}
\def\xepersian@kashida{\if@Kashida@on
\xepersian@lrm\xepersian@zwj\nobreak
\leaders\hrule height \XeTeXglyphbounds\tw@ \the\XeTeXcharglyph\xepersian@kashidachar depth \XeTeXglyphbounds\f@ur \the\XeTeXcharglyph\xepersian@kashidachar \hskip\xepersian@hrule@glue
\xepersian@zwj\fi}
\def\setclass#1#2{\def\theclass{#1}\def\charlist{#2}%
\expandafter\dosetclass\charlist,\end}
\def\dosetclass#1,#2\end{%
\def\test{#1}\def\charlist{#2}%
\ifx\test\empty\let\next\finishsetclass
\else \XeTeXcharclass "\test = \theclass
\let\next\dosetclass \fi
\expandafter\next\charlist,,\end}
\def\finishsetclass#1,,\end{}
\setclass \xepersian@A {0622,0623,0625,0627}
\setclass \xepersian@R {0624,0629,062F,0630,0631,0632,0648,0698}
\setclass \xepersian@D {0626,0628,062A,062B,062C,062D,062E}
\setclass \xepersian@D {0633,0634,0635,0636,0637,0638,0639,063A}
\setclass \xepersian@D {0640,0641,0642,0643,0645,0646,0647,0649,064A}
\setclass \xepersian@Y {0649,064A,06CC}
\setclass \xepersian@D {067E,0686,06A9,06AF}%,06CC}
\setclass \xepersian@L {0644}
\setclass \xepersian@V {064B,064C,064D,064E,064F,0650,0651,0652}
\XeTeXinterchartoks \xepersian@D \xepersian@D = {\xepersian@kashida}
\XeTeXinterchartoks \xepersian@Y \xepersian@Y =
{\xepersian@kashida@Fix@XB}
\XeTeXinterchartoks \xepersian@D \xepersian@Y =
{\xepersian@kashida@Fix@XB}
\XeTeXinterchartoks \xepersian@Y \xepersian@D =
{\xepersian@kashida}
%\XeTeXinterchartoks \xepersian@H \xepersian@D = {\if@Kashida@XB@fix\else\xepersian@kashida\fi}
%\XeTeXinterchartoks \xepersian@D \xepersian@H = {\xepersian@kashida}
\XeTeXinterchartoks \xepersian@L \xepersian@D = {\xepersian@kashida}
\XeTeXinterchartoks \xepersian@D \xepersian@L = {\xepersian@kashida}
%\XeTeXinterchartoks \xepersian@L \xepersian@H = {\xepersian@kashida}
%\XeTeXinterchartoks \xepersian@H \xepersian@L = {\if@Kashida@XB@fix\else\xepersian@kashida\fi}
\XeTeXinterchartoks \xepersian@L \xepersian@L = {\xepersian@kashida}
\XeTeXinterchartoks \xepersian@D \xepersian@R = {\xepersian@kashida}
%\XeTeXinterchartoks \xepersian@H \xepersian@R = {\if@Kashida@XB@fix\else\xepersian@kashida\fi}
\XeTeXinterchartoks \xepersian@D \xepersian@A = {\xepersian@kashida}
%\XeTeXinterchartoks \xepersian@H \xepersian@A = {\if@Kashida@XB@fix\else\xepersian@kashida\fi}
\XeTeXinterchartoks \xepersian@L \xepersian@R = {\xepersian@kashida}
\XeTeXinterchartoks \xepersian@L \xepersian@A = {}
\newcommand{\KashidaOn}{\@Kashida@ontrue}
\newcommand{\KashidaOff}{\@Kashida@onfalse}
\newcommand{\KashidaXBFixOn}{\@Kashida@XB@fixtrue}
\newcommand{\KashidaXBFixOff}{\@Kashida@XB@fixfalse}
\KashidaOn
\endinput
بنابراین اگر این فایل جدید kashida-xepersian.def
رو در کنار فایل تک ورودیت قرار بدی باید دقیقا نتیجه یکسانی که با این بسته میگیری با بسته زیپرشین بگیری جایی که فایل کمینه فایل زیر هست.
\documentclass{article}
\usepackage[Kashida,KashidaXBFix=on]{xepersian}
\settextfont[Scale=4.5]{XB Kayhan}
\begin{document}
راهی جایی تابی چاپی چاههی تلاشهایی شتابهایی تابی چاپی راهی تلاشهــایی که کتابهایی که کلاههایی که
\end{document}