+ string const tex_format = flavor2format(runparams.flavor);
+
+ switch (type(params())) {
+ case VERB:
+ case VERBAST: {
+ incfile = latex_path(incfile);
+ // FIXME UNICODE
+ os << '\\' << from_ascii(params().getCmdName()) << '{'
+ << from_utf8(incfile) << '}';
+ break;
+ }
+ case INPUT: {
+ runparams.exportdata->addExternalFile(tex_format, writefile,
+ exportfile);
+
+ // \input wants file with extension (default is .tex)
+ if (!isLyXFileName(included_file.absFileName())) {
+ incfile = latex_path(incfile);
+ // FIXME UNICODE
+ os << '\\' << from_ascii(params().getCmdName())
+ << '{' << from_utf8(incfile) << '}';
+ } else {
+ incfile = changeExtension(incfile, ".tex");
+ incfile = latex_path(incfile);
+ // FIXME UNICODE
+ os << '\\' << from_ascii(params().getCmdName())
+ << '{' << from_utf8(incfile) << '}';
+ }
+ break;
+ }
+ case LISTINGS: {
+ // Here, listings and minted have sligthly different behaviors.
+ // 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 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
+ // serve as a sort of caption that, however, will be shown
+ // by minted only if the frame parameter is also specified.
+ bool const use_minted = buffer().params().use_minted;
+ runparams.exportdata->addExternalFile(tex_format, writefile,
+ exportfile);
+ string const opt = to_utf8(params()["lstparams"]);
+ // opt is set in QInclude dialog and should have passed validation.
+ InsetListingsParams lstparams(opt);
+ docstring parameters = from_utf8(lstparams.params());
+ docstring language;
+ docstring caption;
+ docstring label;
+ docstring placement;
+ bool isfloat = lstparams.isFloat();
+ // Get float placement, language, caption, and
+ // label, then remove the relative options if minted.
+ vector<docstring> opts =
+ getVectorFromString(parameters, from_ascii(","), false);
+ vector<docstring> latexed_opts;
+ for (size_t i = 0; i < opts.size(); ++i) {
+ if (use_minted && prefixIs(opts[i], from_ascii("float"))) {
+ if (prefixIs(opts[i], from_ascii("float=")))
+ placement = opts[i].substr(6);
+ opts.erase(opts.begin() + i--);
+ } else if (use_minted && prefixIs(opts[i], from_ascii("language="))) {
+ language = opts[i].substr(9);
+ opts.erase(opts.begin() + i--);
+ } else if (prefixIs(opts[i], from_ascii("caption="))) {
+ caption = params().prepareCommand(runparams, trim(opts[i].substr(8), "{}"),
+ ParamInfo::HANDLING_LATEXIFY);
+ opts.erase(opts.begin() + i--);
+ if (!use_minted)
+ latexed_opts.push_back(from_ascii("caption=") + caption);
+ } else if (prefixIs(opts[i], from_ascii("label="))) {
+ label = params().prepareCommand(runparams, trim(opts[i].substr(6), "{}"),
+ ParamInfo::HANDLING_ESCAPE);
+ opts.erase(opts.begin() + i--);
+ if (!use_minted)
+ latexed_opts.push_back(from_ascii("label={") + label + "}");
+ }
+ if (use_minted && !label.empty()) {
+ if (isfloat || !caption.empty())
+ label = trim(label, "{}");
+ else
+ opts.push_back(from_ascii("label=") + label);
+ }
+ }
+ if (!latexed_opts.empty())
+ opts.insert(opts.end(), latexed_opts.begin(), latexed_opts.end());
+ parameters = getStringFromVector(opts, from_ascii(","));
+ if (language.empty())
+ language = from_ascii("TeX");
+ if (use_minted && isfloat) {
+ os << breakln << "\\begin{listing}";
+ 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())
+ os << "[" << parameters << "]";
+ if (use_minted)
+ os << '{' << ascii_lowercase(language) << '}';
+ os << '{' << incfile << '}';
+ if (use_minted && isfloat) {
+ if (!caption.empty())
+ os << breakln << "\\caption{" << caption << "}";
+ if (!label.empty())
+ os << breakln << "\\label{" << label << "}";
+ os << breakln << "\\end{listing}\n";
+ }
+ break;
+ }
+ case INCLUDE: {
+ runparams.exportdata->addExternalFile(tex_format, writefile,
+ exportfile);
+
+ // \include don't want extension and demands that the
+ // file really have .tex
+ incfile = changeExtension(incfile, string());
+ incfile = latex_path(incfile);
+ // FIXME UNICODE
+ os << '\\' << from_ascii(params().getCmdName()) << '{'
+ << from_utf8(incfile) << '}';
+ break;
+ }
+ case NONE:
+ break;
+ }
+
+ if (runparams.inComment || runparams.dryrun)
+ // Don't try to load or copy the file if we're
+ // in a comment or doing a dryrun
+ return;
+
+ if (isInputOrInclude(params()) &&