Mezcla del modo de fusión tikz normal y oscuro

Mezcla del modo de fusión tikz normal y oscuro

Estoy tratando de descubrir cómo resaltar alguna parte del código fuente en el lstlistingentorno en una presentación de Beamer sin afectar el resaltado y el espaciado de la sintaxis. El color de fondo lstlistinges gris muy claro y el código resaltado debe estar marcado con un cuadro de color naranja claro.

Mi solución actual se basa en un rectángulo tikz con la overlayopción dibujada alrededor de los nodos recordados con el darkenmodo de fusión para hacer visible el código fuente. Aquí hay una demostración:

\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}

Resultado:

ingrese la descripción de la imagen aquí

Esta solución funciona de manera que el código fuente negro sea visible, pero el problema es que el color de resaltado ( myorange) se mezcla con el color de fondo ( lightgray!30) (ejemplo izquierdo). Y me gustaría tener el myorangecolor "no mezclado" allí en su lugar (ejemplo correcto pero con texto visible).

¿Existe algún modo de fusión, o alguna otra forma, que funcione de la siguiente manera?

  1. Cuando el color de fondo es más oscuro que el de primer plano, se utiliza el fondo.

  2. Cuando el color de fondo es más claro que el del primer plano, se utiliza el primer plano.

Respuesta1

Puedes dibujar el rectángulo antes del código fuente con la ayuda de tikzmark (necesitas compilar dos veces):

\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}

ingrese la descripción de la imagen aquí

información relacionada