به دلیل قطعی اینترنت و نبود دسترسی به ایمیل‌های خارجی، می‌توانید بدون نیاز به تایید ایمیل، ثبت‌نام کنید و پرسش‌های خود را بپرسید.

اولین بار است که به اینجا می‌آیید؟ راهنمای سایت را بخوانید!
+3 رای
1.1k بازدید

در پاسخ به این پرسش گفتم که با استفاده از \special نمی‌توان در محیط راست به چپ متنهایی را که در بیش از یک سطر قرار می‌گیرند، رنگی کرد. علت این موضوع باگ زی‌تک یا بهتر بگوییم باگ الگوریتم TeX--XeT است که موتور زی‌تک از آن برای حروف‌چینی متن‌های راست به چپ استفاده می‌کند.

با وجود این باگ، پرسشی مطرح می‌شود که آیا می‌توان با وجود این محدودیت، باز هم متنهای راست به چپ را که در بیش از یک سطر قرار می‌گیرند، با استفاده از \special به درستی رنگ کرد?

مربوط به این پاسخ: مشکل بسته hyperref در زی پرشین

1 پاسخ

+8 رای
 
بهترین پاسخ

این کار تنها احتیاج به یک ایده خیلی ساده دارد که الگوریتم آن به شکل زیر است:

۱) در ابتدای متنی که می‌خواهی رنگی کنی دستور \special{color pop} را قرار بده. اگر متن رنگی فقط روی یک سطر قرار می‌گیرد مورد ۲ را انجام بده و در غیراینصورت (متن رنگی در بیش از یک سطر قرار می‌گیرد) موذد ۳ را انجام بده.

۲) در انتهای متن رنگی دستور \special{color push <code color>} را قرار بده.

۳) در انتهای هر سطر دستور \special{color push <code color>} و در ابتدای هر سطر دستور \special{color pop} را قرار بده. همچنین در انتهای متن رنگی دستور \special{color push <code color>} را قرار بده.

من به راحتی تواستم این الگوریتم را پیاده‌سازی کنم و نتیجه هم همانی هست که می‌خواهیم:

\documentclass{article}


\usepackage{xepersian}

\settextfont{Yas}

\makeatletter

\long\def\bidi@addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}

\bgroup \catcode`!=3 \catcode`?=3
\gdef\bidi@replacestrings#1#2{\long\def\bidi@replacestringsA##1#1##2!{%
   \ifx!##2!\bidi@addto\bidi@tmpb{##1}\else\bidi@addto\bidi@tmpb{##1#2}\bidi@replacestringsA##2!\fi}%
   \edef\bidi@tmpb{\expandafter}\expandafter\bidi@replacestringsA\bidi@tmpb?#1!%
   \long\def\bidi@replacestringsA##1?{\def\bidi@tmpb{##1}}\expandafter\bidi@replacestringsA\bidi@tmpb
}
\egroup



\newbox\bidi@color@start@box  \newbox\bidi@color@end@box
\setbox\bidi@color@start@box=\hbox{\special{color pop}}
\setbox\bidi@color@end@box=\hbox{\special{color push rgb 1 0 0}}%

\def\bidicolor#1{\def\bidi@tmpb{#1}\bidi@replacestrings{ }{\bidi@specialspace}%
   {\copy\bidi@color@start@box\bidi@tmpb\copy\bidi@color@end@box}%
}
\def\bidi@specialspace{%
   \discretionary{\copy\bidi@color@end@box}{\copy\bidi@color@start@box}{\kern\fontdimen2\font}%      
   \nobreak\hskip 0pt plus\fontdimen3\font minus\fontdimen4\font
}

\makeatother

\begin{document}
این یک متن معمولی است
\bidicolor{این متن با رنگ قرمز نوشته می‌شود که در یک سطر قرار می‌گیرد}
و این متن بعد آن است که به سطر بعد می‌رود و
\bidicolor{%
حالا یک متن رنگی می‌نویسیم که در چندین سطر قرار بگیرید تا کارایی رنگی کردن متن را ببینیم کنون ای خردمند وصف خرد          بدین جایگه گفتن اندرخورد
کنون تا چه داری بیار از خرد          که گوش نیوشنده زو برخورد
خرد بهتر از هر چه ایزد بداد          ستایش خرد را به از راه داد
خرد رهنمای و خرد دلگشای          خرد دست گیرد به هر دو سرای
ازو شادمانی وزویت غمیست          وزویت فزونی وزویت کمیست
خرد تیره و مرد روشن روان          نباشد همی شادمان یک زمان
چه گفت آن خردمند مرد خرد          که دانا ز گفتار از برخور
}
و ادامه متن که با رنگ سیاه نوشته می‌شود همانطوری که می‌بینید هیچ مشکلی ندارد و رنگ چکه نمی‌کند.
\end{document}

که خروجی زیر را تولید می‌کند که مشکلی ندارد:

enter image description here

شاید مشکل رنگ، مشکل حادی نباشد زیرا که در زی‌تک می‌توان رنگ را به عنوان ویژگی قلم تعریف کرد (در مقابل استفاده از \special برای رنگ کردن) اما این روش را خیلی راحت می‌توان برای بسته‌هایی چون hyperref استفاده کرد تا لینک دار کردن متنی که در بیش از یک سطر قرار می‌گیرد مشکل نداشته باشد.

بدیهی است که تنها علت درج این پرسش و پاسخ آن است که افرادی که علاقه‌مند هستند با استفاده از این روش مشکلات بسته‌های color و xcolor و hyperref را در متن‌های راست به چپ حل کنند زیرا من اگر خود وقت داشتم، این کار را انجام می‌دادم اما متأسفانه از آنجایی که دیگر وقت این کارها را ندارم، این پرسش و پاسخ را ایجاد کردم تا افراد علاقه‌مند روی آن کار کنند.

تنها مشکل این روش این است که دیگر hyphenation وجود نخواهد داشت اما این مشکلی نیست چرا که در متنهای راست به چپ اصلاً hyphenation وجود ندارد.

پرسیدن سوال
سایت پرسش و پاسخ پارسی‌لاتک جایی برای پرسش و پاسخ درباره سیستم حروف‌چینی لاتک و بسته زی‌پرشین است. در اینجا می‌توانید سوال‌های خود را بپرسید و به سوال‌های دیگران پاسخ دهید.

7.2k پرسش

6.6k پاسخ

23.7k نظر

11.7k کاربر

basket cart icon

محصولات مرتبط با LaTeX

در فروشگاه پارسی‌لاتک


basket cart icon

حمایت مالی از پارسی‌لاتک

برای تامین هزینه‌های نگه‌داری و به‌روزرسانی

محبوب‌ترین برچسب‌ها

رفع خطا جدول xepersian مراجع ریاضی‌نویسی bidi شکل فونت فهرست مطالب شماره‌گذاری منابع پانویس tikz parsilatex بیب‌تک تک‌لایو بیمر اسلاید زی‌پرشین پاورقی سربرگ bibtex نماد رسم شکل فرمول‌نویسی هدر ارجاع‌دهی biditexmaker ویرایشگر قالب beamer واژه‌نامه texstudio اندازه فونت عنوان فصل ماتریس شماره صفحه اعمال نشدن تغییرات در پی‌دی‌اف رسم جدول bidipresentation حاشیه رنگ عنوان شکل اسلاید فارسی محیط قضیه گراف حروف‌چینی کد مکان شکل شماره فصل enumerate tabriz_thesis tikzpicture نمایه align زیرنویس شکل کادر itemize الگوریتم فهرست اشکال listings عدم اجرا نیم‌فاصله فاصله بین خطوط متن لاتین و فارسی hyperref بسته قالب پایان‌نامه فرمول نصب تک‌لایو فارسی‌تک نمودار شماره فرمول glossaries کپشن حروف‌چینی چندستونی خروجی فونت فارسی و انگلیسی ماکرونویسی extrafootnotefeatures لاتک biditools شماره پاورقی پیوست‌ سوال امتحانی فاصله‌گذاری فرمول چندضابطه‌ای tex subfigure biditufte-book header texmaker pdf خطا longtable تصویر شمارنده زیرنویس texlive2015 دیاگرام میک‌تک رسم نمودار شماره‌گذاری صفحات پایان نامه فهرست جداول تورفتگی texlive2016 شعر بولد آکولاد kashida میکروسافت ورد تنظیم جدول سوال چهارگزینه‌ای قاب texworks caption اندیس فاصله عمودی lollipop چپ‌چینی iust-thesis multicol فصل‌نویسی tcolorbox اعداد فارسی pgfplots xindy اوبونتو geometry xelatex texlive کاما fancyhdr وسط‌چینی تک لایو 2015 شماره گذاری به‌روزرسانی بسته aimc46 شکست خط صفر توخالی فرمول طولانی قالب کتاب فونت اعداد بیرون‌زدگی bidipoem عنوان بخش پوستر فاصله سطرها نوشتافت tex-programming قرآن tabriz-thesis ایتالیک winedt جستجوی معکوس فلش جایابی تصویر فهرست تصاویر پاراگراف‌بندی بازیابی اطلاعات هایپرلینک فهرست نمادها شمارنده فصل حروف‌چینی شعر font محیط ریاضی minipage رسم کادر جداکننده جدول طولانی به‌روزرسانی شماره‌گذاری فرمول algorithm2e proof equation eps جدول افقی tabular عکس متن فارسی و انگلیسی پانویس چندستونی کمک مالی فاصله خطوط فونت بولد زیرشکل پانویس پاراگرافی ltrfootnote پیوست computeautoilg فرمول چندخطی persian-bib neveshtuft غلط‌گیری املایی فونت ریاضی پیکان لاتکس قلم baselineskip شماره قسمت عنوان جدول
...