作成された環境に従うとエラーが発生する

作成された環境に従うとエラーが発生する

次のコードを考えてみましょう。

\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

パッケージは、その逐語的環境のために内部で パッケージをminted使用しており(たとえば、マニュアルの 13 ページを参照)、代わりにそのパッケージを使用すると、エラーがすでに発生しています (また、エラー メッセージにあるように、エラーは実際には によって発行されており、 自体によって発行されているわけではないため、ドキュメントに記載されていないのだと思います)。次のコードでも同じエラーが発生します。fancyvrbmintedFancyVerbmintedminted

\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@BadEndErrorfancyvrb ソース コードの次の行を呼び出します。

\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の内容を確認することでテストできます。これには空白文字が含まれていません)。\@tempbfancyvrb

関連情報