# Kerning with xcolor

My question, in variants, I saw, asked many times here, but I can't solve problem.
If we use \textcolor{FirstLetter}SecondAndOtherLettersOfWord, we lost font kerning between first and second letters.
With \showoutput in log we have \special{color push rgb 1 0 0} and \special{color pop} instructions.
How we need combine \bgroup, \egroup, etc. (from previously answers) in this case (usual text, and often colorized only first letter in word)?

XeLateX. Can't use luacolor and LuaLatex.

MWE:

\documentclass{article}
\usepackage{polyglossia}
\usepackage{xcolor}
\begin{document}
\textcolor{red}{V}AR

VAR
\end{document}

• You can't. The \special nodes interrupt kerning. Only LuaTeX can apply per-glyph colouring, which doesn't disrupt kerning (see the luacolor package) Oct 17 '20 at 16:03
• xelatex inserts specials and so destroys kerning. This is a hard fact. So either accept the missing kerning or switch to lualatex. Oct 17 '20 at 16:04
• Or write kenrnig table by hand, using \@ifnextchar... Oct 17 '20 at 16:07

Measure the kerning between the word parts. I've added support also for something before the coloring.

\documentclass{article}
\usepackage{xcolor}

\newcommand{\kerncolor}[4]{%
% #1 = color, #2 = before, #3 = colored part, #4 = after
\sbox0{#2#3}\sbox2{\mbox{#2}\mbox{#3}}%
\dimen0=\dimexpr\wd0-\wd2\relax
\sbox0{#3#4}\sbox2{\mbox{#3}\mbox{#4}}%
\dimen2=\dimexpr\wd0-\wd2\relax
#2\kern\dimen0 \textcolor{#1}{#3}\kern\dimen2 #4%
}

\begin{document}

\kerncolor{red}{}{V}{AR}

VAR

\sbox0{\kerncolor{red}{}{V}{AR}}\the\wd0

\sbox0{VAR}\the\wd0

\itshape

\kerncolor{red}{}{V}{AR}

VAR

\sbox0{\kerncolor{red}{}{V}{AR}}\the\wd0

\sbox0{VAR}\the\wd0

\end{document}


• Nice! And it impossible #3 and #4 to unite in one - tokenize first letter? Oct 17 '20 at 16:42
• @Elisey The main problem are accented letters. Oct 17 '20 at 16:46
• Yes, but there is packet churchslavonic (I use it) and it have macros \cu@tokenizeletter - it considers all accents for first letter (for church slavonic language). I'll try combine your answer and this tokenizer. Thank you! Oct 17 '20 at 17:51