Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Is it possible to tell (La)TeX to adjust the kerning of a specific character combination? For example, suppose I want !! to be typeset as !\kern 1.2pt!, just like ff is automatically turned into a ligature, or -- is converted to an en-dash. I know I could create a command for this combination—I am asking for a way to just type !! and have it use my desired kerning.

share|improve this question
4  
ff or the en-dash (or em-dash, fi, fl, ffi) aren't multiple characters whose kerning/s were adjusted. They have their own separate places in the font tables. –  Kit Feb 7 '11 at 5:16
    
@Kit So LaTeX can map multiple characters to special slots in the font table, but not to macros? That’s … weird. –  Konrad Rudolph Feb 7 '11 at 8:08
1  
@Konrad: it's not weird when you consider the processing stages; macro expansion and execution is performed until a stream of text is left (there's probably a more formal definition here I'm forgetting), only after which ligatures are applied and then hyphenation/justification occurs. Separate the idea between "fi" in the input as characters in a text file and "fi" in the output as a glyph from a font. –  Will Robertson Feb 7 '11 at 8:39
    
@Will Thanks for the explanation. I really need to read TeX book one of these days. –  Konrad Rudolph Feb 7 '11 at 8:51
    
@Konrad: Keep in mind that ligatures are only partly a TeX thing; they're mainly a font thing. For the "old style" TeX fonts, they are defined in the tfm (TeX font metric) files. There you find, e.g., (LABEL C f) (LIG C i O 14), meaning that fi is mapped to the ligature in slot 14 (octal number). –  Hendrik Vogt Feb 7 '11 at 13:54
show 1 more comment

2 Answers

up vote 21 down vote accepted

Adjusting font kerning

If you need to adjust the kerning within a font, the short answers are:

  1. No, not from within TeX.

  2. Yes, if you're willing to create a virtual font.

  3. Yes, if you're able to edit the font with fontforge (OpenType fonts only, for use in XeTeX or LuaTeX).

  4. Yes, if you're using LuaTeX and OpenType fonts; see §11 of the fontspec manual: ‘OpenType font feature files’.

I've only experience in options 1 and 4.

XeTeX's interchartoks

XeTeX offers a feature known as ‘interchartoks’ that allows tokens to be inserted automatically between characters of different ‘class’. This feature was added to facilitate, say, automatic font and language switching between two different scripts (e.g., Japanese to Arabic).

This feature can be used to add kerning between characters, as shown in Philipp's answer. (As well as between !!, you might also choose to adjust spacing around : for French typography, say.) As an example, if this feature is used then when XeTeX comes across !! in the input, it will interpret it as !\exclamkern! instead. Any kerning that happens there will independent of the current font, which is generally not going to be appropriate for changing the kerning between letters. But for very specific use cases this technique is suitable for minor adjustments.

share|improve this answer
    
I think this should also be possible in XeTeX using char classes. –  Philipp Feb 7 '11 at 12:27
    
@Philipp Possible, but not practical. Interchartoks are inserted regardless of the font, so you'd need to check for the current font for each kerning adjustment—it'd be a bit of a hack. And it'd then complicate edge cases with more practical interchartoks uses. But for very specific applications, yes, it'd work. –  Will Robertson Feb 7 '11 at 12:38
    
The OP didn't ask for font-specific adjustments, so I think interchar tokens would indeed be an option here. –  Philipp Feb 7 '11 at 12:43
    
@Philipp sorry, I misread the question regarding !!, so yeah, this would indeed work. (but for text kerning I'm still less than enthusiastic.) –  Will Robertson Feb 7 '11 at 13:47
    
Could you modify your answer to include the interchartoks solution? –  Mark Lodato Feb 12 '11 at 15:17
add comment

With LuaTeX, you can patch fonts on the fly in arbitrary ways:

\documentclass{minimal}

\usepackage{fontspec}
\usepackage{luacode}

\begin{luacode*}
local function add_exclam_kern(fontdata)
  if fontdata then
    local chars = fontdata.characters
    if chars then
      local ch = chars[33]
      if ch then
        if not ch.kerns then
          ch.kerns = { }
        end
        ch.kerns[33] = -100000
      end
    end
  end
end
luatexbase.add_to_callback("luaotfload.patch_font",
  add_exclam_kern, "add_exclam_kern")
\end{luacode*}

\setmainfont{Arial}

\begin{document}
!!
\end{document}

With XeTeX, you can use inter-character tokens:

\documentclass{minimal}

\usepackage{fontspec}

\setmainfont{Arial}

\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\ExclamClass
\XeTeXcharclass 33=\ExclamClass
\XeTeXinterchartoks\ExclamClass\ExclamClass={\kern-1.5pt }

\begin{document}
!!
\end{document}
share|improve this answer
    
Could one also just modify the kerning table in LuaTeX in a way similar as in (LABEL C P) (KRN C A R -0.083334)? –  Hendrik Vogt Feb 7 '11 at 14:01
    
@Hendrik: What does that statement do? –  Philipp Feb 7 '11 at 14:53
    
It's from cmr10.pl, and it says that between the Character P and the Character A a kern of -0.083334 times the design size (R=10pt) should be included. –  Hendrik Vogt Feb 7 '11 at 14:58
1  
@Philipp: Erm, yes, but the Lua code is quite long, and it's really code. In a pl file it's a lot simpler in my opinion; it's a kerning table indeed: You can, e.g., also do (LABEL C P) (KRN C A R -0.083334) (KRN C j R -0.05) to additionally get kerning in Pj. –  Hendrik Vogt Feb 7 '11 at 15:33
1  
@Hendrik: A table constructor is something like chars = { [33] = { kerns = { [33] = -100000 } } } –  Philipp Mar 3 '11 at 13:10
show 4 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.