我試圖弄清楚如何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
您可以藉助 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}