Mischung aus normalem und dunklem Tikz-Mischmodus

Mischung aus normalem und dunklem Tikz-Mischmodus

Ich versuche herauszufinden, wie ich einen Teil des Quellcodes in der lstlistingUmgebung in einer Beamer-Präsentation hervorheben kann, ohne die Syntaxhervorhebung und den Abstand zu beeinträchtigen. Die Hintergrundfarbe lstlistingist sehr hellgrau und der hervorgehobene Code sollte durch ein hellorangefarbenes Farbfeld gekennzeichnet sein.

Meine aktuelle Lösung basiert auf einem Tikz-Rechteck mit der overlayOption, im darkenBlend-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:

Bildbeschreibung hier eingeben

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?

  1. Wenn die Hintergrundfarbe dunkler als die Vordergrundfarbe ist, wird der Hintergrund verwendet.

  2. 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}

Bildbeschreibung hier eingeben

verwandte Informationen