我想在列表的右下角放置一个标签,在本例中用于指示列出的代码类型。我有一个糟糕的 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}