次のコードを考えてみましょう。
\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
使用しており(たとえば、マニュアルの 13 ページを参照)、代わりにそのパッケージを使用すると、エラーがすでに発生しています (また、エラー メッセージにあるように、エラーは実際には によって発行されており、 自体によって発行されているわけではないため、ドキュメントに記載されていないのだと思います)。次のコードでも同じエラーが発生します。fancyvrb
minted
FancyVerb
minted
minted
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}
This is verbatim code
\end{Verbatim}%
\end{document}
エラーの原因を突き止めたい場合:
Verbatim環境は内容を1行ずつスキャンします。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{}
。したがって、2 番目\ifx
は となりfalse
、エラーがスローされます (ちなみに\@tempa
、前の行の は ですVerbatim
)。
結局、これはほとんどは、少なくとも私が知る限りでは、単純な文字列比較に相当します (は の引数fancyvrb
をテストする\end{}
だけでなく、その行に他に何もないかどうかもテストします)。ただし、行の空白文字は無視されます。これは確かに削除されるため、 に支障をきたすことはありません(ソース コードを少しハックして を出力すると、\ifx
の内容を確認することでテストできます。これには空白文字が含まれていません)。\@tempb
fancyvrb