围绕铸造环境的盒子

围绕铸造环境的盒子

我正在使用 minted 包来生成美观的 Java 代码,但我想在代码周围加一个框,以便更容易将代码与文档的其余部分分开。

做到这一点最简单的方法是什么?

这是我的文档的一个示例。我希望 Java 代码位于框内。

在此处输入图片描述


感谢您的建议。Torbjørn T 的解决方案似乎很完美,但我的一些代码对于边距定义的正常宽度来说太宽了。minted 环境忽略了边距(我真的不能确定这是否是一件坏事),但 minted 生成的框架遵循边距规则。

是不是最好让框架忽略边距,或者让我的代码适合这个框(如果这些行只包含几个单词,可能会显得很愚蠢)?

在此处输入图片描述

答案1

正如 Torbjørn T. 所提到的,minted有一些选项可以添加框架。但是minted不做框架。这是由包完成的fancyvrb。框架的可能性fancyvrb是有限的。如果您想要圆角,您可以使用另一个包,如tcolorboxmdframed

下面的例子向您展示了 的用法tcolorbox。我正在利用 的优点在每个环境etoolbox周围添加一个框架。minted

\documentclass[a5paper]{article}
\usepackage[]{minted}
\usepackage{tcolorbox}
\usepackage{etoolbox}
\BeforeBeginEnvironment{minted}{\begin{tcolorbox}}%
\AfterEndEnvironment{minted}{\end{tcolorbox}}%
\begin{document}
\begin{minted}{latex}
%Preamble
\usepackage[]{minted}
\usepackage{tcolorbox}
\usepackage{etoolbox}
\BeforeBeginEnvironment{minted}%
     {\begin{tcolorbox}}%
\AfterEndEnvironment{minted}
   {\end{tcolorbox}}%
\end{minted}
\end{document}

在此处输入图片描述


编辑:如果您想要自动换行,fancyvrb可以使用以下命令。请注意,换行仅发生在空格处。换行符具有 形式的预挂钩$\rightarrow$。当然,您可以更改它。为了获得行前的符号,我使用了lineno

\documentclass[a5paper]{article}
%\pagestyle{empty}
\usepackage[T1]{fontenc}
\usepackage[]{minted}
\usepackage{tcolorbox}
\usepackage{lineno}
\def\gobble#1{}
\renewcommand\DeleteFile[1]{}
\usepackage{xparse}
\ExplSyntaxOn
\box_new:N \l_fvrb_box
\tl_new:N \l_fvrb_tl

\RenewDocumentCommand \FancyVerbFormatLine { m }
 {
   \hbox_set:Nn \l_fvrb_box { #1 }
    \dim_compare:nNnTF { \box_wd:N \l_fvrb_box }>{ \linewidth }
      {%box to big 
       \tl_set:Nn \l_fvrb_tl { #1 }
       \fvrb_use_tl:N \l_fvrb_tl
      } 
      {%box fits
       \box_use:N \l_fvrb_box
      }
 }

\cs_new:Npn \fvrb_use_tl:N  #1
 {
  \group_begin:
   \null\hfill\vbox_set:Nn \l_fvrb_box
     {\hsize=\linewidth
      \renewcommand\thelinenumber
           {
             \ifnum\value{linenumber}=1\relax\else
                  $\rightarrow$
             \fi
           }
      \begin{internallinenumbers}
        \advance\hsize by -2em
        \hspace*{-2em}\tl_use:N #1
      \end{internallinenumbers}
     }
   \box_use:N \l_fvrb_box
  \group_end:
}

\ExplSyntaxOff


\usepackage{etoolbox}
\BeforeBeginEnvironment{minted}{\begin{tcolorbox}}%
\AfterEndEnvironment{minted}{\end{tcolorbox}}%
\begin{document}
\begin{minted}{latex}
%Preamble
\usepackage[]{minted}
\usepackage[fancyvrb=true]{listings}
\usepackage{tcolorbox}
\usepackage{etoolbox}
\BeforeBeginEnvironment {minted} { \begin{tcolorbox} } \AfterEndEnvironment {minted} { \end{tcolorbox} }%
\usepackage{lipsum}
\end{minted}
\end{document}

在此处输入图片描述

答案2

参照手册第 9 页,您可以添加frame=single环境选项minted。有不同类型的框架,例如lines,它只在代码上方和下方放置线条。可以用指定厚度framerule=<length>,可以用设置框架和内容之间的距离framesep=<length>

您还可以使用 定义自定义环境\newminted{<language>}{<options>}

\documentclass{article}
\usepackage{minted}
\newminted{python}{frame=lines,framerule=2pt}

\begin{document}
Adding a frame for a single code listing:
\begin{minted}[frame=single,framesep=10pt]{python}
import antigravity
print 'Hello world'
\end{minted}

Using the custom listing:
\begin{pythoncode*}{}
import antigravity
print 'Hello world'
\end{pythoncode*}

\end{document}

在此处输入图片描述

答案3

如果你想使用\inputminted你可以在序言中放入以下内容来获取输出Marco Daniels 回答

\usepackage[]{minted}
\usepackage{xpatch}
\xpretocmd{\inputminted}{\begin{tcolorbox}}{}{}%
\xapptocmd{\inputminted}{\end{tcolorbox}}{}{}%

相关内容