我正在使用 minted 包来生成美观的 Java 代码,但我想在代码周围加一个框,以便更容易将代码与文档的其余部分分开。
做到这一点最简单的方法是什么?
这是我的文档的一个示例。我希望 Java 代码位于框内。
:
感谢您的建议。Torbjørn T 的解决方案似乎很完美,但我的一些代码对于边距定义的正常宽度来说太宽了。minted 环境忽略了边距(我真的不能确定这是否是一件坏事),但 minted 生成的框架遵循边距规则。
是不是最好让框架忽略边距,或者让我的代码适合这个框(如果这些行只包含几个单词,可能会显得很愚蠢)?
答案1
正如 Torbjørn T. 所提到的,minted
有一些选项可以添加框架。但是minted
不做框架。这是由包完成的fancyvrb
。框架的可能性fancyvrb
是有限的。如果您想要圆角,您可以使用另一个包,如tcolorbox
或mdframed
。
下面的例子向您展示了 的用法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}}{}{}%