将选项作为参数传递给 \newenvironment 内的环境

将选项作为参数传递给 \newenvironment 内的环境

我利用我的上一个问题问这个问题,因为从现在开始我想尽可能多地实现我的环境,但我还没有找到有关这个问题主题的信息,而且这个问题的目标与链接的问题不一样。

我使用该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}

在此处输入图片描述

相关内容