]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
This doesn't return a reference any more.
[lyx.git] / src / BufferParams.cpp
index 3425efe4f3ab0783dcf06a3f86a31d6a1bc9fb0f..7477a9ac5123b3fdca4957de15b869e2e4fd4512 100644 (file)
@@ -18,7 +18,7 @@
 #include "BufferParams.h"
 
 #include "Author.h"
-#include "BaseClassList.h"
+#include "LayoutFile.h"
 #include "BranchList.h"
 #include "buffer_funcs.h"
 #include "Bullet.h"
@@ -95,13 +95,14 @@ namespace lyx {
 namespace {
 
 // Paragraph separation
-typedef Translator<string, BufferParams::PARSEP> ParSepTranslator;
+typedef Translator<string, BufferParams::ParagraphSeparation> ParSepTranslator;
 
 
 ParSepTranslator const init_parseptranslator()
 {
-       ParSepTranslator translator(string_paragraph_separation[0], BufferParams::PARSEP_INDENT);
-       translator.addPair(string_paragraph_separation[1], BufferParams::PARSEP_SKIP);
+       ParSepTranslator translator
+               (string_paragraph_separation[0], BufferParams::ParagraphIndentSeparation);
+       translator.addPair(string_paragraph_separation[1], BufferParams::ParagraphSkipSeparation);
        return translator;
 }
 
@@ -114,17 +115,18 @@ ParSepTranslator const & parseptranslator()
 
 
 // Quotes language
-typedef Translator<string, InsetQuotes::quote_language> QuotesLangTranslator;
+typedef Translator<string, InsetQuotes::QuoteLanguage> QuotesLangTranslator;
 
 
 QuotesLangTranslator const init_quoteslangtranslator()
 {
-       QuotesLangTranslator translator(string_quotes_language[0], InsetQuotes::EnglishQ);
-       translator.addPair(string_quotes_language[1], InsetQuotes::SwedishQ);
-       translator.addPair(string_quotes_language[2], InsetQuotes::GermanQ);
-       translator.addPair(string_quotes_language[3], InsetQuotes::PolishQ);
-       translator.addPair(string_quotes_language[4], InsetQuotes::FrenchQ);
-       translator.addPair(string_quotes_language[5], InsetQuotes::DanishQ);
+       QuotesLangTranslator translator
+               (string_quotes_language[0], InsetQuotes::EnglishQuotes);
+       translator.addPair(string_quotes_language[1], InsetQuotes::SwedishQuotes);
+       translator.addPair(string_quotes_language[2], InsetQuotes::GermanQuotes);
+       translator.addPair(string_quotes_language[3], InsetQuotes::PolishQuotes);
+       translator.addPair(string_quotes_language[4], InsetQuotes::FrenchQuotes);
+       translator.addPair(string_quotes_language[5], InsetQuotes::DanishQuotes);
        return translator;
 }
 
@@ -140,7 +142,7 @@ QuotesLangTranslator const & quoteslangtranslator()
 typedef Translator<string, PAPER_SIZE> PaperSizeTranslator;
 
 
-PaperSizeTranslator const init_papersizetranslator()
+static PaperSizeTranslator initPaperSizeTranslator()
 {
        PaperSizeTranslator translator(string_papersize[0], PAPER_DEFAULT);
        translator.addPair(string_papersize[1], PAPER_CUSTOM);
@@ -159,7 +161,7 @@ PaperSizeTranslator const init_papersizetranslator()
 
 PaperSizeTranslator const & papersizetranslator()
 {
-       static PaperSizeTranslator translator = init_papersizetranslator();
+       static PaperSizeTranslator translator = initPaperSizeTranslator();
        return translator;
 }
 
@@ -223,15 +225,15 @@ PackageTranslator const & packagetranslator()
 
 
 // Cite engine
-typedef Translator<string, biblio::CiteEngine> CiteEngineTranslator;
+typedef Translator<string, CiteEngine> CiteEngineTranslator;
 
 
 CiteEngineTranslator const init_citeenginetranslator()
 {
-       CiteEngineTranslator translator("basic", biblio::ENGINE_BASIC);
-       translator.addPair("natbib_numerical", biblio::ENGINE_NATBIB_NUMERICAL);
-       translator.addPair("natbib_authoryear", biblio::ENGINE_NATBIB_AUTHORYEAR);
-       translator.addPair("jurabib", biblio::ENGINE_JURABIB);
+       CiteEngineTranslator translator("basic", ENGINE_BASIC);
+       translator.addPair("natbib_numerical", ENGINE_NATBIB_NUMERICAL);
+       translator.addPair("natbib_authoryear", ENGINE_NATBIB_AUTHORYEAR);
+       translator.addPair("jurabib", ENGINE_JURABIB);
        return translator;
 }
 
@@ -283,7 +285,7 @@ public:
         */
        VSpace defskip;
        PDFOptions pdfoptions;
-       BaseClassIndex baseClass_;
+       LayoutFileIndex baseClass_;
 };
 
 
@@ -299,7 +301,7 @@ BufferParams::Impl::Impl()
 BufferParams::Impl *
 BufferParams::MemoryTraits::clone(BufferParams::Impl const * ptr)
 {
-       BOOST_ASSERT(ptr);
+       LASSERT(ptr, /**/);
 
        return new BufferParams::Impl(*ptr);
 }
@@ -316,8 +318,8 @@ BufferParams::BufferParams()
 {
        setBaseClass(defaultBaseclass());
        makeDocumentClass();
-       paragraph_separation = PARSEP_INDENT;
-       quotes_language = InsetQuotes::EnglishQ;
+       paragraph_separation = ParagraphIndentSeparation;
+       quotes_language = InsetQuotes::EnglishQuotes;
        fontsize = "default";
 
        /*  PaperLayout */
@@ -326,7 +328,7 @@ BufferParams::BufferParams()
        use_geometry = false;
        use_amsmath = package_auto;
        use_esint = package_auto;
-       cite_engine_ = biblio::ENGINE_BASIC;
+       cite_engine_ = ENGINE_BASIC;
        use_bibtopic = false;
        trackChanges = false;
        outputChanges = false;
@@ -348,7 +350,6 @@ BufferParams::BufferParams()
        listings_params = string();
        pagestyle = "default";
        compressed = false;
-       embedded = false;
        for (int iter = 0; iter < 4; ++iter) {
                user_defined_bullet(iter) = ITEMIZE_DEFAULTS[iter];
                temp_bullet(iter) = ITEMIZE_DEFAULTS[iter];
@@ -356,13 +357,9 @@ BufferParams::BufferParams()
 }
 
 
-BufferParams::~BufferParams()
-{}
-
-
-docstring const BufferParams::B_(string const & l10n) const
+docstring BufferParams::B_(string const & l10n) const
 {
-       BOOST_ASSERT(language);
+       LASSERT(language, /**/);
        return getMessages(language->code()).get(l10n);
 }
 
@@ -393,28 +390,28 @@ BranchList const & BufferParams::branchlist() const
 
 Bullet & BufferParams::temp_bullet(lyx::size_type const index)
 {
-       BOOST_ASSERT(index < 4);
+       LASSERT(index < 4, /**/);
        return pimpl_->temp_bullets[index];
 }
 
 
 Bullet const & BufferParams::temp_bullet(lyx::size_type const index) const
 {
-       BOOST_ASSERT(index < 4);
+       LASSERT(index < 4, /**/);
        return pimpl_->temp_bullets[index];
 }
 
 
 Bullet & BufferParams::user_defined_bullet(lyx::size_type const index)
 {
-       BOOST_ASSERT(index < 4);
+       LASSERT(index < 4, /**/);
        return pimpl_->user_defined_bullets[index];
 }
 
 
 Bullet const & BufferParams::user_defined_bullet(lyx::size_type const index) const
 {
-       BOOST_ASSERT(index < 4);
+       LASSERT(index < 4, /**/);
        return pimpl_->user_defined_bullets[index];
 }
 
@@ -455,7 +452,7 @@ void BufferParams::setDefSkip(VSpace const & vs)
 }
 
 
-string const BufferParams::readToken(Lexer & lex, string const & token,
+string BufferParams::readToken(Lexer & lex, string const & token,
        FileName const & filepath)
 {
        if (token == "\\textclass") {
@@ -464,9 +461,9 @@ string const BufferParams::readToken(Lexer & lex, string const & token,
                // if there exists a local layout file, ignore the system one
                // NOTE: in this case, the textclass (.cls file) is assumed to be available.
                string tcp;
-               BaseClassList & bcl = BaseClassList::get();
-               if (!filepath.empty())
-                       tcp = bcl.addTextClass(classname, filepath.absFilename());
+               LayoutFileList & bcl = LayoutFileList::get();
+               if (tcp.empty() && !filepath.empty())
+                       tcp = bcl.addLayoutFile(classname, filepath.absFilename(), LayoutFileList::Local);
                if (!tcp.empty())
                        setBaseClass(tcp);
                else if (bcl.haveClass(classname)) {
@@ -479,7 +476,7 @@ string const BufferParams::readToken(Lexer & lex, string const & token,
                // FIXME: this warning will be given even if there exists a local .cls
                // file. Even worse, the .lyx file can not be compiled or exported
                // because the textclass is marked as unavilable.
-               if (!documentClass().isTeXClassAvailable()) {
+               if (!baseClass()->isTeXClassAvailable()) {
                        docstring const msg =
                                bformat(_("The layout file requested by this document,\n"
                                                 "%1$s.layout,\n"
@@ -493,6 +490,8 @@ string const BufferParams::readToken(Lexer & lex, string const & token,
                
        } else if (token == "\\begin_preamble") {
                readPreamble(lex);
+       } else if (token == "\\begin_local_layout") {
+               readLocalLayout(lex);
        } else if (token == "\\begin_modules") {
                readModules(lex);
        } else if (token == "\\options") {
@@ -699,6 +698,15 @@ void BufferParams::writeFile(ostream & os) const
                os << "\\end_modules" << '\n';
        }
 
+       // local layout information
+       if (!local_layout.empty()) {
+               // remove '\n' from the end 
+               string const tmplocal = rtrim(local_layout, "\n");
+               os << "\\begin_local_layout\n"
+                  << tmplocal
+                  << "\n\\end_local_layout\n";
+       }
+
        // then the text parameters
        if (language != ignore_language)
                os << "\\language " << language->lang() << '\n';
@@ -988,8 +996,13 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg129417.html
                size_t viet = language_options.str().find("vietnam");
                // viet = string::npos when not found
+               // when Japanese is used, babel must directly be loaded with the
+               // language options, not in the class options, see
+               // http://bugzilla.lyx.org/show_bug.cgi?id=4597#c4
+               size_t japan = language_options.str().find("japanese");
+               // japan = string::npos when not found
                if (lyxrc.language_global_options && !language_options.str().empty()
-                       && viet == string::npos)
+                       && viet == string::npos && japan == string::npos)
                        clsoptions << language_options.str() << ',';
        }
 
@@ -1235,18 +1248,6 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                lyxpreamble += from_utf8(features.getBabelOptions());
        }
 
-       // When the language "japanese-plain" is used, the package "japanese" must
-       // be loaded behind babel (it provides babel support for Japanese) but before
-       // hyperref, see
-       // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg129680.html
-       if (language->lang() == "japanese-plain" &&
-               !documentClass().provides("japanese")) {
-               //load babel in case it was not loaded due to an empty language list
-               if (language_options.str().empty())
-                       lyxpreamble += "\\usepackage{babel}\n";
-               lyxpreamble += "\\usepackage{japanese}\n";
-       }
-
        // PDF support.
        // * Hyperref manual: "Make sure it comes last of your loaded
        //   packages, to give it a fighting chance of not being over-written,
@@ -1262,13 +1263,17 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                lyxpreamble += oss.str();
        }
 
-       // this might be useful...
-       lyxpreamble += "\n\\makeatletter\n";
+       // only add \makeatletter and \makeatother when actually needed
+       bool makeatletter = false;
 
        // Some macros LyX will need
        docstring tmppreamble(from_ascii(features.getMacros()));
 
        if (!tmppreamble.empty()) {
+               if (!makeatletter) {
+                       lyxpreamble += "\n\\makeatletter\n";
+                       makeatletter = true;
+               }
                lyxpreamble += "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
                        "LyX specific LaTeX commands.\n"
                        + tmppreamble + '\n';
@@ -1277,6 +1282,10 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        // the text class specific preamble
        tmppreamble = features.getTClassPreamble();
        if (!tmppreamble.empty()) {
+               if (!makeatletter) {
+                       lyxpreamble += "\n\\makeatletter\n";
+                       makeatletter = true;
+               }
                lyxpreamble += "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
                        "Textclass specific LaTeX commands.\n"
                        + tmppreamble + '\n';
@@ -1284,6 +1293,10 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
 
        /* the user-defined preamble */
        if (!preamble.empty()) {
+               if (!makeatletter) {
+                       lyxpreamble += "\n\\makeatletter\n";
+                       makeatletter = true;
+               }
                // FIXME UNICODE
                lyxpreamble += "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
                        "User specified LaTeX commands.\n"
@@ -1322,10 +1335,16 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                }
        }
 
-       if (!bullets_def.empty())
+       if (!bullets_def.empty()) {
+               if (!makeatletter) {
+                       lyxpreamble += "\n\\makeatletter\n";
+                       makeatletter = true;
+               }
                lyxpreamble += bullets_def + "}\n\n";
+       }
 
-       lyxpreamble += "\\makeatother\n\n";
+       if (makeatletter)
+               lyxpreamble += "\\makeatother\n\n";
 
        int const nlines =
                int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n'));
@@ -1386,22 +1405,18 @@ void BufferParams::setDocumentClass(DocumentClass const * const tc) {
 
 bool BufferParams::setBaseClass(string const & classname)
 {
-       string localtc = classname;
-       BaseClassList const & bcl = BaseClassList::get();
-       if (!bcl.haveClass(localtc)) {
-               // OK, let's try again assuming it's a local file
-               localtc = BaseClassList::localPrefix + localtc;
-               if (!bcl.haveClass(localtc)) {
-                       docstring s = 
-                               bformat(_("The document class %1$s could not be found."),
-                               from_utf8(classname));
-                       frontend::Alert::error(_("Class not found"), s);
-                       return false;
-               }
+       LYXERR(Debug::TCLASS, "setBaseClass: " << classname);
+       LayoutFileList const & bcl = LayoutFileList::get();
+       if (!bcl.haveClass(classname)) {
+               docstring s = 
+                       bformat(_("The document class %1$s could not be found."),
+                       from_utf8(classname));
+               frontend::Alert::error(_("Class not found"), s);
+               return false;
        }
 
-       if (bcl[localtc].load()) {
-               pimpl_->baseClass_ = localtc;
+       if (bcl[classname].load()) {
+               pimpl_->baseClass_ = classname;
                return true;
        }
        
@@ -1413,16 +1428,16 @@ bool BufferParams::setBaseClass(string const & classname)
 }
 
 
-TextClass const * BufferParams::baseClass() const
+LayoutFile const * BufferParams::baseClass() const
 {
-       if (BaseClassList::get().haveClass(pimpl_->baseClass_))
-               return &(BaseClassList::get()[pimpl_->baseClass_]);
+       if (LayoutFileList::get().haveClass(pimpl_->baseClass_))
+               return &(LayoutFileList::get()[pimpl_->baseClass_]);
        else 
                return 0;
 }
 
 
-BaseClassIndex const & BufferParams::baseClassID() const
+LayoutFileIndex const & BufferParams::baseClassID() const
 {
        return pimpl_->baseClass_;
 }
@@ -1450,9 +1465,8 @@ void BufferParams::makeDocumentClass()
                                        "probably need to reconfigure LyX.\n"), from_utf8(modName));
                        frontend::Alert::warning(_("Module not available"),
                                        msg + _("Some layouts may not be available."));
-                       lyxerr << "BufferParams::makeDocumentClass(): Module " <<
-                                       modName << " requested but not found in module list." <<
-                                       endl;
+                       LYXERR0("BufferParams::makeDocumentClass(): Module " <<
+                                       modName << " requested but not found in module list.");
                        continue;
                }
                if (!lm->isAvailable()) {
@@ -1469,6 +1483,12 @@ void BufferParams::makeDocumentClass()
                        frontend::Alert::warning(_("Read Error"), msg);
                }
        }
+       if (!local_layout.empty()) {
+               if (!doc_class_->read(local_layout, TextClass::MODULE)) {
+                       docstring const msg = _("Error reading internal layout information");
+                       frontend::Alert::warning(_("Read Error"), msg);
+               }
+       }
 }
 
 
@@ -1483,12 +1503,9 @@ bool BufferParams::addLayoutModule(string const & modName)
 {
        LayoutModuleList::const_iterator it = layoutModules_.begin();
        LayoutModuleList::const_iterator end = layoutModules_.end();
-       for (; it != end; it++) {
+       for (; it != end; it++)
                if (*it == modName) 
-                       break;
-       }
-       if (it != layoutModules_.end())
-               return false;
+                       return false;
        layoutModules_.push_back(modName);
        return true;
 }
@@ -1523,6 +1540,16 @@ void BufferParams::readPreamble(Lexer & lex)
 }
 
 
+void BufferParams::readLocalLayout(Lexer & lex)
+{
+       if (lex.getString() != "\\begin_local_layout")
+               lyxerr << "Error (BufferParams::readLocalLayout):"
+                       "consistency check failed." << endl;
+
+       local_layout = lex.getLongString("\\end_local_layout");
+}
+
+
 void BufferParams::readLanguage(Lexer & lex)
 {
        if (!lex.next()) return;
@@ -1555,7 +1582,8 @@ void BufferParams::readGraphicsDriver(Lexer & lex)
                if (test == tmptok) {
                        graphicsDriver = tmptok;
                        break;
-               } else if (test == "") {
+               }
+               if (test.empty()) {
                        lex.printError(
                                "Warning: graphics driver `$$Token' not recognized!\n"
                                "         Setting graphics driver to `default'.\n");
@@ -1616,7 +1644,7 @@ void BufferParams::readModules(Lexer & lex)
 }
 
 
-string const BufferParams::paperSizeName(Papersize_Purpose const & purpose) const
+string BufferParams::paperSizeName(PapersizePurpose purpose) const
 {
        char real_papersize = papersize;
        if (real_papersize == PAPER_DEFAULT)
@@ -1708,7 +1736,7 @@ string const BufferParams::dvips_options() const
 }
 
 
-string const BufferParams::babelCall(string const & lang_opts) const
+string BufferParams::babelCall(string const & lang_opts) const
 {
        string lang_pack = lyxrc.language_package;
        if (lang_pack != "\\usepackage{babel}")
@@ -1723,7 +1751,12 @@ string const BufferParams::babelCall(string const & lang_opts) const
        // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg129417.html
        size_t viet = lang_opts.find("vietnam");
        // viet = string::npos when not found
-       if (!lyxrc.language_global_options || viet != string::npos)
+       // when Japanese is used, babel must directly be loaded with the
+       // language options, see
+       // http://bugzilla.lyx.org/show_bug.cgi?id=4597#c4
+       size_t japan = lang_opts.find("japanese");
+       // japan = string::npos when not found
+       if (!lyxrc.language_global_options || viet != string::npos || japan != string::npos)
                return "\\usepackage[" + lang_opts + "]{babel}";
        return lang_pack;
 }
@@ -1927,7 +1960,7 @@ string const BufferParams::loadFonts(string const & rm,
        else if (tt == "courier" )
                os << "\\usepackage{" << tt << "}\n";
        // Computer Modern, Latin Modern, CM Bright
-       else if  (tt != "default")
+       else if (tt != "default")
                os << "\\renewcommand{\\ttdefault}{" << tt << "}\n";
 
        return os.str();
@@ -1937,29 +1970,28 @@ string const BufferParams::loadFonts(string const & rm,
 Encoding const & BufferParams::encoding() const
 {
        if (inputenc == "auto" || inputenc == "default")
-               return *(language->encoding());
-       Encoding const * const enc =
-               encodings.getFromLaTeXName(inputenc);
+               return *language->encoding();
+       Encoding const * const enc = encodings.fromLaTeXName(inputenc);
        if (enc)
                return *enc;
-       lyxerr << "Unknown inputenc value `" << inputenc
-              << "'. Using `auto' instead." << endl;
-       return *(language->encoding());
+       LYXERR0("Unknown inputenc value `" << inputenc
+              << "'. Using `auto' instead.");
+       return *language->encoding();
 }
 
 
-biblio::CiteEngine BufferParams::getEngine() const
+CiteEngine BufferParams::citeEngine() const
 {
        // FIXME the class should provide the numerical/
        // authoryear choice
        if (documentClass().provides("natbib")
-           && cite_engine_ != biblio::ENGINE_NATBIB_NUMERICAL)
-               return biblio::ENGINE_NATBIB_AUTHORYEAR;
+           && cite_engine_ != ENGINE_NATBIB_NUMERICAL)
+               return ENGINE_NATBIB_AUTHORYEAR;
        return cite_engine_;
 }
 
 
-void BufferParams::setCiteEngine(biblio::CiteEngine const cite_engine)
+void BufferParams::setCiteEngine(CiteEngine cite_engine)
 {
        cite_engine_ = cite_engine;
 }