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