假设有人想在重音符号上使用颜色。例如,黑色和红色尖音符(例如语言文本中的重音符号)。如果我们加载颜色包,则此代码:
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}
使用 ^ 符号是为了方便,而不是直接输入,以使标记在代码中更加明显。