在两部分 tcolorbox 的下方包含自定义列表样式

在两部分 tcolorbox 的下方包含自定义列表样式

我正在为 NetLogo 准备一个教程,这是一种没有预定义listings格式的编程语言。创建一个没有问题。但是,我试图在里面展示代码tcolorbox。这是我目前所拥有的。

\documentclass[10pt]{article}

\usepackage{xcolor}
\usepackage{listings}
\usepackage[most]{tcolorbox}

\lstdefinelanguage{NetLogo}{
    breaklines=true,
    breakatwhitespace=true,
    alsoletter={-,?,.},
    morekeywords=[1]{to, to-report, end},
    keywordstyle=[1]\color[rgb]{0.25,0.5,0.35},
    morekeywords=[2]{ask, let, set, if, report, ifelse},
    keywordstyle=[2]\color{blue},
    morekeywords=[3]{not, n-of, color},
    keywordstyle=[3]\color[rgb]{0.6,0,0.8},
    comment=[l]{\;},
    commentstyle=\color[rgb]{0.75,0.75,0.75},
    string=[d]{"},
    stringstyle=\color{orange},
    morekeywords=[4]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, true, false},
    keywordstyle=[4]{\color{orange}},
}

\lstset{language=NetLogo}

\newtcolorbox[auto counter,number within=section]{snippetbox}[2][]{
  enhanced,
  skin=bicolor,
  overlay={\draw[dashed,blue!75!black] (segmentation.west)--(segmentation.east);},
  colback=blue!15!white,
  colbacklower=gray!10!white,
  colframe=blue!75!black,
  fonttitle=\bfseries,
  title=Snippet~\thetcbcounter: #2,#1}

\title{NetLogo code instructions example}
\author{}
\date{}

\begin{document}
\maketitle

This is a test document for the box structure for code snippet with instructions.

\section{First example}

\begin{snippetbox}{Adding behaviour}
Make various preparatory changes to interface:
\begin{enumerate}
\item Add to section L
\item Amend procedure
\end{enumerate}
\tcblower
\begin{lstlisting}
to setup-patches
  ask patches [ set popn 2000 + random 10000 ]
  ask n-of 3 patches [ set popn 1000000 * (3 + random 3) ]
  set max-popn max [popn] of patches
end
\end{lstlisting}
\end{snippetbox}

\end{document}

这很好。但是,我被迫lstlisting在 \tcblower 部分中指定环境。我尝试将其放入规范中tcolorbox,但代码变成了纯文本。

本教程中将有大约 30 个这样的框,所有框的格式都相同。有没有办法使用自定义语言规范,还是我应该继续这样做?

答案1

tcolorbox最初开发为类型LaTeX+ 结果框,因此一个tcblisting框默认LaTeX在一个部分显示代码,在另一部分显示结果。

但也可以定义listing框,其中一部分显示代码,另一部分显示其他内容,如常规文本或图像。这就是提供选项listing and commentcomment and listinglisting and image的原因。image and listing

对于这种特殊情况,您可以使用comment and listing上部填充一些文本,下部填充特定的代码片段。

下面你会发现你的代码有一些小的变化:

  1. \newtcolorbox已替换为\newtcblisting
  2. 添加了第三个参数以包含comment内容(先前的上部)。请参阅comment={#3}内部选项列表。
  3. comment and listing已添加选项
  4. listing options={language=NetLogo}已包含将 NetLogo 语言格式应用于代码的选项
  5. snippetbox环境中,上部已包含第三个参数
  6. 在 中snippetboxtcblisting下方框中的环境已被删除。

就这样

\documentclass[10pt]{article}

\usepackage{xcolor}
\usepackage{listings}
\usepackage[most]{tcolorbox}

\lstdefinelanguage{NetLogo}{
    breaklines=true,
    breakatwhitespace=true,
    alsoletter={-,?,.},
    morekeywords=[1]{to, to-report, end},
    keywordstyle=[1]\color[rgb]{0.25,0.5,0.35},
    morekeywords=[2]{ask, let, set, if, report, ifelse},
    keywordstyle=[2]\color{blue},
    morekeywords=[3]{not, n-of, color},
    keywordstyle=[3]\color[rgb]{0.6,0,0.8},
    comment=[l]{\;},
    commentstyle=\color[rgb]{0.75,0.75,0.75},
    string=[d]{"},
    stringstyle=\color{orange},
    morekeywords=[4]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, true, false},
    keywordstyle=[4]{\color{orange}},
}

\lstset{language=NetLogo}

\newtcblisting[auto counter,number within=section]{snippetbox}[3][]{
  enhanced,
  skin=bicolor,
  overlay={\draw[dashed,blue!75!black] (segmentation.west)--(segmentation.east);},
  colback=blue!15!white,
  colbacklower=gray!10!white,
  colframe=blue!75!black,
  fonttitle=\bfseries,
  title=Snippet~\thetcbcounter: #2,
  comment and listing,
  comment={#3},
  listing options={language=NetLogo},
  #1}

\title{NetLogo code instructions example}
\author{}
\date{}

\begin{document}
\maketitle

This is a test document for the box structure for code snippet with instructions.

\section{First example}

\begin{snippetbox}{Adding behaviour}
{Make various preparatory changes to interface:
\begin{enumerate}
\item Add to section L
\item Amend procedure
\end{enumerate}}
to setup-patches
  ask patches [ set popn 2000 + random 10000 ]
  ask n-of 3 patches [ set popn 1000000 * (3 + random 3) ]
  set max-popn max [popn] of patches
end
\end{snippetbox}

\end{document}

在此处输入图片描述

相关内容