این کار تنها احتیاج به یک ایده خیلی ساده دارد که الگوریتم آن به شکل زیر است:
۱) در ابتدای متنی که میخواهی رنگی کنی دستور \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}
که خروجی زیر را تولید میکند که مشکلی ندارد:
شاید مشکل رنگ، مشکل حادی نباشد زیرا که در زیتک میتوان رنگ را به عنوان ویژگی قلم تعریف کرد (در مقابل استفاده از \special
برای رنگ کردن) اما این روش را خیلی راحت میتوان برای بستههایی چون hyperref
استفاده کرد تا لینک دار کردن متنی که در بیش از یک سطر قرار میگیرد مشکل نداشته باشد.
بدیهی است که تنها علت درج این پرسش و پاسخ آن است که افرادی که علاقهمند هستند با استفاده از این روش مشکلات بستههای color
و xcolor
و hyperref
را در متنهای راست به چپ حل کنند زیرا من اگر خود وقت داشتم، این کار را انجام میدادم اما متأسفانه از آنجایی که دیگر وقت این کارها را ندارم، این پرسش و پاسخ را ایجاد کردم تا افراد علاقهمند روی آن کار کنند.
تنها مشکل این روش این است که دیگر hyphenation
وجود نخواهد داشت اما این مشکلی نیست چرا که در متنهای راست به چپ اصلاً hyphenation
وجود ندارد.