Sombreando un bloque de mi texto

Sombreando un bloque de mi texto

Me gustaría rodear algún código fuente en mi presentación de proyector con un cuadro ligeramente sombreado.

Más específicamente, en el código fuente de C++ que se proporciona a continuación, me gustaría sombrear el bloque de código de la vecAddKernelfunción con un cuadro gris claro. Cómo hago esto.

Aquí está mi código para mi marco de proyector.

\begin{frame}[fragile]{Simple CUDA Code: A Vector Sum}
\lstset{ language=C++,
         basicstyle=\ttfamily\scriptsize,
         keywordstyle=\color{blue}\ttfamily,
         stringstyle=\color{red}\ttfamily,
         commentstyle=\color{green}\ttfamily
       }
   \begin{lstlisting}
   // Compute vector sum C = A+B
   // Each thread performs one pair-wise addition
   __global__
   void vecAddKernel(float* A_d, float* B_d, float* C_d, int n)
    {
      int i = threadIdx.x + blockDim.x * blockIdx.x;
      if(i<n) C_d[i] = A_d[i] + B_d[i];
    }
    int vecAdd(float* A, float* B, float* C, int n) 
     {
       // A_d, B_d, C_d allocations and copies omitted
       // Run ceil(n/256) blocks of 256 threads each
          dim3 DimGrid(ceil(n/256.0), 1, 1);
          dim3 DimBlock(256, 1, 1);
          vecAddKernnel<<<DimGrid,DimBlock>>>(A_d, B_d, C_d, n);
     }
    \end{lstlisting}
\textbf{Note: } Calls to kernels are \textbf{\color{orange}asynchronous}.
\end{frame}

Aquí está el resultado de compilarlo. ingrese la descripción de la imagen aquí

Respuesta1

Aquí hay una opción que usa el lstlinebgrdpaquete:

\documentclass{beamer}
\usepackage{listings}
\usepackage{lstlinebgrd}

\lstset{ language=C++,
         basicstyle=\ttfamily\scriptsize,
         keywordstyle=\color{blue}\ttfamily,
         stringstyle=\color{red}\ttfamily,
         commentstyle=\color{green!60!black}\ttfamily,
         escapeinside=||,
        linebackgroundcolor={\ifnum\value{lstnumber}>3 \ifnum\value{lstnumber}<9\color{gray!30}\fi\fi}
}

\begin{document}

\begin{frame}[fragile]{Simple CUDA Code: A Vector Sum}

\begin{lstlisting}
// Compute vector sum C = A+B
// Each thread performs one pair-wise addition
__global__
void vecAddKernel(float* A_d, float* B_d, float* C_d, int n)
{
  int i = threadIdx.x + blockDim.x * blockIdx.x;
  if(i<n) C_d[i] = A_d[i] + B_d[i];
}
int vecAdd(float* A, float* B, float* C, int n) 
{
  // A_d, B_d, C_d allocations and copies omitted
  // Run ceil(n/256) blocks of 256 threads each
  dim3 DimGrid(ceil(n/256.0), 1, 1);
  dim3 DimBlock(256, 1, 1);
  vecAddKernnel<<<DimGrid,DimBlock>>>(A_d, B_d, C_d, n);
}
\end{lstlisting}
\textbf{Note: } Calls to kernels are \textbf{\color{orange}asynchronous}.
\end{frame}

\end{document}

ingrese la descripción de la imagen aquí

Para marcos más elegantes, existe otra opción que utiliza la versión mejorada de \tizmark(gracias a Andrew Stacey); la idea es poner algunas marcas y luego usar las marcas para dibujar el fondo de color:

\documentclass{beamer}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{calc}

\makeatletter
\tikzset{%
  remember picture with id/.style={%
    remember picture,
    overlay,
    save picture id=#1,
  },
  save picture id/.code={%
    \edef\pgf@temp{#1}%
    \immediate\write\pgfutil@auxout{%
      \noexpand\savepointas{\pgf@temp}{\pgfpictureid}}%
  },
  if picture id/.code args={#1#2#3}{%
    \@ifundefined{save@pt@#1}{%
      \pgfkeysalso{#3}%
    }{
      \pgfkeysalso{#2}%
    }
  }
}

\def\savepointas#1#2{%
  \expandafter\gdef\csname save@pt@#1\endcsname{#2}%
}

\def\tmk@labeldef#1,#2\@nil{%
  \def\tmk@label{#1}%
  \def\tmk@def{#2}%
}

\tikzdeclarecoordinatesystem{pic}{%
  \pgfutil@in@,{#1}%
  \ifpgfutil@in@%
    \tmk@labeldef#1\@nil
  \else
    \tmk@labeldef#1,(0pt,0pt)\@nil
  \fi
  \@ifundefined{save@pt@\tmk@label}{%
    \tikz@scan@one@point\pgfutil@firstofone\tmk@def
  }{%
  \pgfsys@getposition{\csname save@pt@\tmk@label\endcsname}\save@orig@pic%
  \pgfsys@getposition{\pgfpictureid}\save@this@pic%
  \pgf@process{\pgfpointorigin\save@this@pic}%
  \pgf@xa=\pgf@x
  \pgf@ya=\pgf@y
  \pgf@process{\pgfpointorigin\save@orig@pic}%
  \advance\pgf@x by -\pgf@xa
  \advance\pgf@y by -\pgf@ya
  }%
}
\newcommand\tikzmark[2][]{%
\tikz[remember picture with id=#2] #1;}
\makeatother

\newcommand<>\MyBox[2]{%
  \tikz[remember picture,overlay]
  \filldraw[draw=gray,fill=gray!40,line width=1pt,rectangle,rounded corners]
( $ (pic cs:#1) + (-2pt,1.3ex) $ ) rectangle ( $ (pic cs:#2) +
(\textwidth,-0.5ex) $ )
;}%

\lstset{ language=C++,
         basicstyle=\ttfamily\scriptsize,
         keywordstyle=\color{blue}\ttfamily,
         stringstyle=\color{red}\ttfamily,
         commentstyle=\color{green!60!black}\ttfamily,
         escapeinside=||,
}

\begin{document}

\begin{frame}[fragile]{Simple CUDA Code: A Vector Sum}
\MyBox{start}{end}

\begin{lstlisting}
// Compute vector sum C = A+B
// Each thread performs one pair-wise addition
__global__
|\tikzmark{start}|void vecAddKernel(float* A_d, float* B_d, float* C_d, int n)
{
   int i = threadIdx.x + blockDim.x * blockIdx.x;
   if(i<n) C_d[i] = A_d[i] + B_d[i];
}|\tikzmark{end}|
int vecAdd(float* A, float* B, float* C, int n) 
{
  // A_d, B_d, C_d allocations and copies omitted
  // Run ceil(n/256) blocks of 256 threads each
     dim3 DimGrid(ceil(n/256.0), 1, 1);
      dim3 DimBlock(256, 1, 1);
      vecAddKernnel<<<DimGrid,DimBlock>>>(A_d, B_d, C_d, n);
}
    \end{lstlisting}
\textbf{Note: } Calls to kernels are \textbf{\color{orange}asynchronous}.
\end{frame}

\end{document}

ingrese la descripción de la imagen aquí

información relacionada