18

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}

Please, highlight \hl{this small text}.

\end{document}

Output: soul output

ejoerns
  • 1,811

2 Answers2

21

Edit

The problem has been resolved. With soul 2023-02-18 v3.0 the fix is no longer needed.

Old answer

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 \advance\SOUL@dimen2\dimen@i %\dimen@ exchanged too \rlap{% \null \kern-\dimen@i %\SOUL@ulcolor{\SOUL@ulleaders\hskip\dimen@}% \SOUL@ulcolor{\SOUL@ulleaders\hskip\SOUL@dimen}% new }% \unhcopy\z@ }}

\makeatother \begin{document}

please, highlight \hl{this small text}.

\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).

Ulrike Fischer
  • 327,261
14

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}

enter image description here

Leo Liu
  • 77,365
  • 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
  • 1
    This is really not a good solution. Please see http://tex.stackexchange.com/questions/254333 – user81070 Jul 08 '15 at 14:55