
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 codelisting
elemento 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 fancyvrb
e fvextra
?
Editar
Em resposta ao comentário de @Skillmon. Pandoc não se aninha \label
dentro \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:
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 \VerbatimInput
etc.):
\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}
Entrada alternativa para obter a saída acima sem \label
aninhamento 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á \label
aninhada no argumento obrigatório de \caption
- há casos extremos em que a saída pode não parecer idêntica).