列表背景被 \colorbox 和 \framebox 破坏

列表背景被 \colorbox 和 \framebox 破坏

我正在使用带有背景参数的listing环境(listings包)。我想突出显示一些代码行,我正在使用\colorbox\makebox\framebox来实现这一点。但是,我的解决方案的一个问题是背景被破坏了(环境中没有背景的空间listing)。

你能帮助我解决这个问题吗?

\documentclass{beamer}
\usetheme{Montpellier}
\usepackage{listings}
\usepackage{xcolor}

\begin{document}

\begin{frame}[fragile]
\frametitle{Background broken}
\begin{lstlisting}[escapechar=$, backgroundcolor=\color{lightgray}]
int a = 0;
$\colorbox{green}{int b = 0;}$
int c = 0;
$\framebox{int d = 0;}$
int e = 0;
int f = 0;
int g = 0;
\end{lstlisting}

\end{frame}

\end{document}

在此处输入图片描述

答案1

您可以使用非常强大的tcolorbox软件包,因此背景是全局着色的,而不是逐行着色:

\documentclass{beamer}
\usetheme{Montpellier}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\newcommand{\lcolorbox}[2]{%
  \hspace*{-\fboxsep}\colorbox{#1}{#2}%
}
\newcommand{\lfbox}[1]{%
  \hspace*{-\fboxsep}\hspace*{-\fboxrule}\fbox{#1}%
}

\usepackage{xcolor}

\begin{document}

\begin{frame}[fragile]
\frametitle{Background broken}
\lstset{escapechar=$}
\begin{tcblisting}{
  listing only,
  colback=lightgray,
}
int a = 0;
$\lcolorbox{green}{int b = 0;}$
int c = 0;
$\lfbox{int d = 0;}$
int e = 0;
int f = 0;
int g = 0;
\end{tcblisting}

\end{frame}

\end{document}

我还提供了一些用于调整框的水平位置的命令。

在此处输入图片描述

答案2

如果你想突出显示整行,你可以利用lstlinebgrd包裹。

以下是一个例子:

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


\begin{document}

\begin{frame}[fragile]
\frametitle{Background broken}
\begin{lstlisting}[escapechar=$,linebackgroundcolor={\ifnum\value{lstnumber}=2\color{green}\else\color{lightgray}\fi}]
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int f = 0;
int g = 0;
\end{lstlisting}

\end{frame}

\end{document} 

在此处输入图片描述

答案3

您可以设置\fboxsep一个合适的值。\fboxsep=1.5pt似乎工作正常。

\documentclass{beamer}
\usetheme{Montpellier}
\usepackage{listings}
\usepackage{xcolor}
\fboxsep=1.5pt                     %% adjust
\begin{document}

\begin{frame}[fragile]
\frametitle{Background broken}
\begin{lstlisting}[escapechar=$, backgroundcolor=\color{lightgray}]
int a = 0;
$\colorbox{green}{int b = 0;}$
int c = 0;
$\framebox{int d = 0;}$
int e = 0;
int f = 0;
int g = 0;
\end{lstlisting}

\end{frame}

\end{document}

在此处输入图片描述

basicstyle=\footnotesize\ttfamily

\documentclass{beamer}
\usetheme{Montpellier}
\usepackage{listings}
\usepackage{xcolor}
\fboxsep=1.5pt                     %% adjust
\begin{document}

\begin{frame}[fragile]
\frametitle{Background broken}
\begin{lstlisting}[escapechar=$, backgroundcolor=\color{lightgray},basicstyle=\footnotesize\ttfamily]
int a = 0;
$\colorbox{green}{int b = 0;}$
int c = 0;
$\framebox{int g = 0;}$
int e = 0;
int f = 0;
int g = 0;
\end{lstlisting}

\end{frame}

\end{document}

在此处输入图片描述

相关内容