混合正常和变暗的 tikz 混合模式

混合正常和变暗的 tikz 混合模式

我正在尝试弄清楚如何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. 当背景颜色比前景颜色深时,则使用背景。

  2. 当背景颜色比前景颜色浅时,使用前景。

答案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}

在此处输入图片描述

相关内容