]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
Comment
[lyx.git] / src / BufferParams.cpp
index 0bdee627163a8bf0384c8c59ca0d1dbc4913ea8b..2a3841f85dd976b9999fd834588cc4654589fc30 100644 (file)
@@ -72,7 +72,11 @@ static char const * const string_quotes_language[] = {
 
 static char const * const string_papersize[] = {
        "default", "custom", "letterpaper", "legalpaper", "executivepaper",
-       "a3paper", "a4paper", "a5paper", "b3paper", "b4paper", "b5paper", ""
+       "a0paper", "a1paper", "a2paper", "a3paper",     "a4paper", "a5paper",
+       "a6paper", "b0paper", "b1paper", "b2paper","b3paper", "b4paper",
+       "b5paper", "b6paper", "c0paper", "c1paper", "c2paper", "c3paper",
+       "c4paper", "c5paper", "c6paper", "b0j", "b1j", "b2j", "b3j", "b4j", "b5j",
+       "b6j", ""
 };
 
 
@@ -156,12 +160,34 @@ static PaperSizeTranslator initPaperSizeTranslator()
        translator.addPair(string_papersize[2], PAPER_USLETTER);
        translator.addPair(string_papersize[3], PAPER_USLEGAL);
        translator.addPair(string_papersize[4], PAPER_USEXECUTIVE);
-       translator.addPair(string_papersize[5], PAPER_A3);
-       translator.addPair(string_papersize[6], PAPER_A4);
-       translator.addPair(string_papersize[7], PAPER_A5);
-       translator.addPair(string_papersize[8], PAPER_B3);
-       translator.addPair(string_papersize[9], PAPER_B4);
-       translator.addPair(string_papersize[10], PAPER_B5);
+       translator.addPair(string_papersize[5], PAPER_A0);
+       translator.addPair(string_papersize[6], PAPER_A1);
+       translator.addPair(string_papersize[7], PAPER_A2);
+       translator.addPair(string_papersize[8], PAPER_A3);
+       translator.addPair(string_papersize[9], PAPER_A4);
+       translator.addPair(string_papersize[10], PAPER_A5);
+       translator.addPair(string_papersize[11], PAPER_A6);
+       translator.addPair(string_papersize[12], PAPER_B0);
+       translator.addPair(string_papersize[13], PAPER_B1);
+       translator.addPair(string_papersize[14], PAPER_B2);
+       translator.addPair(string_papersize[15], PAPER_B3);
+       translator.addPair(string_papersize[16], PAPER_B4);
+       translator.addPair(string_papersize[17], PAPER_B5);
+       translator.addPair(string_papersize[18], PAPER_B6);
+       translator.addPair(string_papersize[19], PAPER_C0);
+       translator.addPair(string_papersize[20], PAPER_C1);
+       translator.addPair(string_papersize[21], PAPER_C2);
+       translator.addPair(string_papersize[22], PAPER_C3);
+       translator.addPair(string_papersize[23], PAPER_C4);
+       translator.addPair(string_papersize[24], PAPER_C5);
+       translator.addPair(string_papersize[25], PAPER_C6);
+       translator.addPair(string_papersize[26], PAPER_JISB0);
+       translator.addPair(string_papersize[27], PAPER_JISB1);
+       translator.addPair(string_papersize[28], PAPER_JISB2);
+       translator.addPair(string_papersize[29], PAPER_JISB3);
+       translator.addPair(string_papersize[30], PAPER_JISB4);
+       translator.addPair(string_papersize[31], PAPER_JISB5);
+       translator.addPair(string_papersize[32], PAPER_JISB6);
        return translator;
 }
 
@@ -337,6 +363,7 @@ BufferParams::BufferParams()
        use_amsmath = package_auto;
        use_esint = package_auto;
        use_mhchem = package_auto;
+       use_mathdots = package_auto;
        cite_engine_ = ENGINE_BASIC;
        use_bibtopic = false;
        use_indices = false;
@@ -367,13 +394,15 @@ BufferParams::BufferParams()
        listings_params = string();
        pagestyle = "default";
        suppress_date = false;
-       // white is equal to no background color
+       // no color is the default (white)
        backgroundcolor = lyx::rgbFromHexName("#ffffff");
+       isbackgroundcolor = false;
        // no color is the default (black)
        fontcolor = lyx::rgbFromHexName("#000000");
        isfontcolor = false;
        // light gray is the default font color for greyed-out notes
        notefontcolor = lyx::rgbFromHexName("#cccccc");
+       boxbgcolor = lyx::rgbFromHexName("#ff0000");
        compressed = lyxrc.save_compressed;
        for (int iter = 0; iter < 4; ++iter) {
                user_defined_bullet(iter) = ITEMIZE_DEFAULTS[iter];
@@ -381,8 +410,12 @@ BufferParams::BufferParams()
        }
        // default index
        indiceslist().addDefault(B_("Index"));
-       html_be_strict = true;
+       html_be_strict = false;
        html_math_output = MathML;
+       html_math_img_scale = 1.0;
+
+       output_sync = false;
+       use_refstyle = true;
 }
 
 
@@ -501,6 +534,8 @@ VSpace const & BufferParams::getDefSkip() const
 
 void BufferParams::setDefSkip(VSpace const & vs)
 {
+       // DEFSKIP will cause an infinite loop
+       LASSERT(vs.kind() != VSpace::DEFSKIP, return);
        pimpl_->defskip = vs;
 }
 
@@ -516,7 +551,7 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                string tcp;
                LayoutFileList & bcl = LayoutFileList::get();
                if (tcp.empty() && !filepath.empty())
-                       tcp = bcl.addLocalLayout(classname, filepath.absFilename());
+                       tcp = bcl.addLocalLayout(classname, filepath.absFileName());
                if (!tcp.empty())
                        setBaseClass(tcp);
                else
@@ -524,19 +559,19 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                // We assume that a tex class exists for local or unknown layouts so this warning
                // will only be given for system layouts.
                if (!baseClass()->isTeXClassAvailable()) {
-                       docstring desc = 
+                       docstring const desc = 
                                translateIfPossible(from_utf8(baseClass()->description()));
+                       docstring const prereqs = from_utf8(baseClass()->prerequisites());
                        docstring const msg =
-                               bformat(_("The document class requested\n"
+                               bformat(_("The selected document class\n"
                                                 "\t%1$s\n"
                                                 "requires external files that are not available.\n"
-                                                "The document class can still be used, but LyX\n"
-                                                "will not be able to produce output until the\n"
-                                                "following prerequisites are installed:\n"
+                                                "The document class can still be used, but the\n"
+                                                "document cannot be compiled until the following\n"
+                                                "prerequisites are installed:\n"
                                                 "\t%2$s\n"
                                                 "See section 3.1.2.2 of the User's Guide for\n"
-                                                "more information."), 
-                                                desc, from_utf8(baseClass()->prerequisites()));
+                                                "more information."), desc, prereqs);
                        frontend::Alert::warning(_("Document class not available"),
                                       msg);
                }
@@ -612,11 +647,11 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                pimpl_->indentation = HSpace(indentation);
        } else if (token == "\\defskip") {
                lex.next();
-               string defskip = lex.getString();
-               if (defskip == "defskip")
-                       // this is invalid
-                       defskip = "medskip";
+               string const defskip = lex.getString();
                pimpl_->defskip = VSpace(defskip);
+               if (pimpl_->defskip.kind() == VSpace::DEFSKIP)
+                       // that is invalid
+                       pimpl_->defskip = VSpace(VSpace::MEDSKIP);
        } else if (token == "\\quotes_language") {
                string quotes_lang;
                lex >> quotes_lang;
@@ -639,6 +674,10 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                int usemhchem;
                lex >> usemhchem;
                use_mhchem = packagetranslator().find(usemhchem);
+       } else if (token == "\\use_mathdots") {
+               int usemathdots;
+               lex >> usemathdots;
+               use_mathdots = packagetranslator().find(usemathdots);
        } else if (token == "\\cite_engine") {
                string engine;
                lex >> engine;
@@ -669,7 +708,7 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                        if (tok == "\\filename_suffix") {
                                lex.next();
                                if (branch_ptr)
-                                       branch_ptr->setFilenameSuffix(lex.getInteger());
+                                       branch_ptr->setFileNameSuffix(lex.getInteger());
                        }
                        if (tok == "\\color") {
                                lex.eatLine();
@@ -726,6 +765,7 @@ string BufferParams::readToken(Lexer & lex, string const & token,
        } else if (token == "\\backgroundcolor") {
                lex.eatLine();
                backgroundcolor = lyx::rgbFromHexName(lex.getString());
+               isbackgroundcolor = true;
        } else if (token == "\\fontcolor") {
                lex.eatLine();
                fontcolor = lyx::rgbFromHexName(lex.getString());
@@ -734,8 +774,10 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                lex.eatLine();
                string color = lex.getString();
                notefontcolor = lyx::rgbFromHexName(color);
-               // set the font color within LyX
-               lcolor.setColor(Color_greyedouttext, color);
+       } else if (token == "\\boxbgcolor") {
+               lex.eatLine();
+               string color = lex.getString();
+               boxbgcolor = lyx::rgbFromHexName(color);
        } else if (token == "\\paperwidth") {
                lex >> paperwidth;
        } else if (token == "\\paperheight") {
@@ -802,6 +844,20 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                html_math_output = static_cast<MathOutput>(temp);
        } else if (token == "\\html_be_strict") {
                lex >> html_be_strict;
+       } else if (token == "\\html_math_img_scale") {
+               lex >> html_math_img_scale;
+       } else if (token == "\\html_latex_start") {
+               lex.eatLine();
+               html_latex_start = lex.getString();
+       } else if (token == "\\html_latex_end") {
+               lex.eatLine();
+               html_latex_end = lex.getString();
+       } else if (token == "\\output_sync") {
+               lex >> output_sync;
+       } else if (token == "\\output_sync_macro") {
+               lex >> output_sync_macro;
+       } else if (token == "\\use_refstyle") {
+               lex >> use_refstyle;
        } else {
                lyxerr << "BufferParams::readToken(): Unknown token: " << 
                        token << endl;
@@ -904,6 +960,9 @@ void BufferParams::writeFile(ostream & os) const
        }
        os << "\n\\graphics " << graphicsDriver << '\n';
        os << "\\default_output_format " << defaultOutputFormat << '\n';
+       os << "\\output_sync " << output_sync << '\n';
+       if (!output_sync_macro.empty())
+               os << "\\output_sync_macro \"" << output_sync_macro << "\"\n";
        os << "\\bibtex_command " << bibtex_command << '\n';
        os << "\\index_command " << index_command << '\n';
 
@@ -920,25 +979,29 @@ void BufferParams::writeFile(ostream & os) const
           << "\n\\use_amsmath " << use_amsmath
           << "\n\\use_esint " << use_esint
           << "\n\\use_mhchem " << use_mhchem
+          << "\n\\use_mathdots " << use_mathdots
           << "\n\\cite_engine " << citeenginetranslator().find(cite_engine_)
           << "\n\\use_bibtopic " << convert<string>(use_bibtopic)
           << "\n\\use_indices " << convert<string>(use_indices)
           << "\n\\paperorientation " << string_orientation[orientation]
           << "\n\\suppress_date " << convert<string>(suppress_date)
+                << "\n\\use_refstyle " << use_refstyle
           << '\n';
-          if (backgroundcolor != lyx::rgbFromHexName("#ffffff"))
+       if (isbackgroundcolor == true)
                os << "\\backgroundcolor " << lyx::X11hexname(backgroundcolor) << '\n';
-          if (isfontcolor == true)
+       if (isfontcolor == true)
                os << "\\fontcolor " << lyx::X11hexname(fontcolor) << '\n';
-          if (notefontcolor != lyx::rgbFromHexName("#cccccc"))
+       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\\filename_suffix " << it->hasFileNameSuffix()
                   << "\n\\color " << lyx::X11hexname(it->color())
                   << "\n\\end_branch"
                   << "\n";
@@ -1017,10 +1080,17 @@ void BufferParams::writeFile(ostream & os) const
                }
        }
 
-       os << "\\tracking_changes " << convert<string>(trackChanges) << "\n"
-          << "\\output_changes " << convert<string>(outputChanges) << "\n"
-          << "\\html_math_output " << html_math_output << "\n"
-          << "\\html_be_strict " << convert<string>(html_be_strict) << "\n";
+       os << "\\tracking_changes " << convert<string>(trackChanges) << '\n'
+                << "\\output_changes " << convert<string>(outputChanges) << '\n'
+                << "\\html_math_output " << html_math_output << '\n'
+                << "\\html_be_strict " << convert<string>(html_be_strict) << '\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())
+               os << "\\html_latex_start " << html_latex_start << '\n';
+       if (!html_latex_end.empty())
+                os << "\\html_latex_end " << html_latex_end << '\n';
 
        os << pimpl_->authorlist;
 }
@@ -1077,6 +1147,8 @@ void BufferParams::validate(LaTeXFeatures & features) const
                features.require("esint");
        if (use_mhchem == package_on)
                features.require("mhchem");
+       if (use_mathdots == package_on)
+               features.require("mathdots");
 
        // Document-level line spacing
        if (spacing().getSpace() != Spacing::Single && !spacing().isDefault())
@@ -1138,11 +1210,15 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                clsoptions << fontsize << "pt,";
        }
 
-       // custom, A3, B3 and B4 paper sizes need geometry
-       bool nonstandard_papersize = papersize == PAPER_B3
-               || papersize == PAPER_B4
-               || papersize == PAPER_A3
-               || papersize == PAPER_CUSTOM;
+       // all paper sizes except of A4, A5, B5 and the US sizes need the
+       // geometry package
+       bool nonstandard_papersize = papersize != PAPER_DEFAULT
+               && papersize != PAPER_USLETTER
+               && papersize != PAPER_USLEGAL
+               && papersize != PAPER_USEXECUTIVE
+               && papersize != PAPER_A4
+               && papersize != PAPER_A5
+               && papersize != PAPER_B5;
 
        if (!use_geometry) {
                switch (papersize) {
@@ -1165,9 +1241,31 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                        clsoptions << "legalpaper,";
                        break;
                case PAPER_DEFAULT:
+               case PAPER_A0:
+               case PAPER_A1:
+               case PAPER_A2:
                case PAPER_A3:
+               case PAPER_A6:
+               case PAPER_B0:
+               case PAPER_B1:
+               case PAPER_B2:
                case PAPER_B3:
                case PAPER_B4:
+               case PAPER_B6:
+               case PAPER_C0:
+               case PAPER_C1:
+               case PAPER_C2:
+               case PAPER_C3:
+               case PAPER_C4:
+               case PAPER_C5:
+               case PAPER_C6:
+               case PAPER_JISB0:
+               case PAPER_JISB1:
+               case PAPER_JISB2:
+               case PAPER_JISB3:
+               case PAPER_JISB4:
+               case PAPER_JISB5:
+               case PAPER_JISB6:
                case PAPER_CUSTOM:
                        break;
                }
@@ -1204,7 +1302,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                features.useLanguage(default_language);
 
        ostringstream language_options;
-       bool const use_babel = features.useBabel();
+       bool const use_babel = features.useBabel() && !tclass.provides("babel");
        if (use_babel) {
                language_options << features.getLanguages();
                if (!language->babel().empty()) {
@@ -1279,9 +1377,12 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        // LFE encoding
        // XeTeX works without fontenc
        if (font_encoding() != "default" && language->lang() != "japanese"
-           && !useXetex) {
+           && !useXetex && !tclass.provides("fontenc")) {
+               size_t fars = language_options.str().find("farsi");
+               size_t arab = language_options.str().find("arabic");
                if (language->lang() == "arabic_arabi"
-                   || language->lang() == "farsi") {
+                       || language->lang() == "farsi" || fars != string::npos
+                       || arab != string::npos) {
                        os << "\\usepackage[" << from_ascii(font_encoding())
                           << ",LFE,LAE]{fontenc}\n";
                        texrow.newline();
@@ -1302,9 +1403,9 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                bool first = true;
                for (; it != includedChildren_.end() ; ++it) {
                        string incfile = *it;
-                       FileName inc = makeAbsPath(incfile, filepath.absFilename());
-                       string mangled = DocFileName(changeExtension(inc.absFilename(), ".tex")).
-                       mangledFilename();
+                       FileName inc = makeAbsPath(incfile, filepath.absFileName());
+                       string mangled = DocFileName(changeExtension(inc.absFileName(), ".tex")).
+                       mangledFileName();
                        if (!features.runparams().nice)
                                incfile = mangled;
                        // \includeonly doesn't want an extension 
@@ -1366,6 +1467,15 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                case PAPER_USEXECUTIVE:
                        ods << ",executivepaper";
                        break;
+               case PAPER_A0:
+                       ods << ",a0paper";
+                       break;
+               case PAPER_A1:
+                       ods << ",a1paper";
+                       break;
+               case PAPER_A2:
+                       ods << ",a2paper";
+                       break;
                case PAPER_A3:
                        ods << ",a3paper";
                        break;
@@ -1375,6 +1485,18 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                case PAPER_A5:
                        ods << ",a5paper";
                        break;
+               case PAPER_A6:
+                       ods << ",a6paper";
+                       break;
+               case PAPER_B0:
+                       ods << ",b0paper";
+                       break;
+               case PAPER_B1:
+                       ods << ",b1paper";
+                       break;
+               case PAPER_B2:
+                       ods << ",b2paper";
+                       break;
                case PAPER_B3:
                        ods << ",b3paper";
                        break;
@@ -1384,6 +1506,51 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                case PAPER_B5:
                        ods << ",b5paper";
                        break;
+               case PAPER_B6:
+                       ods << ",b6paper";
+                       break;
+               case PAPER_C0:
+                       ods << ",c0paper";
+                       break;
+               case PAPER_C1:
+                       ods << ",c1paper";
+                       break;
+               case PAPER_C2:
+                       ods << ",c2paper";
+                       break;
+               case PAPER_C3:
+                       ods << ",c3paper";
+                       break;
+               case PAPER_C4:
+                       ods << ",c4paper";
+                       break;
+               case PAPER_C5:
+                       ods << ",c5paper";
+                       break;
+               case PAPER_C6:
+                       ods << ",c6paper";
+                       break;
+               case PAPER_JISB0:
+                       ods << ",b0j";
+                       break;
+               case PAPER_JISB1:
+                       ods << ",b1j";
+                       break;
+               case PAPER_JISB2:
+                       ods << ",b2j";
+                       break;
+               case PAPER_JISB3:
+                       ods << ",b3j";
+                       break;
+               case PAPER_JISB4:
+                       ods << ",b4j";
+                       break;
+               case PAPER_JISB5:
+                       ods << ",b5j";
+                       break;
+               case PAPER_JISB6:
+                       ods << ",b6j";
+                       break;
                default:
                        // default papersize ie PAPER_DEFAULT
                        switch (lyxrc.default_papersize) {
@@ -1409,8 +1576,30 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                        case PAPER_B5:
                                ods << ",b5paper";
                                break;
+                       case PAPER_A0:
+                       case PAPER_A1:
+                       case PAPER_A2:
+                       case PAPER_A6:
+                       case PAPER_B0:
+                       case PAPER_B1:
+                       case PAPER_B2:
                        case PAPER_B3:
                        case PAPER_B4:
+                       case PAPER_B6:
+                       case PAPER_C0:
+                       case PAPER_C1:
+                       case PAPER_C2:
+                       case PAPER_C3:
+                       case PAPER_C4:
+                       case PAPER_C5:
+                       case PAPER_C6:
+                       case PAPER_JISB0:
+                       case PAPER_JISB1:
+                       case PAPER_JISB2:
+                       case PAPER_JISB3:
+                       case PAPER_JISB4:
+                       case PAPER_JISB5:
+                       case PAPER_JISB6:
                        case PAPER_CUSTOM:
                                break;
                        }
@@ -1421,26 +1610,30 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                        os << '[' << g_options << ']';
                os << "{geometry}\n";
                texrow.newline();
-               os << "\\geometry{verbose";
-               if (!topmargin.empty())
-                       os << ",tmargin=" << from_ascii(Length(topmargin).asLatexString());
-               if (!bottommargin.empty())
-                       os << ",bmargin=" << from_ascii(Length(bottommargin).asLatexString());
-               if (!leftmargin.empty())
-                       os << ",lmargin=" << from_ascii(Length(leftmargin).asLatexString());
-               if (!rightmargin.empty())
-                       os << ",rmargin=" << from_ascii(Length(rightmargin).asLatexString());
-               if (!headheight.empty())
-                       os << ",headheight=" << from_ascii(Length(headheight).asLatexString());
-               if (!headsep.empty())
-                       os << ",headsep=" << from_ascii(Length(headsep).asLatexString());
-               if (!footskip.empty())
-                       os << ",footskip=" << from_ascii(Length(footskip).asLatexString());
-               if (!columnsep.empty())
-                       os << ",columnsep=" << from_ascii(Length(columnsep).asLatexString());
-               os << "}\n";
-               texrow.newline();
-       } else if (orientation == ORIENTATION_LANDSCAPE) {
+               // output this only if use_geometry is true
+               if (use_geometry) {
+                       os << "\\geometry{verbose";
+                       if (!topmargin.empty())
+                               os << ",tmargin=" << from_ascii(Length(topmargin).asLatexString());
+                       if (!bottommargin.empty())
+                               os << ",bmargin=" << from_ascii(Length(bottommargin).asLatexString());
+                       if (!leftmargin.empty())
+                               os << ",lmargin=" << from_ascii(Length(leftmargin).asLatexString());
+                       if (!rightmargin.empty())
+                               os << ",rmargin=" << from_ascii(Length(rightmargin).asLatexString());
+                       if (!headheight.empty())
+                               os << ",headheight=" << from_ascii(Length(headheight).asLatexString());
+                       if (!headsep.empty())
+                               os << ",headsep=" << from_ascii(Length(headsep).asLatexString());
+                       if (!footskip.empty())
+                               os << ",footskip=" << from_ascii(Length(footskip).asLatexString());
+                       if (!columnsep.empty())
+                               os << ",columnsep=" << from_ascii(Length(columnsep).asLatexString());
+                       os << "}\n";
+                       texrow.newline();
+               }
+       } else if (orientation == ORIENTATION_LANDSCAPE
+                  || papersize != PAPER_DEFAULT) {
                features.require("papersize");
        }
 
@@ -1454,8 +1647,8 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                texrow.newline();
        }
 
-       // only output when the background color is not white
-       if (backgroundcolor != lyx::rgbFromHexName("#ffffff")) {
+       // only output when the background color is not default
+       if (isbackgroundcolor == true) {
                // only require color here, the background color will be defined
                // in LaTeXFeatures.cpp to avoid interferences with the LaTeX
                // package pdfpages 
@@ -1463,7 +1656,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                features.require("pagecolor");
        }
 
-       // only output when the font color is not black
+       // only output when the font color is not default
        if (isfontcolor == true) {
                // only require color here, the font color will be defined
                // in LaTeXFeatures.cpp to avoid interferences with the LaTeX
@@ -1526,6 +1719,15 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        // Now insert the LyX specific LaTeX commands...
        docstring lyxpreamble;
 
+       if (output_sync) {
+               if (!output_sync_macro.empty())
+                       lyxpreamble += from_utf8(output_sync_macro) +"\n";
+               else if (features.runparams().flavor == OutputParams::LATEX)
+                       lyxpreamble += "\\usepackage[active]{srcltx}\n";
+               else if (features.runparams().flavor == OutputParams::PDFLATEX)
+                       lyxpreamble += "\\synctex=-1\n";
+       }
+
        // 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
@@ -1587,7 +1789,9 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                texrow.newlines(lines);
                // set back for the rest
                lyxpreamble.clear();
-       }
+       } else if (features.isRequired("nameref"))
+               // hyperref loads this automatically
+               lyxpreamble += "\\usepackage{nameref}\n";
 
        // Will be surrounded by \makeatletter and \makeatother when not empty
        docstring atlyxpreamble;
@@ -1744,12 +1948,14 @@ DocumentClass const & BufferParams::documentClass() const
 }
 
 
-DocumentClass const * BufferParams::documentClassPtr() const {
+DocumentClass const * BufferParams::documentClassPtr() const
+{
        return doc_class_;
 }
 
 
-void BufferParams::setDocumentClass(DocumentClass const * const tc) {
+void BufferParams::setDocumentClass(DocumentClass const * const tc)
+{
        // evil, but this function is evil
        doc_class_ = const_cast<DocumentClass *>(tc);
 }
@@ -1761,10 +1967,11 @@ bool BufferParams::setBaseClass(string const & classname)
        LayoutFileList & bcl = LayoutFileList::get();
        if (!bcl.haveClass(classname)) {
                docstring s = 
-                       bformat(_("The document class %1$s could not be found. "
-                               "A default textclass with default layouts will be used. "
-                               "LyX might not be able to produce output unless a correct "
-                               "textclass is selected from the document settings dialog."),
+                       bformat(_("The layout file:\n"
+                               "%1$s\n"
+                               "could not be found. A default textclass with default\n"
+                               "layouts will be used. LyX will not be able to produce\n"
+                               "correct output."),
                        from_utf8(classname));
                frontend::Alert::error(_("Document class not found"), s);
                bcl.addEmptyClass(classname);
@@ -1773,10 +1980,14 @@ bool BufferParams::setBaseClass(string const & classname)
        bool const success = bcl[classname].load();
        if (!success) {
                docstring s = 
-                       bformat(_("The document class %1$s could not be loaded."),
+                       bformat(_("Due to some error in it, the layout file:\n"
+                               "%1$s\n"
+                               "could not be loaded. A default textclass with default\n"
+                               "layouts will be used. LyX will not be able to produce\n"
+                               "correct output."),
                        from_utf8(classname));
                frontend::Alert::error(_("Could not load class"), s);
-               return false;
+               bcl.addEmptyClass(classname);
        }
 
        pimpl_->baseClass_ = classname;
@@ -1815,6 +2026,7 @@ void BufferParams::makeDocumentClass()
        }
 }
 
+
 bool BufferParams::moduleCanBeAdded(string const & modName) const
 {
        return layoutModules_.moduleCanBeAdded(modName, baseClass());
@@ -2032,14 +2244,42 @@ string BufferParams::paperSizeName(PapersizePurpose purpose) const
                }
                return string();
        }
+       case PAPER_A0:
+               // dvips and dvipdfm do not know this
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "a0";
+       case PAPER_A1:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "a1";
+       case PAPER_A2:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "a2";
        case PAPER_A3:
                return "a3";
        case PAPER_A4:
                return "a4";
        case PAPER_A5:
                return "a5";
+       case PAPER_A6:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "a6";
+       case PAPER_B0:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "b0";
+       case PAPER_B1:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "b1";
+       case PAPER_B2:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "b2";
        case PAPER_B3:
-               // dvips and dvipdfm do not know this
                if (purpose == DVIPS || purpose == DVIPDFM)
                        return string();
                return "b3";
@@ -2049,10 +2289,69 @@ string BufferParams::paperSizeName(PapersizePurpose purpose) const
                        return string();
                return "b4";
        case PAPER_B5:
-               // dvipdfm does not know this
                if (purpose == DVIPDFM)
                        return string();
                return "b5";
+       case PAPER_B6:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "b6";
+       case PAPER_C0:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "c0";
+       case PAPER_C1:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "c1";
+       case PAPER_C2:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "c2";
+       case PAPER_C3:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "c3";
+       case PAPER_C4:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "c4";
+       case PAPER_C5:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "c5";
+       case PAPER_C6:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "c6";
+       case PAPER_JISB0:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "jisb0";
+       case PAPER_JISB1:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "jisb1";
+       case PAPER_JISB2:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "jisb2";
+       case PAPER_JISB3:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "jisb3";
+       case PAPER_JISB4:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "jisb4";
+       case PAPER_JISB5:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "jisb5";
+       case PAPER_JISB6:
+               if (purpose == DVIPS || purpose == DVIPDFM)
+                       return string();
+               return "jisb6";
        case PAPER_USEXECUTIVE:
                // dvipdfm does not know this
                if (purpose == DVIPDFM)