У меня есть примеры листингов для книги.
Мне нужна горизонтальная линия шириной с tcolorbox между подписью и списком.
Код, использованный для его создания:
\documentclass[letterpaper,oneside,12pt]{book}
\usepackage{listings}
\usepackage[most]{tcolorbox}
\usepackage{caption}
\usepackage{xcolor}
\definecolor{shadecolor}{gray}{0.95}
\definecolor{captionbox}{cmyk}{0.43, 0.35, 0.35,0.01}
\tcbset{colback=captionbox!5!white,colframe=captionbox!75!black}
\BeforeBeginEnvironment{lstlisting}{\begin{tcolorbox}[toprule=3mm]\vskip-.5\baselineskip}
\AfterEndEnvironment{lstlisting}{\end{tcolorbox}}
\DeclareCaptionFormat{listing}{\parbox{\textwidth}{#1#2#3}}
\captionsetup[lstlisting]{format=listing,skip=10pt}
\lstset{numbers=none}
\begin{document}
\begin{lstlisting}[caption=Sample code block]
This is a code block
\end{lstlisting}
\end{document}
Единственное мое ограничение — мне нужно использовать пакет listings и lstlisting, потому что Pandoc требует этого для листингов. Я с радостью заменю все остальное, чтобы получить тот же эффект рамки вокруг подписи и листинга с правилом между подписью и листингом и похожим стилем.
решение1
Обновлять: изменено overlay first
на overlay unbroken and first
для того, чтобы линия также отображалась в сплошных рамках. Моя ошибка.
Жаль, что нельзя использовать tcblistings
, который, похоже, был создан специально для этой цели и используется внутри компании listings
(я читал об этом, но не проверял).
Хотя мне не нравятся «специфические» решения (т. е. решения, требующие ручной работы), я тем не менее предлагаю вам это просто потому, что это «работает»:
\documentclass[letterpaper,oneside,12pt]{book}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{tcolorbox}
\tcbuselibrary{breakable}
\tcbuselibrary{skins}
\usepackage{caption}
\usepackage{tikz}
\usepackage{lipsum}
\definecolor{shadecolor}{gray}{0.95}
\definecolor{captionbox}{cmyk}{0.43, 0.35, 0.35,0.01}
\tcbset{%
colback=captionbox!5!white,%
colframe=captionbox!75!black,%
top=1mm,% %% Used to manually align the caption with the horizontal line
%
%% Create a new "style" for your titled listings tcolorbox
mylistingwithtitle/.style = {%
breakable,%
%% Use tcolorbox's internal tikz object name (frame) to draw a horizontal line
overlay unbroken and first={\draw[shorten >=1.4pt, shorten <=1.4pt] ([yshift=-3em]frame.north west) -- ([yshift=-3em]frame.north east);}%
}%
}
\BeforeBeginEnvironment{lstlisting}{%
\begin{tcolorbox}[enhanced, toprule=3mm, mylistingwithtitle]%
\vskip-.5\baselineskip%
}
\AfterEndEnvironment{lstlisting}{\end{tcolorbox}}
\DeclareCaptionFormat{listing}{\parbox{\textwidth}{#1#2#3}}
\captionsetup[lstlisting]{format=listing,skip=15pt}
\begin{document}
%% This following line is only useful to execute \lipsum[1-4] inside the listing
\lstset{numbers=none, escapeinside={(*}{*)}}
\begin{lstlisting}[caption=Sample code block]
This is a code block
(*\lipsum[1-4]*)
\end{lstlisting}
\end{document}
Если вы измените форматирование подписи, вам придется вручную поиграть с вертикальным интервалом, т. е. опцией top=1mm
для tcolorbox и [yshift=-3em]
для рисования горизонтальной линии. Вам также придется поиграть с последней опцией, вместе с опциями shorten >=1.4pt
и shorten <=1.4pt
, если вы решите изменить форматирование (верхнюю линию, ширину границы, внутренние поля и т. д.) tcolorbox.
Я позволил себе добавить breakable
опцию в tcolorbox, чтобы она могла разбиваться на несколько страниц.
Выход: