突出显示变音符号并制作可选的边界框

突出显示变音符号并制作可选的边界框
  • 对于单词内选定的特定变音符号,如何应用以下所有或其中一个文本格式选项:

    • 突出显示
    • 染色
    • 下划线
    • 改为粗体
    • 更改为斜体
    • 框架:在变音符号周围制作一个框架,这种框架可以是:
      • 虚线
      • 虚线
      • 虚线
      • 实线
      • 控制框架的颜色

此外,如何考虑将上述选项应用到具有不同设置的每一个选定的变音符号上,如何将这些设置分别应用于每一个选定的变音符号上?

下面的代码行可以作为起点,我无法修改它们以与变音符号类似的方式使用。

着色变音符号

信函格式

信函格式


\documentclass{article}
\usepackage[bidi=basic]{babel}
\babelprovide[import,main]{arabic}
\babelfont{rm}{Amiri}
\usepackage{luacolor,lua-ul}
\usepackage{xstring} 
\usepackage{xparse} 
\usepackage{tikz}
\usepackage[normalem]{ulem}
\useunder{\uline}{\ulined}{} 

\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}

\Huge

\highLight[red]{ج}\underLine{نو}\highLight[yellow]{ب} \quad
\textcolor{red}{ج}\underLine{نو}\textcolor{blue}{ب} \quad
\underLine{\textcolor{red}{ج}نو}\highLight[green]{\textcolor{red}{ب}} \quad
% Coloring diacritical marks
ج%
\textcolor{blue}{َ}% fatha
نوب%
\textcolor{red}{ٌ}% tanween

\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}


代码输出

答案1

根据评论修改后的答案。

\color手动使用命令

可以使用 lualatex 使用常规颜色命令为变音符号和字母着色。

颜色

混合输入 RTL/LTR 太令人困惑(至少对我来说),因此我根据unisugar包中的技术改为制作非 LTR 命令。

平均能量损失

\documentclass{article}
\usepackage{xcolor}
\usepackage[bidi=basic]{babel}
\babelprovide[import,main]{arabic}
\babelfont{rm}[Scale=2]{Amiri}
\usepackage{luacolor,lua-ul}

%inspired via unisugar:
\catcode`¶=11
\edef\¶{¶}
\catcode`¶=0 


\newcommand{¶اللون}[1]{\color{#1}}% allawn colour
\newcommand{¶أسود}{black}% 'aswad black
\newcommand{¶أحمر}{red}% 'ahmar red
\newcommand{¶أخضر}{green!95!blue!40}% (lawn) 'akhdar green
\newcommand{¶أزرق}{blue}% 'azraq blue


\begin{document}
\Huge

ب¶اللون{¶أحمر}َ¶اللون{¶أخضر}ب¶اللون{¶أزرق}ب

\end{document}

使用正则表达式

利用 expl3 的正则表达式功能,可以将一系列字形指定为一个组,例如变音符号。

正则表达式

大写和小写拉丁字母作为一个整体看起来像([a-zA-Z])。阿拉伯语中的变音符号,直接输入看起来像([ؐ-ًؚ-ٟ]),这有点难以阅读(取决于您的编辑器/浏览器如何显示字体)并且需要按顺序输入。

在 lualatex 中,设置颜色不会干扰字体的字形流,因此连字等会自然形成。直接设置框和 tikz 节点影响字体,因此在文本排版后使用覆盖方法可能是一种可行的解决方案;或者,luacode(有点像使用 fontspec 定义不同的脚本) 可用于检查每个字形并创建属性列表(但可能不是五分钟的任务)。

平均能量损失

\documentclass{article}
\usepackage{xcolor}
\usepackage[bidi=basic]{babel}
\babelprovide[import,main]{arabic}
\babelfont{rm}[Scale=2]{Amiri}
\usepackage{luacolor,lua-ul}



%inspired via unisugar:
\catcode`¶=11
\edef\¶{¶}
\catcode`¶=0 


\newcommand{¶اللون}[1]{\color{#1}}% allawn colour
\newcommand{¶أسود}{black}% 'aswad black
\newcommand{¶أحمر}{red}% 'ahmar red
\newcommand{¶أخضر}{green!95!blue!40}% (lawn) 'akhdar green
\newcommand{¶أزرق}{blue}% 'azraq blue

%================


\ExplSyntaxOn
%-----
\NewDocumentCommand \marktext { +m } { \l_texthighlight:n { #1 } }
\cs_new_protected:Npn \l_texthighlight:n #1
 {
     \tl_set:Nn \l_tmpa_tl { #1 }
     \regex_replace_all:nnN 
          { ([ؐ-ًؚ-ٟ]) }
          { \c{textcolor}\cB\{ red \cE\}\cB\{\1\cE\} }    
          \l_tmpa_tl
  \tl_use:N \l_tmpa_tl
 }
 
 

\ExplSyntaxOff

\begin{document}
\Huge

ب¶اللون{¶أحمر}َ¶اللون{¶أخضر}ب¶اللون{¶أزرق}ب

{\normalsize using regex }

\fbox{\marktext{بَبَب}}
\color{black}

\fbox{\marktext{بًتٌثٍبَتُثِفّقْكٓشٔصٕضٖطٗ}}
\end{document}

(Expl3 代码借用并改编自本网站的另一个页面。)

至于方框,经过一番探索,我们发现方框可能没什么用:变音符号位于方框之外,或者没有方框,或者成为与基本字母组合的方框的一部分。表达同一事物的方式多种多样。因此,绕过字体(例如图片叠加)的解决方案可能是可行的方法。

盒子

平均能量损失

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Amiri}[Scale=5]

\newcommand{\mfb}[1]{\makebox[2cm]{\fbox{#1}}}

\begin{document}

\setlength{\fboxsep}{-\fboxrule}

\mfb{e}\mfb{^^^^0628}

\mfb{^^^^0302}\mfb{^^^^064e}

\mfb{e^^^^0302}\mfb{^^^^064e^^^^0628}

\end{document}

\symbol可以使用命令(或等效命令,如符号)单独访问低级字形组件^^^^,并且可以突出显示和加下划线普通字符的(可见)边界框,但变音标记的边界框似乎为零宽度(这是有道理的,因为标记设计为与另一个字符一起使用,而不是单独使用)。

盒子和元素

平均能量损失

\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\usepackage{luacolor,lua-ul}

\newfontface\myfont{Amiri-Regular.ttf}[Script=Arabic,Scale=5]
\begin{document}
\myfont
\symbol{983073}\symbol{983076}\symbol{983074} = \symbol{983073} + \symbol{983076} + \symbol{983074}

x\color{red}\highLight[yellow]{\symbol{983283}}\normalcolor x

x\color{red}\fbox{\symbol{983283}}\normalcolor x


x\highLight[blue!20]{\underLine{\symbol{983052}}}\underLine{\color{red}\symbol{983283}}\normalcolor x

x\highLight[blue!20]{\underLine{\symbol{983052}}}\fbox{\color{red}\symbol{983283}}\normalcolor x


\end{document}

使用重叠颜色框突出显示变音符号

看起来 mark 类的字形有锚点,而不是边界框。它们使用锚点将自身定位在基本字符上。

这表明可以使用重叠框的方法来操作,其中“下方”(最靠近背景)的框开始完全着色,而“上方”(最靠近读者)的框则为页面着色,并且没有变音符号,因此留下一个“间隙”让后面的框显示出来(有点像剪辑)。不过,这需要非常仔细的编码(和思考)。

重叠

平均能量损失

\documentclass{article}
\usepackage{xcolor}
\usepackage{luacolor,lua-ul}
\usepackage[bidi=basic]{babel}
\babelprovide[import,main]{arabic}
\babelfont{rm}[Scale=5]{Amiri}

\setlength{\fboxsep}{-\fboxrule}

\newcommand\cola{green!24}
\newcommand\colb{brown!30}
\newcommand\colc{red}
\newcommand\cold{white}

\newcommand{\hldm}[2]{%
\colorbox{\cola}{#1}\llap{\colorbox{\cold}{#2}}
}

\begin{document}

\bigskip{\tiny (a)} \begin{tabular}{|c|c|c|}
\hline
\tiny 3 & \tiny 2 & \tiny 1 \\
\hline
\mbox{\colorbox{\cola}{\symbol{1576}\color{\colc}\symbol{1611}}\llap{\colorbox{\cold}{\symbol{1576}}}}
&
\mbox{\colorbox{\cola}{\symbol{1576}\color{\colc}\symbol{1611}}\llap{\colorbox{\colb}{\symbol{1576}}}}
&
\mbox{\colorbox{\cola}{\symbol{1576}\color{\colc}\symbol{1611}}\colorbox{\colb}{\symbol{1576}}}
\\
\hline
\end{tabular}


\normalcolor %x

\bigskip{\tiny (b)} \hldm{\symbol{1576}\color{\colc}\symbol{1611}}{\colorbox{\cold}{\symbol{1576}}}

\bigskip{\tiny (c)} \hldm{\symbol{1576}\symbol{1614}\symbol{1576}\symbol{1615}\symbol{1576}\symbol{1616}}{\symbol{1576}\symbol{1576}\symbol{1576}}

\bigskip{\tiny (d)} {\colorbox{\cola}{\symbol{1576}\symbol{1614}^^^^200d}^^^^200d\symbol{1576}\symbol{1615}\symbol{1576}\symbol{1616}}\llap{\colorbox{\cold}{\symbol{1576}^^^^200d}^^^^200d\symbol{1576}\symbol{1615}\symbol{1576}\symbol{1616}} 

\end{document}

原始答案

假设问题是关于突出显示点,则\clip可以使用该函数,但是,由于点是字形的一部分,因此必须针对每种情况手动定位剪辑矩形。这就像将字形的一部分变成A不同的颜色一样。

方法是:绘制文本,定位剪切区域,以不同的颜色再次绘制文本,因此只绘制剪切区域内的文本。

夹子

平均能量损失

\documentclass{article}
\usepackage[bidi=basic]{babel}
\babelprovide[import,main]{arabic}
\babelfont{rm}{Amiri}
\usepackage{luacolor,lua-ul}
\usepackage{tikz}
\newcommand{\Atwo}[3][A]{%
  \begin{tikzpicture}
    %place the underlying word
    \node[inner sep=0pt,outer sep=0pt,text=#2] (a) {#1};
    %define the clip rectangle
    \clip  (a.south east) [xshift=-1ex] rectangle (a.north);
    % place the clipped word above
    \node[inner sep=0pt,outer sep=0pt,text=#3]  {#1};
  \end{tikzpicture}
}

\newcommand{\Athree}[3][A]{%
  \begin{tikzpicture}
    %place the underlying word
    \node[inner sep=0pt,outer sep=0pt,text=#2] (a) {#1};
    %define the clip rectangle
    \clip  (a.south east) [xshift=-1ex] rectangle (a.north west);
    % place the clipped word above
    \node[inner sep=0pt,outer sep=0pt,text=#3]  {#1};
  \end{tikzpicture}
}

\newcommand{\Afour}[3][A]{%
  \begin{tikzpicture}
    %place the underlying word
    \node[inner sep=0pt,outer sep=0pt,text=#2] (a) {#1};
    %define the clip rectangle
    \clip[draw]  (a.south east) [xshift=-0.5ex] rectangle ++(-7pt,6pt);
    % place the clipped word above
    \node[inner sep=0pt,outer sep=0pt,text=#3]  {#1};
  \end{tikzpicture}
}

\begin{document}

\Huge
ببب
\Atwo[ببب]{blue}{red}

\Atwo{blue}{red}

\Athree[ببب]{blue}{red}

\Athree{blue}{red}

\Afour[ببب]{blue}{red}

\end{document}

另一种方法是,字体设计师制作两个具有完全相同字形和度量标准的字体文件,一个文件没有点(有间隙),另一个文件有点(但没有笔画,只有点),并且一种字体打印在另一种字体的上方。

相关内容