我正在使用带有背景参数的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}