修复代码以突出显示多行上的公式和文本

修复代码以突出显示多行上的公式和文本

这个帖子我发现了以下令人惊叹的代码,可以突出显示多行文本。

问题在于代码不能很好地与公式配合使用:例如,使用模式的分数display部分超出了突出显示框架。

下面是一个显示问题的内容的代码。

\documentclass{article}
    \usepackage{soul}
    \usepackage{tikz}
    \usetikzlibrary{calc}
    \usepackage{amsmath}
    \usepackage{xcolor}

    \makeatletter
        \newcommand{\defhighlighter}[3][]{%
            \tikzset{every highlighter/.style={color=#2, fill opacity=#3, #1}}%
        }

        \defhighlighter{yellow}{.5}

        \newcommand{\highlight@DoHighlight}{
            \fill[
                outer sep = -15pt, inner sep = 0pt, 
                every highlighter, this highlighter 
            ](
                $(begin highlight)+(0,8pt)$) rectangle ($(end highlight)+(0,-3pt)$
            );
        }

        \newcommand{\highlight@BeginHighlight}{
            \coordinate (begin highlight) at (0,0) ;
        }

        \newcommand{\highlight@EndHighlight}{
            \coordinate (end highlight) at (0,0) ;
        }

        \newdimen\highlight@previous
        \newdimen\highlight@current

        \DeclareRobustCommand*\highlight[1][]{%
            \tikzset{this highlighter/.style={#1}}%
            \SOUL@setup
            %
            \def\SOUL@preamble{%
                \begin{tikzpicture}[overlay, remember picture]
                    \highlight@BeginHighlight
                    \highlight@EndHighlight
                \end{tikzpicture}%
            }%
            %
            \def\SOUL@postamble{%
                \begin{tikzpicture}[overlay, remember picture]
                    \highlight@EndHighlight
                    \highlight@DoHighlight
                \end{tikzpicture}%
            }%
            %
            \def\SOUL@everyhyphen{%
                \discretionary{%
                    \SOUL@setkern\SOUL@hyphkern
                    \SOUL@sethyphenchar
                    \tikz[overlay, remember picture] \highlight@EndHighlight ;%
                }{}{%
                    \SOUL@setkern\SOUL@charkern
                }%
            }%
            %
            \def\SOUL@everyexhyphen##1{%
                \SOUL@setkern\SOUL@hyphkern
                \hbox{##1}%
                \discretionary{%
                    \tikz[overlay, remember picture] \highlight@EndHighlight ;%
                }{}{%
                    \SOUL@setkern\SOUL@charkern
                }%
            }%
            %
            \def\SOUL@everysyllable{%
                \begin{tikzpicture}[overlay, remember picture]
                    \path let \p0 = (begin highlight), \p1 = (0,0) in \pgfextra
                    \global\highlight@previous=\y0
                    \global\highlight@current =\y1
                    \endpgfextra (0,0) ;
                    \ifdim\highlight@current < \highlight@previous
                        \highlight@DoHighlight
                        \highlight@BeginHighlight
                    \fi
                \end{tikzpicture}%
                \the\SOUL@syllable
                \tikz[overlay, remember picture] \highlight@EndHighlight ;%
            }%
            \SOUL@
        }
    \makeatother


\begin{document}

Lorem ipsum \highlight{dolor sit amet, consectetur adipis-icing elit, sed do
eiusmod tempor} incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation \highlight[red]{ullamco $laboris$ nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit} in
voluptate velit esse cillum dolore eu fugiat nulla pariatur.  Excepteur sint
occaecat \highlight[green, draw=blue]{cupidatat non proident 
$\dfrac{789}{7889}$ % The frame is not good for that formula !
suntinculpaquiofficiadeseruntmollitanimidestlaborum.
Loremipsumdolorsitametconsecteturadipisicingelitseddoeiusmodtemporincididuntutlabore-etdoloremagnaaliqua.}
I suppose I could write some more text here.

\end{document}

突出显示文本

有人可以帮我修复它吗?

答案1

由于这个问题还没有解决方案,我认为可能值得考虑一种解决方法。

使用已加载的包提供的或可以实现与突出显示类似的效果soul,但可以处理单行上非标准尺寸的材料。\fcolorbox\colorboxxcolor

例如,在上面的文本中,替换

\highlight[green, draw=blue]{cupidatat non proident 
$\dfrac{789}{7889}$ % The frame is not good for that formula !

\highlight[green, draw=blue]{cupidatat non proident\,}%
\definecolor{mid-grey}{gray}{0.5}%
\fcolorbox{blue}{green}{\color{mid-grey}$\dfrac{789}{7889}$}%
\noindent\highlight[green, draw=blue]{\,

给出一个绿色框,并用蓝线围住整个分数:

两个明显的缺陷是

(a)必须识别非标准高度的材料(并进行编码,同时牢记单线限制),并且

(b)蓝色框连续围绕三个“块”的整个周长。

一个明显的区别是,包含显示分数的整行与上下行都有间隔。

供参考:中灰色被定义为模拟突出显示中文本的明显灰色,默认情况下,不会发生在 上fcolorbox。对绿色进行类似的校正也可能有帮助。对于此示例,\,%是为了防止三个“块”之间出现未突出显示的空白。

答案2

我尝试使用 ConTeXt 代码对同一文本进行语法高亮(原帖链接的帖子就是这个代码)。它的效果比 tikz 解决方案略好一些,但也不完美。

\definebar[highlight]
          [order=background,
           rulethickness=2.5,
           offset=1.25,
           continue=yes,
           color=yellow]

\starttext
\startTEXpage[offset=2mm]
Lorem ipsum \highlight{$\displaystyle \sum_{i=1}^n x_n$ dolor sit amet, consectetur adipis-icing elit, sed do
eiusmod tempor} incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation \highlight{ullamco $\sum_{i=1}^n$ nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit} in
voluptate velit esse cillum dolore eu fugiat nulla pariatur.  Excepteur sint
occaecat \highlight{cupidatat non proident 
$\dfrac{789}{7889}$ % The frame is not good for that formula !
suntinculpaquiofficiadeseruntmollitanimidestlaborum.
Loremipsumdolorsitametconsecteturadipisicingelitseddoeiusmodtemporincididuntutlabore-etdoloremagnaaliqua.}
I suppose I could write some more text here
\stopTEXpage
\stoptext                     

在此处输入图片描述

在 ConTeXt 中突出显示文本的另一种方法是使用文本背景,但这种方法失败了。

  \definetextbackground
      [highlight] 
      [
        alternative=0,
        frame=off,
        background=color,
        backgroundcolor=yellow,
      ]

在此处输入图片描述

但这表明可以将两种机制结合起来形成一个可行的解决方案:

  \definetextbackground
      [highlightbackground] 
      [
        alternative=0,
        frame=off,
        background=color,
        backgroundcolor=yellow,
      ]

\definebar[highlightbar]
          [order=background,
           rulethickness=2.5,
           offset=1.25,
           continue=yes,
           color=yellow] 

\def\highlight#1{\highlightbar{\highlightbackground{#1}}}

在此处输入图片描述

相关内容