Betrachten Sie den folgenden Code:
\documentclass{article}
\usepackage{minted}
\begin{document}
\begin{minted}{python}
a = 0
\end{minted} % this comment is a problem
\end{document}
Es tritt der folgende Fehler auf:
! FancyVerb Error:
Extraneous input ` % this comment is a problem\end{}' between \end{minted} and line end
Das Verschieben des Kommentars in die nächste Zeile behebt den Fehler. Es scheint, dass nach einem nichts außer Leerzeichen in derselben Zeile stehen darf \end{minted}
. Dies ist auch bei Umgebungen der Fall, die durch definiert sind \newminted
. Eine verbatim
Umgebung scheint dagegen kein Problem mit Code zu haben, der in derselben Zeile folgt.
Ich habe dieses Verhalten in der erstellten Dokumentation nicht beschrieben gesehen.
\end{minted}
Kann mir jemand erklären, wo das Problem liegt, dass auf eine Zeile nichts folgen kann ?
Antwort1
Das minted
Paket verwendet das fancyvrb
Paket im Hintergrund für seine Verbatim-Umgebungen (siehe minted
beispielsweise S. 13 im Handbuch) und der Fehler ist bereits vorhanden, wenn Sie stattdessen dieses Paket verwenden (und wie die Fehlermeldung besagt, wird es tatsächlich von ausgegeben FancyVerb
, nicht minted
von sich selbst; daher steht es minted
meiner Meinung nach nicht in der Dokumentation). Dieser Code erzeugt denselben Fehler:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}
This is verbatim code
\end{Verbatim}%
\end{document}
Wenn wir den Ursprung des Fehlers ermitteln möchten:
Die Verbatim-Umgebung durchsucht den Inhalt zeilenweise, siehe Abschnitt 12.10 der fancyvrb
Dokumentation.Zeilenweises Scannen. Und tatsächlich stoßen wir hier auf die Definition dieses Fehlers, der \FV@BadEndError
durch den treffend benannten \FancyVerbGetLine
Befehl ausgelöst wird.
Der \FancyVerbGetLine
Befehl ruft \FV@BadEndError
diese Zeile im Fancyvrb-Quellcode auf:
\ifx\@tempa\FV@EnvironName% % True if end is found
\ifx\@tempb\FV@@@CheckEnd\else\FV@BadEndError\fi%
Wenn wir dies weiter zurückverfolgen, gelangen wir zum Abschnitt12.9 Ende prüfenim Fancyvrb-Handbuch, wo es heißt:
Wir müssen das Argument des ersten
\end{}
in jeder Zeile überprüfen, es mit vergleichen\FV@EnvironName
und zurückgeben,\iftrue
wenn es übereinstimmt und\iffalse
andernfalls.
Das Problem besteht darin, dass an dieser Stelle \@tempb
stehen sollte \end{}
, stattdessen aber jetzt steht %\end{}
. Somit \ifx
ist das zweite false
und der Fehler wird ausgegeben ( \@tempa
aus der vorherigen Zeile ist Verbatim
übrigens).
Am Ende ist diesfastläuft auf einen direkten Zeichenfolgenvergleich hinaus, zumindest soweit ich das beurteilen kann (prüft nicht nur, ob fancyvrb
ein 's-Argument vorliegt \end{}
, sondern auch, ob die Zeile nichts anderes enthält), mit der kleinen Ausnahme, dass Leerzeichen in der Zeile ignoriert werden: Diese werden tatsächlich entfernt, sodass es nicht zu einem Aussetzer kommt \ifx
(kann getestet werden, indem man sich den Inhalt von ansieht, wenn man den Quellcode ein wenig \@tempb
hackt, um dies auszugeben; es enthält keine Leerzeichen).fancyvrb