Estoy tratando de descubrir cómo resaltar alguna parte del código fuente en el lstlisting
entorno en una presentación de Beamer sin afectar el resaltado y el espaciado de la sintaxis. El color de fondo lstlisting
es 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 overlay
opción dibujada alrededor de los nodos recordados con el darken
modo 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:
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 myorange
color "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?
Cuando el color de fondo es más oscuro que el de primer plano, se utiliza el fondo.
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}