![使用 GID(字形 ID)访问字体规范上的字形](https://linux22.com/image/301349/%E4%BD%BF%E7%94%A8%20GID%EF%BC%88%E5%AD%97%E5%BD%A2%20ID%EF%BC%89%E8%AE%BF%E9%97%AE%E5%AD%97%E4%BD%93%E8%A7%84%E8%8C%83%E4%B8%8A%E7%9A%84%E5%AD%97%E5%BD%A2.png)
我正在尝试访问一个字形,但它仅在字体的“基本拉丁语和拉丁语 1”集中提及。该字形没有名称或 unicode ID,但它有一个字形 ID 或 GID。fontspec
没有提到使用此字形的可能性。Adobe 在 Adobe 功能文件语法中也没有提到:http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html#2.f
我仍然希望能够通过其 ID 来访问字形,因为这是我访问它的唯一方法(我认为)。
我的具体情况需要访问 Stevens Titling Pro Sable Brush 中的字形 ID 554。我只会在绝对必要时发布此字体,因为我不喜欢将这些字体分发给全世界。
我发布了一个包含另一种(免费)字体的 MWE。这不是我打算使用的字体,但也许是尝试手动访问字形的起点。
\documentclass{article}
\usepackage{fontspec}
\setmainfont{EB Garamond}
\parindent=0pt
\begin{document}
Some text int EB Garamond. How can I access glyph 123 now?
\end{document}
答案1
访问特定字形的方法fontspec
取决于所使用的引擎。
有了XeTeX
,就可以实现\XeTeXglyph554\relax
(感谢 egreg)。
下面显示了一个示例文档,其中使用了 Stevens Titling Pro 中 ID 为 554 的不可访问字形 Sable Brush:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{StevensTitlPro-SableBrush.otf}
\begin{document}
\XeTeXglyph554\relax
\end{document}
在 中LuaTeX
,似乎没有预定义的高级命令可以通过其 (OpenType) 字形编号访问字形。但是,可以创建一个基于 Lua 的函数来提供此访问方法。
访问相同字形的一些示例实现:
\documentclass{article}
\usepackage{fontspec}
\usepackage{luacode} % provides 'luacode' environment
\setmainfont{StevensTitlPro-SableBrush.otf}
\begin{luacode}
function LuaTeXglyph(charNo)
local fontNo=font.current()
local f=font.getfont(fontNo)
local i
local v
local found=false
for i,v in pairs(f.characters) do
if v.index == charNo
then
tex.print( '\\char '..i..' ' )
found=true
break
end
end
if not found
then
tex.error( 'font has no glyph '..charNo )
end
end
\end{luacode}
\newcommand*{\LuaTeXglyph}[1]{%
\directlua{LuaTeXglyph(#1)}
}
\begin{document}
\LuaTeXglyph{554}
\end{document}
答案2
这只是上述luatex
循环遍历字体表的解决方案的替代方法。相反,我们也可以使用原始字体(使用fontloader
)中的信息,其中字形在顶层仍可访问,并通过luaotfload
的函数将内部字形名称转换为字符代码slot_of_name
:
\documentclass{article}
\usepackage{fontspec,luacode}
\setmainfont{EB Garamond 12}
\begin{luacode}
function luatexglyph(glyph)
local f = fonts.hashes.identifiers[font.current()]
local ff = fontloader.open(f.filename)
local g = ff.glyphs[glyph]
local n = luaotfload.aux.slot_of_name(font.current(),g.name)
if n then
tex.sprint('\\char' ..n.. ' ');
else
tex.error('font has no glyph '.. glyph)
end
fontloader.close(ff)
end
\end{luacode}
\def\LuaTeXglyph#1{\directlua{luatexglyph "#1"}}
\begin{document}
\LuaTeXglyph{1875}
\LuaTeXglyph{1895}
\LuaTeXglyph{1897}
\end{document}