颜色中断变音符号堆叠

颜色中断变音符号堆叠

假设有人想在重音符号上使用颜色。例如,黑色和红色尖音符(例如语言文本中的重音符号)。如果我们加载颜色包,则此代码:

a\color{red}́

无法与 xelatex 和 NewComputerModern 等支持堆叠的字体配合使用。它可以与 lmmodern 配合使用,因为那里没有堆叠机制,并且锐角符号是负空间中的独立字形。

我对堆叠变音符号很感兴趣。例如,可能需要堆叠多个变音符号。

color 包的开发人员告诉我,解决方案是使用 luacolor 包和 lualatex。这部分有效:

如果未加载 Harfbuzz,则一个口音有效。但如果必须使用 Renderer=Harfbuzz 加载它,因为可能需要堆叠多个字符(然后 lua 需要 Harfbuzz 才能正常工作),那么我们就会遇到以下情况

(a) 如果要用堆叠组合的字形在字体中不存在,则一切正常。例如,此代码:

a\color{red}̐

作品。

(b)但如果字形作为字体中的预组合字形存在,则失败。因此这

a\color{red}́

失败,因为字体提供了 aacute 作为预组合字形。

另一方面

a\color{red}̐\color{green}́

因为没有预组合的 a̐

问题是是否有办法解决这个问题。例如,是否有办法指示渲染器不要使用预组合的字形?

不幸的是,预组合字形无法从 NewCM 中删除(这也可以解决问题),因为有些文档直接输入 aacute。

答案1

感谢 Antonis 找到 CGJ。所有荣誉和分数都归于他。任何解释和使用方面的错误都是我自己的。

这是正确答案的脚注,是关于使用 luaotfload 的实验性功能为特定字体中出现的所有字形着色,包括通过使用 CGJ 为复合字形的组成字形着色。

使用 lua 代码 colorscheme 定义例如:

\directlua {
luaotfload.add_colorscheme("colaccxx", 
    {
        ["FF8000C0"] = {52},
        ["FF00FF"] = {131},
        ["FF0000"] = {"acutecomb"},
        ["00FF00"] = {36},
        ["00FFFF"] = {2881},
        ["0000FFF0"] = {193,"B","́"},
    })
}

分配给特定的字体声明:

\newfontface\faccent{Noto Serif-Regular}[
Colour=colaccxx,
]

结果如下:

例子

配色方案名称(仍处于试验阶段)为 8 个字符,其中至少包含 1 个非十六进制字符。左侧是 RRGGBBTT 颜色设置(红色、绿色、蓝色、透明度;每个从 00 到 FF)。右侧是字体特定的名称列表和/或字形 ID 索引(例如,["name"]="uni0304",["index"]=2886,,取自 Lua 的.lua字体缓存文件。

这里用的是Noto Serif Regular字体,所以缓存文件为notoserif-regular.lua。缓存文件夹为...\texlive\2022\texmf-var\luatex-cache\generic\fonts\otl\

典型条目如下:

  [771]={
   ["boundingbox"]={ -496, 606, -140, 734 },
   ["class"]="mark",
   ["index"]=2885,
   ["name"]="tildecomb",
   ["unicode"]=771,
  },

名称和索引值是字体(版本)特定的。Unicode 代码点值为十进制。

使用示例:

用法

平均能量损失

\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\usepackage{tabularray}

\directlua {
luaotfload.add_colorscheme("colaccxx", 
    {
        ["FF8000C0"] = {52},
        ["FF00FF"] = {131},
        ["FF0000"] = {"acutecomb"},
        ["00FF00"] = {36},
        ["00FFFF"] = {2881},
        ["0000FFF0"] = {193,"B","́"},
    })
}


%       ["FF00FF"] = {118,"^^^^0301",2879,131},

\newfontface\faccent{Noto Serif-Regular}[
Colour=colaccxx,
]
\ExplSyntaxOn
\NewDocumentCommand{\dov}{m}{{\ttfamily \c_circumflex_str\c_circumflex_str\c_circumflex_str\c_circumflex_str #1}}
\ExplSyntaxOff
\begin{document}

\faccent
precomposed: ÁáÂâ
AaQB

combined: A^^^^034f^^^^0301a^^^^034f^^^^0301 A^^^^0301A\symbol{770}A\symbol{847}\symbol{770}a^^^^034f\symbol{770}
AaQB
C^^^^0302

\verb|notoserif-regular.lua|

\verb|...\texlive\2022\texmf-var\luatex-cache\generic\fonts\otl\|

\begin{verbatim}
  [180]={
   ["boundingbox"]=34,
   ["index"]=118,
   ["name"]="acute",
   ["unicode"]=180,
   ["width"]=274,
  },
\end{verbatim}


\begin{tblr}{
colspec={lllcc},
row{1}={bg={blue!12}},
row{2}={bg={yellow!5!red!8}},
row{3}={bg={yellow!1!red!2}},
row{Z}={font=\ttfamily\small},
}
glyph 
& name 
& index 
& w/o CGJ 
& with CGJ 
\\\hline
65 {\\} 769     
& "A"{\\}"acutecomb" ( ^^^^0301)    
& 36 {\\} 2879 ( ^^^^0301)   
&  ^^^^0041^^^^0301 {\\}  \dov{0041}\dov{0301}
& ^^^^0041^^^^034f^^^^0301 {\\}  \dov{0041}\dov{034f}\dov{0301}
\\
65 {\\} 770     
& "A"{\\} "uni0302" ( ^^^^0302)    
& 36 {\\} 2881 ( ^^^^0302)    
&  ^^^^0041^^^^0302 {\\}  \dov{0041}\dov{0302}
& ^^^^0041^^^^034f^^^^0302 {\\}  \dov{0041}\dov{034f}\dov{0302}
\\\hline
decimal
& text
& decimal
& hex
& hex
\\ 
\end{tblr}

\begin{verbatim}
\directlua {
luaotfload.add_colorscheme("colaccxx", 
    {
        ["FF8000C0"] = {52},
        ["FF00FF"] = {131},
        ["FF0000"] = {"acutecomb",2881},
        ["00FF00"] = {36},
        ["00FFFF"] = {"^^^^0302"},
        ["0000FFF0"] = {193,"B","́"},
    })
}
\end{verbatim}


\begin{verbatim}
\newfontface\faccent{Noto Serif-Regular}[
Colour=colaccxx,
]
\end{verbatim}


\begin{tblr}{
colspec={lX[l]},
row{1}={bg={blue!12}},
column{Z}={font=\ttfamily\small},
}
glyphs 
& code input 
\\
áááâââ
& áááâââ
\\
á^^^^034fááâââ
& á\dov{034f}ááâââ
\\
a^^^^034f^^^^0301ááâââ
& a\dov{034f}\dov{0301}ááâââ
\\
a^^^^034f^^^^0301a^^^^0301a^^^^0301a^^^^0302ââ
& a\dov{034f}\dov{0301}a\dov{0301}a\dov{0301}a\dov{0302}ââ
\\
\end{tblr}


\end{document}

使用 ^ 符号是为了方便,而不是直接输入,以使标记在代码中更加明显。

答案2

看来我上面描述的解决方法也适用于其他字体。例如,我使用 NotoSerif-Regular 进行了检查。我在此答案下方发布了一个示例,作为来自即将发布的 NewCM 文档的屏幕截图。我更喜欢屏幕截图的原因是能够更清楚地看到变音符号。

在此处输入图片描述

相关内容