]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
Fix tests after 031748d9
[lyx.git] / src / BufferParams.cpp
index f6e7f50fd04c521850969f0a589c0b56603247bf..19abefc0dd9706fd872c284aa9f14af470368482 100644 (file)
@@ -342,6 +342,7 @@ public:
         */
        HSpace indentation;
        VSpace defskip;
+       HSpace math_indentation;
        PDFOptions pdfoptions;
        LayoutFileIndex baseClass_;
        FormatList exportableFormatList;
@@ -383,6 +384,8 @@ BufferParams::BufferParams()
        cite_engine_type_ = ENGINE_TYPE_DEFAULT;
        makeDocumentClass();
        paragraph_separation = ParagraphIndentSeparation;
+       is_math_indent = false;
+       math_indentation = "default";
        quotes_style = InsetQuotesParams::EnglishQuotes;
        dynamic_quotes = false;
        fontsize = "default";
@@ -393,6 +396,7 @@ BufferParams::BufferParams()
        use_geometry = false;
        biblio_style = "plain";
        use_bibtopic = false;
+       multibib = string();
        use_indices = false;
        save_transient_properties = true;
        track_changes = false;
@@ -414,6 +418,7 @@ BufferParams::BufferParams()
        fonts_default_family = "default";
        useNonTeXFonts = false;
        use_microtype = false;
+       use_dash_ligatures = true;
        fonts_expert_sc = false;
        fonts_old_figures = false;
        fonts_sans_scale[0] = 100;
@@ -522,6 +527,14 @@ map<string, string> const & BufferParams::auto_packages()
 }
 
 
+bool BufferParams::useBibtopic() const
+{
+       if (useBiblatex())
+               return false;
+       return (use_bibtopic || (!multibib.empty() && multibib != "child"));
+}
+
+
 AuthorList & BufferParams::authors()
 {
        return pimpl_->authorlist;
@@ -616,6 +629,18 @@ PDFOptions const & BufferParams::pdfoptions() const
 }
 
 
+HSpace const & BufferParams::getMathIndentation() const
+{
+       return pimpl_->math_indentation;
+}
+
+
+void BufferParams::setMathIndentation(HSpace const & indent)
+{
+       pimpl_->math_indentation = indent;
+}
+
+
 HSpace const & BufferParams::getIndentation() const
 {
        return pimpl_->indentation;
@@ -803,6 +828,8 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                lex >> fonts_cjk;
        } else if (token == "\\use_microtype") {
                lex >> use_microtype;
+       } else if (token == "\\use_dash_ligatures") {
+               lex >> use_dash_ligatures;
        } else if (token == "\\paragraph_separation") {
                string parsep;
                lex >> parsep;
@@ -818,6 +845,12 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                if (pimpl_->defskip.kind() == VSpace::DEFSKIP)
                        // that is invalid
                        pimpl_->defskip = VSpace(VSpace::MEDSKIP);
+       } else if (token == "\\is_math_indent") {
+               lex >> is_math_indent;
+       } else if (token == "\\math_indentation") {
+               lex.next();
+               string math_indentation = lex.getString();
+               pimpl_->math_indentation = HSpace(math_indentation);
        } else if (token == "\\quotes_style") {
                string qstyle;
                lex >> qstyle;
@@ -849,15 +882,17 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                biblio_style = lex.getString();
        } else if (token == "\\biblio_options") {
                lex.eatLine();
-               biblio_opts = lex.getString();
+               biblio_opts = trim(lex.getString());
        } else if (token == "\\biblatex_bibstyle") {
                lex.eatLine();
-               biblatex_bibstyle = lex.getString();
+               biblatex_bibstyle = trim(lex.getString());
        } else if (token == "\\biblatex_citestyle") {
                lex.eatLine();
-               biblatex_citestyle = lex.getString();
+               biblatex_citestyle = trim(lex.getString());
        } else if (token == "\\use_bibtopic") {
                lex >> use_bibtopic;
+       } else if (token == "\\multibib") {
+               lex >> multibib;
        } else if (token == "\\use_indices") {
                lex >> use_indices;
        } else if (token == "\\tracking_changes") {
@@ -1185,6 +1220,7 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
                os << "\\font_cjk " << fonts_cjk << '\n';
        }
        os << "\\use_microtype " << convert<string>(use_microtype) << '\n';
+       os << "\\use_dash_ligatures " << convert<string>(use_dash_ligatures) << '\n';
        os << "\\graphics " << graphics_driver << '\n';
        os << "\\default_output_format " << default_output_format << '\n';
        os << "\\output_sync " << output_sync << '\n';
@@ -1233,6 +1269,8 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
                os << "\n\\biblatex_bibstyle " << biblatex_bibstyle;
        if (!biblatex_citestyle.empty())
                os << "\n\\biblatex_citestyle " << biblatex_citestyle;
+       if (!multibib.empty())
+               os << "\n\\multibib " << multibib;
 
        os << "\n\\use_bibtopic " << convert<string>(use_bibtopic)
           << "\n\\use_indices " << convert<string>(use_indices)
@@ -1309,6 +1347,9 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
                os << "\n\\paragraph_indentation " << getIndentation().asLyXCommand();
        else
                os << "\n\\defskip " << getDefSkip().asLyXCommand();
+       os << "\n\\is_math_indent " << is_math_indent;
+       if (is_math_indent)
+               os << "\n\\math_indentation " << getMathIndentation().asLyXCommand();
        os << "\n\\quotes_style "
           << string_quotes_style[quotes_style]
           << "\n\\dynamic_quotes " << dynamic_quotes
@@ -1590,6 +1631,9 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
            && orientation == ORIENTATION_LANDSCAPE)
                clsoptions << "landscape,";
 
+       if (is_math_indent)
+               clsoptions << "fleqn,";
+
        // language should be a parameter to \documentclass
        if (language->babel() == "hebrew"
            && default_language->babel() != "hebrew")
@@ -1633,7 +1677,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
 
        // if we use fontspec or newtxmath, we have to load the AMS packages here
        string const ams = features.loadAMSPackages();
-       bool const ot1 = (font_encoding() == "default" || font_encoding() == "OT1");
+       bool const ot1 = (main_font_encoding() == "default" || main_font_encoding() == "OT1");
        bool const use_newtxmath =
                theLaTeXFonts().getLaTeXFont(from_ascii(fontsMath())).getUsedPackage(
                        ot1, false, false) == "newtxmath";
@@ -1660,7 +1704,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
        // set font encoding
        // XeTeX and LuaTeX (with OS fonts) do not need fontenc
        if (!useNonTeXFonts && !features.isProvided("fontenc")
-           && font_encoding() != "default") {
+           && main_font_encoding() != "default") {
                // get main font encodings
                vector<string> fontencs = font_encodings();
                // get font encodings of secondary languages
@@ -1914,6 +1958,16 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                }
        }
 
+       if (is_math_indent) {
+               // when formula indentation
+               // only output something when it is not the default
+               if (getMathIndentation().asLyXCommand() != "default") {
+                       os << "\\setlength{\\mathindent}{"
+                          << from_utf8(getMathIndentation().asLatexCommand())
+                          << "}\n";
+               }
+       }
+
        // Now insert the LyX specific LaTeX commands...
        features.resolveAlternatives();
        features.expandMultiples();
@@ -1961,20 +2015,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                IndicesList::const_iterator iit = indiceslist().begin();
                IndicesList::const_iterator iend = indiceslist().end();
                for (; iit != iend; ++iit) {
-                       pair<docstring, docstring> indexname_latex =
-                               features.runparams().encoding->latexString(iit->index(),
-                                                                          features.runparams().dryrun);
-                       if (!indexname_latex.second.empty()) {
-                               // issue a warning about omitted characters
-                               // FIXME: should be passed to the error dialog
-                               frontend::Alert::warning(_("Uncodable characters"),
-                                       bformat(_("The following characters that are used in an index name are not\n"
-                                                 "representable in the current encoding and therefore have been omitted:\n%1$s."),
-                                               indexname_latex.second));
-                       }
-                       os << "\\newindex[";
-                       os << indexname_latex.first;
-                       os << "]{";
+                       os << "\\newindex{";
                        os << escape(iit->shortcut());
                        os << "}\n";
                }
@@ -2176,12 +2217,19 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                os << "}\n";
        }
 
-       // xunicode needs to be loaded at least after amsmath, amssymb,
+       // xunicode only needs to be loaded if tipa is used
+       // (the rest is obsoleted by the new TU encoding).
+       // It needs to be loaded at least after amsmath, amssymb,
        // esint and the other packages that provide special glyphs
-       // The package only supports XeTeX currently.
-       if (features.runparams().flavor == OutputParams::XETEX
-           && useNonTeXFonts)
+       if (features.mustProvide("tipa") && useNonTeXFonts) {
+               // The package officially only supports XeTeX, but also works
+               // with LuaTeX. Thus we work around its XeTeX test.
+               if (features.runparams().flavor != OutputParams::XETEX) {
+                       os << "% Pretend to xunicode that we are XeTeX\n"
+                          << "\\def\\XeTeXpicfile{}\n";
+               }
                os << "\\usepackage{xunicode}\n";
+       }
 
        // Polyglossia must be loaded last ...
        if (use_polyglossia) {
@@ -2226,6 +2274,10 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                                delim = ",";
                        }
                }
+               if (!multibib.empty() && multibib != "child") {
+                       opts += delim + "refsection=" + multibib;
+                       delim = ",";
+               }
                if (bibtexCommand() == "bibtex8"
                    || prefixIs(bibtexCommand(), "bibtex8 ")) {
                        opts += delim + "backend=bibtex8";
@@ -2981,7 +3033,7 @@ string const BufferParams::dvips_options() const
 }
 
 
-string const BufferParams::font_encoding() const
+string const BufferParams::main_font_encoding() const
 {
        return font_encodings().empty() ? "default" : font_encodings().back();
 }
@@ -3217,7 +3269,7 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const
        }
 
        // Tex Fonts
-       bool const ot1 = (font_encoding() == "default" || font_encoding() == "OT1");
+       bool const ot1 = (main_font_encoding() == "default" || main_font_encoding() == "OT1");
        bool const dryrun = features.runparams().dryrun;
        bool const complete = (fontsSans() == "default" && fontsTypewriter() == "default");
        bool const nomath = (fontsMath() == "default");
@@ -3294,8 +3346,12 @@ bool BufferParams::addCiteEngine(vector<string> const & engine)
 
 string const & BufferParams::defaultBiblioStyle() const
 {
-       map<string, string> bs = documentClass().defaultBiblioStyle();
-       return bs[theCiteEnginesList.getTypeAsString(citeEngineType())];
+       map<string, string> const & bs = documentClass().defaultBiblioStyle();
+       auto cit = bs.find(theCiteEnginesList.getTypeAsString(citeEngineType()));
+       if (cit != bs.end())
+               return cit->second;
+       else
+               return empty_string();
 }
 
 
@@ -3355,14 +3411,42 @@ vector<CitationStyle> BufferParams::citeStyles() const
 }
 
 
-string const BufferParams::bibtexCommand() const
+string const BufferParams::bibtexCommand() const
 {
+       // Return document-specific setting if available
        if (bibtex_command != "default")
                return bibtex_command;
-       else if (encoding().package() == Encoding::japanese)
-               return lyxrc.jbibtex_command;
-       else
+
+       // If we have "default" in document settings, consult the prefs
+       // 1. Japanese (uses a specific processor)
+       if (encoding().package() == Encoding::japanese) {
+               if (lyxrc.jbibtex_command != "automatic")
+                       // Return the specified program, if "automatic" is not set
+                       return lyxrc.jbibtex_command;
+               else if (!useBiblatex()) {
+                       // With classic BibTeX, return pbibtex, jbibtex, bibtex
+                       if (lyxrc.jbibtex_alternatives.find("pbibtex") != lyxrc.jbibtex_alternatives.end())
+                               return "pbibtex";
+                       if (lyxrc.jbibtex_alternatives.find("jbibtex") != lyxrc.jbibtex_alternatives.end())
+                               return "jbibtex";
+                       return "bibtex";
+               }
+       }
+       // 2. All other languages
+       else if (lyxrc.bibtex_command != "automatic")
+               // Return the specified program, if "automatic" is not set
                return lyxrc.bibtex_command;
+
+       // 3. Automatic: find the most suitable for the current cite framework
+       if (useBiblatex()) {
+               // For Biblatex, we prefer biber (also for Japanese)
+               // and fall back to bibtex8 and, as last resort, bibtex
+               if (lyxrc.bibtex_alternatives.find("biber") != lyxrc.bibtex_alternatives.end())
+                       return "biber";
+               else if (lyxrc.bibtex_alternatives.find("bibtex8") != lyxrc.bibtex_alternatives.end())
+                       return "bibtex8";
+       }
+       return "bibtex";
 }