일반 및 어두운 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를 사용하여 소스 코드 앞에 직사각형을 그릴 수 있습니다(두 번 컴파일해야 함).

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

여기에 이미지 설명을 입력하세요

관련 정보