Considere o seguinte código:
\documentclass{article}
\usepackage{minted}
\begin{document}
\begin{minted}{python}
a = 0
\end{minted} % this comment is a problem
\end{document}
Causa o seguinte erro:
! FancyVerb Error:
Extraneous input ` % this comment is a problem\end{}' between \end{minted} and line end
Mover o comentário para a próxima linha resolve o erro. Parece que nada, exceto espaços, pode estar na mesma linha após um \end{minted}
. Este também é o caso de ambientes definidos por \newminted
. Um verbatim
ambiente, por outro lado, não parece ter problemas com o código seguindo na mesma linha.
Não vi esse comportamento sendo descrito na documentação cunhada.
Alguém pode explicar qual é o problema de nada seguir \end{minted}
na mesma linha?
Responder1
O minted
pacote usa o fancyvrb
pacote por baixo do capô para seus ambientes literais (veja a página 13 do minted
manual, por exemplo), e o erro já está presente quando você usa esse pacote (também, como diz a mensagem de erro, ele é realmente fornecido por FancyVerb
, não minted
por si mesmo; portanto, por que não está na minted
documentação, eu acho). Este código produzirá o mesmo erro:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}
This is verbatim code
\end{Verbatim}%
\end{document}
Se quisermos rastrear as origens do erro:
O ambiente Verbatim verifica seu conteúdo linha por linha, consulte a seção 12.10 da fancyvrb
documentação,Digitalização linha por linha. E, de facto, é aqui que encontramos a definição deste erro. \FV@BadEndError
, lançado pelo comando apropriadamente nomeado \FancyVerbGetLine
.
O \FancyVerbGetLine
comando chama \FV@BadEndError
esta linha no código-fonte do fancyvrb:
\ifx\@tempa\FV@EnvironName% % True if end is found
\ifx\@tempb\FV@@@CheckEnd\else\FV@BadEndError\fi%
Seguindo isso mais atrás, chegamos à seção12.9 Fim da verificaçãono manual do fancyvrb, onde diz:
Temos que verificar o argumento do primeiro
\end{}
em cada linha, compará-lo com\FV@EnvironName
e retornar\iftrue
se corresponder e\iffalse
caso contrário.
O problema é que neste momento \@tempb
deveria ser \end{}
, mas em vez disso é agora %\end{}
. Assim, o segundo \ifx
é false
e o erro é lançado ( \@tempa
da linha anterior é Verbatim
aliás).
No final, issoquaseequivale a uma comparação direta de strings, pelo menos até onde eu sei (não apenas fancyvrb
testa o \end{}
argumento de an, mas também testa se não há mais nada nessa linha), com a pequena exceção de ignorar os espaços em branco em a linha: Isso realmente é eliminado, não atrapalhando \ifx
(pode ser testado observando o conteúdo de \@tempb
se você hackear fancyvrb
um pouco o código-fonte para gerar isso; ele não contém espaços).