我正在为 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 comment
、comment and listing
和listing and image
的原因。image and listing
对于这种特殊情况,您可以使用comment and listing
上部填充一些文本,下部填充特定的代码片段。
下面你会发现你的代码有一些小的变化:
\newtcolorbox
已替换为\newtcblisting
- 添加了第三个参数以包含
comment
内容(先前的上部)。请参阅comment={#3}
内部选项列表。 comment and listing
已添加选项listing options={language=NetLogo}
已包含将 NetLogo 语言格式应用于代码的选项- 在
snippetbox
环境中,上部已包含第三个参数 - 在 中
snippetbox
,tcblisting
下方框中的环境已被删除。
就这样
\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}