Ich versuche herauszufinden, wie ich einen Teil des Quellcodes in der lstlisting
Umgebung in einer Beamer-Präsentation hervorheben kann, ohne die Syntaxhervorhebung und den Abstand zu beeinträchtigen. Die Hintergrundfarbe lstlisting
ist sehr hellgrau und der hervorgehobene Code sollte durch ein hellorangefarbenes Farbfeld gekennzeichnet sein.
Meine aktuelle Lösung basiert auf einem Tikz-Rechteck mit der overlay
Option, im darken
Blend-Modus um die gespeicherten Knoten herum zu zeichnen, um den Quellcode sichtbar zu machen. Hier ist eine Demo:
\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}
Ergebnis:
Diese Lösung funktioniert so, dass der schwarze Quellcode sichtbar ist. Das Problem besteht jedoch darin, dass sich die Hervorhebungsfarbe ( myorange
) mit der Hintergrundfarbe ( lightgray!30
) vermischt (linkes Beispielmyorange
). Und ich hätte dort stattdessen gerne die „nicht gemischte“ Farbe (rechtes Beispiel, jedoch mit sichtbarem Text).
Gibt es einen Mischmodus oder eine andere Möglichkeit, die wie folgt funktionieren würde?
Wenn die Hintergrundfarbe dunkler als die Vordergrundfarbe ist, wird der Hintergrund verwendet.
Wenn die Hintergrundfarbe heller ist als die Vordergrundfarbe, wird der Vordergrund verwendet.
Antwort1
Sie könnten das Rechteck vor dem Quellcode mit Hilfe von Tikzmark zeichnen (Sie müssen es zweimal kompilieren):
\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}