Bearbeiten

Bearbeiten

Eine Möglichkeit zum Hinzufügen von Überschriften zu Codelisten besteht in der folgenden:

\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}

IchnichtIch möchte, dass mein codelistingElement ein Float ist, da ich bei sehr langen Auflistungen einen Seitenumbruch sicherstellen möchte.

Ich habe Folgendes versucht:

\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}

Aber ich habe eine Fehlermeldung erhalten:

LaTeX-Fehler: Kein Zähler „Listing“ definiert.

Wie kann ich in LaTeX Beschriftungen auf Nicht-Float-Elemente anwenden, insbesondere auf Auflistungen, die die Pakete fancyvrbund verwenden fvextra?

Bearbeiten

Als Antwort auf den Kommentar von @Skillmon. Pandoc ist nicht \labelin eingebettet \caption, daher habe ich Folgendes versucht:

\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}

Dies wird zwar kompiliert, aber der Verweis wird nicht aufgelöst, wie das folgende Bild zeigt:

Bildbeschreibung hier eingeben

Antwort1

\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}

Antwort2

Da Sie anscheinend nicht in der Lage sind, das zu tun, was in einem Kommentar vorgeschlagen wird, finden Sie hier eine Antwort, die das tut, was in meinem Kommentar vorgeschlagen wurde:

\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}

Hier ist eine Version mit korrektem Abstand (ich habe nicht geprüft, ob der Abstand beim Verschachteln \VerbatimInputusw. korrekt ist):

\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}

Ergebnis mit Label und Ref


Alternative Eingabe, um die obige Ausgabe ohne \labelVerschachtelung zu erhalten \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}

Die Ausgabe sieht identisch aus (beachten Sie jedoch, dass die optimale Eingabesyntax mit \labelverschachteltem obligatorischen Argument von ist \caption– es gibt Grenzfälle, in denen die Ausgabe möglicherweise nicht identisch aussieht).

verwandte Informationen