更新 24/02/2020

更新 24/02/2020

关于“阿拉伯语”,这种语言的单词是字母连在一起的,不像英语,单词是每个字母分开写的。然而,当你试图通过使用以下任何选项来强调阿拉伯语文本中的任何字母时:

  • 下划线:字母消失,单词字母分开
  • 粗体:单词字母分开
  • 斜体:单词字母分开
  • 亮点:字母消失,单词字母分离
  • 框架/边框:不知道该怎么做(将单词中的一个字母放入框架/边框中,同时保持单词结构),但我确信如果我尝试将单词中的一个字母放入框架/边框中,也会出现同样的问题在此处输入图片描述

在这种情况下,文本字母会分离,不再连接。有没有办法通过使用各种选项来强调字母,同时保持单词结构,使字母保持连接,而不是断开连接??这是我使用 Lualatex 的 MWE,请注意我使用了如何用任意颜色突出显示文本以允许针对突出显示命令自定义颜色。

\documentclass[a4paper,12pt,twoside]{book}
\usepackage[a4paper,top=2.5cm,bottom=2.5cm,margin=2.5cm,bindingoffset=0.5cm]{geometry} 


\usepackage[bidi=basic,layout=lists.tabular]{babel}
\babelprovide[import=ar,mapdigits,main]{arabic}
\babelprovide[import=en,language=Default]{english}

\babelfont{rm}{Latin Modern Roman}
\babelfont[arabic]{rm}{amiri}
\babelfont[english]{rm}{Times New Roman}

\usepackage{xcolor}
\usepackage{color}

\usepackage{soul}

\definecolor{mygrey}{gray}{0.9}
\sethlcolor{mygrey}

\newcommand{\hlc}[2][yellow]{{%
            \colorlet{foo}{#1}%
            \sethlcolor{foo}\hl{#2}}%
            }

\usepackage[normalem]{ulem}

\begin{document}
\foreignlanguage{english}{This is the word under study}\\
جنوب
\\
\\
\foreignlanguage{english}{Bold}\\
جن
\textbf{و}
ب
\\
\\
\foreignlanguage{english}{underline}\\
جن
\ul{و}
ب
\\
\\
\foreignlanguage{english}{italic}\\
جن
\textit{و}
ب
\\
\\
\foreignlanguage{english}{highlight}\\
جن
\hlc[gray!25]{و}
ب
\\
\\
\end{document}

答案1

Robert 用 babel 回答,添加了\arbboxi\arbboxr和 ,\arbboxl分别\arbboxb表示字母的独立形式、开头形式、结尾形式和中间形式。方框是用 TikZ 绘制的,您可以boxstyle根据需要使用它们进行自定义\tikzset{boxstyle/.append style={...}}

\documentclass[a4paper,12pt,twoside]{book}

\usepackage [bidi=basic,layout=lists.tabular]{babel}
\babelprovide[import=ar,mapdigits,main]{arabic}

\babelfont{rm}{Amiri}

\usepackage{tikz}
\usepackage{ulem}
    
\newcommand{\ulinei}[1]{\uline{#1}}
\newcommand{\ulinel}[1]{^^^^200d\uline{^^^^200d#1}}
\newcommand{\uliner}[1]{\uline{#1^^^^200d}^^^^200d}
\newcommand{\ulineb}[1]{^^^^200d\uline{^^^^200d#1^^^^200d}^^^^200d}

\tikzset{boxstyle/.style={draw=red,inner sep=0pt,fill=yellow}}

\newcommand{\arbboxi}[1]{%
\tikz[baseline=(x.base)]\node(x)[boxstyle]{#1};%
}
\newcommand{\arbboxl}[1]{%
  ^^^^200d\tikz[baseline=(x.base)]\node(x)[boxstyle]{^^^^200d#1};%
}
\newcommand{\arbboxr}[1]{%
  \tikz[baseline=(x.base)]\node(x)[boxstyle]{#1^^^^200d};^^^^200d%
}
\newcommand{\arbboxb}[1]{%
  ^^^^200d\tikz[baseline=(x.base)]\node(x)[boxstyle]{^^^^200d#1^^^^200d};^^^^200d%
}
    
\begin{document}

\Large

جنوب 

\hrulefill

\uliner{ج}نوب
ج\ulineb{ن}وب
جن\ulinel{و}ب
جنو\ulinei{ب}

\hrulefill

\arbboxr{ج}نوب
ج\arbboxb{ن}وب
جن\arbboxl{و}ب
جنو\arbboxi{ب}

\tikzset{boxstyle/.append style={dashed,draw=blue,font=\bfseries,fill=green}}

\hrulefill

\arbboxr{ج}نوب
ج\arbboxb{ن}وب
جن\arbboxl{و}ب
جنو\arbboxi{ب}
    
\end{document}
 

在此处输入图片描述

更新 24/02/2020

我已经创建了一个命令\FormatChar(感谢@David Carlislehttps://tex.stackexchange.com/a/529439/54817)可以对阿拉伯语单词中的字符应用任意命令,该命令也可以与 一起使用xelatex

\documentclass[a4paper,12pt,twoside]{book}

\usepackage [bidi=basic,layout=lists.tabular]{babel}
\babelprovide[import=ar,mapdigits,main]{arabic}

\babelfont{rm}{Amiri}

\usepackage{tikz}
\usepackage{ulem}

\def\connecti{i}
\def\connectr{r}
\def\connectl{l}
\def\connectb{b}

\makeatletter
\def\FormatChar#1#2#3#4{%
\let\joineri\@firstofone%
\let\joinerii\@firstofone%
\def\formatcs{#1}%
\def\temp{#3}%
\if\temp\connectb%
\else
 \if\temp\connectr%
 \let\joinerii\@gobble%
 \else
   \if\temp\connectl%
   \let\joineri\@gobble%
   \else    
      \if\temp\connecti%
      \let\joineri\@gobble\let\joinerii\@gobble%
      \else
      \@latex@error
      {\temp is not available for contextual forms}
      \fi%
   \fi%
 \fi%   
\fi%
\xFormatChar{#2}#4}%
\def\xFormatChar#1#2{\ifnum#1=1\joineri{^^^^200d}%
\formatcs{\joineri{^^^^200d}#2\joinerii{^^^^200d}}%
\joinerii{^^^^200d}\expandafter\@gobbletwo%
    \else#2\fi\xFormatChar{\numexpr#1-1\relax}}
\makeatother
    
\tikzset{charboxstyle/.style={draw=red,inner sep=0pt,fill=yellow}}
    
\newcommand{\charbox}[1]{%
\tikz[baseline=(x.base)]\node(x)[charboxstyle]{#1};%
}

\begin{document}

%\FormatChar{#1}{#2}{#3}{#4} 
% #1: Command
% #2: Position of char (number)
% #3: Contextual forms r , l , b , i
% #4: Word
    
\Huge

\FormatChar{\uline}{1}{l}
{جنوب}
%
\FormatChar{\textcolor{blue}}{2}{b}
{جنوب}
%
\FormatChar{\textcolor{red}}{3}{r}
{جنوب}
%
\FormatChar{\charbox}{4}{i}
{جنوب}
%
\tikzset{charboxstyle/.append style={dashed,draw=blue,fill=green,text=orange}}
%
\FormatChar{\charbox}{1}{l}
{جنوب}

\end{document}

在此处输入图片描述

更新 2020/02/28

对于多个字母的宏\FormatChars可以使用宏(感谢@egreghttps://tex.stackexchange.com/a/529602/54817

\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\usepackage{ulem}
\usepackage [bidi=basic]{babel}
\babelprovide[import=ar,main]{arabic}

\babelfont{rm}{Amiri}
    
\tikzset{charboxstyle/.style={draw=red,inner sep=0pt,fill=yellow}}

\newcommand{\charbox}[1]{%
\tikz[baseline=(x.base)]\node(x)[charboxstyle]{#1};%
}

\ExplSyntaxOn

\NewDocumentCommand{\FormatChars}{m >{\SplitArgument{1}{-}}m O{i} m}
 {
  \cs_set_nopar:Npn \inputcs { #1 }
  \cs_set_nopar:Npn \joinb {^^^^200d}
  \cs_set_nopar:Npn \joine {^^^^200d}
  \str_case:nnF { #3 }
   {
    { i } { \let\joinb\relax\let\joine\relax }
    { r } { \let\joine\relax }
    { l } { \let\joinb\relax }
    { b } { }
   }
   {
  \msg_error:nn {}{#2~is~not~available~for~contextual~forms,~try~with~r,~l,~or~b} 
   } 
      % #2 is passed as two braced arguments
  \_FormatChars:nnn #2 { #4 }
 }

\cs_new_protected:Nn \_FormatChars:nnn
 {
  % let's analyze the first two args
  \tl_if_novalue:nTF { #2 }
   {% no hyphen in the argument
    \___FormatChars:nnn { #1 } { #1 } { #3 }
   }
   {
    \bool_lazy_or:nnTF { \tl_if_blank_p:n { #1 } } { \tl_if_blank_p:n { #2 } }
     {% argument is -n or m- or -
      \tl_if_blank:nTF { #1 }
       {
        \tl_if_blank:nTF { #2 }
         {% argument is -
          \joinb\inputcs{\joinb #3\joine}\joine
         }
         {% argument is -n
          \___FormatChars:nnn { 1 } { #2 } { #3 }
         }
       }
       {% argument is m-
        \___FormatChars:nnn { #1 } { -1 } { #3 }
       }
     }
     {% argument is m-n
      \___FormatChars:nnn { #1 } { #2 } { #3 }
     }
   }
 }

\cs_new_protected:Nn \___FormatChars:nnn
 {
  \int_compare:nTF { #1 > #2 > 0 }
   {
    #3
   }
   {
    \tl_range:nnn { #3 } { 1 } { #1 - 1 }
    \joinb\inputcs{\joinb \tl_range:nnn { #3 } { #1 } { #2 }\joine }\joine
    \tl_range:nnn { #3 } { #2 + 1 } { -1 }
   }
 }

\ExplSyntaxOff


\begin{document}

%\FormatChars{#1}{#2}[#3]{#4} 

% #1  : command to apply on range ex : \uline 
% #2  : range of letters ex : 2-6
% #3  : type of connection : i , r , l , b (default i)
% #4  : word    

\Huge

\FormatChars{\uline}{1-3}
{جنوب}
%
\FormatChars{\textcolor{blue}}{2-3}[r]
{جنوب}
%
\FormatChars{\textcolor{red}}{2-}[r]
{جنوب}
%
\FormatChars{\charbox}{4}
{جنوب}
%
\tikzset{charboxstyle/.append style={draw=blue,fill=black,text=white}}
%
\FormatChars{\charbox}{-2}[l]
{جنوب}

\end{document}

在此处输入图片描述

答案2

以下内容可以通过多种方式进行改进(例如,使用 tikz 可能有点过度,并且在 RTL 模式下也不能很好地工作;应该有一种方法来选择获得框架的字形并改变颜色;胶水和其他节点目前被忽略,因此它只适用于单个单词)但它表明基本上可以检查单词,获取尺寸并绘制不干扰字体形状的东西:

\documentclass[a4paper,12pt,twoside]{book}

\usepackage [bidi=basic,layout=lists.tabular]{babel}
\babelprovide[import=ar,mapdigits,main]{arabic}
\babelprovide[import=en,language=Default]{english}

\babelfont{rm}{Latin Modern Roman}
\babelfont[arabic]{rm}[Renderer=HarfBuzz]{amiri}
\babelfont[english]{rm}{Times New Roman}


\usepackage{tikz}

\newsavebox\myword

\usepackage{luacode}
\begin{luacode}
function frameword (boxnum)
   local head = tex.box[boxnum].head
   local colortable={"yellow","red","blue","green"}
   local GLYPH           = node.id("glyph")
   local widthtable={}
   local heighttable={}
   local depthtable={}
   for n in node.traverse(head) do
    local id = n.id
    if id == GLYPH then
      table.insert(widthtable,n.width);
      table.insert(heighttable,n.height);
      table.insert(depthtable,n.depth);
      texio.write_nl (" WIDTH ".. n.width .. " CHAR " .. n.char)
    else
      texio.write_nl ("????")
    end
   end
    for i = table.getn(widthtable), 1, -1 do
     color = colortable[math.fmod(i,4)+1]
     tex.sprint("\\printrectangle{"..color.."}{".. widthtable[i] .."}{" .. heighttable[i].."}{" .. depthtable[i] .."}")
    end
end
\end{luacode}
\begin{document}
جنوب 



\newcommand\printrectangle[4]{\tikz[overlay]\draw[#1,opacity=0.5](0,-#4sp)rectangle(#2sp,#3sp);\hspace{#2sp}}
\savebox\myword{\textdir TRT جنوب} 



\leavevmode\foreignlanguage{english}{\directlua{frameword(\the\myword)}\llap{\usebox\myword}}

\end{document}

在此处输入图片描述

答案3

编辑:我在下面添加了一种相当原始的绘制框架的方法。然后,在文档本身中,我在适当的位置添加了不可见的 ^^^^200d 标记。

这不是答案,只是建议。在我看来,从印刷术的角度来说,给字形上色是阿拉伯语的正确做法。也可以考虑加下划线。

\documentclass[12pt]{article}

\usepackage[novoc]{arabluatex}

\newcommand{\ulinel}[1]{^^^^200d\uline{^^^^200d#1}}
\newcommand{\uliner}[1]{\uline{#1^^^^200d}^^^^200d}
\newcommand{\ulineb}[1]{^^^^200d\uline{^^^^200d#1^^^^200d}^^^^200d}

\NewDocumentCommand{\arbbox}{O{white} O{white} m}{%
  \fboxsep=0pt%
  \fcolorbox{#1}{#2}{#3}%
}

\begin{document}

\begin{arab}
  ^ganUb
  ^gan\arbcolor[blue]{U}b
  ^gan\ulinel{U}b
  ^ga\ulineb{n}Ub
  ^gan‍\arbbox[red][yellow]{‍U}b
\end{arab}

\end{document}

在此处输入图片描述

答案4

使用 luacolor 你也可以为字形着色

\documentclass[a4paper,12pt,twoside]{book}
\usepackage[a4paper,top=2.5cm,bottom=2.5cm,margin=2.5cm,bindingoffset=0.5cm]{geometry}


\usepackage[bidi=basic,layout=lists.tabular]{babel}
\babelprovide[import=ar,mapdigits,main]{arabic}
\babelprovide[import=en,language=Default]{english}

\babelfont{rm}{Latin Modern Roman}
\babelfont[arabic]{rm}{amiri}
\babelfont[english]{rm}{Times New Roman}

\usepackage{xcolor}
\usepackage{luacolor}
\begin{document}
\foreignlanguage{english}{This is the word under study}\\
جنوب\\
\color{yellow}ج\color{red}ن\color{blue}و\color{green}ب 
\end{document}

在此处输入图片描述

相关内容