Agregar una regla horizontal entre el título y la lista dentro de un tcolorbox

Agregar una regla horizontal entre el título y la lista dentro de un tcolorbox

Tengo listados de ejemplo para un libro.

ingrese la descripción de la imagen aquí

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 firsta overlay unbroken and firstpara 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=1mmopció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.4pty 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 breakableopción a tcolorbox para permitir que se divida en varias páginas.

Producción:

Salida producida por el código anterior

información relacionada