Sachen, die der geprägten Umgebung folgen, verursachen Fehler

Sachen, die der geprägten Umgebung folgen, verursachen Fehler

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 verbatimUmgebung 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 mintedPaket verwendet das fancyvrbPaket im Hintergrund für seine Verbatim-Umgebungen (siehe mintedbeispielsweise 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 mintedvon sich selbst; daher steht es mintedmeiner 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 fancyvrbDokumentation.Zeilenweises Scannen. Und tatsächlich stoßen wir hier auf die Definition dieses Fehlers, der \FV@BadEndErrordurch den treffend benannten \FancyVerbGetLineBefehl ausgelöst wird.

Der \FancyVerbGetLineBefehl ruft \FV@BadEndErrordiese 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@EnvironNameund zurückgeben, \iftruewenn es übereinstimmt und \iffalseandernfalls.

Das Problem besteht darin, dass an dieser Stelle \@tempbstehen sollte \end{}, stattdessen aber jetzt steht %\end{}. Somit \ifxist das zweite falseund der Fehler wird ausgegeben ( \@tempaaus 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 fancyvrbein '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 \@tempbhackt, um dies auszugeben; es enthält keine Leerzeichen).fancyvrb

verwandte Informationen