使用 GID(字形 ID)访问字体规范上的字形

使用 GID(字形 ID)访问字体规范上的字形

我正在尝试访问一个字形,但它仅在字体的“基本拉丁语和拉丁语 1”集中提及。该字形没有名称或 unicode ID,但它有一个字形 ID 或 GID。fontspec没有提到使用此字形的可能性。Adobe 在 Adob​​e 功能文件语法中也没有提到: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:

http://i.imgur.com/ALUoPcg.png?1

\documentclass{article}
\usepackage{fontspec}
\setmainfont{StevensTitlPro-SableBrush.otf}
\begin{document}
\XeTeXglyph554\relax
\end{document}

在 中LuaTeX,似乎没有预定义的高级命令可以通过其 (OpenType) 字形编号访问字形。但是,可以创建一个基于 Lua 的函数来提供此访问方法。

访问相同字形的一些示例实现:

http://i.imgur.com/ALUoPcg.png?1

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

钍

相关内容