soul:使用 \selectcolormodel 时 xcolor 突出显示出现问题

soul:使用 \selectcolormodel 时 xcolor 突出显示出现问题

我尝试使用该包突出显示文本。但是,如果我将其与 命令soul结合使用,我会遇到问题,只有空格会突出显示,如 MWE 中所示:xcolorselectcolormodel

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

\usepackage{soul}

\begin{document}

Please, highlight \hl{this small text}.

\end{document}

输出:灵魂输出

答案1

编辑

问题已解决。使用 soul 2023-02-18 v3.0 不再需要修复。

旧答案

问题的根源在于和都xcolor用作soul临时\dimen@寄存器。并soul在无法确保其他命令与此维度协调的地方使用它。您可以重新定义内部灵魂命令,或者您可以使用\convertcolorsUfalse以便xcolor在使用时不再重新计算颜色:

\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}

如果您不想从中复制定义soul.sty,可以使用以下方法来修补该命令:

\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

即使soul软件包更新,这仍然有效(因为修补不会成功)。

答案2

我的解决方案就是避免使用soul包装。soul包装非常脆弱,在许多情况下可能会出现问题。我会使用更强大的ulem包定义一个新\hl命令:

\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}

在此处输入图片描述

相关内容