考慮以下程式碼:
\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}
同一行上的 a 後面不能有任何內容?
答案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
btw。)。
最後,這幾乎相當於一個直接的字串比較,至少據我所知(不僅測試fancyvrb
' \end{}
s 參數,而且還測試該行上是否沒有其他內容),除了忽略空格之外該行:確實被剝奪了,因此不會絆倒\ifx
(可以透過查看內容進行測試,\@tempb
如果您fancyvrb
稍微修改原始程式碼以輸出該內容;它不包含空格)。