通常のTikzブレンドモードと暗いTikzブレンドモードのミックス

通常のTikzブレンドモードと暗いTikzブレンドモードのミックス

lstlisting構文の強調表示や間隔に影響を与えずに、Beamer プレゼンテーションの環境内のソース コードの一部を強調表示する方法を見つけようとしています。 の背景色lstlistingは非常に薄い灰色で、強調表示されたコードは薄いオレンジ色のボックスでマークされる必要があります。

overlay私の現在のソリューションは、記憶されたノードの周囲にブレンド モードで描画してソース コードを表示するオプションを備えた tikz 長方形に基づいています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 の助けを借りて、ソース コードの前に四角形を描画できます (2 回コンパイルする必要があります)。

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

ここに画像の説明を入力してください

関連情報