我正在尝试弄清楚如何lstlisting
在 Beamer 演示文稿中突出显示环境中的某些部分源代码,而不会影响语法突出显示和间距。背景颜色为lstlisting
浅灰色,突出显示的代码应以浅橙色框标记。
我当前的解决方案基于一个 tikz 矩形,该矩形带有一个选项,该overlay
选项围绕记住的节点绘制,并使用darken
混合模式使源代码可见。这是一个演示:
\documentclass{beamer}
\usepackage{listings,tikz,xcolor}
\usetikzlibrary{calc}
\colorlet{myorange}{orange!50}
\newcommand\bh{\tikz[remember picture,overlay]%
\node(begin highlight){};}
\newcommand\eh[1]{%
\tikz[remember picture,overlay]%
\node (end highlight) {};%
\tikz[remember picture, overlay]%
\draw[draw=none,fill=myorange,blend mode=#1]%
($(begin highlight)+(-0.1,-0.3)$) rectangle ($(end highlight)+(0.1,0.4)$);}
\begin{document}
\begin{frame}[fragile]
\begin{lstlisting}[
backgroundcolor=\color{lightgray!30},
basicstyle=\ttfamily,
escapechar=@]
int main()
{
@\bh@int i = 0;@\eh{darken}@ @\bh@int i = 0;@\eh{normal}@
}
\end{lstlisting}
\end{frame}
\end{document}
结果:
此解决方案有效,使得黑色源代码可见,但问题是高亮颜色 ( myorange
) 与背景颜色 ( ) 混合在一起lightgray!30
(左示例)。而且,我希望myorange
那里有“非混合”颜色(正确示例,但带有可见文本)。
是否有任何混合模式或任何其他方式可以像下面这样工作?
当背景颜色比前景颜色深时,则使用背景。
当背景颜色比前景颜色浅时,使用前景。
答案1
您可以在源代码之前借助 tikzmark 绘制矩形(需要编译两次):
\documentclass{beamer}
\usepackage{listings,tikz,xcolor}
\usetikzlibrary{calc,tikzmark}
\colorlet{myorange}{orange!50}
\newcounter{mynode}
\newcommand\bh{%
\stepcounter{mynode}%
\tikzmark{begin highlight \themynode}%
\iftikzmark{begin highlight \themynode}
{%
\tikz[remember picture,overlay]%
\draw[draw=none,fill=myorange]%
($(pic cs:begin highlight \themynode)+(-0.1,-0.3)$) rectangle ($(pic cs:end highlight \themynode)+(0.1,0.4)$);
}{}}
\newcommand\eh{%
\tikzmark{end highlight \themynode}}
\begin{document}
\begin{frame}[fragile]
\begin{lstlisting}[
backgroundcolor=\color{lightgray!30},
basicstyle=\ttfamily,
escapechar=@]
int main()
{
@\bh@int i = 0;@\eh@ @\bh@int i = 0;@\eh@
}
\end{lstlisting}
\end{frame}
\end{document}