Hinzufügen einer horizontalen Linie zwischen Beschriftung und Listenauflistung innerhalb einer Farbbox

Hinzufügen einer horizontalen Linie zwischen Beschriftung und Listenauflistung innerhalb einer Farbbox

Ich habe Beispiellisten für ein Buch.

Bildbeschreibung hier eingeben

Ich hätte gerne eine horizontale Linie in der Breite der Farbbox zwischen der Überschrift und der Auflistung.

Der zur Erstellung verwendete Code:

\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}

Meine einzige Einschränkung besteht darin, dass ich das Listings-Paket und lstlisting verwenden muss, da Pandoc dies für Listings erfordert. Ich ersetze gerne alles andere, um den gleichen Effekt eines Felds um die Überschrift und die Auflistung mit der Linie zwischen der Überschrift und der Auflistung und einem ähnlichen Stilgefühl zu erzielen.

Antwort1

Aktualisieren: geändert overlay first, damit overlay unbroken and firstdie Linie auch in ununterbrochenen Kästchen erscheint. Mein Fehler.

Schade, dass Sie nicht verwenden können tcblistings, das anscheinend speziell für diesen Zweck entwickelt wurde und intern verwendet listings(ich habe dies gelesen, aber nicht überprüft).

Obwohl ich keine „spezifischen“ Lösungen mag (also Lösungen, die manuelles Herumfummeln erfordern), schlage ich Ihnen dennoch Folgendes vor, einfach weil es „funktioniert“:

\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}

Wenn Sie die Formatierung der Überschrift ändern, müssen Sie den vertikalen Abstand manuell ändern, also die top=1mmOption für die Farbbox und die [yshift=-3em]zum Zeichnen der horizontalen Linie. Sie müssen auch mit der letzteren Option sowie den Optionen shorten >=1.4ptund herumspielen shorten <=1.4pt, wenn Sie die Formatierung (obere Zeile, Rahmenbreite, innere Ränder usw.) der Farbbox ändern möchten.

Ich habe mir erlaubt, breakableder Tcolorbox die Option hinzuzufügen, eine Umbruchfunktion über mehrere Seiten zu ermöglichen.

Ausgabe:

Vom obigen Code erzeugte Ausgabe

verwandte Informationen