正常和變暗 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}

在此輸入影像描述

相關內容