我有一本书的示例列表。
我想要一个水平规则,即标题和列表之间的 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]
绘制水平线的选项。如果您决定更改 tcolorbox 的格式(顶线、边框宽度、内边距等),您还必须调整后者选项以及shorten >=1.4pt
和选项。shorten <=1.4pt
我擅自breakable
为 tcolorbox 添加了该选项,以允许它跨越多页。
输出: