6

In the italic font I am using, the apostrophe appears too far right in its bounding box, and therefore a space between an apostrophe and a glyph appears smaller than a space between two glyphs. I adapted code from Kerning against word space in LuaTeX in order to increase this space. However, the code applies to all fonts used in the document, but I want it to apply to only the italic font. Is there a way to do this?

Current output:

The same sentence typeset in roman and italic, with extra space after the apostrophes

Desired output:

The same sentence typeset in roman and italic, with only the italic version having extra space after the apostrophes

(the spaces have been exaggerated for purposes of demonstration)

MWE:

\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}
2
  • 2
    It would be imho more sensible to implement that as font feature which you then load with the font. Or try to patch the font: tex.stackexchange.com/a/420568/2388 Commented Jul 29, 2019 at 13:37
  • 5
    @UlrikeFischer I guess that's the crux of my question: how do I implement my code as a font feature, or patch the font using my code?
    – solisoc
    Commented Jul 29, 2019 at 13:50

1 Answer 1

1

I tried out Ulrike Fischer’s suggestion for a kerning problem (» + W in a regular and a italic font). The approach will show how to add a font-feature, but may not solve the specific problem regarding the spacing. Furthermore, my knowledge of luatex and font-features is rather restricted.

  1. Add the font feature. In my case, this was simply a kerning issue. This will add ktest as font-feature and will move CHAR2 100 units closer to CHAR1 when they appear together.

    \directlua
    {fonts.handlers.otf.addfeature 
     {
      name = "ktest",
      type = "kern",
      data = {["CHAR1"] = {["CHAR2"] = -100}
     }
    }
    }
    
  2. Then add another font-feature ktestit that does the same thing, but just 50 units less. We will use this for italic fonts only.

    \directlua
     {fonts.handlers.otf.addfeature 
      {
      name = "ktestit",
      type = "kern",
      data = {["CHAR1"] = {["CHAR2"] = -50}
      }
     }
     }
    
  3. RawFeature will add ktest as global font-feature. The optional parameter ItalicFeatures in \setmainfont will then specify that ktest will be substituted by your italic-only font-feature ktestit. However, I have only tested this with an .otf-font. Maybe it is possible for you to switch.

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .