"}\n"
"\\@mparswitchtrue\n");
+static docstring const lyxmintcaption_def = from_ascii(
+ "\\long\\def\\lyxmintcaption[#1]#2{%\n"
+ " \\ifx#1t\\vskip\\baselineskip\\fi%\n"
+ " \\refstepcounter{listing}\\noindent%\n"
+ " \\setbox\\@tempboxa\\hbox{\\listingscaption~\\thelisting: #2}%\n"
+ " \\ifdim \\wd\\@tempboxa >\\linewidth%\n"
+ " \\parbox[t]{\\linewidth}{\\unhbox\\@tempboxa}\\else%\n"
+ " \\hbox to\\linewidth{\\hfil\\box\\@tempboxa\\hfil}\\fi%\n"
+ " \\ifx#1b\\vskip\\baselineskip\\fi\n"
+ "}\n");
+
/////////////////////////////////////////////////////////////////////
//
if (mustProvide("rtloutputdblcol"))
macros << rtloutputdblcol_def;
+ if (mustProvide("lyxmintcaption"))
+ macros << lyxmintcaption_def;
+
return macros.release();
}
// Using listings, it is always possible to have a caption,
// even for non-floats. Using minted, only floats can have a
// caption. So, with minted we use the following strategy.
- // If a caption or the float parameter are specified, we
- // assume that the listing is floating. In this case, the
+ // If a caption was specified but the float parameter was not,
+ // we ourselves add a caption above the listing (because the
+ // listing comes from a file and might span several pages).
+ // Otherwise, if float was specified, the floating listing
+ // environment provided by minted is used. In either case, the
// label parameter is taken as the label by which the float
// can be referenced, otherwise it will have the meaning
// intended by minted. In this last case, the label will
string caption;
string label;
string placement;
- bool isfloat = false;
+ bool isfloat = lstparams.isFloat();
if (use_minted) {
// Get float placement, language, caption, and
// label, then remove the relative options.
getVectorFromString(parameters, ",", false);
for (size_t i = 0; i < opts.size(); ++i) {
if (prefixIs(opts[i], "float")) {
- isfloat = true;
if (prefixIs(opts[i], "float="))
placement = opts[i].substr(6);
opts.erase(opts.begin() + i--);
language = opts[i].substr(9);
opts.erase(opts.begin() + i--);
} else if (prefixIs(opts[i], "caption=")) {
- isfloat = true;
caption = opts[i].substr(8);
opts.erase(opts.begin() + i--);
} else if (prefixIs(opts[i], "label=")) {
}
}
if (!label.empty()) {
- if (isfloat)
+ if (isfloat || !caption.empty())
label = trim(label, "{}");
else
opts.push_back("label=" + label);
if (!placement.empty())
os << '[' << placement << "]";
os << breakln;
+ } else if (use_minted && !caption.empty()) {
+ os << breakln << "\\lyxmintcaption[t]{" << caption;
+ if (!label.empty())
+ os << "\\label{" << label << "}";
+ os << "}\n";
}
os << (use_minted ? "\\inputminted" : "\\lstinputlisting");
if (!parameters.empty())
if (isVerbatim(params()))
features.require("verbatim");
else if (isListings(params())) {
- if (buffer().params().use_minted)
+ if (buffer().params().use_minted) {
features.require("minted");
- else
+ string const opts = to_utf8(params()["lstparams"]);
+ InsetListingsParams lstpars(opts);
+ if (!lstpars.isFloat() && contains(opts, "caption="))
+ features.require("lyxmintcaption");
+ } else
features.require("listings");
}
encoding_switched = true;
}
+ bool const captionfirst = !isfloat && par->isInset(0)
+ && par->getInset(0)->lyxCode() == CAPTION_CODE;
+
while (par != end) {
pos_type siz = par->size();
bool captionline = false;
}
os << delim << code << delim;
} else if (use_minted) {
+ OutputParams rp = runparams;
+ rp.moving_arg = true;
+ TexString caption = getCaption(rp);
if (isfloat) {
os << breakln << "\\begin{listing}";
if (!float_placement.empty())
os << '[' << float_placement << "]";
+ } else if (captionfirst && !caption.str.empty()) {
+ os << breakln << "\\lyxmintcaption[t]{"
+ << move(caption) << "}\n";
}
os << breakln << "\\begin{minted}";
if (!param_string.empty())
os << "{" << minted_language << "}\n"
<< code << breakln << "\\end{minted}\n";
if (isfloat) {
- OutputParams rp = runparams;
- rp.moving_arg = true;
- TexString caption = getCaption(rp);
if (!caption.str.empty())
os << "\\caption{" << move(caption) << "}\n";
os << "\\end{listing}\n";
+ } else if (!captionfirst && !caption.str.empty()) {
+ os << breakln << "\\lyxmintcaption[b]{"
+ << move(caption) << "}";
}
} else {
OutputParams rp = runparams;
return true;
case LFUN_CAPTION_INSERT: {
// the inset outputs at most one caption
- bool const use_minted = buffer().params().use_minted;
- if (params().isInline() || getCaptionInset() ||
- (use_minted && !params().isFloat())) {
+ if (params().isInline() || getCaptionInset()) {
status.setEnabled(false);
return true;
}
void InsetListings::validate(LaTeXFeatures & features) const
{
- if (buffer().params().use_minted)
- features.require("minted");
- else
- features.require("listings");
features.useInsetLayout(getLayout());
string param_string = params().params();
- if (param_string.find("\\color") != string::npos)
- features.require("color");
+ if (buffer().params().use_minted) {
+ features.require("minted");
+ OutputParams rp = features.runparams();
+ if (!params().isFloat() && !getCaption(rp).str.empty())
+ features.require("lyxmintcaption");
+ } else {
+ features.require("listings");
+ if (contains(param_string, "\\color"))
+ features.require("color");
+ }
InsetCaptionable::validate(features);
}