在右下角标注一个lstlisting列表

在右下角标注一个lstlisting列表

我想在列表的右下角放置一个标签,在本例中用于指示列出的代码类型。我有一个糟糕的 hack,它有点用,并说明了我想要的东西:

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\definecolor{light-gray}{gray}{0.95}
\newcommand{\mylabel}[1]{\raisebox{1em}[0pt][0pt]{\makebox[0pt][l]{\makebox[\linewidth][r]{\color{gray}{\sffamily #1}\hspace{3.5em}}}}\ignorespaces}
\lstnewenvironment{code}{\lstset{
    ,frame=single
    ,xleftmargin=2em
    ,xrightmargin=2em
    ,backgroundcolor=\color{light-gray}
    ,belowskip=0pt
}}{\mylabel{Code}}
\begin{document}
\begin{code}
This is
some code
set with lstlisting
\end{code}

This is again regular text.
\end{document}

看起来像这样:

在此处输入图片描述

问题是

  • 列表后直接分页效果不佳,即标签可能会出现在下一页
  • 如果列表后跟着一个空行,间距会增加两倍(因为列表和段落之间虽然内容大小为零但仍然存在)。
  • 这并不优雅。

有没有更好的方法来获得这个结果?

答案1

一个简单的选择是使用escapechar转至 LaTeX 的选项,并将标签生成简单地放入列表的最后一行:

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\definecolor{light-gray}{gray}{0.95}

\newcommand{\mylabel}[1]{\hfill{\color{gray}{\sffamily #1\strut}\hspace{1em}}}

\lstnewenvironment{code}{\lstset{
    ,frame=single
    ,xleftmargin=2em
    ,xrightmargin=2em
    ,backgroundcolor=\color{light-gray}
    ,belowskip=0pt,
    ,escapechar={§},
}}{}
\begin{document}
\begin{code}
This is
some code
set with lstlisting §\mylabel{Code}§
\end{code}

This is again regular text.
\end{document}

在此处输入图片描述


上述内容 – 取决于观点 – 具有 (不) 优点,即您(必须/可以)在实际列表源代码中指定标签。

如果希望将标签作为code环境的参数,则还需要做更多的工作:

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{adjustbox,tikz}
\definecolor{light-gray}{gray}{0.95}

\makeatletter
\newcommand{\mylabel}[1]{\color{gray}{\sffamily #1}\hspace{1em}}    

\lstnewenvironment{code}[1]{
    \lstset{
        ,frame=single
        ,xleftmargin=2em
        ,xrightmargin=2em
        ,backgroundcolor=\color{light-gray}
        ,belowskip=0pt,
    }%
    \def\code@arg{#1}%
    \setbox0\hbox\bgroup%
}
{%
    \egroup\usebox0% printout the listing
    \raisebox{\dimexpr-\dp0+\ht\strutbox\relax}{% move near bottom of listing
        \makebox[\dimexpr-\wd0+\lst@linewidth\relax][r]{% makebox to right border
            \mylabel{\code@arg}%
        }%
    }%
}
\makeatother

\begin{document}
\begin{code}{Label}
This is
some code
set with lstlisting
\end{code}

This is again regular text bla bla.
\end{document}

在此处输入图片描述

相关内容