lstlisting 环境,标题在第一行,用虚线边框分隔

lstlisting 环境,标题在第一行,用虚线边框分隔

我仍在编写自己的 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}

在此处输入图片描述

相关内容