从 Lua 访问当前字体设置

从 Lua 访问当前字体设置

我想使用 将一些当前设置写入文件io.savedata。如何获取有关当前字体的信息,或者更好的是,获取\rm\ss和 的当前设置\tt

编辑:fontconfig 必须能够处理字体名称。我想将字体从 ConTeXt 传递到 GNU LilyPond。请参阅http://wiki.contextgarden.net/LilyPond

答案1

如何获取有关当前字体的信息

字体对象包含从字体文件读取的更多信息。您可以在metadata表中访问它,例如:

\startluacode
  local font_info = function (id)
    local fnt = font.getfont(id)
    context.section { title = fnt.resources.filename }
    local metadata = fnt.shared and fnt.shared.rawdata and fnt.shared.rawdata.metadata
    if not metadata then return end
    local out = function (k)
      local v = metadata [k]
      context (k) context ": "
      context (v) context.endgraf()
    end
    local items = table.keys (metadata)
    context "id: " context (id) context.endgraf()
    for i=1, \letterhash items do out (items [i]) end
  end
  userdata.current_font_info = function () font_info (font.current()) end
\stopluacode

\def \showfontinfo {\ctxlua {userdata.current_font_info ()}}

\setupbodyfont [10pt]
\setuphead [section] [style=\tf]
\starttext
  \showfontinfo \endgraf
  \tt \showfontinfo \endgraf
  \definedfont[file:iwona-regular.otf at 10pt] \showfontinfo \endgraf
  \definedfont[file:antykwatorunska-bold.otf at 10pt] \showfontinfo \endgraf
\stoptext

字体信息转储

fontconfig 必须能够处理字体名称

您可以创建字体配置模式 来自上述表格。可以从表中访问与字体定义相关的信息(例如 sp 中的字体大小) specification

\startluacode

  local get_metadata = function (id)
    local fnt = font.getfont(id)
    if fnt then
      return fnt.shared and fnt.shared.rawdata and fnt.shared.rawdata.metadata
    end
  end

  local get_size = function (id)
    local fnt = font.getfont(id)
    if fnt then return fnt.specification.size end
  end

  local fc_pattern = function (id)
    local metadata = get_metadata (id)
    local size = get_size (id)
    if not metadata then return "nil" end
    local ret = string.format ([[\letterpercent s:\letterpercent s]],
                               metadata.familyname,
                               metadata.subfamily)
    if size then ret = ret .. ":size=" .. tostring(size / 2^16) end
    return ret
  end

  userdata.print_fc_pattern = function () print (fc_pattern (font.current())) end
  userdata.current_fc_pattern = function () return fc_pattern (font.current()) end

\stopluacode

\def \showfcpattern {%
  \fontname \font
  \rightarrow
  “\ctxlua {context (userdata.current_fc_pattern ())}”
  %ctxlua {userdata.print_fc_pattern ()}
  \endgraf
}

\setupbodyfont [10pt]

\starttext
  \showfcpattern \endgraf
  \tt \showfcpattern \endgraf
  \definedfont[file:iwona-regular.otf at 10pt] \showfcpattern \endgraf
  \definedfont[file:antykwatorunska-bold.otf at 10pt] \showfcpattern \endgraf
\stoptext

结合两个表中的信息来创建适合 Fontconfig 的模式。

示例 fc 模式

然后可以将上面代码片段中的字符串输入到fc-match(1) 类似程序中,也可能输入到 Lilypond 中:

$ fc-match "Iwona:Regular:size=10"
iwona-regular.otf: "Iwona" "Regular"
$ fc-match "Antykwa Torunska:Bold:size=10"
antykwatorunska-bold.otf: "Antykwa Torunska" "Bold"
$ fc-match "Latin Modern Roman:Regular:size=10"
lmroman10-regular.otf: "Latin Modern Roman" "10 Regular"

答案2

这是我能得到的最接近的结果。您必须使用 提取 TeX 级别的字体 ID,并将\fontid\font其传递给 Lua。然后您可以在那里提取字体名称和标识符。由于我不知道您到底想用它做什么,因此解析和其他操作都由您决定。tex.fontname和的返回值tex.fontidentifier是常规 Lua 字符串。

\def\getfontnames{%
  \startluacode
    function printothers(text)
      local catcodetableothers = -2
      tex.sprint(catcodetableothers, text)
    end

    context.startTABLE()
      context.NC() context("tex.fontname")
      context.NC() printothers(tex.fontname(\fontid\font))
      context.NC() context.NR()
      context.NC() context("tex.fontidentifier")
      context.NC() printothers(tex.fontidentifier(\fontid\font))
      context.NC() context.NR()
    context.stopTABLE()
  \stopluacode
}

\starttext
\rm\getfontnames

\it\getfontnames

\tt\getfontnames
\stoptext

在此处输入图片描述

相关内容