Tisha Shusho:
I am trying to modify the current version of xepersian package to suit my needs. The following code copied from xepersian-mathsdigitspec.sty is supposed to check if some characters do exist in the font to be loaded. My question is about the function \__xepersian_mathsdigitspec_char_not_exist_error. Is there any way to replace those repeating lines of code in the argument of the function with a (while, until, ...) LOOP which iterates over a list of characters [06F0, ..., 066B]?
کد: انتخاب همه
\cs_new:Npn \__xepersian_mathsdigitspec_error:nxx { \msg_error:nnxx {xepersian-mathsdigitspec} }
\cs_new:Nn \__xepersian_mathsdigitspec_msg_new:nnnn
{ \msg_new:nnxx {#1} {#2} { \tl_trim_spaces:n {#3} } { \tl_trim_spaces:n {#4} } }
\char_set_catcode_space:n {32}
\__xepersian_mathsdigitspec_msg_new:nnnn {xepersian-mathsdigitspec} {char-not-exist}
{
The font "#1" does not contain U+#2.
}
{
Select another font and rerun xelatex.
}
\char_set_catcode_ignore:n {32}
\prg_new_conditional:Nnn \__xepersian_mathsdigitspec_primitive_font_char_if_exist:n {p,TF,T,F}
{
\etex_iffontchar:D \l_fontspec_font `#1 \scan_stop:
\prg_return_true:
\else:
\prg_return_false:
\fi:
}
\cs_new:Nn \__xepersian_mathsdigitspec_char_not_exist_error:n
{
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۰ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F0 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۱ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F1 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۲ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F2 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۳ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F3 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۴ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F4 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۵ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F5 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۶ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F6 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۷ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F7 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۸ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F8 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۹ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F9 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ٫ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 066B } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ٪ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 066A } }
}
Steven B. Segletes:
If you just need to see if certain glyphs exist, why not just use fonttable, as in \documentclass{article} \usepackage{fullpage} \usepackage{fonttable} \begin{document} \fonttable{cmti10} \fonttable{cmsy10} \end{document}
– Steven B. Segletes
Steven B. Segletes:
Welcome to the site, as well. By the way, it is appropriate in your question to include a fully compiling example rather than just a code snippet or macro definition.
– Steven B. Segletes
Tisha Shusho:
Thanks, Steven, the check for the existence of the characters must be done within the program. BTW, I tried too much to prepare a complete, small, and working example, but I couldn't, because I am a newbie.
– Tisha Shusho
کد: انتخاب همه
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۰ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F0 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۱ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F1 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۲ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F2 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۳ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F3 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۴ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F4 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۵ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F5 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۶ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F6 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۷ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F7 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۸ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F8 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۹ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F9 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ٫ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 066B } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ٪ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 066A } }
کد: انتخاب همه
\__xepersian_mathsdigitspec_char_set_not_exist_error:nn {
06F0 , 06F1 , 06F2 , 06F3 , 06F4 , 06F5 , 06F6 , 06F7 , 06F8 ,
06F9 , 066A , 066B
} { #1 }
کد: انتخاب همه
\clist_new:N \l_xepersian_mathsdigitspec_char_clist
\cs_new:Nn \__xepersian_mathsdigitspec_char_set_not_exist_error:nn
{
\clist_set:Nn \l_xepersian_mathsdigitspec_char_clist { #1 }
\clist_map_inline:Nn \l_xepersian_mathsdigitspec_char_clist {
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF { ##1 }{ \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #2 } { ##1 } }
}
}
\cs_new:Nn \__xepersian_mathsdigitspec_char_prepend_not_exist_error:nn
{
\clist_put_left:Nn \l_xepersian_mathsdigitspec_char_clist { #1 }
\clist_map_inline:Nn \l_xepersian_mathsdigitspec_char_clist {
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF { ##1 }{ \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #2 } { ##1 } }
}
}
\cs_new:Nn \__xepersian_mathsdigitspec_char_append_not_exist_error:nn
{
\clist_put_right:Nn \l_xepersian_mathsdigitspec_char_clist { #1 }
\clist_map_inline:Nn \l_xepersian_mathsdigitspec_char_clist {
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF { ##1 }{ \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #2 } { ##1 } }
}
}
کد: انتخاب همه
\prg_new_conditional:Nnn \__xepersian_mathsdigitspec_primitive_font_char_if_exist:n {p,TF,T,F}
{
\etex_iffontchar:D \l_fontspec_font `#1 \scan_stop:
\prg_return_true:
\else:
\prg_return_false:
\fi:
}
\cs_new:Nn \__xepersian_mathsdigitspec_char_not_exist_error:n
{
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۰ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F0 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۱ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F1 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۲ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F2 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۳ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F3 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۴ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F4 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۵ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F5 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۶ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F6 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۷ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F7 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۸ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F8 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ۹ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 06F9 } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ٫ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 066B } }
\__xepersian_mathsdigitspec_primitive_font_char_if_exist:nF ٪ { \__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #1 } { 066A } }
}
کد: انتخاب همه
\seq_new:N \l_my_xepersian_digits_seq
\seq_set_split:Nnn \l_my_xepersian_digits_seq { , } { 06F0 , 06F1 , 06F2 , 06F3 , 06F4 , 06F5 , 06F6 , 06F7 , 06F8 , 06F9 , 066A , 066B }
کد: انتخاب همه
\seq_map_inline:Nn \l_my_xepersian_digits_seq
{
\etex_iffontchar:D \l_fontspec_font "##1 \scan_stop:
\else:
\__xepersian_mathsdigitspec_error:nxx {char-not-exist} { #2 } { ##1 }
\fi:
}
Nima:
To reject all of the fonts that contain a particular string in their name is the most irresponsible design decision I have ever seen (for whatever reason the xepersian team decided to do that)
– nima Jan 27 at 8:02
David Carlisle:
@nima I'm only the messenger.. (but yes, I wouldn't disagree) – David Carlisle Jan 27 at 8:11
Nima:
@DavidCarlisle Yes of courseYou don't expect developers in charge of software with such a large user base to make these kinds of unprofessional decisions. It took me two days to find your solution because I didn't even think the problem would be something like this. – nima Jan 27 at 12:32
David Carlisle:
@nima note there isn't a team: it's a one man development – David Carlisle Jan 27 at 12:50
نتیجه میگیرند که:وفا خلیقی:
این بسته همون کد بسته زیپرشین برای کشیده رو برداشته و دقیقا همون کد تک رو به زبان برنامهنویسی لاتک ۳ ترجمه کرده. تنها کار اضافهای که این بسته انجام میده این هست که ... برای قامهای مختلف چسبهای مختلف تعریف کرده و این اجازه رو به کاربر میده که مقدار چسب رو خودش مشخص کنه (در صورت استفاده از قلمهای دیگر یا در صورت نیاز). این تنها تفاوتش با کد اصلی در بسته زیپرشین هست.
به لحاظ تئوری بحث در مورد مطالب فوق در حال حاضر بیهوده و اتلاف وقت است زیرا عبارتهایی مثل «کار خاص»، «روش درست کردن اصولی»، «کیفیت پایین»، «وصلهکاری» و ... همگی عبارتهایی چندوجهی هستند و ایشان هم نه مصداق آنها را مشخص میکنند و نه تعریف مورد قبول خود از این عبارتها را ارائه میکنند.وفا خلیقی:
ولی این بسته کار خاصی انجام نمیده و این روش درست کردن کشیده کیفیت پایینی داره و اصولی نیست (این فقط یک وصلهکاری هست). بنابراین من استفاده از این بسته رو پیشنهاد نمیکنم. نکته دیگر اینه که این بسته رابط کاربری خیلی ضعیفی داره.
کد: انتخاب همه
\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}
قبلاً ادعا میشد که مشکل از فونتهاست، حالا ادعا میشود که مشکل از موتور حروفچین است. اما با نگاهی گذرا به کدهای بستههای xepersian و bidi (از آن زمان که نگهداری از آن به ایشان واگذار شده است) مشاهده میشود که بخشهای اصلی این بستهها از نرمافزارهای دیگر مربوط به زبان عربی، عبری، و غیره کپی و گردآوری شده است و تنها همین استفاده از نویسهٔ کشیده در XeTeX است که تا کنون دیگران برای استفاده از آن در زبانهایی مثل فارسی راه حلی ارائه نکردهاند و همین یک مورد هم تا کنون در xepersian لاینحل مانده است و هر از چندگاهی بسته به شرایط برای آن فقط بهانهتراشی میشود. حتی در کد فعلی در xepersian برای ویژگی کشیده از \hrule استفاده میشود. در این کد هم هیچگونه ایدهای که متعلق به مؤلف xepersian باشد وجود ندارد، بلکه ایشان در فوریهٔ سال 2009 در ایمیلی در سایت tug.org با عنوان:وفا خلیقی:
برای اینکه کشیده کیفیت بالایی داشته باشه باید موتور حروفچین ابزار لازم رو داشته باشه در مورد بسته زیپرشین موتور زیتک این ابزار رو در اختیار قرار نمیده و چیزی که در زیپرشین وجود داره تنها یک هک هست تا اینکه راهحل واقعی باشه. به عنوان نمونه موتور حروفچین تک پارسی رو ببین اونجا کشیدگی کیفیت بالایی داره چون این کار داره توی موتور حروفچین انجام میشه. در سطح ماکرو متاسفانه نمیشه همیشه معجزه کرد چون تنها میتونی با امکانات بدوی که موتور تک در اختیارت قرار میده کار کنی و اگر این کار در موتور تک امکانپذیر نباشه نمیتونی در سطح ماکرو درستش کنی.
بهبودی که من میتونم در بسته زیپرشین بهش فکر کنم این هست که یک الگوریتم طراحی کنم که مقدار چسب رو بصورت خودکار محاسبه کنه برای هر قلمی که مورد استفاده قرار میگیره اما این هم باز همانند گزینه computeautoilg ممکنه سرعت پردازش رو پایین بیاره شاید حتی خیلی پایینتر.
Jonathan Kew:
As a simple example, I'm attaching a file that can be loaded in a
Persian xetex job to provide some simple "stretching".... obviously
you can make adjustments to the characters involved and the glue
metrics used, to alter its behavior. This is really just a starting
point, but might be useful for some purposes.
کد: انتخاب همه
%% Configure xetex to do kashida justification in Persian text
\chardef\zwj="200D % zero-width joiner
\chardef\ksh="0640 % kashida
\chardef\D=10 % dual-joiner class
\chardef\L=11 % lam
\chardef\R=12 % right-joiner
\chardef\A=13 % alef
\chardef\V=256 % vowel or other combining mark (to be ignored)
\def\kashida{\zwj\nobreak \setbox0=\hbox{\ksh}%
\leaders\hrule height\ht0 \hskip0pt plus 0.5em \zwj}
\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 \A {0622,0623,0625,0627}
\setclass \R {0624,0629,062F,0630,0631,0632,0648,0698}
\setclass \D {0626,0628,062A,062B,062C,062D,062E}
\setclass \D {0633,0634,0635,0636,0637,0638,0639,063A}
\setclass \D {0640,0641,0642,0643,0645,0646,0647,0649,064A}
\setclass \D {067E,0686,06A9,06AF,06CC}
\setclass \L {0644}
\setclass \V {064B,064C,064D,064E,064F,0650,0651,0652}
\XeTeXinterchartoks \D \D = {\kashida}
\XeTeXinterchartoks \L \D = {\kashida}
\XeTeXinterchartoks \D \L = {\kashida}
\XeTeXinterchartoks \L \L = {\kashida}
\XeTeXinterchartoks \D \R = {\kashida}
\XeTeXinterchartoks \D \A = {\kashida}
\XeTeXinterchartoks \L \R = {\kashida}
\XeTeXinterchartoks \L \A = {}
\XeTeXinterchartokenstate=1
\endinput
البته قبلاً هم افرادی در این سن و سال ادعاهایی مشابه (مشابه به این معنی که هر چه بیشتر حیرتآور باشد بهتر است.) داشتهاند اما طرح آن در یک جمعی که اغلب دانشگاهی هستند آن هم تا این حد محیرالعقول موجب شد تا بالاخره پرسش زیر در قالب یک نظر در سایت مربوطه مطرح شود:وفا خلیقی:
پرسش: در این پرسش اشاره کردی که بعضی افراد کتاب تک کنوث رو یک شبه خوندند و بعضی افراد بعضی بخشها رو چندین بار خوندند، خودت جزو کدوم دسته بودی؟
پاسخ: با اینکه من دوست دارم بگم من این کتاب رو یک شبه خوندم اما این موضوع حقیقت نداره. من برای خوندن و فهمیدن این کتاب struggle داشتم و برام سخت بود. یک دور خوندن کتاب یک ماه کامل طول کشید و بعد از این یک بار باز هم همه جای کتاب رو درست متوجه نشدم. چندین بار این کتاب رو خوندم و چندین سال گذشت تا بتونم همه مطالب کتاب رو بصورت شفاف متوجه بشم. بنابراین اگر خوندن این کتا براتون سخته همیچوقت ناامید نشید و دست از خوندنش برندارید. فهم کامل کتاب نیاز به پافشاری و فکر کردن و همچنین کار کردن با تک داره. پیشنهاد میکنم برای مدتی که دارید این کتاب رو میخونید فقط از فرمت Plain TeX و موتور تک اصلی کنوث استفاده کنید. همچنین توجه داشته باشید که من برای نسختین بار این کتاب رو در ۱۲ سالگی خوندم و دسترسی به کامپیوتر نداشتم بنابراین این شاید مقداری توضیح بده چرا خوندن این کتاب برای یک نوجوان ۱۲ ساله سخت بوده.
و مؤلف xepersian در پاسخ میگویند:پرسشی در قالب نظر در سایت مربوطه:
چه چیزی سبب شد که شما در ۱۲ سالگی به این کتاب علاقهمند شوید؟ و یا به بیان دیگر دسترسی به این کتاب این قدر برای شما ساده بود؟ من تا آنجایی که خاطرم هست آن زمان که دانشجو بودم در کتابخانه دانشگاه شریف یک نسخه کپی از کتاب لامپورت پیدا کردم و از کتاب تک کنوث خبری نبود! (البته الان را نمیدانم وضع چگونه است بالاخره ۱۵ سال گذشته و همه دنیا تغییر کرده ...)
اما ایشان در نوامبر 2014 در این پیام مینویسند:وفا خلیقی:
یک معلم ریاضی در مدرسه داشتم که یک چینی سنگاپوری به نام Ray Tan بود. برای امتحان ریاضی ایشون سوالها رو با تک حروفچینی میکرد. برای من زیبایی حروفچینی ریاضی جالب بود و وقتی ازش سوال کردم این سوالها رو چجوری حروفچینی کردی گفت با تک و کتاب تک کنوث رو معرفی کرد و تونستم نخسهای که اون داشت رو دو هفتهای به امانت بگیرم اما بعد از دو هفته کتابش باید پس میدادم و وقتی ازش پرسیدم که آیا میتونم کتاب رو مدت بیشتری پیش خودم نگه دارم پاسخش منفی بود. بنابراین از پدرم خواستم کتاب رو برام سفارش بده و حدود یک ماهی طول کشید تا از آمریکا به استرالیا برسه.
Vafa Khalighi:
At the age of 24, I together with my family (my parents and sister) travelled to ... Australia. ... I am now 35 years of age.
یعنی حدوداً در سن 27 سالگی با TeX آشنا شدهاند که با همان داستانی که در لینک فوق تعریف کردهاند نیز تقریباً سازگار است.وفا خلیقی:
البته حدود بیشتر از ۱۰ سال هست که با تک آشنا هستم
با تشکروفا خلیقی:
«حدود دو سالی هست که بصورت آزمایشی دارم روی یک موتور حروفچین تک برای حروفچینی زبان پارسی کار میکنم»
کد: انتخاب همه
\documentclass{report}
\usepackage[Kashida,KashidaXBFix=on]{xepersian}
\settextfont[Scale=4.5]{HM XKayhan}
\setlatintextfont[Scale=1.5,Colour=0000FF]{HM XKayhan}
\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{
راهی جایی تابی چاپی چاههی تلاشهایی
شتابهایی تابی چاپی راهی تلاشهــایی
که کتابهایی که کلاههایی که کتابهایی }
\setlength\parindent{0pt}
\pagestyle{empty}
\begin{document}
\KashidaOff\lr{(With xepersian: Kashida Off, HM XKayhan Regular)}
\SampleText
\newpage
\KashidaOn\lr{(With xepersian: Kashida On, HM XKayhan Regular)}
\SampleText
\newpage
\KashidaOn\lr{(With xepersian: Kashida On, HM XKayhan Italic)}
{\HMXKayhanIt \SampleText}
\newpage
\KashidaOn\lr{(With xepersian: Kashida On, HM XKayhan Oblique)}
{\HMXKayhanOb \SampleText}
\newpage
\KashidaOn\lr{(With xepersian: Kashida On, HM XKayhan Outline)}
{\HMXKayhanOl \SampleText}
\newpage
\KashidaOn\lr{(With xepersian: Kashida On, HM XKayhan Shadow)}
{\HMXKayhanSd \SampleText}
\end{document}
کد: انتخاب همه
\PassOptionsToPackage{fontsloadable}{xepersian} % Load xepersian with any number of options
\PassOptionsToPackage{pdfinfo=off}{bidi} % Load bidi with any number of options
\documentclass{report}
\usepackage[Kashida=glyph,linebreakpenalty=8,kashidastretch=0.14 em plus 5.5 em]{xepersian-hm}
\settextfont[Scale=4.5]{HM XKayhan}
\setlatintextfont[Scale=1.5,Colour=0000FF]{HM XKayhan}
\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}
\KashidaOff\lr{(With xepersian-hm: Kashida Off, HM XKayhan Regular)}
\SampleText
\newpage
\KashidaOn\lr{(With xepersian-hm: Kashida On, HM XKayhan Regular)}
\SampleText
\newpage
\KashidaOn\lr{(With xepersian-hm: Kashida On, HM XKayhan Italic)}
{\HMXKayhanIt \SampleText}
\newpage
\KashidaOn\lr{(With xepersian-hm: Kashida On, HM XKayhan Oblique)}
{\HMXKayhanOb \SampleText}
\newpage
\KashidaOn\lr{(With xepersian-hm: Kashida On, HM XKayhan Outline)}
{\HMXKayhanOl \SampleText}
\newpage
\KashidaOn\lr{(With xepersian-hm: Kashida On, HM XKayhan Shadow)}
{\HMXKayhanSd \SampleText}
\end{document}
کاربران حاضر در این انجمن: کاربر جدیدی وجود ندارد. و 2 مهمان