
Una forma de agregar títulos a los listados de códigos es la siguiente:
\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}
Sin embargo, lo hagonoQuiero que mi codelisting
elemento sea flotante porque quiero garantizar el salto de página para listados muy largos.
Intenté lo siguiente:
\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}
Pero recibí un error:
Error de LaTeX: No hay ningún 'listado' de contador definido.
¿Cómo puedo aplicar subtítulos a elementos no flotantes en LaTeX? ¿específicamente listados que utilizan los paquetes fancyvrb
y fvextra
?
Editar
En respuesta al comentario de @Skillmon. Pandoc no se anida \label
dentro \caption
, así que lo que probé es lo siguiente:
\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}
Lo cual se compila, pero la referencia no se resuelve como muestra la siguiente imagen:
Respuesta1
\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}
Respuesta2
Como parece que no puede hacer lo que sugiere un comentario, aquí hay una respuesta que hace lo que sugiere mi comentario:
\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}
Aquí hay una versión con el espaciado correcto (no verificó si el espaciado es correcto si anida, \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 obtener la salida anterior sin \label
el interior anidado \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}
La salida parece idéntica (pero tenga en cuenta que la sintaxis de entrada óptima está \label
anidada en el argumento obligatorio de \caption
; hay casos límite en los que la salida puede no parecer idéntica).