我正在考虑这段代码
\lstinputlisting[
language=C,
breaklines=true,
basicstyle=\scriptsize\ttfamily,
numbers=none,
caption=\colorbox{mylightgray}\parbox{\textwidth}{\texttt{\detokenize{#1}}},
%title=\small\texttt\lstname,
frame=none]{#1}
为什么使用 parbox 会出现错误?如何才能在框中添加一个具有特定背景颜色的标题,并覆盖整个框\textwidth
?
答案1
以下是使用该包提供的功能caption
来定义列表标题的新格式的另一种方法:
\documentclass{article}
\usepackage{caption}
\usepackage{xcolor}
\usepackage{listings}
\DeclareCaptionFormat{myformat}{%
\colorbox{red!30}{\parbox{\dimexpr\textwidth-2\fboxsep-2\fboxrule\relax}{#1#2\ttfamily#3}}
}
\captionsetup[lstlisting]{format=myformat}
\begin{document}
\begin{lstlisting}[caption={A colored caption}]
test
\end{lstlisting}
\end{document}
答案2
您可以利用title
键值并使用以下方法按照您想要的方式构建列表标题:
\documentclass{article}
\usepackage{xcolor}% http://ctan.org/pkg/xcolor
\usepackage{listings}% http://ctan.org/pkg/listings
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\begin{filecontents*}{foo_bar.c}
void main{}
\end{filecontents*}
\begin{document}
\newcommand{\mylisting}[2][]{%
\refstepcounter{lstlisting}%
\lstinputlisting[language=C,
breaklines=true,
basicstyle=\scriptsize\ttfamily,
numbers=none,
title={\colorbox{black!10}{\parbox{\dimexpr\linewidth-6pt\relax}{\centering \lstlistingname~\thelstlisting:\ \texttt{\detokenize{#2}}}}},
frame=none,#1]%
{#2}%
}%
\lipsum[1]
\noindent\mylisting{foo_bar.c}
\lipsum[2]
\noindent\mylisting{foo_bar.c}
\lipsum[3]
\noindent\mylisting{foo_bar.c}
\lipsum[4]
\end{document}
\lstlistoflistings
但是,这将要求您自己管理“列表列表”( ),因为不caption
使用。不确定您是否需要这样做...
答案3
其他解决方案显然更胜一筹,但这似乎也有效:
注意包裹filecontents
此处仅用于将完整示例包含在一个文件中。它写出foo_bar.c
在同一个目录中,以便可以通过命令使用lstinputlisting
。您不需要在实际代码中使用它,因为您将拥有可用的文件。
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{filecontents}
\begin{filecontents*}{foo_bar.c}
void main{}
\end{filecontents*}
\renewcommand{\lstlistingname}{\texttt{Listing}}%
\lstdefinestyle{MyStyle}{
language=C,
breaklines=true,
basicstyle=\scriptsize\ttfamily,
numbers=none,
frame=none
}
\makeatletter
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{\colorbox{yellow}{#1: #2}}%
\ifdim \wd\@tempboxa >\hsize
\colorbox{yellow}{#1: #2}\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}%
\makeatother
\newcommand{\mylisting}[2][]{%
\lstinputlisting[style=MyStyle,caption=\texttt{\detokenize{#2}},#1]{#2}%
}
\begin{document}
\mylisting[frame=rlbt,language=C]{foo_bar.c}
\end{document}
答案4
您可以组合caption
和title
:
\newcommand{\filelisting}[1]{%
\lstinputlisting[
language=C,
breaklines=true,
basicstyle=\scriptsize\ttfamily,
numbers=none,
caption=\texttt{\detokenize{#1}},
title=\lsttitle{#1},
frame=none]{#1}}
\newcommand{\lsttitle}[1]{\colorbox{mylightgray}{%
\makebox[\dimexpr\textwidth-2\fboxsep\relax]{%
\lstlistingname\ \thelstlisting: \ttfamily\detokenize{#1}}}}