Редактировать

Редактировать

Один из способов добавления подписей к листингам кодов:

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

Однако я делаюнетхочу, чтобы мой codelistingэлемент был плавающим, поскольку я хочу обеспечить разрыв страницы для очень длинных списков.

Я попробовал следующее:

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

Но у меня возникла ошибка:

Ошибка LaTeX: не определен счетчик «список».

Как применить подписи к неплавающим элементам в LaTeX? В частности, к спискам, использующим пакеты fancyvrbи fvextra?

Редактировать

В ответ на комментарий @Skillmon. Pandoc не вкладывается \labelвнутрь \caption, поэтому я попробовал следующее:

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

Что компилируется, но ссылка не разрешается, как показано на рисунке ниже:

введите описание изображения здесь

решение1

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

решение2

Поскольку вы, похоже, не в состоянии сделать то, что предлагается в комментарии, вот ответ, который делает то, что предлагается в моем комментарии:

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

Вот версия с правильными интервалами (не проверял, верны ли интервалы, если вы вкладываете \VerbatimInputи т.п.):

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

результат с меткой и ссылкой


Альтернативный ввод для получения вывода выше без \labelвложенности внутрь \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}

Вывод выглядит идентично (но обратите внимание, что оптимальный синтаксис ввода — с \labelвложенным обязательным аргументом \caption— существуют пограничные случаи, в которых вывод может выглядеть неидентично).

Связанный контент