Набранные листинги с преамбулой (предпочтительно с использованием пакета листингов)

Набранные листинги с преамбулой (предпочтительно с использованием пакета листингов)

В данный момент я использую этот listingsпакет для верстки своего листинга. Листинги являются плавающими, используют номера строк и имеют верхнюю и нижнюю линейку, чтобы отделить их от окружающего текста.

Что мне действительно хотелось бы иметь, так это короткую преамбулу к каждому листингу, которая отделена (более легким) правилом и содержит аннотации к листингу, такие как утверждение, побочные эффекты, требования и т. д. Поэтому мне нужно более тяжелое верхнее правило, легкое среднее правило и более тяжелое нижнее правило, как известно из пакета booktabs. Более того, строки преамбулы не должны учитываться, потому что преамбула на самом деле не является частью листинга.

Как мне проще всего добиться этого в LaTeX? Предпочтительно я хотел бы использовать пакет listings.

решение1

Следующий пример создает плавающие списки с использованием tcolorboxпакета без нумерации списков . Среда preamblelistingпринимает преамбулу как обязательный параметр. Необязательный параметр — любой tcolorboxпараметр. Базовый пакет для набора текста — listings.

tcolorboxПримечание: для компиляции вам может потребоваться обновить пакет.

\documentclass{report}
\usepackage[skins,listings]{tcolorbox}
\usepackage{lipsum}

\newtcblisting{preamblelisting}[2][]{%
  float=htb,empty,
  boxsep=0pt,left=0pt,right=0pt,boxrule=2pt,leftrule=0pt,rightrule=0pt,
  borderline horizontal={2pt}{0pt}{black},
  segmentation engine=path,
  segmentation style={solid,line width=1pt},
  comment and listing,
  fontupper=\itshape,
  listing options={% put any listing options here
    language={[LaTeX]TeX},
    aboveskip=0pt, belowskip=0pt,numbers=left,numberstyle=\tiny,
    basicstyle=\ttfamily,columns=fullflexible},
  comment={#2},#1
}

\begin{document}

\lipsum[1]

\begin{preamblelisting}{This is the preamble. Lorem ipsum dolor sit amet,
  consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac,
  adipiscing vitae, felis. Curabitur dictum gravida
  mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna.}
\begin{test}{Example}
This is an example
\end{test}
\end{preamblelisting}

\begin{preamblelisting}[float=b]{This is the preamble. Lorem ipsum dolor sit amet,
  consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac,
  adipiscing vitae, felis. Curabitur dictum gravida
  mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna.}
\begin{test}{Example}
This is an example
This is an example
This is an example
\end{test}
\end{preamblelisting}

\lipsum

\end{document}

введите описание изображения здесь

ОБНОВЛЯТЬ:

Это обновление учитывает комментарии OP и добавляет нумерацию с заголовками, установленными ниже. Кроме того, это вписывается в обычные листинги из пакета листингов, т.е. оба могут использоваться параллельно. Наконец, cleverefиспользуется:

\documentclass{report}
\usepackage{cleveref,varwidth}
\usepackage[skins,listings]{tcolorbox}
\usepackage{lipsum}

\Crefname{lstlisting}{Listing}{Listings}

\AtBeginDocument{%
\newtcblisting[blend into=listings]{preamblelisting}[3][]{%
  float=htb,empty,
  boxsep=0pt,left=0pt,right=0pt,boxrule=2pt,leftrule=0pt,rightrule=0pt,
  borderline horizontal={2pt}{0pt}{black},
  segmentation engine=path,
  segmentation style={solid,line width=1pt},
  comment and listing,
  fontupper=\itshape,
  listing options={% put any listing options here
    language={[LaTeX]TeX},
    aboveskip=0pt, belowskip=0pt,numbers=left,numberstyle=\tiny,
    basicstyle=\ttfamily,columns=fullflexible},
  attach boxed title to bottom center,
  varwidth boxed title,
  coltitle=black,
  boxed title style={blanker,top=2mm},
  title={#2},comment={#3},#1
}}


\begin{document}

\lstlistoflistings

\chapter{Example}

\begin{lstlisting}[language={[LaTeX]TeX},
    numbers=left,numberstyle=\tiny,
    basicstyle=\ttfamily,columns=fullflexible,
    caption={My normal listing},
    captionpos=b,
    label=mynormal]
This is a normal listing
\end{lstlisting}

\lipsum[2]

\textcolor{red}{\Cref{mynormal} is a normal listing and \Cref{mypreamble} is a listing
with a preamble.}

\begin{preamblelisting}[label=mypreamble]{My preamble listing}%
{This is the preamble. Lorem ipsum dolor sit amet,
  consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac,
  adipiscing vitae, felis. Curabitur dictum gravida
  mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna.}
\begin{test}{Example}
This is an example
\end{test}
\end{preamblelisting}

\begin{preamblelisting}[float=b,label=floatingpreamble]{My floating preamble listing}%
{This is the preamble. Lorem ipsum dolor sit amet,
  consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac,
  adipiscing vitae, felis. Curabitur dictum gravida
  mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna.}
\begin{test}{Example}
This is an example
This is an example
This is an example
\end{test}
\end{preamblelisting}

\lipsum

\end{document}

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

Связанный контент