在这个帖子我发现了以下令人惊叹的代码,可以突出显示多行文本。
问题在于代码不能很好地与公式配合使用:例如,使用模式的分数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
\colorbox
xcolor
例如,在上面的文本中,替换
\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}}}