遵循铸造环境的东西会导致错误

遵循铸造环境的东西会导致错误

考虑以下代码:

\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}。 定义的环境也是如此\newmintedverbatim另一方面, 似乎在同一行上跟随着代码没有问题。

我还没有在铸造的文档中看到对这种行为的描述。

有人能解释一下什么都不能跟\end{minted}在同一行上是什么问题吗?

答案1

mintedfancyvrb在底层使用 包作为其逐字环境(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{}。因此,第二个\ifxfalse,并抛出了错误(顺便说一下\@tempa,上一行是Verbatim)。

最后,这几乎至少据我所知,这相当于直接的字符串比较(不仅测试fancyvrb\end{}参数,还测试该行上是否没有其他内容),略微不同的是忽略了行上的空格:这确实会被剥离,从而不会绊倒\ifx(可以通过查看内容进行测试,\@tempb如果您fancyvrb稍微破解源代码以输出它;它不包含空格)。

相关内容