如何将 LuaLaTeX 函数应用于特定字体?

如何将 LuaLaTeX 函数应用于特定字体?

在我使用的斜体字体中,撇号在其边界框中显示得太靠右,因此撇号和字形之间的空间看起来比两个字形之间的空间要小。我改编了以下代码:LuaTeX 中的字距调整以增加此空间。但是,代码适用于文档中使用的所有字体,但我希望它仅适用于斜体字体。有办法做到这一点吗?

电流输出:

用罗马字体和斜体字体排版的同一个句子,撇号后有额外的空格

期望输出:

用罗马字体和斜体字体排版的同一个句子,只有斜体版本在撇号后有额外的空格

(为了演示目的,空间被夸大了)

梅威瑟:

\documentclass{article}
\usepackage{fontspec}
\directlua{
  function kernspace(head)
    for space in node.traverse_id(node.id('glue'), head) do
      if space.subtype == 13 then
        local prev = node.prev(space)
        local next = node.next(space)
        if prev.id == 29 and next.id == 29 then
          if prev.char == 8217 then
            space.width = space.width + 1000000
          end
        end
      end
    end
    return true
  end
  luatexbase.add_to_callback("pre_linebreak_filter", kernspace, "kernspace");
}
\setmainfont{times.ttf}[
  ItalicFont = timesi.ttf
]
\begin{document}
`It's time to rock 'n' roll,' he said. \par
\textit{`It's time to rock 'n' roll,' he said.}
\end{document}

答案1

我尝试了 Ulrike Fischer 的建议来解决字距问题(常规字体和斜体字体中的 » + W)。该方法将展示如何添加字体功能,但可能无法解决问题具体的关于间距的问题。此外,我对 luatex 和字体功能的了解相当有限。

  1. 添加字体功能。就我而言,这只是一个字距调整问题。这将添加ktest为字体功能,并在 CHAR2 和 CHAR1 同时出现时将其向 CHAR2 移动 100 个单位。

    \directlua
    {fonts.handlers.otf.addfeature 
     {
      name = "ktest",
      type = "kern",
      data = {["CHAR1"] = {["CHAR2"] = -100}
     }
    }
    }
    
  2. 然后添加另一个字体功能,ktestit它的功能相同,但单位数少 50 个。我们仅将其用于斜体字体。

    \directlua
     {fonts.handlers.otf.addfeature 
      {
      name = "ktestit",
      type = "kern",
      data = {["CHAR1"] = {["CHAR2"] = -50}
      }
     }
     }
    
  3. RawFeature将添加为全局字体功能。中的ktest可选参数将指定将由您的斜体字体功能替换。 但是,我只用 .otf 字体测试过。 也许您可以切换。ItalicFeatures\setmainfontktestktestit

    \setmainfont{YOURFONT}
    [Extension=.otf,
    ItalicFont=ITALICFONT,
    RawFeature=+ktest,
    ItalicFeatures={RawFeature={-ktest;+ktestit}}
    ]
    

相关内容