为 RTL 模式创建适配的 \color 宏(xelatex)

为 RTL 模式创建适配的 \color 宏(xelatex)

这是对这些问题的补充:

我的目标是创建一个\color可以在 RTL 模式(从右到左)下使用的宏,并且可以在任何情况下为文本着色并绘制内容而不会出现问题:

这是我的尝试(使用 fontspecColor键为文本着色,并\color使用普通颜色规则和绘图,但这需要修补每个绘图内容,如\rule,,tikzpicture......)

\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{Amiri}

\usepackage[rldocument]{bidi}

\makeatletter
% patch \rule commmand
\let\old@rule\@rule
\def\@rule[#1]#2#3{\ifrtlcolor\textcolor{rtlcolor}{\old@rule[#1]{#2} 
 {#3}}\else\old@rule[#1]{#2}{#3}\fi}
\makeatother

\def\rtlcolor#1{%
\rtlcolortrue
\colorlet{rtlcolor}{#1}
\addfontfeature{Color=#1}
 }

\begin{document}

Right to left text {\rtlcolor{red} RED TEXT \rule{5pt}{5pt} right to left text  
right to left text right to left text right to left text right to left text } out of group 

\end{document}

在此处输入图片描述

答案1

插图:

luacolor包装,颜色正常:

luacolor 示例

特定字母范围的代码来自:如何在不失去连接的情况下为阿拉伯字符串中的特定字符着色?

平均能量损失

\documentclass{article}
\usepackage{xcolor}% for (some) names
\usepackage{luacolor}

\newcounter{pft}

%\tracinglostchars=2
\usepackage{polyglossia}

\setotherlanguage{arabic}
\setotherlanguage{english}
 
\setmainfont{Amiri}
\newfontfamily\arabicfont[Script=Arabic,Scale=1.1,Renderer=HarfBuzz]{Noto Naskh Arabic}%{Amiri}





\begin{document}

\makeatletter
\def\pft#1-#2;{\edef\lower@pft{\the\numexpr#1-1}\edef\upper@pft{\the\numexpr#2+1}}%
\def\ColorRgChar#1#2{\pft#1;%
\setcounter{pft}{0}%
\@tfor\next:=#2\do{\stepcounter{pft}%
\ifnum\value{pft}>\lower@pft
 \ifnum\value{pft}<\upper@pft
  \textcolor{red}{\next}%
 \else
  \next
 \fi
\else
 \next
\fi
}}%
\makeatother

\Huge

\selectlanguage{arabic}
 \ColorRgChar{11-13}{المجموعة الشمسية}  

\par\selectlanguage{english} blue
\color{blue}\selectlanguage{arabic}\par
المجموعة الشمسية
\par\selectlanguage{english} brown\color{brown}\selectlanguage{arabic}\par
المجموعة الشمسية
\par\selectlanguage{english} violet\color{violet}\selectlanguage{arabic}\par
المجموعة 
\par\selectlanguage{english} green\color{green}\selectlanguage{arabic}\par
الشمسية


\end{document}

相关内容