Considere el siguiente código:
\documentclass{article}
\usepackage{minted}
\begin{document}
\begin{minted}{python}
a = 0
\end{minted} % this comment is a problem
\end{document}
Provoca el siguiente error:
! FancyVerb Error:
Extraneous input ` % this comment is a problem\end{}' between \end{minted} and line end
Mover el comentario a la siguiente línea resuelve el error. Parece que nada excepto espacios puede estar en la misma línea después de un archivo \end{minted}
. Este también es el caso de los entornos definidos por \newminted
. Por otro lado, un verbatim
entorno no parece tener problemas con el código que sigue en la misma línea.
No he visto que este comportamiento se describa en la documentación acuñada.
¿Alguien puede explicar cuál es el problema de que nada puede seguir \end{minted}
la misma línea?
Respuesta1
El minted
paquete usa el fancyvrb
paquete subyacente para sus entornos textuales (consulte la página 13 del minted
manual, por ejemplo), y el error ya está presente cuando usa ese paquete en su lugar (además, como dice el mensaje de error, en realidad se proporciona realizado por FancyVerb
, no por sí mismo; por eso creo minted
que no está en la documentación). minted
Este código producirá el mismo error:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}
This is verbatim code
\end{Verbatim}%
\end{document}
Si deseamos rastrear los orígenes del error:
El entorno Verbatim escanea su contenido línea por línea, consulte la sección 12.10 de la fancyvrb
documentación,Escaneo línea por línea. Y efectivamente, aquí es donde nos encontramos con la definición de este error. \FV@BadEndError
, lanzado por el \FancyVerbGetLine
comando con el nombre adecuado.
El \FancyVerbGetLine
comando llama \FV@BadEndError
a esta línea en el código fuente de fancyvrb:
\ifx\@tempa\FV@EnvironName% % True if end is found
\ifx\@tempb\FV@@@CheckEnd\else\FV@BadEndError\fi%
Siguiendo esto más atrás, llegamos a la sección12.9 Final de verificaciónen el manual de fancyvrb, donde dice:
Tenemos que verificar el argumento del primero
\end{}
en cada línea, compararlo con\FV@EnvironName
y devolver\iftrue
si coincide y\iffalse
en caso contrario.
El problema es que a estas alturas \@tempb
debería serlo \end{}
, pero en cambio es ahora %\end{}
. Por lo tanto, el segundo \ifx
es false
y se arroja el error ( \@tempa
de la línea anterior es, Verbatim
por cierto).
Al final, estocasiequivale a una comparación directa de cadenas, al menos hasta donde yo sé (no solo prueba fancyvrb
el \end{}
argumento de un, sino que también prueba si no hay nada más en esa línea), con la pequeña excepción de ignorar los espacios en blanco en la línea: Eso de hecho se elimina, por lo que no se activa \ifx
(se puede probar mirando el contenido de \@tempb
si piratea fancyvrb
un poco el código fuente para generarlo; no contiene espacios).