使用彩色背景突出显示文本和数学表达式

使用彩色背景突出显示文本和数学表达式

我希望有一个可以像荧光笔一样使用的函数,既可以在文本模式中使用,也可以在数学模式下使用。我写了一个可以运行的函数,但它真的很慢,而且在某些情况下仍然会导致问题。以下是该函数:

%-------------------------Highligh-------------------------%

\newif\ifhighlight
\highlighttrue

\definecolor{colorA}{rgb}{1,1,0.5}
\definecolor{colorB}{rgb}{0.85,0.85,1}

\newlength{\fboxseptemp}

\newcommand{\hl}[2][colorA]{%
\ifhighlight%
\setlength{\fboxseptemp}{\the\fboxsep}%
\setlength{\fboxsep}{0pt}%
\ifmmode%
\text{\hl[#1]{$#2$}}%
\else%
$\mathrlap{\text{\smash{\colorbox{#1}{\phantom{#2\vphantom{\strut}}}}}}$%
\setlength{\fboxseptemp}{\fboxseptemp}%
#2%
\fi%
\else%
#2%
\fi}

%-------------------------Highligh-------------------------%

我可以像这样使用它:

For sets $A$ and $B$ let $\hl{B^A}$ denote the \hl{set of all mappings} from $A$ to $B$.

它在很多情况下都运行良好,但并不完美。首先,它编译得非常慢。在某些情况下,彩色背景框太宽。如果 latex 缩小文本以使其适合一行,就会发生这种情况。然后,框的长度与原始(未缩小)文本一样长,因此比显示的文本稍长。此外,它无法处理换行符。另一个问题是连字符,如果它们位于突出显示之前。

\hl{empty}.

格式完全一样

empty.

点向 y 方向移动,与彩色框稍微重叠,这是应该的。但是

f\hl{inite}

产生的结果不同于

finite

f 和 i 合并不正确,彩色框稍微遮住了 fa。有人知道针对该问题的更优雅、快速和稳定的解决方案吗?

答案1

这应该比使用 更快\colorbox。它通过不收缩或断行来避免收缩和断行。当然,你不能将它用于多行。(你可以解析文本并分别突出显示每个单词。)

我添加了 \hlleft 和 \hlright 来突出显示单词的部分而不改变间距。

\documentclass{article}
\usepackage{xcolor}
%-------------------------Highligh-------------------------%

\newif\ifhighlight
\highlighttrue

\definecolor{colorA}{rgb}{1,1,0.5}
\definecolor{colorB}{rgb}{0.85,0.85,1}

\newsavebox{\tempbox}

\newcommand{\hl}[2][colorA]{% #1 = color (opptional), #2 = text
\ifhighlight%
  \ifmmode\savebox{\tempbox}{$#2$}%
  \else\savebox{\tempbox}{#2}%
  \fi
  \leavevmode\rlap{\color{#1}\rule[-\dp\tempbox]{\wd\tempbox}{\dimexpr \ht\tempbox + \dp\tempbox}}%
  \usebox{\tempbox}%
\else
  #2%
\fi}

\newsavebox{\partbox}

\newcommand{\hlleft}[3][colorA]{% #1 = color (opptional), #2 = text, #3 = part highlighted
\ifhighlight%
  \ifmmode\savebox{\tempbox}{$#2$}%
    \savebox{\partbox}{$#3$}%
  \else\savebox{\tempbox}{#2}%
    \savebox{\partbox}{#3}%
  \fi
  \leavevmode\rlap{\color{#1}\rule[-\dp\partbox]{\wd\partbox}{\dimexpr \ht\partbox + \dp\partbox}}%
  \usebox{\tempbox}%
\else
  #2%
\fi}

\newcommand{\hlright}[3][colorA]{% #1 = color (opptional), #2 = text, #3 = part highlighted
\ifhighlight%
  \ifmmode\savebox{\tempbox}{$#2$}%
    \savebox{\partbox}{$#3$}%
  \else\savebox{\tempbox}{#2}%
    \savebox{\partbox}{#3}%
  \fi
  \leavevmode\rlap{\color{#1}\hspace{\dimexpr \wd\tempbox - \wd\partbox}%
    \rule[-\dp\partbox]{\wd\partbox}{\dimexpr \ht\partbox + \dp\partbox}}%
  \usebox{\tempbox}%
\else
  #2%
\fi}

\begin{document}
First a \hl{simple} test.
\[
x=a\quad\hl{\forall a}
\]
\par\hl{test}
\par empty. \hl{empty}. \hlleft{empty.}{empty}
\par finite f\hl{inite} \hlright{finite}{inite}
\end{document}

突出显示

相关内容