
Tengo listados de ejemplo para un libro.
Me gustaría una regla horizontal del ancho del tcolorbox entre el título y el listado.
El código utilizado para producirlo:
\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}
Mi única restricción es que necesito usar el paquete de listados y lstlisting porque Pandoc lo requiere para los listados. Me complace reemplazar cualquier otra cosa para producir el mismo efecto de un cuadro alrededor del título y la lista con la regla entre el título y la lista y una sensación de estilo similar.
Respuesta1
Actualizar: cambiado overlay first
a overlay unbroken and first
para que la línea también aparezca en cuadros continuos. Mi error.
Lástima que no puedas usar tcblistings
, que parece haber sido creado específicamente para este propósito y se usa internamente listings
(lo he leído pero no lo he verificado).
Aunque no me gustan las soluciones "específicas" (es decir, soluciones que requieren manipulación manual), les propongo esta simplemente porque "funciona":
\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}
Si cambia el formato de los subtítulos, deberá modificar manualmente el espaciado vertical, es decir, la top=1mm
opción para tcolorbox y [yshift=-3em]
dibujar la línea horizontal. También tendrás que jugar con la última opción, junto con las opciones shorten >=1.4pt
y shorten <=1.4pt
, si decides cambiar el formato (línea superior, ancho del borde, márgenes internos, etc.) del tcolorbox.
Me tomé la libertad de agregar la breakable
opción a tcolorbox para permitir que se divida en varias páginas.
Producción: