Estou tentando descobrir como destacar alguma parte do código-fonte no lstlisting
ambiente 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 overlay
opção desenhada em torno dos nós lembrados com o darken
modo 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:
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 myorange
cor "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?
Quando a cor de fundo é mais escura que a do primeiro plano, o fundo é usado.
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}