# soul: broken highlighting with xcolor when using \selectcolormodel

I try to highlight text using the soul package. But I experience problems if I use it in combinations with the xcolor command selectcolormodel, only spaces are highlighted as shown in the MWE:

\documentclass{standalone}
\usepackage{xcolor}
\selectcolormodel{rgb}

\usepackage{soul}

\begin{document}

\end{document}


Output:

• Thanks, I had this problem with just standard \usepackage{xcolor}. The top answer fixed it. – Joe Corneli May 30 '16 at 20:59

The source of the problem is that both xcolor and soul use \dimen@ as a temporary register. And soul uses it at a place where it can't be sure that other commands temper around with this dimen. You can redefine the internal soul command, or you can use \convertcolorsUfalse so that xcolor no longer recalculate color at usage:

\documentclass{article}
\usepackage{xcolor}
\selectcolormodel{rgb}
%\convertcolorsUfalse
\usepackage{soul}

\makeatletter
\newdimen\SOUL@dimen %new
\def\SOUL@ulunderline#1{{%
\setbox\z@\hbox{#1}%
%\dimen@=\wd\z@
\SOUL@dimen=\wd\z@ %new
\dimen@i=\SOUL@uloverlap
\rlap{%
\null
\kern-\dimen@i
}%
\unhcopy\z@
}}

\makeatother
\begin{document}

\end{document}


If you don't want to copy the definition from soul.sty, here's a way to patch the command:

\usepackage{soul}

\usepackage{etoolbox}
\makeatletter
\patchcmd{\SOUL@ulunderline}{\dimen@}{\SOUL@dimen}{}{}
\patchcmd{\SOUL@ulunderline}{\dimen@}{\SOUL@dimen}{}{}
\patchcmd{\SOUL@ulunderline}{\dimen@}{\SOUL@dimen}{}{}
\newdimen\SOUL@dimen
\makeatother


This will work even if the soul package is updated (because the patch won't succeed).

• Shouldn't \SOUL@dimen go also after \advance? – egreg Mar 18 '12 at 16:40
• Great solution! thx :) – ejoerns Mar 18 '12 at 16:47
• @egreg Yes I have corrected it (I had read \dimen@2 as a name instead of \dimen@ + 2\dimen@i.) – Ulrike Fischer Mar 18 '12 at 16:50
• @UlrikeFischer I've added a version with \patchcmd. – egreg Mar 18 '12 at 16:54
• This should probably go to Melchior Franz, the soul maintainer. – Daniel Mar 19 '12 at 19:13

My solution is just to avoid soul package. soul package is very fragile and may be problematic in many situations. I would use more robust ulem package to define a new \hl command:

\documentclass{article}
\usepackage{xcolor}
\usepackage[normalem]{ulem} % use normalem to protect \emph
\newcommand\hl{\bgroup\markoverwith
{\textcolor{yellow}{\rule[-.5ex]{2pt}{2.5ex}}}\ULon}

\begin{document}
This is a test \hl{for highlighting} text.
\end{document}


• Interesting alternative! But I was wondering why some of my highlighted texts were underlined too. Found the solution in the ulem code. With \normalem it looks as I expected. ;) – ejoerns Mar 19 '12 at 18:06
• This is really not a good solution. Please see tex.stackexchange.com/questions/254333 – user81070 Jul 8 '15 at 14:55