cosas que siguen al entorno acuñado provocan un error

cosas que siguen al entorno acuñado provocan un error

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 verbatimentorno 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 mintedpaquete usa el fancyvrbpaquete subyacente para sus entornos textuales (consulte la página 13 del mintedmanual, 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 mintedque no está en la documentación). mintedEste 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 fancyvrbdocumentació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 \FancyVerbGetLinecomando con el nombre adecuado.

El \FancyVerbGetLinecomando llama \FV@BadEndErrora 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@EnvironNamey devolver \iftruesi coincide y \iffalseen caso contrario.

El problema es que a estas alturas \@tempbdebería serlo \end{}, pero en cambio es ahora %\end{}. Por lo tanto, el segundo \ifxes falsey se arroja el error ( \@tempade la línea anterior es, Verbatimpor cierto).

Al final, estocasiequivale a una comparación directa de cadenas, al menos hasta donde yo sé (no solo prueba fancyvrbel \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 \@tempbsi piratea fancyvrbun poco el código fuente para generarlo; no contiene espacios).

información relacionada