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