列表标题的背景颜色

列表标题的背景颜色

我正在考虑这段代码

\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

您可以组合captiontitle

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

相关内容