使用 soul 和 xcolor 突出显示 \emph 会错误地呈现某些字母

使用 soul 和 xcolor 突出显示 \emph 会错误地呈现某些字母

最小工作示例:

\documentclass{article}
\usepackage{xcolor}
\usepackage{soul}

\begin{document}

    \hl{\emph{irreducible}}
    
    \hl{{\emph irreducible}}

    \emph{irreducible}
\end{document}

输出: 在第一个输出中,第一个“e”被渲染为 \varepsilon,而第二个“e”被正确渲染。如果没有使用 \hl,这不是问题。

你能告诉我为什么“e”被渲染成 \varepsilon 吗?

答案1

还有另一个具有突出显示功能的包:lua-ul。将其应用到您的 MWE 看起来会像这样:

\documentclass{article}
\usepackage{xcolor}
\usepackage{luacolor}
\usepackage{lua-ul}

\begin{document}

    \highLight{\emph{irreducible}}
    
    \highLight{{\emph irreducible}}

    \emph{irreducible}
\end{document}

对于某些人来说,缺点是它需要 luaTeX(或 luaLaTeX)进行编译和打包luacolor进行着色(必须在之后加载xcolor,或者当然代替它)。

lua-ul也有兼容选项soul(作为直接替换),但我从未测试过。就我个人而言,我会重新定义或搜索并替换所有soul宏并使用lua-ul

顺便说一句,还有其他方法,比如用来tikz突出显示,但我认为这是非常先进的过程;并且它至少需要 3 次编译。

您可以在此站点中找到该代码,但您必须(可能)使其适应新的 LaTeX3 内核中更改的挂钩接口,也许还需要一些 pdf 原语(\savepos)。

答案2

在某些情况下,您可以通过中断正常的字距调整来克服:

\hl{\emph{irre\mbox{}ducible}}

通过\mbox{}在单词中间添加 来做到这一点。但是,即使这样,对于以斜体结尾的倒数第二个单词,这种方法也行不通f

\althl作为一种真正能帮你摆脱困境的变通方法,如果问题在较长的文章中只出现一两次,你可以尝试这种方法。请注意,不是换行符,因此它只用于需要帮助的单词,而不是整个段落。

\documentclass{article}
\usepackage{xcolor}
\usepackage{soul}
\fboxsep=.5pt
\newcommand\althl[1]{\colorbox{yellow}{\rule
  [-.75\dp\strutbox]{0pt}{.81\baselineskip}\itshape #1}}
\begin{document}
\hl{\emph{This is an irre\mbox{}ducible test }}%
\althl{of }\hl{\emph{things.}}
\end{document}

在此处输入图片描述

例如,将其与\hl以下段落中自然出现的内容进行比较:

\hl{\emph{This is an irreducible test of things.}}

在此处输入图片描述

在这种情况下,第一个reinirreducible以及fin都被剪切of

答案3

作为一种解决方法,您可以使用包soulposhttps://ctan.org/pkg/soulpos) 基于soulutf8(基于soul),但即使您不使用 utf8 编码,此方法也能正常工作。但与soul或不同soulutf8,此包soulpos不使用重复的小元素来“装饰”文本。因此,一些字符的奇怪渲染就消失了。

使用手册中示例的修改代码soulpos,我们可以重新创建该\hl命令(此处名为myhl)。为了进行比较,我保留了原始代码,使用命令\hl

\documentclass{article}
\usepackage{xcolor}
\usepackage{soulpos}

% -.8ex is the depth and 11pt is the height of the rectangle around the text, 
% here for the default size of the text in the article class.
\ulposdef{\myhl}{%
  \mbox{%
    \color{yellow}%
    \rule[-.8ex]{\ulwidth}{11pt}}}

\begin{document}

    With \verb|\hl| from \verb|soul|:

    \hl{\emph{irreducible}}
    
    \hl{{\emph irreducible}}

    \emph{irreducible}
    
    \medskip  
    
    With \verb|\myhl| created with \verb|soulpos|:
    
    \myhl{\emph{irreducible}}
    
    \myhl{{\emph irreducible}}

    \emph{irreducible}
    
\end{document}

在此处输入图片描述

请注意,使用 创建的命令在斜体文本的最后一个字符后留有稍多的空格soulpos。您可以使用创建的命令选项的负值等来调整此空格xoffset-end(此处,\ulposdef{\myhl}[xoffset-end=-0.5pt]{%几乎消除了斜体字行中最后一个字符后的空格)。

相关内容