使用 NewTCBListing 和 RenewDocumentEnvironment 破解“minted”定义

使用 NewTCBListing 和 RenewDocumentEnvironment 破解“minted”定义

我和一位同事正在尝试黑客minted通过将原始含义分配给oldminted使用来重新定义环境\NewEnvironmentCopy,然后在使用 重新定义 minted 时使用此保存的版本,并使用 附加参数\RenewDocumentEnvironment。不幸的是,它现在不起作用。

我们知道可以直接使用 LaTeX 来编辑 的布局minted,例如使用tcolorbox等。这种黑客攻击的动机是欺骗另一种标记语言 org-mode(我们通过 LaTeX 将其导出为 PDF),使其“假定”它使用正常环境minted,这样我们就可以minted在后端根据需要定制更新的环境,之后就可以简单地#+begin_src在不同的文档中使用常规块,而无需在每个文件/会话/文件夹的基础上进行进一步的定制。

以下是 MWE:

\documentclass[11pt]{article}
\usepackage{minted}
\usepackage{hyperref}

% With the following lines uncommented, its not working
% \NewEnvironmentCopy{oldminted}{minted}
% \RenewDocumentEnvironment{minted}{O{}m}{\begin{oldminted}[#1]{#2}}{\end{oldminted}}

\author{Jane Doe}
\date{\today}
\title{testfile}

\begin{document}
\begin{minted}[]{latex}
\setlength{\baselineskip}{2ex}
\end{minted}
\end{document}

运行latexmk -f -lualatex -shell-escape -file-line-error -interaction=nonstopmode file.tex会出现以下错误信息:

Runaway argument?
! File ended while scanning use of \FancyVerbGetLine.
<inserted text> 
\par 
<*> file.tex
              
! Emergency stop.
<*> file.tex

我们猜测这可能与“重命名”有关,但目前还无法弄清楚。由于\NewEnvironmentCopy它真的很新,可能缺乏全面的文档,或者我到目前为止还没有找到它。


编辑

实际用例更加复杂。我们需要一个精心设计的环境来突出显示使用\NewTCBListingtcolorbox包创建的源代码。

这种解决方法背后的想法是,可以使用常规组织模式源块,例如:

#+begin_src latex
  \setlength{\parindent}{0pt}
#+end_src

具有 Org-Mode 中文学编程的所有优点(如缠结、运行代码、打印结果),同时如果通过 Latex 导出为 pdf,则可以以精细的样式打印源代码块。

以下是简化的 MWE \NewTCBListing

\documentclass[11pt]{article}
\usepackage{fontspec}
\usepackage[minted]{tcolorbox}
\usepackage{minted}
\usepackage{hyperref}
\parindent=0pt
\NewTCBListing{org-src-block}{om}{%
  fonttitle=\bfseries,
  listing only,
  listing engine=minted,
  minted language=#2}

\begin{document}

A block \LaTeX Code:

\begin{minted}[]{latex}
\setlength{\baselineskip}{2ex}
\end{minted}

A block \texttt{Bash} Code:

\begin{minted}[,linenos=true]{bash}
for file in array; do
    cp $file -t /home/ && echo "done"
done
\end{minted}

\end{document}

由于更改组织自己的导出例程非常复杂,@egreg 的答案似乎是解决方案!我自己的重新定义否则的方法从一开始就是错误的,因为它本身就被使用minted了。\RenewTCBListingmintedtcolorbox

此外,我不明白如何用 tcb 重新定义最初在另一个包中定义的环境...只是为了理解,我很感激任何提示这是如何可能的。

答案1

更新

看到您的编辑后,评论是“D'oh!”。

\documentclass[11pt]{article}
\usepackage{fontspec}
\usepackage[minted]{tcolorbox}
\usepackage{minted}
\usepackage{hyperref}

\setminted{numbersep=18pt}

\RenewTCBListing{minted}{O{}m}{%
  fonttitle=\bfseries,
  listing only,
  listing engine=minted,
  minted language=#2,
  minted options={#1},
}

\begin{document}

A block \LaTeX Code:

\begin{minted}{latex}
\setlength{\baselineskip}{2ex}
\end{minted}

A block \texttt{Bash} Code:

\begin{minted}[linenos]{bash}
for file in array; do
    cp $file -t /home/ && echo "done"
done
\end{minted}

\end{document}

只需重新定义minted,就这么简单!

在此处输入图片描述

原始答案

不确定您想如何重新定义minted,但以下方法有效:

\documentclass[11pt]{article}
\usepackage{minted}
\usepackage{hyperref}

\NewEnvironmentCopy{oldminted}{minted}
\RenewDocumentEnvironment{minted}{}{%
  \VerbatimEnvironment\begin{oldminted}%
}{\end{oldminted}}

\author{Jane Doe}
\date{\today}
\title{testfile}

\begin{document}
\begin{minted}[]{latex}
\setlength{\baselineskip}{2ex}
\end{minted}
\end{document}

参数的解析应该留给\begin{oldminted},所以\begin{oldminted}必须是“开始”部分的最后一项。也是\VerbatimEnvironment第一项。

相关内容