Editar

Editar

Uma maneira de adicionar legendas às listagens de códigos é a seguinte:

\documentclass{article}

\usepackage{fancyvrb}
\usepackage{fvextra}
\usepackage{xcolor}
\usepackage{caption}
\usepackage{float}
\newfloat{codelisting}{h}{lop}
\floatname{codelisting}{Listing}
\captionsetup[subfloat]{margin=0.5em}

\begin{document}

\begin{codelisting}
\caption{test}
test
\end{codelisting}

\end{document}

No entanto, eu façonãoquero que meu codelistingelemento seja flutuante porque quero garantir a quebra de página para listagens muito longas.

Eu tentei o seguinte:

\documentclass{article}

\usepackage{fancyvrb}
\usepackage{fvextra}
\usepackage{xcolor}
\usepackage{caption}

\newenvironment{codelisting}{\captionsetup{type=listing}}{}

\begin{document}

\begin{codelisting}
\caption{test}
test
\end{codelisting}

\end{document}

Mas recebi um erro:

Erro LaTeX: Nenhuma 'listagem' de contador definida.

Como posso aplicar legendas a elementos não flutuantes no LaTeX? especificamente listagens usando os pacotes fancyvrbe fvextra?

Editar

Em resposta ao comentário de @Skillmon. Pandoc não se aninha \labeldentro \caption, então o que tentei foi o seguinte:

\documentclass{article}

\usepackage{fancyvrb}
\usepackage{fvextra}
\usepackage{xcolor}
\usepackage{float}
\usepackage{caption}

\newfloat{codelisting}{h}{lop}
\floatname{codelisting}{Listing}

\renewenvironment{codelisting}
    {\captionsetup{type=codelisting}}
    {}

\begin{document}

text pre
\begin{codelisting}
\label{test}
\caption{test}
\VerbatimInput[breaknonspaceingroup, breaklines, breakanywhere]{verbatim.py}
\end{codelisting}
text post
AS shown in Listing \ref{test}

\end{document}

Que compila, mas a referência não é resolvida como mostra a imagem abaixo:

insira a descrição da imagem aqui

Responder1

\documentclass{article}
\usepackage{fancyvrb}
\usepackage{fvextra}
\usepackage{xcolor}
\usepackage{float}
\usepackage{caption}
\newfloat{codelisting}{h}{lop}
\floatname{codelisting}{Listing}

\newenvironment{code}[2][]
  {\captionof{codelisting}{#2}\ifx\relax#1\relax\else\label{#1}\fi}
  {}

\begin{document}
    
\begin{code}{test}
        test
\end{code}
    
foo

\begin{code}[lst:1]{testA} % with label
    test
\end{code}

See Listing~\ref{lst:1}

\end{document}

Responder2

Como você parece incapaz de fazer o que um comentário sugere, aqui está uma resposta que faz o que meu comentário sugeriu:

\documentclass{article}
\usepackage{fancyvrb}
\usepackage{fvextra}
\usepackage{xcolor}
\usepackage{float}
\usepackage{caption}
\newfloat{codelisting}{h}{lop}
\floatname{codelisting}{Listing}

\renewenvironment{codelisting}
  {\captionsetup{type=codelisting}}
  {}

\begin{document}
text pre
\begin{codelisting}
  \caption{test}
  some code
\end{codelisting}
text post
\end{document}

Aqui está uma versão com espaçamento correto (não verifiquei se o espaçamento está correto se você aninhar \VerbatimInputetc.):

\documentclass{article}
\usepackage{fancyvrb}
\usepackage{fvextra}
\usepackage{xcolor}
\usepackage{float}
\usepackage{caption}
\newfloat{codelisting}{h}{lop}
\floatname{codelisting}{Listing}

\makeatletter
\renewenvironment{codelisting}
  {%
    \par
    \vspace*{\intextsep}% vertical spacing as a float
    \captionsetup{type=codelisting}%
  }
  {%
    \par
    \vspace*{\intextsep}% vertical spacing as a float
    \@endpetrue % following text is only indented if blank line after \end
  }
\makeatother

\begin{document}
text pre
\begin{codelisting}
  \caption{test\label{code:works}}
  some code
\end{codelisting}
text post \ref{code:works}
\end{document}

resultado com rótulo e ref


Entrada alternativa para obter a saída acima sem \labelaninhamento interno \caption:

\documentclass{article}
\usepackage{fancyvrb}
\usepackage{fvextra}
\usepackage{xcolor}
\usepackage{float}
\usepackage{caption}
\newfloat{codelisting}{h}{lop}
\floatname{codelisting}{Listing}

\makeatletter
\renewenvironment{codelisting}
  {%
    \par
    \vspace*{\intextsep}% vertical spacing as a float
    \captionsetup{type=codelisting}%
  }
  {%
    \par
    \vspace*{\intextsep}% vertical spacing as a float
    \@endpetrue % following text is only indented if blank line after \end
  }
\makeatother

\begin{document}
text pre
\begin{codelisting}
  \caption{test}
  \label{code:works}
  some code
\end{codelisting}
text post \ref{code:works}
\end{document}

A saída parece idêntica (mas observe que a sintaxe de entrada ideal está \labelaninhada no argumento obrigatório de \caption- há casos extremos em que a saída pode não parecer idêntica).

informação relacionada