coisas seguindo o ambiente cunhado causam erro

coisas seguindo o ambiente cunhado causam erro

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 verbatimambiente, 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 mintedpacote usa o fancyvrbpacote por baixo do capô para seus ambientes literais (veja a página 13 do mintedmanual, 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 mintedpor si mesmo; portanto, por que não está na minteddocumentaçã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 fancyvrbdocumentaçã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 \FancyVerbGetLinecomando chama \FV@BadEndErroresta 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@EnvironNamee retornar \iftruese corresponder e \iffalsecaso contrário.

O problema é que neste momento \@tempbdeveria ser \end{}, mas em vez disso é agora %\end{}. Assim, o segundo \ifxé falsee o erro é lançado ( \@tempada linha anterior é Verbatimaliás).

No final, issoquaseequivale a uma comparação direta de strings, pelo menos até onde eu sei (não apenas fancyvrbtesta 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 \@tempbse você hackear fancyvrbum pouco o código-fonte para gerar isso; ele não contém espaços).

informação relacionada