]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
Update Russian localization
[lyx.git] / src / BufferParams.cpp
index 399faa393344a97d0c7039c6a2222885b5f654d8..9d45d80d1034738d704496c9b275829dbbe652e1 100644 (file)
 #include "LayoutFile.h"
 #include "BranchList.h"
 #include "Buffer.h"
-#include "buffer_funcs.h"
 #include "Bullet.h"
 #include "CiteEnginesList.h"
 #include "Color.h"
 #include "ColorSet.h"
 #include "Converter.h"
 #include "Encoding.h"
+#include "Format.h"
 #include "IndicesList.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
 #include "LaTeXFonts.h"
-#include "Length.h"
-#include "ModuleList.h"
 #include "Font.h"
 #include "Lexer.h"
 #include "LyXRC.h"
 
 #include "support/convert.h"
 #include "support/debug.h"
-#include "support/docstream.h"
 #include "support/FileName.h"
 #include "support/filetools.h"
 #include "support/gettext.h"
+#include "support/Length.h"
 #include "support/Messages.h"
 #include "support/mutex.h"
 #include "support/Package.h"
@@ -411,8 +409,9 @@ BufferParams::BufferParams()
        track_changes = false;
        output_changes = false;
        change_bars = false;
+       postpone_fragile_content = true;
        use_default_options = true;
-       maintain_unincluded_children = false;
+       maintain_unincluded_children = CM_None;
        secnumdepth = 3;
        tocdepth = 3;
        language = default_language;
@@ -448,6 +447,8 @@ BufferParams::BufferParams()
        listings_params = string();
        pagestyle = "default";
        tablestyle = "default";
+       float_alignment = "class";
+       float_placement = "class";
        suppress_date = false;
        justification = true;
        // no color is the default (white)
@@ -470,6 +471,7 @@ BufferParams::BufferParams()
        html_math_output = MathML;
        html_math_img_scale = 1.0;
        html_css_as_file = false;
+       docbook_table_output = HTMLTable;
        display_pixel_ratio = 1.0;
 
        shell_escape = false;
@@ -563,7 +565,7 @@ AuthorList const & BufferParams::authors() const
 }
 
 
-void BufferParams::addAuthor(Author a)
+void BufferParams::addAuthor(Author const & a)
 {
        author_map_[a.bufferId()] = pimpl_->authorlist.record(a);
 }
@@ -781,7 +783,14 @@ string BufferParams::readToken(Lexer & lex, string const & token,
        } else if (token == "\\begin_includeonly") {
                readIncludeonly(lex);
        } else if (token == "\\maintain_unincluded_children") {
-               lex >> maintain_unincluded_children;
+               string tmp;
+               lex >> tmp;
+               if (tmp == "no")
+                       maintain_unincluded_children = CM_None;
+               else if (tmp == "mostly")
+                       maintain_unincluded_children = CM_Mostly;
+               else if (tmp == "strict")
+                       maintain_unincluded_children = CM_Strict;
        } else if (token == "\\options") {
                lex.eatLine();
                options = lex.getString();
@@ -954,6 +963,8 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                lex >> output_changes;
        } else if (token == "\\change_bars") {
                lex >> change_bars;
+       } else if (token == "\\postpone_fragile_content") {
+               lex >> postpone_fragile_content;
        } else if (token == "\\branch") {
                lex.eatLine();
                docstring branch = lex.getDocString();
@@ -981,7 +992,7 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                                        branch_ptr->setColor(color);
                                // Update also the Color table:
                                if (color == "none")
-                                       color = lcolor.getX11Name(Color_background);
+                                       color = lcolor.getX11HexName(Color_background);
                                // FIXME UNICODE
                                lcolor.setColor(to_utf8(branch), color);
                        }
@@ -1010,7 +1021,7 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                                        index_ptr->setColor(color);
                                // Update also the Color table:
                                if (color == "none")
-                                       color = lcolor.getX11Name(Color_background);
+                                       color = lcolor.getX11HexName(Color_background);
                                // FIXME UNICODE
                                if (!shortcut.empty())
                                        lcolor.setColor(to_utf8(shortcut), color);
@@ -1124,6 +1135,10 @@ string BufferParams::readToken(Lexer & lex, string const & token,
        } else if (token == "\\html_latex_end") {
                lex.eatLine();
                html_latex_end = lex.getString();
+       } else if (token == "\\docbook_table_output") {
+               int temp;
+               lex >> temp;
+               docbook_table_output = static_cast<TableOutput>(temp);
        } else if (token == "\\output_sync") {
                lex >> output_sync;
        } else if (token == "\\output_sync_macro") {
@@ -1212,34 +1227,39 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
        // removed modules
        if (!removed_modules_.empty()) {
                os << "\\begin_removed_modules" << '\n';
-               list<string>::const_iterator it = removed_modules_.begin();
-               list<string>::const_iterator en = removed_modules_.end();
-               for (; it != en; ++it)
-                       os << *it << '\n';
+               for (auto const & mod : removed_modules_)
+                       os << mod << '\n';
                os << "\\end_removed_modules" << '\n';
        }
 
        // the modules
        if (!layout_modules_.empty()) {
                os << "\\begin_modules" << '\n';
-               LayoutModuleList::const_iterator it = layout_modules_.begin();
-               LayoutModuleList::const_iterator en = layout_modules_.end();
-               for (; it != en; ++it)
-                       os << *it << '\n';
+               for (auto const & mod : layout_modules_)
+                       os << mod << '\n';
                os << "\\end_modules" << '\n';
        }
 
        // includeonly
        if (!included_children_.empty()) {
                os << "\\begin_includeonly" << '\n';
-               list<string>::const_iterator it = included_children_.begin();
-               list<string>::const_iterator en = included_children_.end();
-               for (; it != en; ++it)
-                       os << *it << '\n';
+               for (auto const & c : included_children_)
+                       os << c << '\n';
                os << "\\end_includeonly" << '\n';
        }
-       os << "\\maintain_unincluded_children "
-          << convert<string>(maintain_unincluded_children) << '\n';
+       string muc = "no";
+       switch (maintain_unincluded_children) {
+       case CM_Mostly:
+               muc = "mostly";
+               break;
+       case CM_Strict:
+               muc = "strict";
+               break;
+       case CM_None:
+       default:
+               break;
+       }
+       os << "\\maintain_unincluded_children " << muc << '\n';
 
        // local layout information
        docstring const local_layout = getLocalLayout(false);
@@ -1314,10 +1334,9 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
        os << "\\papersize " << string_papersize[papersize]
           << "\n\\use_geometry " << convert<string>(use_geometry);
        map<string, string> const & packages = auto_packages();
-       for (map<string, string>::const_iterator it = packages.begin();
-            it != packages.end(); ++it)
-               os << "\n\\use_package " << it->first << ' '
-                  << use_package(it->first);
+       for (auto const & pack : packages)
+               os << "\n\\use_package " << pack.first << ' '
+                  << use_package(pack.first);
 
        os << "\n\\cite_engine ";
 
@@ -1352,32 +1371,28 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
        if (!lineno_opts.empty())
                os << "\\lineno_options " << lineno_opts << '\n';
 
-       if (isbackgroundcolor == true)
+       if (isbackgroundcolor)
                os << "\\backgroundcolor " << lyx::X11hexname(backgroundcolor) << '\n';
-       if (isfontcolor == true)
+       if (isfontcolor)
                os << "\\fontcolor " << lyx::X11hexname(fontcolor) << '\n';
        if (notefontcolor != lyx::rgbFromHexName("#cccccc"))
                os << "\\notefontcolor " << lyx::X11hexname(notefontcolor) << '\n';
        if (boxbgcolor != lyx::rgbFromHexName("#ff0000"))
                os << "\\boxbgcolor " << lyx::X11hexname(boxbgcolor) << '\n';
 
-       BranchList::const_iterator it = branchlist().begin();
-       BranchList::const_iterator end = branchlist().end();
-       for (; it != end; ++it) {
-               os << "\\branch " << to_utf8(it->branch())
-                  << "\n\\selected " << it->isSelected()
-                  << "\n\\filename_suffix " << it->hasFileNameSuffix()
-                  << "\n\\color " << lyx::X11hexname(it->color())
+       for (auto const & br : branchlist()) {
+               os << "\\branch " << to_utf8(br.branch())
+                  << "\n\\selected " << br.isSelected()
+                  << "\n\\filename_suffix " << br.hasFileNameSuffix()
+                  << "\n\\color " << lyx::X11hexname(br.color())
                   << "\n\\end_branch"
                   << "\n";
        }
 
-       IndicesList::const_iterator iit = indiceslist().begin();
-       IndicesList::const_iterator iend = indiceslist().end();
-       for (; iit != iend; ++iit) {
-               os << "\\index " << to_utf8(iit->index())
-                  << "\n\\shortcut " << to_utf8(iit->shortcut())
-                  << "\n\\color " << lyx::X11hexname(iit->color())
+       for (auto const & id : indiceslist()) {
+               os << "\\index " << to_utf8(id.index())
+                  << "\n\\shortcut " << to_utf8(id.shortcut())
+                  << "\n\\color " << lyx::X11hexname(id.color())
                   << "\n\\end_index"
                   << "\n";
        }
@@ -1475,10 +1490,14 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
           << (save_transient_properties ? convert<string>(change_bars) : "false")
           << '\n';
 
+       os << "\\postpone_fragile_content " << convert<string>(postpone_fragile_content) << '\n';
+
        os << "\\html_math_output " << html_math_output << '\n'
           << "\\html_css_as_file " << html_css_as_file << '\n'
           << "\\html_be_strict " << convert<string>(html_be_strict) << '\n';
 
+       os << "\\docbook_table_output " << docbook_table_output << '\n';
+
        if (html_math_img_scale != 1.0)
                os << "\\html_math_img_scale " << convert<string>(html_math_img_scale) << '\n';
        if (!html_latex_start.empty())
@@ -1492,23 +1511,19 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
 
 void BufferParams::validate(LaTeXFeatures & features) const
 {
-       features.require(documentClass().requires());
+       features.require(documentClass().required());
 
        if (columns > 1 && language->rightToLeft())
                features.require("rtloutputdblcol");
 
        if (output_changes) {
-               bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
                bool xcolorulem = LaTeXFeatures::isAvailable("ulem") &&
                                  LaTeXFeatures::isAvailable("xcolor");
 
                switch (features.runparams().flavor) {
                case OutputParams::LATEX:
                case OutputParams::DVILUATEX:
-                       if (dvipost) {
-                               features.require("ct-dvipost");
-                               features.require("dvipost");
-                       } else if (xcolorulem) {
+                       if (xcolorulem) {
                                features.require("ct-xcolor-ulem");
                                features.require("ulem");
                                features.require("xcolor");
@@ -1540,15 +1555,14 @@ void BufferParams::validate(LaTeXFeatures & features) const
        if (float_placement.find('H') != string::npos)
                features.require("float");
 
-       for (PackageMap::const_iterator it = use_packages.begin();
-            it != use_packages.end(); ++it) {
-               if (it->first == "amsmath") {
+       for (auto const & pm : use_packages) {
+               if (pm.first == "amsmath") {
                        // AMS Style is at document level
-                       if (it->second == package_on ||
+                       if (pm.second == package_on ||
                            features.isProvided("amsmath"))
-                               features.require(it->first);
-               } else if (it->second == package_on)
-                       features.require(it->first);
+                               features.require(pm.first);
+               } else if (pm.second == package_on)
+                       features.require(pm.first);
        }
 
        // Document-level line spacing
@@ -1605,8 +1619,8 @@ void BufferParams::validate(LaTeXFeatures & features) const
        if (use_microtype)
                features.require("microtype");
 
-       if (!language->requires().empty())
-               features.require(language->requires());
+       if (!language->required().empty())
+               features.require(language->required());
 }
 
 
@@ -1717,17 +1731,59 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
        if (!options.empty()) {
                clsoptions << options << ',';
        }
-
-       string strOptions(clsoptions.str());
+       
+       docstring const strOptions = from_utf8(clsoptions.str());
        if (!strOptions.empty()) {
-               strOptions = rtrim(strOptions, ",");
-               // FIXME UNICODE
-               os << '[' << from_utf8(strOptions) << ']';
+               // Check if class options contain uncodable glyphs
+               docstring uncodable_glyphs;
+               docstring options_encodable;
+               Encoding const * const enc = features.runparams().encoding;
+               if (enc) {
+                       for (char_type c : strOptions) {
+                               if (!enc->encodable(c)) {
+                                       docstring const glyph(1, c);
+                                       LYXERR0("Uncodable character '"
+                                               << glyph
+                                               << "' in class options!");
+                                       uncodable_glyphs += glyph;
+                                       if (features.runparams().dryrun) {
+                                               options_encodable += "<" + _("LyX Warning: ")
+                                                  + _("uncodable character") + " '";
+                                               options_encodable += c;
+                                               options_encodable += "'>";
+                                       }
+                               } else
+                                       options_encodable += c;
+                       }
+               } else
+                       options_encodable = strOptions;
+       
+               // On BUFFER_VIEW|UPDATE, warn user if we found uncodable glyphs
+               if (!features.runparams().dryrun && !uncodable_glyphs.empty()) {
+                       frontend::Alert::warning(
+                               _("Uncodable character in class options"),
+                               support::bformat(
+                                 _("The class options of your document contain glyphs "
+                                   "that are unknown in the current document encoding "
+                                   "(namely %1$s).\nThese glyphs are omitted "
+                                   " from the output, which may result in "
+                                   "incomplete output."
+                                   "\n\nPlease select an appropriate "
+                                   "document encoding\n"
+                                   "(such as utf8) or change the "
+                                   "class options accordingly."),
+                                 uncodable_glyphs));
+               }
+               options_encodable = rtrim(options_encodable, ",");
+               os << '[' << options_encodable << ']';
        }
 
        os << '{' << from_ascii(tclass.latexname()) << "}\n";
        // end of \documentclass defs
 
+       // The package options (via \PassOptionsToPackage)
+       os << from_ascii(features.getPackageOptions());
+
        // if we use fontspec or newtxmath, we have to load the AMS packages here
        string const ams = features.loadAMSPackages();
        bool const ot1 = (main_font_encoding() == "default" || main_font_encoding() == "OT1");
@@ -1799,14 +1855,11 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
        // includeonly
        if (!features.runparams().includeall && !included_children_.empty()) {
                os << "\\includeonly{";
-               list<string>::const_iterator it = included_children_.begin();
-               list<string>::const_iterator en = included_children_.end();
                bool first = true;
-               for (; it != en; ++it) {
-                       string incfile = *it;
+               for (auto incfile : included_children_) {
                        FileName inc = makeAbsPath(incfile, filepath.absFileName());
                        string mangled = DocFileName(changeExtension(inc.absFileName(), ".tex")).
-                       mangledFileName();
+                                       mangledFileName();
                        if (!features.runparams().nice)
                                incfile = mangled;
                        // \includeonly doesn't want an extension
@@ -1822,7 +1875,8 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                os << "}\n";
        }
 
-       if (use_geometry || !class_supported_papersize) {
+       if (!features.isProvided("geometry")
+           && (use_geometry || !class_supported_papersize)) {
                odocstringstream ods;
                if (!getGraphicsDriver("geometry").empty())
                        ods << getGraphicsDriver("geometry");
@@ -1874,20 +1928,17 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                        break;
                }
                docstring g_options = trim(ods.str(), ",");
+               os << "\\usepackage";
                // geometry-light means that the class works with geometry, but overwrites
                // the package options and paper sizes (memoir does this).
                // In this case, all options need to go to \geometry
                // and the standard paper sizes need to go to the class options.
-               if (!features.isProvided("geometry")) {
-                       os << "\\usepackage";
-                       if (!g_options.empty() && !features.isProvided("geometry-light")) {
-                               os << '[' << g_options << ']';
-                               g_options.clear();
-                       }
-                       os << "{geometry}\n";
+               if (!g_options.empty() && !features.isProvided("geometry-light")) {
+                       os << '[' << g_options << ']';
+                       g_options.clear();
                }
-               if (use_geometry || features.isProvided("geometry")
-                   || features.isProvided("geometry-light")) {
+               os << "{geometry}\n";
+               if (use_geometry || features.isProvided("geometry-light")) {
                        os << "\\geometry{verbose";
                        if (!g_options.empty())
                                // Output general options here with "geometry light".
@@ -1925,7 +1976,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
        }
 
        // only output when the background color is not default
-       if (isbackgroundcolor == true) {
+       if (isbackgroundcolor) {
                // only require color here, the background color will be defined
                // in LaTeXFeatures.cpp to avoid interferences with the LaTeX
                // package pdfpages
@@ -1934,7 +1985,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
        }
 
        // only output when the font color is not default
-       if (isfontcolor == true) {
+       if (isfontcolor) {
                // only require color here, the font color will be defined
                // in LaTeXFeatures.cpp to avoid interferences with the LaTeX
                // package pdfpages
@@ -1958,26 +2009,36 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
 
        if (paragraph_separation) {
                // when skip separation
+               string psopt;
                switch (getDefSkip().kind()) {
                case VSpace::SMALLSKIP:
-                       os << "\\setlength{\\parskip}{\\smallskipamount}\n";
+                       psopt = "\\smallskipamount";
                        break;
                case VSpace::MEDSKIP:
-                       os << "\\setlength{\\parskip}{\\medskipamount}\n";
+                       psopt = "\\medskipamount";
                        break;
                case VSpace::BIGSKIP:
-                       os << "\\setlength{\\parskip}{\\bigskipamount}\n";
+                       psopt = "\\bigskipamount";
+                       break;
+               case VSpace::HALFLINE:
+                       // default (no option)
+                       break;
+               case VSpace::FULLLINE:
+                       psopt = "\\baselineskip";
                        break;
                case VSpace::LENGTH:
-                       os << "\\setlength{\\parskip}{"
-                          << from_utf8(getDefSkip().length().asLatexString())
-                          << "}\n";
+                       psopt = getDefSkip().length().asLatexString();
                        break;
-               default: // should never happen // Then delete it.
-                       os << "\\setlength{\\parskip}{\\medskipamount}\n";
+               default:
                        break;
                }
-               os << "\\setlength{\\parindent}{0pt}\n";
+               if (!features.isProvided("parskip")) {
+                       if (!psopt.empty())
+                               psopt = "[skip=" + psopt + "]";
+                       os << "\\usepackage" + psopt + "{parskip}\n";
+               } else {
+                       os << "\\setlength{\\parskip}{" + psopt + "}\n";
+               }
        } else {
                // when separation by indentation
                // only output something when a width is given
@@ -2011,9 +2072,6 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                        os << "\\synctex=-1\n";
        }
 
-       // The package options (via \PassOptionsToPackage)
-       os << from_ascii(features.getPackageOptions());
-
        // due to interferences with babel and hyperref, the color package has to
        // be loaded (when it is not already loaded) before babel when hyperref
        // is used with the colorlinks option, see
@@ -2041,11 +2099,9 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
 
        // Additional Indices
        if (features.isRequired("splitidx")) {
-               IndicesList::const_iterator iit = indiceslist().begin();
-               IndicesList::const_iterator iend = indiceslist().end();
-               for (; iit != iend; ++iit) {
+               for (auto const & idx : indiceslist()) {
                        os << "\\newindex{";
-                       os << escape(iit->shortcut());
+                       os << escape(idx.shortcut());
                        os << "}\n";
                }
        }
@@ -2125,8 +2181,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                docstring uncodable_glyphs;
                Encoding const * const enc = features.runparams().encoding;
                if (enc) {
-                       for (size_t n = 0; n < preamble.size(); ++n) {
-                               char_type c = preamble[n];
+                       for (char_type c : preamble) {
                                if (!enc->encodable(c)) {
                                        docstring const glyph(1, c);
                                        LYXERR0("Uncodable character '"
@@ -2313,15 +2368,14 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                // now setup the other languages
                set<string> const polylangs =
                        features.getPolyglossiaLanguages();
-               for (set<string>::const_iterator mit = polylangs.begin();
-                    mit != polylangs.end() ; ++mit) {
+               for (auto const & pl : polylangs) {
                        // We do not output the options here; they are output in
                        // the language switch commands. This is safer if multiple
                        // varieties are used.
-                       if (*mit == language->polyglossia())
+                       if (pl == language->polyglossia())
                                continue;
                        os << "\\setotherlanguage";
-                       os << "{" << from_ascii(*mit) << "}\n";
+                       os << "{" << from_ascii(pl) << "}\n";
                }
        }
 
@@ -2497,8 +2551,8 @@ LayoutFile const * BufferParams::baseClass() const
 {
        if (LayoutFileList::get().haveClass(pimpl_->baseClass_))
                return &(LayoutFileList::get()[pimpl_->baseClass_]);
-       else
-               return 0;
+
+       return nullptr;
 }
 
 
@@ -2515,10 +2569,8 @@ void BufferParams::makeDocumentClass(bool const clone)
 
        invalidateConverterCache();
        LayoutModuleList mods;
-       LayoutModuleList::iterator it = layout_modules_.begin();
-       LayoutModuleList::iterator en = layout_modules_.end();
-       for (; it != en; ++it)
-               mods.push_back(*it);
+       for (auto const & mod : layout_modules_)
+               mods.push_back(mod);
 
        doc_class_ = getDocumentClass(*baseClass(), mods, cite_engine_, clone);
 
@@ -2562,10 +2614,8 @@ void BufferParams::setLocalLayout(docstring const & layout, bool forced)
 
 bool BufferParams::addLayoutModule(string const & modName)
 {
-       LayoutModuleList::const_iterator it = layout_modules_.begin();
-       LayoutModuleList::const_iterator end = layout_modules_.end();
-       for (; it != end; ++it)
-               if (*it == modName)
+       for (auto const & mod : layout_modules_)
+               if (mod == modName)
                        return false;
        layout_modules_.push_back(modName);
        return true;
@@ -2581,10 +2631,8 @@ string BufferParams::bufferFormat() const
 bool BufferParams::isExportable(string const & format, bool need_viewable) const
 {
        FormatList const & formats = exportableFormats(need_viewable);
-       FormatList::const_iterator fit = formats.begin();
-       FormatList::const_iterator end = formats.end();
-       for (; fit != end ; ++fit) {
-               if ((*fit)->name() == format)
+       for (auto const & fmt : formats) {
+               if (fmt->name() == format)
                        return true;
        }
        return false;
@@ -2605,13 +2653,15 @@ FormatList const & BufferParams::exportableFormats(bool only_viewable) const
        if (useNonTeXFonts) {
                excludes.insert("latex");
                excludes.insert("pdflatex");
-       } else if (inputenc != "ascii" && inputenc != "utf8-plain")
+       } else if (inputenc != "ascii" && inputenc != "utf8-plain") {
                  // XeTeX with TeX fonts requires input encoding ascii (#10600).
                  excludes.insert("xetex");
-       FormatList result = theConverters().getReachable(backs[0], only_viewable,
-                                                                                                        true, excludes);
-       for (vector<string>::const_iterator it = backs.begin() + 1;
-            it != backs.end(); ++it) {
+       }
+
+       FormatList result =
+               theConverters().getReachable(backs[0], only_viewable, true, excludes);
+       vector<string>::const_iterator it = backs.begin() + 1;
+       for (; it != backs.end(); ++it) {
                FormatList r = theConverters().getReachable(*it, only_viewable,
                                                                                                        false, excludes);
                result.insert(result.end(), r.begin(), r.end());
@@ -2655,6 +2705,7 @@ vector<string> BufferParams::backends() const
        }
 
        v.push_back("xhtml");
+       v.push_back("docbook5");
        v.push_back("text");
        v.push_back("lyx");
        return v;
@@ -2677,6 +2728,8 @@ OutputParams::FLAVOR BufferParams::getOutputFlavor(string const & format) const
        //       something with formats.
        if (dformat == "xhtml")
                result = OutputParams::HTML;
+       else if (dformat == "docbook5")
+               result = OutputParams::DOCBOOK5;
        else if (dformat == "text")
                result = OutputParams::TEXT;
        else if (dformat == "lyx")
@@ -2716,13 +2769,6 @@ string BufferParams::getDefaultOutputFormat() const
        if (!default_output_format.empty()
            && default_output_format != "default")
                return default_output_format;
-       if (isDocBook()) {
-               FormatList const & formats = exportableFormats(true);
-               if (formats.empty())
-                       return string();
-               // return the first we find
-               return formats.front()->name();
-       }
        if (encoding().package() == Encoding::japanese)
                return lyxrc.default_platex_view_format;
        if (useNonTeXFonts)
@@ -2761,12 +2807,6 @@ bool BufferParams::isLiterate() const
 }
 
 
-bool BufferParams::isDocBook() const
-{
-       return documentClass().outputType() == DOCBOOK;
-}
-
-
 void BufferParams::readPreamble(Lexer & lex)
 {
        if (lex.getString() != "\\begin_preamble")
@@ -2916,12 +2956,10 @@ void BufferParams::readRemovedModules(Lexer & lex)
        // added. normally, that will be because default modules were added in
        // setBaseClass(), which gets called when \textclass is read at the
        // start of the read.
-       list<string>::const_iterator rit = removed_modules_.begin();
-       list<string>::const_iterator const ren = removed_modules_.end();
-       for (; rit != ren; ++rit) {
+       for (auto const & rm : removed_modules_) {
                LayoutModuleList::iterator const mit = layout_modules_.begin();
                LayoutModuleList::iterator const men = layout_modules_.end();
-               LayoutModuleList::iterator found = find(mit, men, *rit);
+               LayoutModuleList::iterator found = find(mit, men, rm);
                if (found == men)
                        continue;
                layout_modules_.erase(found);
@@ -3469,7 +3507,7 @@ string const & BufferParams::defaultBiblioStyle() const
 }
 
 
-bool const & BufferParams::fullAuthorList() const
+bool BufferParams::fullAuthorList() const
 {
        return documentClass().fullAuthorList();
 }