我想使用catchfilebetweentags
包从源文件中获取代码片段并使用minted
来突出显示它们。
想象一下,我有以下内容program.scala
:
//<a
def someFunctionA = {
// some code
}
//a>
def aFunctionIDontCareAbout = {
// irrelevant stuff
}
//<b
def someFunctionB = {
// important code!
}
//b>
以及以下 LaTeX 文档:
\documentclass{article}
\usepackage{minted}
\usepackage{catchfilebetweentags}
\begin{document}
% Nicely formatted snippet:
\begin{minted}{scala}
def someNicelyHighlightedFunction = {
// not from the file
}
\end{minted}
% Expanding, but unformatted snippet:
\CatchFileBetweenDelims{\a}{program.scala}{<a}{//a>}
\a
% Non-expanding snippet inside minted environment:
\CatchFileBetweenDelims{\b}{program.scala}{<b}{//b>}
\begin{minted}{scala}
\b
\end{minted}
\end{document}
有什么方法可以让我\b
扩展verbatim
所使用的环境内部minted
?
(我没有承诺catchfilebetweentags
或minted
特别承诺,但我确实需要皮格门特斯突出显示提取的代码片段。
答案1
catchfilebetweentags
使用 catcode 会变得很棘手。由于您已经fancyvrb
加载、启用\write18
(shell 转义)并且拥有 Python(使用 Pygments),我建议使用纯 Python 解决方案。这是为不需要通过 LaTeX 或 Python 转义的标签设计的,尽管它可以进行调整。
基本思路是使用fancyvrb
创建VerbatimOut
一个 Python 脚本,该脚本将读取您的代码并将相关部分保存在临时文件中。此脚本通过 自动执行\write18
。然后通过 读取临时minted
文件\inputminted
。
\documentclass{article}
\usepackage{minted}
\begin{VerbatimOut}{minted_delim.py}
import sys
codefile = sys.argv[1]
delim1 = sys.argv[2]
delim2 = sys.argv[3]
f = open(codefile)
code = f.read()
f.close()
f = open(codefile + '.snippet', 'w')
try:
f.write(code.split(delim1, 1)[1].split(delim2, 1)[0])
except:
f.write('MINTED DELIM ERROR')
f.close()
\end{VerbatimOut}
\newcommand{\inputmintedbetweendelims}[5][]{%
\immediate\write18{python minted_delim.py "#3" "#4" "#5"}%
\inputminted[#1]{#2}{#3.snippet}%
}
\begin{document}
\begin{minted}{scala}
def someNicelyHighlightedFunction = {
// not from the file
}
\end{minted}
\inputmintedbetweendelims{scala}{program.scala}{<b}{//b>}
\end{document}