结合 minted 和 tcolorbox

结合 minted 和 tcolorbox

我有想法与之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}

我在这里得到这个:

示例 #2

这很好,但不是我想要的。查看包文档后,tcolorbox我发现它支持标题:

示例 3

越来越好了。读了更多内容后,tcolorbox还支持自动编号标题和“列表”支持。不幸的是,文档中提供的示例不起作用,但这是另一个问题。

好的,现在我想要什么?

我想要类似的东西:

\begin{listingsbox}{myshell}{A nice title}
[root@localhost ~]# vi /etc/sysconfig/network
\end{listingsbox}

得到以下输出:

最后的例子

不幸的是我无法自己编写这个。我尝试使用\newenvironment宏,但在谷歌搜索后,发现将 minted 集成到新环境中并不容易。

有人可以帮我从这里出去吗?

答案1

我在 Windows 上设置mintedpygments 时遇到了一些麻烦,但现在似乎可以运行了。所以,这是我的第一篇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}

在此处输入图片描述

相关内容