考虑以下代码:
\documentclass{article}
\usepackage{minted}
\begin{document}
\begin{minted}{python}
a = 0
\end{minted} % this comment is a problem
\end{document}
这会导致以下错误:
! FancyVerb Error:
Extraneous input ` % this comment is a problem\end{}' between \end{minted} and line end
将注释移到下一行可以解决错误。看起来,除了空格之外, 后面的同一行可能没有任何内容\end{minted}
。 定义的环境也是如此\newminted
。verbatim
另一方面, 似乎在同一行上跟随着代码没有问题。
我还没有在铸造的文档中看到对这种行为的描述。
有人能解释一下什么都不能跟\end{minted}
在同一行上是什么问题吗?
答案1
该minted
包fancyvrb
在底层使用 包作为其逐字环境(minted
例如,参见手册中的第 13 页),并且当您使用该包时,错误已经存在(而且,正如错误消息所说,它实际上是由 给出的FancyVerb
,而不是minted
它自己给出的;因此我认为它不在文档中minted
)。此代码将产生相同的错误:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}
This is verbatim code
\end{Verbatim}%
\end{document}
如果我们想追溯错误的根源:
Verbatim 环境逐行扫描其内容,请参阅fancyvrb
文档的第 12.10 节,逐行扫描。事实上,这就是我们遇到此错误的定义的地方。\FV@BadEndError
,由恰当命名的\FancyVerbGetLine
命令抛出。
该\FancyVerbGetLine
命令\FV@BadEndError
在 fancyvrb 源代码中调用此行:
\ifx\@tempa\FV@EnvironName% % True if end is found
\ifx\@tempb\FV@@@CheckEnd\else\FV@BadEndError\fi%
继续追溯,我们来到了12.9 检查结束在 fancyvrb 手册中,其中提到:
\end{}
我们必须检查每一行第一个参数,\FV@EnvironName
并将其与进行比较,\iftrue
如果匹配则返回,\iffalse
否则返回。
问题是此时\@tempb
应该是\end{}
,但现在却是%\end{}
。因此,第二个\ifx
是false
,并抛出了错误(顺便说一下\@tempa
,上一行是Verbatim
)。
最后,这几乎至少据我所知,这相当于直接的字符串比较(不仅测试fancyvrb
的\end{}
参数,还测试该行上是否没有其他内容),略微不同的是忽略了行上的空格:这确实会被剥离,从而不会绊倒\ifx
(可以通过查看内容进行测试,\@tempb
如果您fancyvrb
稍微破解源代码以输出它;它不包含空格)。