在不改变基本角色颜色的情况下对组合角色进行着色

在不改变基本角色颜色的情况下对组合角色进行着色

问题

我试图找出一种绘制组合字符而不改变它们所组合的基本字符颜色的好方法。我实际的问题案例是制作一些带有彩色前缀和后缀的希伯来语词形变化图表。问题在于能够为元音点、吟诵和其他变音符号着色而不改变基本辅音的颜色。为了澄清起见,以下图片来自维基百科,辅音为黑色,元音为红色,吟诵为蓝色。

上帝说:“让水聚集起来。”

为了说明我想要制作的内容,我快速地使用以下示例进行了 Photoshop 处理。

例子

寻找解决方案

到目前为止,在我搜索的过程中,我发现讨论2007 年,有人在 XeTeX 邮件列表中讨论了这个问题。当时还没有完美的解决方案。不过,有人提出了一种变通方法,即用两个重叠的单词使用不同的颜色。此外,有人指出,ArabTeX 的着色解决方案可以移植到希伯来语中。

不幸的是,这个解决方法非常费力,因为你必须把每个单词都写两遍,而且写错的几率也会翻倍。至于移植 ArabTeX 的想法,我对 TeX 还不太熟悉,所以我可以尝试一下。

因此我希望自 2007 年以来 XeTeX 能够解决这个问题,或者可以使用其他一些工具顺利解决这个问题。

另外,如果您碰巧知道这可以通过 Word、OpenOffice.org Writer 等文字处理器来实现,请告诉我,因为我不知道它们是否也可以处理这个问题。(我知道 Word 可以绘制所有变音符号,但我不知道它是否可以只绘制一些变音符号。)

答案1

在 PDFTeX/XeTeX 中,着色是通过在彩色项目周围插入 pdfliteral 节点来完成的,在这种情况下,这些节点会干扰标记定位,如下所示:

<base><start-color><mark><stop-color>

LuaTeX 可以使用一种替代机制,这要归功于它的“属性”寄存器;属性是一种注释输入而不干扰 pdfliterals 和类似内容的方法,可以用于许多事情,包括着色。但属性是一种低级机制,需要由更高级别的包使用。

在 ConTeXt 中,属性是开箱即用的,因此它可以正常工作:

\definefontfeature[hebrew][arabic][script=hebr]
\definefont[hebrew][name:sblhebrew*hebrew]

\starttext
\textdir TRT
\hebrew
\color[red]{א}\color[blue]{֣}\color[green]{֚}ב\color[blue]{ָ}\color[green]{ג}֦ד\color[green]{֘}
\stoptext

在此处输入图片描述

在 LuaLaTeX 中你需要luacolor使用属性机制,

\documentclass{minimal}
\usepackage{fontspec}
\usepackage{xcolor}
\usepackage{luacolor}

\newfontface\hebrew[Script=Hebrew]{SBL Hebrew}
\begin{document}
\textdir TRT
\hebrew
\textcolor{red}{א}\textcolor{blue}{֣}\textcolor{green}{֚}ב\textcolor{blue}{ָ}\textcolor{green}{ג}֦ד\textcolor{green}{֘}
\end{document}

PS 我这里没有 Arial,唯一带有这些标记的字体是 SBL Hebrew,所以我用它来进行测试。

答案2

为了完整起见,这里是使用 ConTeXt 的字体配色方案功能的答案(使用阿拉伯语,但应该适用于任何脚本):

首先编写一个字体“goodies”文件,其中包含应共享相同颜色的字形名称类别(字形名称依赖于字体,因此您必须检查正在使用的字体):

-- save as 'amiri.lfg'
return {
    name = "Amiri",
    version = "1.00",
    comment = "Goodies that complement the Amiri font.",
    author = "Khaled Hosny",
    colorschemes = {
        default = {
            [1] = { -- category 1
                "uni064E", "uni064B",
            },
            [2] = { -- category 2
                "uni064F", "uni064C",
            },
            [3] = { -- category 3, etc.
                "uni0650", "uni064D",
            },
        }
    }
}

更新:使用 ConTeXt 2012.03.02,现在可以使用 Unicode 字符数字代替字形名称,因此文件lfg将不再依赖于字体(使用字形名称仍然可以访问未编码的字形,根据定义,这是依赖于字体的)。

-- save as 'amiri.lfg'
return {
    name = "Amiri",
    version = "1.00",
    comment = "Goodies that complement the Amiri font.",
    author = "Khaled Hosny",
    colorschemes = {
        default = {
            [1] = { -- category 1
                0x064E, 0x064B,
            },
            [2] = { -- category 2
                0x064F, 0x064C,
            },
            [3] = { -- category 3, etc.
                0x0650, 0x064D,
            }, 
        }
    }
}

然后,您就可以在 ConTeXt 文档中使用它,使用通常的字体和颜色约定:

% overload ‘arabic‘ font feature set to load the goodies
\definefontfeature[arabic][arabic]
                  [goodies=amiri,       % name of the goodies file
                   colorscheme=default] % name of the scheme we defined

% define color scheme 1, categories 1, 2 and 3
\definecolor[colorscheme:1:1][r=1]
\definecolor[colorscheme:1:2][g=1]
\definecolor[colorscheme:1:3][b=1]

% color scheme 2
\definecolor[colorscheme:2:1][c=.55]
\definecolor[colorscheme:2:2][m=.55]
\definecolor[colorscheme:2:3][y=.55]

\setupalign[r2l]

\starttext
% load the font
\definedfont[name:amiri*arabic at 36pt]

\setfontcolorscheme[1]
ضَرَبَ ضُرِبَ ضَرْبًا

\setfontcolorscheme[2]
ضَرَبَ ضُرِبَ ضَرْبًا
\stoptext

结果

答案3

我将在这里总结一下 OP 问题中链接的邮件列表帖子中暗示的解决方案(问题中的链接已失效;有效链接在这里:XeTeX 邮件列表链接,2007 年 7 月,6989)。

如果您可以使用字体编辑器软件,则无需使用任何附加软件包即可在 XeLaTeX 中实现此操作。但是,这需要一些手动工作,如果您有多个案例,这可能太繁琐了。

诀窍是复制基本字母并使其不可见,然后使用负字距将不可见的基本字母 + 彩色标记与正常(黑色)基本字母叠加。

步骤如下(具体步骤取决于字体编辑器):

  1. 在字体编辑器中,加载字体并复制基本字母。确保复制的字体保留了精确的度量(宽度和边距),并且锚点保持在相同的位置,但删除笔画。在 PUA 中为复制的字体分配一个代码或将其定义为样式替代,以便布局引擎/文字处理器可以访问它。
  2. 仍在字体编辑器中,注意 x 高度和基本字符的宽度。
  3. 导出字体并将其安装到您的系统上。
  4. 在 XeLaTeX 文件中,输入类似以下内容:{\color{red} INVISIBLE BASE + MARK}\kern-1.42ex NORMAL BASE。您需要调整字距的值,该值可以根据基线宽度/x 高度计算得出。

我已成功使用此过程与字体编辑器 Glyphs 和 XeLaTeX 一起制作了带有黑色变音符号的彩色基础(因此与 OP 的问题相反)。

灰色基字母,带黑色变音符号

答案4

一个可能的解决方案是利用 babel 的希伯来语支持。回想一下,例如 cp1255 有以下声明:

\DeclareInputText{200}{\hebqamats}

使用\renewcommand,您可以重新定义\hebqamats以在插入实际字形之前包含着色命令。为了避免无限循环,您当然必须通过其 cp1255 字符代码 (200) 来引用字形。

相关内容