我利用我的上一个问题问这个问题,因为从现在开始我想尽可能多地实现我的环境,但我还没有找到有关这个问题主题的信息,而且这个问题的目标与链接的问题不一样。
我使用该minted
包在文档中突出显示我的代码,它使用语法:\begin{minted}[<options>]{<language used>}
,从上面链接的问题中我得到了下面的代码。这是一个由埃格尔,它将代码背景绘制到最长的代码行,因为默认情况下minted
将背景绘制到\textwidth
。
未经修改的代码:
\documentclass{article}
\usepackage{minted}
\usemintedstyle[c++]{manni}
\usepackage{xcolor}
\definecolor{codebackground}{RGB}{240, 240, 235}
\begin{document}
\begin{minted}[bgcolor=codebackground]{c}
int main() {
printf("hello, world");
return 0;
}
\end{minted}
\end{document}
经过修改的代码(所需的代码):
\documentclass{article}
\usepackage{minted}
\usemintedstyle[c++]{manni}
\usepackage{xcolor}
\definecolor{codebackground}{RGB}{240, 240, 235}
\newsavebox{\mintedbox}
\newenvironment{boxminted}
{%
\VerbatimEnvironment
\RecustomVerbatimEnvironment{Verbatim}{BVerbatim}{}%
\begin{lrbox}{\mintedbox}
\begin{minted}%
}
{%
\end{minted}%
\end{lrbox}%
\noindent\colorbox{codebackground}{\usebox{\mintedbox}}%
}
\begin{document}
\begin{boxminted}{c}
int main() {
printf("hello, world");
return 0;
}
\end{boxminted}
\end{document}
问题是:如何\newenvironment
修改代码以使用\begin{boxminted}[<options>]{<language used>}
,并将其传递<options>
给minted
新环境中使用的环境?例如,作为选项传递,[linenos = true]
该选项在行代码的左侧设置代码行号。
答案1
来自手册fancyvrb
(由包使用minted
):
4.2.2 BVerbatim 环境
此环境将逐字材料放入 TeX 框中。某些参数在此环境中不起作用(尤其是框架参数),但有两个新参数可用:[...]
因此 的不兼容性linenos
源于 的使用\RecustomVerbatimEnvironment{Verbatim}{BVerbatim}{}
,不幸的是,这对于获取内容的正确宽度是必需的。因此,在这种情况下,行号不可用。(不过,有人可能会编写一个肮脏的黑客程序,自己测量框的高度并将行号放在左侧)。
编辑:下面介绍了一种获取行号的 hack 方法。不确定它的效果如何,到目前为止,我尝试过的小测试似乎有效。使用boxminted*
而不是boxminted
来获取行号:
\documentclass{article}
\usepackage{expl3}
\usepackage{minted}
\usemintedstyle[c++]{manni}
\usepackage{xcolor}
\definecolor{codebackground}{RGB}{240, 240, 235}
\newsavebox{\mintedbox}
\newenvironment{boxminted}
{%
\VerbatimEnvironment
\RecustomVerbatimEnvironment{Verbatim}{BVerbatim}{}%
\begin{lrbox}{\mintedbox}
\begin{minted}%
}
{%
\end{minted}%
\end{lrbox}%
\noindent\colorbox{codebackground}{\usebox{\mintedbox}}%
\typeout{Guessed lines:}
}
\ExplSyntaxOn
\int_new:N \l__martin_lino_int
\newenvironment{boxminted*}
{%
\VerbatimEnvironment
\RecustomVerbatimEnvironment{Verbatim}{BVerbatim}{}%
\begin{lrbox}{\mintedbox}
\begin{minted}%
}
{%
\end{minted}%
\end{lrbox}%
\noindent
\int_set:Nn \l__martin_lino_int
{ \fp_to_int:n { \ht\mintedbox/\baselineskip } }
\llap
{
\begin{tabular}[b]{@{}r@{}}
\int_step_function:nN { \l__martin_lino_int } \__martin_line:n
\end{tabular}\hskip1.1em
}
\noindent\colorbox{codebackground}{\usebox{\mintedbox}}%
}
\cs_new:Npn \__martin_line:n #1 { \tiny #1 \\ }
\ExplSyntaxOff
\begin{document}
\begin{boxminted*}[linenos=true]{c}
int main() {
printf("hello, world");
return 0;
printf("hello, world");
printf("hello, world");
return 0;
return 0;
}
\end{boxminted*}
\begin{minted}[linenos=true]{c}
int main() {
printf("hello, world");
return 0;
printf("hello, world");
printf("hello, world");
return 0;
return 0;
printf("hello, world");
return 0;
printf("hello, world");
printf("hello, world");
return 0;
return 0;
}
\end{minted}
\end{document}