]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
Fix build with GNU libstdc++ C++11 ABI
[lyx.git] / src / BufferParams.cpp
index 8ae249ea23cea84b05d2be4450c06c31be382a1f..a12a2860dc037d4c7d87a068b998180c278e5ded 100644 (file)
@@ -417,6 +417,7 @@ BufferParams::BufferParams()
        html_math_output = MathML;
        html_math_img_scale = 1.0;
        html_css_as_file = false;
+       display_pixel_ratio = 1.0;
 
        output_sync = false;
        use_refstyle = true;
@@ -633,7 +634,7 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                                                 "See section 3.1.2.2 (Class Availability) of the\n"
                                                 "User's Guide for more information."), desc, prereqs);
                        frontend::Alert::warning(_("Document class not available"),
-                                      msg);
+                                      msg, true);
                }
        } else if (token == "\\begin_preamble") {
                readPreamble(lex);
@@ -1325,6 +1326,11 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
        // are doing!
        if (features.mustProvide("fix-cm"))
                os << "\\RequirePackage{fix-cm}\n";
+       // Likewise for fixltx2e. If other packages conflict with this policy,
+       // treat it as a package bug (and report it!)
+       // See http://www.latex-project.org/cgi-bin/ltxbugs2html?pr=latex/4407
+       if (features.mustProvide("fixltx2e"))
+               os << "\\RequirePackage{fixltx2e}\n";
 
        os << "\\documentclass";
 
@@ -1490,32 +1496,16 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                   << from_ascii(fonts_default_family) << "}\n";
 
        // set font encoding
-       // for arabic_arabi and farsi we also need to load the LAE and
-       // LFE encoding
-       // XeTeX and LuaTeX (with OS fonts) work without fontenc
-       if (font_encoding() != "default" && language->lang() != "japanese"
-           && !useNonTeXFonts && !features.isProvided("fontenc")) {
-               docstring extra_encoding;
-               if (features.mustProvide("textgreek"))
-                       extra_encoding += from_ascii("LGR");
-               if (features.mustProvide("textcyr")) {
-                       if (!extra_encoding.empty())
-                               extra_encoding.push_back(',');
-                       extra_encoding += from_ascii("T2A");
-               }
-               if (!extra_encoding.empty() && !font_encoding().empty())
-                       extra_encoding.push_back(',');
-               size_t fars = language_options.str().find("farsi");
-               size_t arab = language_options.str().find("arabic");
-               if (language->lang() == "arabic_arabi"
-                       || language->lang() == "farsi" || fars != string::npos
-                       || arab != string::npos) {
-                       os << "\\usepackage[" << extra_encoding
-                          << from_ascii(font_encoding())
-                          << ",LFE,LAE]{fontenc}\n";
-               } else {
-                       os << "\\usepackage[" << extra_encoding
-                          << from_ascii(font_encoding())
+       // XeTeX and LuaTeX (with OS fonts) do not need fontenc
+       if (!useNonTeXFonts && !features.isProvided("fontenc")
+           && font_encoding() != "default") {
+               // get main font encodings
+               vector<string> fontencs = font_encodings();
+               // get font encodings of secondary languages
+               features.getFontEncodings(fontencs);
+               if (!fontencs.empty()) {
+                       os << "\\usepackage["
+                          << from_ascii(getStringFromVector(fontencs))
                           << "]{fontenc}\n";
                }
        }
@@ -1775,6 +1765,9 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                        lyxpreamble += "\\synctex=-1\n";
        }
 
+       // The package options (via \PassOptionsToPackage)
+       lyxpreamble += 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
@@ -1891,6 +1884,13 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                        "User specified LaTeX commands.\n"
                        + from_utf8(preamble) + '\n';
 
+       // footmisc must be loaded after setspace
+       // Load it here to avoid clashes with footmisc loaded in the user
+       // preamble. For that reason we also pass the options via
+       // \PassOptionsToPackage in getPreamble() and not here.
+       if (features.mustProvide("footmisc"))
+               atlyxpreamble += "\\usepackage{footmisc}\n";
+
        // subfig loads internally the LaTeX package "caption". As
        // caption is a very popular package, users will load it in
        // the preamble. Therefore we must load subfig behind the
@@ -1947,7 +1947,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                        + atlyxpreamble + "\\makeatother\n\n";
 
        // We try to load babel late, in case it interferes with other packages.
-       // Jurabib, hyperref, varioref and listings (bug 8995) have to be
+       // Jurabib, hyperref, varioref, bicaption and listings (bug 8995) have to be
        // called after babel, though.
        if (use_babel && !features.isRequired("jurabib")
            && !features.isRequired("hyperref")
@@ -1960,6 +1960,8 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                                                   features.needBabelLangOptions())) + '\n';
                lyxpreamble += from_utf8(features.getBabelPostsettings());
        }
+       if (features.isRequired("bicaption"))
+               lyxpreamble += "\\usepackage{bicaption}\n";
        if (!listings_params.empty() || features.isRequired("listings"))
                lyxpreamble += "\\usepackage{listings}\n";
        if (!listings_params.empty()) {
@@ -2750,7 +2752,31 @@ string const BufferParams::dvips_options() const
 
 string const BufferParams::font_encoding() const
 {
-       return (fontenc == "global") ? lyxrc.fontenc : fontenc;
+       return font_encodings().empty() ? "default" : font_encodings().back();
+}
+
+
+vector<string> const BufferParams::font_encodings() const
+{
+       string doc_fontenc = (fontenc == "global") ? lyxrc.fontenc : fontenc;
+
+       vector<string> fontencs;
+
+       // "default" means "no explicit font encoding"
+       if (doc_fontenc != "default") {
+               fontencs = getVectorFromString(doc_fontenc);
+               if (!language->fontenc().empty()
+                   && ascii_lowercase(language->fontenc()) != "none") {
+                       vector<string> fencs = getVectorFromString(language->fontenc());
+                       vector<string>::const_iterator fit = fencs.begin();
+                       for (; fit != fencs.end(); ++fit) {
+                               if (find(fontencs.begin(), fontencs.end(), *fit) == fontencs.end())
+                                       fontencs.push_back(*fit);
+                       }
+               }
+       }
+
+       return fontencs;
 }
 
 
@@ -2820,7 +2846,8 @@ void BufferParams::writeEncodingPreamble(otexstream & os,
                // inputenc must be omitted.
                // see http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg129680.html
                if ((!encodings.empty() || package == Encoding::inputenc)
-                   && !features.isRequired("japanese")) {
+                   && !features.isRequired("japanese")
+                   && !features.isProvided("inputenc")) {
                        os << "\\usepackage[";
                        set<string>::const_iterator it = encodings.begin();
                        set<string>::const_iterator const end = encodings.end();
@@ -2851,7 +2878,9 @@ void BufferParams::writeEncodingPreamble(otexstream & os,
                        break;
                case Encoding::inputenc:
                        // do not load inputenc if japanese is used
-                       if (features.isRequired("japanese"))
+                       // or if the class provides inputenc
+                       if (features.isRequired("japanese")
+                           || features.isProvided("inputenc"))
                                break;
                        os << "\\usepackage[" << from_ascii(encoding().latexName())
                           << "]{inputenc}\n";
@@ -2987,7 +3016,8 @@ Encoding const & BufferParams::encoding() const
        // FIXME: actually, we should check for the flavor
        // or runparams.isFullyUnicode() here:
        // This check will not work with XeTeX/LuaTeX and tex fonts.
-       // Thus we have to reset the encoding in Buffer::makeLaTeXFile.
+       // Thus we have to reset the encoding in Buffer::makeLaTeXFile
+       // (for export) and Buffer::writeLaTeXSource (for preview).
        if (useNonTeXFonts)
                return *(encodings.fromLyXName("utf8-plain"));
        if (inputenc == "auto" || inputenc == "default")