我有想法与之minted
结合tcolorbox
。
首先,我创建了自己的环境:
\newminted[mycsharp]{csharp}{tabsize=2,fontsize=\footnotesize}
\newminted[myjson]{js}{tabsize=2,fontsize=\footnotesize}
\newminted[myxml]{xml}{tabsize=2,fontsize=\footnotesize}
\newminted[myshell]{shell-session}{tabsize=2,fontsize=\footnotesize}
\newminted[mycode]{text}{tabsize=2,fontsize=\footnotesize}
我通过它们突出显示了我的代码:
\begin{myshell}
[root@localhost ~]# vi /etc/sysconfig/network
\end{myshell}
\captionof{listing}{Load network configuration with vi}
因此我得到以下信息:
现在我想要一个漂亮的框架。由于 minted 在这里功能不是那么强大,我想使用 tcolorbox,所以我做了以下事情:
\begin{tcolorbox}
\begin{myshell}
[root@localhost ~]# vi /etc/sysconfig/network
\end{myshell}
\end{tcolorbox}
\captionof{listing}{Load network configuration with vi}
我在这里得到这个:
这很好,但不是我想要的。查看包文档后,tcolorbox
我发现它支持标题:
越来越好了。读了更多内容后,tcolorbox
还支持自动编号标题和“列表”支持。不幸的是,文档中提供的示例不起作用,但这是另一个问题。
好的,现在我想要什么?
我想要类似的东西:
\begin{listingsbox}{myshell}{A nice title}
[root@localhost ~]# vi /etc/sysconfig/network
\end{listingsbox}
得到以下输出:
不幸的是我无法自己编写这个。我尝试使用\newenvironment
宏,但在谷歌搜索后,发现将 minted 集成到新环境中并不容易。
有人可以帮我从这里出去吗?
答案1
我在 Windows 上设置minted
pygments 时遇到了一些麻烦,但现在似乎可以运行了。所以,这是我的第一篇minted
文章 - 所以,如果我在这里说了一些废话,请原谅我。尽管如此,我还是找到了一些可以作为基础的东西。以下代码使用的语法并不完全符合您的语法,而是创建了一个myshellbox
。基本上,我在某些时候使用了listings
的功能tcolorbox
和技巧:minted
\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{minted}
\makeatletter
\tcbset{minted language/.store in=\kvtcb@minted@language}
\def\tcbuselistinglisting{%
\toks@=\expandafter{\kvtcb@listingoptions}%
\edef\tcb@temp{\noexpand\inputminted[\the\toks@]}%
\tcb@temp{\kvtcb@minted@language}{\kvtcb@listingfile}%
}%
\makeatother
\begin{document}
\section{Test}
\newtcblisting[auto counter,number within=section,
list inside=mypyg]{myshellbox}[2][]{%
title={Listing \thetcbcounter: #2},
list entry={\protect\numberline{\thetcbcounter}#2},
minted language=shell-session,
listing options={tabsize=2,fontsize=\footnotesize},
listing only,
enhanced,colframe=red!50!black,drop fuzzy shadow,
#1}
\begin{myshellbox}{Load network configuration with vi}
[root@localhost ~]# vi /etc/sysconfig/network
\end{myshellbox}
\begin{myshellbox}{Something else}
[root@localhost ~]# vi /etc/sysconfig/something
\end{myshellbox}
\tcblistof{mypyg}{My Listings}
\end{document}
编辑:值得一提的是,创建的myshellbox
环境采用可选参数,可以输入更多选项,例如minted language=<something>
或listing option=<something>
。
编辑:第二种解决方案是我的第一个解决方案与 Marco Daniel 的答案的组合:
\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{minted}
\newminted[mycsharp]{csharp}{tabsize=2,fontsize=\footnotesize}
\newminted[myjson]{js}{tabsize=2,fontsize=\footnotesize}
\newminted[myxml]{xml}{tabsize=2,fontsize=\footnotesize}
\newminted[myshell]{shell-session}{tabsize=2,fontsize=\footnotesize}
\newminted[mycode]{text}{tabsize=2,fontsize=\footnotesize}
\newtcolorbox[auto counter,number within=section,
list inside=mypyg]{mintedbox}[2][]{%
title={Listing \thetcbcounter: #2},
list entry={\protect\numberline{\thetcbcounter}#2},
enhanced,colframe=red!50!black,drop fuzzy shadow,#1}
\newenvironment{listingsbox}[3][]
{%
\def\listingsboxenvironment{#2}%save the environments
\VerbatimEnvironment%
\begin{mintedbox}[#1]{#3}%
\begin{\listingsboxenvironment}}%
{%
\end{\listingsboxenvironment}%
\end{mintedbox}%
}
\begin{document}
\section{Test}
\begin{listingsbox}{myshell}{A nice title}
[root@localhost ~]# vi /etc/sysconfig/network
\end{listingsbox}
\begin{listingsbox}{myshell}{Something else}
[root@localhost ~]# vi /etc/sysconfig/something
\end{listingsbox}
\begin{listingsbox}{myxml}{XML box}
<hello>World</hello>
\end{listingsbox}
\tcblistof{mypyg}{My Listings}
\end{document}
更新:的较新版本tcolorbox
已集成对 的支持minted
。因此,现在可以使用具有相同输出的更优雅的解决方案。我还添加了一个宏\mynewminted
,该宏创建 的样式tcolorbox
以及同名的minted
环境(如果其他地方需要的话)。
\documentclass{article}
\usepackage[many,minted]{tcolorbox}% version 3.03 or better
\newcommand{\mynewminted}[3]{%
\newminted[#1]{#2}{#3}%
\tcbset{myminted/#1/.style={minted language=#2,minted options={#3}}}}
\mynewminted{mycsharp}{csharp}{tabsize=2,fontsize=\footnotesize}
\mynewminted{myjson}{js}{tabsize=2,fontsize=\footnotesize}
\mynewminted{myxml}{xml}{tabsize=2,fontsize=\footnotesize}
\mynewminted{myshell}{shell-session}{tabsize=2,fontsize=\footnotesize}
\mynewminted{mycode}{text}{tabsize=2,fontsize=\footnotesize}
\newtcblisting[auto counter,number within=section,
list inside=mypyg]{listingsbox}[3][]{%
listing only,title={Listing \thetcbcounter: #3},
list entry={\protect\numberline{\thetcbcounter}#3},
enhanced,colframe=red!50!black,drop fuzzy shadow,myminted/#2,#1}
\begin{document}
\section{Test}
\begin{listingsbox}{myshell}{A nice title}
[root@localhost ~]# vi /etc/sysconfig/network
\end{listingsbox}
\begin{listingsbox}{myshell}{Something else}
[root@localhost ~]# vi /etc/sysconfig/something
\end{listingsbox}
\begin{listingsbox}{myxml}{XML box}
<hello>World</hello>
\end{listingsbox}
\tcblistof{mypyg}{My Listings}
\end{document}
答案2
这是针对您的要求的第一个建议。新环境listingsbox
有两个强制参数,其中第一个参数是预定义的铸造环境,第二个参数是标题:
\documentclass{article}
\usepackage{caption}
\usepackage{xcolor}
\usepackage[most]{tcolorbox}
\usepackage{minted}
\newminted[mycsharp]{csharp}{tabsize=2,fontsize=\footnotesize}
\newminted[myjson]{js}{tabsize=2,fontsize=\footnotesize}
\newminted[myxml]{xml}{tabsize=2,fontsize=\footnotesize}
\newminted[myshell]{shell-session}{tabsize=2,fontsize=\footnotesize}
\newminted[mycode]{text}{tabsize=2,fontsize=\footnotesize}
\tcbset{
texexp/.style={colframe=red!50!yellow!50!black, colback=red!50!yellow!5!white,
coltitle=red!50!yellow!3!white,
fonttitle=\small\sffamily\bfseries, fontupper=\small, fontlower=\small}, example/.style 2 args={texexp,
title={Example \refstepcounter{texexp}\label{#2}\thetexexp: #1}},
}
\newenvironment{listingsbox}[2]
{%
\def\listingsboxenvironment{#1}%save the environments
\captionsetup{skip=0pt,font={color=white}}%
\VerbatimEnvironment%
\begin{tcolorbox}[title=\captionof{listing}{#2}]%
\begin{\listingsboxenvironment}}%
{%
\end{\listingsboxenvironment}%
\end{tcolorbox}%
}
\begin{document}
\begin{listingsbox}{myshell}{A nice title}
[root@localhost ~]# vi /etc/sysconfig/network
\end{listingsbox}
\end{document}