Mistura de modo de mesclagem tikz normal e escurecido

Mistura de modo de mesclagem tikz normal e escurecido

Estou tentando descobrir como destacar alguma parte do código-fonte no lstlistingambiente em uma apresentação do Beamer sem afetar o realce e o espaçamento da sintaxe. A cor de fundo lstlistingé cinza muito claro e o código destacado deve ser marcado por uma caixa laranja claro.

Minha solução atual é baseada em um retângulo tikz com a overlayopção desenhada em torno dos nós lembrados com o darkenmodo de mesclagem para tornar o código-fonte visível. Aqui está uma demonstração:

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

insira a descrição da imagem aqui

Esta solução funciona de forma que o código-fonte preto fique visível, mas o problema é que a cor de destaque ( myorange) se mistura com a cor de fundo ( lightgray!30) (exemplo esquerdo). E eu gostaria de ter a myorangecor "não misturada" lá (exemplo certo, mas com texto visível).

Existe algum modo de mesclagem, ou qualquer outra forma, que funcione da seguinte maneira?

  1. Quando a cor de fundo é mais escura que a do primeiro plano, o fundo é usado.

  2. Quando a cor de fundo é mais clara que a do primeiro plano, o primeiro plano é usado.

Responder1

Você poderia desenhar o retângulo antes do código-fonte com a ajuda do tikzmark (você precisa compilar duas vezes):

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

insira a descrição da imagem aqui

informação relacionada