Смесь обычного и затемненного режима наложения tikz

Смесь обычного и затемненного режима наложения tikz

Я пытаюсь понять, как выделить часть исходного кода в lstlistingсреде в презентации Beamer, не затрагивая при этом подсветку синтаксиса и интервалы. Цвет фона для lstlistingочень светло-серый, а выделенный код должен быть отмечен светло-оранжевым полем.

Мое текущее решение основано на прямоугольнике tikz с overlayопцией, нарисованной вокруг запомненных узлов с darkenрежимом смешивания, чтобы сделать исходный код видимым. Вот демо:

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

Результат:

введите описание изображения здесь

Это решение работает таким образом, что черный исходный код виден, но проблема в том, что цвет подсветки ( myorange) смешивается с цветом фона ( lightgray!30) (левый примерmyorange). И я бы хотел, чтобы вместо этого был «несмешанный» цвет (правильный пример, но с видимым текстом).

Есть ли какой-либо режим смешивания или какой-либо другой способ, который работал бы следующим образом?

  1. Если цвет фона темнее переднего плана, используется фон.

  2. Если цвет фона светлее переднего плана, используется передний план.

решение1

Вы можете нарисовать прямоугольник перед исходным кодом с помощью tikzmark (вам нужно будет скомпилировать дважды):

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

введите описание изображения здесь

Связанный контент