我仍在编写自己的 LaTeX 类文件。我今天的目标是编写一个类似于结果可以在 Arch Linux Media Wiki 中查看。
我的问题与针对这个问题提出的解决方案。
想象一个 lstlisting 环境,lstlisting 的标题与环境本身粘在一起。lstlisting 环境和标题都必须有一个简单的边框(框架),标题和环境之间的边框是虚线。
环境和标题没有相同的字体。 在我的例子中,我为 lstlisting 环境使用的字体定义如下:
\setmonofont{Bitstream Vera Sans Mono}[Scale=MatchLowercase]
标题必须不能被环境破坏。目前,如果不使用 tcolorbox,在下面的例子中,如果我删除 newpage 语句,标题可能会被破坏(如果您在部分标题后放置一些文本,就会被破坏)。
我想要行号里面环境lstlisting
,理想情况下,当我们从环境本身复制粘贴文本时lstlisting
,不需要复制数字。
我仍然需要能够使用
moredelim={[is][keywordstyle]{@@}{@@}}
作为环境参数lstlisting
,因为我希望能够指定一些语句,例如将一些文本加粗。由于我的 LaTeX 文档主要集中在 IT 技术文档上,我仍然希望能够强调某些单词或字符。
所以的想法是继续lstlisting
直接使用并放入一些tcolorbox
声明中。
将来的目的显然是围绕lstlisting
我所拥有的不同重写一个包装器,并对标准文件、带有行号的代码文件、没有行号的代码片段、配置文件等进行不同的包装。
这是我现在拥有的最小工作示例。使用 XeLaTeX 编译后,您可以看到第一个环境正在使用tcolorbox
,最后一个环境是我在 @Johannes_B(在 TeX 朋友聊天中)建议我使用之前尝试制作的两个示例tcolorbox
。如您所见,这深受上述答案的启发。
\documentclass[oneside]{report}
\usepackage{fontspec}
\setmonofont{Bitstream Vera Sans Mono}[Scale=MatchLowercase]
\usepackage[margin=2.5cm]{geometry}
\usepackage{listings}
\usepackage{tcolorbox}
\tcbuselibrary{breakable}
\tcbuselibrary{skins}
\tcbuselibrary{listings}
\usepackage{caption}
\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=0mm, mylistingwithtitle]%
\begin{tcolorbox} [enhanced, colback=white] %, toprule=0mm, mylistingwithtitle]%
% \vskip-.5\baselineskip%
\tcblower
}
\AfterEndEnvironment{lstlisting}{\end{tcolorbox}}
\DeclareCaptionFormat{listing}{\parbox{\textwidth}{#1#2#3}}
\captionsetup[lstlisting]{format=listing}
\lstset{
moredelim={[is][keywordstyle]{@@}{@@}},
basicstyle=\normalsize\ttfamily,
breaklines=true,
breakautoindent=false,
breakindent=0pt,
}
\DeclareCaptionFormat{listing}{\rule{\dimexpr\textwidth\relax}{0.4pt}\par\vskip1pt#1#2#3}
\captionsetup[lstlisting]{
format=listing,
singlelinecheck=false,
margin=0pt,
font={sf},
labelsep=space,
labelfont=bf}
\lstnewenvironment{code}[2][]{%
\lstset{%
frame=single,
numbers = left,
caption = #2,
#1,
}%
}{}
\lstnewenvironment{someTest}[1][]{%
\lstset{%
frame=top,
frame=bottom,
#1,
}%
}{}
\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
@@Hello world@@
(*\lipsum[1-4]*)
\end{lstlisting}
\begin{tcblisting}{colback=red!5!white,colframe=red!25,left=6mm,
listing options={style=tcblatex,numbers=left,numberstyle=\tiny\color{red!75!black}}}
This is a \LaTeX\ example which displays the text as source code
and in compiled form. Additionally, we use line numbers here.
\end{tcblisting}
\newpage
\section{Objective}
\begin{code}{Some great caption}
Hey there, you see the border above is a bit shorter and has 2 borders missing.
\end{code}
\begin{someTest}[caption=Some great caption]
Without vertical border, the caption border is just fine
\end{someTest}
\end{document}
答案1
像这样吗?
在我看来,这种风格‘非常’特别!
\documentclass[oneside]{report}
\usepackage{fontspec}
\setmonofont{Bitstream Vera Sans Mono}[Scale=MatchLowercase]
\usepackage[margin=2.5cm]{geometry}
\usepackage{listings}
\usepackage{tcolorbox}
\tcbuselibrary{breakable}
\tcbuselibrary{skins}
\tcbuselibrary{listings}
\usepackage{caption}
\usepackage{lipsum}
\definecolor{shadecolor}{gray}{0.95}
\definecolor{captionbox}{cmyk}{0.43, 0.35, 0.35,0.01}
\newtcblisting[auto counter]{wgetlisting}[2][]{%
listing only,
breakable,
top=0.5pt,
bottom=0.5pt,
colback=red!5!white,
colframe=red!25,
left=6mm,
sharp corners,
boxrule=0pt,
bottomrule=1pt,
toprule=1pt,
enhanced jigsaw,
listing options={%style=tcblatex,
numbers=left,
numberstyle=\tiny\color{red!75!black},
moredelim={[is][keywordstyle]{@@}{@@}},
basicstyle=\normalsize\ttfamily,
breaklines=true,
breakautoindent=false,
breakindent=0pt,
escapeinside={(*}{*)},
},%
lefttitle=0pt,
coltitle=black,
colbacktitle=white,
title={Listing \thetcbcounter: #2},#1%
borderline north={1pt}{14.4pt}{red!25,dashed},
}
%
\begin{document}
\begin{wgetlisting}{Sample code block}
This is a \LaTeX\ example which displays the text as source code
and in compiled form. Additionally, we use line numbers here.
@@Hello world@@
\end{wgetlisting}
\end{document}