56

I am trying using minted to display some code in my document, but the code is long and spans over two pages, this works fine, however when I place my code inside

\begin{listing}
  \inputminted{java}{code/JavaCode.java}
  \caption{Some caption}
  \label{label1}
\end{listing}

Then my code doesn't show up and I get the warning:

LaTeX Warning: Float too large for page

I have tried using the option H in listing, but then the code shows in only one page and it doesn't fit so I only see a part of it.

I also tried with the code directly in the latex document ie:

\begin{listing}
  \begin{minted}{java} 
    Java code
  \end{minted}
  \caption{Some caption}
  \label{label1}
\end{listing}

But the same happens, any ideas?

lander16
  • 715

4 Answers4

36

As far as I know, this is a fundamental restriction of floats. You cannot use floats that span over more than one page so you need to remove the surrounding listing.

To make the caption still work, you can load the caption package and use the \captionof command instead of \caption:

\inputminted{java}{code/JavaCode.java}
\captionof{listing}{Some caption}

Now the caption should also appear in the \listoflistings. If you want to use a label here, you need to put it inside the \captionof command:

\captionof{listing}{Some caption\label{lst:some-label}}

See also: Question “Label and caption without float”.

Konrad Rudolph
  • 39,394
  • 22
  • 107
  • 160
32

The suggested and accepted answer does not work correctly as the \captionof command requires to be inside an environment. This is pointed out in the caption documentation. For example in my case there was no proper vertical space after the caption.

A proper solution is to define a new environment:

\usepackage{caption}
% ...
\newenvironment{code}{\captionsetup{type=listing}}{}

\begin{code}
\begin{minted}[frame=single]{py}
def my_func(x):
    print x
\end{minted}
\caption{My Func}
\label{lst:my_func}
\end{code}
schlamar
  • 738
  • 6
  • 15
0

Adapting the solution by @Konrad Rudolph to something that is simple and doesn't break anything:

\inputminted[linenos]{python}{code.py}
\begin{figure}[H]
    \caption{Hello.}
    \label{fig:foo}
\end{figure}

Of course, this is going to be named and listed as a Figure, but that's not a problem for me.

0 _
  • 958
  • 1
    You don't need to use a figure float. If \captionof doesn't work for you (which, weird!) you can (and should) simply use a listing float environment. – Konrad Rudolph May 29 '16 at 08:34
  • The \captionof appeared to work, until I noticed that the paragraphs don't start with the usual indentation (and are restored to normal when I removed the \captionof). The listing environment doesn't split over two pages (I haven't tried mdframed for breaking a listing environment, because according to http://tex.stackexchange.com/a/103471/8666, mdframed helps with breaking in the presence of a background color). – 0 _ May 29 '16 at 21:43
  • No floating environment breaks across pages. I meant using the "correct" environment to put the title in. – Konrad Rudolph May 29 '16 at 21:53
  • Interesting approach, thought its more like a very quick fix then an proper answer. – KcFnMi Apr 15 '19 at 13:07
  • Sometimes the caption is placed on a different page. How can we fix it? – skan Jan 12 '21 at 19:37
0

To solve this kind of problem I use two listings - split in half - in combination with \ContinuedFloat:

\begin{listing}
    \ContinuedFloat*
    \begin{codeblock}{}{C}
        \cfile[lastline=33]{code/xxx.c}
    \end{codeblock}
    \caption{My caption}
    \label{lst:xxx}
\end{listing}

\begin{listing} \ContinuedFloat \begin{codeblock}{}{C} \cfile[firstline=35]{code/xxx.c} \end{codeblock} \caption{My caption (contd.)} \end{listing}

Credit goes to: https://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions#Figures_in_multiple_parts

xmoex
  • 101