A couple things seem to being going on here.
The first is that you're not taking advantage of the sidecap
package for your listings environment. The second is that you're telling the listings
environment that the caption should go on the top and bottom---so you're probably getting some kind of conflict.
The solution here is not optimal: it will not allow your listings
environment to straddle page boundaries. But that doesn't seem too bad considering you want to treat it like a figure.
What I've done here is place the listings
inside a minipage
inside a SCfigure
environment. The minipage
is set to the width of the text for the current page.
\documentclass[a4paper,twoside,11pt,openright]{scrbook}
\usepackage{xcolor}
\usepackage{graphicx}
%% setting up new float
\usepackage{float}
\floatname{mylisting}{Listing}
\newfloat{mylisting}{tbhp}{lst}[chapter]
\newcommand{\listoflistings}{\listof{mylisting}{List of Listings}}
%% setting up side captions
\usepackage[wide]{sidecap}
\makeatletter
\@ifdefinable\SC@listings@vpos{\def\SC@listings@vpos{b}}
\newenvironment{SClisting}{\SC@float[\SC@listings@vpos]{mylisting}}{\endSC@float}
\newenvironment{SClisting*}{\SC@dblfloat[\SC@listings@vpos]{mylisting}}{\endSC@dblfloat}
%% `sidecap` and `float` access the name of the new float differently.
%% You can't rely on `float` to pass `sidecap` the correct name. So,
%% here we manually feed the correct name for the new float in a manner
%% pleasing to `sidecap`.
\@namedef{mylistingname}{Listing}
\makeatother
%% setting up formatting for cpations
\usepackage
[
font=footnotesize,
format=plain,
labelfont={bf,sf},
textfont={it},
width=10pt
]{caption}
%% creating figure command
\newcommand{\fig}[4]{%
\begin{SCfigure}
\centering
\includegraphics[width=\textwidth]{#1}
\caption[#2]{#3}
\label{fig:#4}
\end{SCfigure}%
}
%% setting up listings
\usepackage{listings}
\lstset
{
backgroundcolor=\color{gray!20},
extendedchars=true,
basicstyle=\footnotesize\ttfamily,
xleftmargin=20pt,
showstringspaces=false,
showspaces=false,
numbers=left,
numberstyle=\footnotesize,
tabsize=2,
breaklines=true,
showtabs=false,
}
\begin{document}
%% Uncomment next line to get a list of `listings` floats
%% \listoflistings
%%
%% The following was here just for testing how `float` and `sidecap`
%% handle labeling the caption. You don't need these lines.
%% \begin{mylisting}
%% \centering
%% Hello
%% \caption{Hello}
%% \end{mylisting}
\fig{example-image-a}
{Flickr geotagging functionality}
{Flickr geotagging functionality. By navigating and panning on a map,
the user can place an image or video and specify the desired level of
spatial granularity.}
{background_flickr}
\begin{SClisting}
\begin{minipage}[t]{\textwidth}
\begin{lstlisting}
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": 10021
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
\end{lstlisting}
\end{minipage}
\caption[JSON Example]{A basic JSON example}
\label{fig:src:DataTwitterAPIJSON}
\end{SClisting}
\end{document}
Another idea I had was to put the listings
into a standalone
file and import the results of compiling that. But, the results did not look quite as good.
The following should be right up your allow. It's achieved with the aid of subcaption
and some manual float management:
\documentclass{article}
\usepackage{verbatimbox}
\usepackage[T1]{fontenc}
\usepackage{fancyvrb,listings,caption}
\usepackage[labelformat=simple]{subcaption}
\usepackage[scaled=.73]{beramono}
\fvset{baselinestretch=0.94}
\parindent=0pt
\parskip = 6pt
\makeatletter
\AtBeginDocument{\DeclareCaptionSubType{lstlisting}
\renewcommand{\p@sublstlisting}{\thelstlisting}
\renewcommand{\thesublstlisting}{(\alph{sublstlisting})}
}
\makeatother
% "define" Scala
\lstdefinelanguage{scala}{
morekeywords={abstract,case,catch,class,def,%
do,else,extends,false,final,finally,%
for,if,implicit,import,match,mixin,%
new,null,object,override,package,%
private,protected,requires,return,sealed,%
super,this,throw,trait,true,try,%
type,val,var,while,with,yield,then}, % we use `then` in the pseudocode
otherkeywords={=>,<-,<\%,<:,>:,\#,@},
sensitive=true,
morecomment=[l]{//},
morecomment=[n]{/*}{*/},
morestring=[b]",
morestring=[b]',
morestring=[b]"""
}
% activate the language and predefine settings
\lstset{
basicstyle=\linespread{0.94}\ttfamily,%
language=scala,%
commentstyle=\itshape,%
keywordstyle=\bfseries,%
fancyvrb=true,%
mathescape=true,% for pseudocode
captionpos=b, % captions at the bottom
}
\newsavebox{\verbsavebox}
\begin{document}
In Fig.~\ref{fig:label} versus Listings~\ref{lst:label1} and \ref{lst:label2}.
\begin{figure}
Empty
\caption{fig}\label{fig:label}
\end{figure}
\begin{figure} % [htp]
% Let's make this an lstlisting, not a figure...
\makeatletter\def\@captype{lstlisting}\makeatother
\begin{lrbox}{\verbsavebox}
\begin{lstlisting}[xrightmargin=.6667\linewidth]
trait Sys[S <: Sys[S]] {
type ID <: Ident[S#Tx]
type Tx
}
trait Muta[S <: Sys[S]] {
def id: S#ID
// well defined:
def dispose(tx: S#Tx) =
id.dispose(tx)
}
trait Ident[Tx] {
def dispose(tx: Tx): Unit
}
\end{lstlisting}
\end{lrbox}
\subcaptionbox{list1\label{lst:label1}}{\usebox{\verbsavebox}}\hfill%
\begin{lrbox}{\verbsavebox}
\begin{lstlisting}[xrightmargin=.6667\linewidth]
trait Sys {
type ID <: Ident[Tx]
type Tx
}
trait Muta[S <: Sys] {
def id: S#ID
// incompatible type:
def dispose(tx: S#Tx) =
id.dispose(tx)
}
\end{lstlisting}
\end{lrbox}
\subcaptionbox{list2\label{lst:label2}}{\usebox{\verbsavebox}}\hfill%
\begin{lrbox}{\verbsavebox}
\begin{lstlisting}[xrightmargin=.6667\linewidth]
trait Sys {
type ID <: Ident[Tx]
type Tx
}
trait Muta[S <: Sys] {
// evidence required:
val s: S
def id: s.ID
// well defined:
def dispose(tx: s.Tx) =
id.dispose(tx)
}
\end{lstlisting}
\end{lrbox}
\subcaptionbox{list3\label{lst:label3}}{\usebox{\verbsavebox}}
\caption{Total caption\label{lst:total}}
\end{figure}
\end{document}
Each of the listings are set in a box \verbsavebox
of width .3333\linewidth
(by setting xrightmargin=.6667\linewidth
). These boxes, once set, are added using \subcaptionbox{<caption>}{\usebox{\verbsavebox}}
, where <caption>
includes both the caption and the \label
.
Immediately inside the figure
environment, we strategically update the \@captype
to be lstlisting
. This fools TeX to think that it's dealing with a float called lstlisting
when you call \caption
. This is necessary since the \subcaption
s are set before the main \caption
, which requires \p@lstlisting
(the parent counter associated with the subcounter sublstlisting
) to be set correctly. This is all related to the functionality of the subcaption
package.
The subcaptions are defined \AtBeginDocument
, which is to coincide with the float definitions of listings
, which is done at the same time. subcaption
requires a float to exist before it allows one to define subcaptions for it.
Best Answer
minted
provideslisting
environment that puts the code block in a floating environment. Insidelisting
you can provide a\caption
and a\label
.Alternative is (since you want page breaks) to use
Also use
\captionof
inside a group as it demands so.